diff --git a/actions/ql/examples/snippets/uses_pinned_sha.ql b/actions/ql/examples/snippets/uses_pinned_sha.ql index 84b2cdae0fdb..db055a69fc4f 100644 --- a/actions/ql/examples/snippets/uses_pinned_sha.ql +++ b/actions/ql/examples/snippets/uses_pinned_sha.ql @@ -8,5 +8,5 @@ import actions from UsesStep uses -where uses.getVersion().regexpMatch("^[A-Fa-f0-9]{40}$") +where uses.getVersion().regexpMatch("^[A-Fa-f0-9]{40}([A-Fa-f0-9]{24})?$") select uses, "This 'uses' step has a pinned SHA version." diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index ddd0b0f1aec8..7a61a60c3797 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.4.37 + +### Minor Analysis Improvements + +* The GitHub Actions analysis now recognizes more Bash regex checks that restrict a value to alphanumeric characters, include regexes like `^[0-9a-zA-Z]{40}([0-9a-zA-Z]{24})?$` which check for a sha1 or sha256 hash. This may reduce false positive results where command output is validated with grouped or optional alphanumeric patterns before being used. + ## 0.4.36 ### Minor Analysis Improvements diff --git a/actions/ql/lib/change-notes/released/0.4.37.md b/actions/ql/lib/change-notes/released/0.4.37.md new file mode 100644 index 000000000000..4809796b3ab3 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.37.md @@ -0,0 +1,5 @@ +## 0.4.37 + +### Minor Analysis Improvements + +* The GitHub Actions analysis now recognizes more Bash regex checks that restrict a value to alphanumeric characters, include regexes like `^[0-9a-zA-Z]{40}([0-9a-zA-Z]{24})?$` which check for a sha1 or sha256 hash. This may reduce false positive results where command output is validated with grouped or optional alphanumeric patterns before being used. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 45433e3ec031..df2745147806 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.36 +lastReleaseVersion: 0.4.37 diff --git a/actions/ql/lib/codeql/actions/Bash.qll b/actions/ql/lib/codeql/actions/Bash.qll index 4975ce6f4cc5..14ba8f0acf4a 100644 --- a/actions/ql/lib/codeql/actions/Bash.qll +++ b/actions/ql/lib/codeql/actions/Bash.qll @@ -785,7 +785,22 @@ module Bash { /** * Holds if the given regex is used to match an alphanumeric string - * eg: `^[0-9a-zA-Z]{40}$`, `^[0-9]+$` or `^[a-zA-Z0-9_]+$` + * eg: `^[0-9a-zA-Z]{40}([0-9a-zA-Z]{24})?$`, `^[0-9]+$` or `^[a-zA-Z0-9_]+$` */ - string alphaNumericRegex() { result = "^\\^\\[([09azAZ_-]+)\\](\\+|\\{\\d+\\})\\$$" } + string alphaNumericRegex() { + exists(string r1, string r2, string r3, string r4 | + // An alphanumeric character class + r1 = "\\[([09azAZ_-]+)\\]" and + // The same as above, followed by a quantifier like `+` or `{20}` + r2 = r1 + "(\\+|\\{\\d+\\})" and + // The same as above, possibly with parentheses around it + r3 = "\\(?" + r2 + "\\)?" and + // The same as above, possibly with a `?` after it + r4 = r3 + "\\??" + | + // The same as above, repeated one or more times, and with `^` at the + // beginning and `$` at the end + result = "^\\^(" + r4 + ")+\\$$" + ) + } } diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 747298d69c6d..5d47e3f3d672 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.36 +version: 0.4.38-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index 1670f0af5be8..c37cd20761b2 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,22 @@ +## 0.6.29 + +### Query Metadata Changes + +* Reversed adjustment of the name of `actions/untrusted-checkout/high`, but kept the portion of the previous change for the word "trusted" to "privileged". Added a missing "a" to phrasing in `actions/untrusted-checkout/high` and `actions/untrusted-checkout/medium`. + +### Major Analysis Improvements + +* Adjusted `actions/untrusted-checkout/critical` to align more with other untrusted resource queries, where the alert location is the location where the artifact is obtained from (the checkout point). This aligns with the other 2 related queries. This will cause the same alerts to re-open for closed alerts of this query. + +### Minor Analysis Improvements + +* Altered the alert message for clarity for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`. +* The `actions/unpinned-tag` query now recognizes 64-character SHA-256 commit hashes as properly pinned references, in addition to 40-character SHA-1 hashes. + +### Bug Fixes + +* Adjusted (minor) help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Clarified wording on in minor point, added one more listed resource and added one more recommendation for things to check. + ## 0.6.28 ### Query Metadata Changes diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index 7b5e5a117cbe..530b8e48e0f5 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -15,7 +15,9 @@ import actions import codeql.actions.security.UseOfUnversionedImmutableAction bindingset[version] -private predicate isPinnedCommit(string version) { version.regexpMatch("^[A-Fa-f0-9]{40}$") } +private predicate isPinnedCommit(string version) { + version.regexpMatch("^[A-Fa-f0-9]{40}([A-Fa-f0-9]{24})?$") +} bindingset[nwo] private predicate isTrustedOwner(string nwo) { diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md index a6dd437c1baf..71bb86b442cc 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md @@ -27,7 +27,7 @@ Certain triggers automatically grant a workflow elevated privileges: * An attacker forks the repository and adds malicious code (e.g., in the build script) * The attacker opens a PR from the fork, and, if needed, comments on the PR * The workflow in the base repository checks out the forked code - * The workflow runs, (e.g. the build script etc.), which contains the malicious code + * The workflow runs the malicious code Please note that not only build scripts can be malicious code vectors. There is a large number of other possibilities. Some of them are listed in the [LOTP](https://boostsecurityio.github.io/lotp/) catalog. @@ -41,6 +41,8 @@ The best practice is to handle the potentially untrusted pull request via the ** The artifacts downloaded from the first workflow should be considered untrusted and must be verified. +Additionally, ensure that least privilege are used both at the workflow level (through event triggers and workflow permissions) and job level (through job permissions). + ## Example ### Incorrect Usage @@ -163,4 +165,5 @@ jobs: - GitHub Security Lab Research: [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). - Mitigating risks of untrusted checkout: [GitHub Docs](https://docs.github.com/en/enterprise-cloud@latest/actions/reference/security/secure-use#mitigating-the-risks-of-untrusted-code-checkout). +- Securing with least privilege: [Workflow secure use](https://docs.github.com/en/actions/reference/security/secure-use). - Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/). diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.ql b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.ql index ad79a1ce776f..e0af03ca3d02 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.ql +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.ql @@ -51,5 +51,6 @@ where event.getName() = checkoutTriggers() and not exists(ControlCheck check | check.protects(checkout, event, "untrusted-checkout")) and not exists(ControlCheck check | check.protects(poisonable, event, "untrusted-checkout")) -select poisonable, checkout, poisonable, - "Potential execution of untrusted code on a privileged workflow ($@)", event, event.getName() +select checkout, checkout, poisonable, + "Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@).", + event, event.getName() diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md index a6dd437c1baf..71bb86b442cc 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md @@ -27,7 +27,7 @@ Certain triggers automatically grant a workflow elevated privileges: * An attacker forks the repository and adds malicious code (e.g., in the build script) * The attacker opens a PR from the fork, and, if needed, comments on the PR * The workflow in the base repository checks out the forked code - * The workflow runs, (e.g. the build script etc.), which contains the malicious code + * The workflow runs the malicious code Please note that not only build scripts can be malicious code vectors. There is a large number of other possibilities. Some of them are listed in the [LOTP](https://boostsecurityio.github.io/lotp/) catalog. @@ -41,6 +41,8 @@ The best practice is to handle the potentially untrusted pull request via the ** The artifacts downloaded from the first workflow should be considered untrusted and must be verified. +Additionally, ensure that least privilege are used both at the workflow level (through event triggers and workflow permissions) and job level (through job permissions). + ## Example ### Incorrect Usage @@ -163,4 +165,5 @@ jobs: - GitHub Security Lab Research: [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). - Mitigating risks of untrusted checkout: [GitHub Docs](https://docs.github.com/en/enterprise-cloud@latest/actions/reference/security/secure-use#mitigating-the-risks-of-untrusted-code-checkout). +- Securing with least privilege: [Workflow secure use](https://docs.github.com/en/actions/reference/security/secure-use). - Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/). diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.ql b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.ql index 5c2d4b3d56c8..9f28706c0d07 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.ql +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.ql @@ -1,5 +1,5 @@ /** - * @name Checkout of untrusted code in privileged context without privileged context use + * @name Checkout of untrusted code in a privileged context * @description Privileged workflows have read/write access to the base repository and access to secrets. * By explicitly checking out and running the build script from a fork the untrusted code is running in an environment * that is able to push to the base repository and to access secrets. @@ -42,5 +42,6 @@ where not event.getName() = "issue_comment" and not exists(ControlCheck check | check.protects(checkout, event, "untrusted-checkout")) ) -select checkout, "Potential execution of untrusted code on a privileged workflow ($@)", event, - event.getName() +select checkout, + "Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@).", + event, event.getName() diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md index a6dd437c1baf..71bb86b442cc 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md @@ -27,7 +27,7 @@ Certain triggers automatically grant a workflow elevated privileges: * An attacker forks the repository and adds malicious code (e.g., in the build script) * The attacker opens a PR from the fork, and, if needed, comments on the PR * The workflow in the base repository checks out the forked code - * The workflow runs, (e.g. the build script etc.), which contains the malicious code + * The workflow runs the malicious code Please note that not only build scripts can be malicious code vectors. There is a large number of other possibilities. Some of them are listed in the [LOTP](https://boostsecurityio.github.io/lotp/) catalog. @@ -41,6 +41,8 @@ The best practice is to handle the potentially untrusted pull request via the ** The artifacts downloaded from the first workflow should be considered untrusted and must be verified. +Additionally, ensure that least privilege are used both at the workflow level (through event triggers and workflow permissions) and job level (through job permissions). + ## Example ### Incorrect Usage @@ -163,4 +165,5 @@ jobs: - GitHub Security Lab Research: [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). - Mitigating risks of untrusted checkout: [GitHub Docs](https://docs.github.com/en/enterprise-cloud@latest/actions/reference/security/secure-use#mitigating-the-risks-of-untrusted-code-checkout). +- Securing with least privilege: [Workflow secure use](https://docs.github.com/en/actions/reference/security/secure-use). - Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/). diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.ql b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.ql index 66c68e882e22..ca68c7fffd17 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.ql +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.ql @@ -1,5 +1,5 @@ /** - * @name Checkout of untrusted code in trusted context + * @name Checkout of untrusted code in a trusted context * @description Privileged workflows have read/write access to the base repository and access to secrets. * By explicitly checking out and running the build script from a fork the untrusted code is running in an environment * that is able to push to the base repository and to access secrets. diff --git a/actions/ql/src/change-notes/released/0.6.29.md b/actions/ql/src/change-notes/released/0.6.29.md new file mode 100644 index 000000000000..82ca81749544 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.29.md @@ -0,0 +1,18 @@ +## 0.6.29 + +### Query Metadata Changes + +* Reversed adjustment of the name of `actions/untrusted-checkout/high`, but kept the portion of the previous change for the word "trusted" to "privileged". Added a missing "a" to phrasing in `actions/untrusted-checkout/high` and `actions/untrusted-checkout/medium`. + +### Major Analysis Improvements + +* Adjusted `actions/untrusted-checkout/critical` to align more with other untrusted resource queries, where the alert location is the location where the artifact is obtained from (the checkout point). This aligns with the other 2 related queries. This will cause the same alerts to re-open for closed alerts of this query. + +### Minor Analysis Improvements + +* Altered the alert message for clarity for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`. +* The `actions/unpinned-tag` query now recognizes 64-character SHA-256 commit hashes as properly pinned references, in addition to 40-character SHA-1 hashes. + +### Bug Fixes + +* Adjusted (minor) help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Clarified wording on in minor point, added one more listed resource and added one more recommendation for things to check. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index 90f3f09295a6..e785984caccb 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.28 +lastReleaseVersion: 0.6.29 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 894ba6fec690..19187efb0717 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.28 +version: 0.6.30-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_tags.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_tags.yml index f204816eed4e..6e7612144bcc 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_tags.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_tags.yml @@ -11,3 +11,9 @@ jobs: - uses: foo/bar@25b062c917b0c75f8b47d8469aff6c94ffd89abb - uses: docker://foo/bar@latest - uses: docker://foo/bar@sha256:887a259a5a534f3c4f36cb02dca341673c6089431057242cdc931e9f133147e9 + # SHA-256 pinned (64 hex chars) - should NOT be flagged + - uses: foo/bar@25b062c917b0c75f8b47d8469aff6c94ffd89abb25b062c917b0c75f8b47d84d + # SHA-1 pinned (40 hex chars) regression - should NOT be flagged + - uses: foo/bar@a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2 + # Invalid 50-char hex string - should be flagged + - uses: foo/bar@a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2a1b2c3d4e5 diff --git a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected index 29568087d0ed..14cff70c3804 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected @@ -34,3 +34,4 @@ | .github/workflows/test18.yml:37:21:37:63 | sonarsource/sonarcloud-github-action@master | Unpinned 3rd party Action 'Sonar' step $@ uses 'sonarsource/sonarcloud-github-action' with ref 'master', not a pinned commit hash | .github/workflows/test18.yml:36:15:40:58 | Uses Step | Uses Step | | .github/workflows/unpinned_tags.yml:10:13:10:22 | foo/bar@v1 | Unpinned 3rd party Action 'unpinned_tags.yml' step $@ uses 'foo/bar' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_tags.yml:10:7:11:4 | Uses Step | Uses Step | | .github/workflows/unpinned_tags.yml:12:13:12:35 | docker://foo/bar@latest | Unpinned 3rd party Action 'unpinned_tags.yml' step $@ uses 'docker://foo/bar' with ref 'latest', not a pinned commit hash | .github/workflows/unpinned_tags.yml:12:7:13:4 | Uses Step | Uses Step | +| .github/workflows/unpinned_tags.yml:19:13:19:70 | foo/bar@a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2a1b2c3d4e5 | Unpinned 3rd party Action 'unpinned_tags.yml' step $@ uses 'foo/bar' with ref 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2a1b2c3d4e5', not a pinned commit hash | .github/workflows/unpinned_tags.yml:19:7:19:71 | Uses Step | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected index 7b63fb560cbe..52fcecfb9ed7 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected @@ -312,7 +312,10 @@ edges | .github/workflows/unpinned_tags.yml:9:7:10:4 | Uses Step | .github/workflows/unpinned_tags.yml:10:7:11:4 | Uses Step | | .github/workflows/unpinned_tags.yml:10:7:11:4 | Uses Step | .github/workflows/unpinned_tags.yml:11:7:12:4 | Uses Step | | .github/workflows/unpinned_tags.yml:11:7:12:4 | Uses Step | .github/workflows/unpinned_tags.yml:12:7:13:4 | Uses Step | -| .github/workflows/unpinned_tags.yml:12:7:13:4 | Uses Step | .github/workflows/unpinned_tags.yml:13:7:13:101 | Uses Step | +| .github/workflows/unpinned_tags.yml:12:7:13:4 | Uses Step | .github/workflows/unpinned_tags.yml:13:7:15:4 | Uses Step | +| .github/workflows/unpinned_tags.yml:13:7:15:4 | Uses Step | .github/workflows/unpinned_tags.yml:15:7:17:4 | Uses Step | +| .github/workflows/unpinned_tags.yml:15:7:17:4 | Uses Step | .github/workflows/unpinned_tags.yml:17:7:19:4 | Uses Step | +| .github/workflows/unpinned_tags.yml:17:7:19:4 | Uses Step | .github/workflows/unpinned_tags.yml:19:7:19:71 | Uses Step | | .github/workflows/untrusted_checkout2.yml:7:9:14:6 | Run Step: pr_number | .github/workflows/untrusted_checkout2.yml:14:9:19:72 | Run Step | | .github/workflows/untrusted_checkout3.yml:11:9:12:6 | Uses Step | .github/workflows/untrusted_checkout3.yml:12:9:13:6 | Uses Step | | .github/workflows/untrusted_checkout3.yml:12:9:13:6 | Uses Step | .github/actions/dangerous-git-checkout/action.yml:6:7:11:4 | Uses Step | @@ -335,42 +338,42 @@ edges | .github/workflows/workflow_run_untrusted_checkout_2.yml:13:9:16:6 | Uses Step | .github/workflows/workflow_run_untrusted_checkout_2.yml:16:9:18:31 | Uses Step | | .github/workflows/workflow_run_untrusted_checkout_3.yml:13:9:16:6 | Uses Step | .github/workflows/workflow_run_untrusted_checkout_3.yml:16:9:18:31 | Uses Step | #select -| .github/workflows/auto_ci.yml:32:9:37:6 | Run Step | .github/workflows/auto_ci.yml:20:9:27:6 | Uses Step | .github/workflows/auto_ci.yml:32:9:37:6 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | -| .github/workflows/auto_ci.yml:48:9:52:2 | Run Step | .github/workflows/auto_ci.yml:20:9:27:6 | Uses Step | .github/workflows/auto_ci.yml:48:9:52:2 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | -| .github/workflows/auto_ci.yml:79:9:84:6 | Run Step | .github/workflows/auto_ci.yml:67:9:74:6 | Uses Step | .github/workflows/auto_ci.yml:79:9:84:6 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | -| .github/workflows/auto_ci.yml:84:9:93:6 | Run Step | .github/workflows/auto_ci.yml:67:9:74:6 | Uses Step | .github/workflows/auto_ci.yml:84:9:93:6 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | -| .github/workflows/dependabot3.yml:25:9:48:6 | Run Step: set-milestone | .github/workflows/dependabot3.yml:15:9:20:6 | Uses Step | .github/workflows/dependabot3.yml:25:9:48:6 | Run Step: set-milestone | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/dependabot3.yml:3:5:3:23 | pull_request_target | pull_request_target | -| .github/workflows/external/TestOrg/TestRepo/.github/workflows/reusable.yml:26:9:29:7 | Run Step | .github/workflows/external/TestOrg/TestRepo/.github/workflows/reusable.yml:23:9:26:6 | Uses Step | .github/workflows/external/TestOrg/TestRepo/.github/workflows/reusable.yml:26:9:29:7 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/reusable_caller1.yaml:4:3:4:21 | pull_request_target | pull_request_target | -| .github/workflows/gitcheckout.yml:21:11:23:22 | Run Step | .github/workflows/gitcheckout.yml:10:11:18:8 | Run Step | .github/workflows/gitcheckout.yml:21:11:23:22 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/gitcheckout.yml:2:3:2:21 | pull_request_target | pull_request_target | -| .github/workflows/label_trusted_checkout2.yml:17:7:21:4 | Run Step | .github/workflows/label_trusted_checkout2.yml:12:7:16:4 | Uses Step | .github/workflows/label_trusted_checkout2.yml:17:7:21:4 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/label_trusted_checkout2.yml:2:3:2:21 | pull_request_target | pull_request_target | -| .github/workflows/level0.yml:107:9:112:2 | Run Step | .github/workflows/level0.yml:99:9:103:6 | Uses Step | .github/workflows/level0.yml:107:9:112:2 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/level0.yml:5:3:5:15 | issue_comment | issue_comment | -| .github/workflows/level0.yml:107:9:112:2 | Run Step | .github/workflows/level0.yml:99:9:103:6 | Uses Step | .github/workflows/level0.yml:107:9:112:2 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/level0.yml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/level0.yml:133:9:135:23 | Run Step | .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/level0.yml:5:3:5:15 | issue_comment | issue_comment | -| .github/workflows/level0.yml:133:9:135:23 | Run Step | .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/level0.yml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/poc2.yml:42:9:47:6 | Uses Step | .github/workflows/poc2.yml:37:9:42:6 | Uses Step | .github/workflows/poc2.yml:42:9:47:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/poc2.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/poc2.yml:52:9:58:24 | Run Step | .github/workflows/poc2.yml:37:9:42:6 | Uses Step | .github/workflows/poc2.yml:52:9:58:24 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/poc2.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/pr-workflow.yml:222:9:227:6 | Uses Step | .github/workflows/pr-workflow.yml:216:9:222:6 | Uses Step | .github/workflows/pr-workflow.yml:222:9:227:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:256:9:261:6 | Uses Step | .github/workflows/pr-workflow.yml:250:9:256:6 | Uses Step | .github/workflows/pr-workflow.yml:256:9:261:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:290:9:295:6 | Uses Step | .github/workflows/pr-workflow.yml:284:9:290:6 | Uses Step | .github/workflows/pr-workflow.yml:290:9:295:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:391:9:395:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:391:9:395:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:395:9:404:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:395:9:404:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:404:9:414:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:404:9:414:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:414:9:423:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:414:9:423:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:423:9:432:2 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:423:9:432:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/reusable_local.yml:26:9:29:7 | Run Step | .github/workflows/reusable_local.yml:23:9:26:6 | Uses Step | .github/workflows/reusable_local.yml:26:9:29:7 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/reusable_caller3.yaml:4:3:4:21 | pull_request_target | pull_request_target | -| .github/workflows/test7.yml:33:9:36:6 | Run Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:33:9:36:6 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/test7.yml:36:9:39:6 | Run Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:36:9:39:6 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/test7.yml:49:9:59:6 | Run Step: benchmark-pr | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:49:9:59:6 | Run Step: benchmark-pr | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/test7.yml:59:9:60:6 | Run Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:59:9:60:6 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/test7.yml:60:9:60:37 | Run Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:60:9:60:37 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/test10.yml:25:9:30:2 | Run Step | .github/workflows/test10.yml:20:9:25:6 | Uses Step | .github/workflows/test10.yml:25:9:30:2 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test10.yml:8:3:8:21 | pull_request_target | pull_request_target | -| .github/workflows/test11.yml:90:7:93:54 | Uses Step | .github/workflows/test11.yml:84:7:90:4 | Uses Step | .github/workflows/test11.yml:90:7:93:54 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test11.yml:5:3:5:15 | issue_comment | issue_comment | -| .github/workflows/test17.yml:19:15:23:58 | Uses Step | .github/workflows/test17.yml:12:15:19:12 | Uses Step | .github/workflows/test17.yml:19:15:23:58 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test17.yml:3:5:3:16 | workflow_run | workflow_run | -| .github/workflows/test27.yml:21:9:22:16 | Run Step | .github/workflows/test27.yml:18:9:21:6 | Uses Step | .github/workflows/test27.yml:21:9:22:16 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test26.yml:4:3:4:14 | workflow_run | workflow_run | -| .github/workflows/test29.yml:14:7:21:11 | Uses Step | .github/workflows/test29.yml:8:7:14:4 | Uses Step | .github/workflows/test29.yml:14:7:21:11 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test29.yml:1:5:1:23 | pull_request_target | pull_request_target | -| .github/workflows/untrusted_checkout3.yml:13:9:13:23 | Run Step | .github/actions/dangerous-git-checkout/action.yml:6:7:11:4 | Uses Step | .github/workflows/untrusted_checkout3.yml:13:9:13:23 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout3.yml:4:3:4:14 | workflow_run | workflow_run | -| .github/workflows/untrusted_checkout4.yml:35:7:41:4 | Run Step | .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:35:7:41:4 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout4.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/untrusted_checkout4.yml:41:7:47:4 | Run Step | .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:41:7:47:4 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout4.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/untrusted_checkout4.yml:47:7:51:46 | Run Step | .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:47:7:51:46 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout4.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/untrusted_checkout.yml:15:9:18:2 | Run Step | .github/workflows/untrusted_checkout.yml:8:9:11:6 | Uses Step | .github/workflows/untrusted_checkout.yml:15:9:18:2 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout.yml:2:3:2:21 | pull_request_target | pull_request_target | -| .github/workflows/untrusted_checkout.yml:30:9:32:23 | Run Step | .github/workflows/untrusted_checkout.yml:23:9:26:6 | Uses Step | .github/workflows/untrusted_checkout.yml:30:9:32:23 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout.yml:2:3:2:21 | pull_request_target | pull_request_target | +| .github/actions/dangerous-git-checkout/action.yml:6:7:11:4 | Uses Step | .github/actions/dangerous-git-checkout/action.yml:6:7:11:4 | Uses Step | .github/workflows/untrusted_checkout3.yml:13:9:13:23 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout3.yml:4:3:4:14 | workflow_run | workflow_run | +| .github/workflows/auto_ci.yml:20:9:27:6 | Uses Step | .github/workflows/auto_ci.yml:20:9:27:6 | Uses Step | .github/workflows/auto_ci.yml:32:9:37:6 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | +| .github/workflows/auto_ci.yml:20:9:27:6 | Uses Step | .github/workflows/auto_ci.yml:20:9:27:6 | Uses Step | .github/workflows/auto_ci.yml:48:9:52:2 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | +| .github/workflows/auto_ci.yml:67:9:74:6 | Uses Step | .github/workflows/auto_ci.yml:67:9:74:6 | Uses Step | .github/workflows/auto_ci.yml:79:9:84:6 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | +| .github/workflows/auto_ci.yml:67:9:74:6 | Uses Step | .github/workflows/auto_ci.yml:67:9:74:6 | Uses Step | .github/workflows/auto_ci.yml:84:9:93:6 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/auto_ci.yml:6:3:6:21 | pull_request_target | pull_request_target | +| .github/workflows/dependabot3.yml:15:9:20:6 | Uses Step | .github/workflows/dependabot3.yml:15:9:20:6 | Uses Step | .github/workflows/dependabot3.yml:25:9:48:6 | Run Step: set-milestone | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/dependabot3.yml:3:5:3:23 | pull_request_target | pull_request_target | +| .github/workflows/external/TestOrg/TestRepo/.github/workflows/reusable.yml:23:9:26:6 | Uses Step | .github/workflows/external/TestOrg/TestRepo/.github/workflows/reusable.yml:23:9:26:6 | Uses Step | .github/workflows/external/TestOrg/TestRepo/.github/workflows/reusable.yml:26:9:29:7 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/reusable_caller1.yaml:4:3:4:21 | pull_request_target | pull_request_target | +| .github/workflows/gitcheckout.yml:10:11:18:8 | Run Step | .github/workflows/gitcheckout.yml:10:11:18:8 | Run Step | .github/workflows/gitcheckout.yml:21:11:23:22 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/gitcheckout.yml:2:3:2:21 | pull_request_target | pull_request_target | +| .github/workflows/label_trusted_checkout2.yml:12:7:16:4 | Uses Step | .github/workflows/label_trusted_checkout2.yml:12:7:16:4 | Uses Step | .github/workflows/label_trusted_checkout2.yml:17:7:21:4 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/label_trusted_checkout2.yml:2:3:2:21 | pull_request_target | pull_request_target | +| .github/workflows/level0.yml:99:9:103:6 | Uses Step | .github/workflows/level0.yml:99:9:103:6 | Uses Step | .github/workflows/level0.yml:107:9:112:2 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/level0.yml:5:3:5:15 | issue_comment | issue_comment | +| .github/workflows/level0.yml:99:9:103:6 | Uses Step | .github/workflows/level0.yml:99:9:103:6 | Uses Step | .github/workflows/level0.yml:107:9:112:2 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/level0.yml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/level0.yml:5:3:5:15 | issue_comment | issue_comment | +| .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/level0.yml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/poc2.yml:37:9:42:6 | Uses Step | .github/workflows/poc2.yml:37:9:42:6 | Uses Step | .github/workflows/poc2.yml:42:9:47:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/poc2.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/poc2.yml:37:9:42:6 | Uses Step | .github/workflows/poc2.yml:37:9:42:6 | Uses Step | .github/workflows/poc2.yml:52:9:58:24 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/poc2.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/pr-workflow.yml:216:9:222:6 | Uses Step | .github/workflows/pr-workflow.yml:216:9:222:6 | Uses Step | .github/workflows/pr-workflow.yml:222:9:227:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:250:9:256:6 | Uses Step | .github/workflows/pr-workflow.yml:250:9:256:6 | Uses Step | .github/workflows/pr-workflow.yml:256:9:261:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:284:9:290:6 | Uses Step | .github/workflows/pr-workflow.yml:284:9:290:6 | Uses Step | .github/workflows/pr-workflow.yml:290:9:295:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:391:9:395:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:395:9:404:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:404:9:414:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:414:9:423:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:386:9:391:6 | Uses Step | .github/workflows/pr-workflow.yml:423:9:432:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/reusable_local.yml:23:9:26:6 | Uses Step | .github/workflows/reusable_local.yml:23:9:26:6 | Uses Step | .github/workflows/reusable_local.yml:26:9:29:7 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/reusable_caller3.yaml:4:3:4:21 | pull_request_target | pull_request_target | +| .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:33:9:36:6 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:36:9:39:6 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:49:9:59:6 | Run Step: benchmark-pr | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:59:9:60:6 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:19:9:24:6 | Uses Step | .github/workflows/test7.yml:60:9:60:37 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test7.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/test10.yml:20:9:25:6 | Uses Step | .github/workflows/test10.yml:20:9:25:6 | Uses Step | .github/workflows/test10.yml:25:9:30:2 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test10.yml:8:3:8:21 | pull_request_target | pull_request_target | +| .github/workflows/test11.yml:84:7:90:4 | Uses Step | .github/workflows/test11.yml:84:7:90:4 | Uses Step | .github/workflows/test11.yml:90:7:93:54 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test11.yml:5:3:5:15 | issue_comment | issue_comment | +| .github/workflows/test17.yml:12:15:19:12 | Uses Step | .github/workflows/test17.yml:12:15:19:12 | Uses Step | .github/workflows/test17.yml:19:15:23:58 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test17.yml:3:5:3:16 | workflow_run | workflow_run | +| .github/workflows/test27.yml:18:9:21:6 | Uses Step | .github/workflows/test27.yml:18:9:21:6 | Uses Step | .github/workflows/test27.yml:21:9:22:16 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test26.yml:4:3:4:14 | workflow_run | workflow_run | +| .github/workflows/test29.yml:8:7:14:4 | Uses Step | .github/workflows/test29.yml:8:7:14:4 | Uses Step | .github/workflows/test29.yml:14:7:21:11 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test29.yml:1:5:1:23 | pull_request_target | pull_request_target | +| .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:35:7:41:4 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout4.yml:2:3:2:15 | issue_comment | issue_comment | +| .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:41:7:47:4 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout4.yml:2:3:2:15 | issue_comment | issue_comment | +| .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:29:7:35:4 | Uses Step | .github/workflows/untrusted_checkout4.yml:47:7:51:46 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout4.yml:2:3:2:15 | issue_comment | issue_comment | +| .github/workflows/untrusted_checkout.yml:8:9:11:6 | Uses Step | .github/workflows/untrusted_checkout.yml:8:9:11:6 | Uses Step | .github/workflows/untrusted_checkout.yml:15:9:18:2 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout.yml:2:3:2:21 | pull_request_target | pull_request_target | +| .github/workflows/untrusted_checkout.yml:23:9:26:6 | Uses Step | .github/workflows/untrusted_checkout.yml:23:9:26:6 | Uses Step | .github/workflows/untrusted_checkout.yml:30:9:32:23 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout.yml:2:3:2:21 | pull_request_target | pull_request_target | diff --git a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutHigh.expected b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutHigh.expected index 6e33259f3922..9b9483f224e6 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutHigh.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutHigh.expected @@ -1,23 +1,23 @@ -| .github/workflows/issue_comment_direct.yml:12:9:16:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_direct.yml:20:9:24:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_direct.yml:28:9:32:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_direct.yml:35:9:40:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_direct.yml:43:9:46:126 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_heuristic.yml:28:9:33:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_heuristic.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_heuristic.yml:48:7:50:46 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_heuristic.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit2.yml:27:9:31:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit2.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit.yml:26:9:30:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit.yml:30:9:35:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit.yml:57:9:62:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit.yml:79:9:83:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit.yml:95:9:100:2 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/issue_comment_octokit.yml:109:9:114:66 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | -| .github/workflows/pr-workflow.yml:103:9:109:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:139:9:144:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/pr-workflow.yml:444:9:449:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | -| .github/workflows/test13.yml:20:7:25:4 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/test13.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/untrusted_checkout2.yml:14:9:19:72 | Run Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/untrusted_checkout2.yml:1:5:1:17 | issue_comment | issue_comment | -| .github/workflows/workflow_run_untrusted_checkout.yml:13:9:16:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/workflow_run_untrusted_checkout.yml:2:3:2:14 | workflow_run | workflow_run | -| .github/workflows/workflow_run_untrusted_checkout.yml:16:9:18:31 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/workflow_run_untrusted_checkout.yml:2:3:2:14 | workflow_run | workflow_run | -| .github/workflows/workflow_run_untrusted_checkout_2.yml:13:9:16:6 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/workflow_run_untrusted_checkout_2.yml:2:3:2:14 | workflow_run | workflow_run | -| .github/workflows/workflow_run_untrusted_checkout_2.yml:16:9:18:31 | Uses Step | Potential execution of untrusted code on a privileged workflow ($@) | .github/workflows/workflow_run_untrusted_checkout_2.yml:2:3:2:14 | workflow_run | workflow_run | +| .github/workflows/issue_comment_direct.yml:12:9:16:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_direct.yml:20:9:24:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_direct.yml:28:9:32:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_direct.yml:35:9:40:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_direct.yml:43:9:46:126 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_direct.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_heuristic.yml:28:9:33:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_heuristic.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_heuristic.yml:48:7:50:46 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_heuristic.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit2.yml:27:9:31:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit2.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit.yml:26:9:30:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit.yml:30:9:35:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit.yml:57:9:62:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit.yml:79:9:83:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit.yml:95:9:100:2 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/issue_comment_octokit.yml:109:9:114:66 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/issue_comment_octokit.yml:4:3:4:15 | issue_comment | issue_comment | +| .github/workflows/pr-workflow.yml:103:9:109:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:139:9:144:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/pr-workflow.yml:444:9:449:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/pr-workflow-fork.yaml:7:3:7:21 | pull_request_target | pull_request_target | +| .github/workflows/test13.yml:20:7:25:4 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/test13.yml:2:3:2:15 | issue_comment | issue_comment | +| .github/workflows/untrusted_checkout2.yml:14:9:19:72 | Run Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/untrusted_checkout2.yml:1:5:1:17 | issue_comment | issue_comment | +| .github/workflows/workflow_run_untrusted_checkout.yml:13:9:16:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/workflow_run_untrusted_checkout.yml:2:3:2:14 | workflow_run | workflow_run | +| .github/workflows/workflow_run_untrusted_checkout.yml:16:9:18:31 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/workflow_run_untrusted_checkout.yml:2:3:2:14 | workflow_run | workflow_run | +| .github/workflows/workflow_run_untrusted_checkout_2.yml:13:9:16:6 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/workflow_run_untrusted_checkout_2.yml:2:3:2:14 | workflow_run | workflow_run | +| .github/workflows/workflow_run_untrusted_checkout_2.yml:16:9:18:31 | Uses Step | Checkout of untrusted code in a privileged workflow with later potential execution (event trigger: $@). | .github/workflows/workflow_run_untrusted_checkout_2.yml:2:3:2:14 | workflow_run | workflow_run | diff --git a/config/identical-files.json b/config/identical-files.json index 8a5c00a49f88..818f033e4db5 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -11,10 +11,6 @@ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll" ], - "Bound Java/C#": [ - "java/ql/lib/semmle/code/java/dataflow/Bound.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll" - ], "ModulusAnalysis Java/C#": [ "java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll" diff --git a/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/old.dbscheme b/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/old.dbscheme new file mode 100644 index 000000000000..837c4e02326a --- /dev/null +++ b/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/old.dbscheme @@ -0,0 +1,2561 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int variable_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int variable_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/semmlecode.cpp.dbscheme b/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..770002bb0232 --- /dev/null +++ b/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/semmlecode.cpp.dbscheme @@ -0,0 +1,2545 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/upgrade.properties b/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/upgrade.properties new file mode 100644 index 000000000000..ecfa5e68def7 --- /dev/null +++ b/cpp/downgrades/837c4e02326aee4582405d069263092e80a15d82/upgrade.properties @@ -0,0 +1,6 @@ +description: Support alias templates +compatibility: full +is_alias_template.rel: delete +alias_instantiation.rel: delete +alias_template_argument.rel: delete +alias_template_argument_value.rel: delete diff --git a/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/old.dbscheme b/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/old.dbscheme new file mode 100644 index 000000000000..ef8d209a22e2 --- /dev/null +++ b/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/old.dbscheme @@ -0,0 +1,2577 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); +class_template_generated_from( + unique int template: @usertype ref, + int from: @usertype ref +) + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); +function_template_generated_from( + unique int template: @function ref, + int from: @function ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); +variable_template_generated_from( + unique int template: @variable ref, + int from: @variable ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); +alias_template_generated_from( + unique int template: @usertype ref, + int from: @usertype ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/semmlecode.cpp.dbscheme b/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..837c4e02326a --- /dev/null +++ b/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/semmlecode.cpp.dbscheme @@ -0,0 +1,2561 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int variable_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int variable_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/upgrade.properties b/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/upgrade.properties new file mode 100644 index 000000000000..f77cdddbbe10 --- /dev/null +++ b/cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/upgrade.properties @@ -0,0 +1,6 @@ +description: Capture information about one template being generated from another +compatibility: full +class_template_generated_from.rel: delete +function_template_generated_from.rel: delete +variable_template_generated_from.rel: delete +alias_template_generated_from.rel: delete diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 3b95c10fbb57..0b3413f9d3cb 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,19 @@ +## 10.2.0 + +### Deprecated APIs + +* The `UsingAliasTypedefType` class has been deprecated. Use `TypeAliasType` instead. + +### New Features + +* Added a `getOriginalTemplate` predicate to `TemplateClass`, `TemplateFunction`, `TemplateVariable`, and `AliasTemplateType`, which yields the class member template the template was generated from. The predicates only have results for templates that are members of class template instantiations. +* Added `AliasTemplateType` and `AliasTemplateInstantiationType` classes, representing C++ alias templates and their instantiations. + +### Minor Analysis Improvements + +* Added flow source models for `scanf_s` and related functions. +* Added a `Call` column to `LocalFlowSourceFunction::hasLocalFlowSource` and `RemoteFlowSourceFunction::hasRemoteFlowSource`. The old predicates without a `Call` column continue to be supported. + ## 10.1.1 ### Minor Analysis Improvements diff --git a/cpp/ql/lib/DefaultOptions.qll b/cpp/ql/lib/DefaultOptions.qll index e4aa8d1f2d74..e6631f1307af 100644 --- a/cpp/ql/lib/DefaultOptions.qll +++ b/cpp/ql/lib/DefaultOptions.qll @@ -30,8 +30,6 @@ class Options extends string { predicate overrideReturnsNull(Call call) { // Used in CVS: call.(FunctionCall).getTarget().hasGlobalName("Xstrdup") - or - CustomOptions::overrideReturnsNull(call) // old Options.qll } /** @@ -45,8 +43,6 @@ class Options extends string { // Used in CVS: call.(FunctionCall).getTarget().hasGlobalName("Xstrdup") and nullValue(call.getArgument(0)) - or - CustomOptions::returnsNull(call) // old Options.qll } /** @@ -65,8 +61,6 @@ class Options extends string { f.hasGlobalOrStdName([ "exit", "_exit", "_Exit", "abort", "__assert_fail", "longjmp", "__builtin_unreachable" ]) - or - CustomOptions::exits(f) // old Options.qll } /** @@ -79,8 +73,7 @@ class Options extends string { * runtime, the program's behavior is undefined) */ predicate exprExits(Expr e) { - e.(AssumeExpr).getChild(0).(CompileTimeConstantInt).getIntValue() = 0 or - CustomOptions::exprExits(e) // old Options.qll + e.(AssumeExpr).getChild(0).(CompileTimeConstantInt).getIntValue() = 0 } /** @@ -88,10 +81,7 @@ class Options extends string { * * By default holds only for `fgets`. */ - predicate alwaysCheckReturnValue(Function f) { - f.hasGlobalOrStdName("fgets") or - CustomOptions::alwaysCheckReturnValue(f) // old Options.qll - } + predicate alwaysCheckReturnValue(Function f) { f.hasGlobalOrStdName("fgets") } /** * Holds if it is reasonable to ignore the return value of function @@ -107,8 +97,6 @@ class Options extends string { // common way of sleeping using select: fc.getTarget().hasGlobalName("select") and fc.getArgument(0).getValue() = "0" - or - CustomOptions::okToIgnoreReturnValue(fc) // old Options.qll } } diff --git a/cpp/ql/lib/Options.qll b/cpp/ql/lib/Options.qll index c4652e3f6cae..fb2f24119db3 100644 --- a/cpp/ql/lib/Options.qll +++ b/cpp/ql/lib/Options.qll @@ -98,57 +98,3 @@ class CustomMutexType extends MutexType { */ override predicate unlockAccess(FunctionCall fc, Expr arg) { none() } } - -/** - * DEPRECATED: customize `CustomOptions.overrideReturnsNull` instead. - * - * This predicate is required to support backwards compatibility for - * older `Options.qll` files. It should not be removed or modified by - * end users. - */ -predicate overrideReturnsNull(Call call) { none() } - -/** - * DEPRECATED: customize `CustomOptions.returnsNull` instead. - * - * This predicate is required to support backwards compatibility for - * older `Options.qll` files. It should not be removed or modified by - * end users. - */ -predicate returnsNull(Call call) { none() } - -/** - * DEPRECATED: customize `CustomOptions.exits` instead. - * - * This predicate is required to support backwards compatibility for - * older `Options.qll` files. It should not be removed or modified by - * end users. - */ -predicate exits(Function f) { none() } - -/** - * DEPRECATED: customize `CustomOptions.exprExits` instead. - * - * This predicate is required to support backwards compatibility for - * older `Options.qll` files. It should not be removed or modified by - * end users. - */ -predicate exprExits(Expr e) { none() } - -/** - * DEPRECATED: customize `CustomOptions.alwaysCheckReturnValue` instead. - * - * This predicate is required to support backwards compatibility for - * older `Options.qll` files. It should not be removed or modified by - * end users. - */ -predicate alwaysCheckReturnValue(Function f) { none() } - -/** - * DEPRECATED: customize `CustomOptions.okToIgnoreReturnValue` instead. - * - * This predicate is required to support backwards compatibility for - * older `Options.qll` files. It should not be removed or modified by - * end users. - */ -predicate okToIgnoreReturnValue(FunctionCall fc) { none() } diff --git a/cpp/ql/lib/change-notes/2026-05-27-deprecated-removal.md b/cpp/ql/lib/change-notes/2026-05-27-deprecated-removal.md new file mode 100644 index 000000000000..33ad83230d44 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-05-27-deprecated-removal.md @@ -0,0 +1,15 @@ +--- +category: breaking +--- +* Removed the deprecated `overrideReturnsNull` predicate from `Options.qll`. Use `CustomOptions.overrideReturnsNull` instead. +* Removed the deprecated `returnsNull` predicate from `Options.qll`. Use `CustomOptions.returnsNull` instead. +* Removed the deprecated `exits` predicate from `Options.qll`. Use `CustomOptions.exits` instead. +* Removed the deprecated `exprExits` predicate from `Options.qll`. Use `CustomOptions.exprExits` instead. +* Removed the deprecated `alwaysCheckReturnValue` predicate from `Options.qll`. Use `CustomOptions.alwaysCheckReturnValue` instead. +* Removed the deprecated `okToIgnoreReturnValue` predicate from `Options.qll`. Use `CustomOptions.okToIgnoreReturnValue` instead. +* Removed the deprecated `semmle.code.cpp.Member`. Import `semmle.code.cpp.Element` and/or `semmle.code.cpp.Type` directly. +* Removed the deprecated `UnknownDefaultLocation` class. Use `UnknownLocation` instead. +* Removed the deprecated `UnknownExprLocation` class. Use `UnknownLocation` instead. +* Removed the deprecated `UnknownStmtLocation` class. Use `UnknownLocation` instead. +* Removed the deprecated `TemplateParameter` class. Use `TypeTemplateParameter` instead. +* Support for class resolution across link targets has been removed for databases which were created with CodeQL versions before 1.23.0. diff --git a/cpp/ql/lib/change-notes/released/10.2.0.md b/cpp/ql/lib/change-notes/released/10.2.0.md new file mode 100644 index 000000000000..cb514b82cbb3 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/10.2.0.md @@ -0,0 +1,15 @@ +## 10.2.0 + +### Deprecated APIs + +* The `UsingAliasTypedefType` class has been deprecated. Use `TypeAliasType` instead. + +### New Features + +* Added a `getOriginalTemplate` predicate to `TemplateClass`, `TemplateFunction`, `TemplateVariable`, and `AliasTemplateType`, which yields the class member template the template was generated from. The predicates only have results for templates that are members of class template instantiations. +* Added `AliasTemplateType` and `AliasTemplateInstantiationType` classes, representing C++ alias templates and their instantiations. + +### Minor Analysis Improvements + +* Added flow source models for `scanf_s` and related functions. +* Added a `Call` column to `LocalFlowSourceFunction::hasLocalFlowSource` and `RemoteFlowSourceFunction::hasRemoteFlowSource`. The old predicates without a `Call` column continue to be supported. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 940a668bbf36..a230efed2a4c 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 10.1.1 +lastReleaseVersion: 10.2.0 diff --git a/cpp/ql/lib/cpp.qll b/cpp/ql/lib/cpp.qll index 560a4444bfad..9cc9f7eb1ef6 100644 --- a/cpp/ql/lib/cpp.qll +++ b/cpp/ql/lib/cpp.qll @@ -32,7 +32,6 @@ import semmle.code.cpp.Class import semmle.code.cpp.Struct import semmle.code.cpp.Union import semmle.code.cpp.Enum -import semmle.code.cpp.Member import semmle.code.cpp.Field import semmle.code.cpp.Function import semmle.code.cpp.MemberFunction diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index dd55ebe6c3a4..6f63423d953b 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 10.1.1 +version: 10.2.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/Class.qll b/cpp/ql/lib/semmle/code/cpp/Class.qll index e67a9e76a7a4..708cbdb4d50b 100644 --- a/cpp/ql/lib/semmle/code/cpp/Class.qll +++ b/cpp/ql/lib/semmle/code/cpp/Class.qll @@ -856,8 +856,10 @@ class AbstractClass extends Class { /** * A class template (this class also finds partial specializations - * of class templates). For example in the following code there is a - * `MyTemplateClass` template: + * of class templates). + * + * For example in the following code there is a `MyTemplateClass` + * template: * ``` * template * class MyTemplateClass { @@ -893,6 +895,29 @@ class TemplateClass extends Class { } override string getAPrimaryQlClass() { result = "TemplateClass" } + + /** + * Gets the class member template this template was generated from. + * + * This predicate only has results for templates that are members of class + * template instantiations. For example, for `MyTemplateClass::C` + * in the following code, the result is `MyTemplateClass::C`. + * ```cpp + * template + * class MyTemplateClass { + * template + * class C { + * ... + * }; + * }; + * + * template + * class MyTemplateClass; + * ``` + */ + TemplateClass getOriginalTemplate() { + class_template_generated_from(underlyingElement(this), unresolveElement(result)) + } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/Declaration.qll b/cpp/ql/lib/semmle/code/cpp/Declaration.qll index 6f791234b638..dfb148a84f8b 100644 --- a/cpp/ql/lib/semmle/code/cpp/Declaration.qll +++ b/cpp/ql/lib/semmle/code/cpp/Declaration.qll @@ -278,6 +278,8 @@ class Declaration extends Locatable, @declaration { or variable_template_argument(underlyingElement(this), index, unresolveElement(result)) or + alias_template_argument(underlyingElement(this), index, unresolveElement(result)) + or template_template_argument(underlyingElement(this), index, unresolveElement(result)) or concept_template_argument(underlyingElement(this), index, unresolveElement(result)) @@ -290,6 +292,8 @@ class Declaration extends Locatable, @declaration { or variable_template_argument_value(underlyingElement(this), index, unresolveElement(result)) or + alias_template_argument_value(underlyingElement(this), index, unresolveElement(result)) + or template_template_argument_value(underlyingElement(this), index, unresolveElement(result)) or concept_template_argument_value(underlyingElement(this), index, unresolveElement(result)) diff --git a/cpp/ql/lib/semmle/code/cpp/Element.qll b/cpp/ql/lib/semmle/code/cpp/Element.qll index 17af69eddacd..35a7341fe4b1 100644 --- a/cpp/ql/lib/semmle/code/cpp/Element.qll +++ b/cpp/ql/lib/semmle/code/cpp/Element.qll @@ -278,6 +278,15 @@ private predicate isFromTemplateInstantiationRec(Element e, Element instantiatio instantiation.(Variable).isConstructedFrom(_) and e = instantiation or + instantiation.(TypeAliasType).isConstructedFrom(_) and + e = instantiation + or + instantiation.(TemplateTemplateParameterInstantiation).isConstructedFrom(_) and + e = instantiation + or + exists(instantiation.(ConceptIdExpr).getConcept()) and + e = instantiation + or isFromTemplateInstantiationRec(e.getEnclosingElement(), instantiation) } @@ -291,6 +300,15 @@ private predicate isFromUninstantiatedTemplateRec(Element e, Element template) { is_variable_template(unresolveElement(template)) and e = template or + is_alias_template(unresolveElement(template)) and + e = template + or + usertypes(unresolveElement(template), _, 8) and // template template parameter + e = template + or + template instanceof @concept_template and + e = template + or isFromUninstantiatedTemplateRec(e.getEnclosingElement(), template) } diff --git a/cpp/ql/lib/semmle/code/cpp/Function.qll b/cpp/ql/lib/semmle/code/cpp/Function.qll index 8d93ac0f2a3a..f97addd2a0bd 100644 --- a/cpp/ql/lib/semmle/code/cpp/Function.qll +++ b/cpp/ql/lib/semmle/code/cpp/Function.qll @@ -828,6 +828,27 @@ class TemplateFunction extends Function { * such things -- see FunctionTemplateSpecialization for further details. */ FunctionTemplateSpecialization getASpecialization() { result.getPrimaryTemplate() = this } + + /** + * Gets the class member template this template was generated from. + * + * This predicate only has results for templates that are members of class + * template instantiations. For example, for `MyTemplateClass::f` + * in the following code, the result is `MyTemplateClass::f`. + * ```cpp + * template + * class MyTemplateClass { + * template + * S f(); + * }; + * + * template + * class MyTemplateClass; + * ``` + */ + TemplateFunction getOriginalTemplate() { + function_template_generated_from(underlyingElement(this), unresolveElement(result)) + } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/Location.qll b/cpp/ql/lib/semmle/code/cpp/Location.qll index 8b0a78f91aa8..92668206a9f1 100644 --- a/cpp/ql/lib/semmle/code/cpp/Location.qll +++ b/cpp/ql/lib/semmle/code/cpp/Location.qll @@ -148,28 +148,3 @@ class UnknownLocation extends Location { this.getFile().getAbsolutePath() = "" and locations_default(this, _, 0, 0, 0, 0) } } - -/** - * A dummy location which is used when something doesn't have a location in - * the source code but needs to have a `Location` associated with it. - * - * DEPRECATED: use `UnknownLocation` - */ -deprecated class UnknownDefaultLocation extends UnknownLocation { } - -/** - * A dummy location which is used when an expression doesn't have a - * location in the source code but needs to have a `Location` associated - * with it. - * - * DEPRECATED: use `UnknownLocation` - */ -deprecated class UnknownExprLocation extends UnknownLocation { } - -/** - * A dummy location which is used when a statement doesn't have a location - * in the source code but needs to have a `Location` associated with it. - * - * DEPRECATED: use `UnknownLocation` - */ -deprecated class UnknownStmtLocation extends UnknownLocation { } diff --git a/cpp/ql/lib/semmle/code/cpp/Member.qll b/cpp/ql/lib/semmle/code/cpp/Member.qll deleted file mode 100644 index f47edbddeba0..000000000000 --- a/cpp/ql/lib/semmle/code/cpp/Member.qll +++ /dev/null @@ -1,6 +0,0 @@ -/** - * DEPRECATED: import `semmle.code.cpp.Element` and/or `semmle.code.cpp.Type` directly as required. - */ - -import semmle.code.cpp.Element -import semmle.code.cpp.Type diff --git a/cpp/ql/lib/semmle/code/cpp/TemplateParameter.qll b/cpp/ql/lib/semmle/code/cpp/TemplateParameter.qll index 6ece9cb82a46..e95b5b070731 100644 --- a/cpp/ql/lib/semmle/code/cpp/TemplateParameter.qll +++ b/cpp/ql/lib/semmle/code/cpp/TemplateParameter.qll @@ -35,13 +35,6 @@ class NonTypeTemplateParameter extends Literal, TemplateParameterImpl { override string getAPrimaryQlClass() { result = "NonTypeTemplateParameter" } } -/** - * A C++ `typename` (or `class`) template parameter. - * - * DEPRECATED: Use `TypeTemplateParameter` instead. - */ -deprecated class TemplateParameter = TypeTemplateParameter; - /** * A C++ `typename` (or `class`) template parameter. * diff --git a/cpp/ql/lib/semmle/code/cpp/TypedefType.qll b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll index 1e330842d09b..69eb8f881d29 100644 --- a/cpp/ql/lib/semmle/code/cpp/TypedefType.qll +++ b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll @@ -64,23 +64,123 @@ class CTypedefType extends TypedefType { } /** - * A using alias C++ typedef type. For example the type declared in the following code: + * DEPRECATED: Use `TypeAlias` instead. + * + * A C++ type alias or alias template. + * + * For example the type declared in the following code: * ``` * using my_int2 = int; * ``` */ -class UsingAliasTypedefType extends TypedefType { - UsingAliasTypedefType() { usertype_alias_kind(underlyingElement(this), 1) } +deprecated class UsingAliasTypedefType = TypeAliasType; - override string getAPrimaryQlClass() { result = "UsingAliasTypedefType" } +/** + * A C++ type alias or alias template. + * + * For example the type declared in the following code: + * ``` + * using my_int2 = int; + * ``` + */ +class TypeAliasType extends TypedefType { + TypeAliasType() { usertype_alias_kind(underlyingElement(this), 1) } + + override string getAPrimaryQlClass() { result = "TypeAliasType" } override string explain() { result = "using {" + this.getBaseType().explain() + "} as \"" + this.getName() + "\"" } + + /** + * Holds if this alias is constructed from another alias as a result of + * template instantiation. + */ + predicate isConstructedFrom(TypeAliasType t) { + alias_instantiation(underlyingElement(this), unresolveElement(t)) + } +} + +/** + * A C++ alias template. + * + * For example the type declared in the following code: + * ``` + * template + * using my_type = T; + * ``` + */ +class AliasTemplateType extends TypeAliasType { + AliasTemplateType() { is_alias_template(underlyingElement(this)) } + + override string getAPrimaryQlClass() { result = "AliasTemplateType" } + + /** + * Gets an alias instantiated from this template. + * + * For example for `MyAliasTemplate` in the following code, the results are + * `MyAliasTemplate` and `MyAliasTemplate`: + * ``` + * template + * using MyAliasTemplate = ...; + * + * MyAliasTemplate instance1; + * + * MyAliasTemplate instance2; + * ``` + */ + TypeAliasType getAnInstantiation() { result.isConstructedFrom(this) } + + /** + * Gets the class member template this template was generated from. + * + * This predicate only has results for templates that are members of class + * template instantiations. For example, for `MyTemplateClass::t` + * in the following code, the result is `MyTemplateClass::t`. + * ```cpp + * template + * class MyTemplateClass { + * template + * using t = S; + * }; + * + * template + * class MyTemplateClass; + * ``` + */ + AliasTemplateType getOriginalTemplate() { + alias_template_generated_from(underlyingElement(this), unresolveElement(result)) + } +} + +/** + * A C++ alias template instantiation. + * + * For example the `my_int_type` type declared in the following code: + * ``` + * template + * using my_type = T; + * + * using my_int_type = my_type; + * ``` + */ +class AliasTemplateInstantiationType extends TypeAliasType { + AliasTemplateType at; + + AliasTemplateInstantiationType() { at.getAnInstantiation() = this } + + override string getAPrimaryQlClass() { result = "AliasTemplateInstantiationType" } + + /** + * Gets the alias template from which this instantiation was instantiated. + */ + AliasTemplateType getTemplate() { result = at } } /** - * A C++ `typedef` type that is directly enclosed by a function. For example the type declared inside the function `foo` in + * A C++ `typedef` type that is directly enclosed by a function. + * + * For example the type declared inside the function `foo` in * the following code: * ``` * int foo(void) { typedef int local; } diff --git a/cpp/ql/lib/semmle/code/cpp/Variable.qll b/cpp/ql/lib/semmle/code/cpp/Variable.qll index 8e68cc1927f7..be46d69b41f4 100644 --- a/cpp/ql/lib/semmle/code/cpp/Variable.qll +++ b/cpp/ql/lib/semmle/code/cpp/Variable.qll @@ -614,6 +614,27 @@ class TemplateVariable extends Variable { result.isConstructedFrom(this) and not result.isSpecialization() } + + /** + * Gets the class member template this template was generated from. + * + * This predicate only has results for templates that are members of class + * template instantiations. For example, for `MyTemplateClass::x` + * in the following code, the result is `MyTemplateClass::x`. + * ```cpp + * template + * class MyTemplateClass { + * template + * static S x; + * }; + * + * template + * class MyTemplateClass; + * ``` + */ + TemplateVariable getOriginalTemplate() { + variable_template_generated_from(underlyingElement(this), unresolveElement(result)) + } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/commons/Scanf.qll b/cpp/ql/lib/semmle/code/cpp/commons/Scanf.qll index 98280a522cfd..5128a94c1730 100644 --- a/cpp/ql/lib/semmle/code/cpp/commons/Scanf.qll +++ b/cpp/ql/lib/semmle/code/cpp/commons/Scanf.qll @@ -25,6 +25,15 @@ abstract class ScanfFunction extends Function { * (rather than a `char*`). */ predicate isWideCharDefault() { exists(this.getName().indexOf("wscanf")) } + + /** Holds if this is one of the `scanf_s` variants. */ + predicate isSVariant() { + exists(string name | name = this.getName() | + name.matches("%\\_s") + or + name.matches("%\\_s\\_l") + ) + } } /** @@ -34,8 +43,12 @@ class Scanf extends ScanfFunction instanceof TopLevelFunction { Scanf() { this.hasGlobalOrStdOrBslName("scanf") or // scanf(format, args...) this.hasGlobalOrStdOrBslName("wscanf") or // wscanf(format, args...) + this.hasGlobalOrStdOrBslName("scanf_s") or // scanf_s(format, args...) + this.hasGlobalOrStdOrBslName("wscanf_s") or // wscanf_s(format, args...) this.hasGlobalName("_scanf_l") or // _scanf_l(format, locale, args...) - this.hasGlobalName("_wscanf_l") + this.hasGlobalName("_wscanf_l") or // _wscanf_l(format, locale, args...) + this.hasGlobalName("_scanf_s_l") or // _scanf_s_l(format, locale, args...) + this.hasGlobalName("_wscanf_s_l") // _wscanf_s_l(format, locale, args...) } override int getInputParameterIndex() { none() } @@ -50,8 +63,12 @@ class Fscanf extends ScanfFunction instanceof TopLevelFunction { Fscanf() { this.hasGlobalOrStdOrBslName("fscanf") or // fscanf(src_stream, format, args...) this.hasGlobalOrStdOrBslName("fwscanf") or // fwscanf(src_stream, format, args...) + this.hasGlobalOrStdOrBslName("fscanf_s") or // fscanf_s(src_stream, format, args...) + this.hasGlobalOrStdOrBslName("fwscanf_s") or // fwscanf_s(src_stream, format, args...) this.hasGlobalName("_fscanf_l") or // _fscanf_l(src_stream, format, locale, args...) - this.hasGlobalName("_fwscanf_l") + this.hasGlobalName("_fwscanf_l") or // _fwscanf_l(src_stream, format, locale, args...) + this.hasGlobalName("_fscanf_s_l") or // _fscanf_s_l(src_stream, format, locale, args...) + this.hasGlobalName("_fwscanf_s_l") // _fwscanf_s_l(src_stream, format, locale, args...) } override int getInputParameterIndex() { result = 0 } @@ -66,8 +83,12 @@ class Sscanf extends ScanfFunction instanceof TopLevelFunction { Sscanf() { this.hasGlobalOrStdOrBslName("sscanf") or // sscanf(src_stream, format, args...) this.hasGlobalOrStdOrBslName("swscanf") or // swscanf(src, format, args...) + this.hasGlobalOrStdOrBslName("sscanf_s") or // sscanf_s(src, format, args...) + this.hasGlobalOrStdOrBslName("swscanf_s") or // swscanf_s(src, format, args...) this.hasGlobalName("_sscanf_l") or // _sscanf_l(src, format, locale, args...) - this.hasGlobalName("_swscanf_l") + this.hasGlobalName("_swscanf_l") or // _swscanf_l(src, format, locale, args...) + this.hasGlobalName("_sscanf_s_l") or // _sscanf_s_l(src, format, locale, args...) + this.hasGlobalName("_swscanf_s_l") // _swscanf_s_l(src, format, locale, args...) } override int getInputParameterIndex() { result = 0 } @@ -97,6 +118,14 @@ class Snscanf extends ScanfFunction instanceof TopLevelFunction { int getInputLengthParameterIndex() { result = 1 } } +private predicate isCharLike(Type t) { t instanceof CharType or t instanceof Wchar_t } + +private predicate isStringLike(Type t) { + isCharLike(t.(PointerType).getBaseType()) + or + isCharLike(t.(ArrayType).getBaseType()) +} + /** * A call to one of the `scanf` functions. */ @@ -130,14 +159,40 @@ class ScanfFunctionCall extends FunctionCall { */ predicate isWideCharDefault() { this.getScanfFunction().isWideCharDefault() } + bindingset[this, k] + pragma[inline_late] + private predicate isSizeArgument(int k) { + // The first vararg is never the size argument since a size argument must + // always follow a string buffer argument. + k > 0 and + isStringLike(this.getArgument(this.getScanfFunction().getNumberOfParameters() + k - 1) + .getUnspecifiedType()) + } + /** * Gets the output argument at position `n` in the vararg list of this call. * * The range of `n` is from `0` to `this.getNumberOfOutputArguments() - 1`. */ Expr getOutputArgument(int n) { - result = this.getArgument(this.getTarget().getNumberOfParameters() + n) and - n >= 0 + exists(ScanfFunction target | target = this.getScanfFunction() | + // If this is an S variant then every string buffer argument has a + // corresponding size argument immediately following it, so we need to + // skip over those size arguments when counting the output arguments. + if target.isSVariant() + then + result = + rank[n + 1](Expr arg, int k | + k >= 0 and + arg = this.getArgument(target.getNumberOfParameters() + k) and + not this.isSizeArgument(k) + | + arg order by k + ) + else ( + n >= 0 and result = this.getArgument(target.getNumberOfParameters() + n) + ) + ) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index fb2108c2ac58..4a89e91c74ee 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -276,6 +276,45 @@ private predicate isClassConstructedFrom(Class c, Class templateClass) { not c.isConstructedFrom(_) and c = templateClass } +/** Gets the fully templated version of `c`. */ +private Class getFullyTemplatedClassOld(Class c) { + not c.isFromUninstantiatedTemplate(_) and + isClassConstructedFrom(c, result) +} + +private TemplateClass getOriginalClassTemplate(TemplateClass tc) { + result = tc.getOriginalTemplate() + or + not exists(tc.getOriginalTemplate()) and + result = tc +} + +/** Gets the fully templated version of `c`. */ +private Class getFullyTemplatedClassNew(Class c) { + not c.isFromUninstantiatedTemplate(_) and + exists(Class mid | + c.isConstructedFrom(mid) + or + not c.isConstructedFrom(_) and c = mid + | + result = getOriginalClassTemplate(mid) + or + not mid instanceof TemplateClass and mid = result + ) +} + +/** Gets the fully templated version of `c`. */ +private Class getFullyTemplatedClass(Class c) { + // The `Class::getOriginalTemplate` predicate was introduced in CodeQL + // version 2.25.6 and the upgrade script leaves the + // `class_template_generated_from` extensionals empty if the database + // was generated with an older extractor. So we use the old implementation + // if the `class_template_generated_from` extensional is empty. + if class_template_generated_from(_, _) + then result = getFullyTemplatedClassNew(c) + else result = getFullyTemplatedClassOld(c) +} + /** * Holds if `f` is an instantiation of a function template `templateFunc`, or * holds with `f = templateFunc` if `f` is not an instantiation of any function @@ -292,7 +331,7 @@ private predicate isFunctionConstructedFrom(Function f, Function templateFunc) { } /** Gets the fully templated version of `f`. */ -Function getFullyTemplatedFunction(Function f) { +private Function getFullyTemplatedFunctionOld(Function f) { not f.isFromUninstantiatedTemplate(_) and ( exists(Class c, Class templateClass, int i | @@ -306,13 +345,46 @@ Function getFullyTemplatedFunction(Function f) { ) } +private TemplateFunction getOriginalFunctionTemplate(TemplateFunction tf) { + result = tf.getOriginalTemplate() + or + not exists(tf.getOriginalTemplate()) and + result = tf +} + +/** Gets the fully templated version of `f`. */ +private Function getFullyTemplatedFunctionNew(Function f) { + not f.isFromUninstantiatedTemplate(_) and + exists(Function mid | + f.isConstructedFrom(mid) + or + not f.isConstructedFrom(_) and f = mid + | + result = getOriginalFunctionTemplate(mid) + or + not mid instanceof TemplateFunction and mid = result + ) +} + +/** Gets the fully templated version of `f`. */ +Function getFullyTemplatedFunction(Function f) { + // The `Function::getOriginalTemplate` predicate was introduced in CodeQL + // version 2.25.6 and the upgrade script leaves the + // `function_template_generated_from` extensionals empty if the database + // was generated with an older extractor. So we use the old implementation + // if the `function_template_generated_from` extensional is empty. + if function_template_generated_from(_, _) + then result = getFullyTemplatedFunctionNew(f) + else result = getFullyTemplatedFunctionOld(f) +} + /** Prefixes `const` to `s` if `t` is const, or returns `s` otherwise. */ bindingset[s, t] private string withConst(string s, Type t) { if t.isConst() then result = "const " + s else result = s } -/** Prefixes `volatile` to `s` if `t` is const, or returns `s` otherwise. */ +/** Prefixes `volatile` to `s` if `t` is volatile, or returns `s` otherwise. */ bindingset[s, t] private string withVolatile(string s, Type t) { if t.isVolatile() then result = "volatile " + s else result = s @@ -490,7 +562,7 @@ pragma[nomagic] private string getTypeNameWithoutClassTemplates(Function f, int n, int remaining) { // If there is a declaring type then we start by expanding the function templates exists(Class template | - isClassConstructedFrom(f.getDeclaringType(), template) and + template = getFullyTemplatedClass(f.getDeclaringType()) and remaining = getNumberOfSupportedClassTemplateArguments(template) and result = getTypeNameWithoutFunctionTemplates(f, n, 0) ) @@ -502,7 +574,7 @@ private string getTypeNameWithoutClassTemplates(Function f, int n, int remaining or exists(string mid, TypeTemplateParameter tp, Class template | mid = getTypeNameWithoutClassTemplates(f, n, remaining + 1) and - isClassConstructedFrom(f.getDeclaringType(), template) and + template = getFullyTemplatedClass(f.getDeclaringType()) and tp = getSupportedClassTemplateArgument(template, remaining) | result = mid.replaceAll(tp.getName(), "class:" + remaining.toString()) diff --git a/cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll b/cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll index 9b2acc05e9e2..52c9aba7a868 100644 --- a/cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll +++ b/cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll @@ -1,59 +1,5 @@ import semmle.code.cpp.Type -/** For upgraded databases without mangled name info. */ -pragma[noinline] -private string getTopLevelClassName(@usertype c) { - not mangled_name(_, _, _) and - isClass(c) and - usertypes(c, result, _) and - not namespacembrs(_, c) and // not in a namespace - not member(_, _, c) and // not in some structure - not class_instantiation(c, _) // not a template instantiation -} - -/** - * For upgraded databases without mangled name info. - * Holds if `d` is a unique complete class named `name`. - */ -pragma[noinline] -private predicate existsCompleteWithName(string name, @usertype d) { - not mangled_name(_, _, _) and - is_complete(d) and - name = getTopLevelClassName(d) and - onlyOneCompleteClassExistsWithName(name) -} - -/** For upgraded databases without mangled name info. */ -pragma[noinline] -private predicate onlyOneCompleteClassExistsWithName(string name) { - not mangled_name(_, _, _) and - strictcount(@usertype c | is_complete(c) and getTopLevelClassName(c) = name) = 1 -} - -/** - * For upgraded databases without mangled name info. - * Holds if `c` is an incomplete class named `name`. - */ -pragma[noinline] -private predicate existsIncompleteWithName(string name, @usertype c) { - not mangled_name(_, _, _) and - not is_complete(c) and - name = getTopLevelClassName(c) -} - -/** - * For upgraded databases without mangled name info. - * Holds if `c` is an incomplete class, and there exists a unique complete class `d` - * with the same name. - */ -private predicate oldHasCompleteTwin(@usertype c, @usertype d) { - not mangled_name(_, _, _) and - exists(string name | - existsIncompleteWithName(name, c) and - existsCompleteWithName(name, d) - ) -} - pragma[noinline] private @mangledname getClassMangledName(@usertype c) { isClass(c) and @@ -103,10 +49,7 @@ private module Cached { @usertype resolveClass(@usertype c) { hasCompleteTwin(c, result) or - oldHasCompleteTwin(c, result) - or not hasCompleteTwin(c, _) and - not oldHasCompleteTwin(c, _) and result = c } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index f1bdd6b8c520..432261dfe278 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -136,7 +136,9 @@ private module SourceVariables { NormalSourceVariable() { this = TNormalSourceVariable(base, ind) } final override string toString() { - result = repeatStars(this.getIndirection()) + base.toString() + if this.getIndirection() = 0 + then result = "&" + base.toString() + else result = repeatStars(this.getIndirection() - 1) + base.toString() } } @@ -157,7 +159,9 @@ private module SourceVariables { } final override string toString() { - result = repeatStars(this.getIndirection()) + base.toString() + " [before crement]" + if this.getIndirection() = 0 + then result = "&" + base.toString() + " [before crement]" + else result = repeatStars(this.getIndirection() - 1) + base.toString() + " [before crement]" } /** @@ -1353,6 +1357,52 @@ class PhiNode extends Definition instanceof SsaImpl::PhiNode { final predicate hasInputFromBlock(Definition input, IRBlock bb) { phiHasInputFromBlock(this, input, bb) } + + override int getIndirection() { result = this.getSourceVariable().getIndirection() } + + override predicate isCertain() { + // If this phi node is part of a phi cycle of phi nodes the least + // fixed-point semantics of datalog means we don't get the right answer. + // So we perform an SCC reduction to simulate greatest fixed-point semantics. + getCycle(this).isCertain() + or + // If there is no cycle we get the right semantics through traditional + // recursion. + not exists(getCycle(this)) and + forex(Definition inp | inp = this.getAnInput() | inp.isCertain()) + } + + final override Declaration getFunction() { + result = SsaImpl::PhiNode.super.getBasicBlock().getEnclosingFunction() + } +} + +private PhiNode getAnInput(PhiNode phi) { result = phi.getAnInput() } + +private predicate sccEdge(PhiNode phi1, PhiNode phi2) { + getAnInput(phi1) = phi2 and getAnInput+(phi2) = phi1 +} + +private module PhiCycleEquivalence = QlBuiltins::EquivalenceRelation; + +private PhiCycle getCycle(PhiNode phi) { result.getAPhiNode() = phi } + +private class PhiCycle extends PhiCycleEquivalence::EquivalenceClass { + PhiNode getAPhiNode() { PhiCycleEquivalence::getEquivalenceClass(result) = this } + + predicate hasPhiNode(PhiNode phi) { this.getAPhiNode() = phi } + + pragma[nomagic] + Definition getAnInput() { + result = this.getAPhiNode().getAnInput() and not this.hasPhiNode(result) + } + + string toString() { result = strictconcat(this.getAPhiNode().toString(), ", ") } + + predicate isCertain() { + // A phi cycle is certain if all of the inputs into the phi cycle is certain. + forex(Definition inp | inp = this.getAnInput() | inp.isCertain()) + } } /** An static single assignment (SSA) definition. */ diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll index e4734f285fa7..31931189003c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll @@ -147,7 +147,7 @@ abstract class Indirection extends Type { * * `certain` is `true` if this write is guaranteed to write to the address. */ - predicate isAdditionalWrite(Node0Impl value, Operand address, boolean certain) { none() } + predicate isAdditionalWrite(Node0Impl value, Operand address, Certainty certain) { none() } /** * Gets the base type of this indirection, after specifiers have been deeply @@ -198,11 +198,11 @@ private module IteratorIndirections { baseType = super.getValueType() } - override predicate isAdditionalWrite(Node0Impl value, Operand address, boolean certain) { + override predicate isAdditionalWrite(Node0Impl value, Operand address, Certainty certain) { exists(CallInstruction call | call.getArgumentOperand(0) = value.asOperand() | this = call.getStaticCallTarget().(Function).getClassAndName("operator=") and address = call.getThisArgumentOperand() and - certain = false + certain instanceof AlwaysUncertain ) } @@ -271,30 +271,62 @@ predicate isDereference(Instruction deref, Operand address, boolean additional) additional = false } -predicate isWrite(Node0Impl value, Operand address, boolean certain) { +private newtype TCertainty = + TCertainWhenAddressIsCertain() or + TAlwaysCertain() or + TAlwaysUncertain() + +abstract private class Certainty extends TCertainty { + abstract predicate isCertain(boolean addressIsCertain); + + abstract string toString(); +} + +private class CertainWhenAddressIsCertain extends Certainty, TCertainWhenAddressIsCertain { + override predicate isCertain(boolean addressIsCertain) { addressIsCertain = true } + + override string toString() { result = "CertainWhenAddressIsCertain" } +} + +private class AlwaysCertain extends Certainty, TAlwaysCertain { + override predicate isCertain(boolean addressIsCertain) { + addressIsCertain = true or addressIsCertain = false + } + + override string toString() { result = "AlwaysCertain" } +} + +private class AlwaysUncertain extends Certainty, TAlwaysUncertain { + override predicate isCertain(boolean addressIsCertain) { none() } + + override string toString() { result = "AlwaysUncertain" } +} + +predicate isWrite(Node0Impl value, Operand address, Certainty certain) { any(Indirection ind).isAdditionalWrite(value, address, certain) or - certain = true and - ( - exists(StoreInstruction store | - value.asInstruction() = store and - address = store.getDestinationAddressOperand() - ) - or - exists(InitializeParameterInstruction init | - value.asInstruction() = init and - address = init.getAnOperand() - ) - or - exists(InitializeDynamicAllocationInstruction init | - value.asInstruction() = init and - address = init.getAllocationAddressOperand() - ) - or - exists(UninitializedInstruction uninitialized | - value.asInstruction() = uninitialized and - address = uninitialized.getAnOperand() - ) + exists(StoreInstruction store | + value.asInstruction() = store and + address = store.getDestinationAddressOperand() and + certain instanceof CertainWhenAddressIsCertain + ) + or + exists(InitializeParameterInstruction init | + value.asInstruction() = init and + address = init.getAnOperand() and + certain instanceof AlwaysCertain + ) + or + exists(InitializeDynamicAllocationInstruction init | + value.asInstruction() = init and + address = init.getAllocationAddressOperand() and + certain instanceof AlwaysCertain + ) + or + exists(UninitializedInstruction uninitialized | + value.asInstruction() = uninitialized and + address = uninitialized.getAnOperand() and + certain instanceof AlwaysCertain ) } @@ -718,16 +750,18 @@ private module Cached { int indirectionIndex ) { exists( - boolean writeIsCertain, boolean addressIsCertain, int ind0, CppType type, int lower, int upper + Certainty writeIsCertain, boolean addressIsCertain, int ind0, CppType type, int lower, + int upper | isWrite(value, address, writeIsCertain) and isDefImpl(address, base, ind0, addressIsCertain) and - certain = writeIsCertain.booleanAnd(addressIsCertain) and type = getLanguageType(address) and upper = countIndirectionsForCppType(type) and ind = ind0 + [lower .. upper] and indirectionIndex = ind - (ind0 + lower) and lower = getMinIndirectionsForType(any(Type t | type.hasUnspecifiedType(t, _))) + | + if writeIsCertain.isCertain(addressIsCertain) then certain = true else certain = false ) } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Fopen.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Fopen.qll index fc6ceb321c1f..c49a59a56e7a 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Fopen.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Fopen.qll @@ -11,7 +11,9 @@ private class Fopen extends Function, AliasFunction, SideEffectFunction, TaintFu Fopen() { this.hasGlobalOrStdName(["fopen", "fopen_s", "freopen"]) or - this.hasGlobalName(["_open", "_wfopen", "_fsopen", "_wfsopen", "_wopen"]) + this.hasGlobalName([ + "_open", "_wfopen", "_fsopen", "_wfsopen", "_wopen", "_sopen_s", "_wsopen_s" + ]) } override predicate hasOnlySpecificWriteSideEffects() { any() } @@ -46,6 +48,10 @@ private class Fopen extends Function, AliasFunction, SideEffectFunction, TaintFu this.hasGlobalName(["_open", "_wopen"]) and i = 0 and buffer = true + or + this.hasGlobalName(["_sopen_s", "_wsopen_s"]) and + i = 1 and + buffer = true } override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { @@ -64,5 +70,9 @@ private class Fopen extends Function, AliasFunction, SideEffectFunction, TaintFu this.hasGlobalName(["_open", "_wopen"]) and input.isParameterDeref(0) and output.isReturnValue() + or + this.hasGlobalName(["_sopen_s", "_wsopen_s"]) and + input.isParameterDeref(1) and + output.isParameterDeref(0) } } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Scanf.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Scanf.qll index f1b3edbe3370..2c82e5423239 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Scanf.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Scanf.qll @@ -30,7 +30,10 @@ abstract private class ScanfFunctionModel extends ArrayFunction, TaintFunction, ( if exists(this.getLengthParameterIndex()) then result = this.getLengthParameterIndex() + 2 - else result = 2 + else + if exists(this.(ScanfFunction).getInputParameterIndex()) + then result = 2 + else result = 1 ) } @@ -69,13 +72,24 @@ abstract private class ScanfFunctionModel extends ArrayFunction, TaintFunction, } } +private predicate hasFlowSource( + ScanfFunction func, ScanfFunctionCall call, FunctionOutput output, string description +) { + exists(int n, Expr arg | + call.getScanfFunction() = func and + call.getOutputArgument(_) = arg and + call.getArgument(n) = arg and + output.isParameterDeref(n) and + description = "value read by " + func.getName() + ) +} + /** * The standard function `scanf` and its assorted variants */ private class ScanfModel extends ScanfFunctionModel, LocalFlowSourceFunction instanceof Scanf { - override predicate hasLocalFlowSource(FunctionOutput output, string description) { - output.isParameterDeref(any(int i | i >= this.getArgsStartPosition())) and - description = "value read by " + this.getName() + override predicate hasLocalFlowSource(Call call, FunctionOutput output, string description) { + hasFlowSource(this, call, output, description) } } @@ -83,9 +97,8 @@ private class ScanfModel extends ScanfFunctionModel, LocalFlowSourceFunction ins * The standard function `fscanf` and its assorted variants */ private class FscanfModel extends ScanfFunctionModel, RemoteFlowSourceFunction instanceof Fscanf { - override predicate hasRemoteFlowSource(FunctionOutput output, string description) { - output.isParameterDeref(any(int i | i >= this.getArgsStartPosition())) and - description = "value read by " + this.getName() + override predicate hasRemoteFlowSource(Call call, FunctionOutput output, string description) { + hasFlowSource(this, call, output, description) } override predicate hasSocketInput(FunctionInput input) { diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FlowSource.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FlowSource.qll index d2103f83bc0e..cf28fd0d6d30 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FlowSource.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FlowSource.qll @@ -18,7 +18,17 @@ abstract class RemoteFlowSourceFunction extends Function { /** * Holds if remote data described by `description` flows from `output` of a call to this function. */ - abstract predicate hasRemoteFlowSource(FunctionOutput output, string description); + predicate hasRemoteFlowSource(FunctionOutput output, string description) { + this.hasRemoteFlowSource(_, output, description) + } + + /** + * Holds if remote data described by `description` flows from `output` of `call` to this function. + */ + predicate hasRemoteFlowSource(Call call, FunctionOutput output, string description) { + call.getTarget() = this and + this.hasRemoteFlowSource(output, description) + } /** * Holds if remote data from this source comes from a socket or stream @@ -35,7 +45,17 @@ abstract class LocalFlowSourceFunction extends Function { /** * Holds if data described by `description` flows from `output` of a call to this function. */ - abstract predicate hasLocalFlowSource(FunctionOutput output, string description); + predicate hasLocalFlowSource(FunctionOutput output, string description) { + this.hasLocalFlowSource(_, output, description) + } + + /** + * Holds if data described by `description` flows from `output` of `call` to this function. + */ + predicate hasLocalFlowSource(Call call, FunctionOutput output, string description) { + call.getTarget() = this and + this.hasLocalFlowSource(output, description) + } } /** A library function that sends data over a network connection. */ diff --git a/cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll b/cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll index eba6f9339ffe..33695fdd51ab 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll @@ -28,8 +28,7 @@ private class RemoteModelSource extends RemoteFlowSource { RemoteModelSource() { exists(CallInstruction call, RemoteFlowSourceFunction func, FunctionOutput output | - call.getStaticCallTarget() = func and - func.hasRemoteFlowSource(output, sourceType) and + func.hasRemoteFlowSource(call.getConvertedResultExpression(), output, sourceType) and this = callOutput(call, output) ) } @@ -46,7 +45,7 @@ private class LocalModelSource extends LocalFlowSource { LocalModelSource() { exists(CallInstruction call, LocalFlowSourceFunction func, FunctionOutput output | call.getStaticCallTarget() = func and - func.hasLocalFlowSource(output, sourceType) and + func.hasLocalFlowSource(call.getConvertedResultExpression(), output, sourceType) and this = callOutput(call, output) ) } diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index 770002bb0232..ef8d209a22e2 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -912,6 +912,10 @@ class_template_argument_value( int index: int ref, int arg_value: @expr ref ); +class_template_generated_from( + unique int template: @usertype ref, + int from: @usertype ref +) @user_or_decltype = @usertype | @decltype; @@ -943,6 +947,10 @@ function_template_argument_value( int index: int ref, int arg_value: @expr ref ); +function_template_generated_from( + unique int template: @function ref, + int from: @function ref +); is_variable_template(unique int id: @variable ref); variable_instantiation( @@ -959,6 +967,30 @@ variable_template_argument_value( int index: int ref, int arg_value: @expr ref ); +variable_template_generated_from( + unique int template: @variable ref, + int from: @variable ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); +alias_template_generated_from( + unique int template: @usertype ref, + int from: @usertype ref +); template_template_instantiation( int to: @usertype ref, diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index ab81be3fa7cc..0b97bb3329b6 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -2,7 +2,7 @@ @compilation - 12591 + 12550 @externalDataElement @@ -10,15 +10,15 @@ @file - 64946 + 64732 @folder - 12339 + 12298 @diagnostic - 357 + 356 @trap @@ -28,29 +28,29 @@ @tag 1 + + @location_default + 46452143 + @source_file 1 @pch - 248 - - - @location_default - 46837435 + 246 @macro_expansion - 40309769 + 40321986 @other_macro_reference - 300641 + 300732 @normal_function - 2734631 + 2702108 @unknown_function @@ -58,51 +58,51 @@ @constructor - 694343 + 687816 @destructor - 85993 + 85025 @conversion_function - 10329 + 10212 @operator - 650865 + 643042 @user_defined_literal - 995 + 984 @deduction_guide - 5849 + 5783 @fun_decl - 4193416 + 4144339 @var_decl - 9367984 + 9431661 @type_decl - 1629528 + 1610928 @namespace_decl - 408755 + 408652 @using_declaration - 266845 + 265912 @using_directive - 6430 + 6370 @using_enum_declaration @@ -110,291 +110,291 @@ @static_assert - 172739 + 172696 @parameter - 7011801 + 6929135 @membervariable - 1502766 + 1503222 @globalvariable - 492567 + 662484 @localvariable - 724688 + 724508 @enumconstant - 348040 + 348146 @errortype - 124 + 123 @unknowntype - 124 + 123 @void - 124 + 123 @boolean - 124 + 123 @char - 124 + 123 @unsigned_char - 124 + 123 @signed_char - 124 + 123 @short - 124 + 123 @unsigned_short - 124 + 123 @signed_short - 124 + 123 @int - 124 + 123 @unsigned_int - 124 + 123 @signed_int - 124 + 123 @long - 124 + 123 @unsigned_long - 124 + 123 @signed_long - 124 + 123 @long_long - 124 + 123 @unsigned_long_long - 124 + 123 @signed_long_long - 124 + 123 @float - 124 + 123 @double - 124 + 123 @long_double - 124 + 123 @complex_float - 124 + 123 @complex_double - 124 + 123 @complex_long_double - 124 + 123 @imaginary_float - 124 + 123 @imaginary_double - 124 + 123 @imaginary_long_double - 124 + 123 @wchar_t - 124 + 123 @decltype_nullptr - 124 + 123 @int128 - 124 + 123 @unsigned_int128 - 124 + 123 @signed_int128 - 124 + 123 @float128 - 124 + 123 @complex_float128 - 124 + 123 @char16_t - 124 + 123 @char32_t - 124 + 123 @std_float32 - 124 + 123 @float32x - 124 + 123 @std_float64 - 124 + 123 @float64x - 124 + 123 @std_float128 - 124 + 123 @char8_t - 124 + 123 @float16 - 124 + 123 @complex_float16 - 124 + 123 @fp16 - 124 + 123 @std_bfloat16 - 124 + 123 @std_float16 - 124 + 123 @complex_std_float32 - 124 + 123 @complex_float32x - 124 + 123 @complex_std_float64 - 124 + 123 @complex_float64x - 124 + 123 @complex_std_float128 - 124 + 123 @mfp8 - 124 + 123 @scalable_vector_count - 124 + 123 @complex_fp16 - 124 + 123 @complex_std_bfloat16 - 124 + 123 @complex_std_float16 - 124 + 123 @pointer - 451499 + 450228 @type_with_specifiers - 691560 + 685493 @array - 90100 + 89824 @routineptr - 679857 + 673499 @reference - 964973 + 957919 @gnu_vector - 673 + 671 @routinereference - 372 + 368 @rvalue_reference - 290338 + 287560 @block @@ -404,17 +404,13 @@ @scalable_vector 1 - - @decltype - 101757 - @typeof 811 @underlying_type - 622 + 615 @bases @@ -458,7 +454,7 @@ @remove_cv - 2059 + 2095 @remove_cvref @@ -486,27 +482,31 @@ @remove_reference - 5705 + 5688 + + + @decltype + 101817 @struct - 976600 + 1036640 @union - 20907 + 20794 @enum - 41605 + 41618 @template_parameter - 864421 + 862626 @alias - 1755750 + 1757492 @unknown_usertype @@ -514,55 +514,55 @@ @class - 324188 + 321398 @template_template_parameter - 6090 + 6070 @proxy_class - 48241 + 50200 @scoped_enum - 11573 + 11443 @template_struct - 211176 + 210479 @template_class - 29245 + 28916 @template_union - 1368 + 1353 @mangledname - 6349611 + 6357829 @type_mention - 5913261 + 5915053 @concept_template - 3603 + 3592 @routinetype - 600586 + 594974 @ptrtomember - 9677 + 9645 @specifier - 7715 + 7628 @gnuattribute @@ -570,11 +570,11 @@ @stdattribute - 351940 + 347976 @declspec - 330396 + 330496 @msattribute @@ -586,15 +586,15 @@ @attribute_arg_token - 16585 + 16429 @attribute_arg_constant_expr - 71626 + 71243 @attribute_arg_expr - 1587 + 1582 @attribute_arg_empty @@ -610,35 +610,35 @@ @derivation - 473794 + 491402 @frienddecl - 767534 + 759702 @comment - 11208578 + 11082335 @namespace - 8615 + 8586 @specialnamequalifyingelement - 124 + 123 @namequalifier - 3042471 + 3051489 @value - 13541565 + 13547187 @initialiser - 2245206 + 2245054 @address_of @@ -646,131 +646,131 @@ @indirect - 402174 + 401821 @array_to_pointer - 1953951 + 1954545 @parexpr - 4915712 + 4917201 @arithnegexpr - 586594 + 586772 @unaryplusexpr - 4060 + 4109 @complementexpr - 38188 + 38199 @notexpr - 355800 + 355910 @postincrexpr - 84573 + 84598 @postdecrexpr - 57400 + 57416 @preincrexpr - 96724 + 96753 @predecrexpr - 35824 + 35835 @conditionalexpr - 897972 + 898245 @addexpr - 580447 + 580786 @subexpr - 466847 + 466989 @mulexpr - 445092 + 445352 @divexpr - 52388 + 52404 @remexpr - 15908 + 15758 @paddexpr - 118632 + 118668 @psubexpr - 68017 + 68038 @pdiffexpr - 43805 + 42943 @lshiftexpr - 552166 + 552247 @rshiftexpr - 201276 + 201394 @andexpr - 483235 + 483517 @orexpr - 193911 + 194025 @xorexpr - 73953 + 73976 @eqexpr - 643440 + 643635 @neexpr - 411912 + 412038 @gtexpr - 111161 + 111194 @ltexpr - 139443 + 139486 @geexpr - 81360 + 81384 @leexpr - 291944 + 292033 @assignexpr - 1281280 + 1281668 @assignaddexpr @@ -778,23 +778,23 @@ @assignsubexpr - 15309 + 15313 @assignmulexpr - 11140 + 11103 @assigndivexpr - 6807 + 6809 @assignremexpr - 871 + 861 @assignlshiftexpr - 3703 + 3704 @assignrshiftexpr @@ -802,47 +802,47 @@ @assignandexpr - 6528 + 6530 @assignorexpr - 19609 + 19615 @assignxorexpr - 29900 + 29909 @assignpaddexpr - 18630 + 18635 @assignpsubexpr - 1575 + 1576 @andlogicalexpr - 346625 + 346730 @orlogicalexpr - 1103652 + 1103987 @commaexpr - 167881 + 165621 @subscriptexpr - 435188 + 435320 @callexpr - 238860 + 260823 @vastartexpr - 4963 + 4962 @vaargexpr @@ -850,79 +850,79 @@ @vaendexpr - 2940 + 2941 @vacopyexpr - 135 + 134 @varaccess - 8255503 + 8258005 @runtime_sizeof - 401408 + 401643 @runtime_alignof - 49552 + 50293 @expr_stmt - 147518 + 147604 @routineexpr - 5725988 + 5708340 @type_operand - 1405528 + 1405954 @offsetofexpr - 148427 + 148514 @typescompexpr - 702016 + 702229 @literal - 7991777 + 8052387 @aggregateliteral - 1397523 + 1397524 @c_style_cast - 6027720 + 6029390 @temp_init - 980525 + 974928 @errorexpr - 45186 + 44841 @reference_to - 1880002 + 1870000 @ref_indirect - 2094099 + 2077162 @vacuous_destructor_call - 7784 + 7711 @assume - 4137 + 4136 @conjugation @@ -974,35 +974,35 @@ @thisaccess - 1553582 + 1553192 @new_expr - 45896 + 45504 @delete_expr - 11406 + 11299 @throw_expr - 23817 + 23664 @condition_decl - 407669 + 406399 @braced_init_list - 2126 + 2092 @type_id - 47589 + 47141 @sizeof_pack - 1726 + 2337 @hasassignexpr @@ -1050,7 +1050,7 @@ @isbaseofexpr - 257 + 256 @isclassexpr @@ -1058,19 +1058,19 @@ @isconvtoexpr - 248 + 246 @isemptyexpr - 8835 + 8736 @isenumexpr - 2986 + 2953 @ispodexpr - 831 + 828 @ispolyexpr @@ -1086,75 +1086,75 @@ @hastrivialdestructor - 2775 + 2749 @uuidof - 26787 + 26780 @delete_array_expr - 1241 + 1237 @new_array_expr - 6632 + 6630 @foldexpr - 1244 + 1261 @ctordirectinit - 112102 + 111048 @ctorvirtualinit - 3993 + 3956 @ctorfieldinit - 205713 + 203396 @ctordelegatinginit - 3609 + 3568 @dtordirectdestruct - 39195 + 38826 @dtorvirtualdestruct - 3960 + 3922 @dtorfielddestruct - 39567 + 39195 @static_cast - 347211 + 347361 @reinterpret_cast - 39962 + 39952 @const_cast - 24302 + 24073 @dynamic_cast - 788 + 786 @lambdaexpr - 18997 + 18992 @param_ref - 162057 + 163499 @noopexpr @@ -1162,7 +1162,7 @@ @istriviallyconstructibleexpr - 3733 + 3691 @isdestructibleexpr @@ -1174,19 +1174,19 @@ @istriviallydestructibleexpr - 995 + 984 @istriviallyassignableexpr - 3733 + 3691 @isnothrowassignableexpr - 5102 + 5044 @istrivialexpr - 3328 + 3310 @isstandardlayoutexpr @@ -1194,7 +1194,7 @@ @istriviallycopyableexpr - 1368 + 1353 @isliteraltypeexpr @@ -1214,11 +1214,11 @@ @isconstructibleexpr - 3609 + 3568 @isnothrowconstructibleexpr - 20658 + 20425 @hasfinalizerexpr @@ -1254,11 +1254,11 @@ @isfinalexpr - 9341 + 9254 @noexceptexpr - 28017 + 30165 @builtinshufflevector @@ -1266,11 +1266,11 @@ @builtinchooseexpr - 20593 + 20605 @builtinaddressof - 15431 + 15257 @vec_fill @@ -1286,7 +1286,7 @@ @spaceshipexpr - 1308 + 1347 @co_await @@ -1298,7 +1298,7 @@ @isassignable - 407 + 406 @isaggregate @@ -1306,15 +1306,15 @@ @hasuniqueobjectrepresentations - 42 + 64 @builtinbitcast - 248 + 246 @builtinshuffle - 610 + 608 @blockassignexpr @@ -1322,7 +1322,7 @@ @issame - 4526 + 4511 @isfunction @@ -1430,7 +1430,7 @@ @reuseexpr - 844446 + 841815 @istriviallycopyassignable @@ -1526,23 +1526,23 @@ @c11_generic - 29943 + 29960 @requires_expr - 16452 + 16401 @nested_requirement - 686 + 684 @compound_requirement - 10918 + 10884 @concept_id - 90157 + 90089 @isinvocable @@ -1558,75 +1558,75 @@ @lambdacapture - 31864 + 31856 @stmt_expr - 2031829 + 2032444 @stmt_if - 990319 + 990619 @stmt_while - 39652 + 39664 @stmt_goto - 157265 + 156745 @stmt_label - 77727 + 77471 @stmt_return - 1238112 + 1233416 @stmt_block - 1724482 + 1700014 @stmt_end_test_while - 232290 + 232426 @stmt_for - 84398 + 84423 @stmt_switch_case - 833592 + 830953 @stmt_switch - 410607 + 409307 @stmt_asm - 63827 + 63865 @stmt_decl - 769985 + 769791 @stmt_empty - 428111 + 426756 @stmt_continue - 28094 + 28103 @stmt_break - 137498 + 137464 @stmt_try_block - 26379 + 26287 @stmt_microsoft_try @@ -1642,19 +1642,19 @@ @stmt_assigned_goto - 12423 + 12426 @stmt_range_based_for - 6311 + 6157 @stmt_handler - 43224 + 43039 @stmt_constexpr_if - 105781 + 103482 @stmt_co_return @@ -1674,55 +1674,55 @@ @ppd_if - 589512 + 582872 @ppd_ifdef - 214386 + 214451 @ppd_ifndef - 160487 + 160536 @ppd_elif - 21827 + 21755 @ppd_else - 234336 + 231697 @ppd_endif - 886819 + 876831 @ppd_plain_include - 317265 + 316217 @ppd_define - 2743342 + 2712444 @ppd_undef - 100181 + 99052 @ppd_pragma - 405204 + 400640 @ppd_include_next - 169 + 167 @ppd_line - 18770 + 18775 @ppd_error - 124 + 123 @ppd_objc_import @@ -1750,7 +1750,7 @@ @link_target - 816 + 817 @xmldtd @@ -1780,11 +1780,11 @@ compilations - 12591 + 12550 id - 12591 + 12550 cwd @@ -1802,7 +1802,7 @@ 1 2 - 12591 + 12550 @@ -1828,19 +1828,19 @@ compilation_args - 1008084 + 1004756 id - 12591 + 12550 num - 1462 + 1457 arg - 29149 + 29053 @@ -1854,52 +1854,52 @@ 36 42 - 999 + 996 42 43 - 1094 + 1090 43 44 - 715 + 712 44 45 - 504 + 503 45 51 - 946 + 943 51 70 - 483 + 482 71 72 - 704 + 702 72 90 - 894 + 891 94 96 - 389 + 387 98 99 - 1335 + 1331 100 @@ -1909,22 +1909,22 @@ 103 104 - 1988 + 1981 104 119 - 1062 + 1058 120 138 - 925 + 922 139 140 - 452 + 450 @@ -1940,67 +1940,67 @@ 34 38 - 589 + 587 38 39 - 1493 + 1488 39 40 - 978 + 975 40 42 - 1083 + 1079 42 53 - 599 + 597 53 54 - 704 + 702 54 63 - 894 + 891 64 67 - 399 + 398 67 68 - 1399 + 1394 68 70 - 967 + 964 70 71 - 1399 + 1394 73 79 - 946 + 943 79 89 - 1125 + 1121 89 @@ -2021,7 +2021,7 @@ 43 90 - 63 + 62 90 @@ -2031,7 +2031,7 @@ 108 183 - 105 + 104 198 @@ -2041,12 +2041,12 @@ 422 595 - 126 + 125 595 605 - 126 + 125 605 @@ -2066,12 +2066,12 @@ 930 1190 - 84 + 83 1197 1198 - 378 + 377 @@ -2087,7 +2087,7 @@ 1 5 - 126 + 125 5 @@ -2117,12 +2117,12 @@ 22 27 - 126 + 125 27 29 - 84 + 83 29 @@ -2132,7 +2132,7 @@ 34 44 - 126 + 125 45 @@ -2152,7 +2152,7 @@ 171 199 - 21 + 20 @@ -2168,22 +2168,22 @@ 1 2 - 13349 + 13305 2 3 - 12633 + 12592 3 103 - 2188 + 2180 104 1198 - 978 + 975 @@ -2199,17 +2199,17 @@ 1 2 - 19303 + 19239 2 3 - 8689 + 8660 3 62 - 1157 + 1153 @@ -2219,19 +2219,19 @@ compilation_expanded_args - 1008084 + 1004756 id - 12591 + 12550 num - 1462 + 1457 arg - 29149 + 29053 @@ -2245,52 +2245,52 @@ 36 42 - 999 + 996 42 43 - 1094 + 1090 43 44 - 715 + 712 44 45 - 504 + 503 45 51 - 946 + 943 51 70 - 483 + 482 71 72 - 704 + 702 72 90 - 894 + 891 94 96 - 389 + 387 98 99 - 1335 + 1331 100 @@ -2300,22 +2300,22 @@ 103 104 - 1988 + 1981 104 119 - 1062 + 1058 120 138 - 925 + 922 139 140 - 452 + 450 @@ -2331,67 +2331,67 @@ 34 38 - 589 + 587 38 39 - 1493 + 1488 39 40 - 978 + 975 40 42 - 1083 + 1079 42 53 - 599 + 597 53 54 - 704 + 702 54 63 - 894 + 891 64 67 - 399 + 398 67 68 - 1399 + 1394 68 70 - 967 + 964 70 71 - 1399 + 1394 73 79 - 946 + 943 79 89 - 1125 + 1121 89 @@ -2412,7 +2412,7 @@ 43 90 - 63 + 62 90 @@ -2422,7 +2422,7 @@ 108 183 - 105 + 104 198 @@ -2432,12 +2432,12 @@ 422 595 - 126 + 125 595 605 - 126 + 125 605 @@ -2457,12 +2457,12 @@ 930 1190 - 84 + 83 1197 1198 - 378 + 377 @@ -2478,7 +2478,7 @@ 1 5 - 126 + 125 5 @@ -2508,12 +2508,12 @@ 22 27 - 126 + 125 27 29 - 84 + 83 29 @@ -2523,7 +2523,7 @@ 34 44 - 126 + 125 45 @@ -2543,7 +2543,7 @@ 171 199 - 21 + 20 @@ -2559,22 +2559,22 @@ 1 2 - 13349 + 13305 2 3 - 12633 + 12592 3 103 - 2188 + 2180 104 1198 - 978 + 975 @@ -2590,17 +2590,17 @@ 1 2 - 19303 + 19239 2 3 - 8689 + 8660 3 62 - 1157 + 1153 @@ -2658,19 +2658,19 @@ compilation_compiling_files - 15738 + 15743 id - 2722 + 2723 num - 4520 + 4521 file - 13668 + 13673 @@ -2858,7 +2858,7 @@ 1 2 - 12307 + 12311 2 @@ -2884,7 +2884,7 @@ 1 2 - 12525 + 12529 2 @@ -2904,15 +2904,15 @@ compilation_time - 62953 + 62972 id - 2722 + 2723 num - 4520 + 4521 kind @@ -2920,7 +2920,7 @@ seconds - 16990 + 17867 @@ -2985,7 +2985,7 @@ 4 5 - 2722 + 2723 @@ -3001,47 +3001,52 @@ 3 4 - 381 + 490 4 5 - 980 + 871 5 - 9 - 217 + 7 + 163 - 9 + 8 10 - 163 + 217 10 11 - 163 + 108 11 - 15 + 12 217 - 17 - 20 + 14 + 18 + 163 + + + 18 + 21 217 - 20 - 26 + 21 + 53 217 - 44 - 132 - 163 + 116 + 117 + 54 @@ -3093,7 +3098,7 @@ 4 5 - 4520 + 4521 @@ -3109,47 +3114,47 @@ 3 4 - 871 + 926 4 5 - 1579 + 1470 5 6 - 163 + 217 6 7 - 326 + 490 7 8 - 435 + 326 8 9 - 163 + 217 9 - 11 + 13 381 - 11 - 30 + 17 + 46 381 - 40 - 95 - 217 + 51 + 98 + 108 @@ -3200,13 +3205,13 @@ 108 - 177 - 178 + 166 + 167 54 - 183 - 184 + 179 + 180 54 @@ -3223,22 +3228,22 @@ 1 2 - 10020 + 11548 2 3 - 3975 + 4249 3 4 - 1906 + 1416 4 - 47 - 1089 + 45 + 653 @@ -3254,27 +3259,27 @@ 1 2 - 9639 + 10949 2 3 - 3757 + 3922 3 4 - 1579 + 1307 4 - 5 - 1143 + 9 + 1416 - 5 - 72 - 871 + 9 + 67 + 272 @@ -3290,12 +3295,12 @@ 1 2 - 13941 + 16505 2 3 - 3049 + 1361 @@ -3305,15 +3310,15 @@ diagnostic_for - 504 + 503 diagnostic - 357 + 356 compilation - 189 + 188 file_number @@ -3335,12 +3340,12 @@ 1 2 - 210 + 209 2 3 - 147 + 146 @@ -3356,7 +3361,7 @@ 1 2 - 357 + 356 @@ -3372,7 +3377,7 @@ 1 2 - 357 + 356 @@ -3388,17 +3393,17 @@ 2 3 - 105 + 104 3 4 - 63 + 62 5 6 - 21 + 20 @@ -3414,7 +3419,7 @@ 1 2 - 189 + 188 @@ -3430,17 +3435,17 @@ 2 3 - 105 + 104 3 4 - 63 + 62 5 6 - 21 + 20 @@ -3504,7 +3509,7 @@ 1 2 - 21 + 20 4 @@ -3535,7 +3540,7 @@ 2 3 - 21 + 20 8 @@ -3545,7 +3550,7 @@ 18 19 - 21 + 20 @@ -3571,19 +3576,19 @@ compilation_finished - 12591 + 12550 id - 12591 + 12550 cpu_seconds - 9593 + 8922 elapsed_seconds - 210 + 167 @@ -3597,7 +3602,7 @@ 1 2 - 12591 + 12550 @@ -3613,7 +3618,7 @@ 1 2 - 12591 + 12550 @@ -3629,17 +3634,17 @@ 1 2 - 8289 + 7161 2 3 - 967 + 1247 3 - 33 - 336 + 31 + 513 @@ -3655,12 +3660,12 @@ 1 2 - 9004 + 8261 2 3 - 589 + 660 @@ -3676,37 +3681,22 @@ 1 2 - 31 + 41 2 3 - 31 - - - 5 - 6 10 - 7 - 8 - 21 - - - 10 - 11 - 21 - - - 13 - 14 + 4 + 5 10 - 14 - 15 - 10 + 9 + 10 + 20 16 @@ -3714,33 +3704,38 @@ 10 - 32 - 33 + 22 + 23 10 - 69 - 70 + 25 + 26 10 - 182 - 183 + 28 + 29 10 - 216 - 217 + 76 + 77 + 10 + + + 290 + 291 10 - 288 - 289 + 350 + 351 10 - 319 - 320 + 362 + 363 10 @@ -3757,76 +3752,61 @@ 1 2 - 31 + 41 2 3 - 31 - - - 5 - 6 10 - 7 - 8 - 21 + 4 + 5 + 10 9 10 - 10 - - - 10 - 11 - 10 - - - 13 - 14 - 10 + 20 - 14 - 15 + 16 + 17 10 - 16 - 17 + 22 + 23 10 - 32 - 33 + 25 + 26 10 - 67 - 68 + 27 + 28 10 - 163 - 164 + 71 + 72 10 - 170 - 171 + 168 + 169 10 - 206 - 207 + 255 + 256 10 - 240 - 241 + 302 + 303 10 @@ -4053,42 +4033,42 @@ sourceLocationPrefix - 124 + 123 prefix - 124 + 123 locations_default - 46837435 + 46452143 id - 46837435 + 46452143 file - 40819 + 40359 beginLine - 7483212 + 7398928 beginColumn - 21902 + 21656 endLine - 7484208 + 7399912 endColumn - 53263 + 52910 @@ -4102,7 +4082,7 @@ 1 2 - 46837435 + 46452143 @@ -4118,7 +4098,7 @@ 1 2 - 46837435 + 46452143 @@ -4134,7 +4114,7 @@ 1 2 - 46837435 + 46452143 @@ -4150,7 +4130,7 @@ 1 2 - 46837435 + 46452143 @@ -4166,7 +4146,7 @@ 1 2 - 46837435 + 46452143 @@ -4182,72 +4162,72 @@ 1 15 - 3111 + 3076 15 41 - 3111 + 3076 42 72 - 3111 + 3076 72 114 - 3360 + 3199 114 142 - 3111 + 3199 143 - 211 - 3111 + 212 + 3076 213 307 - 3111 + 3076 310 - 430 - 3111 + 431 + 3076 437 596 - 3111 + 3076 607 - 829 - 3111 + 846 + 3076 - 839 - 1298 - 3111 + 848 + 1304 + 3076 - 1303 + 1354 2855 - 3111 + 3076 3114 30788 - 3111 + 3076 57880 57881 - 124 + 123 @@ -4263,67 +4243,67 @@ 1 13 - 3360 + 3322 13 31 - 3360 + 3322 31 47 - 3111 + 3076 47 64 - 3111 + 3076 64 84 - 3111 + 3076 85 115 - 3111 + 3076 116 160 - 3235 + 3199 160 206 - 3111 + 3076 206 291 - 3111 + 3076 298 388 - 3111 + 3076 395 527 - 3111 + 3076 561 1339 - 3111 + 3076 - 1375 + 1385 57764 - 2862 + 2830 @@ -4339,67 +4319,67 @@ 1 5 - 3733 + 3691 5 9 - 3111 + 3076 9 15 - 3235 + 3199 15 20 - 3235 + 3199 20 28 - 3235 + 3199 28 36 - 3235 + 3076 36 - 42 - 3111 + 43 + 3322 - 42 + 43 53 - 3360 + 3199 53 62 - 3235 + 3076 62 - 81 - 3111 + 80 + 3076 - 81 + 80 95 - 3111 + 3199 95 111 - 3111 + 3076 112 156 - 1991 + 1968 @@ -4415,67 +4395,67 @@ 1 13 - 3360 + 3322 13 31 - 3360 + 3322 31 46 - 3111 + 3076 46 63 - 3111 + 3076 63 84 - 3111 + 3076 84 114 - 3111 + 3076 118 160 - 3235 + 3199 160 206 - 3111 + 3076 207 291 - 3111 + 3076 300 390 - 3111 + 3076 395 562 - 3111 + 3076 564 1350 - 3111 + 3076 - 1420 + 1430 57764 - 2862 + 2830 @@ -4491,67 +4471,67 @@ 1 12 - 3360 + 3322 13 26 - 3484 + 3445 26 34 - 3235 + 3199 34 42 - 3235 + 3199 42 50 - 3235 + 3076 50 61 - 3111 + 3076 61 67 - 3235 + 3322 67 76 - 3484 + 3445 76 88 - 3235 + 3199 89 102 - 3111 + 3076 102 116 - 3484 + 3322 116 - 133 - 3111 + 132 + 3076 - 136 - 363 - 1493 + 132 + 364 + 1599 @@ -4567,32 +4547,32 @@ 1 2 - 4945832 + 4890126 2 3 - 778674 + 769903 3 4 - 542719 + 536607 4 12 - 566862 + 559370 12 96 - 561387 + 554941 96 - 638 - 87736 + 639 + 87978 @@ -4608,27 +4588,27 @@ 1 2 - 5008056 + 4951650 2 3 - 1216857 + 1203151 3 6 - 638669 + 631107 6 56 - 562133 + 556171 56 329 - 57495 + 56847 @@ -4644,27 +4624,27 @@ 1 2 - 5629552 + 5566146 2 3 - 483109 + 477667 3 7 - 577316 + 570322 7 25 - 564996 + 558263 25 94 - 228238 + 226529 @@ -4680,12 +4660,12 @@ 1 2 - 7018148 + 6938241 2 85 - 465064 + 460687 @@ -4701,32 +4681,32 @@ 1 2 - 5014278 + 4957802 2 3 - 741090 + 732743 3 4 - 535377 + 529347 4 12 - 584783 + 577458 12 71 - 561760 + 555925 71 - 250 - 45921 + 252 + 45650 @@ -4742,67 +4722,67 @@ 1 2 - 1742 + 1722 2 6 - 1991 + 1968 6 12 - 1866 + 1845 12 40 - 1742 + 1722 49 128 - 1742 + 1722 129 - 253 - 1742 + 262 + 1722 - 316 - 707 - 1742 + 317 + 717 + 1722 - 791 - 1267 - 1742 + 799 + 1281 + 1722 - 1280 - 1943 - 1742 + 1287 + 1966 + 1722 - 2016 + 2038 2400 - 1742 + 1722 - 2483 - 3212 - 1742 + 2484 + 3299 + 1722 - 3264 - 8088 - 1742 + 3311 + 8093 + 1722 - 11053 + 11052 121030 - 622 + 615 @@ -4818,67 +4798,67 @@ 1 2 - 1991 + 1968 2 4 - 1742 + 1722 4 7 - 1742 + 1722 7 18 - 1866 + 1845 19 - 43 - 1742 + 44 + 1722 44 - 60 - 1742 + 61 + 1722 66 93 - 1742 + 1722 96 117 - 1742 + 1722 - 117 - 150 - 1742 + 118 + 151 + 1845 - 150 - 169 - 1742 + 152 + 170 + 1845 - 169 - 181 - 1742 + 170 + 183 + 1722 - 182 - 217 - 1866 + 183 + 244 + 1722 - 243 + 259 329 - 497 + 369 @@ -4894,67 +4874,67 @@ 1 2 - 1866 + 1845 2 5 - 1866 + 1845 5 11 - 1742 + 1722 11 36 - 1742 + 1722 36 - 101 - 1742 + 103 + 1722 - 108 - 218 - 1742 + 109 + 220 + 1722 226 - 543 - 1742 + 548 + 1722 - 634 - 1057 - 1742 + 640 + 1059 + 1722 - 1074 - 1407 - 1742 + 1078 + 1412 + 1722 - 1408 - 1603 - 1742 + 1417 + 1609 + 1722 - 1611 - 1810 - 1742 + 1625 + 1811 + 1722 1835 - 3794 - 1742 + 3793 + 1722 3838 59550 - 746 + 738 @@ -4970,67 +4950,67 @@ 1 2 - 1866 + 1845 2 5 - 1866 + 1845 5 11 - 1742 + 1722 11 36 - 1742 + 1722 36 - 102 - 1742 + 104 + 1722 - 109 - 219 - 1742 + 110 + 221 + 1722 225 - 545 - 1742 + 550 + 1722 - 632 - 1056 - 1742 + 638 + 1058 + 1722 - 1076 - 1404 - 1742 + 1080 + 1414 + 1722 - 1417 - 1602 - 1742 + 1420 + 1607 + 1722 - 1610 - 1808 - 1742 + 1624 + 1809 + 1722 1836 3771 - 1742 + 1722 3831 59557 - 746 + 738 @@ -5046,67 +5026,67 @@ 1 2 - 2115 + 2091 2 5 - 1493 + 1476 5 8 - 1617 + 1599 8 13 - 1742 + 1722 13 23 - 1991 + 1968 23 33 - 1866 + 1722 - 34 + 33 44 - 1742 + 1845 45 - 57 - 1742 + 58 + 1722 58 74 - 1991 + 1845 74 - 86 - 1866 + 87 + 1968 - 86 + 87 99 - 1866 + 1722 100 - 259 - 1742 + 160 + 1722 - 298 + 261 299 - 124 + 246 @@ -5122,32 +5102,32 @@ 1 2 - 4943591 + 4887911 2 3 - 782034 + 773226 3 4 - 541973 + 535868 4 12 - 565493 + 558263 12 - 95 - 562382 + 94 + 555187 - 95 - 621 - 88731 + 94 + 622 + 89455 @@ -5163,27 +5143,27 @@ 1 2 - 5005069 + 4948697 2 3 - 1220466 + 1206720 3 6 - 631078 + 623601 6 51 - 562009 + 556048 51 329 - 65584 + 64845 @@ -5199,12 +5179,12 @@ 1 2 - 7035322 + 6955098 2 15 - 448885 + 444814 @@ -5220,27 +5200,27 @@ 1 2 - 5628183 + 5564792 2 3 - 481615 + 476191 3 7 - 581547 + 574382 7 25 - 568356 + 561093 25 89 - 224505 + 223453 @@ -5256,32 +5236,32 @@ 1 2 - 5012785 + 4956325 2 3 - 746317 + 737911 3 4 - 533759 + 527747 4 12 - 586774 + 579304 12 72 - 561636 + 555679 72 - 250 - 42934 + 252 + 42943 @@ -5297,52 +5277,52 @@ 1 2 - 15680 + 15626 2 3 - 5600 + 5414 3 - 7 - 4231 + 6 + 4060 - 7 - 17 - 4106 + 6 + 16 + 4060 - 17 - 33 - 4106 + 16 + 31 + 4183 - 33 - 106 - 4106 + 31 + 93 + 4060 - 114 - 689 - 4106 + 96 + 660 + 4060 - 722 - 2461 - 4106 + 661 + 2409 + 4060 - 2595 - 4749 - 4106 + 2461 + 4698 + 4060 - 4759 + 4717 33780 - 3111 + 3322 @@ -5358,52 +5338,52 @@ 1 2 - 18542 + 18210 2 3 - 5600 + 5660 3 5 - 3609 + 3691 5 - 7 - 3733 + 8 + 4306 - 7 - 16 - 4231 + 8 + 17 + 4183 - 16 - 75 - 4106 + 17 + 84 + 4060 - 79 - 142 - 4106 + 88 + 160 + 4183 - 151 - 208 - 4106 + 160 + 214 + 4060 - 210 - 262 - 4231 + 215 + 267 + 4060 - 262 + 267 329 - 995 + 492 @@ -5419,52 +5399,52 @@ 1 2 - 15929 + 15873 2 3 - 5973 + 5783 3 - 8 - 4231 + 7 + 4060 - 8 + 7 18 - 4355 + 4429 18 - 40 - 4106 + 39 + 4060 - 41 - 217 - 4106 + 39 + 155 + 4060 - 235 - 758 - 4106 + 187 + 643 + 4060 - 768 - 2172 - 4106 + 746 + 2054 + 4060 - 2206 - 2884 - 4106 + 2170 + 2875 + 4060 - 2887 + 2880 30763 - 2240 + 2460 @@ -5480,52 +5460,52 @@ 1 2 - 17173 + 16857 2 3 - 6222 + 6398 3 4 - 3235 + 3199 4 7 - 4231 + 4060 7 - 14 - 4231 + 13 + 4183 - 14 + 13 28 - 4480 + 4675 28 46 - 4106 + 4060 46 70 - 4106 + 4060 70 - 82 - 4231 + 83 + 4306 - 82 + 83 117 - 1244 + 1107 @@ -5541,52 +5521,52 @@ 1 2 - 15929 + 15873 2 3 - 5973 + 5783 3 - 8 - 4231 + 7 + 4060 - 8 - 18 - 4355 + 7 + 17 + 4060 - 18 - 40 - 4106 + 17 + 30 + 4060 - 40 - 216 - 4106 + 32 + 100 + 4060 - 233 - 755 - 4106 + 104 + 621 + 4060 - 769 - 2172 - 4106 + 628 + 1958 + 4060 - 2206 - 2862 - 4106 + 1966 + 2836 + 4060 - 2864 + 2841 30757 - 2240 + 2830 @@ -5596,15 +5576,15 @@ files - 64946 + 64732 id - 64946 + 64732 name - 64946 + 64732 @@ -5618,7 +5598,7 @@ 1 2 - 64946 + 64732 @@ -5634,7 +5614,7 @@ 1 2 - 64946 + 64732 @@ -5644,15 +5624,15 @@ folders - 12339 + 12298 id - 12339 + 12298 name - 12339 + 12298 @@ -5666,7 +5646,7 @@ 1 2 - 12339 + 12298 @@ -5682,7 +5662,7 @@ 1 2 - 12339 + 12298 @@ -5692,15 +5672,15 @@ containerparent - 77264 + 77009 parent - 12339 + 12298 child - 77264 + 77009 @@ -5714,37 +5694,37 @@ 1 2 - 6006 + 5986 2 3 - 1514 + 1509 3 4 - 662 + 660 4 6 - 999 + 996 6 10 - 967 + 964 10 16 - 999 + 996 16 44 - 925 + 922 44 @@ -5765,7 +5745,7 @@ 1 2 - 77264 + 77009 @@ -5775,23 +5755,23 @@ numlines - 805928 + 796112 element_id - 804808 + 795005 num_lines - 39325 + 38882 num_code - 33974 + 33591 num_comment - 18293 + 18087 @@ -5805,12 +5785,12 @@ 1 2 - 803688 + 793898 2 3 - 1120 + 1107 @@ -5826,12 +5806,12 @@ 1 2 - 803688 + 793898 2 3 - 1120 + 1107 @@ -5847,12 +5827,12 @@ 1 2 - 804559 + 794759 2 3 - 248 + 246 @@ -5868,27 +5848,27 @@ 1 2 - 26631 + 26332 2 3 - 3733 + 3691 3 5 - 3360 + 3322 5 35 - 2986 + 2953 39 - 1983 - 2613 + 1981 + 2583 @@ -5904,27 +5884,27 @@ 1 2 - 27129 + 26824 2 3 - 4106 + 4060 3 4 - 2488 + 2460 4 7 - 3484 + 3445 7 12 - 2115 + 2091 @@ -5940,27 +5920,27 @@ 1 2 - 26756 + 26455 2 3 - 4106 + 4060 3 4 - 2364 + 2337 4 6 - 3235 + 3199 6 10 - 2862 + 2830 @@ -5976,32 +5956,32 @@ 1 2 - 21778 + 21533 2 3 - 3609 + 3568 3 4 - 2364 + 2337 4 - 13 - 2862 + 12 + 2583 - 14 - 198 - 2613 + 12 + 157 + 2583 - 204 - 2092 - 746 + 172 + 2090 + 984 @@ -6017,32 +5997,32 @@ 1 2 - 22151 + 21902 2 3 - 3609 + 3568 3 4 - 2115 + 2091 4 6 - 1866 + 1845 6 9 - 2737 + 2707 9 13 - 1493 + 1476 @@ -6058,27 +6038,27 @@ 1 2 - 21902 + 21656 2 3 - 4231 + 4183 3 5 - 2862 + 2830 5 8 - 3111 + 3076 8 12 - 1866 + 1845 @@ -6094,32 +6074,32 @@ 1 2 - 11324 + 11197 2 3 - 1991 + 1968 3 4 - 1120 + 1107 4 7 - 1493 + 1476 8 22 - 1493 + 1476 42 - 3651 - 871 + 3648 + 861 @@ -6135,32 +6115,32 @@ 1 2 - 11324 + 11197 2 3 - 1991 + 1968 3 4 - 1120 + 1107 4 7 - 1617 + 1599 8 27 - 1493 + 1476 30 48 - 746 + 738 @@ -6176,32 +6156,32 @@ 1 2 - 11324 + 11197 2 3 - 1991 + 1968 3 4 - 1368 + 1353 4 8 - 1493 + 1476 8 31 - 1493 + 1476 35 42 - 622 + 615 @@ -6211,15 +6191,15 @@ diagnostics - 357 + 356 id - 357 + 356 severity - 21 + 20 error_tag @@ -6227,7 +6207,7 @@ error_message - 147 + 146 full_error_message @@ -6249,7 +6229,7 @@ 1 2 - 357 + 356 @@ -6265,7 +6245,7 @@ 1 2 - 357 + 356 @@ -6281,7 +6261,7 @@ 1 2 - 357 + 356 @@ -6297,7 +6277,7 @@ 1 2 - 357 + 356 @@ -6313,7 +6293,7 @@ 1 2 - 357 + 356 @@ -6434,7 +6414,7 @@ 1 2 - 42 + 41 3 @@ -6559,7 +6539,7 @@ 1 2 - 105 + 104 2 @@ -6585,7 +6565,7 @@ 1 2 - 147 + 146 @@ -6601,7 +6581,7 @@ 1 2 - 147 + 146 @@ -6659,7 +6639,7 @@ 1 2 - 168 + 167 18 @@ -6744,7 +6724,7 @@ 1 2 - 168 + 167 18 @@ -6823,15 +6803,15 @@ extractor_version - 124 + 123 codeql_version - 124 + 123 frontend_version - 124 + 123 @@ -6845,7 +6825,7 @@ 1 2 - 124 + 123 @@ -6861,7 +6841,7 @@ 1 2 - 124 + 123 @@ -7159,7 +7139,7 @@ pch_uses - 4121 + 4120 pch @@ -7167,11 +7147,11 @@ compilation - 4121 + 4120 id - 4121 + 4120 @@ -7367,7 +7347,7 @@ 1 2 - 4121 + 4120 @@ -7383,7 +7363,7 @@ 1 2 - 4121 + 4120 @@ -7399,7 +7379,7 @@ 1 2 - 4121 + 4120 @@ -7415,7 +7395,7 @@ 1 2 - 4121 + 4120 @@ -7425,19 +7405,19 @@ pch_creations - 248 + 246 pch - 248 + 246 compilation - 248 + 246 from - 248 + 246 @@ -7451,7 +7431,7 @@ 1 2 - 248 + 246 @@ -7467,7 +7447,7 @@ 1 2 - 248 + 246 @@ -7483,7 +7463,7 @@ 1 2 - 248 + 246 @@ -7499,7 +7479,7 @@ 1 2 - 248 + 246 @@ -7515,7 +7495,7 @@ 1 2 - 248 + 246 @@ -7531,7 +7511,7 @@ 1 2 - 248 + 246 @@ -7541,23 +7521,23 @@ fileannotations - 4183417 + 4169606 id - 5743 + 5724 kind - 21 + 20 name - 58477 + 58284 value - 39353 + 39223 @@ -7576,7 +7556,7 @@ 2 3 - 5543 + 5525 @@ -7592,57 +7572,57 @@ 1 86 - 431 + 429 88 206 - 431 + 429 212 291 - 441 + 440 291 359 - 431 + 429 362 401 - 431 + 429 402 479 - 431 + 429 480 549 - 252 + 251 550 551 - 1325 + 1321 553 628 - 431 + 429 631 753 - 452 + 450 753 1231 - 441 + 440 1234 @@ -7663,67 +7643,67 @@ 1 98 - 431 + 429 102 244 - 431 + 429 244 351 - 431 + 429 352 434 - 441 + 440 434 490 - 441 + 440 490 628 - 431 + 429 632 702 - 63 + 62 706 707 - 1325 + 1321 710 939 - 431 + 429 939 1038 - 431 + 429 1066 1853 - 431 + 429 1853 3292 - 431 + 429 3423 3742 - 21 + 20 @@ -7802,62 +7782,62 @@ 1 2 - 10982 + 10945 2 3 - 4344 + 4330 3 5 - 5038 + 5022 5 7 - 4081 + 4068 7 9 - 4575 + 4560 9 16 - 4312 + 4298 16 19 - 4870 + 4854 19 27 - 4239 + 4225 27 47 - 4817 + 4801 47 128 - 4902 + 4885 128 459 - 4607 + 4592 459 546 - 1704 + 1698 @@ -7873,7 +7853,7 @@ 1 2 - 58477 + 58284 @@ -7889,57 +7869,57 @@ 1 2 - 11539 + 11501 2 3 - 7658 + 7632 3 4 - 4081 + 4068 4 6 - 4049 + 4036 6 8 - 3408 + 3397 8 11 - 4723 + 4707 11 17 - 5375 + 5357 17 23 - 4681 + 4665 23 41 - 4660 + 4644 41 95 - 4449 + 4435 95 1726 - 3850 + 3837 @@ -7955,72 +7935,72 @@ 1 2 - 3345 + 3334 2 4 - 1630 + 1625 4 5 - 3176 + 3166 5 8 - 2451 + 2442 8 14 - 2955 + 2946 14 17 - 1925 + 1918 17 24 - 3029 + 3019 24 51 - 3523 + 3512 51 58 - 3019 + 3009 58 80 - 2966 + 2956 81 151 - 3071 + 3061 151 334 - 2966 + 2956 334 473 - 2987 + 2977 473 547 - 2303 + 2296 @@ -8036,7 +8016,7 @@ 1 2 - 39342 + 39212 2 @@ -8057,67 +8037,67 @@ 1 2 - 3387 + 3376 2 4 - 1904 + 1897 4 5 - 3040 + 3030 5 8 - 2472 + 2463 8 14 - 3471 + 3459 14 18 - 3439 + 3428 18 28 - 3187 + 3176 28 34 - 3134 + 3124 34 41 - 3187 + 3176 41 66 - 2976 + 2967 66 92 - 3061 + 3051 92 113 - 2976 + 2967 113 145 - 3019 + 3009 145 @@ -8132,15 +8112,15 @@ inmacroexpansion - 150011437 + 150057030 id - 24673503 + 24680985 inv - 3705721 + 3706846 @@ -8154,37 +8134,37 @@ 1 3 - 2209722 + 2210373 3 5 - 1475129 + 1475577 5 6 - 1620535 + 1621028 6 7 - 6583220 + 6585222 7 8 - 8719894 + 8722546 8 9 - 3557413 + 3558495 9 22 - 507586 + 507741 @@ -8200,57 +8180,57 @@ 1 2 - 531761 + 531923 2 3 - 743309 + 743535 3 4 - 481562 + 481708 4 7 - 275331 + 275415 7 8 - 282181 + 282267 8 9 - 330280 + 330381 9 10 - 3046 + 3047 10 11 - 444696 + 444831 11 337 - 307830 + 307921 339 423 - 281784 + 281870 423 7616 - 23937 + 23944 @@ -8260,15 +8240,15 @@ affectedbymacroexpansion - 48740838 + 48755653 id - 7045464 + 7047601 inv - 3803511 + 3804666 @@ -8282,37 +8262,37 @@ 1 2 - 3847105 + 3848269 2 3 - 766383 + 766616 3 4 - 361878 + 361989 4 5 - 772815 + 773050 5 12 - 535215 + 535377 12 50 - 556324 + 556493 50 9900 - 205740 + 205803 @@ -8328,67 +8308,67 @@ 1 4 - 313280 + 313374 4 7 - 316640 + 316736 7 9 - 301118 + 301210 9 12 - 342974 + 343078 12 13 - 456051 + 456190 13 14 - 226122 + 226191 14 15 - 408080 + 408204 15 16 - 166446 + 166496 16 17 - 377716 + 377831 17 18 - 200657 + 200718 18 20 - 344291 + 344395 20 25 - 285422 + 285509 25 207 - 64709 + 64728 @@ -8398,19 +8378,19 @@ macroinvocations - 40391183 + 40403426 id - 40391183 + 40403426 macro_id - 182706 + 182761 location - 5926766 + 5928563 kind @@ -8428,7 +8408,7 @@ 1 2 - 40391183 + 40403426 @@ -8444,7 +8424,7 @@ 1 2 - 40391183 + 40403426 @@ -8460,7 +8440,7 @@ 1 2 - 40391183 + 40403426 @@ -8476,47 +8456,47 @@ 1 2 - 61156 + 61174 2 3 - 27664 + 27673 3 4 - 18080 + 18085 4 5 - 10020 + 10023 5 7 - 13832 + 13836 7 13 - 14703 + 14708 13 33 - 13723 + 13727 33 182 - 13723 + 13727 186 72214 - 9802 + 9805 @@ -8532,42 +8512,42 @@ 1 2 - 77765 + 77789 2 3 - 30659 + 30669 3 4 - 14376 + 14381 4 5 - 10292 + 10295 5 8 - 14050 + 14054 8 18 - 14213 + 14217 18 90 - 13723 + 13727 90 12207 - 7624 + 7626 @@ -8583,12 +8563,12 @@ 1 2 - 178186 + 178240 2 3 - 4520 + 4521 @@ -8604,17 +8584,17 @@ 1 2 - 5262706 + 5264301 2 4 - 429618 + 429748 4 72214 - 234441 + 234512 @@ -8630,12 +8610,12 @@ 1 2 - 5904602 + 5906392 2 37 - 22164 + 22171 @@ -8651,7 +8631,7 @@ 1 2 - 5926766 + 5928563 @@ -8724,15 +8704,15 @@ macroparent - 33686920 + 33697131 id - 33686920 + 33697131 parent_id - 15942726 + 15947558 @@ -8746,7 +8726,7 @@ 1 2 - 33686920 + 33697131 @@ -8762,27 +8742,27 @@ 1 2 - 7816185 + 7818554 2 3 - 1595835 + 1596319 3 4 - 4707507 + 4708934 4 5 - 1297133 + 1297526 5 205 - 526063 + 526223 @@ -8792,15 +8772,15 @@ macrolocationbind - 6023015 + 6005902 id - 4209042 + 4197329 location - 2272308 + 2266082 @@ -8814,27 +8794,27 @@ 1 2 - 3285657 + 3276557 2 3 - 489010 + 487596 3 4 - 8601 + 8638 4 5 - 412624 + 411558 5 17 - 13149 + 12979 @@ -8850,27 +8830,27 @@ 1 2 - 1332170 + 1328930 2 3 - 481395 + 479769 3 4 - 7786 + 7804 4 5 - 426910 + 425585 5 522 - 24046 + 23991 @@ -8880,19 +8860,19 @@ macro_argument_unexpanded - 82169670 + 81891296 invocation - 26181901 + 26088765 argument_index - 694 + 691 text - 341869 + 340741 @@ -8906,22 +8886,22 @@ 1 2 - 9643301 + 9605164 2 3 - 9733558 + 9701025 3 4 - 4982534 + 4966085 4 67 - 1822507 + 1816490 @@ -8937,22 +8917,22 @@ 1 2 - 9825192 + 9786454 2 3 - 9751073 + 9718482 3 4 - 4826468 + 4810534 4 67 - 1779167 + 1773293 @@ -8968,7 +8948,7 @@ 46457 46458 - 610 + 608 46659 @@ -8977,7 +8957,7 @@ 646904 - 2488917 + 2488278 31 @@ -8994,7 +8974,7 @@ 2 3 - 610 + 608 13 @@ -9020,57 +9000,57 @@ 1 2 - 39542 + 39411 2 3 - 62074 + 61870 3 4 - 20933 + 20854 4 5 - 34440 + 34452 5 6 - 39090 + 38961 6 9 - 30748 + 30531 9 15 - 28875 + 28780 15 26 - 25772 + 25687 26 57 - 27024 + 26935 57 517 - 25909 + 25823 518 - 486643 - 7458 + 486640 + 7433 @@ -9086,17 +9066,17 @@ 1 2 - 242188 + 241388 2 3 - 89509 + 89214 3 9 - 10172 + 10138 @@ -9106,19 +9086,19 @@ macro_argument_expanded - 82169670 + 81891296 invocation - 26181901 + 26088765 argument_index - 694 + 691 text - 207053 + 206369 @@ -9132,22 +9112,22 @@ 1 2 - 9643301 + 9605164 2 3 - 9733558 + 9701025 3 4 - 4982534 + 4966085 4 67 - 1822507 + 1816490 @@ -9163,22 +9143,22 @@ 1 2 - 12591079 + 12543042 2 3 - 8396184 + 8368235 3 4 - 4208285 + 4194392 4 9 - 986351 + 983095 @@ -9194,7 +9174,7 @@ 46457 46458 - 610 + 608 46659 @@ -9203,7 +9183,7 @@ 646904 - 2488917 + 2488278 31 @@ -9220,7 +9200,7 @@ 1 2 - 599 + 597 2 @@ -9230,7 +9210,7 @@ 950 16173 - 42 + 41 @@ -9246,57 +9226,57 @@ 1 2 - 21743 + 21671 2 3 - 26750 + 26662 3 4 - 43297 + 43144 4 5 - 15842 + 15915 5 6 - 3250 + 3239 6 7 - 18324 + 18148 7 10 - 18882 + 18819 10 19 - 18251 + 18190 19 51 - 15694 + 15643 51 251 - 15547 + 15496 251 - 1169648 - 9467 + 1169057 + 9436 @@ -9312,17 +9292,17 @@ 1 2 - 104625 + 104280 2 3 - 88552 + 88259 3 66 - 13875 + 13829 @@ -9332,19 +9312,19 @@ functions - 4043207 + 3995453 id - 4043207 + 3995453 name - 1689263 + 1670237 kind - 871 + 861 @@ -9358,7 +9338,7 @@ 1 2 - 4043207 + 3995453 @@ -9374,7 +9354,7 @@ 1 2 - 4043207 + 3995453 @@ -9390,17 +9370,17 @@ 1 2 - 1441362 + 1425128 2 4 - 140377 + 138796 4 3162 - 107523 + 106312 @@ -9416,12 +9396,12 @@ 1 2 - 1686401 + 1667407 2 3 - 2862 + 2830 @@ -9437,37 +9417,37 @@ 8 9 - 124 + 123 47 48 - 124 + 123 83 84 - 124 + 123 691 692 - 124 + 123 4456 4457 - 124 + 123 - 5230 - 5231 - 124 + 5226 + 5227 + 123 - 21974 - 21975 - 124 + 21960 + 21961 + 123 @@ -9483,37 +9463,37 @@ 2 3 - 124 + 123 18 19 - 124 + 123 41 42 - 124 + 123 43 44 - 124 + 123 302 303 - 124 + 123 504 505 - 124 + 123 12687 12688 - 124 + 123 @@ -9523,26 +9503,26 @@ builtin_functions - 30800 + 30699 id - 30800 + 30699 function_entry_point - 1134663 + 1123627 id - 1130940 + 1120308 entry_point - 1134663 + 1123627 @@ -9556,12 +9536,12 @@ 1 2 - 1127758 + 1117525 2 17 - 3181 + 2782 @@ -9577,7 +9557,7 @@ 1 2 - 1134663 + 1123627 @@ -9587,15 +9567,15 @@ function_return_type - 4060505 + 4012556 id - 4043207 + 3995453 return_type - 617762 + 610312 @@ -9609,12 +9589,12 @@ 1 2 - 4025908 + 3978349 2 3 - 17298 + 17103 @@ -9630,27 +9610,27 @@ 1 2 - 309005 + 305402 2 3 - 213180 + 210533 3 5 - 48037 + 47496 5 365 - 46419 + 45773 432 - 9958 - 1120 + 9957 + 1107 @@ -9930,59 +9910,59 @@ purefunctions - 131903 + 131870 id - 131903 + 131870 function_deleted - 87797 + 87523 id - 87797 + 87523 function_defaulted - 51524 + 51363 id - 51524 + 51363 function_prototyped - 4041713 + 3993976 id - 4041713 + 3993976 deduction_guide_for_class - 5849 + 5783 id - 5849 + 5783 class_template - 2240 + 2214 @@ -9996,7 +9976,7 @@ 1 2 - 5849 + 5783 @@ -10012,32 +9992,32 @@ 1 2 - 1120 + 1107 2 3 - 373 + 369 3 4 - 124 + 123 4 5 - 248 + 246 5 6 - 124 + 123 8 9 - 248 + 246 @@ -10047,15 +10027,15 @@ member_function_this_type - 672519 + 664083 id - 672519 + 664083 this_type - 175596 + 173496 @@ -10069,7 +10049,7 @@ 1 2 - 672519 + 664083 @@ -10085,37 +10065,37 @@ 1 2 - 47041 + 46634 2 3 - 36836 + 36421 3 4 - 32605 + 31992 4 5 - 20036 + 19810 5 6 - 12818 + 12673 6 10 - 14436 + 14396 10 65 - 11822 + 11566 @@ -10125,27 +10105,27 @@ fun_decls - 4199390 + 4150246 id - 4193416 + 4144339 function - 4018690 + 3971090 type_id - 609797 + 602560 name - 1687770 + 1668760 location - 2806438 + 2774828 @@ -10159,7 +10139,7 @@ 1 2 - 4193416 + 4144339 @@ -10175,12 +10155,12 @@ 1 2 - 4187442 + 4138433 2 3 - 5973 + 5906 @@ -10196,7 +10176,7 @@ 1 2 - 4193416 + 4144339 @@ -10212,7 +10192,7 @@ 1 2 - 4193416 + 4144339 @@ -10228,12 +10208,12 @@ 1 2 - 3858525 + 3812236 2 5 - 160165 + 158853 @@ -10249,12 +10229,12 @@ 1 2 - 4000396 + 3953002 2 3 - 18293 + 18087 @@ -10270,7 +10250,7 @@ 1 2 - 4018690 + 3971090 @@ -10286,12 +10266,12 @@ 1 2 - 3878437 + 3832416 2 4 - 140253 + 138673 @@ -10307,27 +10287,27 @@ 1 2 - 294445 + 291128 2 3 - 220024 + 217177 3 5 - 48286 + 47865 5 - 364 - 45797 + 365 + 45281 - 364 - 10294 - 1244 + 463 + 10297 + 1107 @@ -10343,27 +10323,27 @@ 1 2 - 304401 + 300972 2 3 - 211313 + 208564 3 5 - 48037 + 47619 5 - 1163 - 45797 + 1479 + 45281 - 1485 - 9907 - 248 + 9905 + 9906 + 123 @@ -10379,22 +10359,22 @@ 1 2 - 490327 + 484558 2 3 - 52766 + 52048 3 7 - 50028 + 49464 7 2238 - 16676 + 16488 @@ -10410,22 +10390,22 @@ 1 2 - 453863 + 448505 2 3 - 69317 + 68414 3 6 - 55877 + 55248 6 4756 - 30738 + 30392 @@ -10441,22 +10421,22 @@ 1 2 - 1328363 + 1313155 2 3 - 193392 + 191460 3 11 - 129550 + 128091 11 3169 - 36463 + 36052 @@ -10472,17 +10452,17 @@ 1 2 - 1440864 + 1424636 2 4 - 140875 + 139289 4 3162 - 106030 + 104835 @@ -10498,12 +10478,12 @@ 1 2 - 1598167 + 1580167 2 1596 - 89602 + 88593 @@ -10519,17 +10499,17 @@ 1 2 - 1363955 + 1348593 2 3 - 207828 + 205488 3 1592 - 115985 + 114679 @@ -10545,17 +10525,17 @@ 1 2 - 2413305 + 2387600 2 3 - 252008 + 247816 3 211 - 141124 + 139412 @@ -10571,17 +10551,17 @@ 1 2 - 2431972 + 2406057 2 3 - 233838 + 229851 3 211 - 140626 + 138919 @@ -10597,12 +10577,12 @@ 1 2 - 2692318 + 2662241 2 211 - 114119 + 112587 @@ -10618,12 +10598,12 @@ 1 2 - 2767361 + 2736192 2 8 - 39076 + 38636 @@ -10633,22 +10613,22 @@ fun_def - 1418837 + 1400518 id - 1418837 + 1400518 fun_specialized - 7911 + 7909 id - 7911 + 7909 @@ -10666,15 +10646,15 @@ fun_decl_specifiers - 4269578 + 4221244 id - 1744270 + 1724378 name - 1368 + 1353 @@ -10688,22 +10668,22 @@ 1 2 - 362269 + 357943 2 3 - 261590 + 258644 3 4 - 1097511 + 1085149 4 5 - 22898 + 22640 @@ -10719,57 +10699,57 @@ 15 16 - 124 + 123 19 20 - 124 + 123 - 224 - 225 - 124 + 222 + 223 + 123 261 262 - 124 + 123 561 562 - 124 + 123 826 827 - 124 + 123 1034 1035 - 124 + 123 1093 1094 - 124 + 123 8148 8149 - 124 + 123 11028 11029 - 124 + 123 11099 11100 - 124 + 123 @@ -10900,26 +10880,26 @@ fun_decl_empty_throws - 421590 + 421484 fun_decl - 421590 + 421484 fun_decl_noexcept - 140906 + 139581 fun_decl - 140906 + 139581 constant - 140466 + 139145 @@ -10933,7 +10913,7 @@ 1 2 - 140906 + 139581 @@ -10949,12 +10929,12 @@ 1 2 - 140026 + 138709 2 3 - 440 + 435 @@ -10964,11 +10944,11 @@ fun_decl_empty_noexcept - 1160855 + 1147042 fun_decl - 1160855 + 1147042 @@ -11073,11 +11053,11 @@ fun_requires - 29022 + 28932 id - 10081 + 10050 kind @@ -11085,7 +11065,7 @@ constraint - 28786 + 28696 @@ -11099,7 +11079,7 @@ 1 2 - 10017 + 9986 2 @@ -11120,27 +11100,27 @@ 1 2 - 7250 + 7227 2 3 - 493 + 491 3 6 - 858 + 855 6 13 - 321 + 320 13 14 - 1136 + 1133 19 @@ -11203,7 +11183,7 @@ 1 2 - 28550 + 28461 2 @@ -11224,7 +11204,7 @@ 1 2 - 28786 + 28696 @@ -11234,19 +11214,19 @@ param_decl_bind - 7294672 + 7208821 id - 7294672 + 7208821 index - 7964 + 7874 fun_decl - 3524008 + 3482840 @@ -11260,7 +11240,7 @@ 1 2 - 7294672 + 7208821 @@ -11276,7 +11256,7 @@ 1 2 - 7294672 + 7208821 @@ -11292,32 +11272,32 @@ 2 3 - 3982 + 3937 6 7 - 1991 + 1968 16 20 - 622 + 615 25 147 - 622 + 615 343 - 16218 - 622 + 16206 + 615 - 28317 - 28318 - 124 + 28305 + 28306 + 123 @@ -11333,32 +11313,32 @@ 2 3 - 3982 + 3937 6 7 - 1991 + 1968 16 20 - 622 + 615 25 147 - 622 + 615 343 - 16218 - 622 + 16206 + 615 - 28317 - 28318 - 124 + 28305 + 28306 + 123 @@ -11374,27 +11354,27 @@ 1 2 - 1505826 + 1488866 2 3 - 973933 + 961980 3 4 - 600712 + 593700 4 5 - 290089 + 286576 5 65 - 153444 + 151716 @@ -11410,27 +11390,27 @@ 1 2 - 1505826 + 1488866 2 3 - 973933 + 961980 3 4 - 600712 + 593700 4 5 - 290089 + 286576 5 65 - 153444 + 151716 @@ -11440,27 +11420,27 @@ var_decls - 9374456 + 9438060 id - 9367984 + 9431661 variable - 9027369 + 9094636 type_id - 1452936 + 1436079 name - 850481 + 840901 location - 6259510 + 6190362 @@ -11474,7 +11454,7 @@ 1 2 - 9367984 + 9431661 @@ -11490,12 +11470,12 @@ 1 2 - 9361513 + 9425263 2 3 - 6471 + 6398 @@ -11511,7 +11491,7 @@ 1 2 - 9367984 + 9431661 @@ -11527,7 +11507,7 @@ 1 2 - 9367984 + 9431661 @@ -11543,12 +11523,12 @@ 1 2 - 8704176 + 8774837 2 5 - 323192 + 319798 @@ -11564,12 +11544,12 @@ 1 2 - 8974354 + 9042218 2 3 - 53015 + 52417 @@ -11585,12 +11565,12 @@ 1 2 - 8922210 + 8990662 2 4 - 105158 + 103974 @@ -11606,12 +11586,12 @@ 1 2 - 8783076 + 8853095 2 4 - 244292 + 241540 @@ -11627,27 +11607,27 @@ 1 2 - 847867 + 839056 2 3 - 283244 + 279685 3 5 - 127186 + 125138 5 11 - 112874 + 111357 11 - 2949 - 81762 + 2963 + 80841 @@ -11663,27 +11643,27 @@ 1 2 - 868526 + 859482 2 3 - 268435 + 265042 3 5 - 122581 + 120585 5 11 - 112501 + 110988 11 - 2872 - 80891 + 2886 + 79980 @@ -11699,22 +11679,22 @@ 1 2 - 1116800 + 1104222 2 3 - 192148 + 189861 3 7 - 114990 + 113326 7 1038 - 28996 + 28669 @@ -11730,27 +11710,27 @@ 1 2 - 983018 + 971823 2 3 - 218531 + 216070 3 6 - 133284 + 131660 6 - 95 - 109016 + 98 + 107789 - 97 + 99 2622 - 9084 + 8736 @@ -11766,32 +11746,32 @@ 1 2 - 464690 + 458595 2 3 - 164894 + 162052 3 4 - 59361 + 59431 4 7 - 66206 + 64968 7 - 25 - 64090 + 24 + 63492 - 25 - 27137 - 31236 + 24 + 27139 + 32361 @@ -11807,32 +11787,32 @@ 1 2 - 475766 + 469546 2 3 - 164894 + 162052 3 4 - 55130 + 55248 4 8 - 72180 + 71367 8 44 - 63842 + 63861 44 26704 - 18667 + 18826 @@ -11848,22 +11828,22 @@ 1 2 - 653105 + 644273 2 3 - 110510 + 111111 3 11 - 65335 + 64230 11 3463 - 21529 + 21287 @@ -11879,27 +11859,27 @@ 1 2 - 492442 + 485911 2 3 - 182939 + 181371 3 4 - 51521 + 51433 4 8 - 64837 + 64107 8 22619 - 58739 + 58078 @@ -11915,17 +11895,17 @@ 1 2 - 5758605 + 5693745 2 20 - 470788 + 467947 20 - 2941 - 30116 + 2943 + 28669 @@ -11941,12 +11921,12 @@ 1 2 - 5839247 + 5773479 2 2935 - 420262 + 416882 @@ -11962,12 +11942,12 @@ 1 2 - 5961705 + 5895911 2 2555 - 297805 + 294451 @@ -11983,12 +11963,12 @@ 1 2 - 6247189 + 6178180 2 5 - 12320 + 12181 @@ -11998,37 +11978,37 @@ var_def - 3763198 + 3716014 id - 3763198 + 3716014 var_specialized - 643 + 641 id - 643 + 641 var_decl_specifiers - 488709 + 482712 id - 488709 + 482712 name - 497 + 492 @@ -12042,7 +12022,7 @@ 1 2 - 488709 + 482712 @@ -12058,22 +12038,22 @@ 16 17 - 124 + 123 77 78 - 124 + 123 653 654 - 124 + 123 - 3181 - 3182 - 124 + 3177 + 3178 + 123 @@ -12083,18 +12063,18 @@ is_structured_binding - 943 + 940 id - 943 + 940 var_requires - 386 + 384 id @@ -12102,7 +12082,7 @@ constraint - 386 + 384 @@ -12142,7 +12122,7 @@ 1 2 - 386 + 384 @@ -12152,19 +12132,19 @@ type_decls - 1629528 + 1610928 id - 1629528 + 1610928 type_id - 1610612 + 1592225 location - 1543659 + 1526272 @@ -12178,7 +12158,7 @@ 1 2 - 1629528 + 1610928 @@ -12194,7 +12174,7 @@ 1 2 - 1629528 + 1610928 @@ -12210,12 +12190,12 @@ 1 2 - 1594309 + 1576106 2 10 - 16302 + 16119 @@ -12231,12 +12211,12 @@ 1 2 - 1594434 + 1576229 2 10 - 16178 + 15996 @@ -12252,12 +12232,12 @@ 1 2 - 1521631 + 1504493 2 64 - 22027 + 21779 @@ -12273,12 +12253,12 @@ 1 2 - 1521756 + 1504616 2 64 - 21902 + 21656 @@ -12288,37 +12268,37 @@ type_def - 1092906 + 1080351 id - 1092906 + 1080351 type_decl_top - 676476 + 676681 type_decl - 676476 + 676681 type_requires - 7657 + 7634 id - 2037 + 2031 constraint - 7636 + 7612 @@ -12332,17 +12312,17 @@ 1 2 - 1008 + 1005 2 5 - 107 + 106 5 6 - 600 + 598 6 @@ -12352,7 +12332,7 @@ 13 14 - 150 + 149 @@ -12368,7 +12348,7 @@ 1 2 - 7614 + 7591 2 @@ -12383,23 +12363,23 @@ namespace_decls - 408755 + 408652 id - 408755 + 408652 namespace_id - 1838 + 1837 location - 408755 + 408652 bodylocation - 408755 + 408652 @@ -12413,7 +12393,7 @@ 1 2 - 408755 + 408652 @@ -12429,7 +12409,7 @@ 1 2 - 408755 + 408652 @@ -12445,7 +12425,7 @@ 1 2 - 408755 + 408652 @@ -12659,7 +12639,7 @@ 1 2 - 408755 + 408652 @@ -12675,7 +12655,7 @@ 1 2 - 408755 + 408652 @@ -12691,7 +12671,7 @@ 1 2 - 408755 + 408652 @@ -12707,7 +12687,7 @@ 1 2 - 408755 + 408652 @@ -12723,7 +12703,7 @@ 1 2 - 408755 + 408652 @@ -12739,7 +12719,7 @@ 1 2 - 408755 + 408652 @@ -12749,23 +12729,23 @@ usings - 270979 + 270032 id - 270979 + 270032 element_id - 58813 + 58567 location - 26740 + 26652 kind - 21 + 20 @@ -12779,7 +12759,7 @@ 1 2 - 270979 + 270032 @@ -12795,7 +12775,7 @@ 1 2 - 270979 + 270032 @@ -12811,7 +12791,7 @@ 1 2 - 270979 + 270032 @@ -12827,17 +12807,17 @@ 1 2 - 51113 + 50892 2 5 - 5364 + 5347 5 134 - 2335 + 2327 @@ -12853,17 +12833,17 @@ 1 2 - 51113 + 50892 2 5 - 5364 + 5347 5 134 - 2335 + 2327 @@ -12879,7 +12859,7 @@ 1 2 - 58813 + 58567 @@ -12895,22 +12875,22 @@ 1 2 - 21091 + 21021 2 4 - 2293 + 2285 4 132 - 1935 + 1929 145 - 367 - 1420 + 366 + 1415 @@ -12926,22 +12906,22 @@ 1 2 - 21091 + 21021 2 4 - 2293 + 2285 4 132 - 1935 + 1929 145 - 367 - 1420 + 366 + 1415 @@ -12957,7 +12937,7 @@ 1 2 - 26740 + 26652 @@ -12976,8 +12956,8 @@ 10 - 25367 - 25368 + 25362 + 25363 10 @@ -12997,8 +12977,8 @@ 10 - 5377 - 5378 + 5372 + 5373 10 @@ -13030,15 +13010,15 @@ using_container - 577799 + 575839 parent - 21806 + 21734 child - 270979 + 270032 @@ -13052,42 +13032,42 @@ 1 2 - 10330 + 10295 2 3 - 1609 + 1604 3 6 - 1851 + 1845 6 7 - 2282 + 2275 7 28 - 1662 + 1656 28 136 - 778 + 775 145 146 - 2608 + 2600 146 437 - 683 + 681 @@ -13103,27 +13083,27 @@ 1 2 - 96210 + 95840 2 3 - 119794 + 119399 3 4 - 20018 + 19952 4 5 - 26603 + 26515 5 65 - 8352 + 8324 @@ -13133,27 +13113,27 @@ static_asserts - 172739 + 172696 id - 172739 + 172696 condition - 172739 + 172696 message - 38650 + 38640 location - 22584 + 22578 enclosing - 6810 + 6808 @@ -13167,7 +13147,7 @@ 1 2 - 172739 + 172696 @@ -13183,7 +13163,7 @@ 1 2 - 172739 + 172696 @@ -13199,7 +13179,7 @@ 1 2 - 172739 + 172696 @@ -13215,7 +13195,7 @@ 1 2 - 172739 + 172696 @@ -13231,7 +13211,7 @@ 1 2 - 172739 + 172696 @@ -13247,7 +13227,7 @@ 1 2 - 172739 + 172696 @@ -13263,7 +13243,7 @@ 1 2 - 172739 + 172696 @@ -13279,7 +13259,7 @@ 1 2 - 172739 + 172696 @@ -13295,7 +13275,7 @@ 1 2 - 28414 + 28407 2 @@ -13305,17 +13285,17 @@ 3 4 - 3619 + 3618 4 12 - 2081 + 2080 12 17 - 3125 + 3124 17 @@ -13336,7 +13316,7 @@ 1 2 - 28414 + 28407 2 @@ -13346,17 +13326,17 @@ 3 4 - 3619 + 3618 4 12 - 2081 + 2080 12 17 - 3125 + 3124 17 @@ -13377,12 +13357,12 @@ 1 2 - 35816 + 35807 2 33 - 2834 + 2833 @@ -13398,7 +13378,7 @@ 1 2 - 30220 + 30212 2 @@ -13408,7 +13388,7 @@ 3 4 - 3384 + 3383 4 @@ -13434,17 +13414,17 @@ 1 2 - 4267 + 4266 2 3 - 3716 + 3715 3 4 - 1741 + 1740 4 @@ -13454,7 +13434,7 @@ 5 6 - 4720 + 4719 6 @@ -13474,12 +13454,12 @@ 17 18 - 4380 + 4379 19 52 - 502 + 501 @@ -13495,17 +13475,17 @@ 1 2 - 4267 + 4266 2 3 - 3716 + 3715 3 4 - 1741 + 1740 4 @@ -13515,7 +13495,7 @@ 5 6 - 4720 + 4719 6 @@ -13535,12 +13515,12 @@ 17 18 - 4380 + 4379 19 52 - 502 + 501 @@ -13556,17 +13536,17 @@ 1 2 - 6939 + 6937 2 3 - 7652 + 7650 3 4 - 7757 + 7755 4 @@ -13587,12 +13567,12 @@ 1 2 - 5052 + 5051 2 3 - 8073 + 8071 3 @@ -13602,7 +13582,7 @@ 4 5 - 4745 + 4744 5 @@ -13633,7 +13613,7 @@ 1 2 - 5708 + 5707 2 @@ -13664,7 +13644,7 @@ 1 2 - 5708 + 5707 2 @@ -13695,7 +13675,7 @@ 1 2 - 5862 + 5861 2 @@ -13721,7 +13701,7 @@ 1 2 - 5846 + 5845 2 @@ -13741,23 +13721,23 @@ params - 7052247 + 6969125 id - 7011801 + 6929135 function - 3400306 + 3360408 index - 7964 + 7874 type_id - 1217355 + 1203274 @@ -13771,7 +13751,7 @@ 1 2 - 7011801 + 6929135 @@ -13787,7 +13767,7 @@ 1 2 - 7011801 + 6929135 @@ -13803,12 +13783,12 @@ 1 2 - 6971355 + 6889145 2 3 - 40445 + 39990 @@ -13824,27 +13804,27 @@ 1 2 - 1470856 + 1454044 2 3 - 924776 + 913499 3 4 - 578187 + 571429 4 5 - 280506 + 277101 5 65 - 145978 + 144333 @@ -13860,27 +13840,27 @@ 1 2 - 1470856 + 1454044 2 3 - 924776 + 913499 3 4 - 578187 + 571429 4 5 - 280506 + 277101 5 65 - 145978 + 144333 @@ -13896,22 +13876,22 @@ 1 2 - 1778617 + 1757600 2 3 - 1029313 + 1017228 3 4 - 437436 + 432386 4 11 - 154938 + 153193 @@ -13927,32 +13907,32 @@ 2 3 - 3982 + 3937 6 7 - 1991 + 1968 14 18 - 622 + 615 23 138 - 622 + 615 322 - 15505 - 622 + 15494 + 615 - 27323 - 27324 - 124 + 27310 + 27311 + 123 @@ -13968,32 +13948,32 @@ 2 3 - 3982 + 3937 6 7 - 1991 + 1968 14 18 - 622 + 615 23 138 - 622 + 615 322 - 15505 - 622 + 15494 + 615 - 27323 - 27324 - 124 + 27310 + 27311 + 123 @@ -14009,32 +13989,32 @@ 1 2 - 3982 + 3937 2 3 - 1991 + 1968 4 7 - 622 + 615 9 55 - 622 + 615 116 - 2703 - 622 + 2700 + 615 - 7497 - 7498 - 124 + 7494 + 7495 + 123 @@ -14050,27 +14030,27 @@ 1 2 - 735615 + 728068 2 3 - 239687 + 236495 3 5 - 93087 + 91669 5 13 - 93709 + 92408 13 2574 - 55255 + 54632 @@ -14086,27 +14066,27 @@ 1 2 - 817502 + 809278 2 3 - 179081 + 175833 3 6 - 106154 + 104958 6 27 - 91967 + 90808 27 2562 - 22649 + 22394 @@ -14122,17 +14102,17 @@ 1 2 - 992725 + 981544 2 3 - 166387 + 164267 3 65 - 58241 + 57462 @@ -14142,15 +14122,15 @@ overrides - 159143 + 159103 new - 150374 + 150336 old - 17798 + 17794 @@ -14164,12 +14144,12 @@ 1 2 - 141612 + 141576 2 4 - 8761 + 8759 @@ -14185,12 +14165,12 @@ 1 2 - 9684 + 9682 2 3 - 2405 + 2404 3 @@ -14205,12 +14185,12 @@ 6 17 - 1336 + 1335 17 230 - 1247 + 1246 @@ -14220,19 +14200,19 @@ membervariables - 1505217 + 1505673 id - 1502766 + 1503222 type_id - 457991 + 458130 name - 644237 + 644432 @@ -14246,12 +14226,12 @@ 1 2 - 1500425 + 1500880 2 4 - 2341 + 2342 @@ -14267,7 +14247,7 @@ 1 2 - 1502766 + 1503222 @@ -14283,22 +14263,22 @@ 1 2 - 339817 + 339920 2 3 - 72592 + 72614 3 10 - 35397 + 35408 10 4445 - 10183 + 10186 @@ -14314,17 +14294,17 @@ 1 2 - 357407 + 357515 2 3 - 64750 + 64770 3 57 - 34362 + 34373 60 @@ -14345,22 +14325,22 @@ 1 2 - 423356 + 423484 2 3 - 122584 + 122621 3 5 - 58106 + 58124 5 664 - 40189 + 40202 @@ -14376,17 +14356,17 @@ 1 2 - 526390 + 526550 2 3 - 73300 + 73322 3 668 - 44546 + 44560 @@ -14396,19 +14376,19 @@ globalvariables - 492567 + 662484 id - 492567 + 662484 type_id - 10329 + 10212 name - 112252 + 110988 @@ -14422,7 +14402,7 @@ 1 2 - 492567 + 662484 @@ -14438,7 +14418,7 @@ 1 2 - 492567 + 662484 @@ -14454,32 +14434,32 @@ 1 2 - 6969 + 6890 2 3 - 373 + 369 3 5 - 746 + 738 5 20 - 871 + 861 20 80 - 871 + 861 152 - 2216 - 497 + 2369 + 492 @@ -14495,32 +14475,32 @@ 1 2 - 7093 + 7013 2 3 - 373 + 369 3 5 - 746 + 738 5 20 - 746 + 738 20 74 - 871 + 861 - 125 + 137 228 - 497 + 492 @@ -14536,17 +14516,22 @@ 1 2 - 94954 + 92900 2 - 7 - 8835 + 8 + 9351 - 7 - 604 - 8462 + 8 + 139 + 8367 + + + 181 + 1156 + 369 @@ -14562,17 +14547,17 @@ 1 2 - 96696 + 94130 2 3 - 15307 + 16611 3 4 - 248 + 246 @@ -14582,19 +14567,19 @@ localvariables - 724688 + 724508 id - 724688 + 724508 type_id - 53301 + 53305 name - 101408 + 101431 @@ -14608,7 +14593,7 @@ 1 2 - 724688 + 724508 @@ -14624,7 +14609,7 @@ 1 2 - 724688 + 724508 @@ -14640,37 +14625,37 @@ 1 2 - 28793 + 28819 2 3 - 7806 + 7799 3 4 - 4020 + 4033 4 6 - 4060 + 4057 6 12 - 4128 + 4105 12 - 162 - 4000 + 163 + 4001 - 162 + 164 19347 - 491 + 487 @@ -14686,22 +14671,22 @@ 1 2 - 38252 + 38253 2 3 - 6704 + 6705 3 5 - 4468 + 4469 5 3509 - 3877 + 3878 @@ -14717,32 +14702,32 @@ 1 2 - 62401 + 62415 2 3 - 16003 + 16007 3 4 - 6516 + 6525 4 8 - 8129 + 8139 8 - 134 - 7606 + 137 + 7616 - 134 - 7549 - 750 + 137 + 7546 + 726 @@ -14758,17 +14743,17 @@ 1 2 - 84398 + 84417 2 3 - 8393 + 8395 3 15 - 7666 + 7668 15 @@ -14783,15 +14768,15 @@ autoderivation - 228611 + 224437 var - 228611 + 224437 derivation_type - 622 + 615 @@ -14805,7 +14790,7 @@ 1 2 - 228611 + 224437 @@ -14821,27 +14806,27 @@ 38 39 - 124 + 123 79 80 - 124 + 123 - 454 - 455 - 124 + 450 + 451 + 123 - 530 - 531 - 124 + 527 + 528 + 123 - 736 - 737 - 124 + 730 + 731 + 123 @@ -14851,15 +14836,15 @@ orphaned_variables - 44035 + 43621 var - 44035 + 43621 function - 40786 + 40402 @@ -14873,7 +14858,7 @@ 1 2 - 44035 + 43621 @@ -14889,12 +14874,12 @@ 1 2 - 39939 + 39564 2 47 - 846 + 838 @@ -14904,19 +14889,19 @@ enumconstants - 348040 + 348146 id - 348040 + 348146 parent - 41605 + 41618 index - 13941 + 13945 type_id @@ -14924,11 +14909,11 @@ name - 347659 + 347764 location - 320648 + 320745 @@ -14942,7 +14927,7 @@ 1 2 - 348040 + 348146 @@ -14958,7 +14943,7 @@ 1 2 - 348040 + 348146 @@ -14974,7 +14959,7 @@ 1 2 - 348040 + 348146 @@ -14990,7 +14975,7 @@ 1 2 - 348040 + 348146 @@ -15006,7 +14991,7 @@ 1 2 - 348040 + 348146 @@ -15022,57 +15007,57 @@ 1 2 - 1524 + 1525 2 3 - 5826 + 5828 3 4 - 8713 + 8715 4 5 - 5554 + 5556 5 6 - 4574 + 4575 6 7 - 2559 + 2560 7 8 - 1960 + 1961 8 10 - 2995 + 2996 10 15 - 3430 + 3431 15 33 - 3158 + 3159 33 257 - 1306 + 1307 @@ -15088,57 +15073,57 @@ 1 2 - 1524 + 1525 2 3 - 5826 + 5828 3 4 - 8713 + 8715 4 5 - 5554 + 5556 5 6 - 4574 + 4575 6 7 - 2559 + 2560 7 8 - 1960 + 1961 8 10 - 2995 + 2996 10 15 - 3430 + 3431 15 33 - 3158 + 3159 33 257 - 1306 + 1307 @@ -15154,7 +15139,7 @@ 1 2 - 41605 + 41618 @@ -15170,57 +15155,57 @@ 1 2 - 1524 + 1525 2 3 - 5826 + 5828 3 4 - 8713 + 8715 4 5 - 5554 + 5556 5 6 - 4574 + 4575 6 7 - 2559 + 2560 7 8 - 1960 + 1961 8 10 - 2995 + 2996 10 15 - 3430 + 3431 15 33 - 3158 + 3159 33 257 - 1306 + 1307 @@ -15236,27 +15221,27 @@ 1 2 - 2123 + 2124 2 3 - 6044 + 6046 3 4 - 8767 + 8770 4 5 - 5500 + 5501 5 6 - 4574 + 4575 6 @@ -15266,12 +15251,12 @@ 7 8 - 1851 + 1852 8 11 - 3812 + 3813 11 @@ -15281,7 +15266,7 @@ 17 165 - 3158 + 3159 256 @@ -15302,12 +15287,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15358,12 +15343,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15414,7 +15399,7 @@ 1 2 - 13941 + 13945 @@ -15430,12 +15415,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15486,12 +15471,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15622,7 +15607,7 @@ 1 2 - 347278 + 347383 2 @@ -15643,7 +15628,7 @@ 1 2 - 347278 + 347383 2 @@ -15664,7 +15649,7 @@ 1 2 - 347659 + 347764 @@ -15680,7 +15665,7 @@ 1 2 - 347659 + 347764 @@ -15696,7 +15681,7 @@ 1 2 - 347278 + 347383 2 @@ -15717,12 +15702,12 @@ 1 2 - 319613 + 319710 2 205 - 1034 + 1035 @@ -15738,7 +15723,7 @@ 1 2 - 320648 + 320745 @@ -15754,12 +15739,12 @@ 1 2 - 319613 + 319710 2 205 - 1034 + 1035 @@ -15775,7 +15760,7 @@ 1 2 - 320648 + 320745 @@ -15791,12 +15776,12 @@ 1 2 - 319613 + 319710 2 205 - 1034 + 1035 @@ -15806,31 +15791,31 @@ builtintypes - 7218 + 7136 id - 7218 + 7136 name - 7218 + 7136 kind - 7218 + 7136 size - 871 + 861 sign - 373 + 369 alignment - 622 + 615 @@ -15844,7 +15829,7 @@ 1 2 - 7218 + 7136 @@ -15860,7 +15845,7 @@ 1 2 - 7218 + 7136 @@ -15876,7 +15861,7 @@ 1 2 - 7218 + 7136 @@ -15892,7 +15877,7 @@ 1 2 - 7218 + 7136 @@ -15908,7 +15893,7 @@ 1 2 - 7218 + 7136 @@ -15924,7 +15909,7 @@ 1 2 - 7218 + 7136 @@ -15940,7 +15925,7 @@ 1 2 - 7218 + 7136 @@ -15956,7 +15941,7 @@ 1 2 - 7218 + 7136 @@ -15972,7 +15957,7 @@ 1 2 - 7218 + 7136 @@ -15988,7 +15973,7 @@ 1 2 - 7218 + 7136 @@ -16004,7 +15989,7 @@ 1 2 - 7218 + 7136 @@ -16020,7 +16005,7 @@ 1 2 - 7218 + 7136 @@ -16036,7 +16021,7 @@ 1 2 - 7218 + 7136 @@ -16052,7 +16037,7 @@ 1 2 - 7218 + 7136 @@ -16068,7 +16053,7 @@ 1 2 - 7218 + 7136 @@ -16084,32 +16069,32 @@ 2 3 - 248 + 246 8 9 - 124 + 123 9 10 - 124 + 123 10 11 - 124 + 123 13 14 - 124 + 123 14 15 - 124 + 123 @@ -16125,32 +16110,32 @@ 2 3 - 248 + 246 8 9 - 124 + 123 9 10 - 124 + 123 10 11 - 124 + 123 13 14 - 124 + 123 14 15 - 124 + 123 @@ -16166,32 +16151,32 @@ 2 3 - 248 + 246 8 9 - 124 + 123 9 10 - 124 + 123 10 11 - 124 + 123 13 14 - 124 + 123 14 15 - 124 + 123 @@ -16207,12 +16192,12 @@ 1 2 - 248 + 246 3 4 - 622 + 615 @@ -16228,12 +16213,12 @@ 1 2 - 497 + 492 2 3 - 373 + 369 @@ -16249,17 +16234,17 @@ 6 7 - 124 + 123 12 13 - 124 + 123 40 41 - 124 + 123 @@ -16275,17 +16260,17 @@ 6 7 - 124 + 123 12 13 - 124 + 123 40 41 - 124 + 123 @@ -16301,17 +16286,17 @@ 6 7 - 124 + 123 12 13 - 124 + 123 40 41 - 124 + 123 @@ -16327,12 +16312,12 @@ 5 6 - 248 + 246 7 8 - 124 + 123 @@ -16348,7 +16333,7 @@ 5 6 - 373 + 369 @@ -16364,27 +16349,27 @@ 7 8 - 124 + 123 10 11 - 124 + 123 12 13 - 124 + 123 13 14 - 124 + 123 16 17 - 124 + 123 @@ -16400,27 +16385,27 @@ 7 8 - 124 + 123 10 11 - 124 + 123 12 13 - 124 + 123 13 14 - 124 + 123 16 17 - 124 + 123 @@ -16436,27 +16421,27 @@ 7 8 - 124 + 123 10 11 - 124 + 123 12 13 - 124 + 123 13 14 - 124 + 123 16 17 - 124 + 123 @@ -16472,7 +16457,7 @@ 2 3 - 622 + 615 @@ -16488,7 +16473,7 @@ 3 4 - 622 + 615 @@ -16498,23 +16483,23 @@ derivedtypes - 3023725 + 2998651 id - 3023725 + 2998651 name - 1457167 + 1444200 kind - 746 + 738 type_id - 1942143 + 1926174 @@ -16528,7 +16513,7 @@ 1 2 - 3023725 + 2998651 @@ -16544,7 +16529,7 @@ 1 2 - 3023725 + 2998651 @@ -16560,7 +16545,7 @@ 1 2 - 3023725 + 2998651 @@ -16576,17 +16561,17 @@ 1 2 - 1340932 + 1326444 2 - 28 - 109639 + 22 + 108527 - 29 - 4302 - 6595 + 22 + 4289 + 9228 @@ -16602,7 +16587,7 @@ 1 2 - 1457167 + 1444200 @@ -16618,17 +16603,17 @@ 1 2 - 1341056 + 1326567 2 - 28 - 109514 + 22 + 108404 - 29 - 4302 - 6595 + 22 + 4289 + 9228 @@ -16642,34 +16627,34 @@ 12 - 724 - 725 - 124 + 730 + 731 + 123 - 2333 - 2334 - 124 + 2337 + 2338 + 123 - 3628 - 3629 - 124 + 3659 + 3660 + 123 - 4301 - 4302 - 124 + 4288 + 4289 + 123 - 5557 - 5558 - 124 + 5571 + 5572 + 123 - 7754 - 7755 - 124 + 7785 + 7786 + 123 @@ -16685,32 +16670,32 @@ 1 2 - 124 + 123 - 671 - 672 - 124 + 674 + 675 + 123 - 1613 - 1614 - 124 + 1614 + 1615 + 123 - 2429 - 2430 - 124 + 2432 + 2433 + 123 - 2655 - 2656 - 124 + 2672 + 2673 + 123 - 4340 - 4341 - 124 + 4344 + 4345 + 123 @@ -16724,34 +16709,34 @@ 12 - 207 - 208 - 124 + 213 + 214 + 123 - 2333 - 2334 - 124 + 2337 + 2338 + 123 - 3624 - 3625 - 124 + 3655 + 3656 + 123 - 4301 - 4302 - 124 + 4288 + 4289 + 123 - 5492 - 5493 - 124 + 5506 + 5507 + 123 - 7754 - 7755 - 124 + 7785 + 7786 + 123 @@ -16767,22 +16752,22 @@ 1 2 - 1314424 + 1303434 2 3 - 374963 + 372462 3 4 - 122955 + 121324 4 137 - 129799 + 128953 @@ -16798,22 +16783,22 @@ 1 2 - 1315918 + 1304911 2 3 - 374963 + 372462 3 4 - 121461 + 119847 4 137 - 129799 + 128953 @@ -16829,22 +16814,22 @@ 1 2 - 1316291 + 1305280 2 3 - 375585 + 373077 3 4 - 123204 + 121570 4 6 - 127061 + 126246 @@ -16854,19 +16839,19 @@ pointerishsize - 2242064 + 2223333 id - 2242064 + 2223333 size - 248 + 246 alignment - 248 + 246 @@ -16880,7 +16865,7 @@ 1 2 - 2242064 + 2223333 @@ -16896,7 +16881,7 @@ 1 2 - 2242064 + 2223333 @@ -16912,12 +16897,12 @@ 3 4 - 124 + 123 - 18013 - 18014 - 124 + 18066 + 18067 + 123 @@ -16933,7 +16918,7 @@ 1 2 - 248 + 246 @@ -16949,12 +16934,12 @@ 3 4 - 124 + 123 - 18013 - 18014 - 124 + 18066 + 18067 + 123 @@ -16970,7 +16955,7 @@ 1 2 - 248 + 246 @@ -16980,23 +16965,23 @@ arraysizes - 80393 + 79488 id - 80393 + 79488 num_elements - 17796 + 17595 bytesize - 20160 + 19933 alignment - 622 + 615 @@ -17010,7 +16995,7 @@ 1 2 - 80393 + 79488 @@ -17026,7 +17011,7 @@ 1 2 - 80393 + 79488 @@ -17042,7 +17027,7 @@ 1 2 - 80393 + 79488 @@ -17058,37 +17043,37 @@ 1 2 - 248 + 246 2 3 - 10827 + 10705 3 4 - 248 + 246 4 5 - 3484 + 3445 5 9 - 1493 + 1476 9 42 - 1368 + 1353 56 57 - 124 + 123 @@ -17104,22 +17089,22 @@ 1 2 - 11698 + 11566 2 3 - 3982 + 3937 3 5 - 995 + 984 5 11 - 1120 + 1107 @@ -17135,22 +17120,22 @@ 1 2 - 11698 + 11566 2 3 - 3982 + 3937 3 4 - 746 + 738 4 6 - 1368 + 1353 @@ -17166,37 +17151,37 @@ 1 2 - 622 + 615 2 3 - 12693 + 12550 3 4 - 497 + 492 4 5 - 2737 + 2707 5 7 - 1493 + 1476 7 17 - 1617 + 1599 24 45 - 497 + 492 @@ -17212,22 +17197,22 @@ 1 2 - 14560 + 14396 2 3 - 3609 + 3568 3 6 - 1866 + 1845 6 7 - 124 + 123 @@ -17243,22 +17228,22 @@ 1 2 - 14809 + 14642 2 3 - 3360 + 3322 3 5 - 1617 + 1599 5 6 - 373 + 369 @@ -17274,27 +17259,27 @@ 10 11 - 124 + 123 86 87 - 124 + 123 91 92 - 124 + 123 121 122 - 124 + 123 338 339 - 124 + 123 @@ -17310,22 +17295,22 @@ 4 5 - 124 + 123 16 17 - 248 + 246 48 49 - 124 + 123 139 140 - 124 + 123 @@ -17341,27 +17326,27 @@ 4 5 - 124 + 123 19 20 - 124 + 123 20 21 - 124 + 123 48 49 - 124 + 123 140 141 - 124 + 123 @@ -17419,15 +17404,15 @@ typedefbase - 1755750 + 1757492 id - 1755750 + 1757492 type_id - 834219 + 835030 @@ -17441,7 +17426,7 @@ 1 2 - 1755750 + 1757492 @@ -17457,22 +17442,22 @@ 1 2 - 659334 + 660534 2 3 - 80757 + 80564 3 6 - 63915 + 63746 6 4525 - 30211 + 30185 @@ -17482,15 +17467,15 @@ decltypes - 814571 + 814818 id - 27567 + 27575 expr - 814571 + 814818 kind @@ -17498,7 +17483,7 @@ base_type - 3341 + 3342 parentheses_would_change_meaning @@ -17516,17 +17501,17 @@ 1 2 - 9738 + 9741 2 3 - 3649 + 3650 4 5 - 3627 + 3628 6 @@ -17536,12 +17521,12 @@ 23 24 - 3253 + 3254 29 30 - 3143 + 3144 32 @@ -17551,7 +17536,7 @@ 171 172 - 3077 + 3078 173 @@ -17572,7 +17557,7 @@ 1 2 - 27567 + 27575 @@ -17588,7 +17573,7 @@ 1 2 - 27567 + 27575 @@ -17604,7 +17589,7 @@ 1 2 - 27567 + 27575 @@ -17620,7 +17605,7 @@ 1 2 - 814571 + 814818 @@ -17636,7 +17621,7 @@ 1 2 - 814571 + 814818 @@ -17652,7 +17637,7 @@ 1 2 - 814571 + 814818 @@ -17668,7 +17653,7 @@ 1 2 - 814571 + 814818 @@ -17840,7 +17825,7 @@ 1 2 - 3341 + 3342 @@ -17856,7 +17841,7 @@ 1 2 - 3341 + 3342 @@ -17930,15 +17915,15 @@ type_operators - 7936 + 7954 id - 7936 + 7954 arg_type - 7164 + 7184 kind @@ -17946,7 +17931,7 @@ base_type - 5233 + 5217 @@ -17960,7 +17945,7 @@ 1 2 - 7936 + 7954 @@ -17976,7 +17961,7 @@ 1 2 - 7936 + 7954 @@ -17992,7 +17977,7 @@ 1 2 - 7936 + 7954 @@ -18008,12 +17993,12 @@ 1 2 - 6392 + 6415 2 3 - 772 + 769 @@ -18029,12 +18014,12 @@ 1 2 - 6392 + 6415 2 3 - 772 + 769 @@ -18050,7 +18035,7 @@ 1 2 - 7143 + 7163 2 @@ -18079,8 +18064,8 @@ 21 - 96 - 97 + 98 + 99 21 @@ -18110,8 +18095,8 @@ 21 - 96 - 97 + 98 + 99 21 @@ -18141,8 +18126,8 @@ 21 - 72 - 73 + 74 + 75 21 @@ -18164,22 +18149,22 @@ 1 2 - 3625 + 3571 2 3 - 900 + 940 3 4 - 343 + 342 4 6 - 364 + 363 @@ -18195,17 +18180,17 @@ 1 2 - 3775 + 3720 2 3 - 986 + 1026 3 4 - 450 + 449 4 @@ -18226,12 +18211,12 @@ 1 2 - 4075 + 4020 2 3 - 1136 + 1176 3 @@ -18246,19 +18231,19 @@ usertypes - 4137521 + 4199005 id - 4137521 + 4199005 name - 915335 + 949198 kind - 126 + 125 @@ -18272,7 +18257,7 @@ 1 2 - 4137521 + 4199005 @@ -18288,7 +18273,7 @@ 1 2 - 4137521 + 4199005 @@ -18304,22 +18289,22 @@ 1 2 - 652055 + 680968 2 3 - 158085 + 161107 3 8 - 70343 + 71369 8 - 32667 - 34850 + 33450 + 35752 @@ -18335,12 +18320,12 @@ 1 2 - 863800 + 897382 2 10 - 51534 + 51815 @@ -18384,8 +18369,8 @@ 10 - 4586 - 4587 + 4788 + 4789 10 @@ -18394,23 +18379,23 @@ 10 - 21491 - 21492 + 21602 + 21603 10 - 82174 - 82175 + 82275 + 82276 10 - 92838 - 92839 + 98872 + 98873 10 - 166906 - 166907 + 167625 + 167626 10 @@ -18450,8 +18435,8 @@ 10 - 771 - 772 + 783 + 784 10 @@ -18460,8 +18445,8 @@ 10 - 3066 - 3067 + 3068 + 3069 10 @@ -18475,13 +18460,13 @@ 10 - 12187 - 12188 + 12270 + 12271 10 - 57664 - 57665 + 61131 + 61132 10 @@ -18492,19 +18477,19 @@ usertypesize - 1359600 + 1420243 id - 1359600 + 1420243 size - 1472 + 1467 alignment - 84 + 83 @@ -18518,7 +18503,7 @@ 1 2 - 1359600 + 1420243 @@ -18534,7 +18519,7 @@ 1 2 - 1359600 + 1420243 @@ -18550,12 +18535,12 @@ 1 2 - 462 + 461 2 3 - 189 + 188 3 @@ -18594,7 +18579,7 @@ 1839 - 99841 + 106053 52 @@ -18611,7 +18596,7 @@ 1 2 - 1199 + 1195 2 @@ -18670,8 +18655,8 @@ 10 - 115036 - 115037 + 121248 + 121249 10 @@ -18688,7 +18673,7 @@ 1 2 - 21 + 20 3 @@ -18728,26 +18713,26 @@ usertype_final - 11449 + 11320 id - 11449 + 11320 usertype_uuid - 47930 + 47918 id - 47930 + 47918 uuid - 47387 + 47375 @@ -18761,7 +18746,7 @@ 1 2 - 47930 + 47918 @@ -18777,7 +18762,7 @@ 1 2 - 46845 + 46833 2 @@ -18792,15 +18777,15 @@ usertype_alias_kind - 1755750 + 1757492 id - 1755750 + 1757492 alias_kind - 21 + 20 @@ -18814,7 +18799,7 @@ 1 2 - 1755750 + 1757492 @@ -18828,13 +18813,13 @@ 12 - 36914 - 36915 + 36955 + 36956 10 - 129992 - 129993 + 130670 + 130671 10 @@ -18845,26 +18830,26 @@ nontype_template_parameters - 761293 + 753499 id - 761293 + 753499 type_template_type_constraint - 27070 + 26986 id - 13342 + 13300 constraint - 25933 + 25852 @@ -18878,27 +18863,27 @@ 1 2 - 10189 + 10157 2 3 - 900 + 898 3 5 - 1029 + 1026 5 14 - 1115 + 1111 14 17 - 107 + 106 @@ -18914,12 +18899,12 @@ 1 2 - 24796 + 24719 2 3 - 1136 + 1133 @@ -18929,19 +18914,19 @@ mangled_name - 7910444 + 8194180 id - 7910444 + 8194180 mangled_name - 6349611 + 6357829 is_complete - 248 + 246 @@ -18955,7 +18940,7 @@ 1 2 - 7910444 + 8194180 @@ -18971,7 +18956,7 @@ 1 2 - 7910444 + 8194180 @@ -18987,12 +18972,12 @@ 1 2 - 6016213 + 6002593 2 1120 - 333397 + 355236 @@ -19008,7 +18993,7 @@ 1 2 - 6349611 + 6357829 @@ -19024,12 +19009,12 @@ 6 7 - 124 + 123 - 63558 - 63559 - 124 + 66588 + 66589 + 123 @@ -19045,12 +19030,12 @@ 6 7 - 124 + 123 - 51016 - 51017 - 124 + 51664 + 51665 + 123 @@ -19060,59 +19045,59 @@ is_pod_class - 590973 + 607950 id - 590973 + 607950 is_standard_layout_class - 1120536 + 1181968 id - 1120536 + 1181968 is_complete - 1341507 + 1402209 id - 1341507 + 1402209 is_class_template - 231184 + 230421 id - 231184 + 230421 class_instantiation - 1122188 + 1182545 to - 1119158 + 1179556 from - 71521 + 71725 @@ -19126,12 +19111,12 @@ 1 2 - 1117033 + 1177470 2 8 - 2124 + 2086 @@ -19147,47 +19132,47 @@ 1 2 - 20386 + 20329 2 3 - 12833 + 12770 3 4 - 7111 + 7108 4 5 - 4639 + 4655 5 7 - 6059 + 6175 7 10 - 5680 + 5682 10 17 - 5890 + 5860 17 - 51 - 5364 + 52 + 5399 - 51 - 4223 - 3555 + 52 + 4358 + 3743 @@ -19197,19 +19182,19 @@ class_template_argument - 2887364 + 2998626 type_id - 1362199 + 1422098 index - 1178 + 1174 arg_type - 818756 + 844162 @@ -19223,27 +19208,27 @@ 1 2 - 577725 + 599073 2 3 - 408636 + 433897 3 4 - 249940 + 263364 4 - 7 - 102679 + 8 + 107667 - 7 + 8 113 - 23216 + 18096 @@ -19259,17 +19244,17 @@ 1 2 - 606159 + 627926 2 3 - 422574 + 448051 3 4 - 250771 + 263427 4 @@ -19295,7 +19280,7 @@ 4 5 - 746 + 744 5 @@ -19314,13 +19299,13 @@ 643 - 7128 + 7143 94 - 11968 - 129492 - 42 + 11996 + 135625 + 41 @@ -19341,12 +19326,12 @@ 4 5 - 746 + 744 5 16 - 105 + 104 16 @@ -19360,12 +19345,12 @@ 196 - 3263 + 3290 94 - 10412 - 44535 + 11128 + 46222 31 @@ -19382,27 +19367,27 @@ 1 2 - 511558 + 523971 2 3 - 166890 + 174580 3 5 - 74919 + 77680 5 - 46 - 61412 + 44 + 63442 - 46 - 12620 - 3976 + 44 + 13909 + 4487 @@ -19418,17 +19403,17 @@ 1 2 - 720873 + 737082 2 3 - 79589 + 87809 3 22 - 18293 + 19270 @@ -19438,19 +19423,19 @@ class_template_argument_value - 506795 + 508368 type_id - 204505 + 208919 index - 304 + 301 arg_value - 506660 + 508234 @@ -19464,17 +19449,17 @@ 1 2 - 154817 + 159699 2 3 - 43087 + 42682 3 8 - 6600 + 6538 @@ -19490,22 +19475,22 @@ 1 2 - 146998 + 151953 2 3 - 40210 + 39832 3 - 45 - 15434 + 52 + 15892 - 45 + 54 154 - 1861 + 1240 @@ -19549,18 +19534,18 @@ 33 - 981 - 982 + 982 + 983 33 - 2472 - 2473 + 2571 + 2572 33 - 3753 - 3754 + 3842 + 3843 33 @@ -19605,18 +19590,18 @@ 33 - 2433 - 2434 + 2434 + 2435 33 - 4802 - 4803 + 4901 + 4902 33 - 6051 - 6052 + 6140 + 6141 33 @@ -19633,12 +19618,12 @@ 1 2 - 506524 + 508100 2 3 - 135 + 134 @@ -19654,7 +19639,95 @@ 1 2 - 506660 + 508234 + + + + + + + + + class_template_generated_from + 61398 + + + template + 61398 + + + from + 3732 + + + + + template + from + + + 12 + + + 1 + 2 + 61398 + + + + + + + from + template + + + 12 + + + 1 + 2 + 1509 + + + 2 + 3 + 471 + + + 3 + 5 + 209 + + + 5 + 6 + 178 + + + 6 + 7 + 262 + + + 7 + 10 + 262 + + + 10 + 16 + 283 + + + 16 + 63 + 335 + + + 63 + 603 + 220 @@ -19664,15 +19737,15 @@ is_proxy_class_for - 48241 + 50200 id - 48241 + 50200 templ_param_id - 45580 + 46897 @@ -19686,7 +19759,7 @@ 1 2 - 48241 + 50200 @@ -19702,12 +19775,12 @@ 1 2 - 44865 + 46143 2 - 79 - 715 + 82 + 754 @@ -19717,19 +19790,19 @@ type_mentions - 5913261 + 5915053 id - 5913261 + 5915053 type_id - 278007 + 278092 location - 5856951 + 5858726 kind @@ -19747,7 +19820,7 @@ 1 2 - 5913261 + 5915053 @@ -19763,7 +19836,7 @@ 1 2 - 5913261 + 5915053 @@ -19779,7 +19852,7 @@ 1 2 - 5913261 + 5915053 @@ -19795,42 +19868,42 @@ 1 2 - 137451 + 137493 2 3 - 31204 + 31213 3 4 - 11653 + 11657 4 5 - 14975 + 14980 5 7 - 19931 + 19937 7 12 - 21783 + 21789 12 28 - 21020 + 21027 28 8941 - 19986 + 19992 @@ -19846,42 +19919,42 @@ 1 2 - 137451 + 137493 2 3 - 31204 + 31213 3 4 - 11653 + 11657 4 5 - 14975 + 14980 5 7 - 19931 + 19937 7 12 - 21783 + 21789 12 28 - 21020 + 21027 28 8941 - 19986 + 19992 @@ -19897,7 +19970,7 @@ 1 2 - 278007 + 278092 @@ -19913,12 +19986,12 @@ 1 2 - 5811261 + 5813022 2 4 - 45690 + 45704 @@ -19934,12 +20007,12 @@ 1 2 - 5811261 + 5813022 2 4 - 45690 + 45704 @@ -19955,7 +20028,7 @@ 1 2 - 5856951 + 5858726 @@ -20013,26 +20086,26 @@ is_function_template - 1328114 + 1312417 id - 1328114 + 1312417 function_instantiation - 967592 + 958530 to - 967592 + 958530 from - 181523 + 179850 @@ -20046,7 +20119,7 @@ 1 2 - 967592 + 958530 @@ -20062,27 +20135,27 @@ 1 2 - 109834 + 108835 2 3 - 42546 + 42146 3 9 - 14351 + 14216 9 104 - 13640 + 13512 119 1532 - 1150 + 1139 @@ -20092,19 +20165,19 @@ function_template_argument - 2468721 + 2445949 function_id - 1443892 + 1430587 index - 473 + 469 arg_type - 296062 + 293279 @@ -20118,22 +20191,22 @@ 1 2 - 777946 + 770800 2 3 - 410500 + 406674 3 4 - 170691 + 169154 4 15 - 84753 + 83956 @@ -20149,22 +20222,22 @@ 1 2 - 796968 + 789644 2 3 - 408604 + 404797 3 4 - 168525 + 167008 4 9 - 69793 + 69137 @@ -20180,7 +20253,7 @@ 1 2 - 169 + 167 7 @@ -20213,18 +20286,18 @@ 33 - 7547 - 7548 + 7549 + 7550 33 - 19675 - 19676 + 19678 + 19679 33 - 42659 - 42660 + 42667 + 42668 33 @@ -20241,7 +20314,7 @@ 1 2 - 169 + 167 4 @@ -20279,8 +20352,8 @@ 33 - 2754 - 2755 + 2755 + 2756 33 @@ -20302,37 +20375,37 @@ 1 2 - 173636 + 172004 2 3 - 26163 + 25884 3 4 - 19868 + 19513 4 6 - 22508 + 22430 6 11 - 23083 + 22933 11 76 - 23219 + 23000 79 2452 - 7581 + 7510 @@ -20348,17 +20421,17 @@ 1 2 - 255140 + 252708 2 3 - 31918 + 31651 3 15 - 9003 + 8918 @@ -20368,19 +20441,19 @@ function_template_argument_value - 449830 + 445568 function_id - 195502 + 193664 index - 473 + 469 arg_value - 447156 + 442919 @@ -20394,17 +20467,17 @@ 1 2 - 150417 + 149003 2 3 - 42613 + 42213 3 8 - 2470 + 2447 @@ -20420,22 +20493,22 @@ 1 2 - 143546 + 142197 2 3 - 36453 + 36110 3 54 - 14757 + 14618 54 113 - 744 + 737 @@ -20451,7 +20524,7 @@ 1 2 - 169 + 167 2 @@ -20512,7 +20585,7 @@ 1 2 - 169 + 167 2 @@ -20545,8 +20618,8 @@ 33 - 3295 - 3296 + 3294 + 3295 33 @@ -20573,12 +20646,12 @@ 1 2 - 444482 + 440270 2 3 - 2673 + 2648 @@ -20594,7 +20667,110 @@ 1 2 - 447156 + 442919 + + + + + + + + + function_template_generated_from + 863408 + + + template + 863408 + + + from + 22129 + + + + + template + from + + + 12 + + + 1 + 2 + 863408 + + + + + + + from + template + + + 12 + + + 1 + 2 + 3587 + + + 2 + 3 + 1173 + + + 3 + 5 + 1676 + + + 5 + 8 + 1777 + + + 8 + 14 + 1676 + + + 16 + 20 + 1575 + + + 20 + 23 + 1676 + + + 23 + 32 + 1844 + + + 33 + 66 + 2045 + + + 70 + 79 + 1374 + + + 83 + 110 + 1844 + + + 111 + 370 + 1877 @@ -20604,26 +20780,26 @@ is_variable_template - 58490 + 57832 id - 58490 + 57832 variable_instantiation - 427356 + 598007 to - 427356 + 598007 from - 35343 + 36175 @@ -20637,7 +20813,7 @@ 1 2 - 427356 + 598007 @@ -20653,47 +20829,47 @@ 1 2 - 15182 + 14396 2 3 - 3857 + 3937 3 4 - 2364 + 2583 4 6 - 2986 + 2707 6 8 - 2240 + 2707 8 - 12 - 3111 + 11 + 3199 - 12 - 31 - 2737 + 11 + 30 + 2830 - 32 - 390 - 2737 + 30 + 94 + 2830 - 545 - 546 - 124 + 103 + 1155 + 984 @@ -20703,19 +20879,19 @@ variable_template_argument - 772451 + 1129692 variable_id - 405577 + 576474 index - 1991 + 1968 arg_type - 255741 + 464378 @@ -20729,22 +20905,22 @@ 1 2 - 161534 + 189615 2 3 - 189535 + 289652 3 4 - 36338 + 77519 4 17 - 18169 + 19687 @@ -20760,22 +20936,22 @@ 1 2 - 176343 + 207333 2 3 - 179828 + 276855 3 4 - 33601 + 75427 4 17 - 15804 + 16857 @@ -20789,44 +20965,44 @@ 12 - 28 - 29 - 871 + 27 + 28 + 861 - 34 - 35 - 373 + 33 + 34 + 369 - 37 - 38 - 124 + 40 + 41 + 123 - 66 - 67 - 124 + 72 + 73 + 123 - 146 - 147 - 124 + 160 + 161 + 123 - 438 - 439 - 124 + 790 + 791 + 123 - 1961 - 1962 - 124 + 3144 + 3145 + 123 - 3259 - 3260 - 124 + 4685 + 4686 + 123 @@ -20842,42 +21018,42 @@ 1 2 - 871 + 861 2 3 - 373 + 369 5 6 - 124 + 123 - 28 - 29 - 124 + 35 + 36 + 123 - 54 - 55 - 124 + 63 + 64 + 123 - 161 - 162 - 124 + 362 + 363 + 123 - 747 - 748 - 124 + 1465 + 1466 + 123 - 1327 - 1328 - 124 + 2164 + 2165 + 123 @@ -20893,22 +21069,22 @@ 1 2 - 173481 + 360650 2 3 - 46294 + 57832 3 - 6 - 21529 + 16 + 35437 - 6 - 206 - 14436 + 16 + 224 + 10458 @@ -20924,17 +21100,12 @@ 1 2 - 227491 + 430909 2 - 3 - 24640 - - - 3 7 - 3609 + 33468 @@ -20944,19 +21115,19 @@ variable_template_argument_value - 19911 + 19810 variable_id - 14809 + 14765 index - 497 + 492 arg_value - 19911 + 19810 @@ -20970,12 +21141,12 @@ 1 2 - 13315 + 13289 2 3 - 1493 + 1476 @@ -20991,17 +21162,17 @@ 1 2 - 10453 + 10458 2 3 - 3982 + 3937 4 5 - 373 + 369 @@ -21017,22 +21188,22 @@ 17 18 - 124 + 123 27 28 - 124 + 123 - 41 - 42 - 124 + 43 + 44 + 123 - 46 - 47 - 124 + 45 + 46 + 123 @@ -21048,22 +21219,22 @@ 22 23 - 124 + 123 29 30 - 124 + 123 - 50 - 51 - 124 + 52 + 53 + 123 - 59 - 60 - 124 + 58 + 59 + 123 @@ -21079,7 +21250,7 @@ 1 2 - 19911 + 19810 @@ -21095,7 +21266,7 @@ 1 2 - 19911 + 19810 @@ -21104,21 +21275,21 @@ - template_template_instantiation - 6346 + variable_template_generated_from + 492 - to - 4977 + template + 492 from - 1120 + 246 - to + template from @@ -21127,12 +21298,66 @@ 1 2 - 3609 + 492 + + + + + + from + template + + + 12 + 2 3 - 1368 + 246 + + + + + + + + + is_alias_template + 107393 + + + id + 107393 + + + + + + alias_instantiation + 459650 + + + to + 459650 + + + from + 92205 + + + + + to + from + + + 12 + + + 1 + 2 + 459650 @@ -21148,22 +21373,47 @@ 1 2 - 746 + 16529 2 3 - 124 + 16798 - 16 - 17 - 124 + 3 + 4 + 20016 - 27 - 28 - 124 + 4 + 5 + 12472 + + + 5 + 7 + 6705 + + + 7 + 8 + 4794 + + + 8 + 10 + 7812 + + + 10 + 143 + 6940 + + + 163 + 795 + 134 @@ -21172,20 +21422,20 @@ - template_template_argument - 9635 + alias_template_argument + 993065 type_id - 6090 + 566977 index - 105 + 301 arg_type - 9046 + 127712 @@ -21199,22 +21449,22 @@ 1 2 - 4996 + 276179 2 3 - 420 + 182331 3 - 8 - 504 + 4 + 86907 - 8 - 11 - 168 + 4 + 10 + 21559 @@ -21230,22 +21480,22 @@ 1 2 - 5017 + 277419 2 + 3 + 181124 + + + 3 4 - 557 + 88349 4 10 - 462 - - - 10 - 11 - 52 + 20083 @@ -21261,52 +21511,47 @@ 6 7 - 10 - - - 11 - 12 - 10 + 33 - 16 - 17 - 10 + 8 + 9 + 33 - 21 - 22 - 10 + 10 + 11 + 33 - 27 - 28 - 10 + 42 + 43 + 33 - 38 - 39 - 10 + 91 + 92 + 33 - 50 - 51 - 10 + 643 + 644 + 33 - 64 - 65 - 10 + 3235 + 3236 + 33 - 104 - 105 - 10 + 8673 + 8674 + 33 - 579 - 580 - 10 + 16910 + 16911 + 33 @@ -21320,54 +21565,49 @@ 12 - 6 - 7 - 10 - - - 11 - 12 - 10 + 5 + 6 + 33 - 16 - 17 - 10 + 6 + 7 + 33 - 21 - 22 - 10 + 7 + 8 + 33 - 27 - 28 - 10 + 18 + 19 + 33 - 38 - 39 - 10 + 45 + 46 + 33 - 50 - 51 - 10 + 61 + 62 + 33 - 64 - 65 - 10 + 568 + 569 + 33 - 99 - 100 - 10 + 1513 + 1514 + 33 - 538 - 539 - 10 + 2209 + 2210 + 33 @@ -21383,12 +21623,32 @@ 1 2 - 9015 + 78156 + + + 2 + 3 + 20285 3 - 43 - 31 + 4 + 5431 + + + 4 + 6 + 10461 + + + 6 + 76 + 10829 + + + 84 + 4474 + 2548 @@ -21404,12 +21664,17 @@ 1 2 - 9025 + 108801 2 - 11 - 21 + 3 + 17301 + + + 3 + 9 + 1609 @@ -21418,20 +21683,20 @@ - template_template_argument_value - 746 + alias_template_argument_value + 173177 type_id - 124 + 160604 index - 124 + 134 arg_value - 746 + 173177 @@ -21445,7 +21710,12 @@ 1 2 - 124 + 159363 + + + 2 + 3 + 1240 @@ -21454,6 +21724,440 @@ type_id arg_value + + + 12 + + + 1 + 2 + 158693 + + + 2 + 42 + 1911 + + + + + + + index + type_id + + + 12 + + + 34 + 35 + 33 + + + 49 + 50 + 33 + + + 199 + 200 + 33 + + + 4545 + 4546 + 33 + + + + + + + index + arg_value + + + 12 + + + 38 + 39 + 33 + + + 49 + 50 + 33 + + + 249 + 250 + 33 + + + 4829 + 4830 + 33 + + + + + + + arg_value + type_id + + + 12 + + + 1 + 2 + 173177 + + + + + + + arg_value + index + + + 12 + + + 1 + 2 + 173177 + + + + + + + + + alias_template_generated_from + 99816 + + + template + 99816 + + + from + 1911 + + + + + template + from + + + 12 + + + 1 + 2 + 99816 + + + + + + + from + template + + + 12 + + + 1 + 2 + 134 + + + 2 + 4 + 134 + + + 4 + 8 + 134 + + + 9 + 18 + 167 + + + 18 + 20 + 134 + + + 20 + 21 + 201 + + + 31 + 32 + 134 + + + 43 + 50 + 134 + + + 64 + 65 + 67 + + + 65 + 66 + 134 + + + 74 + 84 + 167 + + + 111 + 112 + 268 + + + 150 + 294 + 100 + + + + + + + + + template_template_instantiation + 6029 + + + to + 4675 + + + from + 1107 + + + + + to + from + + + 12 + + + 1 + 2 + 3322 + + + 2 + 3 + 1353 + + + + + + + from + to + + + 12 + + + 1 + 2 + 738 + + + 2 + 3 + 123 + + + 14 + 15 + 123 + + + 27 + 28 + 123 + + + + + + + + + template_template_argument + 9603 + + + type_id + 6070 + + + index + 104 + + + arg_type + 9016 + + + + + type_id + index + + + 12 + + + 1 + 2 + 4980 + + + 2 + 3 + 419 + + + 3 + 8 + 503 + + + 8 + 11 + 167 + + + + + + + type_id + arg_type + + + 12 + + + 1 + 2 + 5001 + + + 2 + 4 + 555 + + + 4 + 10 + 461 + + + 10 + 11 + 52 + + + + + + + index + type_id + + + 12 + + + 6 + 7 + 10 + + + 11 + 12 + 10 + + + 16 + 17 + 10 + + + 21 + 22 + 10 + + + 27 + 28 + 10 + + + 38 + 39 + 10 + + + 50 + 51 + 10 + + + 64 + 65 + 10 + + + 104 + 105 + 10 + + + 579 + 580 + 10 + + + + + + + index + arg_type 12 @@ -21461,7 +22165,146 @@ 6 7 - 124 + 10 + + + 11 + 12 + 10 + + + 16 + 17 + 10 + + + 21 + 22 + 10 + + + 27 + 28 + 10 + + + 38 + 39 + 10 + + + 50 + 51 + 10 + + + 64 + 65 + 10 + + + 99 + 100 + 10 + + + 538 + 539 + 10 + + + + + + + arg_type + type_id + + + 12 + + + 1 + 2 + 8985 + + + 3 + 43 + 31 + + + + + + + arg_type + index + + + 12 + + + 1 + 2 + 8995 + + + 2 + 11 + 20 + + + + + + + + + template_template_argument_value + 1107 + + + type_id + 123 + + + index + 123 + + + arg_value + 1107 + + + + + type_id + index + + + 12 + + + 1 + 2 + 123 + + + + + + + type_id + arg_value + + + 12 + + + 9 + 10 + 123 @@ -21477,7 +22320,7 @@ 1 2 - 124 + 123 @@ -21491,9 +22334,9 @@ 12 - 6 - 7 - 124 + 9 + 10 + 123 @@ -21509,7 +22352,7 @@ 1 2 - 746 + 1107 @@ -21525,7 +22368,7 @@ 1 2 - 746 + 1107 @@ -21535,19 +22378,19 @@ concept_templates - 3603 + 3592 concept_id - 3603 + 3592 name - 3603 + 3592 location - 3603 + 3592 @@ -21561,7 +22404,7 @@ 1 2 - 3603 + 3592 @@ -21577,7 +22420,7 @@ 1 2 - 3603 + 3592 @@ -21593,7 +22436,7 @@ 1 2 - 3603 + 3592 @@ -21609,7 +22452,7 @@ 1 2 - 3603 + 3592 @@ -21625,7 +22468,7 @@ 1 2 - 3603 + 3592 @@ -21641,7 +22484,7 @@ 1 2 - 3603 + 3592 @@ -21651,15 +22494,15 @@ concept_instantiation - 90157 + 90089 to - 90157 + 90089 from - 3432 + 3421 @@ -21673,7 +22516,7 @@ 1 2 - 90157 + 90089 @@ -21694,12 +22537,12 @@ 2 3 - 107 + 106 3 4 - 364 + 363 4 @@ -21709,57 +22552,57 @@ 5 6 - 300 + 299 6 8 - 235 + 213 8 10 - 107 + 128 10 12 - 278 + 277 12 15 - 214 + 213 15 19 - 214 + 213 19 25 - 257 + 256 25 37 - 257 + 256 38 49 - 257 + 256 50 - 72 - 257 + 73 + 256 - 78 + 79 387 - 214 + 213 @@ -21769,22 +22612,22 @@ is_type_constraint - 36787 + 36673 concept_id - 36787 + 36673 concept_template_argument - 112701 + 112671 concept_id - 76149 + 76126 index @@ -21792,7 +22635,7 @@ arg_type - 21364 + 21490 @@ -21806,17 +22649,17 @@ 1 2 - 46333 + 46317 2 3 - 24603 + 24612 3 7 - 5212 + 5196 @@ -21832,17 +22675,17 @@ 1 2 - 49937 + 49909 2 3 - 22308 + 22324 3 7 - 3904 + 3891 @@ -21876,13 +22719,13 @@ 21 - 1390 - 1391 + 1394 + 1395 21 - 3550 - 3551 + 3560 + 3561 21 @@ -21917,13 +22760,13 @@ 21 - 359 - 360 + 360 + 361 21 - 640 - 641 + 649 + 650 21 @@ -21940,42 +22783,42 @@ 1 2 - 10360 + 10520 2 3 - 2960 + 2929 3 4 - 1051 + 1069 4 5 - 1351 + 1347 5 6 - 1158 + 1133 6 9 - 1608 + 1625 9 14 - 1973 + 1945 14 259 - 900 + 919 @@ -21991,12 +22834,12 @@ 1 2 - 17975 + 18090 2 3 - 3260 + 3271 3 @@ -22011,7 +22854,7 @@ concept_template_argument_value - 105 + 104 concept_id @@ -22019,11 +22862,11 @@ index - 15 + 14 arg_value - 105 + 104 @@ -22053,7 +22896,7 @@ 1 2 - 60 + 59 2 @@ -22116,7 +22959,7 @@ 1 2 - 105 + 104 @@ -22132,7 +22975,7 @@ 1 2 - 105 + 104 @@ -22142,15 +22985,15 @@ routinetypes - 600586 + 594974 id - 600586 + 594974 return_type - 282015 + 279398 @@ -22164,7 +23007,7 @@ 1 2 - 600586 + 594974 @@ -22180,17 +23023,17 @@ 1 2 - 232564 + 230412 2 3 - 34998 + 34669 3 4677 - 14452 + 14316 @@ -22200,11 +23043,11 @@ routinetypeargs - 1178524 + 1178881 routine - 416004 + 416130 index @@ -22212,7 +23055,7 @@ type_id - 112074 + 112108 @@ -22226,32 +23069,32 @@ 1 2 - 82939 + 82964 2 3 - 126070 + 126108 3 4 - 107881 + 107913 4 5 - 49284 + 49299 5 7 - 33164 + 33174 7 19 - 16664 + 16669 @@ -22267,27 +23110,27 @@ 1 2 - 88929 + 88956 2 3 - 138704 + 138746 3 4 - 114633 + 114668 4 5 - 40734 + 40746 5 10 - 32892 + 32902 10 @@ -22485,47 +23328,47 @@ 1 2 - 33273 + 33283 2 3 - 15574 + 15579 3 4 - 13287 + 13291 4 5 - 9802 + 9805 5 6 - 6371 + 6373 6 8 - 9475 + 9478 8 13 - 9530 + 9533 13 26 - 8658 + 8661 26 926 - 6099 + 6101 @@ -22541,22 +23384,22 @@ 1 2 - 79399 + 79423 2 3 - 17535 + 17540 3 5 - 9475 + 9478 5 17 - 5663 + 5665 @@ -22566,19 +23409,19 @@ ptrtomembers - 9677 + 9645 id - 9677 + 9645 type_id - 7942 + 7915 class_id - 4849 + 4833 @@ -22592,7 +23435,7 @@ 1 2 - 9677 + 9645 @@ -22608,7 +23451,7 @@ 1 2 - 9677 + 9645 @@ -22624,12 +23467,12 @@ 1 2 - 7731 + 7706 2 84 - 210 + 209 @@ -22645,12 +23488,12 @@ 1 2 - 7731 + 7706 2 84 - 210 + 209 @@ -22666,22 +23509,22 @@ 1 2 - 3892 + 3879 2 3 - 515 + 513 8 9 - 399 + 398 10 65 - 42 + 41 @@ -22697,22 +23540,22 @@ 1 2 - 3892 + 3879 2 3 - 515 + 513 8 9 - 399 + 398 10 65 - 42 + 41 @@ -22722,15 +23565,15 @@ specifiers - 7715 + 7628 id - 7715 + 7628 str - 7715 + 7628 @@ -22744,7 +23587,7 @@ 1 2 - 7715 + 7628 @@ -22760,7 +23603,7 @@ 1 2 - 7715 + 7628 @@ -22770,15 +23613,15 @@ typespecifiers - 852347 + 849782 type_id - 844880 + 844676 spec_id - 1617 + 94 @@ -22792,12 +23635,12 @@ 1 2 - 837413 + 839570 2 3 - 7466 + 5106 @@ -22811,69 +23654,49 @@ 12 - 1 - 2 - 124 - - - 2 - 3 - 124 - - - 16 - 17 - 124 - - - 17 - 18 - 124 - - - 24 - 25 - 124 + 168 + 169 + 10 - 44 - 45 - 124 + 215 + 216 + 10 - 49 - 50 - 124 + 225 + 226 + 10 - 51 - 52 - 124 + 533 + 534 + 10 - 112 - 113 - 124 + 821 + 822 + 10 - 199 - 200 - 124 + 1568 + 1569 + 10 - 325 - 326 - 124 + 4195 + 4196 + 10 - 547 - 548 - 124 + 18432 + 18433 + 10 - 5462 - 5463 - 124 + 54893 + 54894 + 10 @@ -22883,15 +23706,15 @@ funspecifiers - 9694786 + 9579810 func_id - 4002636 + 3954724 spec_id - 2364 + 2337 @@ -22905,27 +23728,27 @@ 1 2 - 1526111 + 1507569 2 3 - 506132 + 499939 3 4 - 1034042 + 1021657 4 5 - 691186 + 683402 5 8 - 245163 + 242156 @@ -22941,97 +23764,97 @@ 17 18 - 124 + 123 18 19 - 124 + 123 53 54 - 124 + 123 114 115 - 124 + 123 216 217 - 124 + 123 272 273 - 124 + 123 356 357 - 124 + 123 653 654 - 124 + 123 769 770 - 124 + 123 823 824 - 124 + 123 1096 1097 - 124 + 123 1261 1262 - 124 + 123 1670 1671 - 124 + 123 - 3304 - 3305 - 124 + 3297 + 3298 + 123 - 3355 - 3356 - 124 + 3348 + 3349 + 123 - 6170 - 6171 - 124 + 6163 + 6164 + 123 - 15137 - 15138 - 124 + 15130 + 15131 + 123 - 19840 - 19841 - 124 + 19822 + 19823 + 123 - 22778 - 22779 - 124 + 22777 + 22778 + 123 @@ -23041,15 +23864,15 @@ varspecifiers - 3078855 + 3216566 var_id - 2314866 + 2461674 spec_id - 1120 + 1107 @@ -23063,17 +23886,17 @@ 1 2 - 1654293 + 1809034 2 3 - 557653 + 550880 3 5 - 102918 + 101759 @@ -23089,47 +23912,47 @@ 97 98 - 124 + 123 240 241 - 124 + 123 1091 1092 - 124 - - - 1334 - 1335 - 124 + 123 2238 2239 - 124 + 123 - 2816 - 2817 - 124 + 2746 + 2747 + 123 - 3492 - 3493 - 124 + 2812 + 2813 + 123 - 4939 - 4940 - 124 + 3506 + 3507 + 123 + + + 4918 + 4919 + 123 8493 8494 - 124 + 123 @@ -23139,15 +23962,15 @@ explicit_specifier_exprs - 41192 + 40728 func_id - 41192 + 40728 constant - 41192 + 40728 @@ -23161,7 +23984,7 @@ 1 2 - 41192 + 40728 @@ -23177,7 +24000,7 @@ 1 2 - 41192 + 40728 @@ -23187,27 +24010,27 @@ attributes - 652234 + 644888 id - 652234 + 644888 kind - 373 + 369 name - 2115 + 2091 name_space - 248 + 246 location - 646136 + 638859 @@ -23221,7 +24044,7 @@ 1 2 - 652234 + 644888 @@ -23237,7 +24060,7 @@ 1 2 - 652234 + 644888 @@ -23253,7 +24076,7 @@ 1 2 - 652234 + 644888 @@ -23269,7 +24092,7 @@ 1 2 - 652234 + 644888 @@ -23285,17 +24108,17 @@ 7 8 - 124 + 123 2406 2407 - 124 + 123 2828 2829 - 124 + 123 @@ -23311,17 +24134,17 @@ 1 2 - 124 + 123 6 7 - 124 + 123 12 13 - 124 + 123 @@ -23337,12 +24160,12 @@ 1 2 - 248 + 246 2 3 - 124 + 123 @@ -23358,17 +24181,17 @@ 4 5 - 124 + 123 2360 2361 - 124 + 123 2828 2829 - 124 + 123 @@ -23384,72 +24207,72 @@ 1 2 - 248 + 246 3 4 - 124 + 123 6 7 - 124 + 123 7 8 - 248 + 246 10 11 - 248 + 246 14 15 - 124 + 123 18 19 - 124 + 123 24 25 - 124 + 123 59 60 - 124 + 123 62 63 - 124 + 123 72 73 - 124 + 123 341 342 - 124 + 123 1977 1978 - 124 + 123 2629 2630 - 124 + 123 @@ -23465,12 +24288,12 @@ 1 2 - 1866 + 1845 2 3 - 248 + 246 @@ -23486,7 +24309,7 @@ 1 2 - 2115 + 2091 @@ -23502,77 +24325,77 @@ 1 2 - 248 + 246 3 4 - 124 + 123 4 5 - 124 + 123 6 7 - 124 + 123 7 8 - 124 + 123 10 11 - 248 + 246 14 15 - 124 + 123 18 19 - 124 + 123 24 25 - 124 + 123 59 60 - 124 + 123 62 63 - 124 + 123 72 73 - 124 + 123 336 337 - 124 + 123 1977 1978 - 124 + 123 2629 2630 - 124 + 123 @@ -23588,12 +24411,12 @@ 11 12 - 124 + 123 5230 5231 - 124 + 123 @@ -23609,12 +24432,12 @@ 1 2 - 124 + 123 3 4 - 124 + 123 @@ -23630,12 +24453,12 @@ 2 3 - 124 + 123 15 16 - 124 + 123 @@ -23651,12 +24474,12 @@ 11 12 - 124 + 123 5181 5182 - 124 + 123 @@ -23672,12 +24495,12 @@ 1 2 - 640287 + 633075 2 5 - 5849 + 5783 @@ -23693,7 +24516,7 @@ 1 2 - 646136 + 638859 @@ -23709,12 +24532,12 @@ 1 2 - 641034 + 633814 2 3 - 5102 + 5044 @@ -23730,7 +24553,7 @@ 1 2 - 646136 + 638859 @@ -23740,11 +24563,11 @@ attribute_args - 82085 + 82133 id - 82085 + 82133 kind @@ -23752,7 +24575,7 @@ attribute - 70847 + 70889 index @@ -23760,7 +24583,7 @@ location - 56854 + 56887 @@ -23774,7 +24597,7 @@ 1 2 - 82085 + 82133 @@ -23790,7 +24613,7 @@ 1 2 - 82085 + 82133 @@ -23806,7 +24629,7 @@ 1 2 - 82085 + 82133 @@ -23822,7 +24645,7 @@ 1 2 - 82085 + 82133 @@ -23942,12 +24765,12 @@ 1 2 - 65410 + 65448 2 7 - 5316 + 5319 7 @@ -23968,12 +24791,12 @@ 1 2 - 69340 + 69380 2 3 - 1507 + 1508 @@ -23989,12 +24812,12 @@ 1 2 - 67821 + 67860 2 8 - 3026 + 3028 @@ -24010,12 +24833,12 @@ 1 2 - 68350 + 68390 2 6 - 2497 + 2498 @@ -24195,17 +25018,17 @@ 1 2 - 41266 + 41291 2 3 - 11789 + 11796 3 25 - 3797 + 3799 @@ -24221,12 +25044,12 @@ 1 2 - 47377 + 47405 2 3 - 9476 + 9482 @@ -24242,17 +25065,17 @@ 1 2 - 42613 + 42638 2 3 - 12227 + 12234 3 11 - 2013 + 2015 @@ -24268,7 +25091,7 @@ 1 2 - 56606 + 56639 2 @@ -24283,15 +25106,15 @@ attribute_arg_value - 16585 + 16429 arg - 16585 + 16429 value - 507 + 502 @@ -24305,7 +25128,7 @@ 1 2 - 16585 + 16429 @@ -24321,7 +25144,7 @@ 1 2 - 203 + 201 5 @@ -24439,15 +25262,15 @@ attribute_arg_constant - 71626 + 71243 arg - 71626 + 71243 constant - 71626 + 71243 @@ -24461,7 +25284,7 @@ 1 2 - 71626 + 71243 @@ -24477,7 +25300,7 @@ 1 2 - 71626 + 71243 @@ -24487,15 +25310,15 @@ attribute_arg_expr - 1587 + 1582 arg - 1587 + 1582 expr - 1587 + 1582 @@ -24509,7 +25332,7 @@ 1 2 - 1587 + 1582 @@ -24525,7 +25348,7 @@ 1 2 - 1587 + 1582 @@ -24588,15 +25411,15 @@ typeattributes - 96074 + 94992 type_id - 94331 + 93269 spec_id - 32356 + 31992 @@ -24610,12 +25433,12 @@ 1 2 - 92589 + 91546 2 3 - 1742 + 1722 @@ -24631,17 +25454,17 @@ 1 2 - 27876 + 27562 2 9 - 2488 + 2460 11 58 - 1991 + 1968 @@ -24651,15 +25474,15 @@ funcattributes - 841520 + 830073 func_id - 797092 + 786146 spec_id - 615273 + 608343 @@ -24673,12 +25496,12 @@ 1 2 - 757144 + 746648 2 7 - 39947 + 39498 @@ -24694,12 +25517,12 @@ 1 2 - 570347 + 563923 2 213 - 44925 + 44419 @@ -24772,15 +25595,15 @@ namespaceattributes - 5957 + 5901 namespace_id - 135 + 134 spec_id - 5957 + 5901 @@ -24820,7 +25643,7 @@ 1 2 - 5957 + 5901 @@ -24830,15 +25653,15 @@ stmtattributes - 2230 + 2223 stmt_id - 2230 + 2223 spec_id - 579 + 577 @@ -24852,7 +25675,7 @@ 1 2 - 2230 + 2223 @@ -24873,7 +25696,7 @@ 2 3 - 150 + 149 3 @@ -24883,7 +25706,7 @@ 9 10 - 107 + 106 13 @@ -24898,15 +25721,15 @@ unspecifiedtype - 7228466 + 7381947 type_id - 7228466 + 7381947 unspecified_type_id - 3955719 + 4143724 @@ -24920,7 +25743,7 @@ 1 2 - 7228466 + 7381947 @@ -24936,22 +25759,22 @@ 1 2 - 2475280 + 2676022 2 3 - 1114436 + 1106067 3 - 7 - 304027 + 8 + 312292 - 7 + 8 892 - 61975 + 49341 @@ -24961,19 +25784,19 @@ member - 4182340 + 4133757 parent - 541973 + 535991 index - 29618 + 29285 child - 4177735 + 4129205 @@ -24987,57 +25810,57 @@ 1 2 - 128679 + 127722 2 3 - 83131 + 81949 3 4 - 32356 + 31992 4 5 - 44801 + 44296 5 6 - 42312 + 41712 6 7 - 33849 + 33468 7 9 - 42188 + 41712 9 13 - 41068 + 40605 13 18 - 41192 + 40728 18 42 - 40694 + 40236 42 239 - 11698 + 11566 @@ -25053,57 +25876,57 @@ 1 2 - 128430 + 127476 2 3 - 83256 + 82072 3 4 - 32107 + 31746 4 5 - 44925 + 44542 5 6 - 42436 + 41712 6 7 - 32729 + 32361 7 9 - 42561 + 42082 9 13 - 41441 + 40974 13 18 - 41316 + 40851 18 42 - 40694 + 40236 42 265 - 12071 + 11935 @@ -25119,57 +25942,57 @@ 1 2 - 6471 + 6398 2 3 - 2613 + 2583 3 8 - 1866 + 1845 9 10 - 2862 + 2830 10 19 - 2240 + 2214 19 26 - 2240 + 2214 26 36 - 2488 + 2460 36 50 - 2240 + 2214 54 141 - 2240 + 2214 150 468 - 2240 + 2214 480 - 4310 - 2115 + 4311 + 2091 @@ -25185,57 +26008,57 @@ 1 2 - 5475 + 5414 2 3 - 3609 + 3568 3 9 - 1866 + 1845 9 10 - 2862 + 2830 10 20 - 2240 + 2214 20 27 - 2240 + 2214 27 37 - 2613 + 2583 37 56 - 2364 + 2337 58 - 156 - 2240 + 155 + 2214 164 528 - 2240 + 2214 548 4332 - 1866 + 1845 @@ -25251,7 +26074,7 @@ 1 2 - 4177735 + 4129205 @@ -25267,12 +26090,12 @@ 1 2 - 4173131 + 4124652 2 3 - 4604 + 4552 @@ -25282,15 +26105,15 @@ enclosingfunction - 114977 + 114597 child - 114977 + 114597 parent - 69091 + 68863 @@ -25304,7 +26127,7 @@ 1 2 - 114977 + 114597 @@ -25320,22 +26143,22 @@ 1 2 - 37470 + 37346 2 3 - 24478 + 24397 3 5 - 6059 + 6039 5 45 - 1083 + 1079 @@ -25345,27 +26168,27 @@ derivations - 473794 + 491402 derivation - 473794 + 491402 sub - 452200 + 470011 index - 236 + 234 super - 234020 + 238962 location - 35167 + 34836 @@ -25379,7 +26202,7 @@ 1 2 - 473794 + 491402 @@ -25395,7 +26218,7 @@ 1 2 - 473794 + 491402 @@ -25411,7 +26234,7 @@ 1 2 - 473794 + 491402 @@ -25427,7 +26250,7 @@ 1 2 - 473794 + 491402 @@ -25443,12 +26266,12 @@ 1 2 - 435784 + 453749 2 9 - 16415 + 16261 @@ -25464,12 +26287,12 @@ 1 2 - 435784 + 453749 2 8 - 16415 + 16261 @@ -25485,12 +26308,12 @@ 1 2 - 435784 + 453749 2 9 - 16415 + 16261 @@ -25506,12 +26329,12 @@ 1 2 - 435784 + 453749 2 8 - 16415 + 16261 @@ -25527,7 +26350,7 @@ 25 26 - 101 + 100 26 @@ -25545,8 +26368,8 @@ 33 - 13360 - 13361 + 14018 + 14019 33 @@ -25563,7 +26386,7 @@ 25 26 - 135 + 134 52 @@ -25576,8 +26399,8 @@ 33 - 13360 - 13361 + 14018 + 14019 33 @@ -25617,8 +26440,8 @@ 33 - 6510 - 6511 + 6723 + 6724 33 @@ -25635,7 +26458,7 @@ 1 2 - 135 + 134 7 @@ -25666,12 +26489,12 @@ 1 2 - 224272 + 229205 2 - 1655 - 9748 + 1758 + 9756 @@ -25687,12 +26510,12 @@ 1 2 - 224272 + 229205 2 - 1655 - 9748 + 1758 + 9756 @@ -25708,12 +26531,12 @@ 1 2 - 233580 + 238526 2 4 - 440 + 435 @@ -25729,12 +26552,12 @@ 1 2 - 228706 + 233597 2 81 - 5314 + 5364 @@ -25750,27 +26573,27 @@ 1 2 - 26333 + 25850 2 5 - 3113 + 3185 5 22 - 2741 + 2782 22 - 383 - 2673 + 371 + 2615 - 388 - 928 - 304 + 379 + 985 + 402 @@ -25786,27 +26609,27 @@ 1 2 - 26333 + 25850 2 5 - 3113 + 3185 5 22 - 2741 + 2782 22 - 383 - 2673 + 371 + 2615 - 388 - 928 - 304 + 379 + 985 + 402 @@ -25822,7 +26645,7 @@ 1 2 - 35167 + 34836 @@ -25838,22 +26661,22 @@ 1 2 - 28533 + 28164 2 4 - 2606 + 2548 4 - 26 - 2809 + 24 + 2615 - 26 - 928 - 1218 + 24 + 933 + 1508 @@ -25863,15 +26686,15 @@ derspecifiers - 475554 + 493146 der_id - 473354 + 490966 spec_id - 135 + 134 @@ -25885,12 +26708,12 @@ 1 2 - 471154 + 488787 2 3 - 2200 + 2179 @@ -25919,8 +26742,8 @@ 33 - 12789 - 12790 + 13447 + 13448 33 @@ -25931,15 +26754,15 @@ direct_base_offsets - 447055 + 464914 der_id - 447055 + 464914 offset - 507 + 502 @@ -25953,7 +26776,7 @@ 1 2 - 447055 + 464914 @@ -25969,17 +26792,17 @@ 1 2 - 101 + 100 2 3 - 135 + 134 3 4 - 101 + 100 4 @@ -26002,8 +26825,8 @@ 33 - 13058 - 13059 + 13716 + 13717 33 @@ -26014,19 +26837,19 @@ virtual_base_offsets - 5787 + 5733 sub - 5787 + 5733 super - 101 + 100 offset - 338 + 335 @@ -26040,7 +26863,7 @@ 1 2 - 5787 + 5733 @@ -26056,7 +26879,7 @@ 1 2 - 5787 + 5733 @@ -26114,7 +26937,7 @@ 2 3 - 304 + 301 153 @@ -26140,7 +26963,7 @@ 2 3 - 304 + 301 @@ -26150,23 +26973,23 @@ frienddecls - 767534 + 759702 id - 767534 + 759702 type_id - 54340 + 53847 decl_id - 100695 + 99782 location - 6056 + 6001 @@ -26180,7 +27003,7 @@ 1 2 - 767534 + 759702 @@ -26196,7 +27019,7 @@ 1 2 - 767534 + 759702 @@ -26212,7 +27035,7 @@ 1 2 - 767534 + 759702 @@ -26228,42 +27051,42 @@ 1 2 - 5582 + 5532 2 3 - 25004 + 24778 3 8 - 4770 + 4794 8 17 - 4737 + 4627 17 27 - 4466 + 4425 27 45 - 4297 + 4258 45 81 - 4737 + 4694 102 121 - 744 + 737 @@ -26279,42 +27102,42 @@ 1 2 - 5582 + 5532 2 3 - 25004 + 24778 3 8 - 4770 + 4794 8 17 - 4737 + 4627 17 27 - 4466 + 4425 27 45 - 4297 + 4258 45 81 - 4737 + 4694 102 121 - 744 + 737 @@ -26330,12 +27153,12 @@ 1 2 - 52987 + 52506 2 13 - 1353 + 1341 @@ -26351,32 +27174,32 @@ 1 2 - 67502 + 66890 2 3 - 8120 + 8046 3 9 - 9203 + 9119 9 24 - 7613 + 7544 24 - 136 - 7646 + 134 + 7544 - 136 + 135 191 - 609 + 637 @@ -26392,32 +27215,32 @@ 1 2 - 67502 + 66890 2 3 - 8120 + 8046 3 9 - 9203 + 9119 9 24 - 7613 + 7544 24 - 136 - 7646 + 134 + 7544 - 136 + 135 191 - 609 + 637 @@ -26433,12 +27256,12 @@ 1 2 - 99477 + 98575 2 6 - 1218 + 1207 @@ -26454,12 +27277,12 @@ 1 2 - 5684 + 5632 2 - 22495 - 372 + 22469 + 368 @@ -26475,12 +27298,12 @@ 1 2 - 5921 + 5867 2 1509 - 135 + 134 @@ -26496,12 +27319,12 @@ 1 2 - 5718 + 5666 2 2844 - 338 + 335 @@ -26511,19 +27334,19 @@ comments - 11208578 + 11082335 id - 11208578 + 11082335 contents - 4294966 + 4246591 location - 11208578 + 11082335 @@ -26537,7 +27360,7 @@ 1 2 - 11208578 + 11082335 @@ -26553,7 +27376,7 @@ 1 2 - 11208578 + 11082335 @@ -26569,17 +27392,17 @@ 1 2 - 3920500 + 3876344 2 6 - 322819 + 319183 6 34447 - 51646 + 51064 @@ -26595,17 +27418,17 @@ 1 2 - 3920500 + 3876344 2 6 - 322819 + 319183 6 34447 - 51646 + 51064 @@ -26621,7 +27444,7 @@ 1 2 - 11208578 + 11082335 @@ -26637,7 +27460,7 @@ 1 2 - 11208578 + 11082335 @@ -26647,15 +27470,15 @@ commentbinding - 3905318 + 3861332 id - 3342686 + 3305037 element - 3740175 + 3698049 @@ -26669,12 +27492,12 @@ 1 2 - 3281209 + 3244252 2 1706 - 61477 + 60785 @@ -26690,12 +27513,12 @@ 1 2 - 3575031 + 3534766 2 3 - 165143 + 163283 @@ -26705,15 +27528,15 @@ exprconv - 9634075 + 9637003 converted - 9633970 + 9636897 conversion - 9634075 + 9637003 @@ -26727,7 +27550,7 @@ 1 2 - 9633864 + 9636792 2 @@ -26748,7 +27571,7 @@ 1 2 - 9634075 + 9637003 @@ -26758,30 +27581,30 @@ compgenerated - 9923218 + 9885625 id - 9923218 + 9885625 synthetic_destructor_call - 1666585 + 1661392 element - 1241154 + 1237287 i - 386 + 384 destructor_call - 1666585 + 1661392 @@ -26795,17 +27618,17 @@ 1 2 - 826149 + 823575 2 3 - 408226 + 406955 3 19 - 6778 + 6757 @@ -26821,17 +27644,17 @@ 1 2 - 826149 + 823575 2 3 - 408226 + 406955 3 19 - 6778 + 6757 @@ -26979,7 +27802,7 @@ 1 2 - 1666585 + 1661392 @@ -26995,7 +27818,7 @@ 1 2 - 1666585 + 1661392 @@ -27005,15 +27828,15 @@ namespaces - 8615 + 8586 id - 8615 + 8586 name - 4554 + 4539 @@ -27027,7 +27850,7 @@ 1 2 - 8615 + 8586 @@ -27043,17 +27866,17 @@ 1 2 - 3723 + 3711 2 3 - 525 + 524 3 149 - 305 + 304 @@ -27063,26 +27886,26 @@ namespace_inline - 497 + 492 id - 497 + 492 namespacembrs - 2110397 + 2483823 parentid - 3982 + 3937 memberid - 2110397 + 2483823 @@ -27096,67 +27919,67 @@ 1 2 - 497 + 492 2 3 - 248 + 246 3 4 - 497 + 492 4 5 - 622 + 615 7 10 - 248 + 246 10 12 - 248 + 246 12 18 - 248 + 246 19 21 - 248 + 246 23 24 - 248 + 246 25 29 - 248 + 246 70 83 - 248 + 246 - 165 - 170 - 248 + 169 + 182 + 246 - 16228 - 16229 - 124 + 19440 + 19441 + 123 @@ -27172,7 +27995,7 @@ 1 2 - 2110397 + 2483823 @@ -27182,19 +28005,19 @@ exprparents - 19456298 + 19462195 expr_id - 19456298 + 19462195 child_index - 20037 + 20043 parent_id - 12941382 + 12945304 @@ -27208,7 +28031,7 @@ 1 2 - 19456298 + 19462195 @@ -27224,7 +28047,7 @@ 1 2 - 19456298 + 19462195 @@ -27240,12 +28063,12 @@ 1 2 - 3855 + 3856 2 3 - 1519 + 1520 3 @@ -27255,7 +28078,7 @@ 4 5 - 8977 + 8980 5 @@ -27270,7 +28093,7 @@ 11 53 - 1519 + 1520 56 @@ -27291,12 +28114,12 @@ 1 2 - 3855 + 3856 2 3 - 1519 + 1520 3 @@ -27306,7 +28129,7 @@ 4 5 - 8977 + 8980 5 @@ -27321,7 +28144,7 @@ 11 53 - 1519 + 1520 56 @@ -27342,17 +28165,17 @@ 1 2 - 7395566 + 7397807 2 3 - 5083216 + 5084757 3 712 - 462599 + 462739 @@ -27368,17 +28191,17 @@ 1 2 - 7395566 + 7397807 2 3 - 5083216 + 5084757 3 712 - 462599 + 462739 @@ -27388,22 +28211,22 @@ expr_isload - 6897613 + 6919045 expr_id - 6897613 + 6919045 conversionkinds - 6051176 + 6052846 expr_id - 6051176 + 6052846 kind @@ -27421,7 +28244,7 @@ 1 2 - 6051176 + 6052846 @@ -27445,28 +28268,28 @@ 1 - 7371 - 7372 + 7370 + 7371 1 - 40984 - 40985 + 40990 + 40991 1 - 71408 - 71409 + 71404 + 71405 1 - 93454 - 93455 + 93465 + 93466 1 - 5832066 - 5832067 + 5833724 + 5833725 1 @@ -27477,11 +28300,11 @@ iscall - 5790597 + 5772727 caller - 5790597 + 5772727 kind @@ -27499,7 +28322,7 @@ 1 2 - 5790597 + 5772727 @@ -27518,13 +28341,13 @@ 21 - 1409 - 1410 + 1484 + 1485 21 - 268311 - 268312 + 268244 + 268245 21 @@ -27535,15 +28358,15 @@ numtemplatearguments - 640909 + 730405 expr_id - 640909 + 730405 num - 995 + 984 @@ -27557,7 +28380,7 @@ 1 2 - 640909 + 730405 @@ -27573,37 +28396,42 @@ 1 2 - 124 + 123 6 7 - 124 + 123 - 28 - 29 - 248 + 27 + 28 + 123 - 61 - 62 - 124 + 39 + 40 + 123 - 219 - 220 - 124 + 68 + 69 + 123 + + + 404 + 405 + 123 - 1573 - 1574 - 124 + 1998 + 1999 + 123 - 3234 - 3235 - 124 + 3393 + 3394 + 123 @@ -27613,15 +28441,15 @@ specialnamequalifyingelements - 124 + 123 id - 124 + 123 name - 124 + 123 @@ -27635,7 +28463,7 @@ 1 2 - 124 + 123 @@ -27651,7 +28479,7 @@ 1 2 - 124 + 123 @@ -27661,23 +28489,23 @@ namequalifiers - 3042471 + 3051489 id - 3042471 + 3051489 qualifiableelement - 3042471 + 3051489 qualifyingelement - 47727 + 54656 location - 554584 + 558951 @@ -27691,7 +28519,7 @@ 1 2 - 3042471 + 3051489 @@ -27707,7 +28535,7 @@ 1 2 - 3042471 + 3051489 @@ -27723,7 +28551,7 @@ 1 2 - 3042471 + 3051489 @@ -27739,7 +28567,7 @@ 1 2 - 3042471 + 3051489 @@ -27755,7 +28583,7 @@ 1 2 - 3042471 + 3051489 @@ -27771,7 +28599,7 @@ 1 2 - 3042471 + 3051489 @@ -27787,27 +28615,27 @@ 1 2 - 31446 + 37827 2 3 - 8172 + 8275 3 5 - 4139 + 4212 5 - 86 - 3582 + 209 + 4105 - 88 + 234 41956 - 386 + 235 @@ -27823,27 +28651,27 @@ 1 2 - 31446 + 37827 2 3 - 8172 + 8275 3 5 - 4139 + 4212 5 - 86 - 3582 + 209 + 4105 - 88 + 234 41956 - 386 + 235 @@ -27859,22 +28687,22 @@ 1 2 - 34664 + 41441 2 3 - 7336 + 7420 3 - 6 - 3582 + 7 + 4148 - 6 - 20057 - 2145 + 7 + 20059 + 1646 @@ -27890,22 +28718,22 @@ 1 2 - 79410 + 83268 2 6 - 41013 + 42275 6 7 - 397780 + 396712 7 192 - 36380 + 36694 @@ -27921,22 +28749,22 @@ 1 2 - 79410 + 83268 2 6 - 41013 + 42275 6 7 - 397780 + 396712 7 192 - 36380 + 36694 @@ -27952,22 +28780,22 @@ 1 2 - 114953 + 119492 2 4 - 13320 + 14070 4 5 - 414040 + 412921 5 - 33 - 12269 + 60 + 12466 @@ -27977,15 +28805,15 @@ varbind - 8255503 + 8258005 expr - 8255503 + 8258005 var - 1050487 + 1050805 @@ -27999,7 +28827,7 @@ 1 2 - 8255503 + 8258005 @@ -28015,52 +28843,52 @@ 1 2 - 171554 + 171606 2 3 - 188720 + 188777 3 4 - 145663 + 145707 4 5 - 116648 + 116684 5 6 - 83159 + 83185 6 7 - 65824 + 65844 7 9 - 80824 + 80848 9 13 - 81583 + 81608 13 27 - 79135 + 79159 27 5137 - 37372 + 37383 @@ -28070,15 +28898,15 @@ funbind - 5805870 + 5787737 expr - 5803403 + 5785278 fun - 275275 + 274929 @@ -28092,12 +28920,12 @@ 1 2 - 5800937 + 5782819 2 3 - 2466 + 2459 @@ -28113,27 +28941,27 @@ 1 2 - 181064 + 180670 2 3 - 38310 + 38212 3 4 - 16903 + 16743 4 8 - 22930 + 23308 8 37798 - 16066 + 15994 @@ -28143,19 +28971,19 @@ expr_allocator - 44949 + 44756 expr - 44949 + 44756 func - 101 + 64 form - 33 + 21 @@ -28169,7 +28997,7 @@ 1 2 - 44949 + 44756 @@ -28185,7 +29013,7 @@ 1 2 - 44949 + 44756 @@ -28199,19 +29027,19 @@ 12 - 1 - 2 - 33 + 2 + 3 + 21 - 591 - 592 - 33 + 369 + 370 + 21 - 736 - 737 - 33 + 1722 + 1723 + 21 @@ -28227,7 +29055,7 @@ 1 2 - 101 + 64 @@ -28241,9 +29069,9 @@ 12 - 1328 - 1329 - 33 + 2093 + 2094 + 21 @@ -28259,7 +29087,7 @@ 3 4 - 33 + 21 @@ -28269,15 +29097,15 @@ expr_deallocator - 53478 + 52976 expr - 53478 + 52976 func - 101 + 100 form @@ -28295,7 +29123,7 @@ 1 2 - 53478 + 52976 @@ -28311,7 +29139,7 @@ 1 2 - 53478 + 52976 @@ -28353,7 +29181,7 @@ 1 2 - 101 + 100 @@ -28416,15 +29244,15 @@ expr_cond_guard - 897972 + 898245 cond - 897972 + 898245 guard - 897972 + 898245 @@ -28438,7 +29266,7 @@ 1 2 - 897972 + 898245 @@ -28454,7 +29282,7 @@ 1 2 - 897972 + 898245 @@ -28464,15 +29292,15 @@ expr_cond_true - 897968 + 898241 cond - 897968 + 898241 true - 897968 + 898241 @@ -28486,7 +29314,7 @@ 1 2 - 897968 + 898241 @@ -28502,7 +29330,7 @@ 1 2 - 897968 + 898241 @@ -28512,15 +29340,15 @@ expr_cond_false - 897972 + 898245 cond - 897972 + 898245 false - 897972 + 898245 @@ -28534,7 +29362,7 @@ 1 2 - 897972 + 898245 @@ -28550,7 +29378,7 @@ 1 2 - 897972 + 898245 @@ -28560,15 +29388,15 @@ values - 13541565 + 13547187 id - 13541565 + 13547187 str - 113909 + 113976 @@ -28582,7 +29410,7 @@ 1 2 - 13541565 + 13547187 @@ -28598,12 +29426,12 @@ 1 2 - 77855 + 77901 2 3 - 15207 + 15222 3 @@ -28613,12 +29441,12 @@ 6 52 - 8579 + 8584 52 - 682255 - 3429 + 682207 + 3431 @@ -28628,15 +29456,15 @@ valuetext - 6637657 + 6648929 id - 6637657 + 6648929 text - 1095316 + 1095328 @@ -28650,7 +29478,7 @@ 1 2 - 6637657 + 6648929 @@ -28666,22 +29494,22 @@ 1 2 - 833959 + 833960 2 3 - 146911 + 146908 3 7 - 86574 + 86573 7 - 593719 - 27872 + 593781 + 27887 @@ -28691,15 +29519,15 @@ valuebind - 13649715 + 13655401 val - 13541565 + 13547187 expr - 13649715 + 13655401 @@ -28713,12 +29541,12 @@ 1 2 - 13451407 + 13456977 2 6 - 90157 + 90210 @@ -28734,7 +29562,7 @@ 1 2 - 13649715 + 13655401 @@ -28744,15 +29572,15 @@ fieldoffsets - 1502766 + 1503222 id - 1502766 + 1503222 byteoffset - 31367 + 31377 bitoffset @@ -28770,7 +29598,7 @@ 1 2 - 1502766 + 1503222 @@ -28786,7 +29614,7 @@ 1 2 - 1502766 + 1503222 @@ -28802,22 +29630,22 @@ 1 2 - 17698 + 17704 2 3 - 2450 + 2451 3 5 - 2668 + 2669 5 12 - 2613 + 2614 12 @@ -28848,12 +29676,12 @@ 1 2 - 30333 + 30342 2 9 - 1034 + 1035 @@ -28950,19 +29778,19 @@ bitfield - 30240 + 29900 id - 30240 + 29900 bits - 3484 + 3445 declared_bits - 3484 + 3445 @@ -28976,7 +29804,7 @@ 1 2 - 30240 + 29900 @@ -28992,7 +29820,7 @@ 1 2 - 30240 + 29900 @@ -29008,42 +29836,42 @@ 1 2 - 995 + 984 2 3 - 746 + 738 3 4 - 248 + 246 4 5 - 497 + 492 5 7 - 248 + 246 8 9 - 248 + 246 9 11 - 248 + 246 13 143 - 248 + 246 @@ -29059,7 +29887,7 @@ 1 2 - 3484 + 3445 @@ -29075,42 +29903,42 @@ 1 2 - 995 + 984 2 3 - 746 + 738 3 4 - 248 + 246 4 5 - 497 + 492 5 7 - 248 + 246 8 9 - 248 + 246 9 11 - 248 + 246 13 143 - 248 + 246 @@ -29126,7 +29954,7 @@ 1 2 - 3484 + 3445 @@ -29136,23 +29964,23 @@ initialisers - 2245206 + 2245054 init - 2245206 + 2245054 var - 979091 + 979258 expr - 2245206 + 2245054 location - 515984 + 515871 @@ -29166,7 +29994,7 @@ 1 2 - 2245206 + 2245054 @@ -29182,7 +30010,7 @@ 1 2 - 2245206 + 2245054 @@ -29198,7 +30026,7 @@ 1 2 - 2245206 + 2245054 @@ -29214,17 +30042,17 @@ 1 2 - 869052 + 869246 2 15 - 37306 + 37296 16 25 - 72733 + 72715 @@ -29240,17 +30068,17 @@ 1 2 - 869052 + 869246 2 15 - 37306 + 37296 16 25 - 72733 + 72715 @@ -29266,7 +30094,7 @@ 1 2 - 979083 + 979250 2 @@ -29287,7 +30115,7 @@ 1 2 - 2245206 + 2245054 @@ -29303,7 +30131,7 @@ 1 2 - 2245206 + 2245054 @@ -29319,7 +30147,7 @@ 1 2 - 2245206 + 2245054 @@ -29335,22 +30163,22 @@ 1 2 - 414456 + 414351 2 3 - 33500 + 33491 3 13 - 41937 + 41935 13 111939 - 26090 + 26092 @@ -29366,17 +30194,17 @@ 1 2 - 443688 + 443577 2 3 - 34407 + 34398 3 12248 - 37889 + 37895 @@ -29392,22 +30220,22 @@ 1 2 - 414456 + 414351 2 3 - 33500 + 33491 3 13 - 41937 + 41935 13 111939 - 26090 + 26092 @@ -29417,26 +30245,26 @@ braced_initialisers - 67650 + 67182 init - 67650 + 67182 expr_ancestor - 1672548 + 1667337 exp - 1672548 + 1667337 ancestor - 837089 + 834481 @@ -29450,7 +30278,7 @@ 1 2 - 1672548 + 1667337 @@ -29466,17 +30294,17 @@ 1 2 - 17031 + 16978 2 3 - 810018 + 807494 3 19 - 10038 + 10007 @@ -29486,19 +30314,19 @@ exprs - 25213265 + 25220907 id - 25213265 + 25220907 kind - 1450 + 1451 location - 10586812 + 10590021 @@ -29512,7 +30340,7 @@ 1 2 - 25213265 + 25220907 @@ -29528,7 +30356,7 @@ 1 2 - 25213265 + 25220907 @@ -29706,22 +30534,22 @@ 1 2 - 8904645 + 8907344 2 3 - 820704 + 820953 3 16 - 797292 + 797534 16 71733 - 64169 + 64188 @@ -29737,17 +30565,17 @@ 1 2 - 9044064 + 9046805 2 3 - 774363 + 774598 3 32 - 768384 + 768617 @@ -29757,15 +30585,15 @@ expr_reuse - 844446 + 841815 reuse - 844446 + 841815 original - 844446 + 841815 value_category @@ -29783,7 +30611,7 @@ 1 2 - 844446 + 841815 @@ -29799,7 +30627,7 @@ 1 2 - 844446 + 841815 @@ -29815,7 +30643,7 @@ 1 2 - 844446 + 841815 @@ -29831,7 +30659,7 @@ 1 2 - 844446 + 841815 @@ -29883,15 +30711,15 @@ expr_types - 25213265 + 25220907 id - 25213265 + 25220907 typeid - 214227 + 214292 value_category @@ -29909,7 +30737,7 @@ 1 2 - 25213265 + 25220907 @@ -29925,7 +30753,7 @@ 1 2 - 25213265 + 25220907 @@ -29941,52 +30769,52 @@ 1 2 - 52518 + 52534 2 3 - 35195 + 35206 3 4 - 14509 + 14513 4 5 - 14531 + 14535 5 8 - 17564 + 17570 8 14 - 17388 + 17394 14 24 - 16443 + 16448 24 49 - 16069 + 16074 49 134 - 16179 + 16184 134 441492 - 13827 + 13831 @@ -30002,12 +30830,12 @@ 1 2 - 185935 + 185991 2 3 - 28292 + 28301 @@ -30070,15 +30898,15 @@ new_allocated_type - 45896 + 45504 expr - 45896 + 45504 type_id - 27213 + 38362 @@ -30092,7 +30920,7 @@ 1 2 - 45896 + 45504 @@ -30108,17 +30936,12 @@ 1 2 - 11440 + 36886 2 - 3 - 14385 - - - 3 19 - 1387 + 1475 @@ -30128,15 +30951,15 @@ new_array_allocated_type - 6632 + 6630 expr - 6632 + 6630 type_id - 2834 + 2833 @@ -30150,7 +30973,7 @@ 1 2 - 6632 + 6630 @@ -30171,7 +30994,7 @@ 2 3 - 2502 + 2501 3 @@ -30191,11 +31014,11 @@ param_ref_to_this - 24951 + 24973 expr - 24951 + 24973 @@ -31538,15 +32361,15 @@ condition_decl_bind - 407669 + 406399 expr - 407669 + 406399 decl - 407669 + 406399 @@ -31560,7 +32383,7 @@ 1 2 - 407669 + 406399 @@ -31576,7 +32399,7 @@ 1 2 - 407669 + 406399 @@ -31586,15 +32409,15 @@ typeid_bind - 47589 + 47141 expr - 47589 + 47141 type_id - 15840 + 15691 @@ -31608,7 +32431,7 @@ 1 2 - 47589 + 47141 @@ -31624,17 +32447,17 @@ 1 2 - 2944 + 2917 2 3 - 12489 + 12372 3 328 - 406 + 402 @@ -31644,15 +32467,15 @@ uuidof_bind - 26787 + 26780 expr - 26787 + 26780 type_id - 26536 + 26529 @@ -31666,7 +32489,7 @@ 1 2 - 26787 + 26780 @@ -31682,7 +32505,7 @@ 1 2 - 26325 + 26318 2 @@ -31697,15 +32520,15 @@ sizeof_bind - 241830 + 241971 expr - 241830 + 241971 type_id - 11145 + 11151 @@ -31719,7 +32542,7 @@ 1 2 - 241830 + 241971 @@ -31735,27 +32558,27 @@ 1 2 - 3855 + 3857 2 3 - 2750 + 2751 3 4 - 1018 + 1019 4 5 - 1104 + 1105 5 6 - 281 + 282 6 @@ -31765,7 +32588,7 @@ 7 42 - 851 + 852 42 @@ -31828,11 +32651,11 @@ lambdas - 18997 + 18992 expr - 18997 + 18992 default_capture @@ -31858,7 +32681,7 @@ 1 2 - 18997 + 18992 @@ -31874,7 +32697,7 @@ 1 2 - 18997 + 18992 @@ -31890,7 +32713,7 @@ 1 2 - 18997 + 18992 @@ -32074,15 +32897,15 @@ lambda_capture - 31864 + 31856 id - 31864 + 31856 lambda - 15442 + 15438 index @@ -32090,7 +32913,7 @@ field - 31864 + 31856 captured_by_reference @@ -32102,7 +32925,7 @@ location - 17887 + 17883 @@ -32116,7 +32939,7 @@ 1 2 - 31864 + 31856 @@ -32132,7 +32955,7 @@ 1 2 - 31864 + 31856 @@ -32148,7 +32971,7 @@ 1 2 - 31864 + 31856 @@ -32164,7 +32987,7 @@ 1 2 - 31864 + 31856 @@ -32180,7 +33003,7 @@ 1 2 - 31864 + 31856 @@ -32196,7 +33019,7 @@ 1 2 - 31864 + 31856 @@ -32212,12 +33035,12 @@ 1 2 - 8186 + 8184 2 3 - 3530 + 3529 3 @@ -32227,7 +33050,7 @@ 4 6 - 1255 + 1254 6 @@ -32248,12 +33071,12 @@ 1 2 - 8186 + 8184 2 3 - 3530 + 3529 3 @@ -32263,7 +33086,7 @@ 4 6 - 1255 + 1254 6 @@ -32284,12 +33107,12 @@ 1 2 - 8186 + 8184 2 3 - 3530 + 3529 3 @@ -32299,7 +33122,7 @@ 4 6 - 1255 + 1254 6 @@ -32320,7 +33143,7 @@ 1 2 - 14203 + 14199 2 @@ -32341,7 +33164,7 @@ 1 2 - 15320 + 15316 2 @@ -32362,12 +33185,12 @@ 1 2 - 8777 + 8775 2 3 - 3684 + 3683 3 @@ -32824,7 +33647,7 @@ 1 2 - 31864 + 31856 @@ -32840,7 +33663,7 @@ 1 2 - 31864 + 31856 @@ -32856,7 +33679,7 @@ 1 2 - 31864 + 31856 @@ -32872,7 +33695,7 @@ 1 2 - 31864 + 31856 @@ -32888,7 +33711,7 @@ 1 2 - 31864 + 31856 @@ -32904,7 +33727,7 @@ 1 2 - 31864 + 31856 @@ -33162,12 +33985,12 @@ 1 2 - 15644 + 15640 2 6 - 1433 + 1432 6 @@ -33188,7 +34011,7 @@ 1 2 - 16219 + 16215 2 @@ -33214,7 +34037,7 @@ 1 2 - 17199 + 17195 2 @@ -33235,12 +34058,12 @@ 1 2 - 15644 + 15640 2 6 - 1433 + 1432 6 @@ -33261,7 +34084,7 @@ 1 2 - 17863 + 17859 2 @@ -33282,7 +34105,7 @@ 1 2 - 17887 + 17883 @@ -33292,11 +34115,11 @@ fold - 1244 + 1261 expr - 1244 + 1261 operator @@ -33318,7 +34141,7 @@ 1 2 - 1244 + 1261 @@ -33334,7 +34157,7 @@ 1 2 - 1244 + 1261 @@ -33358,8 +34181,8 @@ 21 - 54 - 55 + 55 + 56 21 @@ -33390,8 +34213,8 @@ 12 - 58 - 59 + 59 + 60 21 @@ -33418,11 +34241,11 @@ stmts - 6349367 + 6347771 id - 6349367 + 6347771 kind @@ -33430,7 +34253,7 @@ location - 2676092 + 2675419 @@ -33444,7 +34267,7 @@ 1 2 - 6349367 + 6347771 @@ -33460,7 +34283,7 @@ 1 2 - 6349367 + 6347771 @@ -33698,22 +34521,22 @@ 1 2 - 2218046 + 2217489 2 3 - 181655 + 181609 3 10 - 201535 + 201484 10 1789 - 74855 + 74836 @@ -33729,12 +34552,12 @@ 1 2 - 2593391 + 2592739 2 10 - 82701 + 82680 @@ -33899,15 +34722,15 @@ if_then - 990319 + 990619 if_stmt - 990319 + 990619 then_id - 990319 + 990619 @@ -33921,7 +34744,7 @@ 1 2 - 990319 + 990619 @@ -33937,7 +34760,7 @@ 1 2 - 990319 + 990619 @@ -33947,15 +34770,15 @@ if_else - 435769 + 434390 if_stmt - 435769 + 434390 else_id - 435769 + 434390 @@ -33969,7 +34792,7 @@ 1 2 - 435769 + 434390 @@ -33985,7 +34808,7 @@ 1 2 - 435769 + 434390 @@ -34043,15 +34866,15 @@ constexpr_if_then - 105781 + 103482 constexpr_if_stmt - 105781 + 103482 then_id - 105781 + 103482 @@ -34065,7 +34888,7 @@ 1 2 - 105781 + 103482 @@ -34081,7 +34904,7 @@ 1 2 - 105781 + 103482 @@ -34091,15 +34914,15 @@ constexpr_if_else - 75913 + 74197 constexpr_if_stmt - 75913 + 74197 else_id - 75913 + 74197 @@ -34113,7 +34936,7 @@ 1 2 - 75913 + 74197 @@ -34129,7 +34952,7 @@ 1 2 - 75913 + 74197 @@ -34235,15 +35058,15 @@ while_body - 39652 + 39664 while_stmt - 39652 + 39664 body_id - 39652 + 39664 @@ -34257,7 +35080,7 @@ 1 2 - 39652 + 39664 @@ -34273,7 +35096,7 @@ 1 2 - 39652 + 39664 @@ -34283,15 +35106,15 @@ do_body - 232290 + 232426 do_stmt - 232290 + 232426 body_id - 232290 + 232426 @@ -34305,7 +35128,7 @@ 1 2 - 232290 + 232426 @@ -34321,7 +35144,7 @@ 1 2 - 232290 + 232426 @@ -34379,19 +35202,19 @@ switch_case - 833592 + 830953 switch_stmt - 410607 + 409307 index - 386 + 384 case_id - 833592 + 830953 @@ -34410,12 +35233,12 @@ 2 3 - 407733 + 406441 3 19 - 2852 + 2844 @@ -34436,12 +35259,12 @@ 2 3 - 407733 + 406441 3 19 - 2852 + 2844 @@ -34457,7 +35280,7 @@ 5 6 - 150 + 149 10 @@ -34505,13 +35328,13 @@ 21 - 19141 - 19142 + 19140 + 19141 21 - 19142 - 19143 + 19141 + 19142 21 @@ -34528,7 +35351,7 @@ 5 6 - 150 + 149 10 @@ -34576,13 +35399,13 @@ 21 - 19141 - 19142 + 19140 + 19141 21 - 19142 - 19143 + 19141 + 19142 21 @@ -34599,7 +35422,7 @@ 1 2 - 833592 + 830953 @@ -34615,7 +35438,7 @@ 1 2 - 833592 + 830953 @@ -34625,15 +35448,15 @@ switch_body - 410607 + 409307 switch_stmt - 410607 + 409307 body_id - 410607 + 409307 @@ -34647,7 +35470,7 @@ 1 2 - 410607 + 409307 @@ -34663,7 +35486,7 @@ 1 2 - 410607 + 409307 @@ -34673,15 +35496,15 @@ for_initialization - 73253 + 73276 for_stmt - 73253 + 73276 init_id - 73253 + 73276 @@ -34695,7 +35518,7 @@ 1 2 - 73253 + 73276 @@ -34711,7 +35534,7 @@ 1 2 - 73253 + 73276 @@ -34721,15 +35544,15 @@ for_condition - 76349 + 76372 for_stmt - 76349 + 76372 condition_id - 76349 + 76372 @@ -34743,7 +35566,7 @@ 1 2 - 76349 + 76372 @@ -34759,7 +35582,7 @@ 1 2 - 76349 + 76372 @@ -34769,15 +35592,15 @@ for_update - 73394 + 73416 for_stmt - 73394 + 73416 update_id - 73394 + 73416 @@ -34791,7 +35614,7 @@ 1 2 - 73394 + 73416 @@ -34807,7 +35630,7 @@ 1 2 - 73394 + 73416 @@ -34817,15 +35640,15 @@ for_body - 84398 + 84423 for_stmt - 84398 + 84423 body_id - 84398 + 84423 @@ -34839,7 +35662,7 @@ 1 2 - 84398 + 84423 @@ -34855,7 +35678,7 @@ 1 2 - 84398 + 84423 @@ -34865,19 +35688,19 @@ stmtparents - 5610809 + 5609399 id - 5610809 + 5609399 index - 15725 + 15721 parent - 2374243 + 2373646 @@ -34891,7 +35714,7 @@ 1 2 - 5610809 + 5609399 @@ -34907,7 +35730,7 @@ 1 2 - 5610809 + 5609399 @@ -34923,7 +35746,7 @@ 1 2 - 5166 + 5165 2 @@ -34938,7 +35761,7 @@ 4 5 - 2000 + 1999 7 @@ -34958,7 +35781,7 @@ 29 39 - 1182 + 1181 42 @@ -34984,7 +35807,7 @@ 1 2 - 5166 + 5165 2 @@ -34999,7 +35822,7 @@ 4 5 - 2000 + 1999 7 @@ -35019,7 +35842,7 @@ 29 39 - 1182 + 1181 42 @@ -35045,32 +35868,32 @@ 1 2 - 1355019 + 1354678 2 3 - 515733 + 515604 3 4 - 151038 + 151000 4 6 - 155232 + 155193 6 16 - 178303 + 178258 16 1943 - 18916 + 18911 @@ -35086,32 +35909,32 @@ 1 2 - 1355019 + 1354678 2 3 - 515733 + 515604 3 4 - 151038 + 151000 4 6 - 155232 + 155193 6 16 - 178303 + 178258 16 1943 - 18916 + 18911 @@ -35121,22 +35944,22 @@ ishandler - 43224 + 43039 block - 43224 + 43039 stmt_decl_bind - 723577 + 723395 stmt - 713042 + 712862 num @@ -35144,7 +35967,7 @@ decl - 723577 + 723395 @@ -35158,12 +35981,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35179,12 +36002,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35312,7 +36135,7 @@ 1 2 - 723577 + 723395 @@ -35328,7 +36151,7 @@ 1 2 - 723577 + 723395 @@ -35338,11 +36161,11 @@ stmt_decl_entry_bind - 723577 + 723395 stmt - 713042 + 712862 num @@ -35350,7 +36173,7 @@ decl_entry - 723577 + 723395 @@ -35364,12 +36187,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35385,12 +36208,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35518,7 +36341,7 @@ 1 2 - 723577 + 723395 @@ -35534,7 +36357,7 @@ 1 2 - 723577 + 723395 @@ -35544,15 +36367,15 @@ blockscope - 1640355 + 1618065 block - 1640355 + 1618065 enclosing - 1423690 + 1404210 @@ -35566,7 +36389,7 @@ 1 2 - 1640355 + 1618065 @@ -35582,17 +36405,17 @@ 1 2 - 1291402 + 1273657 2 4 - 116981 + 115417 4 29 - 15307 + 15134 @@ -35602,19 +36425,19 @@ jumpinfo - 348211 + 348317 id - 348211 + 348317 str - 28939 + 28948 target - 72683 + 72705 @@ -35628,7 +36451,7 @@ 1 2 - 348211 + 348317 @@ -35644,7 +36467,7 @@ 1 2 - 348211 + 348317 @@ -35660,17 +36483,17 @@ 2 3 - 13592 + 13596 3 4 - 6056 + 6058 4 5 - 2013 + 2014 5 @@ -35685,7 +36508,7 @@ 10 25 - 2188 + 2189 25 @@ -35706,17 +36529,17 @@ 1 2 - 23183 + 23190 2 3 - 3625 + 3626 3 3321 - 2130 + 2131 @@ -35737,27 +36560,27 @@ 2 3 - 36199 + 36210 3 4 - 17627 + 17633 4 5 - 7376 + 7379 5 8 - 6416 + 6418 8 2124 - 5029 + 5030 @@ -35773,7 +36596,7 @@ 1 2 - 72683 + 72705 @@ -35783,19 +36606,19 @@ preprocdirects - 5395215 + 5334448 id - 5395215 + 5334448 kind - 1368 + 1353 location - 5392104 + 5331372 @@ -35809,7 +36632,7 @@ 1 2 - 5395215 + 5334448 @@ -35825,7 +36648,7 @@ 1 2 - 5395215 + 5334448 @@ -35841,57 +36664,57 @@ 1 2 - 124 + 123 139 140 - 124 + 123 805 806 - 124 + 123 880 881 - 124 + 123 973 974 - 124 + 123 1509 1510 - 124 + 123 1883 1884 - 124 + 123 3256 3257 - 124 + 123 4737 4738 - 124 + 123 7126 7127 - 124 + 123 22044 22045 - 124 + 123 @@ -35907,57 +36730,57 @@ 1 2 - 124 + 123 139 140 - 124 + 123 805 806 - 124 + 123 880 881 - 124 + 123 973 974 - 124 + 123 1509 1510 - 124 + 123 1883 1884 - 124 + 123 3256 3257 - 124 + 123 4737 4738 - 124 + 123 7126 7127 - 124 + 123 22019 22020 - 124 + 123 @@ -35973,12 +36796,12 @@ 1 2 - 5391979 + 5331249 26 27 - 124 + 123 @@ -35994,7 +36817,7 @@ 1 2 - 5392104 + 5331372 @@ -36004,15 +36827,15 @@ preprocpair - 1138454 + 1125632 begin - 886819 + 876831 elseelifend - 1138454 + 1125632 @@ -36026,17 +36849,17 @@ 1 2 - 648003 + 640704 2 3 - 229856 + 227267 3 9 - 8960 + 8859 @@ -36052,7 +36875,7 @@ 1 2 - 1138454 + 1125632 @@ -36062,41 +36885,41 @@ preproctrue - 438183 + 433247 branch - 438183 + 433247 preprocfalse - 284613 + 281408 branch - 284613 + 281408 preproctext - 4341759 + 4292857 id - 4341759 + 4292857 head - 2947935 + 2914733 body - 1679307 + 1660393 @@ -36110,7 +36933,7 @@ 1 2 - 4341759 + 4292857 @@ -36126,7 +36949,7 @@ 1 2 - 4341759 + 4292857 @@ -36142,12 +36965,12 @@ 1 2 - 2749813 + 2718842 2 798 - 198122 + 195890 @@ -36163,12 +36986,12 @@ 1 2 - 2866919 + 2834629 2 5 - 81015 + 80103 @@ -36184,17 +37007,17 @@ 1 2 - 1531463 + 1514214 2 10 - 126937 + 125507 10 13605 - 20907 + 20671 @@ -36210,17 +37033,17 @@ 1 2 - 1535694 + 1518397 2 12 - 126564 + 125138 12 3246 - 17049 + 16857 @@ -36230,15 +37053,15 @@ includes - 317338 + 316291 id - 317338 + 316291 included - 58456 + 58263 @@ -36252,7 +37075,7 @@ 1 2 - 317338 + 316291 @@ -36268,37 +37091,37 @@ 1 2 - 28928 + 28832 2 3 - 9404 + 9373 3 4 - 4933 + 4917 4 6 - 5333 + 5315 6 11 - 4502 + 4487 11 47 - 4386 + 4372 47 793 - 967 + 964 @@ -36356,15 +37179,15 @@ link_targets - 816 + 817 id - 816 + 817 binary - 816 + 817 @@ -36378,7 +37201,7 @@ 1 2 - 816 + 817 @@ -36394,7 +37217,7 @@ 1 2 - 816 + 817 @@ -36404,15 +37227,15 @@ link_parent - 30225171 + 30703622 element - 3843767 + 3901314 link_target - 338 + 335 @@ -36426,17 +37249,17 @@ 1 2 - 527070 + 531771 2 9 - 26773 + 26990 9 10 - 3289924 + 3342551 @@ -36455,48 +37278,48 @@ 33 - 97457 - 97458 + 99949 + 99950 33 - 97576 - 97577 + 100069 + 100070 33 - 97629 - 97630 + 100127 + 100128 33 - 97656 - 97657 + 100148 + 100149 33 - 97678 - 97679 + 100170 + 100171 33 - 97710 - 97711 + 100212 + 100213 33 - 99717 - 99718 + 102215 + 102216 33 - 103097 - 103098 + 105685 + 105686 33 - 104463 - 104464 + 107152 + 107153 33 diff --git a/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/old.dbscheme b/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/old.dbscheme new file mode 100644 index 000000000000..770002bb0232 --- /dev/null +++ b/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/old.dbscheme @@ -0,0 +1,2545 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..837c4e02326a --- /dev/null +++ b/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/semmlecode.cpp.dbscheme @@ -0,0 +1,2561 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int variable_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int variable_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/upgrade.properties b/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/upgrade.properties new file mode 100644 index 000000000000..dca5d95a2eec --- /dev/null +++ b/cpp/ql/lib/upgrades/770002bb02322e04fa25345838ce6e82af285a0b/upgrade.properties @@ -0,0 +1,2 @@ +description: Support alias templates +compatibility: backwards diff --git a/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/old.dbscheme b/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/old.dbscheme new file mode 100644 index 000000000000..837c4e02326a --- /dev/null +++ b/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/old.dbscheme @@ -0,0 +1,2561 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int variable_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int variable_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..ef8d209a22e2 --- /dev/null +++ b/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/semmlecode.cpp.dbscheme @@ -0,0 +1,2577 @@ + +/*- Compilations -*/ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : 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 +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- C++ dbscheme -*/ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +/** + * Gives the TRAP filename that `trap` is associated with. + * For debugging only. + */ +trap_filename( + int trap: @trap, + string filename: string ref +); + +/** + * Gives the tag name for `tag`. + * For debugging only. + */ +tag_name( + int tag: @tag, + string name: string ref +); + +@trap_or_tag = @tag | @trap; + +/** + * Gives the name for the source file. + */ +source_file_name( + int sf: @source_file, + string name: string ref +); + +/** + * In `build-mode: none` overlay mode, indicates that `source_file` + * (`/path/to/foo.c`) uses the TRAP file `trap_file`; i.e. it is the + * TRAP file corresponding to `foo.c`, something it transitively + * includes, or a template instantiation it transitively uses. + */ +source_file_uses_trap( + int source_file: @source_file ref, + int trap_file: @trap ref +); + +/** + * In `build-mode: none` overlay mode, indicates that the TRAP file + * `trap_file` uses tag `tag`. + */ +trap_uses_tag( + int trap_file: @trap ref, + int tag: @tag ref +); + +/** + * Holds if there is a definition of `element` in TRAP file or tag `t`. + */ +in_trap_or_tag( + int element: @element ref, + int t: @trap_or_tag ref +); + +pch_uses( + int pch: @pch ref, + int compilation: @compilation ref, + int id: @file ref +) + +#keyset[pch, compilation] +pch_creations( + int pch: @pch, + int compilation: @compilation ref, + int from: @file ref +) + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location_default ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +case @function.kind of + 0 = @unknown_function +| 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +// ... 6 = @builtin_function deprecated // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +builtin_functions( + int id: @function ref +) + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +/* +case @fun_requires.kind of + 1 = @template_attached +| 2 = @function_attached +; +*/ + +fun_requires( + int id: @fun_decl ref, + int kind: int ref, + int constraint: @expr ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_specialized(int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); +var_requires( + int id: @var_decl ref, + int constraint: @expr ref +); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); +type_requires( + int id: @type_decl ref, + int constraint: @expr ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +// ... 40 _Decimal32 +// ... 41 _Decimal64 +// ... 42 _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +| 62 = @mfp8 // __mfp8 +| 63 = @scalable_vector_count // __SVCount_t +| 64 = @complex_fp16 // _Complex __fp16 +| 65 = @complex_std_bfloat16 // _Complex __bf16 +| 66 = @complex_std_float16 // _Complex std::float16_t +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +| 11 = @scalable_vector // Arm SVE +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +tupleelements( + unique int id: @derivedtype ref, + int num_elements: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual` + * operator taking an expression as its argument. For example: + * ``` + * int a; + * decltype(1+a) b; + * typeof(1+a) c; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * changes the semantics of the decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ + +/* +case @decltype.kind of +| 0 = @decltype +| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +; +*/ + +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int kind: int ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +case @type_operator.kind of + 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual +| 1 = @underlying_type +| 2 = @bases +| 3 = @direct_bases +| 4 = @add_lvalue_reference +| 5 = @add_pointer +| 6 = @add_rvalue_reference +| 7 = @decay +| 8 = @make_signed +| 9 = @make_unsigned +| 10 = @remove_all_extents +| 11 = @remove_const +| 12 = @remove_cv +| 13 = @remove_cvref +| 14 = @remove_extent +| 15 = @remove_pointer +| 16 = @remove_reference_t +| 17 = @remove_restrict +| 18 = @remove_volatile +| 19 = @remove_reference +; + +type_operators( + unique int id: @type_operator, + int arg_type: @type ref, + int kind: int ref, + int base_type: @type ref +) + +case @usertype.kind of + 0 = @unknown_usertype +| 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +// ... 5 = @typedef deprecated // classic C: typedef typedef type name +// ... 6 = @template deprecated +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +// ... 14 = @using_alias deprecated // a using name = type style typedef +| 15 = @template_struct +| 16 = @template_class +| 17 = @template_union +| 18 = @alias +; + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +/* +case @usertype.alias_kind of +| 0 = @typedef +| 1 = @alias +*/ + +usertype_alias_kind( + int id: @usertype ref, + int alias_kind: int ref +) + +nontype_template_parameters( + int id: @expr ref +); + +type_template_type_constraint( + int id: @usertype ref, + int constraint: @expr ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); +class_template_generated_from( + unique int template: @usertype ref, + int from: @usertype ref +) + +@user_or_decltype = @usertype | @decltype; + +is_proxy_class_for( + unique int id: @usertype ref, + int templ_param_id: @user_or_decltype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location_default ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); +function_template_generated_from( + unique int template: @function ref, + int from: @function ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); +variable_template_generated_from( + unique int template: @variable ref, + int from: @variable ref +); + +is_alias_template(unique int id: @usertype ref); +alias_instantiation( + unique int to: @usertype ref, + int from: @usertype ref +); +alias_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +alias_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); +alias_template_generated_from( + unique int template: @usertype ref, + int from: @usertype ref +); + +template_template_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +template_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +template_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +@concept = @concept_template | @concept_id; + +concept_templates( + unique int concept_id: @concept_template, + string name: string ref, + int location: @location_default ref +); +concept_instantiation( + unique int to: @concept_id ref, + int from: @concept_template ref +); +is_type_constraint(int concept_id: @concept_id ref); +concept_template_argument( + int concept_id: @concept ref, + int index: int ref, + int arg_type: @type ref +); +concept_template_argument_value( + int concept_id: @concept ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +namespaceattributes( + int namespace_id: @namespace ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + | @routinetype + | @ptrtomember + | @decltype + | @type_operator; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl + | @concept_template; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype + | @decltype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_default ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_default ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +| 394 = @isinvocable +| 395 = @isnothrowinvocable +| 396 = @isbitwisecloneable +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + | @isinvocable + | @isnothrowinvocable + | @isbitwisecloneable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +param_ref_to_this( + int expr: @param_ref ref +) + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref, + boolean is_designated: boolean ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref, + boolean is_designated: boolean ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack; + +sizeof_bind( + unique int expr: @sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref, + boolean has_explicit_parameter_list: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_default ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +| 38 = @stmt_consteval_if +| 39 = @stmt_not_consteval_if +| 40 = @stmt_leave +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +type_is_vla(unique int type_id: @derivedtype ref) + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if; + +consteval_if_then( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int then_id: @stmt ref +); + +consteval_if_else( + unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue | @stmt_leave; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 14 = @ppd_ms_import +| 15 = @ppd_elifdef +| 16 = @ppd_elifndef +| 17 = @ppd_embed +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +embeds( + unique int id: @ppd_embed ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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; diff --git a/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/upgrade.properties b/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/upgrade.properties new file mode 100644 index 000000000000..4cda5136f03d --- /dev/null +++ b/cpp/ql/lib/upgrades/837c4e02326aee4582405d069263092e80a15d82/upgrade.properties @@ -0,0 +1,2 @@ +description: Capture information about one template being generated from another +compatibility: backwards diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 901d20922831..e8a2af1383cc 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.4 + +No user-facing changes. + ## 1.6.3 ### Minor Analysis Improvements diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll index f0876800874c..f98b295cb74e 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll @@ -44,10 +44,7 @@ class ExternalApiDataNode extends DataFlow::Node { /** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { - exists(RemoteFlowSourceFunction remoteFlow | - remoteFlow = source.asExpr().(Call).getTarget() and - remoteFlow.hasRemoteFlowSource(_, _) - ) + any(RemoteFlowSourceFunction remoteFlow).hasRemoteFlowSource(source.asExpr(), _, _) } predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql index 392650022e20..207aec189b2e 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql @@ -94,9 +94,8 @@ class Recv extends SendRecv instanceof RemoteFlowSourceFunction { } override Expr getDataExpr(Call call) { - call.getTarget() = this and exists(FunctionOutput output, int arg | - super.hasRemoteFlowSource(output, _) and + super.hasRemoteFlowSource(call, output, _) and output.isParameterDeref(arg) and result = call.getArgument(arg) ) diff --git a/cpp/ql/src/change-notes/released/1.6.4.md b/cpp/ql/src/change-notes/released/1.6.4.md new file mode 100644 index 000000000000..5c811dc46384 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.6.4.md @@ -0,0 +1,3 @@ +## 1.6.4 + +No user-facing changes. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 00b51441d882..1910e09d6a6a 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.3 +lastReleaseVersion: 1.6.4 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index a57263b53fc5..7f3df37c30a1 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.6.3 +version: 1.6.5-dev groups: - cpp - queries diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/constant-size/ConstantSizeArrayOffByOne.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/constant-size/ConstantSizeArrayOffByOne.expected index a9927b510930..a4c154c06940 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/constant-size/ConstantSizeArrayOffByOne.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/constant-size/ConstantSizeArrayOffByOne.expected @@ -21,11 +21,7 @@ edges | test.cpp:85:21:85:36 | buf | test.cpp:87:5:87:31 | access to array | provenance | Config | | test.cpp:85:21:85:36 | buf | test.cpp:88:5:88:27 | access to array | provenance | Config | | test.cpp:85:34:85:36 | buf | test.cpp:85:21:85:36 | buf | provenance | | -| test.cpp:92:9:92:11 | definition of arr | test.cpp:96:13:96:18 | access to array | provenance | Config | | test.cpp:96:13:96:15 | arr | test.cpp:96:13:96:18 | access to array | provenance | Config | -| test.cpp:102:9:102:11 | definition of arr | test.cpp:111:17:111:22 | access to array | provenance | Config | -| test.cpp:102:9:102:11 | definition of arr | test.cpp:115:35:115:40 | access to array | provenance | Config | -| test.cpp:102:9:102:11 | definition of arr | test.cpp:119:17:119:22 | access to array | provenance | Config | | test.cpp:111:17:111:19 | arr | test.cpp:111:17:111:22 | access to array | provenance | Config | | test.cpp:111:17:111:19 | arr | test.cpp:115:35:115:40 | access to array | provenance | Config | | test.cpp:111:17:111:19 | arr | test.cpp:119:17:119:22 | access to array | provenance | Config | @@ -35,55 +31,41 @@ edges | test.cpp:119:17:119:19 | arr | test.cpp:111:17:111:22 | access to array | provenance | Config | | test.cpp:119:17:119:19 | arr | test.cpp:115:35:115:40 | access to array | provenance | Config | | test.cpp:119:17:119:19 | arr | test.cpp:119:17:119:22 | access to array | provenance | Config | -| test.cpp:125:11:125:13 | definition of arr | test.cpp:128:9:128:14 | access to array | provenance | Config | | test.cpp:128:9:128:11 | arr | test.cpp:128:9:128:14 | access to array | provenance | Config | | test.cpp:134:25:134:27 | arr | test.cpp:136:9:136:16 | ... += ... | provenance | Config | | test.cpp:136:9:136:16 | ... += ... | test.cpp:136:9:136:16 | ... += ... | provenance | | | test.cpp:136:9:136:16 | ... += ... | test.cpp:138:13:138:15 | arr | provenance | | -| test.cpp:142:10:142:13 | definition of asdf | test.cpp:143:18:143:21 | asdf | provenance | | | test.cpp:143:18:143:21 | asdf | test.cpp:134:25:134:27 | arr | provenance | | | test.cpp:143:18:143:21 | asdf | test.cpp:143:18:143:21 | asdf | provenance | | | test.cpp:146:26:146:26 | *p | test.cpp:147:4:147:9 | -- ... | provenance | | | test.cpp:146:26:146:26 | *p | test.cpp:147:4:147:9 | -- ... | provenance | | -| test.cpp:154:7:154:9 | definition of buf | test.cpp:156:12:156:18 | ... + ... | provenance | Config | | test.cpp:156:12:156:14 | buf | test.cpp:156:12:156:18 | ... + ... | provenance | Config | | test.cpp:156:12:156:18 | ... + ... | test.cpp:156:12:156:18 | ... + ... | provenance | | | test.cpp:156:12:156:18 | ... + ... | test.cpp:158:17:158:18 | *& ... | provenance | | | test.cpp:158:17:158:18 | *& ... | test.cpp:146:26:146:26 | *p | provenance | | -| test.cpp:217:19:217:24 | definition of buffer | test.cpp:218:16:218:28 | buffer | provenance | | | test.cpp:218:16:218:28 | buffer | test.cpp:220:5:220:11 | access to array | provenance | Config | | test.cpp:218:16:218:28 | buffer | test.cpp:221:5:221:11 | access to array | provenance | Config | | test.cpp:218:23:218:28 | buffer | test.cpp:218:16:218:28 | buffer | provenance | | -| test.cpp:228:10:228:14 | definition of array | test.cpp:229:17:229:29 | array | provenance | | | test.cpp:229:17:229:29 | array | test.cpp:231:5:231:10 | access to array | provenance | Config | | test.cpp:229:17:229:29 | array | test.cpp:232:5:232:10 | access to array | provenance | Config | | test.cpp:229:25:229:29 | array | test.cpp:229:17:229:29 | array | provenance | | | test.cpp:245:30:245:30 | p | test.cpp:261:27:261:30 | access to array | provenance | Config | | test.cpp:245:30:245:30 | p | test.cpp:261:27:261:30 | access to array | provenance | Config | -| test.cpp:273:19:273:25 | definition of buffer3 | test.cpp:274:14:274:20 | buffer3 | provenance | | | test.cpp:274:14:274:20 | buffer3 | test.cpp:245:30:245:30 | p | provenance | | | test.cpp:274:14:274:20 | buffer3 | test.cpp:274:14:274:20 | buffer3 | provenance | | | test.cpp:277:35:277:35 | p | test.cpp:278:14:278:14 | p | provenance | | | test.cpp:278:14:278:14 | p | test.cpp:245:30:245:30 | p | provenance | | -| test.cpp:282:19:282:25 | definition of buffer1 | test.cpp:283:19:283:25 | buffer1 | provenance | | | test.cpp:283:19:283:25 | buffer1 | test.cpp:277:35:277:35 | p | provenance | | | test.cpp:283:19:283:25 | buffer1 | test.cpp:283:19:283:25 | buffer1 | provenance | | -| test.cpp:285:19:285:25 | definition of buffer2 | test.cpp:286:19:286:25 | buffer2 | provenance | | | test.cpp:286:19:286:25 | buffer2 | test.cpp:277:35:277:35 | p | provenance | | | test.cpp:286:19:286:25 | buffer2 | test.cpp:286:19:286:25 | buffer2 | provenance | | -| test.cpp:288:19:288:25 | definition of buffer3 | test.cpp:289:19:289:25 | buffer3 | provenance | | | test.cpp:289:19:289:25 | buffer3 | test.cpp:277:35:277:35 | p | provenance | | | test.cpp:289:19:289:25 | buffer3 | test.cpp:289:19:289:25 | buffer3 | provenance | | | test.cpp:292:25:292:27 | arr | test.cpp:299:16:299:21 | access to array | provenance | Config | -| test.cpp:305:9:305:12 | definition of arr1 | test.cpp:306:20:306:23 | arr1 | provenance | | | test.cpp:306:20:306:23 | arr1 | test.cpp:292:25:292:27 | arr | provenance | | | test.cpp:306:20:306:23 | arr1 | test.cpp:306:20:306:23 | arr1 | provenance | | -| test.cpp:308:9:308:12 | definition of arr2 | test.cpp:309:20:309:23 | arr2 | provenance | | | test.cpp:309:20:309:23 | arr2 | test.cpp:292:25:292:27 | arr | provenance | | | test.cpp:309:20:309:23 | arr2 | test.cpp:309:20:309:23 | arr2 | provenance | | -| test.cpp:314:10:314:13 | definition of temp | test.cpp:319:19:319:27 | ... + ... | provenance | Config | -| test.cpp:314:10:314:13 | definition of temp | test.cpp:322:19:322:27 | ... + ... | provenance | Config | -| test.cpp:314:10:314:13 | definition of temp | test.cpp:324:23:324:32 | ... + ... | provenance | Config | | test.cpp:319:13:319:27 | ... = ... | test.cpp:325:24:325:26 | end | provenance | | | test.cpp:319:19:319:22 | temp | test.cpp:319:19:319:27 | ... + ... | provenance | Config | | test.cpp:319:19:319:22 | temp | test.cpp:324:23:324:32 | ... + ... | provenance | Config | @@ -133,40 +115,33 @@ nodes | test.cpp:85:34:85:36 | buf | semmle.label | buf | | test.cpp:87:5:87:31 | access to array | semmle.label | access to array | | test.cpp:88:5:88:27 | access to array | semmle.label | access to array | -| test.cpp:92:9:92:11 | definition of arr | semmle.label | definition of arr | | test.cpp:96:13:96:15 | arr | semmle.label | arr | | test.cpp:96:13:96:18 | access to array | semmle.label | access to array | -| test.cpp:102:9:102:11 | definition of arr | semmle.label | definition of arr | | test.cpp:111:17:111:19 | arr | semmle.label | arr | | test.cpp:111:17:111:22 | access to array | semmle.label | access to array | | test.cpp:115:35:115:37 | arr | semmle.label | arr | | test.cpp:115:35:115:40 | access to array | semmle.label | access to array | | test.cpp:119:17:119:19 | arr | semmle.label | arr | | test.cpp:119:17:119:22 | access to array | semmle.label | access to array | -| test.cpp:125:11:125:13 | definition of arr | semmle.label | definition of arr | | test.cpp:128:9:128:11 | arr | semmle.label | arr | | test.cpp:128:9:128:14 | access to array | semmle.label | access to array | | test.cpp:134:25:134:27 | arr | semmle.label | arr | | test.cpp:136:9:136:16 | ... += ... | semmle.label | ... += ... | | test.cpp:136:9:136:16 | ... += ... | semmle.label | ... += ... | | test.cpp:138:13:138:15 | arr | semmle.label | arr | -| test.cpp:142:10:142:13 | definition of asdf | semmle.label | definition of asdf | | test.cpp:143:18:143:21 | asdf | semmle.label | asdf | | test.cpp:143:18:143:21 | asdf | semmle.label | asdf | | test.cpp:146:26:146:26 | *p | semmle.label | *p | | test.cpp:147:4:147:9 | -- ... | semmle.label | -- ... | | test.cpp:147:4:147:9 | -- ... | semmle.label | -- ... | -| test.cpp:154:7:154:9 | definition of buf | semmle.label | definition of buf | | test.cpp:156:12:156:14 | buf | semmle.label | buf | | test.cpp:156:12:156:18 | ... + ... | semmle.label | ... + ... | | test.cpp:156:12:156:18 | ... + ... | semmle.label | ... + ... | | test.cpp:158:17:158:18 | *& ... | semmle.label | *& ... | -| test.cpp:217:19:217:24 | definition of buffer | semmle.label | definition of buffer | | test.cpp:218:16:218:28 | buffer | semmle.label | buffer | | test.cpp:218:23:218:28 | buffer | semmle.label | buffer | | test.cpp:220:5:220:11 | access to array | semmle.label | access to array | | test.cpp:221:5:221:11 | access to array | semmle.label | access to array | -| test.cpp:228:10:228:14 | definition of array | semmle.label | definition of array | | test.cpp:229:17:229:29 | array | semmle.label | array | | test.cpp:229:25:229:29 | array | semmle.label | array | | test.cpp:231:5:231:10 | access to array | semmle.label | access to array | @@ -174,29 +149,22 @@ nodes | test.cpp:245:30:245:30 | p | semmle.label | p | | test.cpp:245:30:245:30 | p | semmle.label | p | | test.cpp:261:27:261:30 | access to array | semmle.label | access to array | -| test.cpp:273:19:273:25 | definition of buffer3 | semmle.label | definition of buffer3 | | test.cpp:274:14:274:20 | buffer3 | semmle.label | buffer3 | | test.cpp:274:14:274:20 | buffer3 | semmle.label | buffer3 | | test.cpp:277:35:277:35 | p | semmle.label | p | | test.cpp:278:14:278:14 | p | semmle.label | p | -| test.cpp:282:19:282:25 | definition of buffer1 | semmle.label | definition of buffer1 | | test.cpp:283:19:283:25 | buffer1 | semmle.label | buffer1 | | test.cpp:283:19:283:25 | buffer1 | semmle.label | buffer1 | -| test.cpp:285:19:285:25 | definition of buffer2 | semmle.label | definition of buffer2 | | test.cpp:286:19:286:25 | buffer2 | semmle.label | buffer2 | | test.cpp:286:19:286:25 | buffer2 | semmle.label | buffer2 | -| test.cpp:288:19:288:25 | definition of buffer3 | semmle.label | definition of buffer3 | | test.cpp:289:19:289:25 | buffer3 | semmle.label | buffer3 | | test.cpp:289:19:289:25 | buffer3 | semmle.label | buffer3 | | test.cpp:292:25:292:27 | arr | semmle.label | arr | | test.cpp:299:16:299:21 | access to array | semmle.label | access to array | -| test.cpp:305:9:305:12 | definition of arr1 | semmle.label | definition of arr1 | | test.cpp:306:20:306:23 | arr1 | semmle.label | arr1 | | test.cpp:306:20:306:23 | arr1 | semmle.label | arr1 | -| test.cpp:308:9:308:12 | definition of arr2 | semmle.label | definition of arr2 | | test.cpp:309:20:309:23 | arr2 | semmle.label | arr2 | | test.cpp:309:20:309:23 | arr2 | semmle.label | arr2 | -| test.cpp:314:10:314:13 | definition of temp | semmle.label | definition of temp | | test.cpp:319:13:319:27 | ... = ... | semmle.label | ... = ... | | test.cpp:319:19:319:22 | temp | semmle.label | temp | | test.cpp:319:19:319:27 | ... + ... | semmle.label | ... + ... | @@ -221,25 +189,14 @@ subpaths | test.cpp:72:5:72:15 | PointerAdd: access to array | test.cpp:79:32:79:34 | buf | test.cpp:72:5:72:15 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:15:9:15:11 | buf | buf | test.cpp:72:5:72:19 | Store: ... = ... | write | | test.cpp:77:27:77:44 | PointerAdd: access to array | test.cpp:77:32:77:34 | buf | test.cpp:66:32:66:32 | p | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:15:9:15:11 | buf | buf | test.cpp:67:5:67:10 | Store: ... = ... | write | | test.cpp:88:5:88:27 | PointerAdd: access to array | test.cpp:85:34:85:36 | buf | test.cpp:88:5:88:27 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:15:9:15:11 | buf | buf | test.cpp:88:5:88:31 | Store: ... = ... | write | -| test.cpp:128:9:128:14 | PointerAdd: access to array | test.cpp:125:11:125:13 | definition of arr | test.cpp:128:9:128:14 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:125:11:125:13 | arr | arr | test.cpp:128:9:128:18 | Store: ... = ... | write | | test.cpp:128:9:128:14 | PointerAdd: access to array | test.cpp:128:9:128:11 | arr | test.cpp:128:9:128:14 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:125:11:125:13 | arr | arr | test.cpp:128:9:128:18 | Store: ... = ... | write | -| test.cpp:136:9:136:16 | PointerAdd: ... += ... | test.cpp:142:10:142:13 | definition of asdf | test.cpp:138:13:138:15 | arr | This pointer arithmetic may have an off-by-2 error allowing it to overrun $@ at this $@. | test.cpp:142:10:142:13 | asdf | asdf | test.cpp:138:12:138:15 | Load: * ... | read | | test.cpp:136:9:136:16 | PointerAdd: ... += ... | test.cpp:143:18:143:21 | asdf | test.cpp:138:13:138:15 | arr | This pointer arithmetic may have an off-by-2 error allowing it to overrun $@ at this $@. | test.cpp:142:10:142:13 | asdf | asdf | test.cpp:138:12:138:15 | Load: * ... | read | -| test.cpp:156:12:156:18 | PointerAdd: ... + ... | test.cpp:154:7:154:9 | definition of buf | test.cpp:147:4:147:9 | -- ... | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:154:7:154:9 | buf | buf | test.cpp:147:3:147:13 | Store: ... = ... | write | -| test.cpp:156:12:156:18 | PointerAdd: ... + ... | test.cpp:154:7:154:9 | definition of buf | test.cpp:147:4:147:9 | -- ... | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:154:7:154:9 | buf | buf | test.cpp:147:3:147:13 | Store: ... = ... | write | | test.cpp:156:12:156:18 | PointerAdd: ... + ... | test.cpp:156:12:156:14 | buf | test.cpp:147:4:147:9 | -- ... | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:154:7:154:9 | buf | buf | test.cpp:147:3:147:13 | Store: ... = ... | write | | test.cpp:156:12:156:18 | PointerAdd: ... + ... | test.cpp:156:12:156:14 | buf | test.cpp:147:4:147:9 | -- ... | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:154:7:154:9 | buf | buf | test.cpp:147:3:147:13 | Store: ... = ... | write | -| test.cpp:221:5:221:11 | PointerAdd: access to array | test.cpp:217:19:217:24 | definition of buffer | test.cpp:221:5:221:11 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:217:19:217:24 | buffer | buffer | test.cpp:221:5:221:15 | Store: ... = ... | write | | test.cpp:221:5:221:11 | PointerAdd: access to array | test.cpp:218:23:218:28 | buffer | test.cpp:221:5:221:11 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:217:19:217:24 | buffer | buffer | test.cpp:221:5:221:15 | Store: ... = ... | write | -| test.cpp:232:5:232:10 | PointerAdd: access to array | test.cpp:228:10:228:14 | definition of array | test.cpp:232:5:232:10 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:228:10:228:14 | array | array | test.cpp:232:5:232:19 | Store: ... = ... | write | | test.cpp:232:5:232:10 | PointerAdd: access to array | test.cpp:229:25:229:29 | array | test.cpp:232:5:232:10 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:228:10:228:14 | array | array | test.cpp:232:5:232:19 | Store: ... = ... | write | -| test.cpp:261:27:261:30 | PointerAdd: access to array | test.cpp:285:19:285:25 | definition of buffer2 | test.cpp:261:27:261:30 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:285:19:285:25 | buffer2 | buffer2 | test.cpp:261:27:261:30 | Load: access to array | read | | test.cpp:261:27:261:30 | PointerAdd: access to array | test.cpp:286:19:286:25 | buffer2 | test.cpp:261:27:261:30 | access to array | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:285:19:285:25 | buffer2 | buffer2 | test.cpp:261:27:261:30 | Load: access to array | read | -| test.cpp:299:16:299:21 | PointerAdd: access to array | test.cpp:308:9:308:12 | definition of arr2 | test.cpp:299:16:299:21 | access to array | This pointer arithmetic may have an off-by-1014 error allowing it to overrun $@ at this $@. | test.cpp:308:9:308:12 | arr2 | arr2 | test.cpp:299:16:299:21 | Load: access to array | read | | test.cpp:299:16:299:21 | PointerAdd: access to array | test.cpp:309:20:309:23 | arr2 | test.cpp:299:16:299:21 | access to array | This pointer arithmetic may have an off-by-1014 error allowing it to overrun $@ at this $@. | test.cpp:308:9:308:12 | arr2 | arr2 | test.cpp:299:16:299:21 | Load: access to array | read | -| test.cpp:322:19:322:27 | PointerAdd: ... + ... | test.cpp:314:10:314:13 | definition of temp | test.cpp:325:24:325:26 | end | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:314:10:314:13 | temp | temp | test.cpp:330:13:330:24 | Store: ... = ... | write | -| test.cpp:322:19:322:27 | PointerAdd: ... + ... | test.cpp:314:10:314:13 | definition of temp | test.cpp:325:24:325:26 | end | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:314:10:314:13 | temp | temp | test.cpp:331:13:331:24 | Store: ... = ... | write | -| test.cpp:322:19:322:27 | PointerAdd: ... + ... | test.cpp:314:10:314:13 | definition of temp | test.cpp:325:24:325:26 | end | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:314:10:314:13 | temp | temp | test.cpp:333:13:333:24 | Store: ... = ... | write | | test.cpp:322:19:322:27 | PointerAdd: ... + ... | test.cpp:322:19:322:22 | temp | test.cpp:325:24:325:26 | end | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:314:10:314:13 | temp | temp | test.cpp:330:13:330:24 | Store: ... = ... | write | | test.cpp:322:19:322:27 | PointerAdd: ... + ... | test.cpp:322:19:322:22 | temp | test.cpp:325:24:325:26 | end | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:314:10:314:13 | temp | temp | test.cpp:331:13:331:24 | Store: ... = ... | write | | test.cpp:322:19:322:27 | PointerAdd: ... + ... | test.cpp:322:19:322:22 | temp | test.cpp:325:24:325:26 | end | This pointer arithmetic may have an off-by-1 error allowing it to overrun $@ at this $@. | test.cpp:314:10:314:13 | temp | temp | test.cpp:333:13:333:24 | Store: ... = ... | write | diff --git a/cpp/ql/test/library-tests/dataflow/certain/test.cpp b/cpp/ql/test/library-tests/dataflow/certain/test.cpp new file mode 100644 index 000000000000..029c329a36dc --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/certain/test.cpp @@ -0,0 +1,82 @@ +void use(...); + +void test1() { + int x = 0; // $ certain="SSA def(&x)" certain="SSA def(x)" + use(x); + + x = 1; // $ certain="SSA def(x)" + use(x); + + int* p = &x; // $ certain="SSA def(&p)" certain="SSA def(p)" certain="SSA def(*p)" + use(p); + + *p = 2; // $ certain="SSA def(*p)" + use(p); + + p = nullptr; // $ certain="SSA def(p)" certain="SSA def(*p)" + use(p); + + *p = 2; // $ uncertain="SSA def(*p)" + use(p); +} + +void test2(bool b) { // $ certain="SSA def(&b)" certain="SSA def(b)" + { + int x; // $ certain="SSA def(&x)" + if(b) { + x = 0; // $ certain="SSA def(x)" + } else { + x = 1; // $ certain="SSA def(x)" + } + use(x); // $ certain="SSA phi(x)" + } + + { + int x; // $ certain="SSA def(&x)" certain="SSA def(x)" + if(b) { + x = 0; // $ certain="SSA def(x)" + } else { + + } + use(x); // $ certain="SSA phi(x)" + } + + { + int x; // $ certain="SSA def(&x)" certain="SSA def(x)" + int* p = &x; // $ certain="SSA def(&p)" certain="SSA def(p)" certain="SSA def(*p)" + if(b) { + *p = 0; // $ certain="SSA def(*p)" + } else { + *(p + 1) = 1; // $ uncertain="SSA def(*p)" + } + use(p); // $ uncertain="SSA phi(*p)" + } + +} + +void test3(bool b) { // $ certain="SSA def(&b)" certain="SSA def(b)" + for(int i = 0; i < 10;) { // $ certain="SSA def(&i)" certain="SSA def(i)" certain="SSA phi(i)" + if(b) { + ++i; // $ certain="SSA def(i)" + } + use(i); // $ certain="SSA phi(i)" + } +} + +void test(int x, bool b1, bool b2) { // $ certain="SSA def(&x)" certain="SSA def(x)" certain="SSA def(&b1)" certain="SSA def(b1)" certain="SSA def(&b2)" certain="SSA def(b2)" + int* p = &x; // $ certain="SSA def(&p)" certain="SSA def(p)" certain="SSA def(*p)" + int i = 0; // $ certain="SSA def(&i)" certain="SSA def(i)" + int j = 0; // $ certain="SSA def(&j)" certain="SSA def(j)" + while (i < 10) { // $ certain="SSA phi(i)" certain="SSA phi(*p)" + if (b1) { + *p = 0; // $ certain="SSA def(*p)" + } + ++i; // $ certain="SSA def(i)" certain="SSA phi(*p)" + } + while (j < 10) { // $ uncertain="SSA phi(*p)" certain="SSA phi(j)" + if (b2) { + *(p + j) = 0; // $ uncertain="SSA def(*p)" + } + ++j; // $ certain="SSA def(j)" uncertain="SSA phi(*p)" + } +} \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/certain/test.expected b/cpp/ql/test/library-tests/dataflow/certain/test.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/cpp/ql/test/library-tests/dataflow/certain/test.ql b/cpp/ql/test/library-tests/dataflow/certain/test.ql new file mode 100644 index 000000000000..231e3c31663e --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/certain/test.ql @@ -0,0 +1,22 @@ +import cpp +import utils.test.InlineExpectationsTest +import semmle.code.cpp.dataflow.new.DataFlow::DataFlow + +bindingset[s] +string quote(string s) { if s.matches("% %") then result = "\"" + s + "\"" else result = s } + +module AsDefinitionTest implements TestSig { + string getARelevantTag() { result = ["certain", "uncertain"] } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(Ssa::Definition d | + location = d.getLocation() and + element = d.toString() and + value = quote(d.toString()) + | + if d.isCertain() then tag = "certain" else tag = "uncertain" + ) + } +} + +import MakeTest 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 4e145427a362..77ee5c4abb6c 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 @@ -143,6 +143,7 @@ postWithInFlow | test.cpp:1153:5:1153:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1165:5:1165:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1195:5:1195:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | +| test.cpp:1337:5:1337:13 | access to array [post update] | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected index f41def013155..3aa5b3c30e02 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected @@ -65,52 +65,52 @@ | test.cpp:8:8:8:9 | t1 | test.cpp:9:8:9:9 | t1 | | test.cpp:9:8:9:9 | t1 | test.cpp:11:7:11:8 | t1 | | test.cpp:9:8:9:9 | t1 | test.cpp:11:7:11:8 | t1 | -| test.cpp:10:8:10:9 | t2 | test.cpp:11:7:11:8 | [input] SSA phi read(t2) | -| test.cpp:10:8:10:9 | t2 | test.cpp:11:7:11:8 | [input] SSA phi(*t2) | +| test.cpp:10:8:10:9 | t2 | test.cpp:11:7:11:8 | [input] SSA phi read(&t2) | +| test.cpp:10:8:10:9 | t2 | test.cpp:11:7:11:8 | [input] SSA phi(t2) | | test.cpp:10:8:10:9 | t2 | test.cpp:13:10:13:11 | t2 | -| test.cpp:11:7:11:8 | [input] SSA phi read(t2) | test.cpp:15:8:15:9 | t2 | -| test.cpp:11:7:11:8 | [input] SSA phi(*t2) | test.cpp:15:8:15:9 | t2 | +| test.cpp:11:7:11:8 | [input] SSA phi read(&t2) | test.cpp:15:8:15:9 | t2 | +| test.cpp:11:7:11:8 | [input] SSA phi(t2) | test.cpp:15:8:15:9 | t2 | | test.cpp:11:7:11:8 | t1 | test.cpp:21:8:21:9 | t1 | | test.cpp:12:5:12:10 | ... = ... | test.cpp:13:10:13:11 | t2 | | test.cpp:12:10:12:10 | 0 | test.cpp:12:5:12:10 | ... = ... | | test.cpp:13:10:13:11 | t2 | test.cpp:15:8:15:9 | t2 | | test.cpp:13:10:13:11 | t2 | test.cpp:15:8:15:9 | t2 | -| test.cpp:15:8:15:9 | t2 | test.cpp:23:15:23:16 | [input] SSA phi read(*t2) | +| test.cpp:15:8:15:9 | t2 | test.cpp:23:15:23:16 | [input] SSA phi read(&t2) | | test.cpp:15:8:15:9 | t2 | test.cpp:23:15:23:16 | [input] SSA phi read(t2) | | test.cpp:17:3:17:8 | ... = ... | test.cpp:21:8:21:9 | t1 | | test.cpp:17:8:17:8 | 0 | test.cpp:17:3:17:8 | ... = ... | -| test.cpp:21:8:21:9 | t1 | test.cpp:23:19:23:19 | SSA phi read(t1) | -| test.cpp:21:8:21:9 | t1 | test.cpp:23:19:23:19 | SSA phi(*t1) | +| test.cpp:21:8:21:9 | t1 | test.cpp:23:19:23:19 | SSA phi read(&t1) | +| test.cpp:21:8:21:9 | t1 | test.cpp:23:19:23:19 | SSA phi(t1) | | test.cpp:23:15:23:16 | 0 | test.cpp:23:15:23:16 | 0 | -| test.cpp:23:15:23:16 | 0 | test.cpp:23:19:23:19 | SSA phi(*i) | -| test.cpp:23:15:23:16 | [input] SSA phi read(*t2) | test.cpp:23:19:23:19 | SSA phi read(*t2) | +| test.cpp:23:15:23:16 | 0 | test.cpp:23:19:23:19 | SSA phi(i) | +| test.cpp:23:15:23:16 | [input] SSA phi read(&t2) | test.cpp:23:19:23:19 | SSA phi read(&t2) | | test.cpp:23:15:23:16 | [input] SSA phi read(t2) | test.cpp:23:19:23:19 | SSA phi read(t2) | -| test.cpp:23:19:23:19 | SSA phi read(*t2) | test.cpp:24:10:24:11 | t2 | -| test.cpp:23:19:23:19 | SSA phi read(i) | test.cpp:23:19:23:19 | i | -| test.cpp:23:19:23:19 | SSA phi read(t1) | test.cpp:23:23:23:24 | t1 | +| test.cpp:23:19:23:19 | SSA phi read(&i) | test.cpp:23:19:23:19 | i | +| test.cpp:23:19:23:19 | SSA phi read(&t1) | test.cpp:23:23:23:24 | t1 | +| test.cpp:23:19:23:19 | SSA phi read(&t2) | test.cpp:24:10:24:11 | t2 | | test.cpp:23:19:23:19 | SSA phi read(t2) | test.cpp:24:10:24:11 | t2 | -| test.cpp:23:19:23:19 | SSA phi(*i) | test.cpp:23:19:23:19 | i | -| test.cpp:23:19:23:19 | SSA phi(*t1) | test.cpp:23:23:23:24 | t1 | +| test.cpp:23:19:23:19 | SSA phi(i) | test.cpp:23:19:23:19 | i | +| test.cpp:23:19:23:19 | SSA phi(t1) | test.cpp:23:23:23:24 | t1 | | test.cpp:23:19:23:19 | i | test.cpp:23:27:23:27 | i | | test.cpp:23:19:23:19 | i | test.cpp:23:27:23:27 | i | -| test.cpp:23:23:23:24 | t1 | test.cpp:23:27:23:29 | [input] SSA phi read(t1) | +| test.cpp:23:23:23:24 | t1 | test.cpp:23:27:23:29 | [input] SSA phi read(&t1) | | test.cpp:23:23:23:24 | t1 | test.cpp:26:8:26:9 | t1 | | test.cpp:23:23:23:24 | t1 | test.cpp:26:8:26:9 | t1 | | test.cpp:23:27:23:27 | *i | test.cpp:23:27:23:27 | *i | | test.cpp:23:27:23:27 | *i | test.cpp:23:27:23:27 | i | | test.cpp:23:27:23:27 | i | test.cpp:23:27:23:27 | i | | test.cpp:23:27:23:27 | i | test.cpp:23:27:23:27 | i | -| test.cpp:23:27:23:27 | i | test.cpp:23:27:23:29 | [input] SSA phi read(i) | +| test.cpp:23:27:23:27 | i | test.cpp:23:27:23:29 | [input] SSA phi read(&i) | | test.cpp:23:27:23:29 | ... ++ | test.cpp:23:27:23:29 | ... ++ | -| test.cpp:23:27:23:29 | ... ++ | test.cpp:23:27:23:29 | [input] SSA phi(*i) | -| test.cpp:23:27:23:29 | [input] SSA phi read(*t2) | test.cpp:23:19:23:19 | SSA phi read(*t2) | -| test.cpp:23:27:23:29 | [input] SSA phi read(i) | test.cpp:23:19:23:19 | SSA phi read(i) | -| test.cpp:23:27:23:29 | [input] SSA phi read(t1) | test.cpp:23:19:23:19 | SSA phi read(t1) | +| test.cpp:23:27:23:29 | ... ++ | test.cpp:23:27:23:29 | [input] SSA phi(i) | +| test.cpp:23:27:23:29 | [input] SSA phi read(&i) | test.cpp:23:19:23:19 | SSA phi read(&i) | +| test.cpp:23:27:23:29 | [input] SSA phi read(&t1) | test.cpp:23:19:23:19 | SSA phi read(&t1) | +| test.cpp:23:27:23:29 | [input] SSA phi read(&t2) | test.cpp:23:19:23:19 | SSA phi read(&t2) | | test.cpp:23:27:23:29 | [input] SSA phi read(t2) | test.cpp:23:19:23:19 | SSA phi read(t2) | -| test.cpp:23:27:23:29 | [input] SSA phi(*i) | test.cpp:23:19:23:19 | SSA phi(*i) | -| test.cpp:23:27:23:29 | [input] SSA phi(*t1) | test.cpp:23:19:23:19 | SSA phi(*t1) | -| test.cpp:24:5:24:11 | ... = ... | test.cpp:23:27:23:29 | [input] SSA phi(*t1) | -| test.cpp:24:10:24:11 | t2 | test.cpp:23:27:23:29 | [input] SSA phi read(*t2) | +| test.cpp:23:27:23:29 | [input] SSA phi(i) | test.cpp:23:19:23:19 | SSA phi(i) | +| test.cpp:23:27:23:29 | [input] SSA phi(t1) | test.cpp:23:19:23:19 | SSA phi(t1) | +| test.cpp:24:5:24:11 | ... = ... | test.cpp:23:27:23:29 | [input] SSA phi(t1) | +| test.cpp:24:10:24:11 | t2 | test.cpp:23:27:23:29 | [input] SSA phi read(&t2) | | test.cpp:24:10:24:11 | t2 | test.cpp:23:27:23:29 | [input] SSA phi read(t2) | | test.cpp:24:10:24:11 | t2 | test.cpp:24:5:24:11 | ... = ... | | test.cpp:382:48:382:54 | source1 | test.cpp:384:16:384:23 | *& ... | 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 5ee2ca86cbcf..2ead5d7b23a2 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 @@ -171,6 +171,7 @@ astFlow | test.cpp:1312:7:1312:12 | call to source | test.cpp:1313:8:1313:24 | ... ? ... : ... | | test.cpp:1312:7:1312:12 | call to source | test.cpp:1314:8:1314:8 | x | | test.cpp:1329:11:1329:16 | call to source | test.cpp:1330:10:1330:10 | i | +| test.cpp:1335:10:1335:15 | buffer | test.cpp:1336:10:1336:18 | access to array | | 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 | 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 892d49b00855..6e80fa75aa02 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -1329,3 +1329,11 @@ void nsdmi_test() { nsdmi y(source()); sink(y.i); // $ ir ast } + +void certain_def_uninitialized_instruction_test() { + for(int i = 0; i < 10; i++) { + char buffer[10]; + sink(buffer[0]); // $ SPURIOUS: ast + buffer[0] = source(); + } +} \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/uninitialized.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/uninitialized.expected index 52bbcabb1e3e..0850b577dcb7 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/uninitialized.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/uninitialized.expected @@ -59,3 +59,5 @@ | test.cpp:1137:7:1137:10 | data | test.cpp:1138:5:1138:8 | data | | test.cpp:1137:7:1137:10 | data | test.cpp:1139:4:1139:7 | data | | test.cpp:1137:7:1137:10 | data | test.cpp:1140:10:1140:13 | data | +| test.cpp:1335:10:1335:15 | buffer | test.cpp:1336:10:1336:15 | buffer | +| test.cpp:1335:10:1335:15 | buffer | test.cpp:1337:5:1337:10 | buffer | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 4142b09473a9..8d247738c984 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -51,13 +51,16 @@ models | 50 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | | 51 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | | 52 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 53 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 54 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 55 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 56 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 57 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 53 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 54 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 55 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 56 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 57 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 58 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 59 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 60 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:57 | +| asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:60 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:32 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | *recv_buffer | provenance | Src:MaD:32 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | @@ -66,24 +69,24 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | *send_buffer | provenance | Sink:MaD:2 | | asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | provenance | | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:57 | -| azure.cpp:62:10:62:14 | [summary param] this in Value | azure.cpp:62:10:62:14 | [summary] to write: ReturnValue[*] in Value | provenance | MaD:56 | -| azure.cpp:113:16:113:19 | [summary param] this in Read | azure.cpp:113:16:113:19 | [summary param] *0 in Read [Return] | provenance | MaD:53 | -| azure.cpp:114:16:114:26 | [summary param] this in ReadToCount | azure.cpp:114:16:114:26 | [summary param] *0 in ReadToCount [Return] | provenance | MaD:54 | -| azure.cpp:115:30:115:38 | [summary param] this in ReadToEnd | azure.cpp:115:30:115:38 | [summary] to write: ReturnValue.Element in ReadToEnd | provenance | MaD:55 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:60 | +| azure.cpp:62:10:62:14 | [summary param] this in Value | azure.cpp:62:10:62:14 | [summary] to write: ReturnValue[*] in Value | provenance | MaD:59 | +| azure.cpp:113:16:113:19 | [summary param] this in Read | azure.cpp:113:16:113:19 | [summary param] *0 in Read [Return] | provenance | MaD:56 | +| azure.cpp:114:16:114:26 | [summary param] this in ReadToCount | azure.cpp:114:16:114:26 | [summary param] *0 in ReadToCount [Return] | provenance | MaD:57 | +| azure.cpp:115:30:115:38 | [summary param] this in ReadToEnd | azure.cpp:115:30:115:38 | [summary] to write: ReturnValue.Element in ReadToEnd | provenance | MaD:58 | | azure.cpp:115:30:115:38 | [summary] to write: ReturnValue.Element in ReadToEnd | azure.cpp:115:30:115:38 | [summary] to write: ReturnValue in ReadToEnd [element] | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:29 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | | azure.cpp:257:5:257:8 | *resp | azure.cpp:113:16:113:19 | [summary param] this in Read | provenance | | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:53 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:56 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | | azure.cpp:262:5:262:8 | *resp | azure.cpp:114:16:114:26 | [summary param] this in ReadToCount | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:54 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:57 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | | azure.cpp:266:38:266:41 | *resp | azure.cpp:115:30:115:38 | [summary param] this in ReadToEnd | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:55 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:58 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | @@ -100,11 +103,11 @@ edges | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:26 | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | | azure.cpp:282:21:282:23 | *call to get | azure.cpp:115:30:115:38 | [summary param] this in ReadToEnd | provenance | | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:55 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:58 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | | azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:62:10:62:14 | [summary param] this in Value | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:56 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:59 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:30 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | @@ -180,6 +183,39 @@ edges | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | | test.cpp:118:44:118:44 | *x | test.cpp:111:3:111:25 | [summary param] *0 in callWithNonTypeTemplate | provenance | | | test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:48 | +| test.cpp:125:5:125:20 | [summary param] 0 in templateFunction | test.cpp:125:5:125:20 | [summary] to write: ReturnValue in templateFunction | provenance | MaD:54 | +| test.cpp:128:5:128:21 | [summary param] 1 in templateFunction2 | test.cpp:128:5:128:21 | [summary] to write: ReturnValue in templateFunction2 | provenance | MaD:53 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:25 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | +| test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | +| test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | +| test.cpp:134:45:134:45 | x | test.cpp:125:5:125:20 | [summary param] 0 in templateFunction | provenance | | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:54 | +| test.cpp:140:4:140:11 | [summary param] 1 in function | test.cpp:140:4:140:11 | [summary] to write: ReturnValue in function | provenance | MaD:55 | +| test.cpp:140:4:140:11 | [summary param] 1 in function | test.cpp:140:4:140:11 | [summary] to write: ReturnValue in function | provenance | MaD:55 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:25 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | +| test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | +| test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | +| test.cpp:148:26:148:26 | x | test.cpp:140:4:140:11 | [summary param] 1 in function | provenance | | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:55 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:25 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | +| test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | +| test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | +| test.cpp:157:26:157:26 | x | test.cpp:140:4:140:11 | [summary param] 1 in function | provenance | | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:55 | +| test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | +| test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | +| test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | +| test.cpp:165:69:165:69 | x | test.cpp:128:5:128:21 | [summary param] 1 in templateFunction2 | provenance | | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:53 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:25 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | +| test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | +| test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | +| test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:53 | | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | provenance | MaD:33 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | @@ -483,6 +519,43 @@ nodes | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | semmle.label | call to callWithNonTypeTemplate | | test.cpp:118:44:118:44 | *x | semmle.label | *x | | test.cpp:119:10:119:11 | y2 | semmle.label | y2 | +| test.cpp:125:5:125:20 | [summary param] 0 in templateFunction | semmle.label | [summary param] 0 in templateFunction | +| test.cpp:125:5:125:20 | [summary] to write: ReturnValue in templateFunction | semmle.label | [summary] to write: ReturnValue in templateFunction | +| test.cpp:128:5:128:21 | [summary param] 1 in templateFunction2 | semmle.label | [summary param] 1 in templateFunction2 | +| test.cpp:128:5:128:21 | [summary] to write: ReturnValue in templateFunction2 | semmle.label | [summary] to write: ReturnValue in templateFunction2 | +| test.cpp:133:10:133:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:133:10:133:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:134:13:134:43 | call to templateFunction | semmle.label | call to templateFunction | +| test.cpp:134:13:134:43 | call to templateFunction | semmle.label | call to templateFunction | +| test.cpp:134:45:134:45 | x | semmle.label | x | +| test.cpp:135:10:135:10 | y | semmle.label | y | +| test.cpp:140:4:140:11 | [summary param] 1 in function | semmle.label | [summary param] 1 in function | +| test.cpp:140:4:140:11 | [summary param] 1 in function | semmle.label | [summary param] 1 in function | +| test.cpp:140:4:140:11 | [summary] to write: ReturnValue in function | semmle.label | [summary] to write: ReturnValue in function | +| test.cpp:140:4:140:11 | [summary] to write: ReturnValue in function | semmle.label | [summary] to write: ReturnValue in function | +| test.cpp:146:10:146:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:146:10:146:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:148:10:148:27 | call to function | semmle.label | call to function | +| test.cpp:148:10:148:27 | call to function | semmle.label | call to function | +| test.cpp:148:26:148:26 | x | semmle.label | x | +| test.cpp:149:10:149:10 | z | semmle.label | z | +| test.cpp:155:10:155:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:155:10:155:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:157:13:157:20 | call to function | semmle.label | call to function | +| test.cpp:157:13:157:20 | call to function | semmle.label | call to function | +| test.cpp:157:26:157:26 | x | semmle.label | x | +| test.cpp:158:10:158:10 | z | semmle.label | z | +| test.cpp:164:7:164:7 | *templateFunction3 | semmle.label | *templateFunction3 | +| test.cpp:164:34:164:34 | x | semmle.label | x | +| test.cpp:165:12:165:64 | call to templateFunction2 | semmle.label | call to templateFunction2 | +| test.cpp:165:12:165:64 | call to templateFunction2 | semmle.label | call to templateFunction2 | +| test.cpp:165:69:165:69 | x | semmle.label | x | +| test.cpp:170:10:170:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:170:10:170:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:172:13:172:44 | call to templateFunction3 | semmle.label | call to templateFunction3 | +| test.cpp:172:13:172:44 | call to templateFunction3 | semmle.label | call to templateFunction3 | +| test.cpp:172:51:172:51 | x | semmle.label | x | +| test.cpp:173:10:173:10 | y | semmle.label | y | | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | semmle.label | [summary param] *0 in CommandLineToArgvA | | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | semmle.label | [summary] to write: ReturnValue[**] in CommandLineToArgvA | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | @@ -688,6 +761,11 @@ subpaths | test.cpp:25:35:25:35 | x | test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | | test.cpp:118:44:118:44 | *x | test.cpp:111:3:111:25 | [summary param] *0 in callWithNonTypeTemplate | test.cpp:111:3:111:25 | [summary] to write: ReturnValue in callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | +| test.cpp:134:45:134:45 | x | test.cpp:125:5:125:20 | [summary param] 0 in templateFunction | test.cpp:125:5:125:20 | [summary] to write: ReturnValue in templateFunction | test.cpp:134:13:134:43 | call to templateFunction | +| test.cpp:148:26:148:26 | x | test.cpp:140:4:140:11 | [summary param] 1 in function | test.cpp:140:4:140:11 | [summary] to write: ReturnValue in function | test.cpp:148:10:148:27 | call to function | +| test.cpp:157:26:157:26 | x | test.cpp:140:4:140:11 | [summary param] 1 in function | test.cpp:140:4:140:11 | [summary] to write: ReturnValue in function | test.cpp:157:13:157:20 | call to function | +| test.cpp:165:69:165:69 | x | test.cpp:128:5:128:21 | [summary param] 1 in templateFunction2 | test.cpp:128:5:128:21 | [summary] to write: ReturnValue in templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | +| test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | test.cpp:164:7:164:7 | *templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | | windows.cpp:27:36:27:38 | *cmd | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | | windows.cpp:537:40:537:41 | *& ... | windows.cpp:473:17:473:37 | [summary param] *1 in RtlCopyVolatileMemory | windows.cpp:473:17:473:37 | [summary param] *0 in RtlCopyVolatileMemory [Return] | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | | windows.cpp:542:38:542:39 | *& ... | windows.cpp:479:17:479:35 | [summary param] *1 in RtlCopyDeviceMemory | windows.cpp:479:17:479:35 | [summary param] *0 in RtlCopyDeviceMemory [Return] | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 8e200aabfbd6..76d649152bdc 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -18,4 +18,7 @@ extensions: - ["", "", False, "ymlStepManual_with_body", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["", "", False, "ymlStepGenerated_with_body", "", "", "Argument[0]", "ReturnValue", "taint", "df-generated"] - ["", "", False, "callWithArgument", "", "", "Argument[1]", "Argument[0].Parameter[0]", "value", "manual"] - - ["", "", False, "callWithNonTypeTemplate", "(const T &)", "", "Argument[*0]", "ReturnValue", "value", "manual"] \ No newline at end of file + - ["", "", False, "callWithNonTypeTemplate", "(const T &)", "", "Argument[*0]", "ReturnValue", "value", "manual"] + - ["", "TemplateClass1", False, "templateFunction", "(T,U)", "", "Argument[0]", "ReturnValue", "value", "manual"] + - ["", "TemplateClass1", True, "templateFunction2", "(U,V)", "", "Argument[1]", "ReturnValue", "value", "manual"] + - ["", "TemplateClass2", True, "function", "(U,T)", "", "Argument[1]", "ReturnValue", "value", "manual"] \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index e28349b71590..03a0d442c1ce 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -15,3 +15,7 @@ | test.cpp:89:11:89:11 | y | test-sink | | test.cpp:116:10:116:11 | y1 | test-sink | | test.cpp:119:10:119:11 | y2 | test-sink | +| test.cpp:135:10:135:10 | y | test-sink | +| test.cpp:149:10:149:10 | z | test-sink | +| test.cpp:158:10:158:10 | z | test-sink | +| test.cpp:173:10:173:10 | y | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index b46aa87af6fe..4040cff4fd28 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -9,6 +9,10 @@ | test.cpp:56:8:56:16 | call to ymlSource | local | | test.cpp:94:10:94:18 | call to ymlSource | local | | test.cpp:114:10:114:18 | call to ymlSource | local | +| test.cpp:133:10:133:18 | call to ymlSource | local | +| test.cpp:146:10:146:18 | call to ymlSource | local | +| test.cpp:155:10:155:18 | call to ymlSource | local | +| test.cpp:170:10:170:18 | call to ymlSource | local | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index af11ff958f59..01bf6cc4093f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -118,3 +118,57 @@ void test_callWithNonTypeTemplate() { int y2 = callWithNonTypeTemplate(x); ymlSink(y2); // $ ir } + +template +struct TemplateClass1 { + template + U templateFunction(T, U); + + template + V templateFunction2(U, V); +}; + +void test_template_function_in_template_class() { + TemplateClass1 b; + int x = ymlSource(); + auto y = b.templateFunction(x, 0UL); + ymlSink(y); // $ ir +} + +template +struct TemplateClass2 { + T function(T, S); +}; + +template using PartialInstantiationOfTemplateClass2 = TemplateClass2; + +void test_partial_class_instantiation() { + int x = ymlSource(); + PartialInstantiationOfTemplateClass2 y; + int z = y.function(0UL, x); + ymlSink(z); // $ ir +} + +template struct DeriveFromFromPartialTemplateInstantiation : TemplateClass2 { }; + +void test_inheritance() { + int x = ymlSource(); + DeriveFromFromPartialTemplateInstantiation y; + auto z = y.function(0L, x); + ymlSink(z); // $ ir +} + +template +struct Class1 : TemplateClass1 { + template + int templateFunction3(U u, int x) { + return TemplateClass1::template templateFunction2(u, x); + } +}; + +void test_class1() { + int x = ymlSource(); + Class1 c; + auto y = c.templateFunction3(0UL, x); + ymlSink(y); // $ ir +} \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/source-sink-tests/sources-and-sinks.cpp b/cpp/ql/test/library-tests/dataflow/source-sink-tests/sources-and-sinks.cpp index e4947a112f8d..7edd46344382 100644 --- a/cpp/ql/test/library-tests/dataflow/source-sink-tests/sources-and-sinks.cpp +++ b/cpp/ql/test/library-tests/dataflow/source-sink-tests/sources-and-sinks.cpp @@ -131,3 +131,112 @@ void test_strsafe_gets() { StringCchGetsExA(dest, sizeof(dest), &end, &remaining, 0); // $ local_source } } + +int scanf_s(const char *format, ...); +int fscanf_s(FILE *stream, const char *format, ...); + +void test_scanf_s(FILE *stream) { + { + int n1, n2; + scanf_s( + "%d %d", + &n1, // $ local_source + &n2); // $ local_source + } + + { + int n; + fscanf_s(stream, "%d", &n); // $ remote_source + } + + { + int n1, n2; + char buf[256]; + scanf_s("%d %s %d", + &n1, // $ local_source + buf, // $ local_source + 256, + &n2); // $ local_source + } + + { + int n1, n2; + char buf[256]; + fscanf_s(stream, "%d %s %d", + &n1, // $ remote_source + buf, // $ remote_source + 256, + &n2); // $ remote_source + } +} + +typedef void *locale_t; + +int wscanf_s(const wchar_t *format, ...); +int _scanf_s_l(const char *format, locale_t locale, ...); +int _wscanf_s_l(const wchar_t *format, locale_t locale, ...); +int fwscanf_s(FILE *stream, const wchar_t *format, ...); +int _fscanf_s_l(FILE *stream, const char *format, locale_t locale, ...); +int _fwscanf_s_l(FILE *stream, const wchar_t *format, locale_t locale, ...); + +void test_additional_scanf_s_variants(FILE *stream, locale_t locale) { + { + int n1, n2; + wchar_t buf[256]; + wscanf_s(L"%d %s %d", + &n1, // $ local_source + buf, // $ local_source + 256, + &n2); // $ local_source + } + + { + int n1, n2; + char buf[256]; + _scanf_s_l("%d %s %d", locale, + &n1, // $ local_source + buf, // $ local_source + 256, + &n2); // $ local_source + } + + { + int n1, n2; + wchar_t buf[256]; + _wscanf_s_l(L"%d %s %d", locale, + &n1, // $ local_source + buf, // $ local_source + 256, + &n2); // $ local_source + } + + { + int n1, n2; + wchar_t buf[256]; + fwscanf_s(stream, L"%d %s %d", + &n1, // $ remote_source + buf, // $ remote_source + 256, + &n2); // $ remote_source + } + + { + int n1, n2; + char buf[256]; + _fscanf_s_l(stream, "%d %s %d", locale, + &n1, // $ remote_source + buf, // $ remote_source + 256, + &n2); // $ remote_source + } + + { + int n1, n2; + wchar_t buf[256]; + _fwscanf_s_l(stream, L"%d %s %d", locale, + &n1, // $ remote_source + buf, // $ remote_source + 256, + &n2); // $ remote_source + } +} diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected index 5ad32759da58..d494c09e71d5 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected @@ -27383,54 +27383,55 @@ getParameterTypeName | stl.h:91:24:91:33 | operator++ | 0 | int | | stl.h:95:44:95:44 | back_inserter | 0 | func:0 & | | stl.h:95:44:95:44 | back_inserter | 0 | func:0 & | -| stl.h:148:3:148:14 | basic_string | 0 | const class:2 & | -| stl.h:149:33:149:44 | basic_string | 0 | const class:0 * | -| stl.h:149:33:149:44 | basic_string | 1 | const class:2 & | -| stl.h:151:16:151:20 | c_str | 0 | func:0 | -| stl.h:151:16:151:20 | c_str | 1 | func:0 | -| stl.h:151:16:151:20 | c_str | 2 | const class:2 & | +| stl.h:147:12:147:23 | basic_string | 0 | const class:2 & | +| stl.h:148:3:148:14 | basic_string | 0 | const class:0 * | +| stl.h:148:3:148:14 | basic_string | 1 | const class:2 & | +| stl.h:149:33:149:44 | basic_string | 0 | func:0 | +| stl.h:149:33:149:44 | basic_string | 1 | func:0 | +| stl.h:149:33:149:44 | basic_string | 2 | const class:2 & | +| stl.h:165:8:165:16 | push_back | 0 | class:0 | | stl.h:173:13:173:22 | operator[] | 0 | size_type | | stl.h:175:13:175:14 | at | 0 | size_type | -| stl.h:176:35:176:44 | operator+= | 0 | size_type | -| stl.h:176:35:176:44 | operator+= | 0 | size_type | -| stl.h:177:17:177:26 | operator+= | 0 | const func:0 & | -| stl.h:178:17:178:22 | append | 0 | const class:0 * | -| stl.h:179:17:179:22 | append | 0 | const basic_string & | -| stl.h:180:17:180:22 | append | 0 | const class:0 * | -| stl.h:181:47:181:52 | append | 0 | size_type | -| stl.h:181:47:181:52 | append | 1 | class:0 | -| stl.h:182:17:182:22 | assign | 0 | func:0 | -| stl.h:182:17:182:22 | assign | 1 | func:0 | -| stl.h:183:17:183:22 | assign | 0 | const basic_string & | -| stl.h:184:47:184:52 | assign | 0 | size_type | -| stl.h:184:47:184:52 | assign | 1 | class:0 | -| stl.h:185:17:185:22 | insert | 0 | func:0 | -| stl.h:185:17:185:22 | insert | 1 | func:0 | +| stl.h:176:35:176:44 | operator+= | 0 | const func:0 & | +| stl.h:176:35:176:44 | operator+= | 0 | const func:0 & | +| stl.h:177:17:177:26 | operator+= | 0 | const class:0 * | +| stl.h:178:17:178:22 | append | 0 | const basic_string & | +| stl.h:179:17:179:22 | append | 0 | const class:0 * | +| stl.h:180:17:180:22 | append | 0 | size_type | +| stl.h:180:17:180:22 | append | 1 | class:0 | +| stl.h:181:47:181:52 | append | 0 | func:0 | +| stl.h:181:47:181:52 | append | 1 | func:0 | +| stl.h:182:17:182:22 | assign | 0 | const basic_string & | +| stl.h:183:17:183:22 | assign | 0 | size_type | +| stl.h:183:17:183:22 | assign | 1 | class:0 | +| stl.h:184:47:184:52 | assign | 0 | func:0 | +| stl.h:184:47:184:52 | assign | 1 | func:0 | +| stl.h:185:17:185:22 | insert | 0 | size_type | +| stl.h:185:17:185:22 | insert | 1 | const basic_string & | | stl.h:186:17:186:22 | insert | 0 | size_type | -| stl.h:186:17:186:22 | insert | 1 | const basic_string & | +| stl.h:186:17:186:22 | insert | 1 | size_type | +| stl.h:186:17:186:22 | insert | 2 | class:0 | | stl.h:187:17:187:22 | insert | 0 | size_type | -| stl.h:187:17:187:22 | insert | 1 | size_type | -| stl.h:187:17:187:22 | insert | 2 | class:0 | -| stl.h:188:12:188:17 | insert | 0 | size_type | -| stl.h:188:12:188:17 | insert | 1 | const class:0 * | +| stl.h:187:17:187:22 | insert | 1 | const class:0 * | +| stl.h:188:12:188:17 | insert | 0 | const_iterator | +| stl.h:188:12:188:17 | insert | 1 | size_type | +| stl.h:188:12:188:17 | insert | 2 | class:0 | | stl.h:189:42:189:47 | insert | 0 | const_iterator | -| stl.h:189:42:189:47 | insert | 1 | size_type | -| stl.h:189:42:189:47 | insert | 2 | class:0 | -| stl.h:190:17:190:23 | replace | 0 | const_iterator | -| stl.h:190:17:190:23 | replace | 1 | func:0 | -| stl.h:190:17:190:23 | replace | 2 | func:0 | +| stl.h:189:42:189:47 | insert | 1 | func:0 | +| stl.h:189:42:189:47 | insert | 2 | func:0 | +| stl.h:190:17:190:23 | replace | 0 | size_type | +| stl.h:190:17:190:23 | replace | 1 | size_type | +| stl.h:190:17:190:23 | replace | 2 | const basic_string & | | stl.h:191:17:191:23 | replace | 0 | size_type | | stl.h:191:17:191:23 | replace | 1 | size_type | -| stl.h:191:17:191:23 | replace | 2 | const basic_string & | -| stl.h:192:13:192:16 | copy | 0 | size_type | +| stl.h:191:17:191:23 | replace | 2 | size_type | +| stl.h:191:17:191:23 | replace | 3 | class:0 | +| stl.h:192:13:192:16 | copy | 0 | class:0 * | | stl.h:192:13:192:16 | copy | 1 | size_type | | stl.h:192:13:192:16 | copy | 2 | size_type | -| stl.h:192:13:192:16 | copy | 3 | class:0 | -| stl.h:193:8:193:12 | clear | 0 | class:0 * | -| stl.h:193:8:193:12 | clear | 1 | size_type | -| stl.h:193:8:193:12 | clear | 2 | size_type | -| stl.h:195:8:195:11 | swap | 0 | size_type | -| stl.h:195:8:195:11 | swap | 1 | size_type | +| stl.h:194:16:194:21 | substr | 0 | size_type | +| stl.h:194:16:194:21 | substr | 1 | size_type | +| stl.h:195:8:195:11 | swap | 0 | basic_string & | | stl.h:198:94:198:102 | operator+ | 0 | const basic_string & | | stl.h:198:94:198:102 | operator+ | 1 | const basic_string & | | stl.h:199:94:199:102 | operator+ | 0 | const basic_string & | diff --git a/cpp/ql/test/library-tests/friends/loop/friends.expected b/cpp/ql/test/library-tests/friends/loop/friends.expected index a59c1f0c65cd..50030ed70bcd 100644 --- a/cpp/ql/test/library-tests/friends/loop/friends.expected +++ b/cpp/ql/test/library-tests/friends/loop/friends.expected @@ -1,14 +1,14 @@ -| file://:0:0:0:0 | E's friend | loop.cpp:5:26:5:26 | E | | file://:0:0:0:0 | E's friend | loop.cpp:5:26:5:26 | E | -| file://:0:0:0:0 | E's friend | loop.cpp:10:26:10:26 | F | +| file://:0:0:0:0 | E's friend | loop.cpp:5:26:5:29 | E | | file://:0:0:0:0 | E's friend | loop.cpp:10:26:10:26 | F | -| file://:0:0:0:0 | E's friend | loop.cpp:5:26:5:26 | E | +| file://:0:0:0:0 | E's friend | loop.cpp:10:26:10:29 | F | | file://:0:0:0:0 | E's friend | loop.cpp:5:26:5:26 | E | -| file://:0:0:0:0 | E's friend | loop.cpp:10:26:10:26 | F | +| file://:0:0:0:0 | E's friend | loop.cpp:5:26:5:29 | E | | file://:0:0:0:0 | E's friend | loop.cpp:10:26:10:26 | F | -| file://:0:0:0:0 | F's friend | loop.cpp:5:26:5:26 | E | -| file://:0:0:0:0 | F's friend | loop.cpp:5:26:5:26 | E | +| file://:0:0:0:0 | E's friend | loop.cpp:10:26:10:29 | F | | file://:0:0:0:0 | F's friend | loop.cpp:5:26:5:26 | E | +| file://:0:0:0:0 | F's friend | loop.cpp:5:26:5:29 | E | +| file://:0:0:0:0 | F's friend | loop.cpp:5:26:5:29 | E | | loop.cpp:6:5:6:5 | E's friend | loop.cpp:5:26:5:26 | E | | loop.cpp:7:5:7:5 | E's friend | loop.cpp:7:36:7:36 | F | | loop.cpp:11:5:11:5 | F's friend | loop.cpp:11:36:11:36 | E | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 59b5f6214f3d..f8a9e70fec7c 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -1859,7 +1859,7 @@ coroutines.cpp: # 13| [Constructor] void std::coroutine_handle::coroutine_handle(std::nullptr_t) # 13| : # 13| getParameter(0): [Parameter] (unnamed parameter 0) -# 13| Type = [UsingAliasTypedefType] nullptr_t +# 13| Type = [TypeAliasType] nullptr_t # 14| [CopyConstructor] void std::coroutine_handle::coroutine_handle(std::coroutine_handle const&) # 14| : # 14| getParameter(0): [Parameter] (unnamed parameter 0) @@ -1883,7 +1883,7 @@ coroutines.cpp: # 18| [MemberFunction] std::coroutine_handle& std::coroutine_handle::operator=(std::nullptr_t) # 18| : # 18| getParameter(0): [Parameter] (unnamed parameter 0) -# 18| Type = [UsingAliasTypedefType] nullptr_t +# 18| Type = [TypeAliasType] nullptr_t # 19| [CopyAssignmentOperator] std::coroutine_handle& std::coroutine_handle::operator=(std::coroutine_handle const&) # 19| : # 19| getParameter(0): [Parameter] (unnamed parameter 0) @@ -2025,7 +2025,7 @@ coroutines.cpp: # 87| getEntryPoint(): [BlockStmt] { ... } #-----| getStmt(0): [DeclStmt] declaration # 87| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (unnamed local variable) -# 87| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 87| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| getStmt(1): [TryStmt] try { ... } #-----| getStmt(): [BlockStmt] { ... } #-----| getStmt(0): [ExprStmt] ExprStmt @@ -2036,7 +2036,7 @@ coroutines.cpp: # 87| Type = [Struct] suspend_always # 87| ValueCategory = prvalue # 87| getQualifier(): [VariableAccess] (unnamed local variable) -# 87| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 87| Type = [NestedTypedefType,TypeAliasType] promise_type # 87| ValueCategory = lvalue # 87| getChild(1): [FunctionCall] call to await_ready # 87| Type = [BoolType] bool @@ -2051,7 +2051,7 @@ coroutines.cpp: # 87| Type = [Struct] suspend_always # 87| ValueCategory = prvalue # 87| getQualifier(): [VariableAccess] (unnamed local variable) -# 87| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 87| Type = [NestedTypedefType,TypeAliasType] promise_type # 87| ValueCategory = lvalue # 87| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 87| Type = [Struct] suspend_always @@ -2123,7 +2123,7 @@ coroutines.cpp: #-----| Type = [VoidType] void #-----| ValueCategory = prvalue #-----| getQualifier(): [VariableAccess] (unnamed local variable) -#-----| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +#-----| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| ValueCategory = lvalue #-----| getStmt(2): [GotoStmt] goto ... #-----| getChild(1): [Handler] @@ -2144,7 +2144,7 @@ coroutines.cpp: # 87| Type = [VoidType] void # 87| ValueCategory = prvalue # 87| getQualifier(): [VariableAccess] (unnamed local variable) -# 87| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 87| Type = [NestedTypedefType,TypeAliasType] promise_type # 87| ValueCategory = lvalue #-----| getStmt(2): [LabelStmt] label ...: #-----| getStmt(3): [ExprStmt] ExprStmt @@ -2155,7 +2155,7 @@ coroutines.cpp: # 87| Type = [Struct] suspend_always # 87| ValueCategory = prvalue # 87| getQualifier(): [VariableAccess] (unnamed local variable) -# 87| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 87| Type = [NestedTypedefType,TypeAliasType] promise_type # 87| ValueCategory = lvalue # 87| getChild(1): [FunctionCall] call to await_ready # 87| Type = [BoolType] bool @@ -2170,7 +2170,7 @@ coroutines.cpp: # 87| Type = [Struct] suspend_always # 87| ValueCategory = prvalue # 87| getQualifier(): [VariableAccess] (unnamed local variable) -# 87| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 87| Type = [NestedTypedefType,TypeAliasType] promise_type # 87| ValueCategory = lvalue # 87| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 87| Type = [Struct] suspend_always @@ -2238,7 +2238,7 @@ coroutines.cpp: #-----| ValueCategory = prvalue(load) #-----| getStmt(1): [DeclStmt] declaration # 91| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (unnamed local variable) -# 91| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 91| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| getStmt(2): [TryStmt] try { ... } #-----| getStmt(): [BlockStmt] { ... } #-----| getStmt(0): [ExprStmt] ExprStmt @@ -2249,7 +2249,7 @@ coroutines.cpp: # 91| Type = [Struct] suspend_always # 91| ValueCategory = prvalue # 91| getQualifier(): [VariableAccess] (unnamed local variable) -# 91| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 91| Type = [NestedTypedefType,TypeAliasType] promise_type # 91| ValueCategory = lvalue # 91| getChild(1): [FunctionCall] call to await_ready # 91| Type = [BoolType] bool @@ -2264,7 +2264,7 @@ coroutines.cpp: # 91| Type = [Struct] suspend_always # 91| ValueCategory = prvalue # 91| getQualifier(): [VariableAccess] (unnamed local variable) -# 91| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 91| Type = [NestedTypedefType,TypeAliasType] promise_type # 91| ValueCategory = lvalue # 91| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 91| Type = [Struct] suspend_always @@ -2336,7 +2336,7 @@ coroutines.cpp: #-----| Type = [VoidType] void #-----| ValueCategory = prvalue #-----| getQualifier(): [VariableAccess] (unnamed local variable) -#-----| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +#-----| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| ValueCategory = lvalue # 92| getArgument(0): [VariableAccess] i # 92| Type = [IntType] int @@ -2360,7 +2360,7 @@ coroutines.cpp: # 91| Type = [VoidType] void # 91| ValueCategory = prvalue # 91| getQualifier(): [VariableAccess] (unnamed local variable) -# 91| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 91| Type = [NestedTypedefType,TypeAliasType] promise_type # 91| ValueCategory = lvalue #-----| getStmt(3): [LabelStmt] label ...: #-----| getStmt(4): [ExprStmt] ExprStmt @@ -2371,7 +2371,7 @@ coroutines.cpp: # 91| Type = [Struct] suspend_always # 91| ValueCategory = prvalue # 91| getQualifier(): [VariableAccess] (unnamed local variable) -# 91| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 91| Type = [NestedTypedefType,TypeAliasType] promise_type # 91| ValueCategory = lvalue # 91| getChild(1): [FunctionCall] call to await_ready # 91| Type = [BoolType] bool @@ -2386,7 +2386,7 @@ coroutines.cpp: # 91| Type = [Struct] suspend_always # 91| ValueCategory = prvalue # 91| getQualifier(): [VariableAccess] (unnamed local variable) -# 91| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 91| Type = [NestedTypedefType,TypeAliasType] promise_type # 91| ValueCategory = lvalue # 91| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 91| Type = [Struct] suspend_always @@ -2454,7 +2454,7 @@ coroutines.cpp: #-----| ValueCategory = prvalue(load) #-----| getStmt(1): [DeclStmt] declaration # 95| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (unnamed local variable) -# 95| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 95| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| getStmt(2): [TryStmt] try { ... } #-----| getStmt(): [BlockStmt] { ... } #-----| getStmt(0): [ExprStmt] ExprStmt @@ -2465,7 +2465,7 @@ coroutines.cpp: # 95| Type = [Struct] suspend_always # 95| ValueCategory = prvalue # 95| getQualifier(): [VariableAccess] (unnamed local variable) -# 95| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 95| Type = [NestedTypedefType,TypeAliasType] promise_type # 95| ValueCategory = lvalue # 95| getChild(1): [FunctionCall] call to await_ready # 95| Type = [BoolType] bool @@ -2480,7 +2480,7 @@ coroutines.cpp: # 95| Type = [Struct] suspend_always # 95| ValueCategory = prvalue # 95| getQualifier(): [VariableAccess] (unnamed local variable) -# 95| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 95| Type = [NestedTypedefType,TypeAliasType] promise_type # 95| ValueCategory = lvalue # 95| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 95| Type = [Struct] suspend_always @@ -2555,7 +2555,7 @@ coroutines.cpp: # 96| Type = [Struct] suspend_always # 96| ValueCategory = prvalue # 96| getQualifier(): [VariableAccess] (unnamed local variable) -# 96| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 96| Type = [NestedTypedefType,TypeAliasType] promise_type # 96| ValueCategory = lvalue # 96| getArgument(0): [VariableAccess] i # 96| Type = [IntType] int @@ -2573,7 +2573,7 @@ coroutines.cpp: # 96| Type = [Struct] suspend_always # 96| ValueCategory = prvalue # 96| getQualifier(): [VariableAccess] (unnamed local variable) -# 96| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 96| Type = [NestedTypedefType,TypeAliasType] promise_type # 96| ValueCategory = lvalue # 96| getArgument(0): [VariableAccess] i # 96| Type = [IntType] int @@ -2635,7 +2635,7 @@ coroutines.cpp: #-----| Type = [VoidType] void #-----| ValueCategory = prvalue #-----| getQualifier(): [VariableAccess] (unnamed local variable) -#-----| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +#-----| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| ValueCategory = lvalue #-----| getStmt(3): [GotoStmt] goto ... #-----| getChild(1): [Handler] @@ -2656,7 +2656,7 @@ coroutines.cpp: # 95| Type = [VoidType] void # 95| ValueCategory = prvalue # 95| getQualifier(): [VariableAccess] (unnamed local variable) -# 95| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 95| Type = [NestedTypedefType,TypeAliasType] promise_type # 95| ValueCategory = lvalue #-----| getStmt(3): [LabelStmt] label ...: #-----| getStmt(4): [ExprStmt] ExprStmt @@ -2667,7 +2667,7 @@ coroutines.cpp: # 95| Type = [Struct] suspend_always # 95| ValueCategory = prvalue # 95| getQualifier(): [VariableAccess] (unnamed local variable) -# 95| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 95| Type = [NestedTypedefType,TypeAliasType] promise_type # 95| ValueCategory = lvalue # 95| getChild(1): [FunctionCall] call to await_ready # 95| Type = [BoolType] bool @@ -2682,7 +2682,7 @@ coroutines.cpp: # 95| Type = [Struct] suspend_always # 95| ValueCategory = prvalue # 95| getQualifier(): [VariableAccess] (unnamed local variable) -# 95| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 95| Type = [NestedTypedefType,TypeAliasType] promise_type # 95| ValueCategory = lvalue # 95| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 95| Type = [Struct] suspend_always @@ -2750,7 +2750,7 @@ coroutines.cpp: #-----| ValueCategory = prvalue(load) #-----| getStmt(1): [DeclStmt] declaration # 99| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (unnamed local variable) -# 99| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 99| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| getStmt(2): [TryStmt] try { ... } #-----| getStmt(): [BlockStmt] { ... } #-----| getStmt(0): [ExprStmt] ExprStmt @@ -2761,7 +2761,7 @@ coroutines.cpp: # 99| Type = [Struct] suspend_always # 99| ValueCategory = prvalue # 99| getQualifier(): [VariableAccess] (unnamed local variable) -# 99| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 99| Type = [NestedTypedefType,TypeAliasType] promise_type # 99| ValueCategory = lvalue # 99| getChild(1): [FunctionCall] call to await_ready # 99| Type = [BoolType] bool @@ -2776,7 +2776,7 @@ coroutines.cpp: # 99| Type = [Struct] suspend_always # 99| ValueCategory = prvalue # 99| getQualifier(): [VariableAccess] (unnamed local variable) -# 99| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 99| Type = [NestedTypedefType,TypeAliasType] promise_type # 99| ValueCategory = lvalue # 99| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 99| Type = [Struct] suspend_always @@ -2851,7 +2851,7 @@ coroutines.cpp: # 100| Type = [Struct] suspend_always # 100| ValueCategory = prvalue # 100| getQualifier(): [VariableAccess] (unnamed local variable) -# 100| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 100| Type = [NestedTypedefType,TypeAliasType] promise_type # 100| ValueCategory = lvalue # 100| getArgument(0): [VariableAccess] i # 100| Type = [IntType] int @@ -2869,7 +2869,7 @@ coroutines.cpp: # 100| Type = [Struct] suspend_always # 100| ValueCategory = prvalue # 100| getQualifier(): [VariableAccess] (unnamed local variable) -# 100| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 100| Type = [NestedTypedefType,TypeAliasType] promise_type # 100| ValueCategory = lvalue # 100| getArgument(0): [VariableAccess] i # 100| Type = [IntType] int @@ -2944,7 +2944,7 @@ coroutines.cpp: # 99| Type = [VoidType] void # 99| ValueCategory = prvalue # 99| getQualifier(): [VariableAccess] (unnamed local variable) -# 99| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 99| Type = [NestedTypedefType,TypeAliasType] promise_type # 99| ValueCategory = lvalue #-----| getStmt(3): [LabelStmt] label ...: #-----| getStmt(4): [ExprStmt] ExprStmt @@ -2955,7 +2955,7 @@ coroutines.cpp: # 99| Type = [Struct] suspend_always # 99| ValueCategory = prvalue # 99| getQualifier(): [VariableAccess] (unnamed local variable) -# 99| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 99| Type = [NestedTypedefType,TypeAliasType] promise_type # 99| ValueCategory = lvalue # 99| getChild(1): [FunctionCall] call to await_ready # 99| Type = [BoolType] bool @@ -2970,7 +2970,7 @@ coroutines.cpp: # 99| Type = [Struct] suspend_always # 99| ValueCategory = prvalue # 99| getQualifier(): [VariableAccess] (unnamed local variable) -# 99| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 99| Type = [NestedTypedefType,TypeAliasType] promise_type # 99| ValueCategory = lvalue # 99| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 99| Type = [Struct] suspend_always @@ -3038,7 +3038,7 @@ coroutines.cpp: #-----| ValueCategory = prvalue(load) #-----| getStmt(1): [DeclStmt] declaration # 103| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (unnamed local variable) -# 103| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 103| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| getStmt(2): [TryStmt] try { ... } #-----| getStmt(): [BlockStmt] { ... } #-----| getStmt(0): [ExprStmt] ExprStmt @@ -3049,7 +3049,7 @@ coroutines.cpp: # 103| Type = [Struct] suspend_always # 103| ValueCategory = prvalue # 103| getQualifier(): [VariableAccess] (unnamed local variable) -# 103| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 103| Type = [NestedTypedefType,TypeAliasType] promise_type # 103| ValueCategory = lvalue # 103| getChild(1): [FunctionCall] call to await_ready # 103| Type = [BoolType] bool @@ -3064,7 +3064,7 @@ coroutines.cpp: # 103| Type = [Struct] suspend_always # 103| ValueCategory = prvalue # 103| getQualifier(): [VariableAccess] (unnamed local variable) -# 103| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 103| Type = [NestedTypedefType,TypeAliasType] promise_type # 103| ValueCategory = lvalue # 103| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 103| Type = [Struct] suspend_always @@ -3139,7 +3139,7 @@ coroutines.cpp: # 104| Type = [Struct] suspend_always # 104| ValueCategory = prvalue # 104| getQualifier(): [VariableAccess] (unnamed local variable) -# 104| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 104| Type = [NestedTypedefType,TypeAliasType] promise_type # 104| ValueCategory = lvalue # 104| getArgument(0): [VariableAccess] i # 104| Type = [IntType] int @@ -3157,7 +3157,7 @@ coroutines.cpp: # 104| Type = [Struct] suspend_always # 104| ValueCategory = prvalue # 104| getQualifier(): [VariableAccess] (unnamed local variable) -# 104| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 104| Type = [NestedTypedefType,TypeAliasType] promise_type # 104| ValueCategory = lvalue # 104| getArgument(0): [VariableAccess] i # 104| Type = [IntType] int @@ -3219,7 +3219,7 @@ coroutines.cpp: #-----| Type = [VoidType] void #-----| ValueCategory = prvalue #-----| getQualifier(): [VariableAccess] (unnamed local variable) -#-----| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +#-----| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| ValueCategory = lvalue #-----| getStmt(3): [GotoStmt] goto ... #-----| getChild(1): [Handler] @@ -3240,7 +3240,7 @@ coroutines.cpp: # 103| Type = [VoidType] void # 103| ValueCategory = prvalue # 103| getQualifier(): [VariableAccess] (unnamed local variable) -# 103| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 103| Type = [NestedTypedefType,TypeAliasType] promise_type # 103| ValueCategory = lvalue #-----| getStmt(3): [LabelStmt] label ...: #-----| getStmt(4): [ExprStmt] ExprStmt @@ -3251,7 +3251,7 @@ coroutines.cpp: # 103| Type = [Struct] suspend_always # 103| ValueCategory = prvalue # 103| getQualifier(): [VariableAccess] (unnamed local variable) -# 103| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 103| Type = [NestedTypedefType,TypeAliasType] promise_type # 103| ValueCategory = lvalue # 103| getChild(1): [FunctionCall] call to await_ready # 103| Type = [BoolType] bool @@ -3266,7 +3266,7 @@ coroutines.cpp: # 103| Type = [Struct] suspend_always # 103| ValueCategory = prvalue # 103| getQualifier(): [VariableAccess] (unnamed local variable) -# 103| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 103| Type = [NestedTypedefType,TypeAliasType] promise_type # 103| ValueCategory = lvalue # 103| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 103| Type = [Struct] suspend_always @@ -3334,7 +3334,7 @@ coroutines.cpp: #-----| ValueCategory = prvalue(load) #-----| getStmt(1): [DeclStmt] declaration # 108| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (unnamed local variable) -# 108| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 108| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| getStmt(2): [TryStmt] try { ... } #-----| getStmt(): [BlockStmt] { ... } #-----| getStmt(0): [ExprStmt] ExprStmt @@ -3345,7 +3345,7 @@ coroutines.cpp: # 108| Type = [Struct] suspend_always # 108| ValueCategory = prvalue # 108| getQualifier(): [VariableAccess] (unnamed local variable) -# 108| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 108| Type = [NestedTypedefType,TypeAliasType] promise_type # 108| ValueCategory = lvalue # 108| getChild(1): [FunctionCall] call to await_ready # 108| Type = [BoolType] bool @@ -3360,7 +3360,7 @@ coroutines.cpp: # 108| Type = [Struct] suspend_always # 108| ValueCategory = prvalue # 108| getQualifier(): [VariableAccess] (unnamed local variable) -# 108| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 108| Type = [NestedTypedefType,TypeAliasType] promise_type # 108| ValueCategory = lvalue # 108| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 108| Type = [Struct] suspend_always @@ -3435,7 +3435,7 @@ coroutines.cpp: # 109| Type = [Struct] suspend_always # 109| ValueCategory = prvalue # 109| getQualifier(): [VariableAccess] (unnamed local variable) -# 109| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 109| Type = [NestedTypedefType,TypeAliasType] promise_type # 109| ValueCategory = lvalue # 109| getArgument(0): [VariableAccess] i # 109| Type = [IntType] int @@ -3453,7 +3453,7 @@ coroutines.cpp: # 109| Type = [Struct] suspend_always # 109| ValueCategory = prvalue # 109| getQualifier(): [VariableAccess] (unnamed local variable) -# 109| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 109| Type = [NestedTypedefType,TypeAliasType] promise_type # 109| ValueCategory = lvalue # 109| getArgument(0): [VariableAccess] i # 109| Type = [IntType] int @@ -3515,7 +3515,7 @@ coroutines.cpp: #-----| Type = [VoidType] void #-----| ValueCategory = prvalue #-----| getQualifier(): [VariableAccess] (unnamed local variable) -#-----| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +#-----| Type = [NestedTypedefType,TypeAliasType] promise_type #-----| ValueCategory = lvalue # 110| getArgument(0): [AddExpr] ... + ... # 110| Type = [IntType] int @@ -3549,7 +3549,7 @@ coroutines.cpp: # 108| Type = [VoidType] void # 108| ValueCategory = prvalue # 108| getQualifier(): [VariableAccess] (unnamed local variable) -# 108| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 108| Type = [NestedTypedefType,TypeAliasType] promise_type # 108| ValueCategory = lvalue #-----| getStmt(3): [LabelStmt] label ...: #-----| getStmt(4): [ExprStmt] ExprStmt @@ -3560,7 +3560,7 @@ coroutines.cpp: # 108| Type = [Struct] suspend_always # 108| ValueCategory = prvalue # 108| getQualifier(): [VariableAccess] (unnamed local variable) -# 108| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 108| Type = [NestedTypedefType,TypeAliasType] promise_type # 108| ValueCategory = lvalue # 108| getChild(1): [FunctionCall] call to await_ready # 108| Type = [BoolType] bool @@ -3575,7 +3575,7 @@ coroutines.cpp: # 108| Type = [Struct] suspend_always # 108| ValueCategory = prvalue # 108| getQualifier(): [VariableAccess] (unnamed local variable) -# 108| Type = [NestedTypedefType,UsingAliasTypedefType] promise_type +# 108| Type = [NestedTypedefType,TypeAliasType] promise_type # 108| ValueCategory = lvalue # 108| getOperand().getFullyConverted(): [TemporaryObjectExpr] temporary object # 108| Type = [Struct] suspend_always @@ -12796,10 +12796,10 @@ ir.cpp: # 1127| ValueCategory = lvalue # 1127| getBeginEndDeclaration(): [DeclStmt] declaration # 1127| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 1127| getExpr(): [FunctionCall] call to begin -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator # 1127| ValueCategory = prvalue # 1127| getQualifier(): [VariableAccess] (__range) # 1127| Type = [LValueReferenceType] const vector & @@ -12808,10 +12808,10 @@ ir.cpp: #-----| Type = [SpecifiedType] const vector #-----| ValueCategory = lvalue # 1127| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 1127| getExpr(): [FunctionCall] call to end -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator # 1127| ValueCategory = prvalue # 1127| getQualifier(): [VariableAccess] (__range) # 1127| Type = [LValueReferenceType] const vector & @@ -12823,13 +12823,13 @@ ir.cpp: # 1127| Type = [BoolType] bool # 1127| ValueCategory = prvalue # 1127| getQualifier(): [VariableAccess] (__begin) -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator # 1127| ValueCategory = lvalue # 1127| getArgument(0): [ConstructorCall] call to iterator # 1127| Type = [VoidType] void # 1127| ValueCategory = prvalue # 1127| getArgument(0): [VariableAccess] (__end) -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator # 1127| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -12849,7 +12849,7 @@ ir.cpp: # 1127| Type = [LValueReferenceType] iterator & # 1127| ValueCategory = prvalue # 1127| getQualifier(): [VariableAccess] (__begin) -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator # 1127| ValueCategory = lvalue # 1127| getChild(5): [DeclStmt] declaration # 1127| getDeclarationEntry(0): [VariableDeclarationEntry] definition of e @@ -12859,7 +12859,7 @@ ir.cpp: # 1127| Type = [LValueReferenceType] int & # 1127| ValueCategory = prvalue # 1127| getQualifier(): [VariableAccess] (__begin) -# 1127| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1127| Type = [NestedTypedefType,TypeAliasType] iterator # 1127| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -12902,10 +12902,10 @@ ir.cpp: # 1133| ValueCategory = lvalue # 1133| getBeginEndDeclaration(): [DeclStmt] declaration # 1133| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 1133| getExpr(): [FunctionCall] call to begin -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator # 1133| ValueCategory = prvalue # 1133| getQualifier(): [VariableAccess] (__range) # 1133| Type = [LValueReferenceType] const vector & @@ -12914,10 +12914,10 @@ ir.cpp: #-----| Type = [SpecifiedType] const vector #-----| ValueCategory = lvalue # 1133| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 1133| getExpr(): [FunctionCall] call to end -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator # 1133| ValueCategory = prvalue # 1133| getQualifier(): [VariableAccess] (__range) # 1133| Type = [LValueReferenceType] const vector & @@ -12929,13 +12929,13 @@ ir.cpp: # 1133| Type = [BoolType] bool # 1133| ValueCategory = prvalue # 1133| getQualifier(): [VariableAccess] (__begin) -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator # 1133| ValueCategory = lvalue # 1133| getArgument(0): [ConstructorCall] call to iterator # 1133| Type = [VoidType] void # 1133| ValueCategory = prvalue # 1133| getArgument(0): [VariableAccess] (__end) -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator # 1133| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -12955,7 +12955,7 @@ ir.cpp: # 1133| Type = [LValueReferenceType] iterator & # 1133| ValueCategory = prvalue # 1133| getQualifier(): [VariableAccess] (__begin) -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator # 1133| ValueCategory = lvalue # 1133| getChild(5): [DeclStmt] declaration # 1133| getDeclarationEntry(0): [VariableDeclarationEntry] definition of e @@ -12965,7 +12965,7 @@ ir.cpp: # 1133| Type = [LValueReferenceType] int & # 1133| ValueCategory = prvalue # 1133| getQualifier(): [VariableAccess] (__begin) -# 1133| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 1133| Type = [NestedTypedefType,TypeAliasType] iterator # 1133| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -16083,7 +16083,7 @@ ir.cpp: # 1634| Type = [LValueReferenceType] type & # 1634| ValueCategory = prvalue # 1634| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1634| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1634| Type = [NestedTypedefType,TypeAliasType] type # 1634| ValueCategory = lvalue # 1634| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d # 1634| Type = [LValueReferenceType] type & @@ -16098,13 +16098,13 @@ ir.cpp: # 1634| Type = [LValueReferenceType] type & # 1634| ValueCategory = prvalue # 1634| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1634| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1634| Type = [NestedTypedefType,TypeAliasType] type # 1634| ValueCategory = lvalue # 1634| getDeclarationEntry(3): [VariableDeclarationEntry] definition of r -# 1634| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1634| Type = [NestedTypedefType,TypeAliasType] type #-----| getVariable().getInitializer(): [Initializer] initializer for r # 1634| getExpr(): [FunctionCall] call to get -# 1634| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1634| Type = [NestedTypedefType,TypeAliasType] type # 1634| ValueCategory = prvalue # 1634| getQualifier(): [VariableAccess] (unnamed local variable) # 1634| Type = [Struct] StructuredBindingTupleRefGet @@ -16117,17 +16117,17 @@ ir.cpp: # 1634| ValueCategory = lvalue # 1635| getStmt(1): [ExprStmt] ExprStmt # 1635| getExpr(): [AssignExpr] ... = ... -# 1635| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1635| Type = [NestedTypedefType,TypeAliasType] type # 1635| ValueCategory = lvalue # 1635| getLValue(): [VariableAccess] d # 1635| Type = [LValueReferenceType] type & # 1635| ValueCategory = prvalue(load) # 1635| getRValue(): [Literal] 4.0 -# 1635| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1635| Type = [NestedTypedefType,TypeAliasType] type # 1635| Value = [Literal] 4.0 # 1635| ValueCategory = prvalue # 1635| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1635| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1635| Type = [NestedTypedefType,TypeAliasType] type # 1635| ValueCategory = lvalue # 1636| getStmt(2): [DeclStmt] declaration # 1636| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd @@ -16140,7 +16140,7 @@ ir.cpp: # 1636| Type = [LValueReferenceType] type & # 1636| ValueCategory = prvalue # 1636| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1636| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1636| Type = [NestedTypedefType,TypeAliasType] type # 1636| ValueCategory = lvalue # 1637| getStmt(3): [DeclStmt] declaration # 1637| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v @@ -16150,14 +16150,14 @@ ir.cpp: # 1637| Type = [LValueReferenceType] type & # 1637| ValueCategory = prvalue(load) # 1637| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1637| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1637| Type = [NestedTypedefType,TypeAliasType] type # 1637| ValueCategory = prvalue(load) # 1638| getStmt(4): [ExprStmt] ExprStmt # 1638| getExpr(): [AssignExpr] ... = ... # 1638| Type = [IntType] int # 1638| ValueCategory = lvalue # 1638| getLValue(): [VariableAccess] r -# 1638| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1638| Type = [NestedTypedefType,TypeAliasType] type # 1638| ValueCategory = prvalue(load) # 1638| getRValue(): [Literal] 5 # 1638| Type = [IntType] int @@ -16171,7 +16171,7 @@ ir.cpp: # 1639| Type = [LValueReferenceType] int & # 1639| getVariable().getInitializer(): [Initializer] initializer for rr # 1639| getExpr(): [VariableAccess] r -# 1639| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1639| Type = [NestedTypedefType,TypeAliasType] type # 1639| ValueCategory = prvalue(load) # 1639| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) # 1639| Type = [LValueReferenceType] int & @@ -16184,7 +16184,7 @@ ir.cpp: # 1640| Type = [IntType] int # 1640| getVariable().getInitializer(): [Initializer] initializer for w # 1640| getExpr(): [VariableAccess] r -# 1640| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1640| Type = [NestedTypedefType,TypeAliasType] type # 1640| ValueCategory = prvalue(load) # 1640| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1640| Type = [IntType] int @@ -16211,7 +16211,7 @@ ir.cpp: # 1645| Type = [LValueReferenceType] type & # 1645| ValueCategory = prvalue # 1645| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1645| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1645| Type = [NestedTypedefType,TypeAliasType] type # 1645| ValueCategory = lvalue # 1646| getStmt(2): [DeclStmt] declaration # 1646| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d @@ -16227,14 +16227,14 @@ ir.cpp: # 1646| Type = [LValueReferenceType] type & # 1646| ValueCategory = prvalue # 1646| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1646| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1646| Type = [NestedTypedefType,TypeAliasType] type # 1646| ValueCategory = lvalue # 1647| getStmt(3): [DeclStmt] declaration # 1647| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r # 1647| Type = [LValueReferenceType] int & # 1647| getVariable().getInitializer(): [Initializer] initializer for r # 1647| getExpr(): [FunctionCall] call to get -# 1647| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1647| Type = [NestedTypedefType,TypeAliasType] type # 1647| ValueCategory = prvalue # 1647| getQualifier(): [VariableAccess] unnamed_local_variable # 1647| Type = [Struct] StructuredBindingTupleRefGet @@ -16247,17 +16247,17 @@ ir.cpp: # 1647| ValueCategory = lvalue # 1648| getStmt(4): [ExprStmt] ExprStmt # 1648| getExpr(): [AssignExpr] ... = ... -# 1648| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1648| Type = [NestedTypedefType,TypeAliasType] type # 1648| ValueCategory = lvalue # 1648| getLValue(): [VariableAccess] d # 1648| Type = [LValueReferenceType] type & # 1648| ValueCategory = prvalue(load) # 1648| getRValue(): [Literal] 4.0 -# 1648| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1648| Type = [NestedTypedefType,TypeAliasType] type # 1648| Value = [Literal] 4.0 # 1648| ValueCategory = prvalue # 1648| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1648| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1648| Type = [NestedTypedefType,TypeAliasType] type # 1648| ValueCategory = lvalue # 1649| getStmt(5): [DeclStmt] declaration # 1649| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd @@ -16270,7 +16270,7 @@ ir.cpp: # 1649| Type = [LValueReferenceType] type & # 1649| ValueCategory = prvalue # 1649| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| Type = [NestedTypedefType,TypeAliasType] type # 1649| ValueCategory = lvalue # 1650| getStmt(6): [DeclStmt] declaration # 1650| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v @@ -16280,7 +16280,7 @@ ir.cpp: # 1650| Type = [LValueReferenceType] type & # 1650| ValueCategory = prvalue(load) # 1650| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| Type = [NestedTypedefType,TypeAliasType] type # 1650| ValueCategory = prvalue(load) # 1651| getStmt(7): [ExprStmt] ExprStmt # 1651| getExpr(): [AssignExpr] ... = ... @@ -16442,7 +16442,7 @@ ir.cpp: # 1700| Type = [RValueReferenceType] type && #-----| getVariable().getInitializer(): [Initializer] initializer for i # 1700| getExpr(): [FunctionCall] call to get -# 1700| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1700| Type = [NestedTypedefType,TypeAliasType] type # 1700| ValueCategory = prvalue # 1700| getQualifier(): [VariableAccess] (unnamed local variable) # 1700| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & @@ -16454,13 +16454,13 @@ ir.cpp: # 1700| Type = [LValueReferenceType] type & # 1700| ValueCategory = prvalue # 1700| getExpr(): [TemporaryObjectExpr] temporary object -# 1700| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1700| Type = [NestedTypedefType,TypeAliasType] type # 1700| ValueCategory = lvalue # 1700| getDeclarationEntry(2): [VariableDeclarationEntry] definition of r -# 1700| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1700| Type = [NestedTypedefType,TypeAliasType] type #-----| getVariable().getInitializer(): [Initializer] initializer for r # 1700| getExpr(): [FunctionCall] call to get -# 1700| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1700| Type = [NestedTypedefType,TypeAliasType] type # 1700| ValueCategory = prvalue # 1700| getQualifier(): [VariableAccess] (unnamed local variable) # 1700| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & @@ -16475,10 +16475,10 @@ ir.cpp: # 1700| Type = [IntType] int # 1700| ValueCategory = lvalue # 1700| getDeclarationEntry(3): [VariableDeclarationEntry] definition of rv -# 1700| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1700| Type = [NestedTypedefType,TypeAliasType] type #-----| getVariable().getInitializer(): [Initializer] initializer for rv # 1700| getExpr(): [FunctionCall] call to get -# 1700| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1700| Type = [NestedTypedefType,TypeAliasType] type # 1700| ValueCategory = prvalue # 1700| getQualifier(): [VariableAccess] (unnamed local variable) # 1700| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & @@ -16494,17 +16494,17 @@ ir.cpp: # 1700| ValueCategory = xvalue # 1701| getStmt(1): [ExprStmt] ExprStmt # 1701| getExpr(): [AssignExpr] ... = ... -# 1701| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1701| Type = [NestedTypedefType,TypeAliasType] type # 1701| ValueCategory = lvalue # 1701| getLValue(): [VariableAccess] i # 1701| Type = [RValueReferenceType] type && # 1701| ValueCategory = prvalue(load) # 1701| getRValue(): [Literal] 4 -# 1701| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1701| Type = [NestedTypedefType,TypeAliasType] type # 1701| Value = [Literal] 4 # 1701| ValueCategory = prvalue # 1701| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1701| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1701| Type = [NestedTypedefType,TypeAliasType] type # 1701| ValueCategory = lvalue # 1702| getStmt(2): [DeclStmt] declaration # 1702| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ri @@ -16517,7 +16517,7 @@ ir.cpp: # 1702| Type = [LValueReferenceType] type & # 1702| ValueCategory = prvalue # 1702| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1702| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1702| Type = [NestedTypedefType,TypeAliasType] type # 1702| ValueCategory = lvalue # 1703| getStmt(3): [DeclStmt] declaration # 1703| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v @@ -16527,14 +16527,14 @@ ir.cpp: # 1703| Type = [RValueReferenceType] type && # 1703| ValueCategory = prvalue(load) # 1703| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1703| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1703| Type = [NestedTypedefType,TypeAliasType] type # 1703| ValueCategory = prvalue(load) # 1704| getStmt(4): [ExprStmt] ExprStmt # 1704| getExpr(): [AssignExpr] ... = ... # 1704| Type = [IntType] int # 1704| ValueCategory = lvalue # 1704| getLValue(): [VariableAccess] r -# 1704| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1704| Type = [NestedTypedefType,TypeAliasType] type # 1704| ValueCategory = prvalue(load) # 1704| getRValue(): [Literal] 5 # 1704| Type = [IntType] int @@ -16548,7 +16548,7 @@ ir.cpp: # 1705| Type = [LValueReferenceType] int & # 1705| getVariable().getInitializer(): [Initializer] initializer for rr # 1705| getExpr(): [VariableAccess] r -# 1705| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1705| Type = [NestedTypedefType,TypeAliasType] type # 1705| ValueCategory = prvalue(load) # 1705| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) # 1705| Type = [LValueReferenceType] int & @@ -16561,7 +16561,7 @@ ir.cpp: # 1706| Type = [IntType] int # 1706| getVariable().getInitializer(): [Initializer] initializer for w # 1706| getExpr(): [VariableAccess] r -# 1706| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1706| Type = [NestedTypedefType,TypeAliasType] type # 1706| ValueCategory = prvalue(load) # 1706| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1706| Type = [IntType] int @@ -16582,7 +16582,7 @@ ir.cpp: # 1711| Type = [RValueReferenceType] type && # 1711| getVariable().getInitializer(): [Initializer] initializer for i # 1711| getExpr(): [FunctionCall] call to get -# 1711| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1711| Type = [NestedTypedefType,TypeAliasType] type # 1711| ValueCategory = prvalue # 1711| getQualifier(): [VariableAccess] unnamed_local_variable # 1711| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & @@ -16594,14 +16594,14 @@ ir.cpp: # 1711| Type = [LValueReferenceType] type & # 1711| ValueCategory = prvalue # 1711| getExpr(): [TemporaryObjectExpr] temporary object -# 1711| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1711| Type = [NestedTypedefType,TypeAliasType] type # 1711| ValueCategory = lvalue # 1712| getStmt(2): [DeclStmt] declaration # 1712| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r # 1712| Type = [LValueReferenceType] int & # 1712| getVariable().getInitializer(): [Initializer] initializer for r # 1712| getExpr(): [FunctionCall] call to get -# 1712| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1712| Type = [NestedTypedefType,TypeAliasType] type # 1712| ValueCategory = prvalue # 1712| getQualifier(): [VariableAccess] unnamed_local_variable # 1712| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & @@ -16620,7 +16620,7 @@ ir.cpp: # 1713| Type = [RValueReferenceType] int && # 1713| getVariable().getInitializer(): [Initializer] initializer for rv # 1713| getExpr(): [FunctionCall] call to get -# 1713| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1713| Type = [NestedTypedefType,TypeAliasType] type # 1713| ValueCategory = prvalue # 1713| getQualifier(): [VariableAccess] unnamed_local_variable # 1713| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & @@ -16636,17 +16636,17 @@ ir.cpp: # 1713| ValueCategory = xvalue # 1714| getStmt(4): [ExprStmt] ExprStmt # 1714| getExpr(): [AssignExpr] ... = ... -# 1714| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1714| Type = [NestedTypedefType,TypeAliasType] type # 1714| ValueCategory = lvalue # 1714| getLValue(): [VariableAccess] i # 1714| Type = [RValueReferenceType] type && # 1714| ValueCategory = prvalue(load) # 1714| getRValue(): [Literal] 4 -# 1714| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1714| Type = [NestedTypedefType,TypeAliasType] type # 1714| Value = [Literal] 4 # 1714| ValueCategory = prvalue # 1714| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1714| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1714| Type = [NestedTypedefType,TypeAliasType] type # 1714| ValueCategory = lvalue # 1715| getStmt(5): [DeclStmt] declaration # 1715| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ri @@ -16659,7 +16659,7 @@ ir.cpp: # 1715| Type = [LValueReferenceType] type & # 1715| ValueCategory = prvalue # 1715| getExpr(): [ReferenceDereferenceExpr] (reference dereference) -# 1715| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1715| Type = [NestedTypedefType,TypeAliasType] type # 1715| ValueCategory = lvalue # 1716| getStmt(6): [DeclStmt] declaration # 1716| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v @@ -16669,7 +16669,7 @@ ir.cpp: # 1716| Type = [RValueReferenceType] type && # 1716| ValueCategory = prvalue(load) # 1716| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 1716| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1716| Type = [NestedTypedefType,TypeAliasType] type # 1716| ValueCategory = prvalue(load) # 1717| getStmt(7): [ExprStmt] ExprStmt # 1717| getExpr(): [AssignExpr] ... = ... @@ -20080,10 +20080,10 @@ ir.cpp: # 2218| ValueCategory = prvalue # 2218| getBeginEndDeclaration(): [DeclStmt] declaration # 2218| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 2218| getExpr(): [FunctionCall] call to begin -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator # 2218| ValueCategory = prvalue # 2218| getQualifier(): [VariableAccess] (__range) # 2218| Type = [LValueReferenceType] vector & @@ -20096,10 +20096,10 @@ ir.cpp: #-----| Type = [ClassTemplateInstantiation,Struct] vector #-----| ValueCategory = lvalue # 2218| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 2218| getExpr(): [FunctionCall] call to end -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator # 2218| ValueCategory = prvalue # 2218| getQualifier(): [VariableAccess] (__range) # 2218| Type = [LValueReferenceType] vector & @@ -20115,13 +20115,13 @@ ir.cpp: # 2218| Type = [BoolType] bool # 2218| ValueCategory = prvalue # 2218| getQualifier(): [VariableAccess] (__begin) -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator # 2218| ValueCategory = lvalue # 2218| getArgument(0): [ConstructorCall] call to iterator # 2218| Type = [VoidType] void # 2218| ValueCategory = prvalue # 2218| getArgument(0): [VariableAccess] (__end) -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator # 2218| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -20141,7 +20141,7 @@ ir.cpp: # 2218| Type = [LValueReferenceType] iterator & # 2218| ValueCategory = prvalue # 2218| getQualifier(): [VariableAccess] (__begin) -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator # 2218| ValueCategory = lvalue # 2218| getChild(5): [DeclStmt] declaration # 2218| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y @@ -20151,7 +20151,7 @@ ir.cpp: # 2218| Type = [LValueReferenceType] ClassWithDestructor & # 2218| ValueCategory = prvalue # 2218| getQualifier(): [VariableAccess] (__begin) -# 2218| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2218| Type = [NestedTypedefType,TypeAliasType] iterator # 2218| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -20218,10 +20218,10 @@ ir.cpp: # 2221| ValueCategory = prvalue # 2221| getBeginEndDeclaration(): [DeclStmt] declaration # 2221| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 2221| getExpr(): [FunctionCall] call to begin -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator # 2221| ValueCategory = prvalue # 2221| getQualifier(): [VariableAccess] (__range) # 2221| Type = [LValueReferenceType] vector & @@ -20234,10 +20234,10 @@ ir.cpp: #-----| Type = [ClassTemplateInstantiation,Struct] vector #-----| ValueCategory = lvalue # 2221| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 2221| getExpr(): [FunctionCall] call to end -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator # 2221| ValueCategory = prvalue # 2221| getQualifier(): [VariableAccess] (__range) # 2221| Type = [LValueReferenceType] vector & @@ -20253,13 +20253,13 @@ ir.cpp: # 2221| Type = [BoolType] bool # 2221| ValueCategory = prvalue # 2221| getQualifier(): [VariableAccess] (__begin) -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator # 2221| ValueCategory = lvalue # 2221| getArgument(0): [ConstructorCall] call to iterator # 2221| Type = [VoidType] void # 2221| ValueCategory = prvalue # 2221| getArgument(0): [VariableAccess] (__end) -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator # 2221| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -20279,7 +20279,7 @@ ir.cpp: # 2221| Type = [LValueReferenceType] iterator & # 2221| ValueCategory = prvalue # 2221| getQualifier(): [VariableAccess] (__begin) -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator # 2221| ValueCategory = lvalue # 2221| getChild(5): [DeclStmt] declaration # 2221| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y @@ -20289,7 +20289,7 @@ ir.cpp: # 2221| Type = [LValueReferenceType] ClassWithDestructor & # 2221| ValueCategory = prvalue # 2221| getQualifier(): [VariableAccess] (__begin) -# 2221| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2221| Type = [NestedTypedefType,TypeAliasType] iterator # 2221| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -20391,10 +20391,10 @@ ir.cpp: # 2227| ValueCategory = prvalue # 2227| getBeginEndDeclaration(): [DeclStmt] declaration # 2227| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 2227| getExpr(): [FunctionCall] call to begin -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator # 2227| ValueCategory = prvalue # 2227| getQualifier(): [VariableAccess] (__range) # 2227| Type = [LValueReferenceType] vector & @@ -20407,10 +20407,10 @@ ir.cpp: #-----| Type = [ClassTemplateInstantiation,Struct] vector #-----| ValueCategory = lvalue # 2227| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 2227| getExpr(): [FunctionCall] call to end -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator # 2227| ValueCategory = prvalue # 2227| getQualifier(): [VariableAccess] (__range) # 2227| Type = [LValueReferenceType] vector & @@ -20426,13 +20426,13 @@ ir.cpp: # 2227| Type = [BoolType] bool # 2227| ValueCategory = prvalue # 2227| getQualifier(): [VariableAccess] (__begin) -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator # 2227| ValueCategory = lvalue # 2227| getArgument(0): [ConstructorCall] call to iterator # 2227| Type = [VoidType] void # 2227| ValueCategory = prvalue # 2227| getArgument(0): [VariableAccess] (__end) -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator # 2227| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -20452,7 +20452,7 @@ ir.cpp: # 2227| Type = [LValueReferenceType] iterator & # 2227| ValueCategory = prvalue # 2227| getQualifier(): [VariableAccess] (__begin) -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator # 2227| ValueCategory = lvalue # 2227| getChild(5): [DeclStmt] declaration # 2227| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y @@ -20462,7 +20462,7 @@ ir.cpp: # 2227| Type = [LValueReferenceType] int & # 2227| ValueCategory = prvalue # 2227| getQualifier(): [VariableAccess] (__begin) -# 2227| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2227| Type = [NestedTypedefType,TypeAliasType] iterator # 2227| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -20537,10 +20537,10 @@ ir.cpp: # 2232| ValueCategory = prvalue # 2232| getBeginEndDeclaration(): [DeclStmt] declaration # 2232| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 2232| getExpr(): [FunctionCall] call to begin -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator # 2232| ValueCategory = prvalue # 2232| getQualifier(): [VariableAccess] (__range) # 2232| Type = [LValueReferenceType] vector & @@ -20553,10 +20553,10 @@ ir.cpp: #-----| Type = [ClassTemplateInstantiation,Struct] vector #-----| ValueCategory = lvalue # 2232| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 2232| getExpr(): [FunctionCall] call to end -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator # 2232| ValueCategory = prvalue # 2232| getQualifier(): [VariableAccess] (__range) # 2232| Type = [LValueReferenceType] vector & @@ -20572,13 +20572,13 @@ ir.cpp: # 2232| Type = [BoolType] bool # 2232| ValueCategory = prvalue # 2232| getQualifier(): [VariableAccess] (__begin) -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator # 2232| ValueCategory = lvalue # 2232| getArgument(0): [ConstructorCall] call to iterator # 2232| Type = [VoidType] void # 2232| ValueCategory = prvalue # 2232| getArgument(0): [VariableAccess] (__end) -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator # 2232| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -20598,7 +20598,7 @@ ir.cpp: # 2232| Type = [LValueReferenceType] iterator & # 2232| ValueCategory = prvalue # 2232| getQualifier(): [VariableAccess] (__begin) -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator # 2232| ValueCategory = lvalue # 2232| getChild(5): [DeclStmt] declaration # 2232| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y @@ -20608,7 +20608,7 @@ ir.cpp: # 2232| Type = [LValueReferenceType] ClassWithDestructor & # 2232| ValueCategory = prvalue # 2232| getQualifier(): [VariableAccess] (__begin) -# 2232| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2232| Type = [NestedTypedefType,TypeAliasType] iterator # 2232| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -21168,10 +21168,10 @@ ir.cpp: # 2310| ValueCategory = xvalue # 2310| getBeginEndDeclaration(): [DeclStmt] declaration # 2310| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 2310| getExpr(): [FunctionCall] call to begin -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator # 2310| ValueCategory = prvalue # 2310| getQualifier(): [VariableAccess] (__range) # 2310| Type = [RValueReferenceType] vector && @@ -21184,10 +21184,10 @@ ir.cpp: #-----| Type = [ClassTemplateInstantiation,Struct] vector #-----| ValueCategory = lvalue # 2310| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 2310| getExpr(): [FunctionCall] call to end -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator # 2310| ValueCategory = prvalue # 2310| getQualifier(): [VariableAccess] (__range) # 2310| Type = [RValueReferenceType] vector && @@ -21203,13 +21203,13 @@ ir.cpp: # 2310| Type = [BoolType] bool # 2310| ValueCategory = prvalue # 2310| getQualifier(): [VariableAccess] (__begin) -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator # 2310| ValueCategory = lvalue # 2310| getArgument(0): [ConstructorCall] call to iterator # 2310| Type = [VoidType] void # 2310| ValueCategory = prvalue # 2310| getArgument(0): [VariableAccess] (__end) -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator # 2310| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -21229,7 +21229,7 @@ ir.cpp: # 2310| Type = [LValueReferenceType] iterator & # 2310| ValueCategory = prvalue # 2310| getQualifier(): [VariableAccess] (__begin) -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator # 2310| ValueCategory = lvalue # 2310| getChild(5): [DeclStmt] declaration # 2310| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s @@ -21242,7 +21242,7 @@ ir.cpp: # 2310| Type = [LValueReferenceType] String & # 2310| ValueCategory = prvalue # 2310| getQualifier(): [VariableAccess] (__begin) -# 2310| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2310| Type = [NestedTypedefType,TypeAliasType] iterator # 2310| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion @@ -22708,10 +22708,10 @@ ir.cpp: # 2433| ValueCategory = xvalue # 2433| getBeginEndDeclaration(): [DeclStmt] declaration # 2433| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) # 2433| getExpr(): [FunctionCall] call to begin -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator # 2433| ValueCategory = prvalue # 2433| getQualifier(): [VariableAccess] (__range) # 2433| Type = [RValueReferenceType] vector && @@ -22724,10 +22724,10 @@ ir.cpp: #-----| Type = [ClassTemplateInstantiation,Struct] vector #-----| ValueCategory = lvalue # 2433| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator #-----| getVariable().getInitializer(): [Initializer] initializer for (__end) # 2433| getExpr(): [FunctionCall] call to end -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator # 2433| ValueCategory = prvalue # 2433| getQualifier(): [VariableAccess] (__range) # 2433| Type = [RValueReferenceType] vector && @@ -22743,13 +22743,13 @@ ir.cpp: # 2433| Type = [BoolType] bool # 2433| ValueCategory = prvalue # 2433| getQualifier(): [VariableAccess] (__begin) -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator # 2433| ValueCategory = lvalue # 2433| getArgument(0): [ConstructorCall] call to iterator # 2433| Type = [VoidType] void # 2433| ValueCategory = prvalue # 2433| getArgument(0): [VariableAccess] (__end) -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator # 2433| ValueCategory = lvalue #-----| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) #-----| Type = [LValueReferenceType] const iterator & @@ -22769,7 +22769,7 @@ ir.cpp: # 2433| Type = [LValueReferenceType] iterator & # 2433| ValueCategory = prvalue # 2433| getQualifier(): [VariableAccess] (__begin) -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator # 2433| ValueCategory = lvalue # 2433| getChild(5): [DeclStmt] declaration # 2433| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y @@ -22779,7 +22779,7 @@ ir.cpp: # 2433| Type = [LValueReferenceType] char & # 2433| ValueCategory = prvalue # 2433| getQualifier(): [VariableAccess] (__begin) -# 2433| Type = [NestedTypedefType,UsingAliasTypedefType] iterator +# 2433| Type = [NestedTypedefType,TypeAliasType] iterator # 2433| ValueCategory = lvalue #-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... #-----| Conversion = [GlvalueConversion] glvalue conversion diff --git a/cpp/ql/test/library-tests/scanf/scanfFormatLiteral.expected b/cpp/ql/test/library-tests/scanf/scanfFormatLiteral.expected index 263ea54b8cd3..f6fc707b4945 100644 --- a/cpp/ql/test/library-tests/scanf/scanfFormatLiteral.expected +++ b/cpp/ql/test/library-tests/scanf/scanfFormatLiteral.expected @@ -1,5 +1,8 @@ -| test.c:18:2:18:6 | call to scanf | 0 | s | 0 | 0 | -| test.c:19:2:19:7 | call to fscanf | 0 | s | 10 | 10 | -| test.c:19:2:19:7 | call to fscanf | 1 | i | 0 | 0 | -| test.c:20:2:20:7 | call to sscanf | 0 | s | 0 | 0 | -| test.c:21:2:21:8 | call to swscanf | 0 | s | 10 | 10 | +| test.c:19:2:19:6 | call to scanf | 0 | s | 0 | 0 | +| test.c:20:2:20:7 | call to fscanf | 0 | s | 10 | 10 | +| test.c:20:2:20:7 | call to fscanf | 1 | i | 0 | 0 | +| test.c:21:2:21:7 | call to sscanf | 0 | s | 0 | 0 | +| test.c:22:2:22:8 | call to swscanf | 0 | s | 10 | 10 | +| test.c:23:2:23:8 | call to scanf_s | 0 | d | 0 | 0 | +| test.c:23:2:23:8 | call to scanf_s | 1 | s | 0 | 0 | +| test.c:23:2:23:8 | call to scanf_s | 2 | d | 0 | 0 | diff --git a/cpp/ql/test/library-tests/scanf/scanfFunctionCall.expected b/cpp/ql/test/library-tests/scanf/scanfFunctionCall.expected index b0dce385b7bb..ba658bd6d2f5 100644 --- a/cpp/ql/test/library-tests/scanf/scanfFunctionCall.expected +++ b/cpp/ql/test/library-tests/scanf/scanfFunctionCall.expected @@ -1,5 +1,6 @@ | ms.cpp:17:3:17:8 | call to sscanf | 0 | 1 | ms.cpp:17:24:17:30 | %I64i | non-wide | -| test.c:18:2:18:6 | call to scanf | 0 | 0 | test.c:18:8:18:11 | %s | non-wide | -| test.c:19:2:19:7 | call to fscanf | 0 | 1 | test.c:19:15:19:23 | %10s %i | non-wide | -| test.c:20:2:20:7 | call to sscanf | 0 | 1 | test.c:20:19:20:28 | %*i%s%*s | non-wide | -| test.c:21:2:21:8 | call to swscanf | 0 | 1 | test.c:21:21:21:26 | %10s | wide | +| test.c:19:2:19:6 | call to scanf | 0 | 0 | test.c:19:8:19:11 | %s | non-wide | +| test.c:20:2:20:7 | call to fscanf | 0 | 1 | test.c:20:15:20:23 | %10s %i | non-wide | +| test.c:21:2:21:7 | call to sscanf | 0 | 1 | test.c:21:19:21:28 | %*i%s%*s | non-wide | +| test.c:22:2:22:8 | call to swscanf | 0 | 1 | test.c:22:21:22:26 | %10s | wide | +| test.c:23:2:23:8 | call to scanf_s | 0 | 0 | test.c:23:10:23:19 | %d %s %d | non-wide | diff --git a/cpp/ql/test/library-tests/scanf/scanfFunctionCallOutput.expected b/cpp/ql/test/library-tests/scanf/scanfFunctionCallOutput.expected new file mode 100644 index 000000000000..87998b4c367b --- /dev/null +++ b/cpp/ql/test/library-tests/scanf/scanfFunctionCallOutput.expected @@ -0,0 +1,9 @@ +| ms.cpp:17:3:17:8 | call to sscanf | ms.cpp:17:33:17:36 | & ... | 0 | +| test.c:19:2:19:6 | call to scanf | test.c:19:14:19:19 | buffer | 0 | +| test.c:20:2:20:7 | call to fscanf | test.c:20:26:20:31 | buffer | 0 | +| test.c:20:2:20:7 | call to fscanf | test.c:20:34:20:34 | i | 1 | +| test.c:21:2:21:7 | call to sscanf | test.c:21:31:21:36 | buffer | 0 | +| test.c:22:2:22:8 | call to swscanf | test.c:22:29:22:35 | wbuffer | 0 | +| test.c:23:2:23:8 | call to scanf_s | test.c:23:22:23:23 | & ... | 0 | +| test.c:23:2:23:8 | call to scanf_s | test.c:23:26:23:31 | buffer | 1 | +| test.c:23:2:23:8 | call to scanf_s | test.c:23:38:23:40 | & ... | 2 | diff --git a/cpp/ql/test/library-tests/scanf/scanfFunctionCallOutput.ql b/cpp/ql/test/library-tests/scanf/scanfFunctionCallOutput.ql new file mode 100644 index 000000000000..a3d40604cfa8 --- /dev/null +++ b/cpp/ql/test/library-tests/scanf/scanfFunctionCallOutput.ql @@ -0,0 +1,5 @@ +import semmle.code.cpp.commons.Scanf + +from ScanfFunctionCall sfc, Expr e, int n +where e = sfc.getOutputArgument(n) +select sfc, e, n diff --git a/cpp/ql/test/library-tests/scanf/test.c b/cpp/ql/test/library-tests/scanf/test.c index c378eec72220..eb99bbec7adf 100644 --- a/cpp/ql/test/library-tests/scanf/test.c +++ b/cpp/ql/test/library-tests/scanf/test.c @@ -7,18 +7,20 @@ int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *s, const char *format, ...); int swscanf(const wchar_t* ws, const wchar_t* format, ...); +int scanf_s(const char *format, ...); int main(int argc, char *argv[]) { char buffer[256]; wchar_t wbuffer[256]; FILE *file; - int i; + int i, i2; scanf("%s", buffer); fscanf(file, "%10s %i", buffer, i); sscanf("Hello.", "%*i%s%*s", buffer); swscanf(L"Hello.", "%10s", wbuffer); + scanf_s("%d %s %d", &i, buffer, 10, &i2); return 0; } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/using-aliases/using-alias.expected b/cpp/ql/test/library-tests/using-aliases/using-alias.expected index e528b93e279d..7a08db82ae49 100644 --- a/cpp/ql/test/library-tests/using-aliases/using-alias.expected +++ b/cpp/ql/test/library-tests/using-aliases/using-alias.expected @@ -1,9 +1,9 @@ | file://:0:0:0:0 | X | NestedTypedefType | file://:0:0:0:0 | int * | -| file://:0:0:0:0 | X | UsingAliasTypedefType | file://:0:0:0:0 | int * | +| file://:0:0:0:0 | X | TypeAliasType | file://:0:0:0:0 | int * | | using-alias.cpp:2:13:2:17 | type1 | CTypedefType | file://:0:0:0:0 | int | -| using-alias.cpp:3:7:3:12 | using1 | UsingAliasTypedefType | file://:0:0:0:0 | float | +| using-alias.cpp:3:7:3:12 | using1 | TypeAliasType | file://:0:0:0:0 | float | | using-alias.cpp:5:16:5:20 | type2 | CTypedefType | file://:0:0:0:0 | float | -| using-alias.cpp:6:7:6:12 | using2 | UsingAliasTypedefType | file://:0:0:0:0 | int | +| using-alias.cpp:6:7:6:12 | using2 | TypeAliasType | file://:0:0:0:0 | int | | using-alias.cpp:8:39:8:39 | X | NestedTypedefType | file://:0:0:0:0 | T * | -| using-alias.cpp:8:39:8:39 | X | UsingAliasTypedefType | file://:0:0:0:0 | T * | -| using-alias.cpp:10:7:10:7 | Y | UsingAliasTypedefType | file://:0:0:0:0 | int * | +| using-alias.cpp:8:39:8:39 | X | TypeAliasType | file://:0:0:0:0 | T * | +| using-alias.cpp:10:7:10:7 | Y | TypeAliasType | file://:0:0:0:0 | int * | diff --git a/csharp/.config/dotnet-tools.json b/csharp/.config/dotnet-tools.json index 66126b691f49..f4f161bafeeb 100644 --- a/csharp/.config/dotnet-tools.json +++ b/csharp/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "paket": { - "version": "10.0.0-alpha011", + "version": "10.3.1", "commands": [ "paket" ] diff --git a/csharp/.paket/Paket.Restore.targets b/csharp/.paket/Paket.Restore.targets index 17aeb63502d0..8f48b933eb93 100644 --- a/csharp/.paket/Paket.Restore.targets +++ b/csharp/.paket/Paket.Restore.targets @@ -241,8 +241,9 @@ $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[6]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[7]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[8]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[9]) - + %(PaketReferencesFileLinesInfo.PackageVersion) All runtime @@ -251,10 +252,8 @@ %(PaketReferencesFileLinesInfo.Aliases) true true - - - + %(PaketReferencesFileLinesInfo.PackageVersion) @@ -319,7 +318,17 @@ - + + + + + <_DefinedConditionProperties Include="@(_ConditionProperties)" Condition="$(%(Identity)) == 'true'"/> + + + <_ConditionsParameter> + <_ConditionsParameter Condition="@(_DefinedConditionProperties) != ''">--conditions @(_DefinedConditionProperties) + + diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Util/SymbolExtensions.cs b/csharp/extractor/Semmle.Extraction.CSharp.Util/SymbolExtensions.cs index 92d7ecfad6bb..8106cfbf2337 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Util/SymbolExtensions.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Util/SymbolExtensions.cs @@ -52,6 +52,13 @@ public static string GetName(this ISymbol symbol, bool useMetadataName = false) { "op_False", "false" } }); + /// + /// The operatorname for user-defined instance increment- and decrement operators are "op_IncrementAssignment" and + /// "op_DecrementAssignment" respectively. + /// Thus we need to handle this explicitly to avoid postfixing them with an "=". + /// + private static bool IsIncrementOrDecrement(string operatorName) => operatorName == "++" || operatorName == "--"; + /// /// Convert an operator method name in to a symbolic name. /// A return value indicates whether the conversion succeeded. @@ -72,7 +79,7 @@ public static bool TryGetOperatorSymbol(this ISymbol symbol, out string operator if (match.Success && methodToOperator.TryGetValue($"op_{match.Groups[2]}", out var rawOperatorName)) { var prefix = match.Groups[1].Success ? "checked " : ""; - var postfix = match.Groups[3].Success ? "=" : ""; + var postfix = match.Groups[3].Success && !IsIncrementOrDecrement(rawOperatorName) ? "=" : ""; operatorName = $"{prefix}{rawOperatorName}{postfix}"; return true; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs b/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs index fbc1b52c99b3..dd7246fa6597 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs @@ -664,7 +664,7 @@ public static bool IsCompilerGeneratedExtensionMethod(this IMethodSymbol method) // Find the (possibly unbound) original extension method that maps to this implementation (if any). var unboundDeclaration = extensions.SelectMany(e => e.GetMembers()) .OfType() - .FirstOrDefault(m => SymbolEqualityComparer.Default.Equals(m.AssociatedExtensionImplementation, method.ConstructedFrom)); + .FirstOrDefault(m => SymbolEqualityComparer.Default.Equals(m.AssociatedExtensionImplementation?.ConstructedFrom, method.ConstructedFrom)); var isFullyConstructed = method.IsBoundGenericMethod(); if (isFullyConstructed && unboundDeclaration?.ContainingType is INamedTypeSymbol extensionType) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Accessor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Accessor.cs index ed409e23b395..7e30d4d5f7cb 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Accessor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Accessor.cs @@ -69,6 +69,7 @@ public override void Populate(TextWriter trapFile) } Overrides(trapFile); + ExtractRefReturn(trapFile, Symbol, this); if (Symbol.FromSource() && !HasBody) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Compilations/Compilation.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Compilations/Compilation.cs index 2c74775460da..dd82f7077276 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Compilations/Compilation.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Compilations/Compilation.cs @@ -32,9 +32,13 @@ public override void Populate(TextWriter trapFile) { var assembly = Assembly.CreateOutputAssembly(Context); - trapFile.compilations(this, FileUtils.ConvertToUnix(cwd)); + var path = Context.ExtractionContext.PathTransformer.Transform(cwd); + trapFile.compilations(this, path.Value); trapFile.compilation_assembly(this, assembly); + // Ensure that a `Folder` entity exists + Folder.Create(Context, path); + // Arguments var expandedIndex = 0; for (var i = 0; i < args.Length; i++) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs index 4ab90def2c16..bf02ba49a2bd 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs @@ -234,9 +234,9 @@ type.SpecialType is SpecialType.System_IntPtr || /// /// The expression syntax node. /// Returns the target method symbol, or null if it cannot be resolved. - protected IMethodSymbol? GetTargetSymbol(ExpressionSyntax node) + protected static IMethodSymbol? GetTargetSymbol(Context cx, ExpressionSyntax node) { - var si = Context.GetSymbolInfo(node); + var si = cx.GetSymbolInfo(node); if (si.Symbol is ISymbol symbol) { var method = symbol as IMethodSymbol; @@ -255,7 +255,7 @@ type.SpecialType is SpecialType.System_IntPtr || .Where(method => method.Parameters.Length >= syntax.ArgumentList.Arguments.Count) .Where(method => method.Parameters.Count(p => !p.HasExplicitDefaultValue) <= syntax.ArgumentList.Arguments.Count); - return Context.ExtractionContext.IsStandalone ? + return cx.ExtractionContext.IsStandalone ? candidates.FirstOrDefault() : candidates.SingleOrDefault(); } @@ -281,7 +281,7 @@ public static ExprKind UnaryOperatorKind(Context cx, ExprKind originalKind, Expr /// The expression. public void AddOperatorCall(TextWriter trapFile, ExpressionSyntax node) { - var @operator = GetTargetSymbol(node); + var @operator = GetTargetSymbol(Context, node); if (@operator is IMethodSymbol method) { var callType = GetCallType(Context, node); @@ -312,9 +312,9 @@ public enum CallType /// The call type. public static CallType GetCallType(Context cx, ExpressionSyntax node) { - var @operator = cx.GetSymbolInfo(node); + var @operator = GetTargetSymbol(cx, node); - if (@operator.Symbol is IMethodSymbol method) + if (@operator is IMethodSymbol method) { if (method.ContainingSymbol is ITypeSymbol containingSymbol && containingSymbol.TypeKind == Microsoft.CodeAnalysis.TypeKind.Dynamic) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs index ed8dae3738fc..70760590070e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs @@ -58,10 +58,10 @@ internal static Expression Create(ExpressionNodeInfo info) return Invocation.Create(info); case SyntaxKind.PostIncrementExpression: - return PostfixUnary.Create(info.SetKind(ExprKind.POST_INCR), ((PostfixUnaryExpressionSyntax)info.Node).Operand); + return PostfixUnary.Create(info.SetKind(ExprKind.POST_INCR)); case SyntaxKind.PostDecrementExpression: - return PostfixUnary.Create(info.SetKind(ExprKind.POST_DECR), ((PostfixUnaryExpressionSyntax)info.Node).Operand); + return PostfixUnary.Create(info.SetKind(ExprKind.POST_DECR)); case SyntaxKind.AwaitExpression: return Await.Create(info); @@ -109,10 +109,10 @@ internal static Expression Create(ExpressionNodeInfo info) return MemberAccess.Create(info, (MemberAccessExpressionSyntax)info.Node); case SyntaxKind.UnaryMinusExpression: - return Unary.Create(info.SetKind(ExprKind.MINUS)); + return PrefixUnary.Create(info.SetKind(ExprKind.MINUS)); case SyntaxKind.UnaryPlusExpression: - return Unary.Create(info.SetKind(ExprKind.PLUS)); + return PrefixUnary.Create(info.SetKind(ExprKind.PLUS)); case SyntaxKind.SimpleLambdaExpression: return Lambda.Create(info, (SimpleLambdaExpressionSyntax)info.Node); @@ -146,16 +146,16 @@ internal static Expression Create(ExpressionNodeInfo info) return Name.Create(info); case SyntaxKind.LogicalNotExpression: - return Unary.Create(info.SetKind(ExprKind.LOG_NOT)); + return PrefixUnary.Create(info.SetKind(ExprKind.LOG_NOT)); case SyntaxKind.BitwiseNotExpression: - return Unary.Create(info.SetKind(ExprKind.BIT_NOT)); + return PrefixUnary.Create(info.SetKind(ExprKind.BIT_NOT)); case SyntaxKind.PreIncrementExpression: - return Unary.Create(info.SetKind(ExprKind.PRE_INCR)); + return PrefixUnary.Create(info.SetKind(ExprKind.PRE_INCR)); case SyntaxKind.PreDecrementExpression: - return Unary.Create(info.SetKind(ExprKind.PRE_DECR)); + return PrefixUnary.Create(info.SetKind(ExprKind.PRE_DECR)); case SyntaxKind.ThisExpression: return This.CreateExplicit(info); @@ -164,10 +164,10 @@ internal static Expression Create(ExpressionNodeInfo info) return PropertyFieldAccess.Create(info); case SyntaxKind.AddressOfExpression: - return Unary.Create(info.SetKind(ExprKind.ADDRESS_OF)); + return PrefixUnary.Create(info.SetKind(ExprKind.ADDRESS_OF)); case SyntaxKind.PointerIndirectionExpression: - return Unary.Create(info.SetKind(ExprKind.POINTER_INDIRECTION)); + return PrefixUnary.Create(info.SetKind(ExprKind.POINTER_INDIRECTION)); case SyntaxKind.DefaultExpression: return Default.Create(info); @@ -248,13 +248,13 @@ internal static Expression Create(ExpressionNodeInfo info) return RangeExpression.Create(info); case SyntaxKind.IndexExpression: - return Unary.Create(info.SetKind(ExprKind.INDEX)); + return PrefixUnary.Create(info.SetKind(ExprKind.INDEX)); case SyntaxKind.SwitchExpression: return Switch.Create(info); case SyntaxKind.SuppressNullableWarningExpression: - return PostfixUnary.Create(info.SetKind(ExprKind.SUPPRESS_NULLABLE_WARNING), ((PostfixUnaryExpressionSyntax)info.Node).Operand); + return PostfixUnary.Create(info.SetKind(ExprKind.SUPPRESS_NULLABLE_WARNING)); case SyntaxKind.WithExpression: return WithExpression.Create(info); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Invocation.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Invocation.cs index 343f288eeafe..5b25e53e8eef 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Invocation.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Invocation.cs @@ -44,7 +44,7 @@ protected override void PopulateExpression(TextWriter trapFile) var child = -1; string? memberName = null; - var target = GetTargetSymbol(Syntax); + var target = GetTargetSymbol(Context, Syntax); switch (Syntax.Expression) { case MemberAccessExpressionSyntax memberAccess when IsValidMemberAccessKind(): diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs index 051a03e9f8c2..dd7682bf7bb6 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs @@ -4,29 +4,30 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions { - internal class PostfixUnary : Expression + internal class PostfixUnary : Expression { - private PostfixUnary(ExpressionNodeInfo info, ExprKind kind, ExpressionSyntax operand) + private PostfixUnary(ExpressionNodeInfo info, ExprKind kind) : base(info.SetKind(UnaryOperatorKind(info.Context, kind, info.Node))) { - this.operand = operand; operatorKind = kind; } - private readonly ExpressionSyntax operand; private readonly ExprKind operatorKind; - public static Expression Create(ExpressionNodeInfo info, ExpressionSyntax operand) => new PostfixUnary(info, info.Kind, operand).TryPopulate(); + public static Expression Create(ExpressionNodeInfo info) => new PostfixUnary(info, info.Kind).TryPopulate(); protected override void PopulateExpression(TextWriter trapFile) { - Create(Context, operand, this, 0); + Create(Context, Syntax.Operand, this, 0); - if ((operatorKind == ExprKind.POST_INCR || operatorKind == ExprKind.POST_DECR) && - Kind == ExprKind.OPERATOR_INVOCATION) + if (Kind == ExprKind.OPERATOR_INVOCATION) { AddOperatorCall(trapFile, Syntax); - trapFile.mutator_invocation_mode(this, 2); + + if (operatorKind == ExprKind.POST_INCR || operatorKind == ExprKind.POST_DECR) + { + trapFile.mutator_invocation_mode(this, 2); + } } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs new file mode 100644 index 000000000000..ca58a8aeb283 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs @@ -0,0 +1,34 @@ +using System.IO; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Semmle.Extraction.Kinds; + +namespace Semmle.Extraction.CSharp.Entities.Expressions +{ + internal class PrefixUnary : Expression + { + private PrefixUnary(ExpressionNodeInfo info, ExprKind kind) + : base(info.SetKind(UnaryOperatorKind(info.Context, info.Kind, info.Node))) + { + operatorKind = kind; + } + + private readonly ExprKind operatorKind; + + public static Expression Create(ExpressionNodeInfo info) => new PrefixUnary(info, info.Kind).TryPopulate(); + + protected override void PopulateExpression(TextWriter trapFile) + { + Create(Context, Syntax.Operand, this, 0); + + if (Kind == ExprKind.OPERATOR_INVOCATION) + { + AddOperatorCall(trapFile, Syntax); + + if (operatorKind == ExprKind.PRE_INCR || operatorKind == ExprKind.PRE_DECR) + { + trapFile.mutator_invocation_mode(this, 1); + } + } + } + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs deleted file mode 100644 index 699c3810d116..000000000000 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.IO; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Semmle.Extraction.Kinds; - -namespace Semmle.Extraction.CSharp.Entities.Expressions -{ - internal class Unary : Expression - { - private Unary(ExpressionNodeInfo info, ExprKind kind) - : base(info.SetKind(UnaryOperatorKind(info.Context, info.Kind, info.Node))) - { - operatorKind = kind; - } - - private readonly ExprKind operatorKind; - - public static Unary Create(ExpressionNodeInfo info) - { - var ret = new Unary(info, info.Kind); - ret.TryPopulate(); - return ret; - } - - protected override void PopulateExpression(TextWriter trapFile) - { - Create(Context, Syntax.Operand, this, 0); - AddOperatorCall(trapFile, Syntax); - - if ((operatorKind == ExprKind.PRE_INCR || operatorKind == ExprKind.PRE_DECR) && - Kind == ExprKind.OPERATOR_INVOCATION) - { - trapFile.mutator_invocation_mode(this, 1); - } - } - } -} diff --git a/csharp/paket.dependencies b/csharp/paket.dependencies index 61cb1d3d8d9f..19a45cd75308 100644 --- a/csharp/paket.dependencies +++ b/csharp/paket.dependencies @@ -4,7 +4,7 @@ source https://api.nuget.org/v3/index.json # behave like nuget in choosing transitive dependency versions strategy: max -nuget Basic.CompilerLog.Util 0.9.25 +nuget Basic.CompilerLog.Util 0.9.39 nuget Mono.Posix.NETStandard nuget Newtonsoft.Json nuget NuGet.Versioning @@ -12,7 +12,7 @@ nuget xunit nuget xunit.runner.visualstudio nuget xunit.runner.utility nuget Microsoft.NET.Test.Sdk -nuget Microsoft.CodeAnalysis.CSharp 5.0.0 -nuget Microsoft.CodeAnalysis 5.0.0 -nuget Microsoft.Build 18.0.2 +nuget Microsoft.CodeAnalysis.CSharp 5.3.0 +nuget Microsoft.CodeAnalysis 5.3.0 +nuget Microsoft.Build 18.6.3 nuget Microsoft.VisualStudio.SolutionPersistence diff --git a/csharp/paket.lock b/csharp/paket.lock index 42d537cc181b..f76a8afa7eb4 100644 --- a/csharp/paket.lock +++ b/csharp/paket.lock @@ -3,45 +3,42 @@ STRATEGY: MAX RESTRICTION: == net10.0 NUGET remote: https://api.nuget.org/v3/index.json - Basic.CompilerLog.Util (0.9.25) + Basic.CompilerLog.Util (0.9.39) MessagePack (>= 3.1.4) - Microsoft.Bcl.Memory (>= 9.0.10) + Microsoft.Bcl.Memory (>= 10.0.7) Microsoft.CodeAnalysis (>= 4.8) Microsoft.CodeAnalysis.CSharp (>= 4.8) Microsoft.CodeAnalysis.VisualBasic (>= 4.8) - Microsoft.Extensions.ObjectPool (>= 9.0.10) - MSBuild.StructuredLogger (>= 2.3.71) - NaturalSort.Extension (>= 4.4) - NuGet.Versioning (>= 6.14) - Humanizer.Core (3.0.1) - MessagePack (3.1.4) - MessagePack.Annotations (>= 3.1.4) - MessagePackAnalyzer (>= 3.1.4) + Microsoft.Extensions.ObjectPool (>= 10.0.7) + MSBuild.StructuredLogger (>= 2.3.178) + Humanizer.Core (3.0.10) + MessagePack (3.1.6) + MessagePack.Annotations (>= 3.1.6) + MessagePackAnalyzer (>= 3.1.6) Microsoft.NET.StringTools (>= 17.11.4) - MessagePack.Annotations (3.1.4) - MessagePackAnalyzer (3.1.4) - Microsoft.Bcl.AsyncInterfaces (10.0.1) - Microsoft.Bcl.Memory (10.0.1) - Microsoft.Build (18.0.2) - Microsoft.Build.Framework (>= 18.0.2) - Microsoft.NET.StringTools (>= 18.0.2) - System.Configuration.ConfigurationManager (>= 9.0) - System.Diagnostics.EventLog (>= 9.0) - System.Reflection.MetadataLoadContext (>= 9.0) - System.Security.Cryptography.ProtectedData (>= 9.0.6) - Microsoft.Build.Framework (18.0.2) - Microsoft.Build.Utilities.Core (18.0.2) - Microsoft.Build.Framework (>= 18.0.2) - Microsoft.NET.StringTools (>= 18.0.2) - System.Configuration.ConfigurationManager (>= 9.0) - System.Diagnostics.EventLog (>= 9.0) - System.Security.Cryptography.ProtectedData (>= 9.0.6) - Microsoft.CodeAnalysis (5.0) + MessagePack.Annotations (3.1.6) + MessagePackAnalyzer (3.1.6) + Microsoft.Bcl.AsyncInterfaces (10.0.8) + Microsoft.Bcl.Memory (10.0.8) + Microsoft.Build (18.6.3) + Microsoft.Build.Framework (>= 18.6.3) + System.Configuration.ConfigurationManager (>= 10.0.3) + System.Diagnostics.EventLog (>= 10.0.3) + System.Reflection.MetadataLoadContext (>= 10.0.3) + System.Security.Cryptography.ProtectedData (>= 10.0.3) + Microsoft.Build.Framework (18.6.3) + Microsoft.NET.StringTools (>= 18.6.3) + Microsoft.Build.Utilities.Core (18.6.3) + Microsoft.Build.Framework (>= 18.6.3) + System.Configuration.ConfigurationManager (>= 10.0.3) + System.Diagnostics.EventLog (>= 10.0.3) + System.Security.Cryptography.ProtectedData (>= 10.0.3) + Microsoft.CodeAnalysis (5.3) Humanizer.Core (>= 2.14.1) Microsoft.Bcl.AsyncInterfaces (>= 9.0) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.CSharp.Workspaces (5.0) - Microsoft.CodeAnalysis.VisualBasic.Workspaces (5.0) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.CSharp.Workspaces (5.3) + Microsoft.CodeAnalysis.VisualBasic.Workspaces (5.3) System.Buffers (>= 4.6) System.Collections.Immutable (>= 9.0) System.Composition (>= 9.0) @@ -53,92 +50,90 @@ NUGET System.Text.Encoding.CodePages (>= 8.0) System.Threading.Channels (>= 8.0) System.Threading.Tasks.Extensions (>= 4.6) - Microsoft.CodeAnalysis.Analyzers (3.11) - Microsoft.CodeAnalysis.Common (5.0) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.CSharp (5.0) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (5.0) - Microsoft.CodeAnalysis.CSharp.Workspaces (5.0) + Microsoft.CodeAnalysis.Analyzers (5.3) + Microsoft.CodeAnalysis.Common (5.3) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.CSharp (5.3) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.Common (5.3) + Microsoft.CodeAnalysis.CSharp.Workspaces (5.3) Humanizer.Core (>= 2.14.1) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (5.0) - Microsoft.CodeAnalysis.CSharp (5.0) - Microsoft.CodeAnalysis.Workspaces.Common (5.0) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.Common (5.3) + Microsoft.CodeAnalysis.CSharp (5.3) + Microsoft.CodeAnalysis.Workspaces.Common (5.3) System.Composition (>= 9.0) - Microsoft.CodeAnalysis.VisualBasic (5.0) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (5.0) - Microsoft.CodeAnalysis.VisualBasic.Workspaces (5.0) + Microsoft.CodeAnalysis.VisualBasic (5.3) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.Common (5.3) + Microsoft.CodeAnalysis.VisualBasic.Workspaces (5.3) Humanizer.Core (>= 2.14.1) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (5.0) - Microsoft.CodeAnalysis.VisualBasic (5.0) - Microsoft.CodeAnalysis.Workspaces.Common (5.0) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.Common (5.3) + Microsoft.CodeAnalysis.VisualBasic (5.3) + Microsoft.CodeAnalysis.Workspaces.Common (5.3) System.Composition (>= 9.0) - Microsoft.CodeAnalysis.Workspaces.Common (5.0) + Microsoft.CodeAnalysis.Workspaces.Common (5.3) Humanizer.Core (>= 2.14.1) - Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (5.0) + Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) + Microsoft.CodeAnalysis.Common (5.3) System.Composition (>= 9.0) - Microsoft.CodeCoverage (18.0.1) - Microsoft.Extensions.ObjectPool (10.0.1) - Microsoft.NET.StringTools (18.0.2) - Microsoft.NET.Test.Sdk (18.0.1) - Microsoft.CodeCoverage (>= 18.0.1) - Microsoft.TestPlatform.TestHost (>= 18.0.1) - Microsoft.TestPlatform.ObjectModel (18.0.1) + Microsoft.CodeCoverage (18.5.1) + Microsoft.Extensions.ObjectPool (10.0.8) + Microsoft.NET.StringTools (18.6.3) + Microsoft.NET.Test.Sdk (18.5.1) + Microsoft.CodeCoverage (>= 18.5.1) + Microsoft.TestPlatform.TestHost (>= 18.5.1) + Microsoft.TestPlatform.ObjectModel (18.5.1) System.Reflection.Metadata (>= 8.0) - Microsoft.TestPlatform.TestHost (18.0.1) - Microsoft.TestPlatform.ObjectModel (>= 18.0.1) + Microsoft.TestPlatform.TestHost (18.5.1) + Microsoft.TestPlatform.ObjectModel (>= 18.5.1) Newtonsoft.Json (>= 13.0.3) Microsoft.VisualStudio.SolutionPersistence (1.0.52) Mono.Posix.NETStandard (1.0) - MSBuild.StructuredLogger (2.3.113) + MSBuild.StructuredLogger (2.3.204) Microsoft.Build.Framework (>= 17.5) Microsoft.Build.Utilities.Core (>= 17.5) - System.Collections.Immutable (>= 8.0) - NaturalSort.Extension (4.4.1) Newtonsoft.Json (13.0.4) - NuGet.Versioning (7.0.1) + NuGet.Versioning (7.6) System.Buffers (4.6.1) - System.Collections.Immutable (10.0.1) - System.Composition (10.0.1) - System.Composition.AttributedModel (>= 10.0.1) - System.Composition.Convention (>= 10.0.1) - System.Composition.Hosting (>= 10.0.1) - System.Composition.Runtime (>= 10.0.1) - System.Composition.TypedParts (>= 10.0.1) - System.Composition.AttributedModel (10.0.1) - System.Composition.Convention (10.0.1) - System.Composition.AttributedModel (>= 10.0.1) - System.Composition.Hosting (10.0.1) - System.Composition.Runtime (>= 10.0.1) - System.Composition.Runtime (10.0.1) - System.Composition.TypedParts (10.0.1) - System.Composition.AttributedModel (>= 10.0.1) - System.Composition.Hosting (>= 10.0.1) - System.Composition.Runtime (>= 10.0.1) - System.Configuration.ConfigurationManager (10.0.1) - System.Diagnostics.EventLog (>= 10.0.1) - System.Security.Cryptography.ProtectedData (>= 10.0.1) - System.Diagnostics.EventLog (10.0.1) - System.IO.Pipelines (10.0.1) + System.Collections.Immutable (10.0.8) + System.Composition (10.0.8) + System.Composition.AttributedModel (>= 10.0.8) + System.Composition.Convention (>= 10.0.8) + System.Composition.Hosting (>= 10.0.8) + System.Composition.Runtime (>= 10.0.8) + System.Composition.TypedParts (>= 10.0.8) + System.Composition.AttributedModel (10.0.8) + System.Composition.Convention (10.0.8) + System.Composition.AttributedModel (>= 10.0.8) + System.Composition.Hosting (10.0.8) + System.Composition.Runtime (>= 10.0.8) + System.Composition.Runtime (10.0.8) + System.Composition.TypedParts (10.0.8) + System.Composition.AttributedModel (>= 10.0.8) + System.Composition.Hosting (>= 10.0.8) + System.Composition.Runtime (>= 10.0.8) + System.Configuration.ConfigurationManager (10.0.8) + System.Diagnostics.EventLog (>= 10.0.8) + System.Security.Cryptography.ProtectedData (>= 10.0.8) + System.Diagnostics.EventLog (10.0.8) + System.IO.Pipelines (10.0.8) System.Memory (4.6.3) System.Numerics.Vectors (4.6.1) - System.Reflection.Metadata (10.0.1) - System.Reflection.MetadataLoadContext (10.0.1) + System.Reflection.Metadata (10.0.8) + System.Reflection.MetadataLoadContext (10.0.8) System.Runtime.CompilerServices.Unsafe (6.1.2) - System.Security.Cryptography.ProtectedData (10.0.1) - System.Text.Encoding.CodePages (10.0.1) - System.Threading.Channels (10.0.1) + System.Security.Cryptography.ProtectedData (10.0.8) + System.Text.Encoding.CodePages (10.0.8) + System.Threading.Channels (10.0.8) System.Threading.Tasks.Extensions (4.6.3) xunit (2.9.3) xunit.analyzers (>= 1.18) xunit.assert (>= 2.9.3) xunit.core (2.9.3) xunit.abstractions (2.0.3) - xunit.analyzers (1.26) + xunit.analyzers (1.27) xunit.assert (2.9.3) xunit.core (2.9.3) xunit.extensibility.core (2.9.3) diff --git a/csharp/paket.main.bzl b/csharp/paket.main.bzl index 88131888227b..0c1b13334243 100644 --- a/csharp/paket.main.bzl +++ b/csharp/paket.main.bzl @@ -7,59 +7,58 @@ def main(): nuget_repo( name = "paket.main", packages = [ - {"name": "Basic.CompilerLog.Util", "id": "Basic.CompilerLog.Util", "version": "0.9.25", "sha512": "sha512-AU428QscGy1Z9eM4WqAqlO19pRIyHPZ+K63jgKX+sBWFzVLHMlyc97RVdm8VUAqVVBauS7kwaiA3S1sE/mBr4w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net462": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net47": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net471": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net472": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net48": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net5.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net6.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net7.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net8.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning"], "net9.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp2.2": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp3.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp3.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netstandard2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Humanizer.Core", "id": "Humanizer.Core", "version": "3.0.1", "sha512": "sha512-lcQ2HfNqHljfbalRLMKc8j4M0Og3qIvMSeyLp7KY58aCcgcZwiR0s5Uf2vrJ3p7OFGoWjcgbWATTpxqzrbuBSw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MessagePack", "id": "MessagePack", "version": "3.1.4", "sha512": "sha512-O0JoklM97ru+Rqr1hGnlCbSAxi8MOk48pwoaT458RzboCHuAkQWTh+Of9MUoN3LE0Cb2tapku0FRPt2hnk+o0g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net6.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net7.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net8.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netcoreapp3.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "3.1.4", "sha512": "sha512-kIgD3A0OHs8+VUabMhIJT9ZF4oGHqjCocaRDmERI/Ds2hzJ5q3kcvzn5zI7V3CJ2NlQ4HDI80uh6zCqglwgQCQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MessagePackAnalyzer", "id": "MessagePackAnalyzer", "version": "3.1.4", "sha512": "sha512-DFlhiA5fia4iK6i0S+L7sYMYmo5XRgWydKxiaxwz7tfcbvIhU7nmG4JzN1D9Y2XCEmLNExvNwTzXVEgURu4GnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Bcl.AsyncInterfaces", "id": "Microsoft.Bcl.AsyncInterfaces", "version": "10.0.1", "sha512": "sha512-2SbGOdcRb04XU0XDlYH3o3a2Xu9w2kgkS5SXXru/YVvdpbLymqgen+JcYsPzf9IzLO4hFiZhKpBTJRe7fB885A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Threading.Tasks.Extensions"], "net462": ["System.Threading.Tasks.Extensions"], "net47": ["System.Threading.Tasks.Extensions"], "net471": ["System.Threading.Tasks.Extensions"], "net472": ["System.Threading.Tasks.Extensions"], "net48": ["System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Bcl.Memory", "id": "Microsoft.Bcl.Memory", "version": "10.0.1", "sha512": "sha512-e0Z3KEDQN0Q7HxmYBNuY2r1pCyaUl9T5AbtyC2v7Nnn+XcT2v41B+nnhGKesGUWo119e9Qq9wbOhh94Tm6kR/A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Build", "id": "Microsoft.Build", "version": "18.0.2", "sha512": "sha512-/rRET3AtEAUTKFDboKvp/GTDxGwU7VBBfwaKeZtzGg+pyqYdvasHeR3ERTuoxSrgJqnu1J23xd4H481IiJFhnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "18.0.2", "sha512": "sha512-cmXoGncAIrDZgu0NumtXJSTILv9NHU2sPhrlkckefMK1XCuJUrvClVxkmvQDpvm4sCKwSFolW2AanGCLNJ6xDw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "18.0.2", "sha512": "sha512-4f5DSPN/nLyGddOx2Etrjy42XFQ9tWeJ8lwJr/tLloRl/YRzT1kV+1txwRFXlav9V93wMOUrwMQqpnd131Sb+w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Configuration.ConfigurationManager", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework"], "net462": ["Microsoft.Build.Framework"], "net47": ["Microsoft.Build.Framework"], "net471": ["Microsoft.Build.Framework"], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Build.Framework"], "net6.0": ["Microsoft.Build.Framework"], "net7.0": ["Microsoft.Build.Framework"], "net8.0": ["Microsoft.Build.Framework"], "net9.0": ["Microsoft.Build.Framework"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework"], "netcoreapp2.1": ["Microsoft.Build.Framework"], "netcoreapp2.2": ["Microsoft.Build.Framework"], "netcoreapp3.0": ["Microsoft.Build.Framework"], "netcoreapp3.1": ["Microsoft.Build.Framework"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework"], "netstandard2.1": ["Microsoft.Build.Framework"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis", "id": "Microsoft.CodeAnalysis", "version": "5.0.0", "sha512": "sha512-ToXzcZLcHA9vT4e1A6jNafAPuTJj4osfqJck562Be8ByvzS78pY9I+SdO5yo2Kwka0lz++hOWypW1Qdf1TtR4w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net9.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.Analyzers", "id": "Microsoft.CodeAnalysis.Analyzers", "version": "3.11.0", "sha512": "sha512-tP9SLzLK72XCExlh8KXfrKbU6ycmZL3ExGl/a3Ml7LNy2Uaam7gFjjUmdzyTYkMXTyckCHHpzx7bD6BMumh8Bg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.Common", "id": "Microsoft.CodeAnalysis.Common", "version": "5.0.0", "sha512": "sha512-uK5yslTJQ2UznzYlttFuDCa/6KruN1aQW/ZNFFHvK+yyA6q7vZ5o0BSPvLj+Com1/R7wGJ07c2O0lPcbDrmQdw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net462": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net47": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net471": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net472": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net48": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net5.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net6.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net7.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net8.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.CSharp", "id": "Microsoft.CodeAnalysis.CSharp", "version": "5.0.0", "sha512": "sha512-wwT/CJOQyQ72Ldouy7gjS/3Vi92hbAAoU3Y0e/6mb39+Vp7aXr3PxuBD73U2QrK1zzgTyv3QhvJPrQX0EiWS8Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.CSharp.Workspaces", "id": "Microsoft.CodeAnalysis.CSharp.Workspaces", "version": "5.0.0", "sha512": "sha512-Fy0BNxco9b7XC7LKdTgq+Kk62HKapyEM05LN5ua3Nt6PZ4pzfAAh+9Dg/VW4aSflgYoiQw/mjnotgUuM9NP6Kw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.VisualBasic", "id": "Microsoft.CodeAnalysis.VisualBasic", "version": "5.0.0", "sha512": "sha512-jGrTRyHgUXYd0iH1wF4svuGnB/3kPerq+iIbaLq5XpNv2+3hbZPyyDla+k/Ylpur6+9ZsDoP0ymhribbgXLmYA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "id": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "version": "5.0.0", "sha512": "sha512-sgWa3mUtCHIfPcSCyKKksrZNlYnmKWeivbZdENrPLTJQXiKXCjFcVYaxRvGBcYeAQES5J63iV03XVviSkJyMqQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.Workspaces.Common", "id": "Microsoft.CodeAnalysis.Workspaces.Common", "version": "5.0.0", "sha512": "sha512-zbKJyIkFW+2Bx5eQl/IWBLmbPTpo9/UyAbt8vaVTXsoi4EYlXrJftCRZmUsmyQP7pg3qKMiR6czPdUjTadNkhA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "18.0.1", "sha512": "sha512-0bzrz+vR49E/jtdBySXaJSPP4plwnMHE2qsyJZgZJuDdIOtLUFswInVa7krxIVz2ur6KJZFdTPXr3WMXfgnDNg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "10.0.1", "sha512": "sha512-dDQU1quroimptw3K9WSczyFrVmFYKEjeWXmba4BHHSEovYZw2TI77wIJTwrPHgk6j9ozE02AgjP0z0A8POZFwg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "18.0.2", "sha512": "sha512-s9BywFgRKhPV5OyY2t2EMQXfoDrvYSEzX4bHaWkZ/PwYJnxbxmLEqA/dh8MQ2mUOq48sGr3hbkgnghZQHeZc7Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "18.0.1", "sha512": "sha512-cfpn4IW0Q+emID8eUocS7xfmwwYgD/JX5S+zCZA2l7gcYzxZ1vvfcdZHcKkuzCH4gMbBYqcZqtBn9uZa0WJRUg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "18.0.1", "sha512": "sha512-qZKcsS5mN7GMwtpd+tRfAt4Dmg8yVbtWkm9iGfqY2GNOG2qW95NH6zf/FrTLXTiS7rB7zqihWGEcSspOaSK8TQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Reflection.Metadata"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "18.0.1", "sha512": "sha512-SX1FnYA8zcNv/lbWK3GjLnAx93jalmyHyQMVi+TNWA61R6xzkLMNpC3fotbfpDheXCFhwy/1rKoULyaOOe0jEg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Basic.CompilerLog.Util", "id": "Basic.CompilerLog.Util", "version": "0.9.39", "sha512": "sha512-/Kqh12aedOvhOPuFDk/yE8HauuxXFuzB8Qt+NxEUopKnxyXtV0uPIVgBU3mLNC1Dj2E5Yhcz1rtECwnu4Tv1eg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net462": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net47": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net471": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net472": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net48": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net5.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net6.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net7.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net8.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net9.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp2.2": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp3.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp3.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netstandard2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Humanizer.Core", "id": "Humanizer.Core", "version": "3.0.10", "sha512": "sha512-86jRQVvMLU7xxsdHrK87TSqu5kL0lg4EiRjvTBglkrtLw242dMON4vTrFbGKr2CRjqbThBuIpodF2MWbCFKZYA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePack", "id": "MessagePack", "version": "3.1.6", "sha512": "sha512-vkEho7kN4kxlkd238214A0/FGz6DB1Dalexql8CtUpsbtr0DhKmhBLsmZlqc9H6rRiRvG2VJyt+UqUmQxZoqyw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net6.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net7.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net8.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netcoreapp3.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "3.1.6", "sha512": "sha512-7uF/iFA6NSB5Eo0HijkyEAHPURQC2ESmzoqNFd2bVqu2opQnuvutGYvcZKV91FXQ6YMDhzYvYbIlSTJ/Jru5+Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePackAnalyzer", "id": "MessagePackAnalyzer", "version": "3.1.6", "sha512": "sha512-eLmNdEFDwLjBiv3/rv/mBtIu18pu9eujlZ8pb0EsbnMzuNyNUp3GJ0WLL0h4qYRW5N41f8zN1N627h/kChe3oA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Bcl.AsyncInterfaces", "id": "Microsoft.Bcl.AsyncInterfaces", "version": "10.0.8", "sha512": "sha512-FzE/KnOmwCmg2KMPjuyevkS5fAzNt2DBLSJs3HsJ+I/CoBSW6i0mighH6ryZ8JHQhNLxMK04X7J8BTt0kEG5/g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Threading.Tasks.Extensions"], "net462": ["System.Threading.Tasks.Extensions"], "net47": ["System.Threading.Tasks.Extensions"], "net471": ["System.Threading.Tasks.Extensions"], "net472": ["System.Threading.Tasks.Extensions"], "net48": ["System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Bcl.Memory", "id": "Microsoft.Bcl.Memory", "version": "10.0.8", "sha512": "sha512-Gd9LaF0vnR5noQP7/LPjSKvXw22b51ejGGs/HJHbzNbMOzT1KqGzW2329gP8DKKMj5iYACBKISwl6nDr32WFWA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build", "id": "Microsoft.Build", "version": "18.6.3", "sha512": "sha512-KC9xCNrucJlKrA0KFXiYUHZI74kNBOaZ/BLHSCm06fS7aoHnlAlRZizti+i4V0AsaJlaIBjtN/Cf6LkcmENi4w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "18.6.3", "sha512": "sha512-p11xRx05A+bU2oUIsKKuAEOEPyroo2ygUwQVDLAGV3ZkNtHBsQs9RojvRqr+wiql7KPUXv0qbwKcACUpsbbmcA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "18.6.3", "sha512": "sha512-uB3c5znytjARTsycmhOfnTavdGTYalYWcCtb6RAFqHcXv2y8JxGsdgQQ39n9IqXpt9JyxPSWz2uVuztuG/Oplw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "System.Configuration.ConfigurationManager", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis", "id": "Microsoft.CodeAnalysis", "version": "5.3.0", "sha512": "sha512-gCuN2a/33HYRrRg4P2LvbgSsUaGP/FSHTaz6FapSaEATYnbXBoiR9Nk/ItHAknc6IQPtodkUYKvX78MkBdoOSg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net9.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Analyzers", "id": "Microsoft.CodeAnalysis.Analyzers", "version": "5.3.0", "sha512": "sha512-v9jPlSs/fE7AU2/eZOw5EUzq0JOaWgP+2gghwIP2XbbTv56PZZZsy1QgEiMa3jjO8hR8SN1+NJvG1xxHL2FDgw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Common", "id": "Microsoft.CodeAnalysis.Common", "version": "5.3.0", "sha512": "sha512-lt42ETYkJrzJrf99jQ9n7xnanR/ETh92o6LX03kTjQKfKFrJGm5/+4OQJyIz8Kj4/ClbeZ3kvxytsyds4jQ5Tg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net462": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net47": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net471": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net472": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net48": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net5.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net6.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net7.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net8.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.CSharp", "id": "Microsoft.CodeAnalysis.CSharp", "version": "5.3.0", "sha512": "sha512-TD8ulDx0+qjf3oi5gcToiNaxVGzn0rsPN0hCQOq+skYGgugKGLVl8obs0KxrxAOx2xkjySbOcEBumgJ0uhzzgA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.CSharp.Workspaces", "id": "Microsoft.CodeAnalysis.CSharp.Workspaces", "version": "5.3.0", "sha512": "sha512-XwemsUpvFZ8zLvu9QxRdgh4rgoI1WypKHn9D4zrvN5V3p+CSJKmFBS1w09DuBSLe+DIITIu7JQmzmDsHXZow1g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.VisualBasic", "id": "Microsoft.CodeAnalysis.VisualBasic", "version": "5.3.0", "sha512": "sha512-0zqIJspSNg8iBDho82FwYt4ajoBRzMEtzdIPs5KBeisxNIBMpZh8CXJED8RY32HCsIOA5tx870xpgPsXOysMqA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "id": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "version": "5.3.0", "sha512": "sha512-FhpamkHtKiOd/2wlQ4l9K+NQLfAtBniWj2TWjgHp5rY+PNDRsOZpiTVBdrlwRTIR2oe6lz6cKYTxwBKVrPjOzQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Workspaces.Common", "id": "Microsoft.CodeAnalysis.Workspaces.Common", "version": "5.3.0", "sha512": "sha512-pPJy45QDPFZNUpmgJz7fKL6Tte+CZ7NRw8GyluMBGLRAcwrZNMpWOKkV81MGnkCYOs8UA1b510MrQpevf0iQWw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "18.5.1", "sha512": "sha512-BjoX00WuEWNnHFo591eXZIcl3IYm1iln65ub545zWF1o6pHicSHcX2eUBWEJW9W6GA/9cf/ZgJ2XuGOyDdep2A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "10.0.8", "sha512": "sha512-XOzhf+i3nZIyqy5sFaEdnNsPOPEYcEz9tL3YIU8RjK3aKIMLPLMaXDCGoOxKeOTN+03Faaz5le8X1RlKsW9rPQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "18.6.3", "sha512": "sha512-8RtWydTzV9i25v80XBoNxZDxmxuClq0PVejE2dHfpLhD8jFoEEPP2S+q5oS9HdSKOVDurUDTdjMCEWUB+DiGZg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "18.5.1", "sha512": "sha512-5/ucicw/H9/VNCmMTCjCQhNHEJc08ZeSLSrjvdZR/rtVUY8Enw+bi9LQTP1K97aRCqw/BG7cIV+VVFvgj3fKiw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "18.5.1", "sha512": "sha512-SJHvdEawgdOUuyN2/eVWZCwe14DKPgQPDsQGiwfeKFgjzYDUvhESRpohG9IvQQuYiCvAv7Tn+ozZ2fDPfpwdzg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Reflection.Metadata"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "18.5.1", "sha512": "sha512-CbWth1jMU2wVyAy1SVMexSyD3JXG8FYYyyrcY+B1aWhzFzRLh8JdThoibXTqXxZ2NRC9me+N4XIQC75dfLcgiA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.VisualStudio.SolutionPersistence", "id": "Microsoft.VisualStudio.SolutionPersistence", "version": "1.0.52", "sha512": "sha512-lHyMm5j5wRwVaC3vlCWrFH2FGy2SpFUZqLvYhzwf1cEUIQCUChU960h8kteFSf01ZkLSgJwrznmspwjW8kPtrA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Mono.Posix.NETStandard", "id": "Mono.Posix.NETStandard", "version": "1.0.0", "sha512": "sha512-RtGiutQZJAmajvQ0QvBvh73VJye85iW9f9tjZlzF88idLxNMo4lAktP/4Y9ilCpais0LDO0tpoICt9Hdv6wooA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MSBuild.StructuredLogger", "id": "MSBuild.StructuredLogger", "version": "2.3.113", "sha512": "sha512-FS/vecrCK5mq3v4OIyd90BU6x9clwoRzW6LiIfilSQZQBYp/E9/+G9LS2Q9nB1rHEhJ8kDWnsZdytEIsNAb4Jw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "NaturalSort.Extension", "id": "NaturalSort.Extension", "version": "4.4.1", "sha512": "sha512-UTrcQcgmn7pBdx+0Oi/NxlyPslWbMt7U8I1sg/4m36OkOCS+7QKZWY3O4dKcjHD2wQaBr9L2/XWnx3ViTaehZw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MSBuild.StructuredLogger", "id": "MSBuild.StructuredLogger", "version": "2.3.204", "sha512": "sha512-MnrlWYtNUl0db/2lePRJhtOCzbQkJ1L9tyrA4xlKTFqjvpw8wnnX6AQ+PXYhjlMJ8ET9aoXGJOn/3e9j07NSwg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Newtonsoft.Json", "id": "Newtonsoft.Json", "version": "13.0.4", "sha512": "sha512-bR+v+E/yJ6g7GV2uXw2OrUSjYYfjLkOLC8JD4kCS23msLapnKtdJPBJA75fwHH++ErIffeIqzYITLxAur4KAXA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "NuGet.Versioning", "id": "NuGet.Versioning", "version": "7.0.1", "sha512": "sha512-ibGcrpgA8foidKNcnf+AQ4zEaVZu4OyWjcPITii6mNgwt2uhd8VFsEq7/Mb0KDxrEJaew+nWJQb7Ju166SAyzw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "NuGet.Versioning", "id": "NuGet.Versioning", "version": "7.6.0", "sha512": "sha512-JwbvmbG+1EOilFOAtjT2A7p05UgeOqzTZluUJ4mFgPZUSpYcHPPaK15x+RiqpKsVmKy741MaLN0fjOYxhGXr3g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Buffers", "id": "System.Buffers", "version": "4.6.1", "sha512": "sha512-qve/dFwECwehSWlZmpkrrlIeATCvo/Hw2koyMrUVcDBy5gXAQrnwX8pHEoqgj8DgkrWuWW1DrQbFqoMbo+Fvrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Collections.Immutable", "id": "System.Collections.Immutable", "version": "10.0.1", "sha512": "sha512-JdD3TbINwQPseS67IR4oTJHb0KGxwnaT/j3A/VWqoKhvBIqTBgWK08UhDn7mcKEozKIfeSUWspmpW9kE2EgsHQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition", "id": "System.Composition", "version": "10.0.1", "sha512": "sha512-N6NIjCYQpESjd6TSFlaZwbNrV7ZuLZuVBv/5/UuyX2z2zI+zr9lmbCXMN9IEa6gKSu561gsGjveEXAPCY1u6Ug==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net462": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net47": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net471": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net472": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net48": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.AttributedModel", "id": "System.Composition.AttributedModel", "version": "10.0.1", "sha512": "sha512-1YnM6Ly+qKW62DGTz9Ew+vaYpB7Y3d6R+oxaOgdJwp6vlHP9oUNsL7hD12+ugoGheWcg8Ld+X63wI8/XbLaUxA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.Convention", "id": "System.Composition.Convention", "version": "10.0.1", "sha512": "sha512-/ugIOC1IAYV2+waaSutJXMvAe5cGG9bP+dKt9oGiXdAFJ3cUFqJdxwQJJSeDZ4OQ220aj6EYErDewWxUoo0QHQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel"], "net462": ["System.Composition.AttributedModel"], "net47": ["System.Composition.AttributedModel"], "net471": ["System.Composition.AttributedModel"], "net472": ["System.Composition.AttributedModel"], "net48": ["System.Composition.AttributedModel"], "net5.0": ["System.Composition.AttributedModel"], "net6.0": ["System.Composition.AttributedModel"], "net7.0": ["System.Composition.AttributedModel"], "net8.0": ["System.Composition.AttributedModel"], "net9.0": ["System.Composition.AttributedModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel"], "netcoreapp2.1": ["System.Composition.AttributedModel"], "netcoreapp2.2": ["System.Composition.AttributedModel"], "netcoreapp3.0": ["System.Composition.AttributedModel"], "netcoreapp3.1": ["System.Composition.AttributedModel"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel"], "netstandard2.1": ["System.Composition.AttributedModel"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.Hosting", "id": "System.Composition.Hosting", "version": "10.0.1", "sha512": "sha512-LVw0GhK+7IJLeIgggvNh7wu3I3MkOBdq+O3SUA378mQeLKjwR8ElsPvyq3rqaO+de38pVl0oFt0Fz/fU/Jox4A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.Runtime"], "net462": ["System.Composition.Runtime"], "net47": ["System.Composition.Runtime"], "net471": ["System.Composition.Runtime"], "net472": ["System.Composition.Runtime"], "net48": ["System.Composition.Runtime"], "net5.0": ["System.Composition.Runtime"], "net6.0": ["System.Composition.Runtime"], "net7.0": ["System.Composition.Runtime"], "net8.0": ["System.Composition.Runtime"], "net9.0": ["System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.Runtime"], "netstandard2.1": ["System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.Runtime", "id": "System.Composition.Runtime", "version": "10.0.1", "sha512": "sha512-HYfhfKira/soAn1h3e3pOctNx5WTAZMdGFbF5rO55oXXRzzFtBoujTEjGYCyJVj8jKezGZVvIZNr1N2bmqc3sQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.TypedParts", "id": "System.Composition.TypedParts", "version": "10.0.1", "sha512": "sha512-AfgzCNetIffOWMnRo2szRGaeV6YZTpS0zrkZj5/6BWWaF2qgGllTtZOBBiZqA57tVDUoVUNf/LP1I6Lt1xkrAw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net462": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net47": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net471": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net472": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net48": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Configuration.ConfigurationManager", "id": "System.Configuration.ConfigurationManager", "version": "10.0.1", "sha512": "sha512-E6SRJRaRweplupgFl3IRfNZ/AeCCb+6/FNeXpG6Wgj0mzKs7EAUoJTn0V+8c+SwffVifZRz9+bvNL/hKVddkyg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Security.Cryptography.ProtectedData"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Security.Cryptography.ProtectedData"], "net6.0": ["System.Security.Cryptography.ProtectedData"], "net7.0": ["System.Security.Cryptography.ProtectedData"], "net8.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net9.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Diagnostics.EventLog", "id": "System.Diagnostics.EventLog", "version": "10.0.1", "sha512": "sha512-Q1RjaIGlmcSUWEjPkIq6eUd/O5FVR9Kgseq/cPPldpdkRWK/GO5HkDE7B4Az1tVVjDiY/UnpRLQy2e/pH5nr1g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.IO.Pipelines", "id": "System.IO.Pipelines", "version": "10.0.1", "sha512": "sha512-hiEzKxYthGSjhsrnW/D4jCxBbE+lDG01KvAf3Iv7cQjpNU9ZoVo25Ukedth0LRymKpWcsTs3Fuawu9O6+Gnr5g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net462": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net47": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net471": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net472": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net7.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Collections.Immutable", "id": "System.Collections.Immutable", "version": "10.0.8", "sha512": "sha512-C6PSp5YO9fvxcDoBwqDE/2iMPNgzOcrdjQsnpJxWBMDZRMxdpjDe9tzJb14zZwY0dqbVSsoik5un31ZXJ7Fu8Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition", "id": "System.Composition", "version": "10.0.8", "sha512": "sha512-h1qUp18nhfGfw3mz8ZxNTUZXm2rVvk7HiPKj0IYdRJIdOAcIBmI/MT4U8Etdi6y0tPb2dNQvfTnj35PgDCpDwg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net462": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net47": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net471": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net472": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net48": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.AttributedModel", "id": "System.Composition.AttributedModel", "version": "10.0.8", "sha512": "sha512-Qy0Ag0tpyGeh7BFgN7Mj2rumQHWoZYuTRE5fo5ice3j97JIMoAKt6uvj3sQqukhNLLPUDY0vz3WA36Fl/AbPRw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Convention", "id": "System.Composition.Convention", "version": "10.0.8", "sha512": "sha512-TKc99rqqwWNajwl3o40keYyQtYVD+NnWWX1EId4whrwo7wT9KiTS8Q6CJVR7GLxA+9lbGMJyQh6IgwZk3T7YJg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel"], "net462": ["System.Composition.AttributedModel"], "net47": ["System.Composition.AttributedModel"], "net471": ["System.Composition.AttributedModel"], "net472": ["System.Composition.AttributedModel"], "net48": ["System.Composition.AttributedModel"], "net5.0": ["System.Composition.AttributedModel"], "net6.0": ["System.Composition.AttributedModel"], "net7.0": ["System.Composition.AttributedModel"], "net8.0": ["System.Composition.AttributedModel"], "net9.0": ["System.Composition.AttributedModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel"], "netcoreapp2.1": ["System.Composition.AttributedModel"], "netcoreapp2.2": ["System.Composition.AttributedModel"], "netcoreapp3.0": ["System.Composition.AttributedModel"], "netcoreapp3.1": ["System.Composition.AttributedModel"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel"], "netstandard2.1": ["System.Composition.AttributedModel"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Hosting", "id": "System.Composition.Hosting", "version": "10.0.8", "sha512": "sha512-Xx+8iGL7kYmfDwxPZqbFGuVO+JKLqfwBPJpqquFDE1IUsZs7yKFmmP1zg+xVwcEq/wJdYVqs9MTsCU/1AaBW/A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.Runtime"], "net462": ["System.Composition.Runtime"], "net47": ["System.Composition.Runtime"], "net471": ["System.Composition.Runtime"], "net472": ["System.Composition.Runtime"], "net48": ["System.Composition.Runtime"], "net5.0": ["System.Composition.Runtime"], "net6.0": ["System.Composition.Runtime"], "net7.0": ["System.Composition.Runtime"], "net8.0": ["System.Composition.Runtime"], "net9.0": ["System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.Runtime"], "netstandard2.1": ["System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Runtime", "id": "System.Composition.Runtime", "version": "10.0.8", "sha512": "sha512-yyACoUVUtVhIcZzApq+ARHwVOkA9PRSQ/gI2y5xXwa6nwqA8doKySyqH1bfpaacHJ3j4zhrRe1lpjffTEhh0+Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.TypedParts", "id": "System.Composition.TypedParts", "version": "10.0.8", "sha512": "sha512-kPWxTNdqjdnYmvDMnEFbjmKsbECPKXCHiusp53sor6xgDcUQNkzNqEKTMVEFbvjIH0DBLXIP9fudSrK886dqeg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net462": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net47": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net471": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net472": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net48": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Configuration.ConfigurationManager", "id": "System.Configuration.ConfigurationManager", "version": "10.0.8", "sha512": "sha512-1Z/h32w5oEjve1mUU5w1aYY9p+wcuNtTxo0RG+cQl+I34XRkjx4iYK9kuz+WYzud9QpPePk6iyjvnay1mWj6/Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Security.Cryptography.ProtectedData"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Security.Cryptography.ProtectedData"], "net6.0": ["System.Security.Cryptography.ProtectedData"], "net7.0": ["System.Security.Cryptography.ProtectedData"], "net8.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net9.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Diagnostics.EventLog", "id": "System.Diagnostics.EventLog", "version": "10.0.8", "sha512": "sha512-ik2gdaGlYD5S+5wk4WLP43va4G9IW7g5QxW/C1/+DSEH2KNEGWuskgaVhURZxCkstF20I1iwgfMCB9k/5uUBFw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.IO.Pipelines", "id": "System.IO.Pipelines", "version": "10.0.8", "sha512": "sha512-jrBzkIgn/+Ul7ODVXy5uBYhlXpEVHx57VUtLigfw0pq2r+xu3dv/F0aWi7y3C/w3GSk6mhvoX3RfKcWJT372UA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net462": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net47": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net471": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net472": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net7.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Memory", "id": "System.Memory", "version": "4.6.3", "sha512": "sha512-NXcNYlWoXe5cz9sb8Huo6x2dCZVYkhwKtgE00n/MoI8V4ZI/7/t+EI5bOhQFlZfFjjqM8+U6prjU/aARt7H/tA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Numerics.Vectors", "id": "System.Numerics.Vectors", "version": "4.6.1", "sha512": "sha512-/rkvpUeUPlCY/2qYVQKiUsj5IKaXZcy2+SQAGAfemAdyEF5AgIgYOFNSTMWDXo09JWFX9HB+wV1yCyi2Mwi3TA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Reflection.Metadata", "id": "System.Reflection.Metadata", "version": "10.0.1", "sha512": "sha512-wY+305y+G3F14m0ba1znntQaZZSGDeCkUYJu1MP4ms0yer0wjx1lDr9PV+3PPXF1FJaKZqynUPzh5S0Oud2OHg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable"], "net462": ["System.Collections.Immutable"], "net47": ["System.Collections.Immutable"], "net471": ["System.Collections.Immutable"], "net472": ["System.Collections.Immutable"], "net48": ["System.Collections.Immutable"], "net5.0": ["System.Collections.Immutable"], "net6.0": ["System.Collections.Immutable"], "net7.0": ["System.Collections.Immutable"], "net8.0": ["System.Collections.Immutable"], "net9.0": ["System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable"], "netcoreapp2.1": ["System.Collections.Immutable"], "netcoreapp2.2": ["System.Collections.Immutable"], "netcoreapp3.0": ["System.Collections.Immutable"], "netcoreapp3.1": ["System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable"], "netstandard2.1": ["System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Reflection.MetadataLoadContext", "id": "System.Reflection.MetadataLoadContext", "version": "10.0.1", "sha512": "sha512-PhPuIrzG9J6x9stz1ItEOOO+avF41vmPMrvVCGZvIdNUym5i7fepNQsegXfAWYNl8Am8hswj+Gv4eIl9y3gy/Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net8.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Reflection.Metadata", "id": "System.Reflection.Metadata", "version": "10.0.8", "sha512": "sha512-wWf/RiVz/UVoMqYGr2X5z1wz1uktkIU0E+aGcFbffDNMU0kN3t5j3Yc+/8xC6GvT4+KjXDXumO/3ddS/cln5Pw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable"], "net462": ["System.Collections.Immutable"], "net47": ["System.Collections.Immutable"], "net471": ["System.Collections.Immutable"], "net472": ["System.Collections.Immutable"], "net48": ["System.Collections.Immutable"], "net5.0": ["System.Collections.Immutable"], "net6.0": ["System.Collections.Immutable"], "net7.0": ["System.Collections.Immutable"], "net8.0": ["System.Collections.Immutable"], "net9.0": ["System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable"], "netcoreapp2.1": ["System.Collections.Immutable"], "netcoreapp2.2": ["System.Collections.Immutable"], "netcoreapp3.0": ["System.Collections.Immutable"], "netcoreapp3.1": ["System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable"], "netstandard2.1": ["System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Reflection.MetadataLoadContext", "id": "System.Reflection.MetadataLoadContext", "version": "10.0.8", "sha512": "sha512-YcFpYWsCdnD5vjpskco7E87TD9g6v6nxow1Qu3/XrBlUEulEZOUfTSV5EP7mSSKMYgT3+fJK7zrijCeg+z3w9g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net8.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Runtime.CompilerServices.Unsafe", "id": "System.Runtime.CompilerServices.Unsafe", "version": "6.1.2", "sha512": "sha512-t2aXWJZBkAkRrTOnw31OBELKEVSDD5YvC3O5dXaHFsR66/nRTKm1y3Iq6NwFI5u5IlKrWYfdan66V+GKKkY8hQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Security.Cryptography.ProtectedData", "id": "System.Security.Cryptography.ProtectedData", "version": "10.0.1", "sha512": "sha512-ktT9zhhc2gGmPFGOCy6m+eqnY/yBEnaSanjINTDmF4zqNmSteydGR/Hebaf1IkNOGWs2jrkXvovWO86omwLGQA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Memory"], "net6.0": ["System.Memory"], "net7.0": ["System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory"], "netcoreapp2.1": ["System.Memory"], "netcoreapp2.2": ["System.Memory"], "netcoreapp3.0": ["System.Memory"], "netcoreapp3.1": ["System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory"], "netstandard2.1": ["System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Text.Encoding.CodePages", "id": "System.Text.Encoding.CodePages", "version": "10.0.1", "sha512": "sha512-iRoZmmRaI0ZLsMd9+ESdBWZX/tYhM9kozmutE53ZJCiGFXQ7aYaD1Q6LJU8UCDclB+4kY2VfFBRNcIU87jsdgw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Threading.Channels", "id": "System.Threading.Channels", "version": "10.0.1", "sha512": "sha512-zRRdonHIIJHLwFRDMynwD8zZRpkF+FOFz3kqsTO0Az36YBoRsDVjrhnH79P2+UUFl4eBAbgr9U/m7qFtNBtbnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Security.Cryptography.ProtectedData", "id": "System.Security.Cryptography.ProtectedData", "version": "10.0.8", "sha512": "sha512-LOVSTFOou3ekg+ou98m8tAC591BuTlTqEbSQv34UIjxcU0HvbZ7qLqCXSp/60Cx40Zd0YmeyXTGeARMgSXlWyg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Memory"], "net6.0": ["System.Memory"], "net7.0": ["System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory"], "netcoreapp2.1": ["System.Memory"], "netcoreapp2.2": ["System.Memory"], "netcoreapp3.0": ["System.Memory"], "netcoreapp3.1": ["System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory"], "netstandard2.1": ["System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Text.Encoding.CodePages", "id": "System.Text.Encoding.CodePages", "version": "10.0.8", "sha512": "sha512-xr2qHdT5yx3IOZ4bMkPY+1CGCIqzBC41kk9AHFvl/R3oNrEns5y4OUz4KRXk0UqY4FjiOXW6PtqdvDbSC2iYsQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Threading.Channels", "id": "System.Threading.Channels", "version": "10.0.8", "sha512": "sha512-DLFQGFJl9TNsW2KansRP+AvSO+HUoV6s8g/d93zw7IbGWm48uC6P0TIdzuJTtwHVwN+oQsQ0ReBdLVr+gL1Eqg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Threading.Tasks.Extensions", "id": "System.Threading.Tasks.Extensions", "version": "4.6.3", "sha512": "sha512-zWRHXIBnbfzQE1SamNoW9X5NjEcW/JNAtvVxGKd3bcg71wQVmoI3pDq+WUa2A+temXSNCm7707hmAFwwcYlK0A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit", "id": "xunit", "version": "2.9.3", "sha512": "sha512-3/ayVPC7NQWQENR5REbOgXYsbhoJsmpnxQa5pO4lxbjGbckOs62nsm4kLErzc8ng7V5Xz08uwVjMqaZGJiXCrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net11": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net20": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net30": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net35": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net40": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net403": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net45": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net451": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net452": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net46": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net461": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net462": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net47": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net471": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net472": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net48": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net5.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net6.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net7.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net8.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net9.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.3": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.4": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.5": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.6": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit.abstractions", "id": "xunit.abstractions", "version": "2.0.3", "sha512": "sha512-PKJri5f0qEQPFvgY6CZR9XG8JROlWSdC/ZYLkkDQuID++Egn+yWjB+Yf57AZ8U6GRlP7z33uDQ4/r5BZPer2JA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "xunit.analyzers", "id": "xunit.analyzers", "version": "1.26.0", "sha512": "sha512-gJ6shgzXmTVaWJsRCpWrfp1ymSSIwjandPL5myGv3wt+96TkARHFUV1bAS4omFPPkSLkFV7nOssjCeEIorPE+w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.analyzers", "id": "xunit.analyzers", "version": "1.27.0", "sha512": "sha512-K5IO29ZNN2ydez2jhlTRsR20ylp/eQMrMgoonfIpv9c9sWBN6MXRIPGWxvuotojuST3HgU9e/X7l4/ViOLPBvw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit.assert", "id": "xunit.assert", "version": "2.9.3", "sha512": "sha512-wfqwCKAhSWGy9P/dPqDGSIBnPW3sUJ49MEfcTqNF+5BgJwjwtHb9SE7ajYZuR8ymTd8dwxoEGnlJHiejbgDv9w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit.core", "id": "xunit.core", "version": "2.9.3", "sha512": "sha512-cv2sO37qJkIbBL3fXDIn3EPQ2zK8LQ6FkMJNnn1xc9n8mo3ik0URA4MfUNCmwDDCx83ZiJeRrJ0y1ykasojNJg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net11": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net20": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net30": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net35": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net40": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net403": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net45": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net451": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net452": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net46": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net461": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net462": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net47": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net471": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net472": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net48": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net5.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net6.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net7.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net8.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net9.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp1.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp1.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.2": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp3.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp3.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.2": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.3": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.4": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.5": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.6": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard2.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard2.1": ["xunit.extensibility.core", "xunit.extensibility.execution"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit.extensibility.core", "id": "xunit.extensibility.core", "version": "2.9.3", "sha512": "sha512-S0a+jmIF/DraKuJ+FfWbqXMwvpcKxjP3GdrQzz5pr3GYtgII2XfDdAhkU/5VIWqWon2R6Q31X/9sTGaU+koDaQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.abstractions"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": ["xunit.abstractions"], "net451": ["xunit.abstractions"], "net452": ["xunit.abstractions"], "net46": ["xunit.abstractions"], "net461": ["xunit.abstractions"], "net462": ["xunit.abstractions"], "net47": ["xunit.abstractions"], "net471": ["xunit.abstractions"], "net472": ["xunit.abstractions"], "net48": ["xunit.abstractions"], "net5.0": ["xunit.abstractions"], "net6.0": ["xunit.abstractions"], "net7.0": ["xunit.abstractions"], "net8.0": ["xunit.abstractions"], "net9.0": ["xunit.abstractions"], "netcoreapp1.0": ["xunit.abstractions"], "netcoreapp1.1": ["xunit.abstractions"], "netcoreapp2.0": ["xunit.abstractions"], "netcoreapp2.1": ["xunit.abstractions"], "netcoreapp2.2": ["xunit.abstractions"], "netcoreapp3.0": ["xunit.abstractions"], "netcoreapp3.1": ["xunit.abstractions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.abstractions"], "netstandard1.2": ["xunit.abstractions"], "netstandard1.3": ["xunit.abstractions"], "netstandard1.4": ["xunit.abstractions"], "netstandard1.5": ["xunit.abstractions"], "netstandard1.6": ["xunit.abstractions"], "netstandard2.0": ["xunit.abstractions"], "netstandard2.1": ["xunit.abstractions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index eefb35f174ad..3ceb4374a777 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.68 + +No user-facing changes. + ## 1.7.67 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.68.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.68.md new file mode 100644 index 000000000000..774ffcebdfeb --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.68.md @@ -0,0 +1,3 @@ +## 1.7.68 + +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 0293fdade8f5..f737dfa09724 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.67 +lastReleaseVersion: 1.7.68 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 51b34483e1bf..52172a7a1891 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.67 +version: 1.7.69-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index eefb35f174ad..3ceb4374a777 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.68 + +No user-facing changes. + ## 1.7.67 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.68.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.68.md new file mode 100644 index 000000000000..774ffcebdfeb --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.68.md @@ -0,0 +1,3 @@ +## 1.7.68 + +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 0293fdade8f5..f737dfa09724 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.67 +lastReleaseVersion: 1.7.68 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 81f347373c52..cf63a4395185 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.67 +version: 1.7.69-dev groups: - csharp - solorigate diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected index 2be1117efc08..6b32d2248c5e 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected @@ -22,7 +22,6 @@ | [...]/csharp/tools/[...]/Microsoft.Win32.Primitives.dll | | [...]/csharp/tools/[...]/Microsoft.Win32.Registry.dll | | [...]/csharp/tools/[...]/Mono.Posix.NETStandard.dll | -| [...]/csharp/tools/[...]/NaturalSort.Extension.dll | | [...]/csharp/tools/[...]/Newtonsoft.Json.dll | | [...]/csharp/tools/[...]/NuGet.Versioning.dll | | [...]/csharp/tools/[...]/StructuredLogger.dll | diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 17fd83bcda76..a45a993832ed 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 6.0.2 + +### Minor Analysis Improvements + +* Full support for C# 14 / .NET 10. All new language features are now supported by the extractor. The QL library and data flow analysis now support the new C# 14 language constructs and include generated Models as Data (MaD) models for the .NET 10 runtime. +* C# 14: Added support for user-defined instance increment/decrement operators. + ## 6.0.1 No user-facing changes. diff --git a/csharp/ql/lib/change-notes/2026-05-19-properties-indexers-refreturn.md b/csharp/ql/lib/change-notes/2026-05-19-properties-indexers-refreturn.md new file mode 100644 index 000000000000..d92d5fdf819d --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-05-19-properties-indexers-refreturn.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Improved call target resolution for ref-return properties and indexers. diff --git a/csharp/ql/lib/change-notes/released/6.0.2.md b/csharp/ql/lib/change-notes/released/6.0.2.md new file mode 100644 index 000000000000..ea98fb2257ea --- /dev/null +++ b/csharp/ql/lib/change-notes/released/6.0.2.md @@ -0,0 +1,6 @@ +## 6.0.2 + +### Minor Analysis Improvements + +* Full support for C# 14 / .NET 10. All new language features are now supported by the extractor. The QL library and data flow analysis now support the new C# 14 language constructs and include generated Models as Data (MaD) models for the .NET 10 runtime. +* C# 14: Added support for user-defined instance increment/decrement operators. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index d1f3c68c8120..70437ec53b89 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.1 +lastReleaseVersion: 6.0.2 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 1605a359ad80..638f99026429 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 6.0.1 +version: 6.0.3-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp @@ -9,6 +9,7 @@ dependencies: codeql/controlflow: ${workspace} codeql/dataflow: ${workspace} codeql/mad: ${workspace} + codeql/rangeanalysis: ${workspace} codeql/ssa: ${workspace} codeql/threat-models: ${workspace} codeql/tutorial: ${workspace} diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index 9416a7d4d9c7..198ad2af1801 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -613,6 +613,9 @@ class UnaryOperator extends Operator { this.getNumberOfParameters() = 1 and not this instanceof ConversionOperator and not this instanceof CompoundAssignmentOperator + or + // Instance increment and decrement operators don't have a parameter (only a qualifier). + this.getNumberOfParameters() = 0 and not this.isStatic() } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll index ca71e213e327..7e5072637c30 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll @@ -175,7 +175,9 @@ module Ast implements AstSig { final private class FinalForStmt = CS::ForStmt; class ForStmt extends FinalForStmt { - Expr getInit(int index) { result = this.getInitializer(index) } + AstNode getInit(int index) { result = super.getInitializer(index) } + + AstNode getUpdate(int index) { result = super.getUpdate(index) } } final private class FinalForeachStmt = CS::ForeachStmt; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll index 65af6fb13a81..4f03a735a694 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll @@ -4,67 +4,31 @@ overlay[local?] module; -private import internal.rangeanalysis.BoundSpecific +private import csharp as CS +private import semmle.code.csharp.dataflow.SSA::Ssa +private import semmle.code.csharp.dataflow.internal.rangeanalysis.ConstantUtils as CU +private import semmle.code.csharp.dataflow.internal.rangeanalysis.RangeUtils as RU +private import semmle.code.csharp.dataflow.internal.rangeanalysis.SsaUtils as SU +private import codeql.rangeanalysis.Bound as SharedBound -private newtype TBound = - TBoundZero() or - TBoundSsa(SsaVariable v) { v.getSourceVariable().getType() instanceof IntegralType } or - TBoundExpr(Expr e) { - interestingExprBound(e) and - not exists(SsaVariable v | e = v.getAUse()) - } +/** Provides C#-specific definitions for bounds. */ +private module BoundDefs implements SharedBound::BoundDefinitions { + class Type = CS::Type; -/** - * A bound that may be inferred for an expression plus/minus an integer delta. - */ -abstract class Bound extends TBound { - /** Gets a textual representation of this bound. */ - abstract string toString(); + class SsaVariable = SU::SsaVariable; - /** Gets an expression that equals this bound plus `delta`. */ - abstract Expr getExpr(int delta); + class SsaSourceVariable = SourceVariable; - /** Gets an expression that equals this bound. */ - Expr getExpr() { result = this.getExpr(0) } + class Expr = CS::ControlFlowNodes::ExprNode; - /** Gets the location of this bound. */ - abstract Location getLocation(); -} + class IntegralType = CS::IntegralType; -/** - * The bound that corresponds to the integer 0. This is used to represent all - * integer bounds as bounds are always accompanied by an added integer delta. - */ -class ZeroBound extends Bound, TBoundZero { - override string toString() { result = "0" } + class ConstantIntegerExpr = CU::ConstantIntegerExpr; - override Expr getExpr(int delta) { result.(ConstantIntegerExpr).getIntValue() = delta } - - override Location getLocation() { result.hasLocationInfo("", 0, 0, 0, 0) } + /** Holds if `e` is a bound expression and it is not an SSA variable read. */ + predicate interestingExprBound(Expr e) { CU::systemArrayLengthAccess(e.getExpr()) } } -/** - * A bound corresponding to the value of an SSA variable. - */ -class SsaBound extends Bound, TBoundSsa { - /** Gets the SSA variable that equals this bound. */ - SsaVariable getSsa() { this = TBoundSsa(result) } - - override string toString() { result = this.getSsa().toString() } +module BoundImpl = SharedBound::Bound; - override Expr getExpr(int delta) { result = this.getSsa().getAUse() and delta = 0 } - - override Location getLocation() { result = this.getSsa().getLocation() } -} - -/** - * A bound that corresponds to the value of a specific expression that might be - * interesting, but isn't otherwise represented by the value of an SSA variable. - */ -class ExprBound extends Bound, TBoundExpr { - override string toString() { result = this.getExpr().toString() } - - override Expr getExpr(int delta) { this = TBoundExpr(result) and delta = 0 } - - override Location getLocation() { result = this.getExpr().getLocation() } -} +import BoundImpl diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll deleted file mode 100644 index 037422684306..000000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Provides C#-specific definitions for bounds. - */ - -private import csharp as CS -private import semmle.code.csharp.dataflow.SSA::Ssa as Ssa -private import semmle.code.csharp.dataflow.internal.rangeanalysis.ConstantUtils as CU -private import semmle.code.csharp.dataflow.internal.rangeanalysis.RangeUtils as RU -private import semmle.code.csharp.dataflow.internal.rangeanalysis.SsaUtils as SU - -class SsaVariable = SU::SsaVariable; - -class Expr = CS::ControlFlowNodes::ExprNode; - -class Location = CS::Location; - -class IntegralType = CS::IntegralType; - -class ConstantIntegerExpr = CU::ConstantIntegerExpr; - -/** Holds if `e` is a bound expression and it is not an SSA variable read. */ -predicate interestingExprBound(Expr e) { CU::systemArrayLengthAccess(e.getExpr()) } diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll index 15a64d12b499..909ba3b9d423 100644 --- a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll @@ -73,6 +73,19 @@ class DispatchCall extends Internal::TDispatchCall { } } +abstract private class InstanceOperatorCall extends OperatorCall { + abstract Expr getQualifier(); +} + +private class InstanceCompoundAssignment extends InstanceOperatorCall instanceof CompoundAssignmentOperatorCall +{ + override Expr getQualifier() { result = CompoundAssignmentOperatorCall.super.getQualifier() } +} + +private class InstanceMutator extends InstanceOperatorCall instanceof InstanceMutatorOperatorCall { + override Expr getQualifier() { result = InstanceMutatorOperatorCall.super.getQualifier() } +} + /** Internal implementation details. */ private module Internal { private import OverridableCallable @@ -101,9 +114,9 @@ private module Internal { } or TDispatchOperatorCall(OperatorCall oc) { not oc.isLateBound() and - not oc instanceof CompoundAssignmentOperatorCall + not oc instanceof InstanceOperatorCall } or - TDispatchCompoundAssignmentOperatorCall(CompoundAssignmentOperatorCall caoc) or + TDispatchInstanceOperatorCall(InstanceOperatorCall ioc) or TDispatchReflectionCall(MethodCall mc, string name, Expr object, Expr qualifier, int args) { isReflectionCall(mc, name, object, qualifier, args) } or @@ -890,12 +903,10 @@ private module Internal { override Operator getAStaticTarget() { result = this.getCall().getTarget() } } - private class DispatchCompoundAssignmentOperatorCall extends DispatchOverridableCall, - TDispatchCompoundAssignmentOperatorCall + private class DispatchInstanceOperatorCall extends DispatchOverridableCall, + TDispatchInstanceOperatorCall { - override CompoundAssignmentOperatorCall getCall() { - this = TDispatchCompoundAssignmentOperatorCall(result) - } + override InstanceOperatorCall getCall() { this = TDispatchInstanceOperatorCall(result) } override Expr getArgument(int i) { result = this.getCall().getArgument(i) } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll index 9dbf898e2864..a358e73970c1 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll @@ -570,6 +570,29 @@ class MutatorOperatorCall extends OperatorCall { predicate isPostfix() { mutator_invocation_mode(this, 2) } } +/** + * A call to an instance mutator operator, for example `a++` on + * line 5 in + * + * ```csharp + * class A { + * public void operator ++() { ... } + * + * public static void Increment(A a) { + * a++; + * } + * } + * ``` + */ +class InstanceMutatorOperatorCall extends MutatorOperatorCall { + InstanceMutatorOperatorCall() { this.getTarget().getNumberOfParameters() = 0 } + + /** Gets the qualifier of this instance mutator operator call. */ + Expr getQualifier() { result = this.getChildExpr(0) } + + override Expr getArgument(int i) { none() } +} + /** * A call to a compound assignment operator, for example `this += other` * on line 7 in @@ -743,7 +766,16 @@ class PropertyCall extends AccessorCall, PropertyAccessExpr { } override Accessor getWriteTarget() { - this instanceof AssignableWrite and result = this.getProperty().getSetter() + this instanceof AssignableWrite and + exists(Property p | p = this.getProperty() | + result = p.getSetter() + or + result = + any(Getter g | + g = p.getGetter() and + g.getAnnotatedReturnType().isRef() + ) + ) } override Expr getArgument(int i) { @@ -778,7 +810,16 @@ class IndexerCall extends AccessorCall, IndexerAccessExpr { } override Accessor getWriteTarget() { - this instanceof AssignableWrite and result = this.getIndexer().getSetter() + this instanceof AssignableWrite and + exists(Indexer i | i = this.getIndexer() | + result = i.getSetter() + or + result = + any(Getter g | + g = i.getGetter() and + g.getAnnotatedReturnType().isRef() + ) + ) } override Expr getArgument(int i) { diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 8c4388fe2bb6..5c196df3614c 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.4 + +No user-facing changes. + ## 1.7.3 No user-facing changes. diff --git a/csharp/ql/src/change-notes/released/1.7.4.md b/csharp/ql/src/change-notes/released/1.7.4.md new file mode 100644 index 000000000000..801ed5f5e718 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.7.4.md @@ -0,0 +1,3 @@ +## 1.7.4 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 9f9661b1e77a..f4f3a4d51201 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.3 +lastReleaseVersion: 1.7.4 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 84a1271fcad4..378d02fee3f8 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.7.3 +version: 1.7.5-dev groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected index 6ab83277fcfe..d6965f85da5c 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected @@ -227,7 +227,7 @@ returnTypes | NullableRefTypes.cs:107:26:107:36 | ReturnsRef5 | readonly MyClass! | | NullableRefTypes.cs:108:26:108:36 | ReturnsRef6 | readonly MyClass! | | NullableRefTypes.cs:110:10:110:20 | Parameters1 | Void! | -| NullableRefTypes.cs:113:32:113:44 | get_RefProperty | MyClass! | +| NullableRefTypes.cs:113:32:113:44 | get_RefProperty | ref MyClass! | | NullableRefTypes.cs:116:7:116:23 | | Void | | NullableRefTypes.cs:116:7:116:23 | ToStringWithTypes | Void! | | NullableRefTypes.cs:136:7:136:24 | | Void | diff --git a/csharp/ql/test/library-tests/dataflow/operators/Operator.cs b/csharp/ql/test/library-tests/dataflow/operators/Operator.cs index 5db1a82b9a4b..0b6aa2e8f90a 100644 --- a/csharp/ql/test/library-tests/dataflow/operators/Operator.cs +++ b/csharp/ql/test/library-tests/dataflow/operators/Operator.cs @@ -120,3 +120,36 @@ public void M1() Sink(x.Field); // $ hasValueFlow=1 } } + +public class MutatorOperators +{ + static void Sink(object o) { } + static T Source(object source) => throw null; + + public class C1 + { + public object Field { get; private set; } + + public C1() + { + Field = new object(); + } + + public C1(object o) + { + Field = o; + } + + public void operator ++() + { + Field = Source(1); + } + + public void M1() + { + var x = new C1(); + x++; + Sink(x.Field); // $ hasValueFlow=1 + } + } +} diff --git a/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected b/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected index 8fd12f1c2a8f..dc1ec8b71f44 100644 --- a/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected @@ -130,6 +130,16 @@ edges | Operator.cs:119:14:119:14 | access to local variable y : C [property Field] : Object | Operator.cs:119:9:119:9 | [post] access to local variable x : C [property Field] : Object | provenance | | | Operator.cs:120:14:120:14 | access to local variable x : C [property Field] : Object | Operator.cs:120:14:120:20 | access to property Field | provenance | | | Operator.cs:120:14:120:14 | access to local variable x : C [property Field] : Object | Operator.cs:120:14:120:20 | access to property Field | provenance | | +| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | Operator.cs:151:13:151:13 | [post] access to local variable x : C1 [property Field] : Object | provenance | | +| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | Operator.cs:151:13:151:13 | [post] access to local variable x : C1 [property Field] : Object | provenance | | +| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | provenance | | +| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | provenance | | +| Operator.cs:145:21:145:37 | call to method Source : Object | Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | provenance | | +| Operator.cs:145:21:145:37 | call to method Source : Object | Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | provenance | | +| Operator.cs:151:13:151:13 | [post] access to local variable x : C1 [property Field] : Object | Operator.cs:152:18:152:18 | access to local variable x : C1 [property Field] : Object | provenance | | +| Operator.cs:151:13:151:13 | [post] access to local variable x : C1 [property Field] : Object | Operator.cs:152:18:152:18 | access to local variable x : C1 [property Field] : Object | provenance | | +| Operator.cs:152:18:152:18 | access to local variable x : C1 [property Field] : Object | Operator.cs:152:18:152:24 | access to property Field | provenance | | +| Operator.cs:152:18:152:18 | access to local variable x : C1 [property Field] : Object | Operator.cs:152:18:152:24 | access to property Field | provenance | | nodes | Operator.cs:9:39:9:39 | x : C | semmle.label | x : C | | Operator.cs:9:39:9:39 | x : C | semmle.label | x : C | @@ -275,6 +285,18 @@ nodes | Operator.cs:120:14:120:14 | access to local variable x : C [property Field] : Object | semmle.label | access to local variable x : C [property Field] : Object | | Operator.cs:120:14:120:20 | access to property Field | semmle.label | access to property Field | | Operator.cs:120:14:120:20 | access to property Field | semmle.label | access to property Field | +| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | semmle.label | this [Return] : C1 [property Field] : Object | +| Operator.cs:143:30:143:31 | this [Return] : C1 [property Field] : Object | semmle.label | this [Return] : C1 [property Field] : Object | +| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | semmle.label | [post] this access : C1 [property Field] : Object | +| Operator.cs:145:13:145:17 | [post] this access : C1 [property Field] : Object | semmle.label | [post] this access : C1 [property Field] : Object | +| Operator.cs:145:21:145:37 | call to method Source : Object | semmle.label | call to method Source : Object | +| Operator.cs:145:21:145:37 | call to method Source : Object | semmle.label | call to method Source : Object | +| Operator.cs:151:13:151:13 | [post] access to local variable x : C1 [property Field] : Object | semmle.label | [post] access to local variable x : C1 [property Field] : Object | +| Operator.cs:151:13:151:13 | [post] access to local variable x : C1 [property Field] : Object | semmle.label | [post] access to local variable x : C1 [property Field] : Object | +| Operator.cs:152:18:152:18 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object | +| Operator.cs:152:18:152:18 | access to local variable x : C1 [property Field] : Object | semmle.label | access to local variable x : C1 [property Field] : Object | +| Operator.cs:152:18:152:24 | access to property Field | semmle.label | access to property Field | +| Operator.cs:152:18:152:24 | access to property Field | semmle.label | access to property Field | subpaths | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | Operator.cs:16:49:16:49 | access to parameter x : C | Operator.cs:29:17:29:21 | call to operator + : C | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | Operator.cs:16:49:16:49 | access to parameter x : C | Operator.cs:29:17:29:21 | call to operator + : C | @@ -308,3 +330,5 @@ testFailures | Operator.cs:78:14:78:14 | (...) ... | Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:78:14:78:14 | (...) ... | $@ | Operator.cs:84:17:84:29 | call to method Source : C | call to method Source : C | | Operator.cs:120:14:120:20 | access to property Field | Operator.cs:116:23:116:39 | call to method Source : Object | Operator.cs:120:14:120:20 | access to property Field | $@ | Operator.cs:116:23:116:39 | call to method Source : Object | call to method Source : Object | | Operator.cs:120:14:120:20 | access to property Field | Operator.cs:116:23:116:39 | call to method Source : Object | Operator.cs:120:14:120:20 | access to property Field | $@ | Operator.cs:116:23:116:39 | call to method Source : Object | call to method Source : Object | +| Operator.cs:152:18:152:24 | access to property Field | Operator.cs:145:21:145:37 | call to method Source : Object | Operator.cs:152:18:152:24 | access to property Field | $@ | Operator.cs:145:21:145:37 | call to method Source : Object | call to method Source : Object | +| Operator.cs:152:18:152:24 | access to property Field | Operator.cs:145:21:145:37 | call to method Source : Object | Operator.cs:152:18:152:24 | access to property Field | $@ | Operator.cs:145:21:145:37 | call to method Source : Object | call to method Source : Object | diff --git a/csharp/ql/test/library-tests/encoding/SBCS.cs b/csharp/ql/test/library-tests/encoding/SBCS.cs index 46d3af486961..9a2d677ba16b 100644 --- a/csharp/ql/test/library-tests/encoding/SBCS.cs +++ b/csharp/ql/test/library-tests/encoding/SBCS.cs @@ -1,4 +1,4 @@ -class SBCS +class SBCS { - string sbcs = "’"; + string sbcs = "�"; } diff --git a/csharp/ql/test/library-tests/extension/PrintAst.expected b/csharp/ql/test/library-tests/extension/PrintAst.expected index 5016665c08b2..f05e3969261c 100644 --- a/csharp/ql/test/library-tests/extension/PrintAst.expected +++ b/csharp/ql/test/library-tests/extension/PrintAst.expected @@ -171,311 +171,341 @@ extensions.cs: # 16| 4: [BlockStmt] {...} # 16| 0: [ReturnStmt] return ...; # 16| 0: [ParameterAccess] access to parameter t -# 19| 5: [ExtensionType] extension(Object) -# 21| 4: [ExtensionMethod] StaticObjectM1 -# 21| -1: [TypeMention] int -# 21| 4: [BlockStmt] {...} -# 21| 0: [ReturnStmt] return ...; -# 21| 0: [IntLiteral] 0 -# 22| 5: [ExtensionMethod] StaticObjectM2 -# 22| -1: [TypeMention] int +# 17| 15: [ExtensionCallable,IncrementOperator] ++ +# 17| -1: [TypeMention] Void #-----| 2: (Parameters) -# 22| 0: [Parameter] s -# 22| -1: [TypeMention] string -# 22| 4: [BlockStmt] {...} -# 22| 0: [ReturnStmt] return ...; -# 22| 0: [PropertyCall] access to property Length -# 22| -1: [ParameterAccess] access to parameter s -# 23| 6: [Property] StaticProp -# 23| -1: [TypeMention] bool -# 23| 3: [ExtensionCallable,Getter] get_StaticProp -# 23| 4: [BoolLiteral] true -# 26| 8: [ExtensionType] extension(T)`1 +# 6| 0: [Parameter] s +# 6| -1: [TypeMention] string +# 17| 4: [BlockStmt] {...} +# 18| 16: [DecrementOperator,ExtensionCallable] -- +# 18| -1: [TypeMention] string +#-----| 2: (Parameters) +# 18| 0: [Parameter] o +# 18| -1: [TypeMention] string +# 18| 4: [BlockStmt] {...} +# 18| 0: [ReturnStmt] return ...; +# 18| 0: [ParameterAccess] access to parameter o +# 21| 5: [ExtensionType] extension(Object) +# 23| 4: [ExtensionMethod] StaticObjectM1 +# 23| -1: [TypeMention] int +# 23| 4: [BlockStmt] {...} +# 23| 0: [ReturnStmt] return ...; +# 23| 0: [IntLiteral] 0 +# 24| 5: [ExtensionMethod] StaticObjectM2 +# 24| -1: [TypeMention] int +#-----| 2: (Parameters) +# 24| 0: [Parameter] s +# 24| -1: [TypeMention] string +# 24| 4: [BlockStmt] {...} +# 24| 0: [ReturnStmt] return ...; +# 24| 0: [PropertyCall] access to property Length +# 24| -1: [ParameterAccess] access to parameter s +# 25| 6: [Property] StaticProp +# 25| -1: [TypeMention] bool +# 25| 3: [ExtensionCallable,Getter] get_StaticProp +# 25| 4: [BoolLiteral] true +# 28| 8: [ExtensionType] extension(T)`1 #-----| 1: (Type parameters) -# 26| 0: [TypeParameter] T +# 28| 0: [TypeParameter] T #-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 28| 4: [Property] GenericProp1 -# 28| -1: [TypeMention] bool -# 28| 3: [ExtensionCallable,Getter] get_GenericProp1 +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T +# 30| 4: [Property] GenericProp1 +# 30| -1: [TypeMention] bool +# 30| 3: [ExtensionCallable,Getter] get_GenericProp1 #-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 28| 4: [IsExpr] ... is ... -# 28| 0: [SyntheticExtensionParameterAccess] access to extension synthetic parameter t -# 28| 1: [NotPatternExpr] not ... -# 28| 0: [ConstantPatternExpr,NullLiteral] null -# 29| 5: [Property] GenericProp2 -# 29| -1: [TypeMention] bool -# 29| 3: [ExtensionCallable,Getter] get_GenericProp2 +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T +# 30| 4: [IsExpr] ... is ... +# 30| 0: [SyntheticExtensionParameterAccess] access to extension synthetic parameter t +# 30| 1: [NotPatternExpr] not ... +# 30| 0: [ConstantPatternExpr,NullLiteral] null +# 31| 5: [Property] GenericProp2 +# 31| -1: [TypeMention] bool +# 31| 3: [ExtensionCallable,Getter] get_GenericProp2 #-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 29| 4: [BlockStmt] {...} -# 29| 0: [ReturnStmt] return ...; -# 29| 0: [BoolLiteral] true -# 29| 4: [ExtensionCallable,Setter] set_GenericProp2 +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T +# 31| 4: [BlockStmt] {...} +# 31| 0: [ReturnStmt] return ...; +# 31| 0: [BoolLiteral] true +# 31| 4: [ExtensionCallable,Setter] set_GenericProp2 #-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 29| 1: [Parameter] value -# 29| 4: [BlockStmt] {...} -# 30| 6: [ExtensionMethod] GenericM1 -# 30| -1: [TypeMention] bool -#-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 30| 4: [IsExpr] ... is ... -# 30| 0: [SyntheticExtensionParameterAccess] access to extension synthetic parameter t -# 30| 1: [NotPatternExpr] not ... -# 30| 0: [ConstantPatternExpr,NullLiteral] null -# 31| 7: [ExtensionMethod] GenericM2`1 -# 31| -1: [TypeMention] Void -#-----| 1: (Type parameters) -# 31| 0: [TypeParameter] S -#-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 31| 1: [Parameter] other -# 31| -1: [TypeMention] S -# 31| 4: [BlockStmt] {...} -# 32| 8: [ExtensionMethod] GenericStaticM1 -# 32| -1: [TypeMention] Void +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T +# 31| 1: [Parameter] value +# 31| 4: [BlockStmt] {...} +# 32| 6: [ExtensionMethod] GenericM1 +# 32| -1: [TypeMention] bool #-----| 2: (Parameters) -# 26| 0: [Parameter] t -# 26| -1: [TypeMention] T -# 32| 4: [BlockStmt] {...} -# 33| 9: [ExtensionMethod] GenericStaticM2`1 +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T +# 32| 4: [IsExpr] ... is ... +# 32| 0: [SyntheticExtensionParameterAccess] access to extension synthetic parameter t +# 32| 1: [NotPatternExpr] not ... +# 32| 0: [ConstantPatternExpr,NullLiteral] null +# 33| 7: [ExtensionMethod] GenericM2`1 # 33| -1: [TypeMention] Void #-----| 1: (Type parameters) # 33| 0: [TypeParameter] S #-----| 2: (Parameters) -# 33| 0: [Parameter] other +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T +# 33| 1: [Parameter] other # 33| -1: [TypeMention] S # 33| 4: [BlockStmt] {...} -# 34| 10: [AddOperator,ExtensionCallable] + -# 34| -1: [TypeMention] T +# 34| 8: [ExtensionMethod] GenericStaticM1 +# 34| -1: [TypeMention] Void #-----| 2: (Parameters) -# 34| 0: [Parameter] a -# 34| -1: [TypeMention] T -# 34| 1: [Parameter] b -# 34| -1: [TypeMention] T +# 28| 0: [Parameter] t +# 28| -1: [TypeMention] T # 34| 4: [BlockStmt] {...} -# 34| 0: [ReturnStmt] return ...; -# 34| 0: [NullLiteral] null -# 38| [Class] ClassicExtensions -# 40| 4: [ExtensionMethod] M3 -# 40| -1: [TypeMention] bool +# 35| 9: [ExtensionMethod] GenericStaticM2`1 +# 35| -1: [TypeMention] Void +#-----| 1: (Type parameters) +# 35| 0: [TypeParameter] S +#-----| 2: (Parameters) +# 35| 0: [Parameter] other +# 35| -1: [TypeMention] S +# 35| 4: [BlockStmt] {...} +# 36| 10: [AddOperator,ExtensionCallable] + +# 36| -1: [TypeMention] T +#-----| 2: (Parameters) +# 36| 0: [Parameter] a +# 36| -1: [TypeMention] T +# 36| 1: [Parameter] b +# 36| -1: [TypeMention] T +# 36| 4: [BlockStmt] {...} +# 36| 0: [ReturnStmt] return ...; +# 36| 0: [NullLiteral] null +# 40| [Class] ClassicExtensions +# 42| 4: [ExtensionMethod] M3 +# 42| -1: [TypeMention] bool #-----| 2: (Parameters) -# 40| 0: [Parameter] s -# 40| -1: [TypeMention] string -# 40| 4: [IsExpr] ... is ... -# 40| 0: [ParameterAccess] access to parameter s -# 40| 1: [NotPatternExpr] not ... -# 40| 0: [ConstantPatternExpr,NullLiteral] null -# 43| [Class] C -# 45| 6: [Method] CallingExtensions -# 45| -1: [TypeMention] Void -# 46| 4: [BlockStmt] {...} -# 47| 0: [LocalVariableDeclStmt] ... ...; -# 47| 0: [LocalVariableDeclAndInitExpr] String s = ... -# 47| -1: [TypeMention] string -# 47| 0: [LocalVariableAccess] access to local variable s -# 47| 1: [StringLiteralUtf16] "Hello World." -# 50| 1: [LocalVariableDeclStmt] ... ...; -# 50| 0: [LocalVariableDeclAndInitExpr] Boolean x11 = ... -# 50| -1: [TypeMention] bool -# 50| 0: [LocalVariableAccess] access to local variable x11 -# 50| 1: [ExtensionPropertyCall] access to property Prop1 -# 50| -1: [LocalVariableAccess] access to local variable s -# 51| 2: [LocalVariableDeclStmt] ... ...; -# 51| 0: [LocalVariableDeclAndInitExpr] Boolean x12 = ... -# 51| -1: [TypeMention] bool -# 51| 0: [LocalVariableAccess] access to local variable x12 -# 51| 1: [ExtensionPropertyCall] access to property Prop2 -# 51| -1: [LocalVariableAccess] access to local variable s -# 52| 3: [ExprStmt] ...; -# 52| 0: [AssignExpr] ... = ... -# 52| 0: [ExtensionPropertyCall] access to property Prop2 +# 42| 0: [Parameter] s +# 42| -1: [TypeMention] string +# 42| 4: [IsExpr] ... is ... +# 42| 0: [ParameterAccess] access to parameter s +# 42| 1: [NotPatternExpr] not ... +# 42| 0: [ConstantPatternExpr,NullLiteral] null +# 45| [Class] C +# 47| 6: [Method] CallingExtensions +# 47| -1: [TypeMention] Void +# 48| 4: [BlockStmt] {...} +# 49| 0: [LocalVariableDeclStmt] ... ...; +# 49| 0: [LocalVariableDeclAndInitExpr] String s = ... +# 49| -1: [TypeMention] string +# 49| 0: [LocalVariableAccess] access to local variable s +# 49| 1: [StringLiteralUtf16] "Hello World." +# 52| 1: [LocalVariableDeclStmt] ... ...; +# 52| 0: [LocalVariableDeclAndInitExpr] Boolean x11 = ... +# 52| -1: [TypeMention] bool +# 52| 0: [LocalVariableAccess] access to local variable x11 +# 52| 1: [ExtensionPropertyCall] access to property Prop1 # 52| -1: [LocalVariableAccess] access to local variable s -# 52| 1: [BoolLiteral] true -# 53| 4: [LocalVariableDeclStmt] ... ...; -# 53| 0: [LocalVariableDeclAndInitExpr] Boolean x13 = ... +# 53| 2: [LocalVariableDeclStmt] ... ...; +# 53| 0: [LocalVariableDeclAndInitExpr] Boolean x12 = ... # 53| -1: [TypeMention] bool -# 53| 0: [LocalVariableAccess] access to local variable x13 -# 53| 1: [ExtensionPropertyCall] access to property StaticProp1 -# 53| -1: [TypeAccess] access to type String -# 53| 0: [TypeMention] string -# 54| 5: [LocalVariableDeclStmt] ... ...; -# 54| 0: [LocalVariableDeclAndInitExpr] Boolean x14 = ... -# 54| -1: [TypeMention] bool -# 54| 0: [LocalVariableAccess] access to local variable x14 -# 54| 1: [ExtensionPropertyCall] access to property StaticProp -# 54| -1: [TypeAccess] access to type Object -# 54| 0: [TypeMention] object -# 57| 6: [LocalVariableDeclStmt] ... ...; -# 57| 0: [LocalVariableDeclAndInitExpr] Boolean x21 = ... -# 57| -1: [TypeMention] bool -# 57| 0: [LocalVariableAccess] access to local variable x21 -# 57| 1: [MethodCall] call to method M1 -# 57| -1: [LocalVariableAccess] access to local variable s -# 58| 7: [LocalVariableDeclStmt] ... ...; -# 58| 0: [LocalVariableDeclAndInitExpr] String x22 = ... -# 58| -1: [TypeMention] string -# 58| 0: [LocalVariableAccess] access to local variable x22 -# 58| 1: [MethodCall] call to method M2 -# 58| -1: [LocalVariableAccess] access to local variable s -# 58| 0: [StringLiteralUtf16] "!!!" -# 59| 8: [LocalVariableDeclStmt] ... ...; -# 59| 0: [LocalVariableDeclAndInitExpr] Int32 x23 = ... -# 59| -1: [TypeMention] int -# 59| 0: [LocalVariableAccess] access to local variable x23 -# 59| 1: [MethodCall] call to method StaticM1 -# 59| -1: [TypeAccess] access to type String -# 59| 0: [TypeMention] string -# 60| 9: [LocalVariableDeclStmt] ... ...; -# 60| 0: [LocalVariableDeclAndInitExpr] Int32 x24 = ... -# 60| -1: [TypeMention] int -# 60| 0: [LocalVariableAccess] access to local variable x24 -# 60| 1: [MethodCall] call to method StaticM2 -# 60| -1: [TypeAccess] access to type String -# 60| 0: [TypeMention] string -# 60| 0: [LocalVariableAccess] access to local variable s -# 61| 10: [LocalVariableDeclStmt] ... ...; -# 61| 0: [LocalVariableDeclAndInitExpr] Int32 x25 = ... +# 53| 0: [LocalVariableAccess] access to local variable x12 +# 53| 1: [ExtensionPropertyCall] access to property Prop2 +# 53| -1: [LocalVariableAccess] access to local variable s +# 54| 3: [ExprStmt] ...; +# 54| 0: [AssignExpr] ... = ... +# 54| 0: [ExtensionPropertyCall] access to property Prop2 +# 54| -1: [LocalVariableAccess] access to local variable s +# 54| 1: [BoolLiteral] true +# 55| 4: [LocalVariableDeclStmt] ... ...; +# 55| 0: [LocalVariableDeclAndInitExpr] Boolean x13 = ... +# 55| -1: [TypeMention] bool +# 55| 0: [LocalVariableAccess] access to local variable x13 +# 55| 1: [ExtensionPropertyCall] access to property StaticProp1 +# 55| -1: [TypeAccess] access to type String +# 55| 0: [TypeMention] string +# 56| 5: [LocalVariableDeclStmt] ... ...; +# 56| 0: [LocalVariableDeclAndInitExpr] Boolean x14 = ... +# 56| -1: [TypeMention] bool +# 56| 0: [LocalVariableAccess] access to local variable x14 +# 56| 1: [ExtensionPropertyCall] access to property StaticProp +# 56| -1: [TypeAccess] access to type Object +# 56| 0: [TypeMention] object +# 59| 6: [LocalVariableDeclStmt] ... ...; +# 59| 0: [LocalVariableDeclAndInitExpr] Boolean x21 = ... +# 59| -1: [TypeMention] bool +# 59| 0: [LocalVariableAccess] access to local variable x21 +# 59| 1: [MethodCall] call to method M1 +# 59| -1: [LocalVariableAccess] access to local variable s +# 60| 7: [LocalVariableDeclStmt] ... ...; +# 60| 0: [LocalVariableDeclAndInitExpr] String x22 = ... +# 60| -1: [TypeMention] string +# 60| 0: [LocalVariableAccess] access to local variable x22 +# 60| 1: [MethodCall] call to method M2 +# 60| -1: [LocalVariableAccess] access to local variable s +# 60| 0: [StringLiteralUtf16] "!!!" +# 61| 8: [LocalVariableDeclStmt] ... ...; +# 61| 0: [LocalVariableDeclAndInitExpr] Int32 x23 = ... # 61| -1: [TypeMention] int -# 61| 0: [LocalVariableAccess] access to local variable x25 -# 61| 1: [MethodCall] call to method StaticObjectM1 -# 61| -1: [TypeAccess] access to type Object -# 61| 0: [TypeMention] object -# 62| 11: [LocalVariableDeclStmt] ... ...; -# 62| 0: [LocalVariableDeclAndInitExpr] Int32 x26 = ... +# 61| 0: [LocalVariableAccess] access to local variable x23 +# 61| 1: [MethodCall] call to method StaticM1 +# 61| -1: [TypeAccess] access to type String +# 61| 0: [TypeMention] string +# 62| 9: [LocalVariableDeclStmt] ... ...; +# 62| 0: [LocalVariableDeclAndInitExpr] Int32 x24 = ... # 62| -1: [TypeMention] int -# 62| 0: [LocalVariableAccess] access to local variable x26 -# 62| 1: [MethodCall] call to method StaticObjectM2 -# 62| -1: [TypeAccess] access to type Object -# 62| 0: [TypeMention] object +# 62| 0: [LocalVariableAccess] access to local variable x24 +# 62| 1: [MethodCall] call to method StaticM2 +# 62| -1: [TypeAccess] access to type String +# 62| 0: [TypeMention] string # 62| 0: [LocalVariableAccess] access to local variable s -# 65| 12: [LocalVariableDeclStmt] ... ...; -# 65| 0: [LocalVariableDeclAndInitExpr] String x30 = ... -# 65| -1: [TypeMention] string -# 65| 0: [LocalVariableAccess] access to local variable x30 -# 65| 1: [ExtensionOperatorCall] call to operator * -# 65| 0: [IntLiteral] 3 -# 65| 1: [LocalVariableAccess] access to local variable s -# 68| 13: [LocalVariableDeclStmt] ... ...; -# 68| 0: [LocalVariableDeclAndInitExpr] Boolean y = ... -# 68| -1: [TypeMention] bool -# 68| 0: [LocalVariableAccess] access to local variable y -# 68| 1: [MethodCall] call to method M3 -# 68| -1: [LocalVariableAccess] access to local variable s -# 71| 14: [ExprStmt] ...; -# 71| 0: [MethodCall] call to method M1 -# 71| -1: [TypeAccess] access to type MyExtensions -# 71| 0: [TypeMention] MyExtensions -# 71| 0: [LocalVariableAccess] access to local variable s -# 72| 15: [ExprStmt] ...; -# 72| 0: [MethodCall] call to method M2 -# 72| -1: [TypeAccess] access to type MyExtensions -# 72| 0: [TypeMention] MyExtensions -# 72| 0: [LocalVariableAccess] access to local variable s -# 72| 1: [StringLiteralUtf16] "!!!" -# 73| 16: [ExprStmt] ...; -# 73| 0: [MethodCall] call to method StaticM1 -# 73| -1: [TypeAccess] access to type MyExtensions -# 73| 0: [TypeMention] MyExtensions -# 74| 17: [ExprStmt] ...; -# 74| 0: [MethodCall] call to method StaticM2 -# 74| -1: [TypeAccess] access to type MyExtensions -# 74| 0: [TypeMention] MyExtensions -# 74| 0: [LocalVariableAccess] access to local variable s -# 75| 18: [ExprStmt] ...; -# 75| 0: [MethodCall] call to method StaticObjectM1 +# 63| 10: [LocalVariableDeclStmt] ... ...; +# 63| 0: [LocalVariableDeclAndInitExpr] Int32 x25 = ... +# 63| -1: [TypeMention] int +# 63| 0: [LocalVariableAccess] access to local variable x25 +# 63| 1: [MethodCall] call to method StaticObjectM1 +# 63| -1: [TypeAccess] access to type Object +# 63| 0: [TypeMention] object +# 64| 11: [LocalVariableDeclStmt] ... ...; +# 64| 0: [LocalVariableDeclAndInitExpr] Int32 x26 = ... +# 64| -1: [TypeMention] int +# 64| 0: [LocalVariableAccess] access to local variable x26 +# 64| 1: [MethodCall] call to method StaticObjectM2 +# 64| -1: [TypeAccess] access to type Object +# 64| 0: [TypeMention] object +# 64| 0: [LocalVariableAccess] access to local variable s +# 67| 12: [LocalVariableDeclStmt] ... ...; +# 67| 0: [LocalVariableDeclAndInitExpr] String x30 = ... +# 67| -1: [TypeMention] string +# 67| 0: [LocalVariableAccess] access to local variable x30 +# 67| 1: [ExtensionOperatorCall] call to operator * +# 67| 0: [IntLiteral] 3 +# 67| 1: [LocalVariableAccess] access to local variable s +# 68| 13: [ExprStmt] ...; +# 68| 0: [ExtensionOperatorCall] call to operator ++ +# 68| 0: [LocalVariableAccess] access to local variable s +# 69| 14: [ExprStmt] ...; +# 69| 0: [ExtensionOperatorCall] call to operator -- +# 69| 0: [LocalVariableAccess] access to local variable s +# 72| 15: [LocalVariableDeclStmt] ... ...; +# 72| 0: [LocalVariableDeclAndInitExpr] Boolean y = ... +# 72| -1: [TypeMention] bool +# 72| 0: [LocalVariableAccess] access to local variable y +# 72| 1: [MethodCall] call to method M3 +# 72| -1: [LocalVariableAccess] access to local variable s +# 75| 16: [ExprStmt] ...; +# 75| 0: [MethodCall] call to method M1 # 75| -1: [TypeAccess] access to type MyExtensions # 75| 0: [TypeMention] MyExtensions -# 76| 19: [ExprStmt] ...; -# 76| 0: [MethodCall] call to method StaticObjectM2 +# 75| 0: [LocalVariableAccess] access to local variable s +# 76| 17: [ExprStmt] ...; +# 76| 0: [MethodCall] call to method M2 # 76| -1: [TypeAccess] access to type MyExtensions # 76| 0: [TypeMention] MyExtensions # 76| 0: [LocalVariableAccess] access to local variable s +# 76| 1: [StringLiteralUtf16] "!!!" +# 77| 18: [ExprStmt] ...; +# 77| 0: [MethodCall] call to method StaticM1 +# 77| -1: [TypeAccess] access to type MyExtensions +# 77| 0: [TypeMention] MyExtensions +# 78| 19: [ExprStmt] ...; +# 78| 0: [MethodCall] call to method StaticM2 +# 78| -1: [TypeAccess] access to type MyExtensions +# 78| 0: [TypeMention] MyExtensions +# 78| 0: [LocalVariableAccess] access to local variable s # 79| 20: [ExprStmt] ...; -# 79| 0: [ExtensionOperatorCall] call to operator * +# 79| 0: [MethodCall] call to method StaticObjectM1 # 79| -1: [TypeAccess] access to type MyExtensions # 79| 0: [TypeMention] MyExtensions -# 79| 0: [IntLiteral] 3 -# 79| 1: [LocalVariableAccess] access to local variable s -# 82| 21: [ExprStmt] ...; -# 82| 0: [MethodCall] call to extension accessor get_Prop1 -# 82| -1: [TypeAccess] access to type MyExtensions -# 82| 0: [TypeMention] MyExtensions -# 82| 0: [LocalVariableAccess] access to local variable s +# 80| 21: [ExprStmt] ...; +# 80| 0: [MethodCall] call to method StaticObjectM2 +# 80| -1: [TypeAccess] access to type MyExtensions +# 80| 0: [TypeMention] MyExtensions +# 80| 0: [LocalVariableAccess] access to local variable s # 83| 22: [ExprStmt] ...; -# 83| 0: [MethodCall] call to extension accessor get_Prop2 +# 83| 0: [ExtensionOperatorCall] call to operator * # 83| -1: [TypeAccess] access to type MyExtensions # 83| 0: [TypeMention] MyExtensions -# 83| 0: [LocalVariableAccess] access to local variable s +# 83| 0: [IntLiteral] 3 +# 83| 1: [LocalVariableAccess] access to local variable s # 84| 23: [ExprStmt] ...; -# 84| 0: [MethodCall] call to extension accessor set_Prop2 +# 84| 0: [ExtensionOperatorCall] call to operator ++ # 84| -1: [TypeAccess] access to type MyExtensions # 84| 0: [TypeMention] MyExtensions # 84| 0: [LocalVariableAccess] access to local variable s -# 84| 1: [BoolLiteral] false # 85| 24: [ExprStmt] ...; -# 85| 0: [MethodCall] call to extension accessor get_StaticProp +# 85| 0: [ExtensionOperatorCall] call to operator -- # 85| -1: [TypeAccess] access to type MyExtensions # 85| 0: [TypeMention] MyExtensions -# 88| 7: [Method] CallingGenericExtensions -# 88| -1: [TypeMention] Void -# 89| 4: [BlockStmt] {...} -# 90| 0: [LocalVariableDeclStmt] ... ...; -# 90| 0: [LocalVariableDeclAndInitExpr] String s = ... -# 90| -1: [TypeMention] string +# 85| 0: [LocalVariableAccess] access to local variable s +# 88| 25: [ExprStmt] ...; +# 88| 0: [MethodCall] call to extension accessor get_Prop1 +# 88| -1: [TypeAccess] access to type MyExtensions +# 88| 0: [TypeMention] MyExtensions +# 88| 0: [LocalVariableAccess] access to local variable s +# 89| 26: [ExprStmt] ...; +# 89| 0: [MethodCall] call to extension accessor get_Prop2 +# 89| -1: [TypeAccess] access to type MyExtensions +# 89| 0: [TypeMention] MyExtensions +# 89| 0: [LocalVariableAccess] access to local variable s +# 90| 27: [ExprStmt] ...; +# 90| 0: [MethodCall] call to extension accessor set_Prop2 +# 90| -1: [TypeAccess] access to type MyExtensions +# 90| 0: [TypeMention] MyExtensions # 90| 0: [LocalVariableAccess] access to local variable s -# 90| 1: [StringLiteralUtf16] "Hello Generic World." -# 91| 1: [LocalVariableDeclStmt] ... ...; -# 91| 0: [LocalVariableDeclAndInitExpr] Object o = ... -# 91| -1: [TypeMention] object -# 91| 0: [LocalVariableAccess] access to local variable o -# 91| 1: [ObjectCreation] object creation of type Object -# 91| 0: [TypeMention] object -# 94| 2: [ExprStmt] ...; -# 94| 0: [MethodCall] call to method GenericM1 -# 94| -1: [LocalVariableAccess] access to local variable o -# 95| 3: [ExprStmt] ...; -# 95| 0: [MethodCall] call to method GenericM1 -# 95| -1: [LocalVariableAccess] access to local variable s -# 98| 4: [ExprStmt] ...; -# 98| 0: [MethodCall] call to method GenericM1 -# 98| -1: [TypeAccess] access to type MyExtensions -# 98| 0: [TypeMention] MyExtensions -# 98| 0: [LocalVariableAccess] access to local variable o -# 99| 5: [ExprStmt] ...; -# 99| 0: [MethodCall] call to method GenericM1 -# 99| -1: [TypeAccess] access to type MyExtensions -# 99| 0: [TypeMention] MyExtensions -# 99| 0: [LocalVariableAccess] access to local variable s -# 101| 6: [ExprStmt] ...; -# 101| 0: [MethodCall] call to method GenericM2 -# 101| -1: [LocalVariableAccess] access to local variable o -# 101| 0: [IntLiteral] 42 -# 102| 7: [ExprStmt] ...; -# 102| 0: [MethodCall] call to method GenericM2 -# 102| -1: [TypeAccess] access to type MyExtensions -# 102| 0: [TypeMention] MyExtensions -# 102| 0: [LocalVariableAccess] access to local variable o -# 102| 1: [IntLiteral] 42 -# 104| 8: [ExprStmt] ...; -# 104| 0: [MethodCall] call to method StringGenericM1 -# 104| -1: [LocalVariableAccess] access to local variable s -# 104| 0: [IntLiteral] 7 -# 104| 1: [ObjectCreation] object creation of type Object -# 104| 0: [TypeMention] object -# 105| 9: [ExprStmt] ...; -# 105| 0: [MethodCall] call to method StringGenericM1 +# 90| 1: [BoolLiteral] false +# 91| 28: [ExprStmt] ...; +# 91| 0: [MethodCall] call to extension accessor get_StaticProp +# 91| -1: [TypeAccess] access to type MyExtensions +# 91| 0: [TypeMention] MyExtensions +# 94| 7: [Method] CallingGenericExtensions +# 94| -1: [TypeMention] Void +# 95| 4: [BlockStmt] {...} +# 96| 0: [LocalVariableDeclStmt] ... ...; +# 96| 0: [LocalVariableDeclAndInitExpr] String s = ... +# 96| -1: [TypeMention] string +# 96| 0: [LocalVariableAccess] access to local variable s +# 96| 1: [StringLiteralUtf16] "Hello Generic World." +# 97| 1: [LocalVariableDeclStmt] ... ...; +# 97| 0: [LocalVariableDeclAndInitExpr] Object o = ... +# 97| -1: [TypeMention] object +# 97| 0: [LocalVariableAccess] access to local variable o +# 97| 1: [ObjectCreation] object creation of type Object +# 97| 0: [TypeMention] object +# 100| 2: [ExprStmt] ...; +# 100| 0: [MethodCall] call to method GenericM1 +# 100| -1: [LocalVariableAccess] access to local variable o +# 101| 3: [ExprStmt] ...; +# 101| 0: [MethodCall] call to method GenericM1 +# 101| -1: [LocalVariableAccess] access to local variable s +# 104| 4: [ExprStmt] ...; +# 104| 0: [MethodCall] call to method GenericM1 +# 104| -1: [TypeAccess] access to type MyExtensions +# 104| 0: [TypeMention] MyExtensions +# 104| 0: [LocalVariableAccess] access to local variable o +# 105| 5: [ExprStmt] ...; +# 105| 0: [MethodCall] call to method GenericM1 # 105| -1: [TypeAccess] access to type MyExtensions # 105| 0: [TypeMention] MyExtensions # 105| 0: [LocalVariableAccess] access to local variable s -# 105| 1: [StringLiteralUtf16] "test" -# 105| 2: [ObjectCreation] object creation of type Object -# 105| 0: [TypeMention] object +# 107| 6: [ExprStmt] ...; +# 107| 0: [MethodCall] call to method GenericM2 +# 107| -1: [LocalVariableAccess] access to local variable o +# 107| 0: [IntLiteral] 42 +# 108| 7: [ExprStmt] ...; +# 108| 0: [MethodCall] call to method GenericM2 +# 108| -1: [TypeAccess] access to type MyExtensions +# 108| 0: [TypeMention] MyExtensions +# 108| 0: [LocalVariableAccess] access to local variable o +# 108| 1: [IntLiteral] 42 +# 110| 8: [ExprStmt] ...; +# 110| 0: [MethodCall] call to method StringGenericM1 +# 110| -1: [LocalVariableAccess] access to local variable s +# 110| 0: [IntLiteral] 7 +# 110| 1: [ObjectCreation] object creation of type Object +# 110| 0: [TypeMention] object +# 111| 9: [ExprStmt] ...; +# 111| 0: [MethodCall] call to method StringGenericM1 +# 111| -1: [TypeAccess] access to type MyExtensions +# 111| 0: [TypeMention] MyExtensions +# 111| 0: [LocalVariableAccess] access to local variable s +# 111| 1: [StringLiteralUtf16] "test" +# 111| 2: [ObjectCreation] object creation of type Object +# 111| 0: [TypeMention] object diff --git a/csharp/ql/test/library-tests/extension/extensionTypes.expected b/csharp/ql/test/library-tests/extension/extensionTypes.expected index b27ff095a4be..30be52e8e898 100644 --- a/csharp/ql/test/library-tests/extension/extensionTypes.expected +++ b/csharp/ql/test/library-tests/extension/extensionTypes.expected @@ -5,10 +5,10 @@ extensionTypeReceiverParameter | extensionTypes.cs:18:5:21:5 | extension(Int32) | extensionTypes.cs:18:23:18:24 | i3 | | extensionTypes.cs:22:5:25:5 | extension(String) | extensionTypes.cs:22:23:22:23 | s | | extensionTypes.cs:26:5:29:5 | extension(T1)`1 | extensionTypes.cs:26:42:26:43 | t1 | -| extensions.cs:6:5:17:5 | extension(String) | extensions.cs:6:22:6:22 | s | -| extensions.cs:26:5:35:5 | extension(Object) | extensions.cs:26:20:26:20 | t | -| extensions.cs:26:5:35:5 | extension(String) | extensions.cs:26:20:26:20 | t | -| extensions.cs:26:5:35:5 | extension(T)`1 | extensions.cs:26:20:26:20 | t | +| extensions.cs:6:5:19:5 | extension(String) | extensions.cs:6:22:6:22 | s | +| extensions.cs:28:5:37:5 | extension(Object) | extensions.cs:28:20:28:20 | t | +| extensions.cs:28:5:37:5 | extension(String) | extensions.cs:28:20:28:20 | t | +| extensions.cs:28:5:37:5 | extension(T)`1 | extensions.cs:28:20:28:20 | t | extensionTypeExtendedType | extensionTypes.cs:6:5:9:5 | extension(String) | string | | extensionTypes.cs:10:5:13:5 | extension(Int32) | int | @@ -16,11 +16,11 @@ extensionTypeExtendedType | extensionTypes.cs:18:5:21:5 | extension(Int32) | int | | extensionTypes.cs:22:5:25:5 | extension(String) | string | | extensionTypes.cs:26:5:29:5 | extension(T1)`1 | T1 | -| extensions.cs:6:5:17:5 | extension(String) | string | -| extensions.cs:19:5:24:5 | extension(Object) | object | -| extensions.cs:26:5:35:5 | extension(Object) | object | -| extensions.cs:26:5:35:5 | extension(String) | string | -| extensions.cs:26:5:35:5 | extension(T)`1 | T | +| extensions.cs:6:5:19:5 | extension(String) | string | +| extensions.cs:21:5:26:5 | extension(Object) | object | +| extensions.cs:28:5:37:5 | extension(Object) | object | +| extensions.cs:28:5:37:5 | extension(String) | string | +| extensions.cs:28:5:37:5 | extension(T)`1 | T | extensionTypeReceiverParameterAttribute | extensionTypes.cs:6:5:9:5 | extension(String) | extensionTypes.cs:6:32:6:32 | s | extensionTypes.cs:6:16:6:22 | [NotNull(...)] | | extensionTypes.cs:26:5:29:5 | extension(T1)`1 | extensionTypes.cs:26:42:26:43 | t1 | extensionTypes.cs:26:20:26:30 | [NotNullWhen(...)] | @@ -30,7 +30,7 @@ extensionTypeReceiverParameterModifier | extensionTypes.cs:18:5:21:5 | extension(Int32) | extensionTypes.cs:18:23:18:24 | i3 | ref | extensionTypeParameterConstraints | extensionTypes.cs:26:5:29:5 | extension(T1)`1 | extensionTypes.cs:26:15:26:16 | T1 | file://:0:0:0:0 | where T1: ... | -| extensions.cs:26:5:35:5 | extension(T)`1 | extensions.cs:26:15:26:15 | T | file://:0:0:0:0 | where T: ... | +| extensions.cs:28:5:37:5 | extension(T)`1 | extensions.cs:28:15:28:15 | T | file://:0:0:0:0 | where T: ... | syntheticParameterModifier | extensionTypes.cs:10:5:13:5 | extension(Int32) | extensionTypes.cs:12:21:12:23 | M21 | extensionTypes.cs:10:32:10:33 | i1 | ref readonly | | extensionTypes.cs:14:5:17:5 | extension(Int32) | extensionTypes.cs:16:21:16:23 | M31 | extensionTypes.cs:14:22:14:23 | i2 | in | diff --git a/csharp/ql/test/library-tests/extension/extensions.cs b/csharp/ql/test/library-tests/extension/extensions.cs index 1117a98f8a07..892304ee84d7 100644 --- a/csharp/ql/test/library-tests/extension/extensions.cs +++ b/csharp/ql/test/library-tests/extension/extensions.cs @@ -14,6 +14,8 @@ public static class MyExtensions public static int StaticM2(string x) { return x.Length; } public static string operator *(int a, string b) { return ""; } public T StringGenericM1(T t, object o) { return t; } + public void operator ++() { } + public static string operator --(string o) { return o; } } extension(object) @@ -61,8 +63,10 @@ public static void CallingExtensions() var x25 = object.StaticObjectM1(); var x26 = object.StaticObjectM2(s); - // Calling the extension operator. + // Calling the extension operators. var x30 = 3 * s; + s++; + s--; // Calling the classic extension method. var y = s.M3(); @@ -77,6 +81,8 @@ public static void CallingExtensions() // Calling the compiler generated operator method. MyExtensions.op_Multiply(3, s); + MyExtensions.op_IncrementAssignment(s); + MyExtensions.op_Decrement(s); // Calling the compiler generated methods used by the extension property accessors. MyExtensions.get_Prop1(s); diff --git a/csharp/ql/test/library-tests/extension/extensions.expected b/csharp/ql/test/library-tests/extension/extensions.expected index 45b557a96352..e29e455d25dc 100644 --- a/csharp/ql/test/library-tests/extension/extensions.expected +++ b/csharp/ql/test/library-tests/extension/extensions.expected @@ -1,51 +1,51 @@ extensionMethodCallArgument -| extensions.cs:57:19:57:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:57:19:57:19 | access to local variable s | -| extensions.cs:58:19:58:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:58:19:58:19 | access to local variable s | -| extensions.cs:58:19:58:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:58:24:58:28 | "!!!" | -| extensions.cs:60:19:60:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:60:35:60:35 | access to local variable s | -| extensions.cs:62:19:62:42 | call to method StaticObjectM2 | extensions.cs:22:27:22:40 | StaticObjectM2 | extensions.cs:22:49:22:49 | s | 0 | extensions.cs:62:41:62:41 | access to local variable s | -| extensions.cs:68:17:68:22 | call to method M3 | extensions.cs:40:24:40:25 | M3 | extensions.cs:40:39:40:39 | s | 0 | extensions.cs:68:17:68:17 | access to local variable s | -| extensions.cs:71:9:71:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:71:25:71:25 | access to local variable s | -| extensions.cs:72:9:72:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:72:25:72:25 | access to local variable s | -| extensions.cs:72:9:72:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:72:28:72:32 | "!!!" | -| extensions.cs:74:9:74:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:74:31:74:31 | access to local variable s | -| extensions.cs:76:9:76:38 | call to method StaticObjectM2 | extensions.cs:22:27:22:40 | StaticObjectM2 | extensions.cs:22:49:22:49 | s | 0 | extensions.cs:76:37:76:37 | access to local variable s | -| extensions.cs:94:9:94:21 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | extensions.cs:94:9:94:9 | access to local variable o | -| extensions.cs:95:9:95:21 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | extensions.cs:95:9:95:9 | access to local variable s | -| extensions.cs:98:9:98:33 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | extensions.cs:98:32:98:32 | access to local variable o | -| extensions.cs:99:9:99:33 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | extensions.cs:99:32:99:32 | access to local variable s | -| extensions.cs:101:9:101:23 | call to method GenericM2 | extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:26:20:26:20 | t | 0 | extensions.cs:101:9:101:9 | access to local variable o | -| extensions.cs:101:9:101:23 | call to method GenericM2 | extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:31:36:31:40 | other | 1 | extensions.cs:101:21:101:22 | 42 | -| extensions.cs:102:9:102:37 | call to method GenericM2 | extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:26:20:26:20 | t | 0 | extensions.cs:102:32:102:32 | access to local variable o | -| extensions.cs:102:9:102:37 | call to method GenericM2 | extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:31:36:31:40 | other | 1 | extensions.cs:102:35:102:36 | 42 | -| extensions.cs:104:9:104:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:104:9:104:9 | access to local variable s | -| extensions.cs:104:9:104:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:39:16:39 | t | 1 | extensions.cs:104:32:104:32 | 7 | -| extensions.cs:104:9:104:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:49:16:49 | o | 2 | extensions.cs:104:35:104:46 | object creation of type Object | -| extensions.cs:105:9:105:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:105:46:105:46 | access to local variable s | -| extensions.cs:105:9:105:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:39:16:39 | t | 1 | extensions.cs:105:49:105:54 | "test" | -| extensions.cs:105:9:105:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:49:16:49 | o | 2 | extensions.cs:105:57:105:68 | object creation of type Object | +| extensions.cs:59:19:59:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:59:19:59:19 | access to local variable s | +| extensions.cs:60:19:60:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:60:19:60:19 | access to local variable s | +| extensions.cs:60:19:60:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:60:24:60:28 | "!!!" | +| extensions.cs:62:19:62:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:62:35:62:35 | access to local variable s | +| extensions.cs:64:19:64:42 | call to method StaticObjectM2 | extensions.cs:24:27:24:40 | StaticObjectM2 | extensions.cs:24:49:24:49 | s | 0 | extensions.cs:64:41:64:41 | access to local variable s | +| extensions.cs:72:17:72:22 | call to method M3 | extensions.cs:42:24:42:25 | M3 | extensions.cs:42:39:42:39 | s | 0 | extensions.cs:72:17:72:17 | access to local variable s | +| extensions.cs:75:9:75:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:75:25:75:25 | access to local variable s | +| extensions.cs:76:9:76:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:76:25:76:25 | access to local variable s | +| extensions.cs:76:9:76:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:12:33:12:37 | other | 1 | extensions.cs:76:28:76:32 | "!!!" | +| extensions.cs:78:9:78:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:14:43:14:43 | x | 0 | extensions.cs:78:31:78:31 | access to local variable s | +| extensions.cs:80:9:80:38 | call to method StaticObjectM2 | extensions.cs:24:27:24:40 | StaticObjectM2 | extensions.cs:24:49:24:49 | s | 0 | extensions.cs:80:37:80:37 | access to local variable s | +| extensions.cs:100:9:100:21 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | extensions.cs:100:9:100:9 | access to local variable o | +| extensions.cs:101:9:101:21 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | extensions.cs:101:9:101:9 | access to local variable s | +| extensions.cs:104:9:104:33 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | extensions.cs:104:32:104:32 | access to local variable o | +| extensions.cs:105:9:105:33 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | extensions.cs:105:32:105:32 | access to local variable s | +| extensions.cs:107:9:107:23 | call to method GenericM2 | extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:28:20:28:20 | t | 0 | extensions.cs:107:9:107:9 | access to local variable o | +| extensions.cs:107:9:107:23 | call to method GenericM2 | extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:33:36:33:40 | other | 1 | extensions.cs:107:21:107:22 | 42 | +| extensions.cs:108:9:108:37 | call to method GenericM2 | extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:28:20:28:20 | t | 0 | extensions.cs:108:32:108:32 | access to local variable o | +| extensions.cs:108:9:108:37 | call to method GenericM2 | extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:33:36:33:40 | other | 1 | extensions.cs:108:35:108:36 | 42 | +| extensions.cs:110:9:110:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:110:9:110:9 | access to local variable s | +| extensions.cs:110:9:110:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:39:16:39 | t | 1 | extensions.cs:110:32:110:32 | 7 | +| extensions.cs:110:9:110:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:49:16:49 | o | 2 | extensions.cs:110:35:110:46 | object creation of type Object | +| extensions.cs:111:9:111:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:111:46:111:46 | access to local variable s | +| extensions.cs:111:9:111:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:39:16:39 | t | 1 | extensions.cs:111:49:111:54 | "test" | +| extensions.cs:111:9:111:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:16:49:16:49 | o | 2 | extensions.cs:111:57:111:68 | object creation of type Object | extensionMethodCalls -| extensions.cs:57:19:57:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).M1 | -| extensions.cs:58:19:58:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).M2 | -| extensions.cs:59:19:59:35 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StaticM1 | -| extensions.cs:60:19:60:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StaticM2 | -| extensions.cs:61:19:61:41 | call to method StaticObjectM1 | extensions.cs:21:27:21:40 | StaticObjectM1 | extensions.cs:19:5:24:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM1 | -| extensions.cs:62:19:62:42 | call to method StaticObjectM2 | extensions.cs:22:27:22:40 | StaticObjectM2 | extensions.cs:19:5:24:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM2 | -| extensions.cs:68:17:68:22 | call to method M3 | extensions.cs:40:24:40:25 | M3 | extensions.cs:38:21:38:37 | ClassicExtensions | ClassicExtensions.M3 | -| extensions.cs:71:9:71:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).M1 | -| extensions.cs:72:9:72:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).M2 | -| extensions.cs:73:9:73:31 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StaticM1 | -| extensions.cs:74:9:74:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StaticM2 | -| extensions.cs:75:9:75:37 | call to method StaticObjectM1 | extensions.cs:21:27:21:40 | StaticObjectM1 | extensions.cs:19:5:24:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM1 | -| extensions.cs:76:9:76:38 | call to method StaticObjectM2 | extensions.cs:22:27:22:40 | StaticObjectM2 | extensions.cs:19:5:24:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM2 | -| extensions.cs:94:9:94:21 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:5:35:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM1 | -| extensions.cs:95:9:95:21 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:5:35:5 | extension(String) | MyExtensions+extension(System.String).GenericM1 | -| extensions.cs:98:9:98:33 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:5:35:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM1 | -| extensions.cs:99:9:99:33 | call to method GenericM1 | extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:5:35:5 | extension(String) | MyExtensions+extension(System.String).GenericM1 | -| extensions.cs:101:9:101:23 | call to method GenericM2 | extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:26:5:35:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM2 | -| extensions.cs:102:9:102:37 | call to method GenericM2 | extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:26:5:35:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM2 | -| extensions.cs:104:9:104:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StringGenericM1 | -| extensions.cs:105:9:105:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StringGenericM1 | +| extensions.cs:59:19:59:24 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).M1 | +| extensions.cs:60:19:60:29 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).M2 | +| extensions.cs:61:19:61:35 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StaticM1 | +| extensions.cs:62:19:62:36 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StaticM2 | +| extensions.cs:63:19:63:41 | call to method StaticObjectM1 | extensions.cs:23:27:23:40 | StaticObjectM1 | extensions.cs:21:5:26:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM1 | +| extensions.cs:64:19:64:42 | call to method StaticObjectM2 | extensions.cs:24:27:24:40 | StaticObjectM2 | extensions.cs:21:5:26:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM2 | +| extensions.cs:72:17:72:22 | call to method M3 | extensions.cs:42:24:42:25 | M3 | extensions.cs:40:21:40:37 | ClassicExtensions | ClassicExtensions.M3 | +| extensions.cs:75:9:75:26 | call to method M1 | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).M1 | +| extensions.cs:76:9:76:33 | call to method M2 | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).M2 | +| extensions.cs:77:9:77:31 | call to method StaticM1 | extensions.cs:13:27:13:34 | StaticM1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StaticM1 | +| extensions.cs:78:9:78:32 | call to method StaticM2 | extensions.cs:14:27:14:34 | StaticM2 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StaticM2 | +| extensions.cs:79:9:79:37 | call to method StaticObjectM1 | extensions.cs:23:27:23:40 | StaticObjectM1 | extensions.cs:21:5:26:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM1 | +| extensions.cs:80:9:80:38 | call to method StaticObjectM2 | extensions.cs:24:27:24:40 | StaticObjectM2 | extensions.cs:21:5:26:5 | extension(Object) | MyExtensions+extension(System.Object).StaticObjectM2 | +| extensions.cs:100:9:100:21 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:5:37:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM1 | +| extensions.cs:101:9:101:21 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:5:37:5 | extension(String) | MyExtensions+extension(System.String).GenericM1 | +| extensions.cs:104:9:104:33 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:5:37:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM1 | +| extensions.cs:105:9:105:33 | call to method GenericM1 | extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:5:37:5 | extension(String) | MyExtensions+extension(System.String).GenericM1 | +| extensions.cs:107:9:107:23 | call to method GenericM2 | extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:28:5:37:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM2 | +| extensions.cs:108:9:108:37 | call to method GenericM2 | extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:28:5:37:5 | extension(Object) | MyExtensions+extension(System.Object).GenericM2 | +| extensions.cs:110:9:110:47 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StringGenericM1 | +| extensions.cs:111:9:111:69 | call to method StringGenericM1 | extensions.cs:16:18:16:35 | StringGenericM1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StringGenericM1 | extensionParameter | extensions.cs:11:21:11:22 | M1 | extensions.cs:6:22:6:22 | s | 0 | string | extensions.cs:6:22:6:22 | s | | extensions.cs:12:23:12:24 | M2 | extensions.cs:6:22:6:22 | s | 0 | string | extensions.cs:6:22:6:22 | s | @@ -60,52 +60,60 @@ extensionParameter | extensions.cs:16:18:16:35 | StringGenericM1`1 | extensions.cs:6:22:6:22 | s | 0 | string | extensions.cs:6:22:6:22 | s | | extensions.cs:16:18:16:35 | StringGenericM1`1 | extensions.cs:16:39:16:39 | t | 1 | T | extensions.cs:16:39:16:39 | t | | extensions.cs:16:18:16:35 | StringGenericM1`1 | extensions.cs:16:49:16:49 | o | 2 | object | extensions.cs:16:49:16:49 | o | -| extensions.cs:22:27:22:40 | StaticObjectM2 | extensions.cs:22:49:22:49 | s | 0 | string | extensions.cs:22:49:22:49 | s | -| extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | T | extensions.cs:26:20:26:20 | t | -| extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | object | extensions.cs:26:20:26:20 | t | -| extensions.cs:30:21:30:29 | GenericM1 | extensions.cs:26:20:26:20 | t | 0 | string | extensions.cs:26:20:26:20 | t | -| extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:26:20:26:20 | t | 0 | object | extensions.cs:26:20:26:20 | t | -| extensions.cs:31:21:31:32 | GenericM2 | extensions.cs:31:36:31:40 | other | 1 | int | extensions.cs:31:36:31:40 | other | -| extensions.cs:31:21:31:32 | GenericM2`1 | extensions.cs:26:20:26:20 | t | 0 | T | extensions.cs:26:20:26:20 | t | -| extensions.cs:31:21:31:32 | GenericM2`1 | extensions.cs:26:20:26:20 | t | 0 | object | extensions.cs:26:20:26:20 | t | -| extensions.cs:31:21:31:32 | GenericM2`1 | extensions.cs:26:20:26:20 | t | 0 | string | extensions.cs:26:20:26:20 | t | -| extensions.cs:31:21:31:32 | GenericM2`1 | extensions.cs:31:36:31:40 | other | 1 | S | extensions.cs:31:36:31:40 | other | -| extensions.cs:31:21:31:32 | GenericM2`1 | extensions.cs:31:36:31:40 | other | 1 | S | extensions.cs:31:36:31:40 | other | -| extensions.cs:31:21:31:32 | GenericM2`1 | extensions.cs:31:36:31:40 | other | 1 | S | extensions.cs:31:36:31:40 | other | -| extensions.cs:32:21:32:35 | GenericStaticM1 | extensions.cs:26:20:26:20 | t | 0 | T | extensions.cs:26:20:26:20 | t | -| extensions.cs:32:21:32:35 | GenericStaticM1 | extensions.cs:26:20:26:20 | t | 0 | object | extensions.cs:26:20:26:20 | t | -| extensions.cs:32:21:32:35 | GenericStaticM1 | extensions.cs:26:20:26:20 | t | 0 | string | extensions.cs:26:20:26:20 | t | -| extensions.cs:33:28:33:45 | GenericStaticM2`1 | extensions.cs:33:49:33:53 | other | 0 | S | extensions.cs:33:49:33:53 | other | -| extensions.cs:33:28:33:45 | GenericStaticM2`1 | extensions.cs:33:49:33:53 | other | 0 | S | extensions.cs:33:49:33:53 | other | -| extensions.cs:33:28:33:45 | GenericStaticM2`1 | extensions.cs:33:49:33:53 | other | 0 | S | extensions.cs:33:49:33:53 | other | -| extensions.cs:40:24:40:25 | M3 | extensions.cs:40:39:40:39 | s | 0 | string | extensions.cs:40:39:40:39 | s | +| extensions.cs:24:27:24:40 | StaticObjectM2 | extensions.cs:24:49:24:49 | s | 0 | string | extensions.cs:24:49:24:49 | s | +| extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | T | extensions.cs:28:20:28:20 | t | +| extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | object | extensions.cs:28:20:28:20 | t | +| extensions.cs:32:21:32:29 | GenericM1 | extensions.cs:28:20:28:20 | t | 0 | string | extensions.cs:28:20:28:20 | t | +| extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:28:20:28:20 | t | 0 | object | extensions.cs:28:20:28:20 | t | +| extensions.cs:33:21:33:32 | GenericM2 | extensions.cs:33:36:33:40 | other | 1 | int | extensions.cs:33:36:33:40 | other | +| extensions.cs:33:21:33:32 | GenericM2`1 | extensions.cs:28:20:28:20 | t | 0 | T | extensions.cs:28:20:28:20 | t | +| extensions.cs:33:21:33:32 | GenericM2`1 | extensions.cs:28:20:28:20 | t | 0 | object | extensions.cs:28:20:28:20 | t | +| extensions.cs:33:21:33:32 | GenericM2`1 | extensions.cs:28:20:28:20 | t | 0 | string | extensions.cs:28:20:28:20 | t | +| extensions.cs:33:21:33:32 | GenericM2`1 | extensions.cs:33:36:33:40 | other | 1 | S | extensions.cs:33:36:33:40 | other | +| extensions.cs:33:21:33:32 | GenericM2`1 | extensions.cs:33:36:33:40 | other | 1 | S | extensions.cs:33:36:33:40 | other | +| extensions.cs:33:21:33:32 | GenericM2`1 | extensions.cs:33:36:33:40 | other | 1 | S | extensions.cs:33:36:33:40 | other | +| extensions.cs:34:21:34:35 | GenericStaticM1 | extensions.cs:28:20:28:20 | t | 0 | T | extensions.cs:28:20:28:20 | t | +| extensions.cs:34:21:34:35 | GenericStaticM1 | extensions.cs:28:20:28:20 | t | 0 | object | extensions.cs:28:20:28:20 | t | +| extensions.cs:34:21:34:35 | GenericStaticM1 | extensions.cs:28:20:28:20 | t | 0 | string | extensions.cs:28:20:28:20 | t | +| extensions.cs:35:28:35:45 | GenericStaticM2`1 | extensions.cs:35:49:35:53 | other | 0 | S | extensions.cs:35:49:35:53 | other | +| extensions.cs:35:28:35:45 | GenericStaticM2`1 | extensions.cs:35:49:35:53 | other | 0 | S | extensions.cs:35:49:35:53 | other | +| extensions.cs:35:28:35:45 | GenericStaticM2`1 | extensions.cs:35:49:35:53 | other | 0 | S | extensions.cs:35:49:35:53 | other | +| extensions.cs:42:24:42:25 | M3 | extensions.cs:42:39:42:39 | s | 0 | string | extensions.cs:42:39:42:39 | s | extensionOperatorCallArgument -| extensions.cs:15:39:15:39 | * | extensions.cs:65:19:65:23 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:65:19:65:19 | 3 | -| extensions.cs:15:39:15:39 | * | extensions.cs:65:19:65:23 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:65:23:65:23 | access to local variable s | -| extensions.cs:15:39:15:39 | * | extensions.cs:79:9:79:38 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:79:34:79:34 | 3 | -| extensions.cs:15:39:15:39 | * | extensions.cs:79:9:79:38 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:79:37:79:37 | access to local variable s | +| extensions.cs:15:39:15:39 | * | extensions.cs:67:19:67:23 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:67:19:67:19 | 3 | +| extensions.cs:15:39:15:39 | * | extensions.cs:67:19:67:23 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:67:23:67:23 | access to local variable s | +| extensions.cs:15:39:15:39 | * | extensions.cs:83:9:83:38 | call to operator * | extensions.cs:15:45:15:45 | a | 0 | extensions.cs:83:34:83:34 | 3 | +| extensions.cs:15:39:15:39 | * | extensions.cs:83:9:83:38 | call to operator * | extensions.cs:15:55:15:55 | b | 1 | extensions.cs:83:37:83:37 | access to local variable s | +| extensions.cs:17:30:17:31 | ++ | extensions.cs:68:9:68:11 | call to operator ++ | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:68:9:68:9 | access to local variable s | +| extensions.cs:17:30:17:31 | ++ | extensions.cs:84:9:84:46 | call to operator ++ | extensions.cs:6:22:6:22 | s | 0 | extensions.cs:84:45:84:45 | access to local variable s | +| extensions.cs:18:39:18:40 | -- | extensions.cs:69:9:69:11 | call to operator -- | extensions.cs:18:49:18:49 | o | 0 | extensions.cs:69:9:69:9 | access to local variable s | +| extensions.cs:18:39:18:40 | -- | extensions.cs:85:9:85:36 | call to operator -- | extensions.cs:18:49:18:49 | o | 0 | extensions.cs:85:35:85:35 | access to local variable s | extensionOperatorCalls -| extensions.cs:65:19:65:23 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).op_Multiply | -| extensions.cs:79:9:79:38 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).op_Multiply | +| extensions.cs:67:19:67:23 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).op_Multiply | +| extensions.cs:68:9:68:11 | call to operator ++ | extensions.cs:17:30:17:31 | ++ | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).op_IncrementAssignment | +| extensions.cs:69:9:69:11 | call to operator -- | extensions.cs:18:39:18:40 | -- | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).op_Decrement | +| extensions.cs:83:9:83:38 | call to operator * | extensions.cs:15:39:15:39 | * | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).op_Multiply | +| extensions.cs:84:9:84:46 | call to operator ++ | extensions.cs:17:30:17:31 | ++ | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).op_IncrementAssignment | +| extensions.cs:85:9:85:36 | call to operator -- | extensions.cs:18:39:18:40 | -- | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).op_Decrement | extensionProperty -| extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:17:5 | extension(String) | -| extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:17:5 | extension(String) | -| extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:17:5 | extension(String) | -| extensions.cs:23:28:23:37 | StaticProp | extensions.cs:19:5:24:5 | extension(Object) | -| extensions.cs:28:21:28:32 | GenericProp1 | extensions.cs:26:5:35:5 | extension(Object) | -| extensions.cs:28:21:28:32 | GenericProp1 | extensions.cs:26:5:35:5 | extension(String) | -| extensions.cs:28:21:28:32 | GenericProp1 | extensions.cs:26:5:35:5 | extension(T)`1 | -| extensions.cs:29:21:29:32 | GenericProp2 | extensions.cs:26:5:35:5 | extension(Object) | -| extensions.cs:29:21:29:32 | GenericProp2 | extensions.cs:26:5:35:5 | extension(String) | -| extensions.cs:29:21:29:32 | GenericProp2 | extensions.cs:26:5:35:5 | extension(T)`1 | +| extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:19:5 | extension(String) | +| extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:19:5 | extension(String) | +| extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:19:5 | extension(String) | +| extensions.cs:25:28:25:37 | StaticProp | extensions.cs:21:5:26:5 | extension(Object) | +| extensions.cs:30:21:30:32 | GenericProp1 | extensions.cs:28:5:37:5 | extension(Object) | +| extensions.cs:30:21:30:32 | GenericProp1 | extensions.cs:28:5:37:5 | extension(String) | +| extensions.cs:30:21:30:32 | GenericProp1 | extensions.cs:28:5:37:5 | extension(T)`1 | +| extensions.cs:31:21:31:32 | GenericProp2 | extensions.cs:28:5:37:5 | extension(Object) | +| extensions.cs:31:21:31:32 | GenericProp2 | extensions.cs:28:5:37:5 | extension(String) | +| extensions.cs:31:21:31:32 | GenericProp2 | extensions.cs:28:5:37:5 | extension(T)`1 | extensionPropertyCall -| extensions.cs:50:19:50:25 | access to property Prop1 | extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).Prop1 | -| extensions.cs:51:19:51:25 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).Prop2 | -| extensions.cs:52:9:52:15 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).Prop2 | -| extensions.cs:53:19:53:36 | access to property StaticProp1 | extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:17:5 | extension(String) | MyExtensions+extension(System.String).StaticProp1 | -| extensions.cs:54:19:54:35 | access to property StaticProp | extensions.cs:23:28:23:37 | StaticProp | extensions.cs:19:5:24:5 | extension(Object) | MyExtensions+extension(System.Object).StaticProp | +| extensions.cs:52:19:52:25 | access to property Prop1 | extensions.cs:8:21:8:25 | Prop1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).Prop1 | +| extensions.cs:53:19:53:25 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).Prop2 | +| extensions.cs:54:9:54:15 | access to property Prop2 | extensions.cs:9:21:9:25 | Prop2 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).Prop2 | +| extensions.cs:55:19:55:36 | access to property StaticProp1 | extensions.cs:10:28:10:38 | StaticProp1 | extensions.cs:6:5:19:5 | extension(String) | MyExtensions+extension(System.String).StaticProp1 | +| extensions.cs:56:19:56:35 | access to property StaticProp | extensions.cs:25:28:25:37 | StaticProp | extensions.cs:21:5:26:5 | extension(Object) | MyExtensions+extension(System.Object).StaticProp | extensionAccessorCall -| extensions.cs:82:9:82:33 | call to extension accessor get_Prop1 | extensions.cs:8:30:8:41 | get_Prop1 | extensions.cs:8:21:8:25 | Prop1 | MyExtensions+extension(System.String).get_Prop1 | -| extensions.cs:83:9:83:33 | call to extension accessor get_Prop2 | extensions.cs:9:29:9:31 | get_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(System.String).get_Prop2 | -| extensions.cs:84:9:84:40 | call to extension accessor set_Prop2 | extensions.cs:9:50:9:52 | set_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(System.String).set_Prop2 | -| extensions.cs:85:9:85:37 | call to extension accessor get_StaticProp | extensions.cs:23:42:23:45 | get_StaticProp | extensions.cs:23:28:23:37 | StaticProp | MyExtensions+extension(System.Object).get_StaticProp | +| extensions.cs:88:9:88:33 | call to extension accessor get_Prop1 | extensions.cs:8:30:8:41 | get_Prop1 | extensions.cs:8:21:8:25 | Prop1 | MyExtensions+extension(System.String).get_Prop1 | +| extensions.cs:89:9:89:33 | call to extension accessor get_Prop2 | extensions.cs:9:29:9:31 | get_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(System.String).get_Prop2 | +| extensions.cs:90:9:90:40 | call to extension accessor set_Prop2 | extensions.cs:9:50:9:52 | set_Prop2 | extensions.cs:9:21:9:25 | Prop2 | MyExtensions+extension(System.String).set_Prop2 | +| extensions.cs:91:9:91:37 | call to extension accessor get_StaticProp | extensions.cs:25:42:25:45 | get_StaticProp | extensions.cs:25:28:25:37 | StaticProp | MyExtensions+extension(System.Object).get_StaticProp | diff --git a/csharp/ql/test/library-tests/indexers/Indexers13.expected b/csharp/ql/test/library-tests/indexers/Indexers13.expected new file mode 100644 index 000000000000..a5e831421f83 --- /dev/null +++ b/csharp/ql/test/library-tests/indexers/Indexers13.expected @@ -0,0 +1,4 @@ +| indexers.cs:24:21:24:24 | Item | indexers.cs:62:22:62:29 | access to indexer | indexers.cs:26:13:26:15 | get_Item | +| indexers.cs:24:21:24:24 | Item | indexers.cs:65:25:65:32 | access to indexer | indexers.cs:34:13:34:15 | set_Item | +| indexers.cs:143:24:143:27 | Item | indexers.cs:156:13:156:16 | access to indexer | indexers.cs:145:13:145:15 | get_Item | +| indexers.cs:143:24:143:27 | Item | indexers.cs:157:21:157:24 | access to indexer | indexers.cs:145:13:145:15 | get_Item | diff --git a/csharp/ql/test/library-tests/indexers/Indexers13.ql b/csharp/ql/test/library-tests/indexers/Indexers13.ql new file mode 100644 index 000000000000..636802690077 --- /dev/null +++ b/csharp/ql/test/library-tests/indexers/Indexers13.ql @@ -0,0 +1,8 @@ +import csharp + +from IndexerCall ic, Indexer i, Accessor target +where + ic.getIndexer() = i and + ic.getTarget() = target and + i.fromSource() +select i, ic, target diff --git a/csharp/ql/test/library-tests/indexers/PrintAst.expected b/csharp/ql/test/library-tests/indexers/PrintAst.expected index 93160309c79b..57b83223c36d 100644 --- a/csharp/ql/test/library-tests/indexers/PrintAst.expected +++ b/csharp/ql/test/library-tests/indexers/PrintAst.expected @@ -360,3 +360,57 @@ indexers.cs: # 130| 4: [BlockStmt] {...} # 130| 0: [ReturnStmt] return ...; # 130| 0: [IntLiteral] 0 +# 134| 5: [RefStruct] S +# 136| 6: [Field] x +# 136| -1: [TypeMention] int +# 138| 7: [InstanceConstructor] S +#-----| 2: (Parameters) +# 138| 0: [Parameter] v +# 138| -1: [TypeMention] int +# 139| 4: [BlockStmt] {...} +# 140| 0: [ExprStmt] ...; +# 140| 0: [AssignExpr] ... = ... +# 140| 0: [FieldAccess] access to field x +# 140| 1: [RefExpr] ref ... +# 140| 0: [ParameterAccess] access to parameter v +# 143| 8: [Indexer] Item +# 143| -1: [TypeMention] int +#-----| 1: (Parameters) +# 143| 0: [Parameter] i +# 143| -1: [TypeMention] int +# 145| 3: [Getter] get_Item +#-----| 2: (Parameters) +# 143| 0: [Parameter] i +# 145| 4: [BlockStmt] {...} +# 145| 0: [ReturnStmt] return ...; +# 145| 0: [RefExpr] ref ... +# 145| 0: [FieldAccess] access to field x +# 149| 6: [Class] TestRefReturns +# 151| 6: [Method] M +# 151| -1: [TypeMention] Void +# 152| 4: [BlockStmt] {...} +# 153| 0: [LocalVariableDeclStmt] ... ...; +# 153| 0: [LocalVariableDeclAndInitExpr] Int32 a = ... +# 153| -1: [TypeMention] int +# 153| 0: [LocalVariableAccess] access to local variable a +# 153| 1: [IntLiteral] 0 +# 155| 1: [LocalVariableDeclStmt] ... ...; +# 155| 0: [LocalVariableDeclAndInitExpr] S s = ... +# 155| -1: [TypeMention] S +# 155| 0: [LocalVariableAccess] access to local variable s +# 155| 1: [ObjectCreation] object creation of type S +# 155| -1: [TypeMention] S +# 155| 0: [LocalVariableAccess] access to local variable a +# 156| 2: [ExprStmt] ...; +# 156| 0: [AssignExpr] ... = ... +# 156| 0: [IndexerCall] access to indexer +# 156| -1: [LocalVariableAccess] access to local variable s +# 156| 0: [IntLiteral] 0 +# 156| 1: [IntLiteral] 1 +# 157| 3: [LocalVariableDeclStmt] ... ...; +# 157| 0: [LocalVariableDeclAndInitExpr] Int32 x = ... +# 157| -1: [TypeMention] int +# 157| 0: [LocalVariableAccess] access to local variable x +# 157| 1: [IndexerCall] access to indexer +# 157| -1: [LocalVariableAccess] access to local variable s +# 157| 0: [IntLiteral] 0 diff --git a/csharp/ql/test/library-tests/indexers/indexers.cs b/csharp/ql/test/library-tests/indexers/indexers.cs index 6da14ae769dd..55011d82755e 100644 --- a/csharp/ql/test/library-tests/indexers/indexers.cs +++ b/csharp/ql/test/library-tests/indexers/indexers.cs @@ -130,4 +130,31 @@ public bool this[int index] get { return 0; } } } + + public ref struct S + { + private ref int x; + + public S(ref int v) + { + x = ref v; + } + + public ref int this[int i] + { + get { return ref x; } + } + } + + public class TestRefReturns + { + public void M() + { + int a = 0; + + S s = new S(ref a); + s[0] = 1; + var x = s[0]; + } + } } diff --git a/csharp/ql/test/library-tests/operators/Operators3.expected b/csharp/ql/test/library-tests/operators/Operators3.expected index e81aec79ba19..bda7edb99bae 100644 --- a/csharp/ql/test/library-tests/operators/Operators3.expected +++ b/csharp/ql/test/library-tests/operators/Operators3.expected @@ -1 +1 @@ -| operators.cs:96:32:96:39 | implicit conversion | +| operators.cs:118:36:118:43 | implicit conversion | diff --git a/csharp/ql/test/library-tests/operators/Operators4.expected b/csharp/ql/test/library-tests/operators/Operators4.expected index 49db993c093d..bee27656f264 100644 --- a/csharp/ql/test/library-tests/operators/Operators4.expected +++ b/csharp/ql/test/library-tests/operators/Operators4.expected @@ -1 +1 @@ -| operators.cs:101:32:101:39 | explicit conversion | +| operators.cs:123:36:123:43 | explicit conversion | diff --git a/csharp/ql/test/library-tests/operators/Operators5.expected b/csharp/ql/test/library-tests/operators/Operators5.expected index 8e506e5119df..900b5170c349 100644 --- a/csharp/ql/test/library-tests/operators/Operators5.expected +++ b/csharp/ql/test/library-tests/operators/Operators5.expected @@ -1,15 +1,15 @@ -| operators.cs:23:30:23:31 | += | operators.cs:61:13:61:22 | ... += ... | -| operators.cs:31:38:31:39 | checked += | operators.cs:77:17:77:26 | ... += ... | -| operators.cs:33:38:33:39 | checked -= | operators.cs:78:17:78:26 | ... -= ... | -| operators.cs:34:30:34:31 | -= | operators.cs:64:13:64:22 | ... -= ... | -| operators.cs:36:38:36:39 | checked *= | operators.cs:79:17:79:26 | ... *= ... | -| operators.cs:37:30:37:31 | *= | operators.cs:65:13:65:22 | ... *= ... | -| operators.cs:39:38:39:39 | checked /= | operators.cs:80:17:80:26 | ... /= ... | -| operators.cs:40:30:40:31 | /= | operators.cs:66:13:66:22 | ... /= ... | -| operators.cs:42:30:42:31 | %= | operators.cs:67:13:67:22 | ... %= ... | -| operators.cs:43:30:43:31 | &= | operators.cs:68:13:68:22 | ... &= ... | -| operators.cs:44:30:44:31 | \|= | operators.cs:69:13:69:22 | ... \|= ... | -| operators.cs:45:30:45:31 | ^= | operators.cs:70:13:70:22 | ... ^= ... | -| operators.cs:46:30:46:32 | <<= | operators.cs:71:13:71:23 | ... <<= ... | -| operators.cs:47:30:47:32 | >>= | operators.cs:72:13:72:23 | ... >>= ... | -| operators.cs:48:30:48:33 | >>>= | operators.cs:73:13:73:24 | ... >>>= ... | +| operators.cs:23:30:23:31 | += | operators.cs:70:13:70:22 | ... += ... | +| operators.cs:31:38:31:39 | checked += | operators.cs:86:17:86:26 | ... += ... | +| operators.cs:33:38:33:39 | checked -= | operators.cs:87:17:87:26 | ... -= ... | +| operators.cs:34:30:34:31 | -= | operators.cs:73:13:73:22 | ... -= ... | +| operators.cs:36:38:36:39 | checked *= | operators.cs:88:17:88:26 | ... *= ... | +| operators.cs:37:30:37:31 | *= | operators.cs:74:13:74:22 | ... *= ... | +| operators.cs:39:38:39:39 | checked /= | operators.cs:89:17:89:26 | ... /= ... | +| operators.cs:40:30:40:31 | /= | operators.cs:75:13:75:22 | ... /= ... | +| operators.cs:42:30:42:31 | %= | operators.cs:76:13:76:22 | ... %= ... | +| operators.cs:43:30:43:31 | &= | operators.cs:77:13:77:22 | ... &= ... | +| operators.cs:44:30:44:31 | \|= | operators.cs:78:13:78:22 | ... \|= ... | +| operators.cs:45:30:45:31 | ^= | operators.cs:79:13:79:22 | ... ^= ... | +| operators.cs:46:30:46:32 | <<= | operators.cs:80:13:80:23 | ... <<= ... | +| operators.cs:47:30:47:32 | >>= | operators.cs:81:13:81:23 | ... >>= ... | +| operators.cs:48:30:48:33 | >>>= | operators.cs:82:13:82:24 | ... >>>= ... | diff --git a/csharp/ql/test/library-tests/operators/Operators6.expected b/csharp/ql/test/library-tests/operators/Operators6.expected new file mode 100644 index 000000000000..f0878a511d9b --- /dev/null +++ b/csharp/ql/test/library-tests/operators/Operators6.expected @@ -0,0 +1,10 @@ +| operators.cs:15:42:15:43 | ++ | operators.cs:66:19:66:23 | call to operator ++ | +| operators.cs:15:42:15:43 | ++ | operators.cs:67:19:67:23 | call to operator ++ | +| operators.cs:54:38:54:39 | checked ++ | operators.cs:100:17:100:19 | call to operator checked ++ | +| operators.cs:54:38:54:39 | checked ++ | operators.cs:101:17:101:19 | call to operator checked ++ | +| operators.cs:55:30:55:31 | ++ | operators.cs:93:13:93:15 | call to operator ++ | +| operators.cs:55:30:55:31 | ++ | operators.cs:94:13:94:15 | call to operator ++ | +| operators.cs:56:38:56:39 | checked -- | operators.cs:102:17:102:19 | call to operator checked -- | +| operators.cs:56:38:56:39 | checked -- | operators.cs:103:17:103:19 | call to operator checked -- | +| operators.cs:57:30:57:31 | -- | operators.cs:95:13:95:15 | call to operator -- | +| operators.cs:57:30:57:31 | -- | operators.cs:96:13:96:15 | call to operator -- | diff --git a/csharp/ql/test/library-tests/operators/Operators6.ql b/csharp/ql/test/library-tests/operators/Operators6.ql new file mode 100644 index 000000000000..0eb578a11340 --- /dev/null +++ b/csharp/ql/test/library-tests/operators/Operators6.ql @@ -0,0 +1,17 @@ +/** + * @name Test for operators + */ + +import csharp + +from Operator op, OperatorCall call +where + op.fromSource() and + ( + op instanceof IncrementOperator or + op instanceof CheckedIncrementOperator or + op instanceof DecrementOperator or + op instanceof CheckedDecrementOperator + ) and + call.getTarget() = op +select op, call diff --git a/csharp/ql/test/library-tests/operators/PrintAst.expected b/csharp/ql/test/library-tests/operators/PrintAst.expected index 8ea38d79b148..2087e5f96dc3 100644 --- a/csharp/ql/test/library-tests/operators/PrintAst.expected +++ b/csharp/ql/test/library-tests/operators/PrintAst.expected @@ -181,159 +181,204 @@ operators.cs: # 48| 0: [Parameter] n # 48| -1: [TypeMention] IntVector # 48| 4: [BlockStmt] {...} -# 51| 2: [Class] TestOperator -# 53| 6: [Method] Main -# 53| -1: [TypeMention] Void +# 51| 2: [Class] C +# 54| 6: [CheckedIncrementOperator] checked ++ +# 54| -1: [TypeMention] Void # 54| 4: [BlockStmt] {...} -# 55| 0: [LocalVariableDeclStmt] ... ...; -# 55| 0: [LocalVariableDeclAndInitExpr] IntVector iv1 = ... -# 55| -1: [TypeMention] IntVector -# 55| 0: [LocalVariableAccess] access to local variable iv1 -# 55| 1: [ObjectCreation] object creation of type IntVector -# 55| -1: [TypeMention] IntVector -# 55| 0: [IntLiteral] 4 -# 56| 1: [LocalVariableDeclStmt] ... ...; -# 56| 0: [LocalVariableDeclExpr] IntVector iv2 -# 56| 0: [TypeMention] IntVector -# 57| 2: [ExprStmt] ...; -# 57| 0: [AssignExpr] ... = ... -# 57| 0: [LocalVariableAccess] access to local variable iv2 -# 57| 1: [OperatorCall] call to operator ++ -# 57| 0: [LocalVariableAccess] access to local variable iv1 -# 58| 3: [ExprStmt] ...; -# 58| 0: [AssignExpr] ... = ... -# 58| 0: [LocalVariableAccess] access to local variable iv2 -# 58| 1: [OperatorCall] call to operator ++ -# 58| 0: [LocalVariableAccess] access to local variable iv1 -# 60| 4: [LocalVariableDeclStmt] ... ...; -# 60| 0: [LocalVariableDeclAndInitExpr] IntVector iv3 = ... -# 60| -1: [TypeMention] IntVector -# 60| 0: [LocalVariableAccess] access to local variable iv3 -# 60| 1: [ObjectCreation] object creation of type IntVector -# 60| -1: [TypeMention] IntVector -# 60| 0: [IntLiteral] 4 -# 61| 5: [ExprStmt] ...; -# 61| 0: [AssignAddExpr] ... += ... -# 61| 0: [LocalVariableAccess] access to local variable iv3 -# 61| 1: [LocalVariableAccess] access to local variable iv2 -# 64| 6: [ExprStmt] ...; -# 64| 0: [AssignSubExpr] ... -= ... -# 64| 0: [LocalVariableAccess] access to local variable iv3 -# 64| 1: [LocalVariableAccess] access to local variable iv2 -# 65| 7: [ExprStmt] ...; -# 65| 0: [AssignMulExpr] ... *= ... -# 65| 0: [LocalVariableAccess] access to local variable iv3 -# 65| 1: [LocalVariableAccess] access to local variable iv2 -# 66| 8: [ExprStmt] ...; -# 66| 0: [AssignDivExpr] ... /= ... -# 66| 0: [LocalVariableAccess] access to local variable iv3 -# 66| 1: [LocalVariableAccess] access to local variable iv2 -# 67| 9: [ExprStmt] ...; -# 67| 0: [AssignRemExpr] ... %= ... -# 67| 0: [LocalVariableAccess] access to local variable iv3 -# 67| 1: [LocalVariableAccess] access to local variable iv2 -# 68| 10: [ExprStmt] ...; -# 68| 0: [AssignAndExpr] ... &= ... -# 68| 0: [LocalVariableAccess] access to local variable iv3 -# 68| 1: [LocalVariableAccess] access to local variable iv2 -# 69| 11: [ExprStmt] ...; -# 69| 0: [AssignOrExpr] ... |= ... +# 55| 7: [IncrementOperator] ++ +# 55| -1: [TypeMention] Void +# 55| 4: [BlockStmt] {...} +# 56| 8: [CheckedDecrementOperator] checked -- +# 56| -1: [TypeMention] Void +# 56| 4: [BlockStmt] {...} +# 57| 9: [DecrementOperator] -- +# 57| -1: [TypeMention] Void +# 57| 4: [BlockStmt] {...} +# 60| 3: [Class] TestOperator +# 62| 6: [Method] Main +# 62| -1: [TypeMention] Void +# 63| 4: [BlockStmt] {...} +# 64| 0: [LocalVariableDeclStmt] ... ...; +# 64| 0: [LocalVariableDeclAndInitExpr] IntVector iv1 = ... +# 64| -1: [TypeMention] IntVector +# 64| 0: [LocalVariableAccess] access to local variable iv1 +# 64| 1: [ObjectCreation] object creation of type IntVector +# 64| -1: [TypeMention] IntVector +# 64| 0: [IntLiteral] 4 +# 65| 1: [LocalVariableDeclStmt] ... ...; +# 65| 0: [LocalVariableDeclExpr] IntVector iv2 +# 65| 0: [TypeMention] IntVector +# 66| 2: [ExprStmt] ...; +# 66| 0: [AssignExpr] ... = ... +# 66| 0: [LocalVariableAccess] access to local variable iv2 +# 66| 1: [OperatorCall] call to operator ++ +# 66| 0: [LocalVariableAccess] access to local variable iv1 +# 67| 3: [ExprStmt] ...; +# 67| 0: [AssignExpr] ... = ... +# 67| 0: [LocalVariableAccess] access to local variable iv2 +# 67| 1: [OperatorCall] call to operator ++ +# 67| 0: [LocalVariableAccess] access to local variable iv1 +# 69| 4: [LocalVariableDeclStmt] ... ...; +# 69| 0: [LocalVariableDeclAndInitExpr] IntVector iv3 = ... +# 69| -1: [TypeMention] IntVector # 69| 0: [LocalVariableAccess] access to local variable iv3 -# 69| 1: [LocalVariableAccess] access to local variable iv2 -# 70| 12: [ExprStmt] ...; -# 70| 0: [AssignXorExpr] ... ^= ... +# 69| 1: [ObjectCreation] object creation of type IntVector +# 69| -1: [TypeMention] IntVector +# 69| 0: [IntLiteral] 4 +# 70| 5: [ExprStmt] ...; +# 70| 0: [AssignAddExpr] ... += ... # 70| 0: [LocalVariableAccess] access to local variable iv3 # 70| 1: [LocalVariableAccess] access to local variable iv2 -# 71| 13: [ExprStmt] ...; -# 71| 0: [AssignLeftShiftExpr] ... <<= ... -# 71| 0: [LocalVariableAccess] access to local variable iv3 -# 71| 1: [LocalVariableAccess] access to local variable iv2 -# 72| 14: [ExprStmt] ...; -# 72| 0: [AssignRightShiftExpr] ... >>= ... -# 72| 0: [LocalVariableAccess] access to local variable iv3 -# 72| 1: [LocalVariableAccess] access to local variable iv2 -# 73| 15: [ExprStmt] ...; -# 73| 0: [AssignUnsignedRightShiftExpr] ... >>>= ... +# 73| 6: [ExprStmt] ...; +# 73| 0: [AssignSubExpr] ... -= ... # 73| 0: [LocalVariableAccess] access to local variable iv3 # 73| 1: [LocalVariableAccess] access to local variable iv2 -# 75| 16: [CheckedStmt] checked {...} -# 76| 0: [BlockStmt] {...} -# 77| 0: [ExprStmt] ...; -# 77| 0: [AssignAddExpr] ... += ... -# 77| 0: [LocalVariableAccess] access to local variable iv3 -# 77| 1: [LocalVariableAccess] access to local variable iv2 -# 78| 1: [ExprStmt] ...; -# 78| 0: [AssignSubExpr] ... -= ... -# 78| 0: [LocalVariableAccess] access to local variable iv3 -# 78| 1: [LocalVariableAccess] access to local variable iv2 -# 79| 2: [ExprStmt] ...; -# 79| 0: [AssignMulExpr] ... *= ... -# 79| 0: [LocalVariableAccess] access to local variable iv3 -# 79| 1: [LocalVariableAccess] access to local variable iv2 -# 80| 3: [ExprStmt] ...; -# 80| 0: [AssignDivExpr] ... /= ... -# 80| 0: [LocalVariableAccess] access to local variable iv3 -# 80| 1: [LocalVariableAccess] access to local variable iv2 -# 85| 3: [Struct] Digit -# 87| 6: [Field] value -# 87| -1: [TypeMention] byte -# 89| 7: [InstanceConstructor] Digit -#-----| 2: (Parameters) -# 89| 0: [Parameter] value -# 89| -1: [TypeMention] byte -# 90| 4: [BlockStmt] {...} -# 91| 0: [IfStmt] if (...) ... -# 91| 0: [LogicalOrExpr] ... || ... -# 91| 0: [LTExpr] ... < ... -# 91| 0: [CastExpr] (...) ... -# 91| 1: [ParameterAccess] access to parameter value -# 91| 1: [IntLiteral] 0 -# 91| 1: [GTExpr] ... > ... -# 91| 0: [CastExpr] (...) ... -# 91| 1: [ParameterAccess] access to parameter value -# 91| 1: [IntLiteral] 9 -# 92| 1: [ThrowStmt] throw ...; -# 92| 0: [ObjectCreation] object creation of type ArgumentException -# 92| 0: [TypeMention] ArgumentException -# 93| 1: [ExprStmt] ...; -# 93| 0: [AssignExpr] ... = ... -# 93| 0: [FieldAccess] access to field value -# 93| -1: [ThisAccess] this access -# 93| 1: [ParameterAccess] access to parameter value -# 96| 8: [ImplicitConversionOperator] implicit conversion -# 96| -1: [TypeMention] byte -#-----| 2: (Parameters) -# 96| 0: [Parameter] d -# 96| -1: [TypeMention] Digit -# 97| 4: [BlockStmt] {...} -# 98| 0: [ReturnStmt] return ...; -# 98| 0: [FieldAccess] access to field value -# 98| -1: [ParameterAccess] access to parameter d -# 101| 9: [ExplicitConversionOperator] explicit conversion -# 101| -1: [TypeMention] Digit -#-----| 2: (Parameters) -# 101| 0: [Parameter] b -# 101| -1: [TypeMention] byte -# 102| 4: [BlockStmt] {...} -# 103| 0: [ReturnStmt] return ...; -# 103| 0: [ObjectCreation] object creation of type Digit -# 103| -1: [TypeMention] Digit -# 103| 0: [ParameterAccess] access to parameter b -# 108| 4: [Class] TestConversionOperator -# 111| 6: [Method] Main -# 111| -1: [TypeMention] Void -# 112| 4: [BlockStmt] {...} -# 113| 0: [LocalVariableDeclStmt] ... ...; -# 113| 0: [LocalVariableDeclAndInitExpr] Digit d = ... -# 113| -1: [TypeMention] Digit -# 113| 0: [LocalVariableAccess] access to local variable d -# 113| 1: [OperatorCall] call to operator explicit conversion -# 113| -1: [TypeMention] Digit -# 113| 0: [CastExpr] (...) ... -# 113| 1: [IntLiteral] 8 -# 114| 1: [LocalVariableDeclStmt] ... ...; -# 114| 0: [LocalVariableDeclAndInitExpr] Byte b = ... -# 114| -1: [TypeMention] byte -# 114| 0: [LocalVariableAccess] access to local variable b -# 114| 1: [OperatorCall] call to operator implicit conversion -# 114| 0: [LocalVariableAccess] access to local variable d +# 74| 7: [ExprStmt] ...; +# 74| 0: [AssignMulExpr] ... *= ... +# 74| 0: [LocalVariableAccess] access to local variable iv3 +# 74| 1: [LocalVariableAccess] access to local variable iv2 +# 75| 8: [ExprStmt] ...; +# 75| 0: [AssignDivExpr] ... /= ... +# 75| 0: [LocalVariableAccess] access to local variable iv3 +# 75| 1: [LocalVariableAccess] access to local variable iv2 +# 76| 9: [ExprStmt] ...; +# 76| 0: [AssignRemExpr] ... %= ... +# 76| 0: [LocalVariableAccess] access to local variable iv3 +# 76| 1: [LocalVariableAccess] access to local variable iv2 +# 77| 10: [ExprStmt] ...; +# 77| 0: [AssignAndExpr] ... &= ... +# 77| 0: [LocalVariableAccess] access to local variable iv3 +# 77| 1: [LocalVariableAccess] access to local variable iv2 +# 78| 11: [ExprStmt] ...; +# 78| 0: [AssignOrExpr] ... |= ... +# 78| 0: [LocalVariableAccess] access to local variable iv3 +# 78| 1: [LocalVariableAccess] access to local variable iv2 +# 79| 12: [ExprStmt] ...; +# 79| 0: [AssignXorExpr] ... ^= ... +# 79| 0: [LocalVariableAccess] access to local variable iv3 +# 79| 1: [LocalVariableAccess] access to local variable iv2 +# 80| 13: [ExprStmt] ...; +# 80| 0: [AssignLeftShiftExpr] ... <<= ... +# 80| 0: [LocalVariableAccess] access to local variable iv3 +# 80| 1: [LocalVariableAccess] access to local variable iv2 +# 81| 14: [ExprStmt] ...; +# 81| 0: [AssignRightShiftExpr] ... >>= ... +# 81| 0: [LocalVariableAccess] access to local variable iv3 +# 81| 1: [LocalVariableAccess] access to local variable iv2 +# 82| 15: [ExprStmt] ...; +# 82| 0: [AssignUnsignedRightShiftExpr] ... >>>= ... +# 82| 0: [LocalVariableAccess] access to local variable iv3 +# 82| 1: [LocalVariableAccess] access to local variable iv2 +# 84| 16: [CheckedStmt] checked {...} +# 85| 0: [BlockStmt] {...} +# 86| 0: [ExprStmt] ...; +# 86| 0: [AssignAddExpr] ... += ... +# 86| 0: [LocalVariableAccess] access to local variable iv3 +# 86| 1: [LocalVariableAccess] access to local variable iv2 +# 87| 1: [ExprStmt] ...; +# 87| 0: [AssignSubExpr] ... -= ... +# 87| 0: [LocalVariableAccess] access to local variable iv3 +# 87| 1: [LocalVariableAccess] access to local variable iv2 +# 88| 2: [ExprStmt] ...; +# 88| 0: [AssignMulExpr] ... *= ... +# 88| 0: [LocalVariableAccess] access to local variable iv3 +# 88| 1: [LocalVariableAccess] access to local variable iv2 +# 89| 3: [ExprStmt] ...; +# 89| 0: [AssignDivExpr] ... /= ... +# 89| 0: [LocalVariableAccess] access to local variable iv3 +# 89| 1: [LocalVariableAccess] access to local variable iv2 +# 92| 17: [LocalVariableDeclStmt] ... ...; +# 92| 0: [LocalVariableDeclAndInitExpr] C c = ... +# 92| -1: [TypeMention] C +# 92| 0: [LocalVariableAccess] access to local variable c +# 92| 1: [ObjectCreation] object creation of type C +# 92| 0: [TypeMention] C +# 93| 18: [ExprStmt] ...; +# 93| 0: [OperatorCall] call to operator ++ +# 93| 0: [LocalVariableAccess] access to local variable c +# 94| 19: [ExprStmt] ...; +# 94| 0: [OperatorCall] call to operator ++ +# 94| 0: [LocalVariableAccess] access to local variable c +# 95| 20: [ExprStmt] ...; +# 95| 0: [OperatorCall] call to operator -- +# 95| 0: [LocalVariableAccess] access to local variable c +# 96| 21: [ExprStmt] ...; +# 96| 0: [OperatorCall] call to operator -- +# 96| 0: [LocalVariableAccess] access to local variable c +# 98| 22: [CheckedStmt] checked {...} +# 99| 0: [BlockStmt] {...} +# 100| 0: [ExprStmt] ...; +# 100| 0: [OperatorCall] call to operator checked ++ +# 100| 0: [LocalVariableAccess] access to local variable c +# 101| 1: [ExprStmt] ...; +# 101| 0: [OperatorCall] call to operator checked ++ +# 101| 0: [LocalVariableAccess] access to local variable c +# 102| 2: [ExprStmt] ...; +# 102| 0: [OperatorCall] call to operator checked -- +# 102| 0: [LocalVariableAccess] access to local variable c +# 103| 3: [ExprStmt] ...; +# 103| 0: [OperatorCall] call to operator checked -- +# 103| 0: [LocalVariableAccess] access to local variable c +# 107| 7: [Struct] Digit +# 109| 6: [Field] value +# 109| -1: [TypeMention] byte +# 111| 7: [InstanceConstructor] Digit +#-----| 2: (Parameters) +# 111| 0: [Parameter] value +# 111| -1: [TypeMention] byte +# 112| 4: [BlockStmt] {...} +# 113| 0: [IfStmt] if (...) ... +# 113| 0: [LogicalOrExpr] ... || ... +# 113| 0: [LTExpr] ... < ... +# 113| 0: [CastExpr] (...) ... +# 113| 1: [ParameterAccess] access to parameter value +# 113| 1: [IntLiteral] 0 +# 113| 1: [GTExpr] ... > ... +# 113| 0: [CastExpr] (...) ... +# 113| 1: [ParameterAccess] access to parameter value +# 113| 1: [IntLiteral] 9 +# 114| 1: [ThrowStmt] throw ...; +# 114| 0: [ObjectCreation] object creation of type ArgumentException +# 114| 0: [TypeMention] ArgumentException +# 115| 1: [ExprStmt] ...; +# 115| 0: [AssignExpr] ... = ... +# 115| 0: [FieldAccess] access to field value +# 115| -1: [ThisAccess] this access +# 115| 1: [ParameterAccess] access to parameter value +# 118| 8: [ImplicitConversionOperator] implicit conversion +# 118| -1: [TypeMention] byte +#-----| 2: (Parameters) +# 118| 0: [Parameter] d +# 118| -1: [TypeMention] Digit +# 119| 4: [BlockStmt] {...} +# 120| 0: [ReturnStmt] return ...; +# 120| 0: [FieldAccess] access to field value +# 120| -1: [ParameterAccess] access to parameter d +# 123| 9: [ExplicitConversionOperator] explicit conversion +# 123| -1: [TypeMention] Digit +#-----| 2: (Parameters) +# 123| 0: [Parameter] b +# 123| -1: [TypeMention] byte +# 124| 4: [BlockStmt] {...} +# 125| 0: [ReturnStmt] return ...; +# 125| 0: [ObjectCreation] object creation of type Digit +# 125| -1: [TypeMention] Digit +# 125| 0: [ParameterAccess] access to parameter b +# 130| 8: [Class] TestConversionOperator +# 133| 6: [Method] Main +# 133| -1: [TypeMention] Void +# 134| 4: [BlockStmt] {...} +# 135| 0: [LocalVariableDeclStmt] ... ...; +# 135| 0: [LocalVariableDeclAndInitExpr] Digit d = ... +# 135| -1: [TypeMention] Digit +# 135| 0: [LocalVariableAccess] access to local variable d +# 135| 1: [OperatorCall] call to operator explicit conversion +# 135| -1: [TypeMention] Digit +# 135| 0: [CastExpr] (...) ... +# 135| 1: [IntLiteral] 8 +# 136| 1: [LocalVariableDeclStmt] ... ...; +# 136| 0: [LocalVariableDeclAndInitExpr] Byte b = ... +# 136| -1: [TypeMention] byte +# 136| 0: [LocalVariableAccess] access to local variable b +# 136| 1: [OperatorCall] call to operator implicit conversion +# 136| 0: [LocalVariableAccess] access to local variable d diff --git a/csharp/ql/test/library-tests/operators/operators.cs b/csharp/ql/test/library-tests/operators/operators.cs index 3ff2fe1a26bf..22aee92e36d0 100644 --- a/csharp/ql/test/library-tests/operators/operators.cs +++ b/csharp/ql/test/library-tests/operators/operators.cs @@ -48,6 +48,15 @@ public IntVector(int length) { } public void operator >>>=(IntVector n) { } } + public class C + { + // Unary instance operators. + public void operator checked ++() { } + public void operator ++() { } + public void operator checked --() { } + public void operator --() { } + } + class TestOperator { void Main() @@ -79,41 +88,55 @@ void Main() iv3 *= iv2; iv3 /= iv2; } - } - } - public struct Digit - { - byte value; + var c = new C(); + c++; + ++c; + c--; + --c; - public Digit(byte value) - { - if (value < 0 || value > 9) - throw new ArgumentException(); - this.value = value; + checked + { + c++; + ++c; + c--; + --c; + } } - public static implicit operator byte(Digit d) + public struct Digit { - return d.value; - } + byte value; - public static explicit operator Digit(byte b) - { - return new Digit(b); - } + public Digit(byte value) + { + if (value < 0 || value > 9) + throw new ArgumentException(); + this.value = value; + } - } + public static implicit operator byte(Digit d) + { + return d.value; + } - class TestConversionOperator - { + public static explicit operator Digit(byte b) + { + return new Digit(b); + } - void Main() + } + + class TestConversionOperator { - Digit d = (Digit)8; - byte b = d; + + void Main() + { + Digit d = (Digit)8; + byte b = d; + } + } } - } diff --git a/csharp/ql/test/library-tests/properties/PrintAst.expected b/csharp/ql/test/library-tests/properties/PrintAst.expected index 711e417558ed..ef482ed33d06 100644 --- a/csharp/ql/test/library-tests/properties/PrintAst.expected +++ b/csharp/ql/test/library-tests/properties/PrintAst.expected @@ -246,3 +246,50 @@ properties.cs: # 133| 0: [FieldAccess] access to field Prop.field # 133| 1: [ParameterAccess] access to parameter value # 130| 7: [Field] Prop.field +# 137| 11: [RefStruct] S +# 139| 6: [Field] x +# 139| -1: [TypeMention] int +# 141| 7: [InstanceConstructor] S +#-----| 2: (Parameters) +# 141| 0: [Parameter] v +# 141| -1: [TypeMention] int +# 142| 4: [BlockStmt] {...} +# 143| 0: [ExprStmt] ...; +# 143| 0: [AssignExpr] ... = ... +# 143| 0: [FieldAccess] access to field x +# 143| 1: [RefExpr] ref ... +# 143| 0: [ParameterAccess] access to parameter v +# 146| 8: [Property] Prop +# 146| -1: [TypeMention] int +# 148| 3: [Getter] get_Prop +# 148| 4: [BlockStmt] {...} +# 148| 0: [ReturnStmt] return ...; +# 148| 0: [RefExpr] ref ... +# 148| 0: [FieldAccess] access to field x +# 152| 12: [Class] TestRefReturns +# 154| 6: [Method] M +# 154| -1: [TypeMention] Void +# 155| 4: [BlockStmt] {...} +# 156| 0: [LocalVariableDeclStmt] ... ...; +# 156| 0: [LocalVariableDeclAndInitExpr] Int32 a = ... +# 156| -1: [TypeMention] int +# 156| 0: [LocalVariableAccess] access to local variable a +# 156| 1: [IntLiteral] 0 +# 158| 1: [LocalVariableDeclStmt] ... ...; +# 158| 0: [LocalVariableDeclAndInitExpr] S s = ... +# 158| -1: [TypeMention] S +# 158| 0: [LocalVariableAccess] access to local variable s +# 158| 1: [ObjectCreation] object creation of type S +# 158| -1: [TypeMention] S +# 158| 0: [LocalVariableAccess] access to local variable a +# 159| 2: [ExprStmt] ...; +# 159| 0: [AssignExpr] ... = ... +# 159| 0: [PropertyCall] access to property Prop +# 159| -1: [LocalVariableAccess] access to local variable s +# 159| 1: [IntLiteral] 1 +# 160| 3: [LocalVariableDeclStmt] ... ...; +# 160| 0: [LocalVariableDeclAndInitExpr] Int32 x = ... +# 160| -1: [TypeMention] int +# 160| 0: [LocalVariableAccess] access to local variable x +# 160| 1: [PropertyCall] access to property Prop +# 160| -1: [LocalVariableAccess] access to local variable s diff --git a/csharp/ql/test/library-tests/properties/Properties17.expected b/csharp/ql/test/library-tests/properties/Properties17.expected index ee817a63df94..74efae145f78 100644 --- a/csharp/ql/test/library-tests/properties/Properties17.expected +++ b/csharp/ql/test/library-tests/properties/Properties17.expected @@ -1,5 +1,6 @@ | Prop.field | | caption | | next | +| x | | y | | z | diff --git a/csharp/ql/test/library-tests/properties/Properties19.expected b/csharp/ql/test/library-tests/properties/Properties19.expected new file mode 100644 index 000000000000..7c027119067b --- /dev/null +++ b/csharp/ql/test/library-tests/properties/Properties19.expected @@ -0,0 +1,8 @@ +| properties.cs:12:23:12:29 | Caption | properties.cs:29:13:29:28 | access to property Caption | properties.cs:17:13:17:15 | set_Caption | +| properties.cs:12:23:12:29 | Caption | properties.cs:30:24:30:39 | access to property Caption | properties.cs:15:13:15:15 | get_Caption | +| properties.cs:57:20:57:20 | X | properties.cs:61:13:61:13 | access to property X | properties.cs:57:37:57:39 | set_X | +| properties.cs:58:20:58:20 | Y | properties.cs:62:13:62:13 | access to property Y | properties.cs:58:37:58:39 | set_Y | +| properties.cs:70:28:70:28 | X | properties.cs:82:46:82:51 | access to property X | properties.cs:70:32:70:34 | get_X | +| properties.cs:71:28:71:28 | Y | properties.cs:83:39:83:44 | access to property Y | properties.cs:74:13:74:15 | set_Y | +| properties.cs:146:24:146:27 | Prop | properties.cs:159:13:159:18 | access to property Prop | properties.cs:148:13:148:15 | get_Prop | +| properties.cs:146:24:146:27 | Prop | properties.cs:160:21:160:26 | access to property Prop | properties.cs:148:13:148:15 | get_Prop | diff --git a/csharp/ql/test/library-tests/properties/Properties19.ql b/csharp/ql/test/library-tests/properties/Properties19.ql new file mode 100644 index 000000000000..ea34f1d5635f --- /dev/null +++ b/csharp/ql/test/library-tests/properties/Properties19.ql @@ -0,0 +1,8 @@ +import csharp + +from PropertyCall pc, Property p, Accessor target +where + pc.getProperty() = p and + pc.getTarget() = target and + p.fromSource() +select p, pc, target diff --git a/csharp/ql/test/library-tests/properties/properties.cs b/csharp/ql/test/library-tests/properties/properties.cs index 2f88214ec755..391245e3497e 100644 --- a/csharp/ql/test/library-tests/properties/properties.cs +++ b/csharp/ql/test/library-tests/properties/properties.cs @@ -133,4 +133,31 @@ public object Prop set { field = value; } } } + + public ref struct S + { + private ref int x; + + public S(ref int v) + { + x = ref v; + } + + public ref int Prop + { + get { return ref x; } + } + } + + public class TestRefReturns + { + public void M() + { + int a = 0; + + S s = new S(ref a); + s.Prop = 1; + var x = s.Prop; + } + } } diff --git a/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/IsNotOkayCall.expected b/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/IsNotOkayCall.expected index 7555a37394b5..dcdb8b09058c 100644 --- a/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/IsNotOkayCall.expected +++ b/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/IsNotOkayCall.expected @@ -1,3 +1,2 @@ | Quality.cs:26:19:26:26 | access to indexer | Call without target $@. | Quality.cs:26:19:26:26 | access to indexer | access to indexer | | Quality.cs:29:21:29:27 | access to indexer | Call without target $@. | Quality.cs:29:21:29:27 | access to indexer | access to indexer | -| Quality.cs:32:9:32:21 | access to indexer | Call without target $@. | Quality.cs:32:9:32:21 | access to indexer | access to indexer | diff --git a/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/NoTarget.expected b/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/NoTarget.expected index 7ae469cf84e3..a76dd08cdb6b 100644 --- a/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/NoTarget.expected +++ b/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/NoTarget.expected @@ -9,6 +9,5 @@ | Quality.cs:23:9:23:30 | delegate call | Call without target $@. | Quality.cs:23:9:23:30 | delegate call | delegate call | | Quality.cs:26:19:26:26 | access to indexer | Call without target $@. | Quality.cs:26:19:26:26 | access to indexer | access to indexer | | Quality.cs:29:21:29:27 | access to indexer | Call without target $@. | Quality.cs:29:21:29:27 | access to indexer | access to indexer | -| Quality.cs:32:9:32:21 | access to indexer | Call without target $@. | Quality.cs:32:9:32:21 | access to indexer | access to indexer | | Quality.cs:38:16:38:26 | access to property MyProperty2 | Call without target $@. | Quality.cs:38:16:38:26 | access to property MyProperty2 | access to property MyProperty2 | | Quality.cs:50:20:50:26 | object creation of type T | Call without target $@. | Quality.cs:50:20:50:26 | object creation of type T | object creation of type T | diff --git a/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/Quality.cs b/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/Quality.cs index 31f4deda5df5..e10ce10f6c4b 100644 --- a/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/Quality.cs +++ b/csharp/ql/test/query-tests/Telemetry/DatabaseQuality/Quality.cs @@ -29,7 +29,7 @@ public Test() var slice = sp[..3]; // TODO: this is not an indexer call, but rather a `sp.Slice(0, 3)` call. Span guidBytes = stackalloc byte[16]; - guidBytes[08] = 1; // TODO: this indexer call has no target, because the target is a `ref` returning getter. + guidBytes[08] = 1; new MyList([new(), new Test()]); } diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.5.rst new file mode 100644 index 000000000000..96ccad2e93e4 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.5.rst @@ -0,0 +1,88 @@ +.. _codeql-cli-2.25.5: + +========================== +CodeQL 2.25.5 (2026-05-21) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.25.5 runs a total of 496 security queries when configured with the Default suite (covering 169 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). + +CodeQL CLI +---------- + +There are no user-facing CLI changes in this release. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Fixed help file descriptions for queries: :code:`actions/untrusted-checkout/critical`, :code:`actions/untrusted-checkout/high`, :code:`actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* The 'Cleartext transmission of sensitive information' query (:code:`cpp/cleartext-transmission`) no longer raises an alert on calls to :code:`fscanf` (and variants) when the call reads from an "obviously local" :code:`FILE` stream such as :code:`stdin`. + +Java/Kotlin +""""""""""" + +* The :code:`java/zipslip` query no longer reports archive entry names that flow only to read-only path sinks such as :code:`ClassLoader.getResource`, :code:`FileInputStream`, and :code:`FileReader`. The query now restricts its sinks to the :code:`path-injection` kind and deliberately excludes the new :code:`path-injection[read]` sub-kind, matching the Zip Slip threat model of unsafe archive extraction. + +GitHub Actions +"""""""""""""" + +* The :code:`actions/unpinned-tag` query now analyzes composite action metadata (:code:`action.yml`\ /\ :code:`action.yaml` files) in addition to workflow files, providing more comprehensive detection of unpinned action references across the entire Actions ecosystem. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Adjusted the name of :code:`actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context. + +Language Libraries +------------------ + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* The :code:`RemoteFlowSourceFunction` model for :code:`fscanf` (and variants) now implements :code:`hasSocketInput` to reflect that these functions may read from a socket. + +Java/Kotlin +""""""""""" + +* Introduced a new sink kind :code:`path-injection[read]` for Models-as-Data rows that only read from a path (such as :code:`ClassLoader.getResource`, :code:`FileInputStream`, :code:`FileReader`, :code:`Files.readAllBytes`, and related APIs). The general :code:`java/path-injection` query continues to consider both :code:`path-injection` and :code:`path-injection[read]` sinks. + +GitHub Actions +"""""""""""""" + +* Altered 2 patterns in the :code:`poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and :code:`go run` in directories are detected as potential mechanisms of injection. For the go execution pattern, the pattern is updated to now ignore flags that occur between go and the specific command. This change may lead to more results being detected by the following queries: :code:`actions/untrusted-checkout/high`, :code:`actions/untrusted-checkout/critical`, :code:`actions/untrusted-checkout-toctou/high`, :code:`actions/untrusted-checkout-toctou/critical`, :code:`actions/cache-poisoning/poisonable-step`, :code:`actions/cache-poisoning/direct-cache` and :code:`actions/artifact-poisoning/path-traversal`. + +New Features +~~~~~~~~~~~~ + +Swift +""""" + +* The :code:`TypeDecl` class now defines a :code:`getDeclaredInterfaceType` predicate, which yields the declared interface type of the type declaration. diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.6.rst new file mode 100644 index 000000000000..21d67e162299 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.6.rst @@ -0,0 +1,139 @@ +.. _codeql-cli-2.25.6: + +========================== +CodeQL 2.25.6 (2026-06-04) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.25.6 runs a total of 496 security queries when configured with the Default suite (covering 169 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). + +CodeQL CLI +---------- + +Improvements +~~~~~~~~~~~~ + +* When the :code:`git` executable is available, CodeQL can now obtain configuration and queries from SHA-256 Git repositories, and infer Git metadata about them. + +Miscellaneous +~~~~~~~~~~~~~ + +* The build of Eclipse Temurin OpenJDK that is used to run the CodeQL CLI has been updated to version 21.0.11. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Adjusted (minor) help file descriptions for queries: :code:`actions/untrusted-checkout/critical`, :code:`actions/untrusted-checkout/high`, :code:`actions/untrusted-checkout/medium`. Clarified wording on a minor point, added one more listed resource and added one more recommendation for things to check. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Adjusted :code:`actions/untrusted-checkout/critical` to align more with other untrusted resource queries, where the alert location is the location where the artifact is obtained from (the checkout point). This aligns with the other 2 related queries. This will cause the same alerts to re-open for closed alerts of this query. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Altered the alert message for clarity for queries: :code:`actions/untrusted-checkout/critical`, :code:`actions/untrusted-checkout/high`. +* The :code:`actions/unpinned-tag` query now recognizes 64-character SHA-256 commit hashes as properly pinned references, in addition to 40-character SHA-1 hashes. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Reversed adjustment of the name of :code:`actions/untrusted-checkout/high`, but kept the portion of the previous change for the word "trusted" to "privileged". Added a missing "a" to phrasing in :code:`actions/untrusted-checkout/high` and :code:`actions/untrusted-checkout/medium`. + +Language Libraries +------------------ + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Swift +""""" + +* Upgraded to allow analysis of Swift 6.3.2. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* Added flow source models for :code:`scanf_s` and related functions. +* Added a :code:`Call` column to :code:`LocalFlowSourceFunction::hasLocalFlowSource` and :code:`RemoteFlowSourceFunction::hasRemoteFlowSource`. The old predicates without a :code:`Call` column continue to be supported. + +C# +"" + +* Full support for C# 14 / .NET 10. All new language features are now supported by the extractor. The QL library and data flow analysis now support the new C# 14 language constructs and include generated Models as Data (MaD) models for the .NET 10 runtime. +* C# 14: Added support for user-defined instance increment/decrement operators. + +Java/Kotlin +""""""""""" + +* Added LLM-generated source and sink models for :code:`org.apache.avro`. + +JavaScript/TypeScript +""""""""""""""""""""" + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example :code:`js/clear-text-logging`) may find more correct results and fewer false positive results after these changes. + +Python +"""""" + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example :code:`py/clear-text-logging-sensitive-data`) may find more correct results and fewer false positive results after these changes. + +Swift +""""" + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example :code:`swift/cleartext-logging`) may find more correct results and fewer false positive results after these changes. + +GitHub Actions +"""""""""""""" + +* The GitHub Actions analysis now recognizes more Bash regex checks that restrict a value to alphanumeric characters, including regexes like :code:`^[0-9a-zA-Z]{40}([0-9a-zA-Z]{24})?$` which check for a SHA-1 or SHA-256 hash. This may reduce false positive results where command output is validated with grouped or optional alphanumeric patterns before being used. + +Rust +"""" + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example :code:`rust/cleartext-logging`) may find more correct results and fewer false positive results after these changes. + +Deprecated APIs +~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* The :code:`UsingAliasTypedefType` class has been deprecated. Use :code:`TypeAliasType` instead. + +New Features +~~~~~~~~~~~~ + +C/C++ +""""" + +* Added a :code:`getOriginalTemplate` predicate to :code:`TemplateClass`, :code:`TemplateFunction`, :code:`TemplateVariable`, and :code:`AliasTemplateType`, which yields the class member template the template was generated from. The predicates only have results for templates that are members of class template instantiations. +* Added :code:`AliasTemplateType` and :code:`AliasTemplateInstantiationType` classes, representing C++ alias templates and their instantiations. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index c5d4fee45769..ac4a8041faa4 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,8 @@ A list of queries for each suite and language `is available here diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 000000000000..95848ba942a8 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| main.go:23:3:23:5 | out | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go index 8e3a498656af..84e769659806 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/main.go @@ -4,7 +4,7 @@ func source() string { return "untrusted data" } -func sink(string) { +func sink(any) { } type A struct { @@ -19,6 +19,10 @@ func functionWithVarArgsParameter(s ...string) string { return s[1] } +func functionWithVarArgsOutParameter(in string, out ...*string) { + *out[0] = in +} + func functionWithSliceOfStructsParameter(s []A) string { return s[1].f } @@ -38,6 +42,12 @@ func main() { sink(functionWithVarArgsParameter(sSlice...)) // $ hasValueFlow="call to functionWithVarArgsParameter" sink(functionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to functionWithVarArgsParameter" + var out1 *string + var out2 *string + functionWithVarArgsOutParameter(source(), out1, out2) + sink(out1) // $ MISSING: hasValueFlow="out1" + sink(out2) // $ MISSING: hasValueFlow="out2" + sliceOfStructs := []A{{f: source()}} sink(sliceOfStructs[0].f) // $ hasValueFlow="selection of f" diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected new file mode 100644 index 000000000000..42831abaf155 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.expected @@ -0,0 +1,2 @@ +invalidModelRow +testFailures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml new file mode 100644 index 000000000000..ca3f9559536a --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ext.yml @@ -0,0 +1,21 @@ +extensions: + - addsTo: + pack: codeql/go-all + extensible: summaryModel + data: + - ["github.com/nonexistent/test", "", False, "FunctionWithParameter", "", "", "Argument[0]", "ReturnValue", "value", "manual"] + - ["github.com/nonexistent/test", "", False, "FunctionWithSliceParameter", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"] + - ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsParameter", "", "", "Argument[0].ArrayElement", "ReturnValue", "value", "manual"] + - ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsOutParameter", "", "", "Argument[0]", "Argument[1].ArrayElement", "value", "manual"] + - ["github.com/nonexistent/test", "", False, "FunctionWithSliceOfStructsParameter", "", "", "Argument[0].ArrayElement.Field[github.com/nonexistent/test.A.Field]", "ReturnValue", "value", "manual"] + - ["github.com/nonexistent/test", "", False, "FunctionWithVarArgsOfStructsParameter", "", "", "Argument[0].ArrayElement.Field[github.com/nonexistent/test.A.Field]", "ReturnValue", "value", "manual"] + - addsTo: + pack: codeql/go-all + extensible: sourceModel + data: + - ["github.com/nonexistent/test", "", False, "VariadicSource", "", "", "Argument[0]", "qltest", "manual"] + - addsTo: + pack: codeql/go-all + extensible: sinkModel + data: + - ["github.com/nonexistent/test", "", False, "VariadicSink", "", "", "Argument[0]", "qltest", "manual"] diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql new file mode 100644 index 000000000000..873143a6f81c --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/Flows.ql @@ -0,0 +1,22 @@ +import go +import semmle.go.dataflow.ExternalFlow +import ModelValidation +import utils.test.InlineFlowTest + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + sourceNode(source, "qltest") + or + exists(Function fn | fn.hasQualifiedName(_, ["source", "taint"]) | + source = fn.getACall().getResult() + ) + } + + predicate isSink(DataFlow::Node sink) { + sinkNode(sink, "qltest") + or + exists(Function fn | fn.hasQualifiedName(_, "sink") | sink = fn.getACall().getAnArgument()) + } +} + +import FlowTest diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod new file mode 100644 index 000000000000..43614028d1b6 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/go.mod @@ -0,0 +1,5 @@ +module semmle.go.Packages + +go 1.25 + +require github.com/nonexistent/test v0.0.0-20200203000000-0000000000000 diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go new file mode 100644 index 000000000000..0a4fc6fa941a --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "github.com/nonexistent/test" +) + +func source() string { + return "untrusted data" +} + +func sink(any) { +} + +func main() { + s := source() + sink(test.FunctionWithParameter(s)) // $ hasValueFlow="call to FunctionWithParameter" + + stringSlice := []string{source()} + sink(stringSlice[0]) // $ hasValueFlow="index expression" + + s0 := "" + s1 := source() + sSlice := []string{s0, s1} + sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter" + sink(test.FunctionWithSliceParameter(sSlice)) // $ hasValueFlow="call to FunctionWithSliceParameter" + sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasValueFlow="call to FunctionWithVarArgsParameter" + sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to FunctionWithVarArgsParameter" + + var out1 *string + var out2 *string + test.FunctionWithVarArgsOutParameter(source(), out1, out2) + sink(out1) // $ MISSING: hasValueFlow="out1" + sink(out2) // $ MISSING: hasValueFlow="out2" + + sliceOfStructs := []test.A{{Field: source()}} + sink(sliceOfStructs[0].Field) // $ hasValueFlow="selection of Field" + + a0 := test.A{Field: ""} + a1 := test.A{Field: source()} + aSlice := []test.A{a0, a1} + sink(test.FunctionWithSliceOfStructsParameter(aSlice)) // $ hasValueFlow="call to FunctionWithSliceOfStructsParameter" + sink(test.FunctionWithVarArgsOfStructsParameter(aSlice...)) // $ hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" + sink(test.FunctionWithVarArgsOfStructsParameter(a0, a1)) // $ hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" + + var variadicSource string + test.VariadicSource(&variadicSource) + sink(variadicSource) // $ MISSING: hasTaintFlow="variadicSource" + sink(&variadicSource) // $ MISSING: hasTaintFlow="&..." + + var variadicSourcePtr *string + test.VariadicSource(variadicSourcePtr) + sink(variadicSourcePtr) // $ MISSING: hasTaintFlow="variadicSourcePtr" + sink(*variadicSourcePtr) // $ MISSING: hasTaintFlow="star expression" + + test.VariadicSink(source()) // $ hasTaintFlow="[]type{args}" +} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go new file mode 100644 index 000000000000..4c38a21f6d00 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/github.com/nonexistent/test/stub.go @@ -0,0 +1,32 @@ +package test + +type A struct { + Field string +} + +func FunctionWithParameter(s string) string { + return "" +} + +func FunctionWithSliceParameter(s []string) string { + return "" +} + +func FunctionWithVarArgsParameter(s ...string) string { + return "" +} + +func FunctionWithVarArgsOutParameter(in string, out ...*string) { +} + +func FunctionWithSliceOfStructsParameter(s []A) string { + return "" +} + +func FunctionWithVarArgsOfStructsParameter(s ...A) string { + return "" +} + +func VariadicSource(s ...*string) {} + +func VariadicSink(s ...string) {} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt new file mode 100644 index 000000000000..b62dbf8819b5 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithExternalFlow/vendor/modules.txt @@ -0,0 +1,3 @@ +# github.com/nonexistent/test v0.0.0-20200203000000-0000000000000 +## explicit +github.com/nonexistent/test diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql index bbe5618b5682..8c4093d83d35 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/Flows.ql @@ -20,6 +20,9 @@ class SummaryModelTest extends DataFlow::FunctionModel { this.hasQualifiedName("github.com/nonexistent/test", "FunctionWithVarArgsParameter") and (inp.isParameter(_) and outp.isResult()) or + this.hasQualifiedName("github.com/nonexistent/test", "FunctionWithVarArgsOutParameter") and + (inp.isParameter(0) and outp.isParameter(any(int i | i >= 1))) + or this.hasQualifiedName("github.com/nonexistent/test", "FunctionWithSliceOfStructsParameter") and (inp.isParameter(0) and outp.isResult()) or diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod index ed18764ed282..43614028d1b6 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/go.mod @@ -1,5 +1,5 @@ module semmle.go.Packages -go 1.17 +go 1.25 require github.com/nonexistent/test v0.0.0-20200203000000-0000000000000 diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go index c561de0da2f0..e8d53eb9b288 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/main.go @@ -8,7 +8,7 @@ func source() string { return "untrusted data" } -func sink(string) { +func sink(any) { } func main() { @@ -21,10 +21,17 @@ func main() { s0 := "" s1 := source() sSlice := []string{s0, s1} - sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter" - sink(test.FunctionWithSliceParameter(sSlice)) // $ hasTaintFlow="call to FunctionWithSliceParameter" MISSING: hasValueFlow="call to FunctionWithSliceParameter" - sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasTaintFlow="call to FunctionWithVarArgsParameter" MISSING: hasValueFlow="call to FunctionWithVarArgsParameter" - sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ MISSING: hasValueFlow="call to FunctionWithVarArgsParameter" + sink(test.FunctionWithParameter(sSlice[1])) // $ hasValueFlow="call to FunctionWithParameter" + sink(test.FunctionWithSliceParameter(sSlice)) // $ hasTaintFlow="call to FunctionWithSliceParameter" MISSING: hasValueFlow="call to FunctionWithSliceParameter" + sink(test.FunctionWithVarArgsParameter(sSlice...)) // $ hasTaintFlow="call to FunctionWithVarArgsParameter" MISSING: hasValueFlow="call to FunctionWithVarArgsParameter" + randomFunctionWithMoreThanOneParameter(1, 2, 3, 4, 5) // This is needed to make the next line pass, because we need to have seen a call to a function with at least 2 parameters for ParameterInput to exist with index 1. + sink(test.FunctionWithVarArgsParameter(s0, s1)) // $ hasValueFlow="call to FunctionWithVarArgsParameter" + + var out1 *string + var out2 *string + test.FunctionWithVarArgsOutParameter(source(), out1, out2) + sink(out1) // $ hasValueFlow="out1" + sink(out2) // $ hasValueFlow="out2" sliceOfStructs := []test.A{{Field: source()}} sink(sliceOfStructs[0].Field) // $ hasValueFlow="selection of Field" @@ -37,3 +44,6 @@ func main() { sink(test.FunctionWithVarArgsOfStructsParameter(aSlice...)) // $ MISSING: hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" sink(test.FunctionWithVarArgsOfStructsParameter(a0, a1)) // $ MISSING: hasValueFlow="call to FunctionWithVarArgsOfStructsParameter" } + +func randomFunctionWithMoreThanOneParameter(i1, i2, i3, i4, i5 int) { +} diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/semmle.go.Packages b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/semmle.go.Packages deleted file mode 100755 index e3880ac8d5d9..000000000000 Binary files a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/semmle.go.Packages and /dev/null differ diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go index 66f3da7d6591..28aecd6d479e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/VarArgsWithFunctionModels/vendor/github.com/nonexistent/test/stub.go @@ -16,6 +16,9 @@ func FunctionWithVarArgsParameter(s ...string) string { return "" } +func FunctionWithVarArgsOutParameter(in string, out ...*string) { +} + func FunctionWithSliceOfStructsParameter(s []A) string { return "" } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Log.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Log.go index 703c4086ae14..50dcfd1170bf 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Log.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Log.go @@ -15,62 +15,6 @@ func TaintStepTest_LogNew_B0I0O0(sourceCQL interface{}) interface{} { return intoWriter414 } -func TaintStepTest_LogLoggerFatal_B0I0O0(sourceCQL interface{}) interface{} { - fromInterface518 := sourceCQL.(interface{}) - var intoLogger650 log.Logger - intoLogger650.Fatal(fromInterface518) - return intoLogger650 -} - -func TaintStepTest_LogLoggerFatalf_B0I0O0(sourceCQL interface{}) interface{} { - fromString784 := sourceCQL.(string) - var intoLogger957 log.Logger - intoLogger957.Fatalf(fromString784, nil) - return intoLogger957 -} - -func TaintStepTest_LogLoggerFatalf_B0I1O0(sourceCQL interface{}) interface{} { - fromInterface520 := sourceCQL.(interface{}) - var intoLogger443 log.Logger - intoLogger443.Fatalf("", fromInterface520) - return intoLogger443 -} - -func TaintStepTest_LogLoggerFatalln_B0I0O0(sourceCQL interface{}) interface{} { - fromInterface127 := sourceCQL.(interface{}) - var intoLogger483 log.Logger - intoLogger483.Fatalln(fromInterface127) - return intoLogger483 -} - -func TaintStepTest_LogLoggerPanic_B0I0O0(sourceCQL interface{}) interface{} { - fromInterface989 := sourceCQL.(interface{}) - var intoLogger982 log.Logger - intoLogger982.Panic(fromInterface989) - return intoLogger982 -} - -func TaintStepTest_LogLoggerPanicf_B0I0O0(sourceCQL interface{}) interface{} { - fromString417 := sourceCQL.(string) - var intoLogger584 log.Logger - intoLogger584.Panicf(fromString417, nil) - return intoLogger584 -} - -func TaintStepTest_LogLoggerPanicf_B0I1O0(sourceCQL interface{}) interface{} { - fromInterface991 := sourceCQL.(interface{}) - var intoLogger881 log.Logger - intoLogger881.Panicf("", fromInterface991) - return intoLogger881 -} - -func TaintStepTest_LogLoggerPanicln_B0I0O0(sourceCQL interface{}) interface{} { - fromInterface186 := sourceCQL.(interface{}) - var intoLogger284 log.Logger - intoLogger284.Panicln(fromInterface186) - return intoLogger284 -} - func TaintStepTest_LogLoggerPrint_B0I0O0(sourceCQL interface{}) interface{} { fromInterface908 := sourceCQL.(interface{}) var intoLogger137 log.Logger @@ -125,46 +69,6 @@ func RunAllTaints_Log() { out := TaintStepTest_LogNew_B0I0O0(source) sink(0, out) } - { - source := newSource(1) - out := TaintStepTest_LogLoggerFatal_B0I0O0(source) - sink(1, out) - } - { - source := newSource(2) - out := TaintStepTest_LogLoggerFatalf_B0I0O0(source) - sink(2, out) - } - { - source := newSource(3) - out := TaintStepTest_LogLoggerFatalf_B0I1O0(source) - sink(3, out) - } - { - source := newSource(4) - out := TaintStepTest_LogLoggerFatalln_B0I0O0(source) - sink(4, out) - } - { - source := newSource(5) - out := TaintStepTest_LogLoggerPanic_B0I0O0(source) - sink(5, out) - } - { - source := newSource(6) - out := TaintStepTest_LogLoggerPanicf_B0I0O0(source) - sink(6, out) - } - { - source := newSource(7) - out := TaintStepTest_LogLoggerPanicf_B0I1O0(source) - sink(7, out) - } - { - source := newSource(8) - out := TaintStepTest_LogLoggerPanicln_B0I0O0(source) - sink(8, out) - } { source := newSource(9) out := TaintStepTest_LogLoggerPrint_B0I0O0(source) diff --git a/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected index 2f4d9e320f8d..a683e9691675 100644 --- a/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected @@ -3,9 +3,9 @@ reverseRead | LogInjection.go:33:14:33:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | | LogInjection.go:34:18:34:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | | LogInjection.go:35:14:35:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:447:14:447:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:455:14:455:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:463:14:463:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:498:14:498:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:499:14:499:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:724:12:724:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:551:14:551:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:559:14:559:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:567:14:567:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:602:14:602:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:603:14:603:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:828:12:828:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-117/LogInjection.go b/go/ql/test/query-tests/Security/CWE-117/LogInjection.go index fc9d71791582..fbd3b4a06107 100644 --- a/go/ql/test/query-tests/Security/CWE-117/LogInjection.go +++ b/go/ql/test/query-tests/Security/CWE-117/LogInjection.go @@ -49,22 +49,22 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { log.Printf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" log.Println("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" - if testFlag == "true" { + if testFlag == "1" { log.Fatal("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" } - if testFlag == "true" { + if testFlag == "2" { log.Fatalf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" } - if testFlag == "true" { + if testFlag == "3" { log.Fatalln("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" } - if testFlag == "true" { + if testFlag == "4" { log.Panic("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" } - if testFlag == "true" { + if testFlag == "5" { log.Panicf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" } - if testFlag == "true" { + if testFlag == "6" { log.Panicln("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" } @@ -72,12 +72,24 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { logger.Print("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" logger.Printf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" logger.Println("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" - logger.Fatal("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" - logger.Fatalf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" - logger.Fatalln("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" - logger.Panic("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" - logger.Panicf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" - logger.Panicln("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" + if testFlag == "7" { + logger.Fatal("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" + } + if testFlag == "8" { + logger.Fatalf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" + } + if testFlag == "9" { + logger.Fatalln("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" + } + if testFlag == "10" { + logger.Panic("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" + } + if testFlag == "11" { + logger.Panicf(formatString, username, password) // $ hasTaintFlow="formatString" hasTaintFlow="username" hasTaintFlow="password" + } + if testFlag == "12" { + logger.Panicln("user is logged in:", username, password) // $ hasTaintFlow="username" hasTaintFlow="password" + } } // k8s.io/klog { @@ -91,12 +103,24 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { klog.Error(username) // $ hasTaintFlow="username" klog.Errorf(username) // $ hasTaintFlow="username" klog.Errorln(username) // $ hasTaintFlow="username" - klog.Fatal(username) // $ hasTaintFlow="username" - klog.Fatalf(username) // $ hasTaintFlow="username" - klog.Fatalln(username) // $ hasTaintFlow="username" - klog.Exit(username) // $ hasTaintFlow="username" - klog.Exitf(username) // $ hasTaintFlow="username" - klog.Exitln(username) // $ hasTaintFlow="username" + if testFlag == "77" { + klog.Fatal(username) // $ hasTaintFlow="username" + } + if testFlag == "78" { + klog.Fatalf(username) // $ hasTaintFlow="username" + } + if testFlag == "79" { + klog.Fatalln(username) // $ hasTaintFlow="username" + } + if testFlag == "80" { + klog.Exit(username) // $ hasTaintFlow="username" + } + if testFlag == "81" { + klog.Exitf(username) // $ hasTaintFlow="username" + } + if testFlag == "82" { + klog.Exitln(username) // $ hasTaintFlow="username" + } } // astaxie/beego { @@ -161,14 +185,30 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { glog.ErrorDepth(0, username) // $ hasTaintFlow="username" glog.Errorf(username) // $ hasTaintFlow="username" glog.Errorln(username) // $ hasTaintFlow="username" - glog.Fatal(username) // $ hasTaintFlow="username" - glog.FatalDepth(0, username) // $ hasTaintFlow="username" - glog.Fatalf(username) // $ hasTaintFlow="username" - glog.Fatalln(username) // $ hasTaintFlow="username" - glog.Exit(username) // $ hasTaintFlow="username" - glog.ExitDepth(0, username) // $ hasTaintFlow="username" - glog.Exitf(username) // $ hasTaintFlow="username" - glog.Exitln(username) // $ hasTaintFlow="username" + if testFlag == "83" { + glog.Fatal(username) // $ hasTaintFlow="username" + } + if testFlag == "84" { + glog.FatalDepth(0, username) // $ hasTaintFlow="username" + } + if testFlag == "85" { + glog.Fatalf(username) // $ hasTaintFlow="username" + } + if testFlag == "86" { + glog.Fatalln(username) // $ hasTaintFlow="username" + } + if testFlag == "87" { + glog.Exit(username) // $ hasTaintFlow="username" + } + if testFlag == "88" { + glog.ExitDepth(0, username) // $ hasTaintFlow="username" + } + if testFlag == "89" { + glog.Exitf(username) // $ hasTaintFlow="username" + } + if testFlag == "90" { + glog.Exitln(username) // $ hasTaintFlow="username" + } } // sirupsen/logrus @@ -179,26 +219,42 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { logger := logrus.New() entry := logrus.NewEntry(logger) - logrus.Debug(username) // $ hasTaintFlow="username" - logrus.Debugf(username, "") // $ hasTaintFlow="username" - logrus.Debugf("", username) // $ hasTaintFlow="username" - logrus.Debugln(username) // $ hasTaintFlow="username" - logrus.Error(username) // $ hasTaintFlow="username" - logrus.Errorf(username, "") // $ hasTaintFlow="username" - logrus.Errorf("", username) // $ hasTaintFlow="username" - logrus.Errorln(username) // $ hasTaintFlow="username" - logrus.Fatal(username) // $ hasTaintFlow="username" - logrus.Fatalf(username, "") // $ hasTaintFlow="username" - logrus.Fatalf("", username) // $ hasTaintFlow="username" - logrus.Fatalln(username) // $ hasTaintFlow="username" - logrus.Info(username) // $ hasTaintFlow="username" - logrus.Infof(username, "") // $ hasTaintFlow="username" - logrus.Infof("", username) // $ hasTaintFlow="username" - logrus.Infoln(username) // $ hasTaintFlow="username" - logrus.Panic(username) // $ hasTaintFlow="username" - logrus.Panicf(username, "") // $ hasTaintFlow="username" - logrus.Panicf("", username) // $ hasTaintFlow="username" - logrus.Panicln(username) // $ hasTaintFlow="username" + logrus.Debug(username) // $ hasTaintFlow="username" + logrus.Debugf(username, "") // $ hasTaintFlow="username" + logrus.Debugf("", username) // $ hasTaintFlow="username" + logrus.Debugln(username) // $ hasTaintFlow="username" + logrus.Error(username) // $ hasTaintFlow="username" + logrus.Errorf(username, "") // $ hasTaintFlow="username" + logrus.Errorf("", username) // $ hasTaintFlow="username" + logrus.Errorln(username) // $ hasTaintFlow="username" + if testFlag == "13" { + logrus.Fatal(username) // $ hasTaintFlow="username" + } + if testFlag == "14" { + logrus.Fatalf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "15" { + logrus.Fatalf("", username) // $ hasTaintFlow="username" + } + if testFlag == "16" { + logrus.Fatalln(username) // $ hasTaintFlow="username" + } + logrus.Info(username) // $ hasTaintFlow="username" + logrus.Infof(username, "") // $ hasTaintFlow="username" + logrus.Infof("", username) // $ hasTaintFlow="username" + logrus.Infoln(username) // $ hasTaintFlow="username" + if testFlag == "17" { + logrus.Panic(username) // $ hasTaintFlow="username" + } + if testFlag == "18" { + logrus.Panicf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "19" { + logrus.Panicf("", username) // $ hasTaintFlow="username" + } + if testFlag == "20" { + logrus.Panicln(username) // $ hasTaintFlow="username" + } logrus.Print(username) // $ hasTaintFlow="username" logrus.Printf(username, "") // $ hasTaintFlow="username" logrus.Printf("", username) // $ hasTaintFlow="username" @@ -220,30 +276,46 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { logrus.WithField("", username) // $ hasTaintFlow="username" logrus.WithFields(fields) // $ hasTaintFlow="fields" - entry.Debug(username) // $ hasTaintFlow="username" - entry.Debugf(username, "") // $ hasTaintFlow="username" - entry.Debugf("", username) // $ hasTaintFlow="username" - entry.Debugln(username) // $ hasTaintFlow="username" - entry.Error(username) // $ hasTaintFlow="username" - entry.Errorf(username, "") // $ hasTaintFlow="username" - entry.Errorf("", username) // $ hasTaintFlow="username" - entry.Errorln(username) // $ hasTaintFlow="username" - entry.Fatal(username) // $ hasTaintFlow="username" - entry.Fatalf(username, "") // $ hasTaintFlow="username" - entry.Fatalf("", username) // $ hasTaintFlow="username" - entry.Fatalln(username) // $ hasTaintFlow="username" - entry.Info(username) // $ hasTaintFlow="username" - entry.Infof(username, "") // $ hasTaintFlow="username" - entry.Infof("", username) // $ hasTaintFlow="username" - entry.Infoln(username) // $ hasTaintFlow="username" - entry.Log(0, username) // $ hasTaintFlow="username" - entry.Logf(0, username, "") // $ hasTaintFlow="username" - entry.Logf(0, "", username) // $ hasTaintFlow="username" - entry.Logln(0, username) // $ hasTaintFlow="username" - entry.Panic(username) // $ hasTaintFlow="username" - entry.Panicf(username, "") // $ hasTaintFlow="username" - entry.Panicf("", username) // $ hasTaintFlow="username" - entry.Panicln(username) // $ hasTaintFlow="username" + entry.Debug(username) // $ hasTaintFlow="username" + entry.Debugf(username, "") // $ hasTaintFlow="username" + entry.Debugf("", username) // $ hasTaintFlow="username" + entry.Debugln(username) // $ hasTaintFlow="username" + entry.Error(username) // $ hasTaintFlow="username" + entry.Errorf(username, "") // $ hasTaintFlow="username" + entry.Errorf("", username) // $ hasTaintFlow="username" + entry.Errorln(username) // $ hasTaintFlow="username" + if testFlag == "21" { + entry.Fatal(username) // $ hasTaintFlow="username" + } + if testFlag == "22" { + entry.Fatalf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "23" { + entry.Fatalf("", username) // $ hasTaintFlow="username" + } + if testFlag == "24" { + entry.Fatalln(username) // $ hasTaintFlow="username" + } + entry.Info(username) // $ hasTaintFlow="username" + entry.Infof(username, "") // $ hasTaintFlow="username" + entry.Infof("", username) // $ hasTaintFlow="username" + entry.Infoln(username) // $ hasTaintFlow="username" + entry.Log(0, username) // $ hasTaintFlow="username" + entry.Logf(0, username, "") // $ hasTaintFlow="username" + entry.Logf(0, "", username) // $ hasTaintFlow="username" + entry.Logln(0, username) // $ hasTaintFlow="username" + if testFlag == "25" { + entry.Panic(username) // $ hasTaintFlow="username" + } + if testFlag == "26" { + entry.Panicf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "27" { + entry.Panicf("", username) // $ hasTaintFlow="username" + } + if testFlag == "28" { + entry.Panicln(username) // $ hasTaintFlow="username" + } entry.Print(username) // $ hasTaintFlow="username" entry.Printf(username, "") // $ hasTaintFlow="username" entry.Printf("", username) // $ hasTaintFlow="username" @@ -265,30 +337,46 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { entry.WithField("", username) // $ hasTaintFlow="username" entry.WithFields(fields) // $ hasTaintFlow="fields" - logger.Debug(username) // $ hasTaintFlow="username" - logger.Debugf(username, "") // $ hasTaintFlow="username" - logger.Debugf("", username) // $ hasTaintFlow="username" - logger.Debugln(username) // $ hasTaintFlow="username" - logger.Error(username) // $ hasTaintFlow="username" - logger.Errorf(username, "") // $ hasTaintFlow="username" - logger.Errorf("", username) // $ hasTaintFlow="username" - logger.Errorln(username) // $ hasTaintFlow="username" - logger.Fatal(username) // $ hasTaintFlow="username" - logger.Fatalf(username, "") // $ hasTaintFlow="username" - logger.Fatalf("", username) // $ hasTaintFlow="username" - logger.Fatalln(username) // $ hasTaintFlow="username" - logger.Info(username) // $ hasTaintFlow="username" - logger.Infof(username, "") // $ hasTaintFlow="username" - logger.Infof("", username) // $ hasTaintFlow="username" - logger.Infoln(username) // $ hasTaintFlow="username" - logger.Log(0, username) // $ hasTaintFlow="username" - logger.Logf(0, username, "") // $ hasTaintFlow="username" - logger.Logf(0, "", username) // $ hasTaintFlow="username" - logger.Logln(0, username) // $ hasTaintFlow="username" - logger.Panic(username) // $ hasTaintFlow="username" - logger.Panicf(username, "") // $ hasTaintFlow="username" - logger.Panicf("", username) // $ hasTaintFlow="username" - logger.Panicln(username) // $ hasTaintFlow="username" + logger.Debug(username) // $ hasTaintFlow="username" + logger.Debugf(username, "") // $ hasTaintFlow="username" + logger.Debugf("", username) // $ hasTaintFlow="username" + logger.Debugln(username) // $ hasTaintFlow="username" + logger.Error(username) // $ hasTaintFlow="username" + logger.Errorf(username, "") // $ hasTaintFlow="username" + logger.Errorf("", username) // $ hasTaintFlow="username" + logger.Errorln(username) // $ hasTaintFlow="username" + if testFlag == "29" { + logger.Fatal(username) // $ hasTaintFlow="username" + } + if testFlag == "30" { + logger.Fatalf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "31" { + logger.Fatalf("", username) // $ hasTaintFlow="username" + } + if testFlag == "32" { + logger.Fatalln(username) // $ hasTaintFlow="username" + } + logger.Info(username) // $ hasTaintFlow="username" + logger.Infof(username, "") // $ hasTaintFlow="username" + logger.Infof("", username) // $ hasTaintFlow="username" + logger.Infoln(username) // $ hasTaintFlow="username" + logger.Log(0, username) // $ hasTaintFlow="username" + logger.Logf(0, username, "") // $ hasTaintFlow="username" + logger.Logf(0, "", username) // $ hasTaintFlow="username" + logger.Logln(0, username) // $ hasTaintFlow="username" + if testFlag == "33" { + logger.Panic(username) // $ hasTaintFlow="username" + } + if testFlag == "34" { + logger.Panicf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "35" { + logger.Panicf("", username) // $ hasTaintFlow="username" + } + if testFlag == "36" { + logger.Panicln(username) // $ hasTaintFlow="username" + } logger.Print(username) // $ hasTaintFlow="username" logger.Printf(username, "") // $ hasTaintFlow="username" logger.Printf("", username) // $ hasTaintFlow="username" @@ -311,26 +399,42 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { logger.WithFields(fields) // $ hasTaintFlow="fields" var fieldlogger logrus.FieldLogger = entry - fieldlogger.Debug(username) // $ hasTaintFlow="username" - fieldlogger.Debugf(username, "") // $ hasTaintFlow="username" - fieldlogger.Debugf("", username) // $ hasTaintFlow="username" - fieldlogger.Debugln(username) // $ hasTaintFlow="username" - fieldlogger.Error(username) // $ hasTaintFlow="username" - fieldlogger.Errorf(username, "") // $ hasTaintFlow="username" - fieldlogger.Errorf("", username) // $ hasTaintFlow="username" - fieldlogger.Errorln(username) // $ hasTaintFlow="username" - fieldlogger.Fatal(username) // $ hasTaintFlow="username" - fieldlogger.Fatalf(username, "") // $ hasTaintFlow="username" - fieldlogger.Fatalf("", username) // $ hasTaintFlow="username" - fieldlogger.Fatalln(username) // $ hasTaintFlow="username" - fieldlogger.Info(username) // $ hasTaintFlow="username" - fieldlogger.Infof(username, "") // $ hasTaintFlow="username" - fieldlogger.Infof("", username) // $ hasTaintFlow="username" - fieldlogger.Infoln(username) // $ hasTaintFlow="username" - fieldlogger.Panic(username) // $ hasTaintFlow="username" - fieldlogger.Panicf(username, "") // $ hasTaintFlow="username" - fieldlogger.Panicf("", username) // $ hasTaintFlow="username" - fieldlogger.Panicln(username) // $ hasTaintFlow="username" + fieldlogger.Debug(username) // $ hasTaintFlow="username" + fieldlogger.Debugf(username, "") // $ hasTaintFlow="username" + fieldlogger.Debugf("", username) // $ hasTaintFlow="username" + fieldlogger.Debugln(username) // $ hasTaintFlow="username" + fieldlogger.Error(username) // $ hasTaintFlow="username" + fieldlogger.Errorf(username, "") // $ hasTaintFlow="username" + fieldlogger.Errorf("", username) // $ hasTaintFlow="username" + fieldlogger.Errorln(username) // $ hasTaintFlow="username" + if testFlag == "37" { + fieldlogger.Fatal(username) // $ hasTaintFlow="username" + } + if testFlag == "38" { + fieldlogger.Fatalf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "39" { + fieldlogger.Fatalf("", username) // $ hasTaintFlow="username" + } + if testFlag == "40" { + fieldlogger.Fatalln(username) // $ hasTaintFlow="username" + } + fieldlogger.Info(username) // $ hasTaintFlow="username" + fieldlogger.Infof(username, "") // $ hasTaintFlow="username" + fieldlogger.Infof("", username) // $ hasTaintFlow="username" + fieldlogger.Infoln(username) // $ hasTaintFlow="username" + if testFlag == "41" { + fieldlogger.Panic(username) // $ hasTaintFlow="username" + } + if testFlag == "42" { + fieldlogger.Panicf(username, "") // $ hasTaintFlow="username" + } + if testFlag == "43" { + fieldlogger.Panicf("", username) // $ hasTaintFlow="username" + } + if testFlag == "44" { + fieldlogger.Panicln(username) // $ hasTaintFlow="username" + } fieldlogger.Print(username) // $ hasTaintFlow="username" fieldlogger.Printf(username, "") // $ hasTaintFlow="username" fieldlogger.Printf("", username) // $ hasTaintFlow="username" @@ -366,11 +470,11 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { logger.DPanic(username) // $ hasTaintFlow="username" logger.Debug(username) // $ hasTaintFlow="username" logger.Error(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "45" { logger.Fatal(username) // $ hasTaintFlow="username" } logger.Info(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "46" { logger.Panic(username) // $ hasTaintFlow="username" } logger.Warn(username) // $ hasTaintFlow="username" @@ -382,33 +486,33 @@ func handler(req *http.Request, ctx *goproxy.ProxyCtx) { sLogger.DPanic(username) // $ hasTaintFlow="username" sLogger.Debug(username) // $ hasTaintFlow="username" sLogger.Error(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "47" { sLogger.Fatal(username) // $ hasTaintFlow="username" } sLogger.Info(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "48" { sLogger.Panic(username) // $ hasTaintFlow="username" } sLogger.Warn(username) // $ hasTaintFlow="username" sLogger.DPanicf(username) // $ hasTaintFlow="username" sLogger.Debugf(username) // $ hasTaintFlow="username" sLogger.Errorf(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "49" { sLogger.Fatalf(username) // $ hasTaintFlow="username" } sLogger.Infof(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "50" { sLogger.Panicf(username) // $ hasTaintFlow="username" } sLogger.Warnf(username) // $ hasTaintFlow="username" sLogger.DPanicw(username) // $ hasTaintFlow="username" sLogger.Debugw(username) // $ hasTaintFlow="username" sLogger.Errorw(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "51" { sLogger.Fatalw(username) // $ hasTaintFlow="username" } sLogger.Infow(username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "52" { sLogger.Panicw(username) // $ hasTaintFlow="username" } sLogger.Warnw(username) // $ hasTaintFlow="username" @@ -515,10 +619,10 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { verbose.Infof("user %q logged in.\n", username) klog.Infof("user %q logged in.\n", username) klog.Errorf("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "53" { klog.Fatalf("user %q logged in.\n", username) } - if testFlag == " true" { + if testFlag == "54" { klog.Exitf("user %q logged in.\n", username) } } @@ -534,10 +638,10 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { glog.Infof("user %q logged in.\n", username) glog.Errorf("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "55" { glog.Fatalf("user %q logged in.\n", username) } - if testFlag == " true" { + if testFlag == "56" { glog.Exitf("user %q logged in.\n", username) } } @@ -545,11 +649,11 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { { logrus.Debugf("user %q logged in.\n", username) logrus.Errorf("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "57" { logrus.Fatalf("user %q logged in.\n", username) } logrus.Infof("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "58" { logrus.Panicf("user %q logged in.\n", username) } logrus.Printf("user %q logged in.\n", username) @@ -561,12 +665,12 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { entry := logrus.WithFields(fields) entry.Debugf("user %q logged in.\n", username) entry.Errorf("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "59" { entry.Fatalf("user %q logged in.\n", username) } entry.Infof("user %q logged in.\n", username) entry.Logf(0, "user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "60" { entry.Panicf("user %q logged in.\n", username) } entry.Printf("user %q logged in.\n", username) @@ -577,12 +681,12 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { logger := entry.Logger logger.Debugf("user %q logged in.\n", username) logger.Errorf("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "61" { logger.Fatalf("user %q logged in.\n", username) } logger.Infof("user %q logged in.\n", username) logger.Logf(0, "user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "62" { logger.Panicf("user %q logged in.\n", username) } logger.Printf("user %q logged in.\n", username) @@ -603,11 +707,11 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { sLogger.DPanicf("user %q logged in.\n", username) sLogger.Debugf("user %q logged in.\n", username) sLogger.Errorf("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "63" { sLogger.Fatalf("user %q logged in.\n", username) } sLogger.Infof("user %q logged in.\n", username) - if testFlag == " true" { + if testFlag == "64" { sLogger.Panicf("user %q logged in.\n", username) } sLogger.Warnf("user %q logged in.\n", username) @@ -620,10 +724,10 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { verbose.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" klog.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" klog.Errorf("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "65" { klog.Fatalf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } - if testFlag == " true" { + if testFlag == "66" { klog.Exitf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } } @@ -639,10 +743,10 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { glog.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" glog.Errorf("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "67" { glog.Fatalf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } - if testFlag == " true" { + if testFlag == "68" { glog.Exitf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } } @@ -650,11 +754,11 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { { logrus.Debugf("user %#q logged in.\n", username) // $ hasTaintFlow="username" logrus.Errorf("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "69" { logrus.Fatalf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } logrus.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "70" { logrus.Panicf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } logrus.Printf("user %#q logged in.\n", username) // $ hasTaintFlow="username" @@ -666,12 +770,12 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { entry := logrus.WithFields(fields) entry.Debugf("user %#q logged in.\n", username) // $ hasTaintFlow="username" entry.Errorf("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "71" { entry.Fatalf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } entry.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" entry.Logf(0, "user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "72" { entry.Panicf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } entry.Printf("user %#q logged in.\n", username) // $ hasTaintFlow="username" @@ -682,12 +786,12 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { logger := entry.Logger logger.Debugf("user %#q logged in.\n", username) // $ hasTaintFlow="username" logger.Errorf("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "73" { logger.Fatalf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } logger.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" logger.Logf(0, "user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "74" { logger.Panicf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } logger.Printf("user %#q logged in.\n", username) // $ hasTaintFlow="username" @@ -708,11 +812,11 @@ func handlerGood4(req *http.Request, ctx *goproxy.ProxyCtx) { sLogger.DPanicf("user %#q logged in.\n", username) // $ hasTaintFlow="username" sLogger.Debugf("user %#q logged in.\n", username) // $ hasTaintFlow="username" sLogger.Errorf("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "75" { sLogger.Fatalf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } sLogger.Infof("user %#q logged in.\n", username) // $ hasTaintFlow="username" - if testFlag == " true" { + if testFlag == "76" { sLogger.Panicf("user %#q logged in.\n", username) // $ hasTaintFlow="username" } sLogger.Warnf("user %#q logged in.\n", username) // $ hasTaintFlow="username" diff --git a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected index f748c7a77738..66392b22752d 100644 --- a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected +++ b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected @@ -37,22 +37,22 @@ | passwords.go:26:14:26:23 | selection of password | passwords.go:26:14:26:23 | selection of password | passwords.go:26:14:26:23 | selection of password | $@ flows to a logging call. | passwords.go:26:14:26:23 | selection of password | Sensitive data returned by an access to password | | passwords.go:27:14:27:26 | call to getPassword | passwords.go:27:14:27:26 | call to getPassword | passwords.go:27:14:27:26 | call to getPassword | $@ flows to a logging call. | passwords.go:27:14:27:26 | call to getPassword | Sensitive data returned by a call to getPassword | | passwords.go:28:14:28:28 | call to getPassword | passwords.go:28:14:28:28 | call to getPassword | passwords.go:28:14:28:28 | call to getPassword | $@ flows to a logging call. | passwords.go:28:14:28:28 | call to getPassword | Sensitive data returned by a call to getPassword | -| passwords.go:32:12:32:19 | password | passwords.go:21:2:21:9 | definition of password | passwords.go:32:12:32:19 | password | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:34:14:34:35 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:34:14:34:35 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:39:14:39:17 | obj1 | passwords.go:37:13:37:13 | x | passwords.go:39:14:39:17 | obj1 | $@ flows to a logging call. | passwords.go:37:13:37:13 | x | Sensitive data returned by an access to password | -| passwords.go:44:14:44:17 | obj2 | passwords.go:21:2:21:9 | definition of password | passwords.go:44:14:44:17 | obj2 | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:51:14:51:27 | fixed_password | passwords.go:50:2:50:15 | definition of fixed_password | passwords.go:51:14:51:27 | fixed_password | $@ flows to a logging call. | passwords.go:50:2:50:15 | definition of fixed_password | Sensitive data returned by an access to fixed_password | -| passwords.go:89:14:89:26 | utilityObject | passwords.go:87:16:87:36 | call to make | passwords.go:89:14:89:26 | utilityObject | $@ flows to a logging call. | passwords.go:87:16:87:36 | call to make | Sensitive data returned by an access to passwordSet | -| passwords.go:92:23:92:28 | secret | passwords.go:21:2:21:9 | definition of password | passwords.go:92:23:92:28 | secret | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:102:15:102:40 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:102:15:102:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:108:16:108:41 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:108:16:108:41 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:113:15:113:40 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:113:15:113:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:117:14:117:45 | ...+... | passwords.go:116:6:116:14 | definition of password1 | passwords.go:117:14:117:45 | ...+... | $@ flows to a logging call. | passwords.go:116:6:116:14 | definition of password1 | Sensitive data returned by an access to password1 | -| passwords.go:127:14:127:19 | config | passwords.go:21:2:21:9 | definition of password | passwords.go:127:14:127:19 | config | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:127:14:127:19 | config | passwords.go:121:13:121:14 | x3 | passwords.go:127:14:127:19 | config | $@ flows to a logging call. | passwords.go:121:13:121:14 | x3 | Sensitive data returned by an access to password | -| passwords.go:127:14:127:19 | config | passwords.go:124:13:124:25 | call to getPassword | passwords.go:127:14:127:19 | config | $@ flows to a logging call. | passwords.go:124:13:124:25 | call to getPassword | Sensitive data returned by a call to getPassword | -| passwords.go:128:14:128:21 | selection of x | passwords.go:21:2:21:9 | definition of password | passwords.go:128:14:128:21 | selection of x | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | -| passwords.go:129:14:129:21 | selection of y | passwords.go:124:13:124:25 | call to getPassword | passwords.go:129:14:129:21 | selection of y | $@ flows to a logging call. | passwords.go:124:13:124:25 | call to getPassword | Sensitive data returned by a call to getPassword | +| passwords.go:33:13:33:20 | password | passwords.go:21:2:21:9 | definition of password | passwords.go:33:13:33:20 | password | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:36:14:36:35 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:36:14:36:35 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:41:14:41:17 | obj1 | passwords.go:39:13:39:13 | x | passwords.go:41:14:41:17 | obj1 | $@ flows to a logging call. | passwords.go:39:13:39:13 | x | Sensitive data returned by an access to password | +| passwords.go:46:14:46:17 | obj2 | passwords.go:21:2:21:9 | definition of password | passwords.go:46:14:46:17 | obj2 | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:53:14:53:27 | fixed_password | passwords.go:52:2:52:15 | definition of fixed_password | passwords.go:53:14:53:27 | fixed_password | $@ flows to a logging call. | passwords.go:52:2:52:15 | definition of fixed_password | Sensitive data returned by an access to fixed_password | +| passwords.go:91:14:91:26 | utilityObject | passwords.go:89:16:89:36 | call to make | passwords.go:91:14:91:26 | utilityObject | $@ flows to a logging call. | passwords.go:89:16:89:36 | call to make | Sensitive data returned by an access to passwordSet | +| passwords.go:94:23:94:28 | secret | passwords.go:21:2:21:9 | definition of password | passwords.go:94:23:94:28 | secret | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:104:15:104:40 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:104:15:104:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:110:16:110:41 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:110:16:110:41 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:115:15:115:40 | ...+... | passwords.go:21:2:21:9 | definition of password | passwords.go:115:15:115:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:119:14:119:45 | ...+... | passwords.go:118:6:118:14 | definition of password1 | passwords.go:119:14:119:45 | ...+... | $@ flows to a logging call. | passwords.go:118:6:118:14 | definition of password1 | Sensitive data returned by an access to password1 | +| passwords.go:129:14:129:19 | config | passwords.go:21:2:21:9 | definition of password | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:129:14:129:19 | config | passwords.go:123:13:123:14 | x3 | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:123:13:123:14 | x3 | Sensitive data returned by an access to password | +| passwords.go:129:14:129:19 | config | passwords.go:126:13:126:25 | call to getPassword | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:126:13:126:25 | call to getPassword | Sensitive data returned by a call to getPassword | +| passwords.go:130:14:130:21 | selection of x | passwords.go:21:2:21:9 | definition of password | passwords.go:130:14:130:21 | selection of x | $@ flows to a logging call. | passwords.go:21:2:21:9 | definition of password | Sensitive data returned by an access to password | +| passwords.go:131:14:131:21 | selection of y | passwords.go:126:13:126:25 | call to getPassword | passwords.go:131:14:131:21 | selection of y | $@ flows to a logging call. | passwords.go:126:13:126:25 | call to getPassword | Sensitive data returned by a call to getPassword | | protobuf.go:14:14:14:35 | call to GetDescription | protobuf.go:9:2:9:9 | definition of password | protobuf.go:14:14:14:35 | call to GetDescription | $@ flows to a logging call. | protobuf.go:9:2:9:9 | definition of password | Sensitive data returned by an access to password | edges | klog.go:21:3:26:3 | range statement[1] | klog.go:22:27:22:33 | headers | provenance | | @@ -82,95 +82,15 @@ edges | main.go:53:11:53:18 | password | main.go:54:12:54:19 | password | provenance | | | main.go:53:11:53:18 | password | main.go:54:12:54:19 | password | provenance | | | main.go:54:12:54:19 | password | main.go:56:11:56:18 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:56:11:56:18 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:59:18:59:25 | password | provenance | | | main.go:54:12:54:19 | password | main.go:59:18:59:25 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:62:12:62:19 | password | provenance | | | main.go:54:12:54:19 | password | main.go:62:12:62:19 | password | provenance | Sink:MaD:7 | | main.go:54:12:54:19 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:68:11:68:18 | password | provenance | | | main.go:54:12:54:19 | password | main.go:68:11:68:18 | password | provenance | | | main.go:54:12:54:19 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:74:12:74:19 | password | provenance | | | main.go:54:12:54:19 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | | main.go:54:12:54:19 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:54:12:54:19 | password | main.go:77:13:77:20 | password | provenance | | | main.go:54:12:54:19 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | | main.go:54:12:54:19 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:59:18:59:25 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:59:18:59:25 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:62:12:62:19 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:62:12:62:19 | password | provenance | Sink:MaD:7 | -| main.go:56:11:56:18 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:74:12:74:19 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | -| main.go:56:11:56:18 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:56:11:56:18 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:56:11:56:18 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:62:12:62:19 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:62:12:62:19 | password | provenance | Sink:MaD:7 | -| main.go:59:18:59:25 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:74:12:74:19 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | -| main.go:59:18:59:25 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:59:18:59:25 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:59:18:59:25 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:65:13:65:20 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:74:12:74:19 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | -| main.go:62:12:62:19 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:62:12:62:19 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:62:12:62:19 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:68:11:68:18 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:74:12:74:19 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | -| main.go:65:13:65:20 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:65:13:65:20 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:65:13:65:20 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:68:11:68:18 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:68:11:68:18 | password | main.go:71:18:71:25 | password | provenance | | -| main.go:68:11:68:18 | password | main.go:74:12:74:19 | password | provenance | | -| main.go:68:11:68:18 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | -| main.go:68:11:68:18 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:68:11:68:18 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:68:11:68:18 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:68:11:68:18 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:71:18:71:25 | password | main.go:74:12:74:19 | password | provenance | | -| main.go:71:18:71:25 | password | main.go:74:12:74:19 | password | provenance | Sink:MaD:9 | -| main.go:71:18:71:25 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:71:18:71:25 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:71:18:71:25 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:71:18:71:25 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:74:12:74:19 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:74:12:74:19 | password | main.go:77:13:77:20 | password | provenance | | -| main.go:74:12:74:19 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:74:12:74:19 | password | main.go:80:17:80:24 | password | provenance | | -| main.go:77:13:77:20 | password | main.go:79:14:79:21 | password | provenance | Sink:MaD:8 | -| main.go:77:13:77:20 | password | main.go:80:17:80:24 | password | provenance | | | main.go:80:17:80:24 | password | main.go:82:12:82:19 | password | provenance | | | main.go:80:17:80:24 | password | main.go:83:17:83:24 | password | provenance | | | main.go:80:17:80:24 | password | main.go:86:19:86:26 | password | provenance | | @@ -182,46 +102,46 @@ edges | passwords.go:8:12:8:12 | definition of x | passwords.go:9:14:9:14 | x | provenance | | | passwords.go:21:2:21:9 | definition of password | passwords.go:25:14:25:21 | password | provenance | | | passwords.go:21:2:21:9 | definition of password | passwords.go:30:8:30:15 | password | provenance | | -| passwords.go:21:2:21:9 | definition of password | passwords.go:32:12:32:19 | password | provenance | | -| passwords.go:21:2:21:9 | definition of password | passwords.go:34:28:34:35 | password | provenance | | +| passwords.go:21:2:21:9 | definition of password | passwords.go:33:13:33:20 | password | provenance | | +| passwords.go:21:2:21:9 | definition of password | passwords.go:36:28:36:35 | password | provenance | | | passwords.go:30:8:30:15 | password | passwords.go:8:12:8:12 | definition of x | provenance | | -| passwords.go:34:28:34:35 | password | passwords.go:34:14:34:35 | ...+... | provenance | Config | -| passwords.go:34:28:34:35 | password | passwords.go:42:6:42:13 | password | provenance | | -| passwords.go:36:10:38:2 | struct literal | passwords.go:39:14:39:17 | obj1 | provenance | | -| passwords.go:37:13:37:13 | x | passwords.go:36:10:38:2 | struct literal | provenance | Config | -| passwords.go:41:10:43:2 | struct literal | passwords.go:44:14:44:17 | obj2 | provenance | | -| passwords.go:42:6:42:13 | password | passwords.go:41:10:43:2 | struct literal | provenance | Config | -| passwords.go:42:6:42:13 | password | passwords.go:48:11:48:18 | password | provenance | | -| passwords.go:48:11:48:18 | password | passwords.go:92:23:92:28 | secret | provenance | | -| passwords.go:48:11:48:18 | password | passwords.go:102:33:102:40 | password | provenance | | -| passwords.go:48:11:48:18 | password | passwords.go:108:34:108:41 | password | provenance | | -| passwords.go:48:11:48:18 | password | passwords.go:113:33:113:40 | password | provenance | | -| passwords.go:48:11:48:18 | password | passwords.go:123:13:123:20 | password | provenance | | -| passwords.go:50:2:50:15 | definition of fixed_password | passwords.go:51:14:51:27 | fixed_password | provenance | | -| passwords.go:86:19:88:2 | struct literal | passwords.go:89:14:89:26 | utilityObject | provenance | | -| passwords.go:87:16:87:36 | call to make | passwords.go:86:19:88:2 | struct literal | provenance | Config | -| passwords.go:102:33:102:40 | password | passwords.go:102:15:102:40 | ...+... | provenance | Config | -| passwords.go:102:33:102:40 | password | passwords.go:108:34:108:41 | password | provenance | | -| passwords.go:102:33:102:40 | password | passwords.go:113:33:113:40 | password | provenance | | -| passwords.go:102:33:102:40 | password | passwords.go:123:13:123:20 | password | provenance | | -| passwords.go:108:34:108:41 | password | passwords.go:108:16:108:41 | ...+... | provenance | Config | -| passwords.go:108:34:108:41 | password | passwords.go:113:33:113:40 | password | provenance | | -| passwords.go:108:34:108:41 | password | passwords.go:123:13:123:20 | password | provenance | | -| passwords.go:113:33:113:40 | password | passwords.go:113:15:113:40 | ...+... | provenance | Config | -| passwords.go:113:33:113:40 | password | passwords.go:123:13:123:20 | password | provenance | | -| passwords.go:116:6:116:14 | definition of password1 | passwords.go:117:28:117:36 | password1 | provenance | | -| passwords.go:117:28:117:36 | password1 | passwords.go:117:28:117:45 | call to String | provenance | Config | -| passwords.go:117:28:117:45 | call to String | passwords.go:117:14:117:45 | ...+... | provenance | Config | -| passwords.go:120:12:125:2 | struct literal | passwords.go:127:14:127:19 | config | provenance | | -| passwords.go:120:12:125:2 | struct literal [x] | passwords.go:128:14:128:19 | config [x] | provenance | | -| passwords.go:120:12:125:2 | struct literal [y] | passwords.go:129:14:129:19 | config [y] | provenance | | -| passwords.go:121:13:121:14 | x3 | passwords.go:120:12:125:2 | struct literal | provenance | Config | -| passwords.go:123:13:123:20 | password | passwords.go:120:12:125:2 | struct literal | provenance | Config | -| passwords.go:123:13:123:20 | password | passwords.go:120:12:125:2 | struct literal [x] | provenance | | -| passwords.go:124:13:124:25 | call to getPassword | passwords.go:120:12:125:2 | struct literal | provenance | Config | -| passwords.go:124:13:124:25 | call to getPassword | passwords.go:120:12:125:2 | struct literal [y] | provenance | | -| passwords.go:128:14:128:19 | config [x] | passwords.go:128:14:128:21 | selection of x | provenance | | -| passwords.go:129:14:129:19 | config [y] | passwords.go:129:14:129:21 | selection of y | provenance | | +| passwords.go:36:28:36:35 | password | passwords.go:36:14:36:35 | ...+... | provenance | Config | +| passwords.go:36:28:36:35 | password | passwords.go:44:6:44:13 | password | provenance | | +| passwords.go:38:10:40:2 | struct literal | passwords.go:41:14:41:17 | obj1 | provenance | | +| passwords.go:39:13:39:13 | x | passwords.go:38:10:40:2 | struct literal | provenance | Config | +| passwords.go:43:10:45:2 | struct literal | passwords.go:46:14:46:17 | obj2 | provenance | | +| passwords.go:44:6:44:13 | password | passwords.go:43:10:45:2 | struct literal | provenance | Config | +| passwords.go:44:6:44:13 | password | passwords.go:50:11:50:18 | password | provenance | | +| passwords.go:50:11:50:18 | password | passwords.go:94:23:94:28 | secret | provenance | | +| passwords.go:50:11:50:18 | password | passwords.go:104:33:104:40 | password | provenance | | +| passwords.go:50:11:50:18 | password | passwords.go:110:34:110:41 | password | provenance | | +| passwords.go:50:11:50:18 | password | passwords.go:115:33:115:40 | password | provenance | | +| passwords.go:50:11:50:18 | password | passwords.go:125:13:125:20 | password | provenance | | +| passwords.go:52:2:52:15 | definition of fixed_password | passwords.go:53:14:53:27 | fixed_password | provenance | | +| passwords.go:88:19:90:2 | struct literal | passwords.go:91:14:91:26 | utilityObject | provenance | | +| passwords.go:89:16:89:36 | call to make | passwords.go:88:19:90:2 | struct literal | provenance | Config | +| passwords.go:104:33:104:40 | password | passwords.go:104:15:104:40 | ...+... | provenance | Config | +| passwords.go:104:33:104:40 | password | passwords.go:110:34:110:41 | password | provenance | | +| passwords.go:104:33:104:40 | password | passwords.go:115:33:115:40 | password | provenance | | +| passwords.go:104:33:104:40 | password | passwords.go:125:13:125:20 | password | provenance | | +| passwords.go:110:34:110:41 | password | passwords.go:110:16:110:41 | ...+... | provenance | Config | +| passwords.go:110:34:110:41 | password | passwords.go:115:33:115:40 | password | provenance | | +| passwords.go:110:34:110:41 | password | passwords.go:125:13:125:20 | password | provenance | | +| passwords.go:115:33:115:40 | password | passwords.go:115:15:115:40 | ...+... | provenance | Config | +| passwords.go:115:33:115:40 | password | passwords.go:125:13:125:20 | password | provenance | | +| passwords.go:118:6:118:14 | definition of password1 | passwords.go:119:28:119:36 | password1 | provenance | | +| passwords.go:119:28:119:36 | password1 | passwords.go:119:28:119:45 | call to String | provenance | Config | +| passwords.go:119:28:119:45 | call to String | passwords.go:119:14:119:45 | ...+... | provenance | Config | +| passwords.go:122:12:127:2 | struct literal | passwords.go:129:14:129:19 | config | provenance | | +| passwords.go:122:12:127:2 | struct literal [x] | passwords.go:130:14:130:19 | config [x] | provenance | | +| passwords.go:122:12:127:2 | struct literal [y] | passwords.go:131:14:131:19 | config [y] | provenance | | +| passwords.go:123:13:123:14 | x3 | passwords.go:122:12:127:2 | struct literal | provenance | Config | +| passwords.go:125:13:125:20 | password | passwords.go:122:12:127:2 | struct literal | provenance | Config | +| passwords.go:125:13:125:20 | password | passwords.go:122:12:127:2 | struct literal [x] | provenance | | +| passwords.go:126:13:126:25 | call to getPassword | passwords.go:122:12:127:2 | struct literal | provenance | Config | +| passwords.go:126:13:126:25 | call to getPassword | passwords.go:122:12:127:2 | struct literal [y] | provenance | | +| passwords.go:130:14:130:19 | config [x] | passwords.go:130:14:130:21 | selection of x | provenance | | +| passwords.go:131:14:131:19 | config [y] | passwords.go:131:14:131:21 | selection of y | provenance | | | protobuf.go:9:2:9:9 | definition of password | protobuf.go:12:22:12:29 | password | provenance | | | protobuf.go:12:2:12:6 | implicit dereference [postupdate] [Description] | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | provenance | | | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | protobuf.go:14:14:14:18 | query [pointer, Description] | provenance | | @@ -274,21 +194,13 @@ nodes | main.go:54:12:54:19 | password | semmle.label | password | | main.go:54:12:54:19 | password | semmle.label | password | | main.go:56:11:56:18 | password | semmle.label | password | -| main.go:56:11:56:18 | password | semmle.label | password | | main.go:59:18:59:25 | password | semmle.label | password | -| main.go:59:18:59:25 | password | semmle.label | password | -| main.go:62:12:62:19 | password | semmle.label | password | | main.go:62:12:62:19 | password | semmle.label | password | | main.go:65:13:65:20 | password | semmle.label | password | -| main.go:65:13:65:20 | password | semmle.label | password | -| main.go:68:11:68:18 | password | semmle.label | password | | main.go:68:11:68:18 | password | semmle.label | password | | main.go:71:18:71:25 | password | semmle.label | password | -| main.go:71:18:71:25 | password | semmle.label | password | -| main.go:74:12:74:19 | password | semmle.label | password | | main.go:74:12:74:19 | password | semmle.label | password | | main.go:77:13:77:20 | password | semmle.label | password | -| main.go:77:13:77:20 | password | semmle.label | password | | main.go:79:14:79:21 | password | semmle.label | password | | main.go:80:17:80:24 | password | semmle.label | password | | main.go:82:12:82:19 | password | semmle.label | password | @@ -308,43 +220,43 @@ nodes | passwords.go:27:14:27:26 | call to getPassword | semmle.label | call to getPassword | | passwords.go:28:14:28:28 | call to getPassword | semmle.label | call to getPassword | | passwords.go:30:8:30:15 | password | semmle.label | password | -| passwords.go:32:12:32:19 | password | semmle.label | password | -| passwords.go:34:14:34:35 | ...+... | semmle.label | ...+... | -| passwords.go:34:28:34:35 | password | semmle.label | password | -| passwords.go:36:10:38:2 | struct literal | semmle.label | struct literal | -| passwords.go:37:13:37:13 | x | semmle.label | x | -| passwords.go:39:14:39:17 | obj1 | semmle.label | obj1 | -| passwords.go:41:10:43:2 | struct literal | semmle.label | struct literal | -| passwords.go:42:6:42:13 | password | semmle.label | password | -| passwords.go:44:14:44:17 | obj2 | semmle.label | obj2 | -| passwords.go:48:11:48:18 | password | semmle.label | password | -| passwords.go:50:2:50:15 | definition of fixed_password | semmle.label | definition of fixed_password | -| passwords.go:51:14:51:27 | fixed_password | semmle.label | fixed_password | -| passwords.go:86:19:88:2 | struct literal | semmle.label | struct literal | -| passwords.go:87:16:87:36 | call to make | semmle.label | call to make | -| passwords.go:89:14:89:26 | utilityObject | semmle.label | utilityObject | -| passwords.go:92:23:92:28 | secret | semmle.label | secret | -| passwords.go:102:15:102:40 | ...+... | semmle.label | ...+... | -| passwords.go:102:33:102:40 | password | semmle.label | password | -| passwords.go:108:16:108:41 | ...+... | semmle.label | ...+... | -| passwords.go:108:34:108:41 | password | semmle.label | password | -| passwords.go:113:15:113:40 | ...+... | semmle.label | ...+... | -| passwords.go:113:33:113:40 | password | semmle.label | password | -| passwords.go:116:6:116:14 | definition of password1 | semmle.label | definition of password1 | -| passwords.go:117:14:117:45 | ...+... | semmle.label | ...+... | -| passwords.go:117:28:117:36 | password1 | semmle.label | password1 | -| passwords.go:117:28:117:45 | call to String | semmle.label | call to String | -| passwords.go:120:12:125:2 | struct literal | semmle.label | struct literal | -| passwords.go:120:12:125:2 | struct literal [x] | semmle.label | struct literal [x] | -| passwords.go:120:12:125:2 | struct literal [y] | semmle.label | struct literal [y] | -| passwords.go:121:13:121:14 | x3 | semmle.label | x3 | -| passwords.go:123:13:123:20 | password | semmle.label | password | -| passwords.go:124:13:124:25 | call to getPassword | semmle.label | call to getPassword | -| passwords.go:127:14:127:19 | config | semmle.label | config | -| passwords.go:128:14:128:19 | config [x] | semmle.label | config [x] | -| passwords.go:128:14:128:21 | selection of x | semmle.label | selection of x | -| passwords.go:129:14:129:19 | config [y] | semmle.label | config [y] | -| passwords.go:129:14:129:21 | selection of y | semmle.label | selection of y | +| passwords.go:33:13:33:20 | password | semmle.label | password | +| passwords.go:36:14:36:35 | ...+... | semmle.label | ...+... | +| passwords.go:36:28:36:35 | password | semmle.label | password | +| passwords.go:38:10:40:2 | struct literal | semmle.label | struct literal | +| passwords.go:39:13:39:13 | x | semmle.label | x | +| passwords.go:41:14:41:17 | obj1 | semmle.label | obj1 | +| passwords.go:43:10:45:2 | struct literal | semmle.label | struct literal | +| passwords.go:44:6:44:13 | password | semmle.label | password | +| passwords.go:46:14:46:17 | obj2 | semmle.label | obj2 | +| passwords.go:50:11:50:18 | password | semmle.label | password | +| passwords.go:52:2:52:15 | definition of fixed_password | semmle.label | definition of fixed_password | +| passwords.go:53:14:53:27 | fixed_password | semmle.label | fixed_password | +| passwords.go:88:19:90:2 | struct literal | semmle.label | struct literal | +| passwords.go:89:16:89:36 | call to make | semmle.label | call to make | +| passwords.go:91:14:91:26 | utilityObject | semmle.label | utilityObject | +| passwords.go:94:23:94:28 | secret | semmle.label | secret | +| passwords.go:104:15:104:40 | ...+... | semmle.label | ...+... | +| passwords.go:104:33:104:40 | password | semmle.label | password | +| passwords.go:110:16:110:41 | ...+... | semmle.label | ...+... | +| passwords.go:110:34:110:41 | password | semmle.label | password | +| passwords.go:115:15:115:40 | ...+... | semmle.label | ...+... | +| passwords.go:115:33:115:40 | password | semmle.label | password | +| passwords.go:118:6:118:14 | definition of password1 | semmle.label | definition of password1 | +| passwords.go:119:14:119:45 | ...+... | semmle.label | ...+... | +| passwords.go:119:28:119:36 | password1 | semmle.label | password1 | +| passwords.go:119:28:119:45 | call to String | semmle.label | call to String | +| passwords.go:122:12:127:2 | struct literal | semmle.label | struct literal | +| passwords.go:122:12:127:2 | struct literal [x] | semmle.label | struct literal [x] | +| passwords.go:122:12:127:2 | struct literal [y] | semmle.label | struct literal [y] | +| passwords.go:123:13:123:14 | x3 | semmle.label | x3 | +| passwords.go:125:13:125:20 | password | semmle.label | password | +| passwords.go:126:13:126:25 | call to getPassword | semmle.label | call to getPassword | +| passwords.go:129:14:129:19 | config | semmle.label | config | +| passwords.go:130:14:130:19 | config [x] | semmle.label | config [x] | +| passwords.go:130:14:130:21 | selection of x | semmle.label | selection of x | +| passwords.go:131:14:131:19 | config [y] | semmle.label | config [y] | +| passwords.go:131:14:131:21 | selection of y | semmle.label | selection of y | | protobuf.go:9:2:9:9 | definition of password | semmle.label | definition of password | | protobuf.go:12:2:12:6 | implicit dereference [postupdate] [Description] | semmle.label | implicit dereference [postupdate] [Description] | | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | semmle.label | query [postupdate] [pointer, Description] | diff --git a/go/ql/test/query-tests/Security/CWE-312/passwords.go b/go/ql/test/query-tests/Security/CWE-312/passwords.go index 38c977e41b83..dc569970a397 100644 --- a/go/ql/test/query-tests/Security/CWE-312/passwords.go +++ b/go/ql/test/query-tests/Security/CWE-312/passwords.go @@ -16,7 +16,7 @@ func redact(kind, value string) string { return value } -func test() { +func test(selector int) { name := "user" password := "P@ssw0rd" // $ Source x := "horsebatterystapleincorrect" @@ -29,7 +29,9 @@ func test() { myLog(password) - log.Panic(password) // $ Alert + if selector == 1 { + log.Panic(password) // $ Alert + } log.Println(name + ", " + password) // $ Alert diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index f99bbd1ed975..389a84f1d164 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -1,296 +1,297 @@ -package,sink,source,summary,sink:bean-validation,sink:command-injection,sink:credentials-key,sink:credentials-password,sink:credentials-username,sink:encryption-iv,sink:encryption-salt,sink:environment-injection,sink:file-content-store,sink:fragment-injection,sink:groovy-injection,sink:hostname-verification,sink:html-injection,sink:information-leak,sink:intent-redirection,sink:jexl-injection,sink:jndi-injection,sink:js-injection,sink:ldap-injection,sink:log-injection,sink:mvel-injection,sink:notification,sink:ognl-injection,sink:path-injection,sink:path-injection[read],sink:pending-intents,sink:regex-use,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:request-forgery,sink:response-splitting,sink:sql-injection,sink:template-injection,sink:trust-boundary-violation,sink:unsafe-deserialization,sink:url-forward,sink:url-redirection,sink:xpath-injection,sink:xslt-injection,source:android-external-storage-dir,source:contentprovider,source:database,source:environment,source:file,source:remote,summary:taint,summary:value -actions.osgi,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, -android.app,77,,103,,,,,,,,,,11,,,,,7,,,,,,,42,,,,17,,,,,,,,,,,,,,,,,,,,,,,,18,85 -android.content,24,31,154,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,4,27,,,,,63,91 -android.database,59,,41,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,,,41, -android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15 -android.os,1,2,122,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,2,,,,,,41,81 -android.support.v4.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -android.util,6,16,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,16,, -android.webkit,3,2,,,,,,,,,,,,,,2,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, -android.widget,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1, -androidx.core.app,47,,95,,,,,,,,,,,,,,,,,,,,,,41,,,,6,,,,,,,,,,,,,,,,,,,,,,,,12,83 -androidx.fragment.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -androidx.slice,2,5,88,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,5,,,,,27,61 -antlr,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -ch.ethz.ssh2,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -cn.hutool.core.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.alibaba.com.caucho.hessian.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, -com.alibaba.druid.sql,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,1, -com.alibaba.fastjson2,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.amazonaws.auth,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.auth0.jwt.algorithms,6,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.azure.identity,3,,,,,1,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.caucho.burlap.io,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, -com.caucho.hessian.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, -com.cedarsoftware.util.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, -com.couchbase.client.core.env,15,,1,,,,9,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.couchbase.client.java,10,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,, -com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.esotericsoftware.yamlbeans,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, -com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.fasterxml.jackson.databind,2,,8,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,8, -com.google.common.base,4,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,,,,63,24 -com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17 -com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551 -com.google.common.flogger,29,,,,,,,,,,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.google.common.io,10,,73,,,,,,,,,1,,,,,,,,,,,,,,,4,5,,,,,,,,,,,,,,,,,,,,,,,,,72,1 -com.google.gson,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,14 -com.hubspot.jinjava,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,, -com.jcraft.jsch,5,,1,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,1, -com.microsoft.sqlserver.jdbc,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.mitchellbosecke.pebble,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,, -com.mongodb,10,,,,,,4,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.opensymphony.xwork2,56,,961,,,,,,,,,,,,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,,,,,,,,,867,94 -com.rabbitmq.client,,21,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,7, -com.sshtools.j2ssh.authentication,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.crypto.provider,19,,,,,17,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.jndi.ldap,4,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.net.httpserver,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.net.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.rowset,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.security.auth.module,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.security.ntlm,5,,,,,,3,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.security.sasl.digest,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.thoughtworks.xstream,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -com.trilead.ssh2,13,,,,,2,4,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.unboundid.ldap.sdk,17,,,,,,,,,,,,,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.zaxxer.hikari,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, -flexjson,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -freemarker.cache,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, -freemarker.template,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,,, -groovy.lang,26,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -groovy.text,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -groovy.util,5,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -hudson,75,9,2648,,4,,,,,,3,2,,,,4,,,,,,,,,,,39,17,,,,,,,,,6,,,,,,,,,,,,,,5,4,2572,76 -io.jsonwebtoken,,2,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4, -io.netty.bootstrap,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,, -io.netty.buffer,,,207,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,77 -io.netty.channel,9,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,2,, -io.netty.handler.codec,4,13,259,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,3,,,,,,,,,,,,,,,13,143,116 -io.netty.handler.ssl,4,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,, -io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -io.netty.util,2,,23,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,21,2 -io.undertow.server.handlers.resource,1,,3,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,3, -jakarta.activation,2,,2,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,2, -jakarta.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,7,, -jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 -jakarta.persistence,2,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,1, -jakarta.servlet,2,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,26,, -jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -jakarta.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, -jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55 -jakarta.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, -java.applet,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11, -java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,3 -java.beans,1,,177,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,82,95 -java.io,66,1,225,,,,,,,,,22,,,,,,,,,,,,,,,29,15,,,,,,,,,,,,,,,,,,,,,,,1,,202,23 -java.lang,38,3,790,,13,,,,,,1,,,,,,,,,,,,8,,,,2,9,,,4,,,1,,,,,,,,,,,,,,,,3,,,510,280 -java.math,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9 -java.net,23,3,347,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,,,,,,,,,,,,,,,3,248,99 -java.nio,47,,499,,,,,,,,,5,,,,,,,,,,,,,,,25,16,,,,,,,,,1,,,,,,,,,,,,,,,,302,197 -java.rmi,,,68,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,23 -java.security,21,,583,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,285,298 -java.sql,15,1,292,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,9,,,,,,,,,,1,,,,274,18 -java.text,,,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,82 -java.time,,,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,104 -java.util,48,2,1340,,,,,,,,,1,,,,,,,,,,,34,,,,3,,,,,5,2,,1,2,,,,,,,,,,,,,,2,,,558,782 -javafx.scene.web,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -javax.accessibility,,,63,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,35 -javax.activation,2,,7,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,7, -javax.annotation.processing,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,3 -javax.crypto,19,,140,,,12,3,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,76,64 -javax.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,7,, -javax.imageio,1,,304,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,138,166 -javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57, -javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 -javax.lang.model,,,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,217,60 -javax.management,2,,766,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,363,403 -javax.naming,7,,341,,,,,,,,,,,,,,,,,6,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,191,150 -javax.net,4,,136,,,,2,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,49 -javax.portlet,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, -javax.print,2,,133,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,102,31 -javax.rmi.ssl,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6 -javax.script,1,,50,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,36 -javax.security.auth,7,,147,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,50,97 -javax.security.cert,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5, -javax.security.sasl,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,42,7 -javax.servlet,10,29,3,,,,,,,,,,,,,,1,,,,,,,,,,,2,,,,,,,,,,3,,,2,,2,,,,,,,,,29,3, -javax.smartcardio,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,24,10 -javax.sound.midi,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,51,9 -javax.sound.sampled,,,90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,37 -javax.sql,7,,126,,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,68,58 -javax.tools,,,66,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,62,4 -javax.transaction.xa,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, -javax.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, -javax.ws.rs.core,3,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,2,,,,,,,,,94,55 -javax.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, -javax.xml.catalog,,,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,1 -javax.xml.crypto,,,269,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,172,97 -javax.xml.datatype,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,1 -javax.xml.namespace,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,10 -javax.xml.parsers,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,2 -javax.xml.stream,,,221,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,201,20 -javax.xml.transform,2,,134,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,1,,,,,,,72,62 -javax.xml.validation,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,29, -javax.xml.xpath,3,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,26, -jenkins,,,523,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,500,23 -jodd.json,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10 -kotlin,16,,1849,,,,,,,,,,,,,,,,,,,,,,,,11,3,,,,,,,,,2,,,,,,,,,,,,,,,,1836,13 -liquibase.database.jvm,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, -liquibase.statement.core,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, -net.lingala.zip4j,2,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,, -net.schmizz.sshj,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -net.sf.json,2,,338,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,321,17 -net.sf.saxon.s9api,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,, -ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,, -okhttp3,4,,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,23,27 -org.acegisecurity,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,49, -org.antlr.runtime,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, -org.apache.commons.collections,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783 -org.apache.commons.collections4,,,806,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,789 -org.apache.commons.compress.archivers.tar,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, -org.apache.commons.exec,10,,,,6,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.fileupload,,11,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,4, -org.apache.commons.httpclient.util,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.commons.io,124,,570,,,,,,,,,4,,,,,,,,,,,,,,,102,3,,,,,,,,,15,,,,,,,,,,,,,,,,556,14 -org.apache.commons.jelly,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,, -org.apache.commons.jexl2,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.jexl3,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.lang,1,,767,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,596,171 -org.apache.commons.lang3,7,,425,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,1,,,,,,,,,,,294,131 -org.apache.commons.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.net,13,12,,,,,2,2,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,6,,,,,,,,,,,,,,,12,, -org.apache.commons.ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52 -org.apache.cxf.catalog,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -org.apache.cxf.common.classloader,3,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,2,,,,,,,,,,,,,,,,, -org.apache.cxf.common.jaxb,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.common.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.configuration.jsse,2,,,,,,,,,,,,,,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.helpers,10,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,5,,,,,,,,, -org.apache.cxf.resource,9,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,5,,,,,,,,,,,,,,,,, -org.apache.cxf.staxutils,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.tools.corba.utils,4,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.tools.util,10,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.transform,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,, -org.apache.directory.ldap.client.api,1,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.hadoop.fs,3,,11,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,11, -org.apache.hadoop.hive.metastore,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,, -org.apache.hadoop.hive.ql.exec,1,,1,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.hadoop.hive.ql.metadata,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.hc.client5.http.async.methods,84,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,84,,,,,,,,,,,,,,,,, -org.apache.hc.client5.http.classic.methods,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,, -org.apache.hc.client5.http.fluent,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,,, -org.apache.hc.core5.benchmark,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.hc.core5.http,73,2,45,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,72,,,,,,,,,,,,,,,2,45, -org.apache.hc.core5.net,,,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18, -org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6 -org.apache.hive.hcatalog.templeton,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, -org.apache.http,48,3,95,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,46,,,,,,,,,,,,,,,3,86,9 -org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,57, -org.apache.ibatis.mapping,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.log4j,11,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.logging.log4j,359,,8,,,,,,,,,,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -org.apache.shiro.authc,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, -org.apache.shiro.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.shiro.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.shiro.mgt,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.sshd.client.session,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.struts.beanvalidation.validation.interceptor,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, -org.apache.struts2,14,,3873,,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,3,,,,,,,,,,,,3839,34 -org.apache.tools.ant,14,,,,1,,,,,,,,,,,,,,,,,,,,,,5,8,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.tools.zip,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.velocity.app,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,, -org.apache.velocity.runtime,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,, -org.codehaus.cargo.container.installer,3,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,1,,,,,,,,,,,,,,,,, -org.codehaus.groovy.control,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,, -org.eclipse.jetty.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, -org.exolab.castor.xml,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, -org.fusesource.leveldbjni,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.geogebra.web.full.main,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, -org.gradle.api.file,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -org.hibernate,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,, -org.ho.yaml,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,, -org.influxdb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -org.jabsorb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, -org.jboss.logging,324,,,,,,,,,,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.jboss.vfs,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.jdbi.v3.core,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,, -org.jenkins.ui.icon,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48,1 -org.jenkins.ui.symbol,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,8 -org.jooq,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, -org.json,,,236,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,198,38 -org.keycloak.models.map.storage,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, -org.kohsuke.stapler,20,24,363,,,,,,,,,,,,,2,,,,,,,,,,,8,1,,,,,,,,,3,,,,,,1,5,,,,,,,,24,352,11 -org.lastaflute.web,,1,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,4, -org.mvel2,16,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.openjdk.jmh.runner.options,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.owasp.esapi,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.pac4j.jwt.config.encryption,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.pac4j.jwt.config.signature,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.scijava.log,13,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.slf4j,55,,6,,,,,,,,,,,,,,,,,,,,55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4 -org.springframework.beans,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30 -org.springframework.boot.jdbc,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, -org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13 -org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -org.springframework.core.io,17,,6,,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,1,,,,,,,,,,,,,,,,6, -org.springframework.data.repository,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -org.springframework.http,14,,77,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,67,10 -org.springframework.jdbc.core,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,, -org.springframework.jdbc.datasource,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,, -org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,, -org.springframework.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.ldap,47,,,,,,,,,,,,,,,,,,,33,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.security.core.userdetails,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,, -org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32 -org.springframework.util,10,,142,,,,,,,,,,,,,,,,,,,,,,,,9,1,,,,,,,,,,,,,,,,,,,,,,,,,90,52 -org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13, -org.springframework.web.client,13,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,3,, -org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, -org.springframework.web.multipart,,12,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,12, -org.springframework.web.portlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,, -org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, -org.springframework.web.servlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,, -org.springframework.web.socket,,8,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,6, -org.springframework.web.util,,9,159,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,134,25 -org.thymeleaf,2,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,2, -org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,, -org.yaml.snakeyaml,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -play.libs.ws,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, -play.mvc,1,13,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,13,24, -ratpack.core.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -ratpack.core.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, -ratpack.core.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, -ratpack.exec,,,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48 -ratpack.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -ratpack.func,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 -ratpack.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, -ratpack.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, -ratpack.util,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 -retrofit2,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,1, -software.amazon.awssdk.transfer.s3.model,8,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.jvmstat.perfdata.monitor.protocol.local,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.jvmstat.perfdata.monitor.protocol.rmi,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.misc,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.net.ftp,5,,,,,,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.net.www.protocol.http,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.acl,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.jgss.krb5,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.krb5,9,,,,,3,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.pkcs,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.pkcs11,3,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.provider,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.x509,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.tools.jconsole,28,,,,,,13,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +package,sink,source,summary,sink:bean-validation,sink:command-injection,sink:credentials-key,sink:credentials-password,sink:credentials-username,sink:encryption-iv,sink:encryption-salt,sink:environment-injection,sink:file-content-store,sink:fragment-injection,sink:groovy-injection,sink:hostname-verification,sink:html-injection,sink:information-leak,sink:intent-redirection,sink:jexl-injection,sink:jndi-injection,sink:js-injection,sink:ldap-injection,sink:log-injection,sink:mvel-injection,sink:notification,sink:ognl-injection,sink:path-injection,sink:path-injection[read],sink:pending-intents,sink:regex-use,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:request-forgery,sink:response-splitting,sink:sql-injection,sink:template-injection,sink:trust-boundary-violation,sink:unsafe-deserialization,sink:url-forward,sink:url-redirection,sink:xpath-injection,sink:xslt-injection,source:android-external-storage-dir,source:commandargs,source:contentprovider,source:database,source:environment,source:file,source:remote,summary:taint,summary:value +actions.osgi,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, +android.app,77,,103,,,,,,,,,,11,,,,,7,,,,,,,42,,,,17,,,,,,,,,,,,,,,,,,,,,,,,,18,85 +android.content,24,31,154,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,4,,27,,,,,63,91 +android.database,59,,41,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,,,,41, +android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15 +android.os,1,2,122,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,2,,,,,,,41,81 +android.support.v4.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +android.util,6,16,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,16,, +android.webkit,3,2,,,,,,,,,,,,,,2,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, +android.widget,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1, +androidx.core.app,47,,95,,,,,,,,,,,,,,,,,,,,,,41,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,12,83 +androidx.fragment.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +androidx.slice,2,5,88,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,5,,,,,27,61 +antlr,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +ch.ethz.ssh2,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +cn.hutool.core.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.alibaba.com.caucho.hessian.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,, +com.alibaba.druid.sql,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,1, +com.alibaba.fastjson2,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.amazonaws.auth,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.auth0.jwt.algorithms,6,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.azure.identity,3,,,,,1,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.caucho.burlap.io,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,, +com.caucho.hessian.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,, +com.cedarsoftware.util.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,, +com.couchbase.client.core.env,15,,1,,,,9,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.couchbase.client.java,10,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,, +com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.esotericsoftware.yamlbeans,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,, +com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.fasterxml.jackson.databind,2,,8,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,8, +com.google.common.base,4,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,,,,,63,24 +com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17 +com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551 +com.google.common.flogger,29,,,,,,,,,,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.google.common.io,10,,73,,,,,,,,,1,,,,,,,,,,,,,,,4,5,,,,,,,,,,,,,,,,,,,,,,,,,,72,1 +com.google.gson,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,14 +com.hubspot.jinjava,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,, +com.jcraft.jsch,5,,1,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,1, +com.microsoft.sqlserver.jdbc,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.mitchellbosecke.pebble,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,, +com.mongodb,10,,,,,,4,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.opensymphony.xwork2,56,,961,,,,,,,,,,,,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,,,,,,,,,,867,94 +com.rabbitmq.client,,21,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,7, +com.sshtools.j2ssh.authentication,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.crypto.provider,19,,,,,17,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.jndi.ldap,4,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.net.httpserver,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.net.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.rowset,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.security.auth.module,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.security.ntlm,5,,,,,,3,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.security.sasl.digest,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.thoughtworks.xstream,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.trilead.ssh2,13,,,,,2,4,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.unboundid.ldap.sdk,17,,,,,,,,,,,,,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.zaxxer.hikari,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,, +flexjson,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 +freemarker.cache,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, +freemarker.template,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,,,, +groovy.lang,26,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +groovy.text,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +groovy.util,5,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +hudson,75,9,2648,,4,,,,,,3,2,,,,4,,,,,,,,,,,39,17,,,,,,,,,6,,,,,,,,,,,,,,,5,4,2572,76 +io.jsonwebtoken,,2,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4, +io.netty.bootstrap,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,, +io.netty.buffer,,,207,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,77 +io.netty.channel,9,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,2,, +io.netty.handler.codec,4,13,259,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,3,,,,,,,,,,,,,,,,13,143,116 +io.netty.handler.ssl,4,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +io.netty.util,2,,23,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,21,2 +io.undertow.server.handlers.resource,1,,3,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +jakarta.activation,2,,2,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,2, +jakarta.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,7,, +jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 +jakarta.persistence,2,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,1, +jakarta.servlet,2,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,26,, +jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +jakarta.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, +jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,94,55 +jakarta.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, +java.applet,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11, +java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,3 +java.beans,1,,177,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,82,95 +java.io,66,1,225,,,,,,,,,22,,,,,,,,,,,,,,,29,15,,,,,,,,,,,,,,,,,,,,,,,,1,,202,23 +java.lang,38,3,790,,13,,,,,,1,,,,,,,,,,,,8,,,,2,9,,,4,,,1,,,,,,,,,,,,,,,,,3,,,510,280 +java.math,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9 +java.net,23,3,347,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,,,,,,,,,,,,,,,,3,248,99 +java.nio,47,,499,,,,,,,,,5,,,,,,,,,,,,,,,25,16,,,,,,,,,1,,,,,,,,,,,,,,,,,302,197 +java.rmi,,,68,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,23 +java.security,21,,583,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,285,298 +java.sql,15,1,292,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,9,,,,,,,,,,,1,,,,274,18 +java.text,,,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,82 +java.time,,,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,104 +java.util,48,2,1340,,,,,,,,,1,,,,,,,,,,,34,,,,3,,,,,5,2,,1,2,,,,,,,,,,,,,,,2,,,558,782 +javafx.scene.web,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +javax.accessibility,,,63,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,35 +javax.activation,2,,7,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,7, +javax.annotation.processing,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,3 +javax.crypto,19,,140,,,12,3,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,76,64 +javax.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,7,, +javax.imageio,1,,304,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,138,166 +javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57, +javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 +javax.lang.model,,,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,217,60 +javax.management,2,,766,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,363,403 +javax.naming,7,,341,,,,,,,,,,,,,,,,,6,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,191,150 +javax.net,4,,136,,,,2,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,49 +javax.portlet,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +javax.print,2,,133,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,102,31 +javax.rmi.ssl,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6 +javax.script,1,,50,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,36 +javax.security.auth,7,,147,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,50,97 +javax.security.cert,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5, +javax.security.sasl,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,42,7 +javax.servlet,10,29,3,,,,,,,,,,,,,,1,,,,,,,,,,,2,,,,,,,,,,3,,,2,,2,,,,,,,,,,29,3, +javax.smartcardio,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,24,10 +javax.sound.midi,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,51,9 +javax.sound.sampled,,,90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,37 +javax.sql,7,,126,,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,68,58 +javax.tools,,,66,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,62,4 +javax.transaction.xa,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, +javax.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, +javax.ws.rs.core,3,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,2,,,,,,,,,,94,55 +javax.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, +javax.xml.catalog,,,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,1 +javax.xml.crypto,,,269,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,172,97 +javax.xml.datatype,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,1 +javax.xml.namespace,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,10 +javax.xml.parsers,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,2 +javax.xml.stream,,,221,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,201,20 +javax.xml.transform,2,,134,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,72,62 +javax.xml.validation,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,29, +javax.xml.xpath,3,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,26, +jenkins,,,523,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,500,23 +jodd.json,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10 +kotlin,16,,1849,,,,,,,,,,,,,,,,,,,,,,,,11,3,,,,,,,,,2,,,,,,,,,,,,,,,,,1836,13 +liquibase.database.jvm,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, +liquibase.statement.core,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, +net.lingala.zip4j,2,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,, +net.schmizz.sshj,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +net.sf.json,2,,338,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,321,17 +net.sf.saxon.s9api,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,,, +ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +okhttp3,4,,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,23,27 +org.acegisecurity,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,49, +org.antlr.runtime,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.avro,18,19,,,,,,,,,,,,,,,,,,,,,,,,,17,,,,,,,,,,1,,,,,,,,,,,1,,,,17,1,, +org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, +org.apache.commons.collections,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783 +org.apache.commons.collections4,,,806,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,789 +org.apache.commons.compress.archivers.tar,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, +org.apache.commons.exec,10,,,,6,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.fileupload,,11,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,4, +org.apache.commons.httpclient.util,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.commons.io,124,,570,,,,,,,,,4,,,,,,,,,,,,,,,102,3,,,,,,,,,15,,,,,,,,,,,,,,,,,556,14 +org.apache.commons.jelly,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,, +org.apache.commons.jexl2,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.jexl3,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.lang,1,,767,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,596,171 +org.apache.commons.lang3,7,,425,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,1,,,,,,,,,,,,294,131 +org.apache.commons.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.net,13,12,,,,,2,2,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,6,,,,,,,,,,,,,,,,12,, +org.apache.commons.ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52 +org.apache.cxf.catalog,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +org.apache.cxf.common.classloader,3,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,2,,,,,,,,,,,,,,,,,, +org.apache.cxf.common.jaxb,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.common.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.configuration.jsse,2,,,,,,,,,,,,,,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.helpers,10,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,5,,,,,,,,,, +org.apache.cxf.resource,9,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,5,,,,,,,,,,,,,,,,,, +org.apache.cxf.staxutils,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.tools.corba.utils,4,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.tools.util,10,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.transform,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,, +org.apache.directory.ldap.client.api,1,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hadoop.fs,3,,11,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,11, +org.apache.hadoop.hive.metastore,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,, +org.apache.hadoop.hive.ql.exec,1,,1,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.hadoop.hive.ql.metadata,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.async.methods,84,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,84,,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.classic.methods,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.fluent,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,,,, +org.apache.hc.core5.benchmark,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.hc.core5.http,73,2,45,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,72,,,,,,,,,,,,,,,,2,45, +org.apache.hc.core5.net,,,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18, +org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6 +org.apache.hive.hcatalog.templeton,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, +org.apache.http,53,3,117,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,51,,,,,,,,,,,,,,,,3,108,9 +org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,57, +org.apache.ibatis.mapping,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.log4j,11,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.logging.log4j,359,,8,,,,,,,,,,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +org.apache.shiro.authc,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, +org.apache.shiro.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.shiro.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.shiro.mgt,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.sshd.client.session,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.struts.beanvalidation.validation.interceptor,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, +org.apache.struts2,14,,3873,,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,3,,,,,,,,,,,,,3839,34 +org.apache.tools.ant,14,,,,1,,,,,,,,,,,,,,,,,,,,,,5,8,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.tools.zip,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.velocity.app,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,, +org.apache.velocity.runtime,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,, +org.codehaus.cargo.container.installer,3,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +org.codehaus.groovy.control,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,,, +org.eclipse.jetty.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,, +org.exolab.castor.xml,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,, +org.fusesource.leveldbjni,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.geogebra.web.full.main,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, +org.gradle.api.file,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +org.hibernate,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,, +org.ho.yaml,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,, +org.influxdb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +org.jabsorb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,, +org.jboss.logging,324,,,,,,,,,,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.jboss.vfs,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.jdbi.v3.core,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,, +org.jenkins.ui.icon,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48,1 +org.jenkins.ui.symbol,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,8 +org.jooq,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, +org.json,,,236,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,198,38 +org.keycloak.models.map.storage,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, +org.kohsuke.stapler,20,24,363,,,,,,,,,,,,,2,,,,,,,,,,,8,1,,,,,,,,,3,,,,,,1,5,,,,,,,,,24,352,11 +org.lastaflute.web,,1,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,4, +org.mvel2,16,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.openjdk.jmh.runner.options,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.owasp.esapi,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.pac4j.jwt.config.encryption,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.pac4j.jwt.config.signature,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.scijava.log,13,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.slf4j,55,,6,,,,,,,,,,,,,,,,,,,,55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4 +org.springframework.beans,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30 +org.springframework.boot.jdbc,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, +org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13 +org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +org.springframework.core.io,17,,6,,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,1,,,,,,,,,,,,,,,,,6, +org.springframework.data.repository,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 +org.springframework.http,14,,77,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,67,10 +org.springframework.jdbc.core,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,, +org.springframework.jdbc.datasource,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,, +org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,, +org.springframework.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.ldap,47,,,,,,,,,,,,,,,,,,,33,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.security.core.userdetails,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,, +org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32 +org.springframework.util,10,,142,,,,,,,,,,,,,,,,,,,,,,,,9,1,,,,,,,,,,,,,,,,,,,,,,,,,,90,52 +org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13, +org.springframework.web.client,13,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,3,, +org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, +org.springframework.web.multipart,,12,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,12, +org.springframework.web.portlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, +org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,, +org.springframework.web.servlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, +org.springframework.web.socket,,8,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,6, +org.springframework.web.util,,9,159,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,134,25 +org.thymeleaf,2,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,2, +org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,, +org.yaml.snakeyaml,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +play.libs.ws,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,, +play.mvc,1,13,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,13,24, +ratpack.core.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +ratpack.core.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, +ratpack.core.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, +ratpack.exec,,,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48 +ratpack.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +ratpack.func,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 +ratpack.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, +ratpack.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, +ratpack.util,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 +retrofit2,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,1, +software.amazon.awssdk.transfer.s3.model,8,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.jvmstat.perfdata.monitor.protocol.local,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.jvmstat.perfdata.monitor.protocol.rmi,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.misc,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.net.ftp,5,,,,,,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.net.www.protocol.http,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.acl,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.jgss.krb5,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.krb5,9,,,,,3,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.pkcs,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.pkcs11,3,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.provider,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.x509,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.tools.jconsole,28,,,,,,13,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 5a3c8f168942..14a5286295f2 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -13,7 +13,7 @@ Java framework & library support `Apache Commons IO `_,``org.apache.commons.io``,,570,124,105,,,,,15 `Apache Commons Lang `_,``org.apache.commons.lang3``,,425,7,,,,,, `Apache Commons Text `_,``org.apache.commons.text``,,272,,,,,,, - `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,183,122,,3,,,,119 + `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,205,127,,3,,,,124 `Apache Log4j 2 `_,``org.apache.logging.log4j``,,8,359,,,,,, `Apache Struts `_,"``org.apache.struts2``, ``org.apache.struts.beanvalidation.validation.interceptor``",,3877,14,,,,,, `Apache Velocity `_,"``org.apache.velocity.app``, ``org.apache.velocity.runtime``",,,8,,,,,, @@ -40,6 +40,6 @@ Java framework & library support `Spring `_,``org.springframework.*``,46,494,143,26,,28,14,,35 `Thymeleaf `_,``org.thymeleaf``,,2,2,,,,,, `jOOQ `_,``org.jooq``,,,1,,,1,,, - Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",108,6034,757,131,6,14,18,,185 - Totals,,363,26381,2684,404,16,137,33,1,409 + Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",127,6034,775,148,6,14,18,,186 + Totals,,382,26403,2707,421,16,137,33,1,415 diff --git a/java/ql/integration-tests/java/buildless-maven-existing-settings-xml/maven-fetches.expected b/java/ql/integration-tests/java/buildless-maven-existing-settings-xml/maven-fetches.expected index f4c4dab94565..208ca501487a 100644 --- a/java/ql/integration-tests/java/buildless-maven-existing-settings-xml/maven-fetches.expected +++ b/java/ql/integration-tests/java/buildless-maven-existing-settings-xml/maven-fetches.expected @@ -1,18 +1,18 @@ Downloaded from central: https://repo.maven.apache.org/maven2/junit/junit/4.11/junit-4.11.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.14.1/jackson-annotations-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.14.1/jackson-annotations-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.14.1/jackson-core-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.14.1/jackson-core-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.14.1/jackson-databind-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.14.1/jackson-databind-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-base/2.14.1/jackson-base-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-bom/2.14.1/jackson-bom-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-parent/2.14/jackson-parent-2.14.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/oss-parent/48/oss-parent-48.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL/depgraph-maven-plugin-4.0.3-CodeQL.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL/depgraph-maven-plugin-4.0.3-CodeQL.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.18.6/jackson-annotations-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.18.6/jackson-annotations-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.18.6/jackson-core-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.18.6/jackson-core-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.18.6/jackson-databind-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.18.6/jackson-databind-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-base/2.18.6/jackson-base-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-bom/2.18.6/jackson-bom-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-parent/2.18.4/jackson-parent-2.18.4.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/oss-parent/69/oss-parent-69.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL-2/depgraph-maven-plugin-4.0.3-CodeQL-2.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL-2/depgraph-maven-plugin-4.0.3-CodeQL-2.pom Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.pom Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.jar diff --git a/java/ql/integration-tests/java/buildless-maven-mirrorof/maven-fetches.expected b/java/ql/integration-tests/java/buildless-maven-mirrorof/maven-fetches.expected index de38626f4d84..cffdda2891e3 100644 --- a/java/ql/integration-tests/java/buildless-maven-mirrorof/maven-fetches.expected +++ b/java/ql/integration-tests/java/buildless-maven-mirrorof/maven-fetches.expected @@ -1,15 +1,15 @@ -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.14.1/jackson-annotations-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.14.1/jackson-annotations-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.14.1/jackson-core-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.14.1/jackson-core-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.14.1/jackson-databind-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.14.1/jackson-databind-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-base/2.14.1/jackson-base-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-bom/2.14.1/jackson-bom-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-parent/2.14/jackson-parent-2.14.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/oss-parent/48/oss-parent-48.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL/depgraph-maven-plugin-4.0.3-CodeQL.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL/depgraph-maven-plugin-4.0.3-CodeQL.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.18.6/jackson-annotations-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.18.6/jackson-annotations-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.18.6/jackson-core-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.18.6/jackson-core-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.18.6/jackson-databind-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.18.6/jackson-databind-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-base/2.18.6/jackson-base-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-bom/2.18.6/jackson-bom-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-parent/2.18.4/jackson-parent-2.18.4.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/oss-parent/69/oss-parent-69.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL-2/depgraph-maven-plugin-4.0.3-CodeQL-2.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL-2/depgraph-maven-plugin-4.0.3-CodeQL-2.pom Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.pom Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.jar diff --git a/java/ql/integration-tests/java/buildless-maven-timeout/diagnostics.expected b/java/ql/integration-tests/java/buildless-maven-timeout/diagnostics.expected index 94b25c68a00d..5a30189b5e30 100644 --- a/java/ql/integration-tests/java/buildless-maven-timeout/diagnostics.expected +++ b/java/ql/integration-tests/java/buildless-maven-timeout/diagnostics.expected @@ -83,7 +83,7 @@ } } { - "markdownMessage": "Running the Maven plugin `com.github.ferstl:depgraph-maven-plugin:4.0.3-CodeQL:graph` failed. This means precise dependency information will be unavailable, and so dependencies will be guessed based on Java package names. Consider investigating why this plugin fails to run.", + "markdownMessage": "Running the Maven plugin `com.github.ferstl:depgraph-maven-plugin:4.0.3-CodeQL-2:graph` failed. This means precise dependency information will be unavailable, and so dependencies will be guessed based on Java package names. Consider investigating why this plugin fails to run.", "severity": "note", "source": { "extractorName": "java", diff --git a/java/ql/integration-tests/java/buildless-maven-tolerate-unavailable-dependency/diagnostics.expected b/java/ql/integration-tests/java/buildless-maven-tolerate-unavailable-dependency/diagnostics.expected index c65231eccd00..0ef924eb7c11 100644 --- a/java/ql/integration-tests/java/buildless-maven-tolerate-unavailable-dependency/diagnostics.expected +++ b/java/ql/integration-tests/java/buildless-maven-tolerate-unavailable-dependency/diagnostics.expected @@ -97,7 +97,7 @@ } } { - "markdownMessage": "Running the Maven plugin `com.github.ferstl:depgraph-maven-plugin:4.0.3-CodeQL:graph` yielded an artifact transfer exception. This means some dependency information will be unavailable, and so some dependencies will be guessed based on Java package names. Consider investigating why this plugin encountered errors retrieving dependencies.", + "markdownMessage": "Running the Maven plugin `com.github.ferstl:depgraph-maven-plugin:4.0.3-CodeQL-2:graph` yielded an artifact transfer exception. This means some dependency information will be unavailable, and so some dependencies will be guessed based on Java package names. Consider investigating why this plugin encountered errors retrieving dependencies.", "severity": "note", "source": { "extractorName": "java", diff --git a/java/ql/integration-tests/java/buildless-maven/maven-fetches.expected b/java/ql/integration-tests/java/buildless-maven/maven-fetches.expected index f4c4dab94565..208ca501487a 100644 --- a/java/ql/integration-tests/java/buildless-maven/maven-fetches.expected +++ b/java/ql/integration-tests/java/buildless-maven/maven-fetches.expected @@ -1,18 +1,18 @@ Downloaded from central: https://repo.maven.apache.org/maven2/junit/junit/4.11/junit-4.11.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.14.1/jackson-annotations-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.14.1/jackson-annotations-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.14.1/jackson-core-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.14.1/jackson-core-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.14.1/jackson-databind-2.14.1.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.14.1/jackson-databind-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-base/2.14.1/jackson-base-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-bom/2.14.1/jackson-bom-2.14.1.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-parent/2.14/jackson-parent-2.14.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/oss-parent/48/oss-parent-48.pom -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL/depgraph-maven-plugin-4.0.3-CodeQL.jar -Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL/depgraph-maven-plugin-4.0.3-CodeQL.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.18.6/jackson-annotations-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-annotations/2.18.6/jackson-annotations-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.18.6/jackson-core-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-core/2.18.6/jackson-core-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.18.6/jackson-databind-2.18.6.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/core/jackson-databind/2.18.6/jackson-databind-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-base/2.18.6/jackson-base-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-bom/2.18.6/jackson-bom-2.18.6.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/jackson/jackson-parent/2.18.4/jackson-parent-2.18.4.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/fasterxml/oss-parent/69/oss-parent-69.pom +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL-2/depgraph-maven-plugin-4.0.3-CodeQL-2.jar +Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/github/ferstl/depgraph-maven-plugin/4.0.3-CodeQL-2/depgraph-maven-plugin-4.0.3-CodeQL-2.pom Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.pom Downloaded from codeql-depgraph-plugin-repo: file://[dist-root]/java/tools/ferstl-depgraph-dependencies/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.jar diff --git a/java/ql/integration-tests/update-ferstl-depgraph-dependencies.sh b/java/ql/integration-tests/update-ferstl-depgraph-dependencies.sh new file mode 100755 index 000000000000..19d8167be740 --- /dev/null +++ b/java/ql/integration-tests/update-ferstl-depgraph-dependencies.sh @@ -0,0 +1,330 @@ +#!/usr/bin/env bash +# Upgrades the ferstl-depgraph-dependencies bundle used by the buildless Java extractor. +# +# This script: +# 1. Clones ferstl/depgraph-maven-plugin at the upstream 4.0.3 tag. +# 2. Applies the CodeQL patches: version suffix, Guava bump, Jackson bump. +# 3. Builds the plugin (skipping tests) into a throwaway build repo. +# 4. Resolves only the plugin's runtime deps into a clean dist repo and zips it. +# 5. Updates the *.expected integration-test files in this directory. +# +# The generated zip file must be placed (in the companion semmle-code PR) at: +# resources/lib/ferstl-depgraph-dependencies/ferstl-depgraph-dependencies.zip +# +# Usage: +# ./update-ferstl-depgraph-dependencies.sh [JACKSON_VERSION [GUAVA_VERSION]] +# +# Output: +# ferstl-depgraph-dependencies.zip (written to the current working directory) +# +# Defaults: +# JACKSON_VERSION = 2.18.6 +# GUAVA_VERSION = 33.4.0-jre +# +# Requirements: +# - JDK 17 (or JDK 11+; the plugin targets Java 8+) +# - Maven 3.9.x (do NOT use Maven 4.x) +# - git, python3, zip, sha1sum (or shasum on macOS) + +set -euo pipefail + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- +JACKSON_VERSION="${1:-2.18.6}" +GUAVA_VERSION="${2:-33.4.0-jre}" + +PLUGIN_UPSTREAM_VERSION="4.0.3" +PLUGIN_CODEQL_VERSION="${PLUGIN_UPSTREAM_VERSION}-CodeQL-2" +UPSTREAM_TAG="depgraph-maven-plugin-${PLUGIN_UPSTREAM_VERSION}" +UPSTREAM_REPO="https://github.com/ferstl/depgraph-maven-plugin.git" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +WORK_DIR="$(mktemp -d)" +# The zip is written to the caller's working directory so the cleanup trap can +# safely remove the entire temporary work tree. +ZIP_OUT="$(pwd)/ferstl-depgraph-dependencies.zip" +trap 'rm -rf "${WORK_DIR}"' EXIT + +echo "=== ferstl-depgraph-dependencies update ===" +echo " Jackson: ${JACKSON_VERSION}" +echo " Guava: ${GUAVA_VERSION}" +echo " Plugin version: ${PLUGIN_CODEQL_VERSION}" +echo " Work dir: ${WORK_DIR}" +echo "" + +# --------------------------------------------------------------------------- +# Step 1 — Clone plugin source +# --------------------------------------------------------------------------- +echo "[1/5] Cloning ${UPSTREAM_REPO} at tag ${UPSTREAM_TAG} ..." +git clone --depth=1 --branch "${UPSTREAM_TAG}" "${UPSTREAM_REPO}" "${WORK_DIR}/plugin-src" + +# --------------------------------------------------------------------------- +# Step 2 — Patch pom.xml +# --------------------------------------------------------------------------- +echo "[2/5] Patching pom.xml ..." +python3 - \ + "${WORK_DIR}/plugin-src/pom.xml" \ + "${PLUGIN_UPSTREAM_VERSION}" \ + "${PLUGIN_CODEQL_VERSION}" \ + "${GUAVA_VERSION}" \ + "${JACKSON_VERSION}" << 'PYEOF' +import sys + +pom_path, old_version, new_version, new_guava, new_jackson = sys.argv[1:] + +with open(pom_path) as f: + content = f.read() + +# 1. Version suffix: 4.0.3 -> 4.0.3-CodeQL-2 (first occurrence only — the element) +content = content.replace(f'{old_version}', f'{new_version}', 1) + +# 2. Guava +content = content.replace('31.1-jre', f'{new_guava}') + +# 3. Jackson (jackson-databind drives the transitive jackson-core / jackson-annotations versions) +content = content.replace('2.14.1', f'{new_jackson}') + +with open(pom_path, 'w') as f: + f.write(content) + +print(f' pom.xml patched: version={new_version}, guava={new_guava}, jackson={new_jackson}') +PYEOF + +# --------------------------------------------------------------------------- +# Step 3 — Build the plugin, then resolve its runtime deps into a clean repo +# --------------------------------------------------------------------------- +# +# Two separate local repos: +# +# BUILD_REPO Throwaway cache for the plugin's own `mvn package install` — +# accumulates build-lifecycle plugins (compiler, surefire, jar, +# plugin-plugin, etc.) that the extractor never invokes at +# runtime. Discarded after this step. +# +# DIST_REPO Clean repo seeded with the freshly built plugin, then +# populated only with the plugin's runtime transitive deps by +# invoking the :graph goal against a minimal stub project. +# This is what gets zipped. +# +BUILD_REPO="${WORK_DIR}/build-repo" +DIST_REPO="${WORK_DIR}/dist-repo" + +echo "[3/5] Building plugin (mvn package + install, skipping tests) ..." +cd "${WORK_DIR}/plugin-src" +mvn package install -DskipTests -q -Dmaven.repo.local="${BUILD_REPO}" + +echo " Resolving runtime dependencies into clean dist repo ..." + +# Seed DIST_REPO with the freshly built plugin jar+pom so the :graph +# invocation below can resolve its transitive runtime deps without hitting +# Central for the plugin artifact itself. +PLUGIN_REL="com/github/ferstl/depgraph-maven-plugin/${PLUGIN_CODEQL_VERSION}" +mkdir -p "${DIST_REPO}/${PLUGIN_REL}" +cp "${BUILD_REPO}/${PLUGIN_REL}/depgraph-maven-plugin-${PLUGIN_CODEQL_VERSION}.jar" \ + "${BUILD_REPO}/${PLUGIN_REL}/depgraph-maven-plugin-${PLUGIN_CODEQL_VERSION}.pom" \ + "${DIST_REPO}/${PLUGIN_REL}/" + +# Create a minimal stub project with no dependencies. Using an empty project +# avoids polluting DIST_REPO with the stub's own deps (e.g. junit from the +# quickstart archetype). The sole purpose of this project is to give Maven a +# valid reactor context in which to load and execute the plugin. +mkdir -p "${WORK_DIR}/stub-project" +cat > "${WORK_DIR}/stub-project/pom.xml" << 'STUBPOM' + + 4.0.0 + com.example + stub + 1.0-SNAPSHOT + +STUBPOM + +cd "${WORK_DIR}/stub-project" +mvn -q "com.github.ferstl:depgraph-maven-plugin:${PLUGIN_CODEQL_VERSION}:graph" \ + -Dmaven.repo.local="${DIST_REPO}" + +# --------------------------------------------------------------------------- +# Step 4 — Package local-repo zip +# --------------------------------------------------------------------------- +echo "[4/5] Packaging local Maven repo into zip ..." + +# Remove build-time-only noise (but keep _remote.repositories for Maven +# cache-validation compatibility). +find "${DIST_REPO}" \( \ + -name "resolver-status.properties" \ + -o -name "*.lastUpdated" \ + -o -name "m2e-lastUpdated.properties" \ + \) -delete + +# Add missing SHA-1 files (mvn install doesn't always write them for locally +# built artifacts; they are needed to suppress Maven checksum warnings). +if command -v sha1sum &>/dev/null; then + SHA1_CMD="sha1sum" +elif command -v shasum &>/dev/null; then + SHA1_CMD="shasum -a 1" +else + echo "WARNING: Neither sha1sum nor shasum found; .sha1 files will not be generated." >&2 + SHA1_CMD="" +fi + +if [[ -n "${SHA1_CMD}" ]]; then + while IFS= read -r -d '' f; do + if [[ ! -f "${f}.sha1" ]]; then + ${SHA1_CMD} "${f}" | awk '{print $1}' > "${f}.sha1" + fi + done < <(find "${DIST_REPO}" \( -name "*.jar" -o -name "*.pom" \) -print0) +fi + +(cd "${DIST_REPO}" && zip -r -q "${ZIP_OUT}" .) + +echo "" +echo " Zip created: ${ZIP_OUT}" +echo "" +echo " *** Place this file in semmle-code at:" +echo " resources/lib/ferstl-depgraph-dependencies/ferstl-depgraph-dependencies.zip" +echo "" + +# --------------------------------------------------------------------------- +# Step 5 — Update integration-test *.expected files +# --------------------------------------------------------------------------- +echo "[5/5] Updating integration-test expected files ..." + +# Python helpers are written to files to avoid heredocs inside $(...), which +# are not reliably parsed by macOS bash 3.2. +EXPECTED_FILE="${SCRIPT_DIR}/java/buildless-maven/maven-fetches.expected" + +# Script: extract current versions from the expected file +cat > "${WORK_DIR}/extract_versions.py" << 'PYEOF' +import sys, re + +with open(sys.argv[1]) as f: + content = f.read() + +def extract(pattern): + m = re.search(pattern, content) + return m.group(1) if m else '' + +print( + extract(r'jackson-core/([^/]+)/'), + extract(r'depgraph-maven-plugin/([^/]+)/'), + extract(r'fasterxml/oss-parent/([^/]+)/'), + extract(r'jackson-parent/([^/]+)/'), +) +PYEOF + +read -r OLD_JACKSON OLD_PLUGIN OLD_OSS_PARENT OLD_JACKSON_PARENT \ + <<< "$(python3 "${WORK_DIR}/extract_versions.py" "${EXPECTED_FILE}")" + +# Script: find the highest-version POM in each parent directory +cat > "${WORK_DIR}/max_versions.py" << 'PYEOF' +import sys, os, re + +def max_version(directory, name_prefix, name_suffix): + try: + entries = os.listdir(directory) + except FileNotFoundError: + return '' + versions = [] + for e in entries: + pom = os.path.join(directory, e, f'{name_prefix}{e}{name_suffix}') + if os.path.isfile(pom): + versions.append(e) + if not versions: + return '' + def version_key(v): + parts = re.split(r'[.\-]', v) + numeric = tuple(int(p) for p in parts if p.isdigit()) + # A release version (all-numeric parts) beats a snapshot/qualifier with + # the same numeric prefix; append 1 for pure-release, 0 otherwise. + is_release = int(all(p.isdigit() for p in parts if p)) + return (numeric, is_release) + return max(versions, key=version_key) + +jackson_parent_dir, oss_parent_dir = sys.argv[1], sys.argv[2] +print( + max_version(jackson_parent_dir, 'jackson-parent-', '.pom'), + max_version(oss_parent_dir, 'oss-parent-', '.pom'), +) +PYEOF + +# Capture python output into a variable first to avoid backslash continuation +# inside $(...), which is not reliably handled by macOS bash 3.2. +_max_versions_out="$(python3 "${WORK_DIR}/max_versions.py" "${DIST_REPO}/com/fasterxml/jackson/jackson-parent" "${DIST_REPO}/com/fasterxml/oss-parent")" +read -r NEW_JACKSON_PARENT NEW_OSS_PARENT <<< "${_max_versions_out}" + +echo " Jackson: ${OLD_JACKSON} -> ${JACKSON_VERSION}" +echo " jackson-parent: ${OLD_JACKSON_PARENT} -> ${NEW_JACKSON_PARENT}" +echo " oss-parent: ${OLD_OSS_PARENT} -> ${NEW_OSS_PARENT}" +echo " Plugin: ${OLD_PLUGIN} -> ${PLUGIN_CODEQL_VERSION}" + +# Script: update all *.expected files in-place +cat > "${WORK_DIR}/update_expected.py" << 'PYEOF' +import os, sys, glob + +(script_dir, + old_jackson, new_jackson, + old_jackson_parent, new_jackson_parent, + old_oss_parent, new_oss_parent, + old_plugin, new_plugin) = sys.argv[1:] + +# Substitutions applied to maven-fetches.expected files +fetch_substitutions = [ + (f"jackson-annotations/{old_jackson}/jackson-annotations-{old_jackson}", + f"jackson-annotations/{new_jackson}/jackson-annotations-{new_jackson}"), + (f"jackson-core/{old_jackson}/jackson-core-{old_jackson}", + f"jackson-core/{new_jackson}/jackson-core-{new_jackson}"), + (f"jackson-databind/{old_jackson}/jackson-databind-{old_jackson}", + f"jackson-databind/{new_jackson}/jackson-databind-{new_jackson}"), + (f"jackson-base/{old_jackson}/jackson-base-{old_jackson}", + f"jackson-base/{new_jackson}/jackson-base-{new_jackson}"), + (f"jackson-bom/{old_jackson}/jackson-bom-{old_jackson}", + f"jackson-bom/{new_jackson}/jackson-bom-{new_jackson}"), + (f"jackson-parent/{old_jackson_parent}/jackson-parent-{old_jackson_parent}.pom", + f"jackson-parent/{new_jackson_parent}/jackson-parent-{new_jackson_parent}.pom"), + (f"com/fasterxml/oss-parent/{old_oss_parent}/oss-parent-{old_oss_parent}.pom", + f"com/fasterxml/oss-parent/{new_oss_parent}/oss-parent-{new_oss_parent}.pom"), + (f"depgraph-maven-plugin/{old_plugin}/depgraph-maven-plugin-{old_plugin}.", + f"depgraph-maven-plugin/{new_plugin}/depgraph-maven-plugin-{new_plugin}."), +] + +# Substitutions applied to diagnostics.expected files +diagnostics_substitutions = [ + (f"depgraph-maven-plugin:{old_plugin}:graph", + f"depgraph-maven-plugin:{new_plugin}:graph"), +] + +def update(filepath, substitutions): + with open(filepath) as f: + content = f.read() + updated = content + for old, new in substitutions: + updated = updated.replace(old, new) + if updated != content: + with open(filepath, 'w') as f: + f.write(updated) + print(f" Updated: {os.path.relpath(filepath, script_dir)}") + +for fp in glob.glob(os.path.join(script_dir, "java", "**", "maven-fetches.expected"), recursive=True): + update(fp, fetch_substitutions) + +for fp in glob.glob(os.path.join(script_dir, "java", "**", "diagnostics.expected"), recursive=True): + update(fp, diagnostics_substitutions) + +print(" Expected files updated.") +PYEOF + +python3 "${WORK_DIR}/update_expected.py" \ + "${SCRIPT_DIR}" \ + "${OLD_JACKSON}" "${JACKSON_VERSION}" \ + "${OLD_JACKSON_PARENT}" "${NEW_JACKSON_PARENT}" \ + "${OLD_OSS_PARENT}" "${NEW_OSS_PARENT}" \ + "${OLD_PLUGIN}" "${PLUGIN_CODEQL_VERSION}" + +echo "" +echo "=== Update complete ===" +echo "" +echo "Next steps:" +echo " 1. Copy ${ZIP_OUT} -> semmle-code resources/lib/ferstl-depgraph-dependencies/ferstl-depgraph-dependencies.zip" +echo " 2. In semmle-code, update autobuild/src/com/semmle/util/build/Maven.java:" +echo " bump the plugin version constant to '${PLUGIN_CODEQL_VERSION}'" +echo " 3. Commit and raise PRs in both repositories." diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index a6c0cfc278ad..2e702064d7f8 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 9.1.2 + +### Minor Analysis Improvements + +* Added LLM-generated source and sink models for `org.apache.avro`. + ## 9.1.1 ### Minor Analysis Improvements diff --git a/java/ql/lib/change-notes/2026-05-07-apache-httpclient-ssrf-sinks.md b/java/ql/lib/change-notes/2026-05-07-apache-httpclient-ssrf-sinks.md new file mode 100644 index 000000000000..d51f48974868 --- /dev/null +++ b/java/ql/lib/change-notes/2026-05-07-apache-httpclient-ssrf-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Improved modeling of Apache HttpClient `execute` method sinks for `java/ssrf` and `java/non-https-url`. diff --git a/java/ql/lib/change-notes/released/9.1.2.md b/java/ql/lib/change-notes/released/9.1.2.md new file mode 100644 index 000000000000..c10b69f0fe9d --- /dev/null +++ b/java/ql/lib/change-notes/released/9.1.2.md @@ -0,0 +1,5 @@ +## 9.1.2 + +### Minor Analysis Improvements + +* Added LLM-generated source and sink models for `org.apache.avro`. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 02e630d33846..1fd7d868f4ed 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 9.1.1 +lastReleaseVersion: 9.1.2 diff --git a/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.file.model.yml b/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.file.model.yml new file mode 100644 index 000000000000..185d396fd72e --- /dev/null +++ b/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.file.model.yml @@ -0,0 +1,29 @@ +# THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT. +# Generated from https://github.com/apache/avro.git#68da8fb99da5c482f17853e01e79f714e3717b42 by codeql-mads-via-llm +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.avro.file", "DataFileReader", True, "openReader", "(File,DatumReader)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "DataFileWriter", True, "appendTo", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "DataFileWriter", True, "create", "(Schema,File)", "", "Argument[1]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "SeekableFileInput", True, "SeekableFileInput", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "SyncableFileOutputStream", True, "SyncableFileOutputStream", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "SyncableFileOutputStream", True, "SyncableFileOutputStream", "(File,boolean)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "SyncableFileOutputStream", True, "SyncableFileOutputStream", "(String)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro.file", "SyncableFileOutputStream", True, "SyncableFileOutputStream", "(String,boolean)", "", "Argument[0]", "path-injection", "ai-generated"] + - addsTo: + pack: codeql/java-all + extensible: sourceModel + data: + - ["org.apache.avro.file", "DataFileReader12", True, "getMeta", "(String)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileReader12", True, "getMetaString", "(String)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileReader12", True, "next", "()", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileReader12", True, "next", "(Object)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileStream", True, "getMeta", "(String)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileStream", True, "getMetaString", "(String)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileStream", True, "next", "()", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileStream", True, "next", "(Object)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "DataFileStream", True, "nextBlock", "()", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro.file", "FileReader", True, "next", "(Object)", "", "ReturnValue", "file", "ai-generated"] diff --git a/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.model.yml b/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.model.yml new file mode 100644 index 000000000000..e6b5048429c5 --- /dev/null +++ b/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.model.yml @@ -0,0 +1,29 @@ +# THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT. +# Generated from https://github.com/apache/avro.git#68da8fb99da5c482f17853e01e79f714e3717b42 by codeql-mads-via-llm +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.avro", "Protocol", True, "parse", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "Schema", True, "parse", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "Schema$Parser", True, "parse", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(File)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(Path)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(Path,Charset)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(URI,Charset)", "", "Argument[0]", "path-injection", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(URI,Charset)", "", "Argument[0]", "request-forgery", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parseSingle", "(Path)", "", "Argument[0]", "path-injection", "ai-generated"] + - addsTo: + pack: codeql/java-all + extensible: sourceModel + data: + - ["org.apache.avro", "Protocol", True, "parse", "(File)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro", "Schema", True, "parse", "(File)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(File)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(File,Charset)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(Path)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(Path,Charset)", "", "ReturnValue", "file", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parse", "(URI,Charset)", "", "ReturnValue", "remote", "ai-generated"] + - ["org.apache.avro", "SchemaParser", True, "parseSingle", "(Path)", "", "ReturnValue", "file", "ai-generated"] diff --git a/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.util.model.yml b/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.util.model.yml new file mode 100644 index 000000000000..31ca686c9f9d --- /dev/null +++ b/java/ql/lib/ext/generated/llmgenerator/org.apache.avro.util.model.yml @@ -0,0 +1,8 @@ +# THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT. +# Generated from https://github.com/apache/avro.git#68da8fb99da5c482f17853e01e79f714e3717b42 by codeql-mads-via-llm +extensions: + - addsTo: + pack: codeql/java-all + extensible: sourceModel + data: + - ["org.apache.avro.util", "RandomData", True, "main", "(String[])", "", "Argument[0]", "commandargs", "ai-generated"] diff --git a/java/ql/lib/ext/org.apache.http.client.methods.model.yml b/java/ql/lib/ext/org.apache.http.client.methods.model.yml index 4eccb08eb8ce..4560e402f43e 100644 --- a/java/ql/lib/ext/org.apache.http.client.methods.model.yml +++ b/java/ql/lib/ext/org.apache.http.client.methods.model.yml @@ -11,7 +11,7 @@ extensions: - ["org.apache.http.client.methods", "HttpPost", False, "HttpPost", "", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.http.client.methods", "HttpPut", False, "HttpPut", "", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.http.client.methods", "HttpRequestBase", True, "setURI", "", "", "Argument[0]", "request-forgery", "manual"] - - ["org.apache.http.client.methods", "HttpRequestWrapper", True, "setURI", "(URI)", "", "Argument[0]", "request-forgery", "hq-manual"] + - ["org.apache.http.client.methods", "HttpRequestWrapper", True, "setURI", "(URI)", "", "Argument[0]", "request-forgery", "ai-manual"] - ["org.apache.http.client.methods", "HttpTrace", False, "HttpTrace", "", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.http.client.methods", "RequestBuilder", False, "delete", "", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.http.client.methods", "RequestBuilder", False, "get", "", "", "Argument[0]", "request-forgery", "manual"] @@ -22,3 +22,29 @@ extensions: - ["org.apache.http.client.methods", "RequestBuilder", False, "put", "", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.http.client.methods", "RequestBuilder", False, "setUri", "", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.http.client.methods", "RequestBuilder", False, "trace", "", "", "Argument[0]", "request-forgery", "manual"] + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["org.apache.http.client.methods", "RequestBuilder", True, "build", "()", "", "Argument[this]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "delete", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "delete", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "get", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "get", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "getUri", "()", "", "Argument[this]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "head", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "head", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "options", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "options", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "patch", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "patch", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "post", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "post", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "put", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "put", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "setUri", "(String)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "setUri", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "setUri", "(URI)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "setUri", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "trace", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] + - ["org.apache.http.client.methods", "RequestBuilder", True, "trace", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"] diff --git a/java/ql/lib/ext/org.apache.http.client.model.yml b/java/ql/lib/ext/org.apache.http.client.model.yml index 681efdf32e7c..caba9bd718b2 100644 --- a/java/ql/lib/ext/org.apache.http.client.model.yml +++ b/java/ql/lib/ext/org.apache.http.client.model.yml @@ -3,6 +3,11 @@ extensions: pack: codeql/java-all extensible: sinkModel data: + - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpHost,HttpRequest)", "", "Argument[0]", "request-forgery", "ai-manual"] + - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpHost,HttpRequest,HttpContext)", "", "Argument[0]", "request-forgery", "ai-manual"] + - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpHost,HttpRequest,ResponseHandler)", "", "Argument[0]", "request-forgery", "ai-manual"] + - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpHost,HttpRequest,ResponseHandler,HttpContext)", "", "Argument[0]", "request-forgery", "ai-manual"] + - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpUriRequest)", "", "Argument[0]", "request-forgery", "ai-manual"] - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpUriRequest,HttpContext)", "", "Argument[0]", "request-forgery", "ai-manual"] + - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpUriRequest,ResponseHandler)", "", "Argument[0]", "request-forgery", "ai-manual"] - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpUriRequest,ResponseHandler,HttpContext)", "", "Argument[0]", "request-forgery", "ai-manual"] - - ["org.apache.http.client", "HttpClient", True, "execute", "(HttpUriRequest)", "", "Argument[0]", "request-forgery", "ai-manual"] diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 5f6482c1ae2b..18948bf45f52 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.1.1 +version: 9.1.3-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index 27f0102b3cfb..3407a43403e8 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -84,7 +84,13 @@ private module Ast implements AstSig { class DoStmt = J::DoStmt; - class ForStmt = J::ForStmt; + final private class FinalForStmt = J::ForStmt; + + class ForStmt extends FinalForStmt { + AstNode getInit(int index) { result = super.getInit(index) } + + AstNode getUpdate(int index) { result = super.getUpdate(index) } + } final private class FinalEnhancedForStmt = J::EnhancedForStmt; diff --git a/java/ql/lib/semmle/code/java/dataflow/Bound.qll b/java/ql/lib/semmle/code/java/dataflow/Bound.qll index 65af6fb13a81..4780b9caccac 100644 --- a/java/ql/lib/semmle/code/java/dataflow/Bound.qll +++ b/java/ql/lib/semmle/code/java/dataflow/Bound.qll @@ -4,67 +4,33 @@ overlay[local?] module; -private import internal.rangeanalysis.BoundSpecific - -private newtype TBound = - TBoundZero() or - TBoundSsa(SsaVariable v) { v.getSourceVariable().getType() instanceof IntegralType } or - TBoundExpr(Expr e) { - interestingExprBound(e) and - not exists(SsaVariable v | e = v.getAUse()) +private import java as J +private import semmle.code.java.dataflow.SSA +private import semmle.code.java.dataflow.RangeUtils as RU +private import codeql.rangeanalysis.Bound as SharedBound + +private module BoundDefs implements SharedBound::BoundDefinitions { + class SsaVariable extends Ssa::SsaDefinition { + /** Gets a use of this variable. */ + Expr getAUse() { result = super.getARead() } } -/** - * A bound that may be inferred for an expression plus/minus an integer delta. - */ -abstract class Bound extends TBound { - /** Gets a textual representation of this bound. */ - abstract string toString(); - - /** Gets an expression that equals this bound plus `delta`. */ - abstract Expr getExpr(int delta); - - /** Gets an expression that equals this bound. */ - Expr getExpr() { result = this.getExpr(0) } + class SsaSourceVariable = Ssa::SourceVariable; - /** Gets the location of this bound. */ - abstract Location getLocation(); -} + class Type = J::Type; -/** - * The bound that corresponds to the integer 0. This is used to represent all - * integer bounds as bounds are always accompanied by an added integer delta. - */ -class ZeroBound extends Bound, TBoundZero { - override string toString() { result = "0" } + class Expr = J::Expr; - override Expr getExpr(int delta) { result.(ConstantIntegerExpr).getIntValue() = delta } + class IntegralType = J::IntegralType; - override Location getLocation() { result.hasLocationInfo("", 0, 0, 0, 0) } -} + class ConstantIntegerExpr = RU::ConstantIntegerExpr; -/** - * A bound corresponding to the value of an SSA variable. - */ -class SsaBound extends Bound, TBoundSsa { - /** Gets the SSA variable that equals this bound. */ - SsaVariable getSsa() { this = TBoundSsa(result) } - - override string toString() { result = this.getSsa().toString() } - - override Expr getExpr(int delta) { result = this.getSsa().getAUse() and delta = 0 } - - override Location getLocation() { result = this.getSsa().getLocation() } + /** Holds if `e` is a bound expression and it is not an SSA variable read. */ + predicate interestingExprBound(Expr e) { + e.(J::FieldRead).getField() instanceof J::ArrayLengthField + } } -/** - * A bound that corresponds to the value of a specific expression that might be - * interesting, but isn't otherwise represented by the value of an SSA variable. - */ -class ExprBound extends Bound, TBoundExpr { - override string toString() { result = this.getExpr().toString() } +module BoundImpl = SharedBound::Bound; - override Expr getExpr(int delta) { this = TBoundExpr(result) and delta = 0 } - - override Location getLocation() { result = this.getExpr().getLocation() } -} +import BoundImpl diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll deleted file mode 100644 index cd85883f7bc4..000000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Provides Java-specific definitions for bounds. - */ -overlay[local?] -module; - -private import java as J -private import semmle.code.java.dataflow.SSA as Ssa -private import semmle.code.java.dataflow.RangeUtils as RU - -class SsaVariable extends Ssa::SsaDefinition { - /** Gets a use of this variable. */ - Expr getAUse() { result = super.getARead() } -} - -class Expr = J::Expr; - -class Location = J::Location; - -class IntegralType = J::IntegralType; - -class ConstantIntegerExpr = RU::ConstantIntegerExpr; - -/** Holds if `e` is a bound expression and it is not an SSA variable read. */ -predicate interestingExprBound(Expr e) { - e.(J::FieldRead).getField() instanceof J::ArrayLengthField -} diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index fbbc339797b2..e013e79ce9e8 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.11.4 + +No user-facing changes. + ## 1.11.3 ### Minor Analysis Improvements diff --git a/java/ql/src/change-notes/released/1.11.4.md b/java/ql/src/change-notes/released/1.11.4.md new file mode 100644 index 000000000000..3ebd37b0be7a --- /dev/null +++ b/java/ql/src/change-notes/released/1.11.4.md @@ -0,0 +1,3 @@ +## 1.11.4 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 220561dc648b..813a925461f3 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.11.3 +lastReleaseVersion: 1.11.4 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 1d3c3c5b7163..ac5194842252 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.3 +version: 1.11.5-dev groups: - java - queries diff --git a/java/ql/test/query-tests/security/CWE-918/ApacheHttpClientExecuteSSRF.java b/java/ql/test/query-tests/security/CWE-918/ApacheHttpClientExecuteSSRF.java new file mode 100644 index 000000000000..e9206335e5d5 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-918/ApacheHttpClientExecuteSSRF.java @@ -0,0 +1,45 @@ +import java.io.IOException; + +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.client.HttpClient; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicHttpRequest; +import org.apache.http.protocol.HttpContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ApacheHttpClientExecuteSSRF extends HttpServlet { + + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + + String source = request.getParameter("host"); // $ Source + + HttpHost host = new HttpHost(source); + HttpRequest req = new BasicHttpRequest("GET", "/"); + HttpUriRequest uriReq = RequestBuilder.get(source).build(); // $ Alert + HttpContext context = null; + HttpClient client = HttpClients.createDefault(); + ResponseHandler handler = null; + + client.execute(host, req); // $ Alert + client.execute(host, req, context); // $ Alert + client.execute(host, req, handler); // $ Alert + client.execute(host, req, handler, context); // $ Alert + client.execute(uriReq); // $ Alert + client.execute(uriReq, context); // $ Alert + client.execute(uriReq, handler); // $ Alert + client.execute(uriReq, handler, context); // $ Alert + + } catch (Exception e) { + // TODO: handle exception + } + } +} diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected index a84c752b02d5..1a36fba94c72 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -1,4 +1,13 @@ #select +| ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:32:28:32:31 | host | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:32:28:32:31 | host | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:33:28:33:31 | host | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:33:28:33:31 | host | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:34:28:34:31 | host | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:34:28:34:31 | host | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:35:28:35:31 | host | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:35:28:35:31 | host | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:36:28:36:33 | uriReq | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:36:28:36:33 | uriReq | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:37:28:37:33 | uriReq | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:37:28:37:33 | uriReq | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:38:28:38:33 | uriReq | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:38:28:38:33 | uriReq | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | +| ApacheHttpClientExecuteSSRF.java:39:28:39:33 | uriReq | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:39:28:39:33 | uriReq | Potential server-side request forgery due to a $@. | ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) | user-provided value | | ApacheHttpSSRF.java:30:43:30:45 | uri | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:30:43:30:45 | uri | Potential server-side request forgery due to a $@. | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) | user-provided value | | ApacheHttpSSRF.java:32:29:32:31 | uri | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:32:29:32:31 | uri | Potential server-side request forgery due to a $@. | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) | user-provided value | | ApacheHttpSSRF.java:34:26:34:28 | uri | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:34:26:34:28 | uri | Potential server-side request forgery due to a $@. | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) | user-provided value | @@ -377,7 +386,21 @@ | mad/Test.java:107:15:107:31 | (...)... | mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:15:107:31 | (...)... | Potential server-side request forgery due to a $@. | mad/Test.java:26:16:26:41 | getParameter(...) | user-provided value | | mad/Test.java:112:15:112:31 | (...)... | mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:15:112:31 | (...)... | Potential server-side request forgery due to a $@. | mad/Test.java:26:16:26:41 | getParameter(...) | user-provided value | edges -| ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:28:31:28:34 | sink : String | provenance | Src:MaD:277 | +| ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:25:42:25:47 | source : String | provenance | Src:MaD:285 | +| ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source | provenance | Src:MaD:285 Sink:MaD:220 | +| ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source : String | provenance | Src:MaD:285 | +| ApacheHttpClientExecuteSSRF.java:25:29:25:48 | new HttpHost(...) : HttpHost | ApacheHttpClientExecuteSSRF.java:32:28:32:31 | host | provenance | Sink:MaD:228 | +| ApacheHttpClientExecuteSSRF.java:25:29:25:48 | new HttpHost(...) : HttpHost | ApacheHttpClientExecuteSSRF.java:33:28:33:31 | host | provenance | Sink:MaD:229 | +| ApacheHttpClientExecuteSSRF.java:25:29:25:48 | new HttpHost(...) : HttpHost | ApacheHttpClientExecuteSSRF.java:34:28:34:31 | host | provenance | Sink:MaD:230 | +| ApacheHttpClientExecuteSSRF.java:25:29:25:48 | new HttpHost(...) : HttpHost | ApacheHttpClientExecuteSSRF.java:35:28:35:31 | host | provenance | Sink:MaD:231 | +| ApacheHttpClientExecuteSSRF.java:25:42:25:47 | source : String | ApacheHttpClientExecuteSSRF.java:25:29:25:48 | new HttpHost(...) : HttpHost | provenance | MaD:307 | +| ApacheHttpClientExecuteSSRF.java:27:37:27:62 | get(...) : RequestBuilder | ApacheHttpClientExecuteSSRF.java:27:37:27:70 | build(...) : HttpUriRequest | provenance | MaD:304 | +| ApacheHttpClientExecuteSSRF.java:27:37:27:70 | build(...) : HttpUriRequest | ApacheHttpClientExecuteSSRF.java:36:28:36:33 | uriReq | provenance | Sink:MaD:232 | +| ApacheHttpClientExecuteSSRF.java:27:37:27:70 | build(...) : HttpUriRequest | ApacheHttpClientExecuteSSRF.java:37:28:37:33 | uriReq | provenance | Sink:MaD:233 | +| ApacheHttpClientExecuteSSRF.java:27:37:27:70 | build(...) : HttpUriRequest | ApacheHttpClientExecuteSSRF.java:38:28:38:33 | uriReq | provenance | Sink:MaD:234 | +| ApacheHttpClientExecuteSSRF.java:27:37:27:70 | build(...) : HttpUriRequest | ApacheHttpClientExecuteSSRF.java:39:28:39:33 | uriReq | provenance | Sink:MaD:235 | +| ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source : String | ApacheHttpClientExecuteSSRF.java:27:37:27:62 | get(...) : RequestBuilder | provenance | MaD:305 | +| ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:28:31:28:34 | sink : String | provenance | Src:MaD:285 | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:30:43:30:45 | uri | provenance | Sink:MaD:211 | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:32:29:32:31 | uri | provenance | Sink:MaD:217 | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:34:26:34:28 | uri | provenance | Sink:MaD:212 | @@ -403,16 +426,16 @@ edges | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:57:34:57:36 | uri | provenance | Sink:MaD:223 | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:58:43:58:45 | uri | provenance | Sink:MaD:226 | | ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRF.java:42:62:42:64 | uri : URI | ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | provenance | MaD:287 | -| ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | ApacheHttpSSRF.java:42:34:42:82 | new BasicRequestLine(...) | provenance | MaD:296 Sink:MaD:231 | -| ApacheHttpSSRF.java:43:41:43:43 | uri : URI | ApacheHttpSSRF.java:43:41:43:54 | toString(...) | provenance | MaD:287 Sink:MaD:232 | -| ApacheHttpSSRF.java:44:41:44:43 | uri : URI | ApacheHttpSSRF.java:44:41:44:54 | toString(...) | provenance | MaD:287 Sink:MaD:233 | -| ApacheHttpSSRF.java:46:77:46:79 | uri : URI | ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | provenance | MaD:287 | -| ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | ApacheHttpSSRF.java:46:49:46:97 | new BasicRequestLine(...) | provenance | MaD:296 Sink:MaD:228 | -| ApacheHttpSSRF.java:47:56:47:58 | uri : URI | ApacheHttpSSRF.java:47:56:47:69 | toString(...) | provenance | MaD:287 Sink:MaD:229 | -| ApacheHttpSSRF.java:48:56:48:58 | uri : URI | ApacheHttpSSRF.java:48:56:48:69 | toString(...) | provenance | MaD:287 Sink:MaD:230 | -| ApacheHttpSSRFVersion5.java:41:30:41:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRF.java:42:62:42:64 | uri : URI | ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | provenance | MaD:295 | +| ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | ApacheHttpSSRF.java:42:34:42:82 | new BasicRequestLine(...) | provenance | MaD:306 Sink:MaD:239 | +| ApacheHttpSSRF.java:43:41:43:43 | uri : URI | ApacheHttpSSRF.java:43:41:43:54 | toString(...) | provenance | MaD:295 Sink:MaD:240 | +| ApacheHttpSSRF.java:44:41:44:43 | uri : URI | ApacheHttpSSRF.java:44:41:44:54 | toString(...) | provenance | MaD:295 Sink:MaD:241 | +| ApacheHttpSSRF.java:46:77:46:79 | uri : URI | ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | provenance | MaD:295 | +| ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | ApacheHttpSSRF.java:46:49:46:97 | new BasicRequestLine(...) | provenance | MaD:306 Sink:MaD:236 | +| ApacheHttpSSRF.java:47:56:47:58 | uri : URI | ApacheHttpSSRF.java:47:56:47:69 | toString(...) | provenance | MaD:295 Sink:MaD:237 | +| ApacheHttpSSRF.java:48:56:48:58 | uri : URI | ApacheHttpSSRF.java:48:56:48:69 | toString(...) | provenance | MaD:295 Sink:MaD:238 | +| ApacheHttpSSRFVersion5.java:41:30:41:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:50:54:50:56 | uri | provenance | Sink:MaD:40 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | provenance | | @@ -478,8 +501,8 @@ edges | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:168:40:168:42 | uri | provenance | Sink:MaD:121 | | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:44:31:44:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRFVersion5.java:44:31:44:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:48:54:48:57 | host | provenance | Sink:MaD:38 | | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:54:38:54:41 | host | provenance | Sink:MaD:43 | | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:58:35:58:38 | host | provenance | Sink:MaD:46 | @@ -503,38 +526,38 @@ edges | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:132:36:132:39 | host | provenance | Sink:MaD:100 | | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:136:38:136:41 | host | provenance | Sink:MaD:103 | | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:162:52:162:55 | host | provenance | Sink:MaD:204 | -| ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | provenance | MaD:295 | -| ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | ApacheHttpSSRFVersion5.java:49:54:49:67 | toString(...) | provenance | MaD:287 Sink:MaD:39 | -| ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | ApacheHttpSSRFVersion5.java:51:48:51:61 | toString(...) | provenance | MaD:287 Sink:MaD:41 | -| ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | ApacheHttpSSRFVersion5.java:55:38:55:51 | toString(...) | provenance | MaD:287 Sink:MaD:44 | -| ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | ApacheHttpSSRFVersion5.java:59:35:59:48 | toString(...) | provenance | MaD:287 Sink:MaD:47 | -| ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | ApacheHttpSSRFVersion5.java:63:36:63:49 | toString(...) | provenance | MaD:287 Sink:MaD:50 | -| ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | ApacheHttpSSRFVersion5.java:67:39:67:52 | toString(...) | provenance | MaD:287 Sink:MaD:53 | -| ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | ApacheHttpSSRFVersion5.java:71:37:71:50 | toString(...) | provenance | MaD:287 Sink:MaD:56 | -| ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | ApacheHttpSSRFVersion5.java:75:36:75:49 | toString(...) | provenance | MaD:287 Sink:MaD:59 | -| ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | ApacheHttpSSRFVersion5.java:79:35:79:48 | toString(...) | provenance | MaD:287 Sink:MaD:62 | -| ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | ApacheHttpSSRFVersion5.java:83:37:83:50 | toString(...) | provenance | MaD:287 Sink:MaD:65 | -| ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | ApacheHttpSSRFVersion5.java:98:48:98:61 | toString(...) | provenance | MaD:287 Sink:MaD:75 | -| ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | ApacheHttpSSRFVersion5.java:103:55:103:68 | toString(...) | provenance | MaD:287 Sink:MaD:78 | -| ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | ApacheHttpSSRFVersion5.java:105:49:105:62 | toString(...) | provenance | MaD:287 Sink:MaD:80 | -| ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | ApacheHttpSSRFVersion5.java:109:39:109:52 | toString(...) | provenance | MaD:287 Sink:MaD:83 | -| ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | ApacheHttpSSRFVersion5.java:113:36:113:49 | toString(...) | provenance | MaD:287 Sink:MaD:86 | -| ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | ApacheHttpSSRFVersion5.java:117:37:117:50 | toString(...) | provenance | MaD:287 Sink:MaD:89 | -| ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | ApacheHttpSSRFVersion5.java:121:40:121:53 | toString(...) | provenance | MaD:287 Sink:MaD:92 | -| ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | ApacheHttpSSRFVersion5.java:125:38:125:51 | toString(...) | provenance | MaD:287 Sink:MaD:95 | -| ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | ApacheHttpSSRFVersion5.java:129:37:129:50 | toString(...) | provenance | MaD:287 Sink:MaD:98 | -| ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | ApacheHttpSSRFVersion5.java:133:36:133:49 | toString(...) | provenance | MaD:287 Sink:MaD:101 | -| ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | ApacheHttpSSRFVersion5.java:137:38:137:51 | toString(...) | provenance | MaD:287 Sink:MaD:104 | -| ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | ApacheHttpSSRFVersion5.java:141:41:141:54 | toString(...) | provenance | MaD:287 Sink:MaD:106 | -| ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | ApacheHttpSSRFVersion5.java:144:38:144:51 | toString(...) | provenance | MaD:287 Sink:MaD:108 | -| ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | ApacheHttpSSRFVersion5.java:147:39:147:52 | toString(...) | provenance | MaD:287 Sink:MaD:110 | -| ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | ApacheHttpSSRFVersion5.java:150:42:150:55 | toString(...) | provenance | MaD:287 Sink:MaD:112 | -| ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | ApacheHttpSSRFVersion5.java:153:40:153:53 | toString(...) | provenance | MaD:287 Sink:MaD:114 | -| ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | ApacheHttpSSRFVersion5.java:156:39:156:52 | toString(...) | provenance | MaD:287 Sink:MaD:116 | -| ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | ApacheHttpSSRFVersion5.java:159:38:159:51 | toString(...) | provenance | MaD:287 Sink:MaD:118 | -| ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | ApacheHttpSSRFVersion5.java:164:47:164:60 | toString(...) | provenance | MaD:287 Sink:MaD:205 | -| ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | ApacheHttpSSRFVersion5.java:167:40:167:53 | toString(...) | provenance | MaD:287 Sink:MaD:120 | -| ApacheHttpSSRFVersion5.java:180:30:180:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | provenance | MaD:303 | +| ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | ApacheHttpSSRFVersion5.java:49:54:49:67 | toString(...) | provenance | MaD:295 Sink:MaD:39 | +| ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | ApacheHttpSSRFVersion5.java:51:48:51:61 | toString(...) | provenance | MaD:295 Sink:MaD:41 | +| ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | ApacheHttpSSRFVersion5.java:55:38:55:51 | toString(...) | provenance | MaD:295 Sink:MaD:44 | +| ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | ApacheHttpSSRFVersion5.java:59:35:59:48 | toString(...) | provenance | MaD:295 Sink:MaD:47 | +| ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | ApacheHttpSSRFVersion5.java:63:36:63:49 | toString(...) | provenance | MaD:295 Sink:MaD:50 | +| ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | ApacheHttpSSRFVersion5.java:67:39:67:52 | toString(...) | provenance | MaD:295 Sink:MaD:53 | +| ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | ApacheHttpSSRFVersion5.java:71:37:71:50 | toString(...) | provenance | MaD:295 Sink:MaD:56 | +| ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | ApacheHttpSSRFVersion5.java:75:36:75:49 | toString(...) | provenance | MaD:295 Sink:MaD:59 | +| ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | ApacheHttpSSRFVersion5.java:79:35:79:48 | toString(...) | provenance | MaD:295 Sink:MaD:62 | +| ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | ApacheHttpSSRFVersion5.java:83:37:83:50 | toString(...) | provenance | MaD:295 Sink:MaD:65 | +| ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | ApacheHttpSSRFVersion5.java:98:48:98:61 | toString(...) | provenance | MaD:295 Sink:MaD:75 | +| ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | ApacheHttpSSRFVersion5.java:103:55:103:68 | toString(...) | provenance | MaD:295 Sink:MaD:78 | +| ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | ApacheHttpSSRFVersion5.java:105:49:105:62 | toString(...) | provenance | MaD:295 Sink:MaD:80 | +| ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | ApacheHttpSSRFVersion5.java:109:39:109:52 | toString(...) | provenance | MaD:295 Sink:MaD:83 | +| ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | ApacheHttpSSRFVersion5.java:113:36:113:49 | toString(...) | provenance | MaD:295 Sink:MaD:86 | +| ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | ApacheHttpSSRFVersion5.java:117:37:117:50 | toString(...) | provenance | MaD:295 Sink:MaD:89 | +| ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | ApacheHttpSSRFVersion5.java:121:40:121:53 | toString(...) | provenance | MaD:295 Sink:MaD:92 | +| ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | ApacheHttpSSRFVersion5.java:125:38:125:51 | toString(...) | provenance | MaD:295 Sink:MaD:95 | +| ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | ApacheHttpSSRFVersion5.java:129:37:129:50 | toString(...) | provenance | MaD:295 Sink:MaD:98 | +| ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | ApacheHttpSSRFVersion5.java:133:36:133:49 | toString(...) | provenance | MaD:295 Sink:MaD:101 | +| ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | ApacheHttpSSRFVersion5.java:137:38:137:51 | toString(...) | provenance | MaD:295 Sink:MaD:104 | +| ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | ApacheHttpSSRFVersion5.java:141:41:141:54 | toString(...) | provenance | MaD:295 Sink:MaD:106 | +| ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | ApacheHttpSSRFVersion5.java:144:38:144:51 | toString(...) | provenance | MaD:295 Sink:MaD:108 | +| ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | ApacheHttpSSRFVersion5.java:147:39:147:52 | toString(...) | provenance | MaD:295 Sink:MaD:110 | +| ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | ApacheHttpSSRFVersion5.java:150:42:150:55 | toString(...) | provenance | MaD:295 Sink:MaD:112 | +| ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | ApacheHttpSSRFVersion5.java:153:40:153:53 | toString(...) | provenance | MaD:295 Sink:MaD:114 | +| ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | ApacheHttpSSRFVersion5.java:156:39:156:52 | toString(...) | provenance | MaD:295 Sink:MaD:116 | +| ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | ApacheHttpSSRFVersion5.java:159:38:159:51 | toString(...) | provenance | MaD:295 Sink:MaD:118 | +| ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | ApacheHttpSSRFVersion5.java:164:47:164:60 | toString(...) | provenance | MaD:295 Sink:MaD:205 | +| ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | ApacheHttpSSRFVersion5.java:167:40:167:53 | toString(...) | provenance | MaD:295 Sink:MaD:120 | +| ApacheHttpSSRFVersion5.java:180:30:180:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:185:56:185:58 | uri | provenance | Sink:MaD:123 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | provenance | | @@ -573,26 +596,26 @@ edges | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:236:27:236:29 | uri | provenance | Sink:MaD:157 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:239:46:239:48 | uri | provenance | Sink:MaD:158 | | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | ApacheHttpSSRFVersion5.java:184:56:184:69 | toString(...) | provenance | MaD:287 Sink:MaD:122 | -| ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | ApacheHttpSSRFVersion5.java:186:50:186:63 | toString(...) | provenance | MaD:287 Sink:MaD:124 | -| ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | ApacheHttpSSRFVersion5.java:189:40:189:53 | toString(...) | provenance | MaD:287 Sink:MaD:126 | -| ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | ApacheHttpSSRFVersion5.java:192:37:192:50 | toString(...) | provenance | MaD:287 Sink:MaD:128 | -| ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | ApacheHttpSSRFVersion5.java:195:38:195:51 | toString(...) | provenance | MaD:287 Sink:MaD:130 | -| ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | ApacheHttpSSRFVersion5.java:198:41:198:54 | toString(...) | provenance | MaD:287 Sink:MaD:132 | -| ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | ApacheHttpSSRFVersion5.java:201:39:201:52 | toString(...) | provenance | MaD:287 Sink:MaD:134 | -| ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | ApacheHttpSSRFVersion5.java:204:38:204:51 | toString(...) | provenance | MaD:287 Sink:MaD:136 | -| ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | ApacheHttpSSRFVersion5.java:207:37:207:50 | toString(...) | provenance | MaD:287 Sink:MaD:138 | -| ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | ApacheHttpSSRFVersion5.java:210:39:210:52 | toString(...) | provenance | MaD:287 Sink:MaD:140 | -| ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | ApacheHttpSSRFVersion5.java:214:28:214:41 | toString(...) | provenance | MaD:287 Sink:MaD:142 | -| ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | ApacheHttpSSRFVersion5.java:217:25:217:38 | toString(...) | provenance | MaD:287 Sink:MaD:144 | -| ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | ApacheHttpSSRFVersion5.java:220:26:220:39 | toString(...) | provenance | MaD:287 Sink:MaD:146 | -| ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | ApacheHttpSSRFVersion5.java:223:29:223:42 | toString(...) | provenance | MaD:287 Sink:MaD:148 | -| ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | ApacheHttpSSRFVersion5.java:226:27:226:40 | toString(...) | provenance | MaD:287 Sink:MaD:150 | -| ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | ApacheHttpSSRFVersion5.java:229:26:229:39 | toString(...) | provenance | MaD:287 Sink:MaD:152 | -| ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | ApacheHttpSSRFVersion5.java:232:25:232:38 | toString(...) | provenance | MaD:287 Sink:MaD:154 | -| ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | ApacheHttpSSRFVersion5.java:235:27:235:40 | toString(...) | provenance | MaD:287 Sink:MaD:156 | -| ApacheHttpSSRFVersion5.java:251:30:251:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | ApacheHttpSSRFVersion5.java:184:56:184:69 | toString(...) | provenance | MaD:295 Sink:MaD:122 | +| ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | ApacheHttpSSRFVersion5.java:186:50:186:63 | toString(...) | provenance | MaD:295 Sink:MaD:124 | +| ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | ApacheHttpSSRFVersion5.java:189:40:189:53 | toString(...) | provenance | MaD:295 Sink:MaD:126 | +| ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | ApacheHttpSSRFVersion5.java:192:37:192:50 | toString(...) | provenance | MaD:295 Sink:MaD:128 | +| ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | ApacheHttpSSRFVersion5.java:195:38:195:51 | toString(...) | provenance | MaD:295 Sink:MaD:130 | +| ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | ApacheHttpSSRFVersion5.java:198:41:198:54 | toString(...) | provenance | MaD:295 Sink:MaD:132 | +| ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | ApacheHttpSSRFVersion5.java:201:39:201:52 | toString(...) | provenance | MaD:295 Sink:MaD:134 | +| ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | ApacheHttpSSRFVersion5.java:204:38:204:51 | toString(...) | provenance | MaD:295 Sink:MaD:136 | +| ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | ApacheHttpSSRFVersion5.java:207:37:207:50 | toString(...) | provenance | MaD:295 Sink:MaD:138 | +| ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | ApacheHttpSSRFVersion5.java:210:39:210:52 | toString(...) | provenance | MaD:295 Sink:MaD:140 | +| ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | ApacheHttpSSRFVersion5.java:214:28:214:41 | toString(...) | provenance | MaD:295 Sink:MaD:142 | +| ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | ApacheHttpSSRFVersion5.java:217:25:217:38 | toString(...) | provenance | MaD:295 Sink:MaD:144 | +| ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | ApacheHttpSSRFVersion5.java:220:26:220:39 | toString(...) | provenance | MaD:295 Sink:MaD:146 | +| ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | ApacheHttpSSRFVersion5.java:223:29:223:42 | toString(...) | provenance | MaD:295 Sink:MaD:148 | +| ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | ApacheHttpSSRFVersion5.java:226:27:226:40 | toString(...) | provenance | MaD:295 Sink:MaD:150 | +| ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | ApacheHttpSSRFVersion5.java:229:26:229:39 | toString(...) | provenance | MaD:295 Sink:MaD:152 | +| ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | ApacheHttpSSRFVersion5.java:232:25:232:38 | toString(...) | provenance | MaD:295 Sink:MaD:154 | +| ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | ApacheHttpSSRFVersion5.java:235:27:235:40 | toString(...) | provenance | MaD:295 Sink:MaD:156 | +| ApacheHttpSSRFVersion5.java:251:30:251:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:255:44:255:46 | uri | provenance | Sink:MaD:159 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:257:38:257:40 | uri | provenance | Sink:MaD:161 | @@ -613,30 +636,30 @@ edges | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:281:27:281:29 | uri | provenance | Sink:MaD:177 | | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | ApacheHttpSSRFVersion5.java:256:38:256:51 | toString(...) | provenance | MaD:287 Sink:MaD:160 | -| ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | ApacheHttpSSRFVersion5.java:259:28:259:41 | toString(...) | provenance | MaD:287 Sink:MaD:162 | -| ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | ApacheHttpSSRFVersion5.java:262:25:262:38 | toString(...) | provenance | MaD:287 Sink:MaD:164 | -| ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | ApacheHttpSSRFVersion5.java:265:26:265:39 | toString(...) | provenance | MaD:287 Sink:MaD:166 | -| ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | ApacheHttpSSRFVersion5.java:268:29:268:42 | toString(...) | provenance | MaD:287 Sink:MaD:168 | -| ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | ApacheHttpSSRFVersion5.java:271:27:271:40 | toString(...) | provenance | MaD:287 Sink:MaD:170 | -| ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | ApacheHttpSSRFVersion5.java:274:26:274:39 | toString(...) | provenance | MaD:287 Sink:MaD:172 | -| ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | ApacheHttpSSRFVersion5.java:277:25:277:38 | toString(...) | provenance | MaD:287 Sink:MaD:174 | -| ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | ApacheHttpSSRFVersion5.java:280:27:280:40 | toString(...) | provenance | MaD:287 Sink:MaD:176 | -| ApacheHttpSSRFVersion5.java:295:30:295:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | ApacheHttpSSRFVersion5.java:256:38:256:51 | toString(...) | provenance | MaD:295 Sink:MaD:160 | +| ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | ApacheHttpSSRFVersion5.java:259:28:259:41 | toString(...) | provenance | MaD:295 Sink:MaD:162 | +| ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | ApacheHttpSSRFVersion5.java:262:25:262:38 | toString(...) | provenance | MaD:295 Sink:MaD:164 | +| ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | ApacheHttpSSRFVersion5.java:265:26:265:39 | toString(...) | provenance | MaD:295 Sink:MaD:166 | +| ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | ApacheHttpSSRFVersion5.java:268:29:268:42 | toString(...) | provenance | MaD:295 Sink:MaD:168 | +| ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | ApacheHttpSSRFVersion5.java:271:27:271:40 | toString(...) | provenance | MaD:295 Sink:MaD:170 | +| ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | ApacheHttpSSRFVersion5.java:274:26:274:39 | toString(...) | provenance | MaD:295 Sink:MaD:172 | +| ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | ApacheHttpSSRFVersion5.java:277:25:277:38 | toString(...) | provenance | MaD:295 Sink:MaD:174 | +| ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | ApacheHttpSSRFVersion5.java:280:27:280:40 | toString(...) | provenance | MaD:295 Sink:MaD:176 | +| ApacheHttpSSRFVersion5.java:295:30:295:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:309:60:309:62 | uri | provenance | Sink:MaD:209 | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:314:53:314:55 | uri | provenance | Sink:MaD:209 | | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:298:31:298:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRFVersion5.java:298:31:298:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:303:34:303:37 | host | provenance | Sink:MaD:178 | | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:304:34:304:37 | host | provenance | Sink:MaD:179 | -| ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | provenance | MaD:295 | -| ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | ApacheHttpSSRFVersion5.java:308:60:308:73 | toString(...) | provenance | MaD:287 Sink:MaD:208 | -| ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | ApacheHttpSSRFVersion5.java:313:53:313:66 | toString(...) | provenance | MaD:287 Sink:MaD:208 | -| ApacheHttpSSRFVersion5.java:326:30:326:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | provenance | MaD:303 | +| ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | ApacheHttpSSRFVersion5.java:308:60:308:73 | toString(...) | provenance | MaD:295 Sink:MaD:208 | +| ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | ApacheHttpSSRFVersion5.java:313:53:313:66 | toString(...) | provenance | MaD:295 Sink:MaD:208 | +| ApacheHttpSSRFVersion5.java:326:30:326:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:334:42:334:44 | uri | provenance | Sink:MaD:181 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | provenance | | @@ -656,20 +679,20 @@ edges | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | provenance | | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:360:41:360:43 | uri | provenance | Sink:MaD:195 | | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:329:31:329:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRFVersion5.java:329:31:329:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:354:53:354:56 | host | provenance | Sink:MaD:204 | -| ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | provenance | MaD:295 | -| ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | ApacheHttpSSRFVersion5.java:333:42:333:55 | toString(...) | provenance | MaD:287 Sink:MaD:180 | -| ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | ApacheHttpSSRFVersion5.java:336:39:336:52 | toString(...) | provenance | MaD:287 Sink:MaD:182 | -| ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | ApacheHttpSSRFVersion5.java:339:40:339:53 | toString(...) | provenance | MaD:287 Sink:MaD:184 | -| ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | ApacheHttpSSRFVersion5.java:342:43:342:56 | toString(...) | provenance | MaD:287 Sink:MaD:186 | -| ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | ApacheHttpSSRFVersion5.java:345:41:345:54 | toString(...) | provenance | MaD:287 Sink:MaD:188 | -| ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | ApacheHttpSSRFVersion5.java:348:40:348:53 | toString(...) | provenance | MaD:287 Sink:MaD:190 | -| ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | ApacheHttpSSRFVersion5.java:351:39:351:52 | toString(...) | provenance | MaD:287 Sink:MaD:192 | -| ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | ApacheHttpSSRFVersion5.java:356:48:356:61 | toString(...) | provenance | MaD:287 Sink:MaD:205 | -| ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | ApacheHttpSSRFVersion5.java:359:41:359:54 | toString(...) | provenance | MaD:287 Sink:MaD:194 | -| ApacheHttpSSRFVersion5.java:372:30:372:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | provenance | MaD:303 | +| ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | ApacheHttpSSRFVersion5.java:333:42:333:55 | toString(...) | provenance | MaD:295 Sink:MaD:180 | +| ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | ApacheHttpSSRFVersion5.java:336:39:336:52 | toString(...) | provenance | MaD:295 Sink:MaD:182 | +| ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | ApacheHttpSSRFVersion5.java:339:40:339:53 | toString(...) | provenance | MaD:295 Sink:MaD:184 | +| ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | ApacheHttpSSRFVersion5.java:342:43:342:56 | toString(...) | provenance | MaD:295 Sink:MaD:186 | +| ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | ApacheHttpSSRFVersion5.java:345:41:345:54 | toString(...) | provenance | MaD:295 Sink:MaD:188 | +| ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | ApacheHttpSSRFVersion5.java:348:40:348:53 | toString(...) | provenance | MaD:295 Sink:MaD:190 | +| ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | ApacheHttpSSRFVersion5.java:351:39:351:52 | toString(...) | provenance | MaD:295 Sink:MaD:192 | +| ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | ApacheHttpSSRFVersion5.java:356:48:356:61 | toString(...) | provenance | MaD:295 Sink:MaD:205 | +| ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | ApacheHttpSSRFVersion5.java:359:41:359:54 | toString(...) | provenance | MaD:295 Sink:MaD:194 | +| ApacheHttpSSRFVersion5.java:372:30:372:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:380:57:380:59 | uri | provenance | Sink:MaD:197 | | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:382:51:382:53 | uri | provenance | Sink:MaD:199 | | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:386:50:386:52 | uri | provenance | Sink:MaD:201 | @@ -677,372 +700,372 @@ edges | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:390:24:390:26 | uri | provenance | Sink:MaD:207 | | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:394:24:394:26 | uri | provenance | Sink:MaD:207 | | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:375:31:375:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | MaD:293 | +| ApacheHttpSSRFVersion5.java:375:31:375:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | provenance | Src:MaD:285 | | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:379:57:379:60 | host | provenance | Sink:MaD:196 | | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:381:51:381:54 | host | provenance | Sink:MaD:198 | | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:385:50:385:53 | host | provenance | Sink:MaD:200 | | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:387:44:387:47 | host | provenance | Sink:MaD:202 | -| ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | provenance | MaD:295 | -| JakartaWsSSRF.java:14:22:14:48 | getParameter(...) : String | JakartaWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:277 Sink:MaD:3 | -| JavaNetHttpSSRF.java:25:27:25:53 | getParameter(...) : String | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | provenance | MaD:303 | +| JakartaWsSSRF.java:14:22:14:48 | getParameter(...) : String | JakartaWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:285 Sink:MaD:3 | +| JavaNetHttpSSRF.java:25:27:25:53 | getParameter(...) : String | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | provenance | Src:MaD:285 | | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | JavaNetHttpSSRF.java:39:59:39:61 | uri | provenance | Sink:MaD:6 | | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | Config | -| JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | MaD:285 | +| JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | MaD:293 | | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | provenance | | | JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | JavaNetHttpSSRF.java:38:65:38:68 | uri2 | provenance | Sink:MaD:5 | | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | provenance | Config | -| JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | provenance | MaD:286 | +| JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | provenance | MaD:294 | | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:28:32:28:35 | sink : String | provenance | | | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:30:32:30:35 | url1 | provenance | Sink:MaD:9 | | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:33:32:33:35 | url1 | provenance | Sink:MaD:9 | | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:34:30:34:33 | url1 | provenance | Sink:MaD:10 | | JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | Config | -| JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | MaD:289 | -| JaxWsSSRF.java:14:22:14:48 | getParameter(...) : String | JaxWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:277 Sink:MaD:23 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:26:28:26:34 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:17 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:28:41:28:47 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:18 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:29:41:29:47 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:20 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:30:41:30:47 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:19 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:32:27:32:33 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:242 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:43:27:43:33 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:2 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:48:23:48:29 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:2 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | provenance | Src:MaD:277 | +| JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | MaD:297 | +| JaxWsSSRF.java:14:22:14:48 | getParameter(...) : String | JaxWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:285 Sink:MaD:23 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:26:28:26:34 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:17 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:28:41:28:47 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:18 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:29:41:29:47 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:20 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:30:41:30:47 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:19 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:32:27:32:33 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:250 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:43:27:43:33 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:2 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:48:23:48:29 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:2 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | provenance | Src:MaD:285 | | JdbcUrlSSRF.java:52:9:52:13 | props : Properties | JdbcUrlSSRF.java:54:49:54:53 | props | provenance | Sink:MaD:1 | | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | JdbcUrlSSRF.java:54:49:54:53 | props | provenance | Sink:MaD:1 | | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props : Properties | provenance | Config | -| JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | provenance | MaD:294 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:65:27:65:33 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:257 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:67:75:67:81 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:258 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:70:75:70:81 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:260 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:73:75:73:81 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:259 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:82:21:82:27 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:235 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:83:21:83:27 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:236 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:84:21:84:27 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:237 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:238 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:239 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:240 | -| ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:277 Sink:MaD:274 | -| ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:277 Sink:MaD:273 | +| JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | provenance | MaD:302 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:65:27:65:33 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:265 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:67:75:67:81 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:266 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:70:75:70:81 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:268 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:73:75:73:81 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:267 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:82:21:82:27 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:243 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:83:21:83:27 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:244 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:84:21:84:27 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:245 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:246 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:247 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:285 Sink:MaD:248 | +| ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:285 Sink:MaD:282 | +| ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:285 Sink:MaD:281 | | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri | provenance | Sink:MaD:6 | | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri : URI | provenance | | -| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:277 Config | -| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:277 MaD:285 | -| SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:285 Config | +| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:285 MaD:293 | +| SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | SanitizationTests.java:26:25:26:25 | r | provenance | Sink:MaD:4 | -| SanitizationTests.java:25:52:25:54 | uri : URI | SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:78:33:78:63 | getParameter(...) : String | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:25:52:25:54 | uri : URI | SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | provenance | MaD:292 | +| SanitizationTests.java:78:33:78:63 | getParameter(...) : String | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | provenance | Src:MaD:285 | +| SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | SanitizationTests.java:80:25:80:32 | unsafer3 | provenance | Sink:MaD:4 | -| SanitizationTests.java:79:59:79:77 | new URI(...) : URI | SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:79:59:79:77 | new URI(...) : URI | SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:82:49:82:79 | getParameter(...) : String | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | MaD:293 | +| SanitizationTests.java:82:49:82:79 | getParameter(...) : String | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | provenance | Src:MaD:285 | +| SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | SanitizationTests.java:84:25:84:32 | unsafer4 | provenance | Sink:MaD:4 | -| SanitizationTests.java:83:59:83:77 | new URI(...) : URI | SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:83:59:83:77 | new URI(...) : URI | SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | provenance | | -| SanitizationTests.java:87:31:87:61 | getParameter(...) : String | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:277 MaD:278 | -| SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:87:31:87:61 | getParameter(...) : String | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:285 MaD:286 | +| SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | SanitizationTests.java:89:25:89:32 | unsafer5 | provenance | Sink:MaD:4 | -| SanitizationTests.java:88:59:88:88 | new URI(...) : URI | SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:88:67:88:87 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:88:59:88:88 | new URI(...) : URI | SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | provenance | MaD:292 | +| SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:88:67:88:87 | toString(...) : String | provenance | MaD:288 | | SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | provenance | | -| SanitizationTests.java:91:58:91:86 | getParameter(...) : String | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | -| SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:91:58:91:86 | getParameter(...) : String | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:285 MaD:290 | +| SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | SanitizationTests.java:94:25:94:33 | unsafer5a | provenance | Sink:MaD:4 | -| SanitizationTests.java:93:60:93:89 | new URI(...) : URI | SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | SanitizationTests.java:93:68:93:88 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:93:60:93:89 | new URI(...) : URI | SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | provenance | MaD:292 | +| SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | SanitizationTests.java:93:68:93:88 | toString(...) : String | provenance | MaD:288 | | SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | provenance | | -| SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | provenance | MaD:279 | -| SanitizationTests.java:96:60:96:88 | getParameter(...) : String | SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | -| SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | provenance | MaD:287 | +| SanitizationTests.java:96:60:96:88 | getParameter(...) : String | SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:285 MaD:290 | +| SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | SanitizationTests.java:99:25:99:33 | unsafer5b | provenance | Sink:MaD:4 | -| SanitizationTests.java:98:60:98:90 | new URI(...) : URI | SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:98:68:98:89 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:98:60:98:90 | new URI(...) : URI | SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | provenance | MaD:292 | +| SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:98:68:98:89 | toString(...) : String | provenance | MaD:288 | | SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | provenance | | -| SanitizationTests.java:101:77:101:105 | getParameter(...) : String | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | provenance | Src:MaD:277 MaD:278+MaD:279 | -| SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:101:77:101:105 | getParameter(...) : String | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | provenance | Src:MaD:285 MaD:286+MaD:287 | +| SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | SanitizationTests.java:104:25:104:33 | unsafer5c | provenance | Sink:MaD:4 | -| SanitizationTests.java:103:60:103:90 | new URI(...) : URI | SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:103:68:103:89 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:103:60:103:90 | new URI(...) : URI | SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | provenance | MaD:292 | +| SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:103:68:103:89 | toString(...) : String | provenance | MaD:288 | | SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:106:33:106:104 | format(...) : String | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | provenance | | -| SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:106:33:106:104 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:106:73:106:103 | getParameter(...) : String | SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:106:33:106:104 | format(...) : String | provenance | MaD:289 | +| SanitizationTests.java:106:73:106:103 | getParameter(...) : String | SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:285 | +| SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | SanitizationTests.java:108:25:108:32 | unsafer6 | provenance | Sink:MaD:4 | -| SanitizationTests.java:107:59:107:77 | new URI(...) : URI | SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:107:59:107:77 | new URI(...) : URI | SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:110:33:110:110 | format(...) : String | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | provenance | | -| SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:110:33:110:110 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:110:56:110:86 | getParameter(...) : String | SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:110:33:110:110 | format(...) : String | provenance | MaD:289 | +| SanitizationTests.java:110:56:110:86 | getParameter(...) : String | SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:285 | +| SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | SanitizationTests.java:112:25:112:32 | unsafer7 | provenance | Sink:MaD:4 | -| SanitizationTests.java:111:59:111:77 | new URI(...) : URI | SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:111:59:111:77 | new URI(...) : URI | SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:114:33:114:110 | format(...) : String | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | provenance | | -| SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:114:33:114:110 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:114:55:114:85 | getParameter(...) : String | SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:114:33:114:110 | format(...) : String | provenance | MaD:289 | +| SanitizationTests.java:114:55:114:85 | getParameter(...) : String | SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:285 | +| SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | SanitizationTests.java:116:25:116:32 | unsafer8 | provenance | Sink:MaD:4 | -| SanitizationTests.java:115:59:115:77 | new URI(...) : URI | SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:115:59:115:77 | new URI(...) : URI | SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:118:33:118:63 | getParameter(...) : String | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | MaD:293 | +| SanitizationTests.java:118:33:118:63 | getParameter(...) : String | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | provenance | Src:MaD:285 | +| SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | SanitizationTests.java:120:25:120:32 | unsafer9 | provenance | Sink:MaD:4 | -| SanitizationTests.java:119:59:119:77 | new URI(...) : URI | SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:119:59:119:77 | new URI(...) : URI | SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | MaD:293 | | SanitizationTests.java:122:34:122:126 | format(...) : String | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | provenance | | -| SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:122:34:122:126 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:122:94:122:125 | getParameter(...) : String | SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:122:34:122:126 | format(...) : String | provenance | MaD:289 | +| SanitizationTests.java:122:94:122:125 | getParameter(...) : String | SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:285 | +| SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | SanitizationTests.java:124:25:124:33 | unsafer10 | provenance | Sink:MaD:4 | -| SanitizationTests.java:123:60:123:79 | new URI(...) : URI | SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:123:60:123:79 | new URI(...) : URI | SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | MaD:293 | +| SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | provenance | MaD:291 | | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | SanitizationTests.java:178:25:178:27 | r18 | provenance | Sink:MaD:4 | -| SanitizationTests.java:177:54:177:113 | new URI(...) : URI | SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:177:54:177:113 | new URI(...) : URI | SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | provenance | MaD:292 | | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | MaD:293 Sink:MaD:6 | | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | provenance | MaD:291 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | MaD:293 | +| SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | provenance | MaD:299 | | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:199:31:199:112 | list : List [] : String | provenance | | -| SanitizationTests.java:177:82:177:110 | getParameter(...) : String | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | provenance | Src:MaD:277 MaD:290 | +| SanitizationTests.java:177:82:177:110 | getParameter(...) : String | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | provenance | Src:MaD:285 MaD:298 | | SanitizationTests.java:199:31:199:112 | list : List [] : String | SanitizationTests.java:200:16:200:19 | list : List [] : String | provenance | | -| SanitizationTests.java:200:16:200:19 | list : List [] : String | SanitizationTests.java:200:16:200:26 | get(...) : String | provenance | MaD:291 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:277 Sink:MaD:264 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:35:87:35:100 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:43:35:43:48 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:262 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:44:91:44:104 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:45:95:45:108 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:46:109:46:122 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:54:34:54:47 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:263 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:55:79:55:92 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:56:83:56:96 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:57:97:57:110 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:65:39:65:52 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:265 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:66:69:66:82 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:67:73:67:86 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:68:87:68:100 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:76:41:76:54 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:268 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:77:93:77:106 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:78:97:78:110 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:79:111:79:124 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | SpringSSRF.java:38:69:38:97 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | SpringSSRF.java:40:69:40:119 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | SpringSSRF.java:49:91:49:119 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | SpringSSRF.java:51:91:51:141 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | SpringSSRF.java:60:79:60:107 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | SpringSSRF.java:62:79:62:129 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | SpringSSRF.java:71:69:71:97 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | SpringSSRF.java:73:69:73:119 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | SpringSSRF.java:82:93:82:121 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | SpringSSRF.java:84:93:84:143 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | Config Sink:MaD:269 | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | MaD:285 Sink:MaD:269 | +| SanitizationTests.java:200:16:200:19 | list : List [] : String | SanitizationTests.java:200:16:200:26 | get(...) : String | provenance | MaD:299 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:285 Sink:MaD:272 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:35:87:35:100 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:43:35:43:48 | fooResourceUrl | provenance | Src:MaD:285 Sink:MaD:270 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:44:91:44:104 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:45:95:45:108 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:46:109:46:122 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:54:34:54:47 | fooResourceUrl | provenance | Src:MaD:285 Sink:MaD:271 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:55:79:55:92 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:56:83:56:96 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:57:97:57:110 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:65:39:65:52 | fooResourceUrl | provenance | Src:MaD:285 Sink:MaD:273 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:66:69:66:82 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:67:73:67:86 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:68:87:68:100 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:76:41:76:54 | fooResourceUrl | provenance | Src:MaD:285 Sink:MaD:276 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:77:93:77:106 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:78:97:78:110 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:79:111:79:124 | fooResourceUrl | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | provenance | Src:MaD:285 | +| SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | SpringSSRF.java:38:69:38:97 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | SpringSSRF.java:40:69:40:119 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | SpringSSRF.java:49:91:49:119 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | SpringSSRF.java:51:91:51:141 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | SpringSSRF.java:60:79:60:107 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | SpringSSRF.java:62:79:62:129 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | SpringSSRF.java:71:69:71:97 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | SpringSSRF.java:73:69:73:119 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | SpringSSRF.java:82:93:82:121 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | SpringSSRF.java:84:93:84:143 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | Config Sink:MaD:277 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | MaD:293 Sink:MaD:277 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:88:92:88:105 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:89:96:89:109 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:90:110:90:123 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:98:42:98:55 | fooResourceUrl | provenance | Sink:MaD:270 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:98:42:98:55 | fooResourceUrl | provenance | Sink:MaD:278 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:99:80:99:93 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:100:84:100:97 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:101:98:101:111 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:109:40:109:53 | fooResourceUrl | provenance | Sink:MaD:271 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:109:40:109:53 | fooResourceUrl | provenance | Sink:MaD:279 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:110:92:110:105 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:111:96:111:109 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:112:110:112:123 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:120:30:120:43 | fooResourceUrl | provenance | Sink:MaD:272 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:120:30:120:43 | fooResourceUrl | provenance | Sink:MaD:280 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:121:68:121:81 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:122:72:122:85 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:123:86:123:99 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:131:33:131:46 | fooResourceUrl | provenance | Sink:MaD:261 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:131:33:131:46 | fooResourceUrl | provenance | Sink:MaD:269 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:132:49:132:62 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:133:53:133:66 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:134:67:134:80 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:142:41:142:54 | fooResourceUrl | provenance | Sink:MaD:266 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:142:41:142:54 | fooResourceUrl | provenance | Sink:MaD:274 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:143:57:143:70 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:144:61:144:74 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:145:75:145:88 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:153:42:153:55 | fooResourceUrl | provenance | Sink:MaD:267 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:153:42:153:55 | fooResourceUrl | provenance | Sink:MaD:275 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:154:58:154:71 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:155:62:155:75 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:156:76:156:89 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | SpringSSRF.java:93:92:93:120 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | SpringSSRF.java:95:92:95:142 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | SpringSSRF.java:104:80:104:108 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | SpringSSRF.java:106:80:106:130 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | SpringSSRF.java:115:92:115:120 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | SpringSSRF.java:117:92:117:142 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | SpringSSRF.java:126:68:126:96 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | SpringSSRF.java:128:68:128:118 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | SpringSSRF.java:137:49:137:77 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | SpringSSRF.java:139:49:139:99 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | SpringSSRF.java:148:57:148:85 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | SpringSSRF.java:150:57:150:107 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | SpringSSRF.java:159:58:159:86 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | SpringSSRF.java:161:58:161:108 | of(...) | provenance | MaD:293 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:168:44:168:46 | uri | provenance | Sink:MaD:255 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:170:35:170:37 | uri | provenance | Sink:MaD:250 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:171:35:171:37 | uri | provenance | Sink:MaD:256 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:172:38:172:40 | uri | provenance | Sink:MaD:249 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:173:39:173:41 | uri | provenance | Sink:MaD:253 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:174:37:174:39 | uri | provenance | Sink:MaD:254 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:175:36:175:38 | uri | provenance | Sink:MaD:251 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:176:44:176:46 | uri | provenance | Sink:MaD:252 | +| SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | SpringSSRF.java:93:92:93:120 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | SpringSSRF.java:95:92:95:142 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | SpringSSRF.java:104:80:104:108 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | SpringSSRF.java:106:80:106:130 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | SpringSSRF.java:115:92:115:120 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | SpringSSRF.java:117:92:117:142 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | SpringSSRF.java:126:68:126:96 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | SpringSSRF.java:128:68:128:118 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | SpringSSRF.java:137:49:137:77 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | SpringSSRF.java:139:49:139:99 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | SpringSSRF.java:148:57:148:85 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | SpringSSRF.java:150:57:150:107 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | SpringSSRF.java:159:58:159:86 | of(...) | provenance | MaD:300 | +| SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | SpringSSRF.java:161:58:161:108 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:168:44:168:46 | uri | provenance | Sink:MaD:263 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:170:35:170:37 | uri | provenance | Sink:MaD:258 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:171:35:171:37 | uri | provenance | Sink:MaD:264 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:172:38:172:40 | uri | provenance | Sink:MaD:257 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:173:39:173:41 | uri | provenance | Sink:MaD:261 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:174:37:174:39 | uri | provenance | Sink:MaD:262 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:175:36:175:38 | uri | provenance | Sink:MaD:259 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:176:44:176:46 | uri | provenance | Sink:MaD:260 | | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | Config | -| SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | MaD:285 | +| SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | MaD:293 | | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:182:49:182:51 | uri | provenance | Sink:MaD:243 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:183:58:183:60 | uri | provenance | Sink:MaD:244 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:184:57:184:59 | uri | provenance | Sink:MaD:245 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:185:66:185:68 | uri | provenance | Sink:MaD:247 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:186:57:186:59 | uri | provenance | Sink:MaD:246 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:187:66:187:68 | uri | provenance | Sink:MaD:248 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:182:49:182:51 | uri | provenance | Sink:MaD:251 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:183:58:183:60 | uri | provenance | Sink:MaD:252 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:184:57:184:59 | uri | provenance | Sink:MaD:253 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:185:66:185:68 | uri | provenance | Sink:MaD:255 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:186:57:186:59 | uri | provenance | Sink:MaD:254 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:187:66:187:68 | uri | provenance | Sink:MaD:256 | | SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | Config | -| SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:16:26:16:52 | getParameter(...) : String | URLClassLoaderSSRF.java:17:31:17:33 | url : String | provenance | Src:MaD:277 | +| SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | MaD:293 | +| URLClassLoaderSSRF.java:16:26:16:52 | getParameter(...) : String | URLClassLoaderSSRF.java:17:31:17:33 | url : String | provenance | Src:MaD:285 | | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | MaD:285 | +| URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | MaD:293 | | URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:13 | | URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:13 | -| URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | provenance | MaD:288 | +| URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | provenance | MaD:296 | | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:28:26:28:52 | getParameter(...) : String | URLClassLoaderSSRF.java:29:31:29:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:28:26:28:52 | getParameter(...) : String | URLClassLoaderSSRF.java:29:31:29:33 | url : String | provenance | Src:MaD:285 | | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | MaD:285 | +| URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | MaD:293 | | URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:14 | | URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:14 | -| URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | provenance | MaD:288 | +| URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | provenance | MaD:296 | | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:40:26:40:52 | getParameter(...) : String | URLClassLoaderSSRF.java:41:31:41:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:40:26:40:52 | getParameter(...) : String | URLClassLoaderSSRF.java:41:31:41:33 | url : String | provenance | Src:MaD:285 | | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | MaD:285 | +| URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | MaD:293 | | URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:15 | | URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:15 | -| URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | provenance | MaD:288 | +| URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | provenance | MaD:296 | | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:54:26:54:52 | getParameter(...) : String | URLClassLoaderSSRF.java:55:31:55:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:54:26:54:52 | getParameter(...) : String | URLClassLoaderSSRF.java:55:31:55:33 | url : String | provenance | Src:MaD:285 | | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | provenance | | | URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | MaD:285 | +| URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | MaD:293 | | URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:56:72:56:93 | new URL[] | provenance | Sink:MaD:16 | -| URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | provenance | MaD:288 | +| URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | provenance | MaD:296 | | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:66:26:66:52 | getParameter(...) : String | URLClassLoaderSSRF.java:67:31:67:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:66:26:66:52 | getParameter(...) : String | URLClassLoaderSSRF.java:67:31:67:33 | url : String | provenance | Src:MaD:285 | | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | provenance | | | URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | MaD:285 | +| URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | MaD:293 | | URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:11 | | URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:11 | -| URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | provenance | MaD:288 | +| URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | provenance | MaD:296 | | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:83:26:83:52 | getParameter(...) : String | URLClassLoaderSSRF.java:84:31:84:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:83:26:83:52 | getParameter(...) : String | URLClassLoaderSSRF.java:84:31:84:33 | url : String | provenance | Src:MaD:285 | | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | provenance | | | URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | MaD:285 | +| URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | MaD:293 | | URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:12 | | URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:12 | -| URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | provenance | MaD:288 | +| URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | provenance | MaD:296 | | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | provenance | | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:31:40:31:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:36:16:36:23 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:38:36:38:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:40:16:40:23 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:45:40:45:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:47:40:47:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:49:36:49:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:51:36:51:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:53:36:53:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:55:44:55:51 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:57:38:57:45 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:59:44:59:51 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:61:53:61:60 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:63:32:63:39 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:65:44:65:51 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:67:32:67:39 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:69:33:69:40 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:71:53:71:60 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:74:58:74:65 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:76:62:76:69 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:78:52:78:59 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:80:34:80:41 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:84:40:84:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:86:50:86:57 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:92:33:92:40 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:97:35:97:42 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:102:32:102:39 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:24:107:31 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:24:112:31 | source(...) : String | provenance | Src:MaD:277 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:31:40:31:47 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:36:16:36:23 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:38:36:38:43 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:40:16:40:23 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:45:40:45:47 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:47:40:47:47 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:49:36:49:43 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:51:36:51:43 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:53:36:53:43 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:55:44:55:51 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:57:38:57:45 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:59:44:59:51 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:61:53:61:60 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:63:32:63:39 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:65:44:65:51 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:67:32:67:39 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:69:33:69:40 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:71:53:71:60 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:74:58:74:65 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:76:62:76:69 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:78:52:78:59 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:80:34:80:41 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:84:40:84:47 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:86:50:86:57 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:92:33:92:40 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:97:35:97:42 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:102:32:102:39 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:24:107:31 | source(...) : String | provenance | Src:MaD:285 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:24:112:31 | source(...) : String | provenance | Src:MaD:285 | | mad/Test.java:31:40:31:47 | source(...) : String | mad/Test.java:31:24:31:47 | (...)... | provenance | Sink:MaD:7 | | mad/Test.java:36:16:36:23 | source(...) : String | mad/Test.java:36:10:36:23 | (...)... | provenance | Sink:MaD:9 | | mad/Test.java:38:36:38:43 | source(...) : String | mad/Test.java:38:28:38:43 | (...)... | provenance | Sink:MaD:8 | @@ -1074,10 +1097,10 @@ edges | mad/Test.java:84:40:84:47 | source(...) : String | mad/Test.java:84:31:84:47 | (...)... | provenance | Sink:MaD:36 | | mad/Test.java:86:50:86:57 | source(...) : String | mad/Test.java:86:41:86:57 | (...)... | provenance | Sink:MaD:37 | | mad/Test.java:92:33:92:40 | source(...) : String | mad/Test.java:92:24:92:40 | (...)... | provenance | Sink:MaD:21 | -| mad/Test.java:97:35:97:42 | source(...) : String | mad/Test.java:97:29:97:42 | (...)... | provenance | Sink:MaD:234 | -| mad/Test.java:102:32:102:39 | source(...) : String | mad/Test.java:102:26:102:39 | (...)... | provenance | Sink:MaD:241 | -| mad/Test.java:107:24:107:31 | source(...) : String | mad/Test.java:107:15:107:31 | (...)... | provenance | Sink:MaD:276 | -| mad/Test.java:112:24:112:31 | source(...) : String | mad/Test.java:112:15:112:31 | (...)... | provenance | Sink:MaD:275 | +| mad/Test.java:97:35:97:42 | source(...) : String | mad/Test.java:97:29:97:42 | (...)... | provenance | Sink:MaD:242 | +| mad/Test.java:102:32:102:39 | source(...) : String | mad/Test.java:102:26:102:39 | (...)... | provenance | Sink:MaD:249 | +| mad/Test.java:107:24:107:31 | source(...) : String | mad/Test.java:107:15:107:31 | (...)... | provenance | Sink:MaD:284 | +| mad/Test.java:112:24:112:31 | source(...) : String | mad/Test.java:112:15:112:31 | (...)... | provenance | Sink:MaD:283 | models | 1 | Sink: com.zaxxer.hikari; HikariConfig; false; HikariConfig; (Properties); ; Argument[0]; request-forgery; manual | | 2 | Sink: com.zaxxer.hikari; HikariConfig; false; setJdbcUrl; (String); ; Argument[0]; request-forgery; manual | @@ -1306,76 +1329,102 @@ models | 225 | Sink: org.apache.http.client.methods; RequestBuilder; false; put; ; ; Argument[0]; request-forgery; manual | | 226 | Sink: org.apache.http.client.methods; RequestBuilder; false; setUri; ; ; Argument[0]; request-forgery; manual | | 227 | Sink: org.apache.http.client.methods; RequestBuilder; false; trace; ; ; Argument[0]; request-forgery; manual | -| 228 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (RequestLine); ; Argument[0]; request-forgery; manual | -| 229 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String); ; Argument[1]; request-forgery; manual | -| 230 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | -| 231 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (RequestLine); ; Argument[0]; request-forgery; manual | -| 232 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String); ; Argument[1]; request-forgery; manual | -| 233 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | -| 234 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[0]; request-forgery; ai-manual | -| 235 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String); ; Argument[0]; request-forgery; manual | -| 236 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,Properties); ; Argument[0]; request-forgery; manual | -| 237 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,String,String); ; Argument[0]; request-forgery; manual | -| 238 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String); ; Argument[0]; request-forgery; manual | -| 239 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,Properties); ; Argument[0]; request-forgery; manual | -| 240 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,String,String); ; Argument[0]; request-forgery; manual | -| 241 | Sink: org.kohsuke.stapler; HttpResponses; true; staticResource; (URL); ; Argument[0]; request-forgery; ai-manual | -| 242 | Sink: org.springframework.boot.jdbc; DataSourceBuilder; false; url; (String); ; Argument[0]; request-forgery; manual | -| 243 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (HttpMethod,URI); ; Argument[1]; request-forgery; manual | -| 244 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (MultiValueMap,HttpMethod,URI); ; Argument[2]; request-forgery; manual | -| 245 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI); ; Argument[2]; request-forgery; manual | -| 246 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI,Type); ; Argument[2]; request-forgery; manual | -| 247 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI); ; Argument[3]; request-forgery; manual | -| 248 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI,Type); ; Argument[3]; request-forgery; manual | -| 249 | Sink: org.springframework.http; RequestEntity; false; delete; ; ; Argument[0]; request-forgery; manual | -| 250 | Sink: org.springframework.http; RequestEntity; false; get; ; ; Argument[0]; request-forgery; manual | -| 251 | Sink: org.springframework.http; RequestEntity; false; head; ; ; Argument[0]; request-forgery; manual | -| 252 | Sink: org.springframework.http; RequestEntity; false; method; ; ; Argument[1]; request-forgery; manual | -| 253 | Sink: org.springframework.http; RequestEntity; false; options; ; ; Argument[0]; request-forgery; manual | -| 254 | Sink: org.springframework.http; RequestEntity; false; patch; ; ; Argument[0]; request-forgery; manual | -| 255 | Sink: org.springframework.http; RequestEntity; false; post; ; ; Argument[0]; request-forgery; manual | -| 256 | Sink: org.springframework.http; RequestEntity; false; put; ; ; Argument[0]; request-forgery; manual | -| 257 | Sink: org.springframework.jdbc.datasource; AbstractDriverBasedDataSource; false; setUrl; (String); ; Argument[0]; request-forgery; manual | -| 258 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String); ; Argument[0]; request-forgery; manual | -| 259 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,Properties); ; Argument[0]; request-forgery; manual | -| 260 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,String,String); ; Argument[0]; request-forgery; manual | -| 261 | Sink: org.springframework.web.client; RestTemplate; false; delete; ; ; Argument[0]; request-forgery; manual | -| 262 | Sink: org.springframework.web.client; RestTemplate; false; exchange; ; ; Argument[0]; request-forgery; manual | -| 263 | Sink: org.springframework.web.client; RestTemplate; false; execute; ; ; Argument[0]; request-forgery; manual | -| 264 | Sink: org.springframework.web.client; RestTemplate; false; getForEntity; ; ; Argument[0]; request-forgery; manual | -| 265 | Sink: org.springframework.web.client; RestTemplate; false; getForObject; ; ; Argument[0]; request-forgery; manual | -| 266 | Sink: org.springframework.web.client; RestTemplate; false; headForHeaders; ; ; Argument[0]; request-forgery; manual | -| 267 | Sink: org.springframework.web.client; RestTemplate; false; optionsForAllow; ; ; Argument[0]; request-forgery; manual | -| 268 | Sink: org.springframework.web.client; RestTemplate; false; patchForObject; ; ; Argument[0]; request-forgery; manual | -| 269 | Sink: org.springframework.web.client; RestTemplate; false; postForEntity; ; ; Argument[0]; request-forgery; manual | -| 270 | Sink: org.springframework.web.client; RestTemplate; false; postForLocation; ; ; Argument[0]; request-forgery; manual | -| 271 | Sink: org.springframework.web.client; RestTemplate; false; postForObject; ; ; Argument[0]; request-forgery; manual | -| 272 | Sink: org.springframework.web.client; RestTemplate; false; put; ; ; Argument[0]; request-forgery; manual | -| 273 | Sink: org.springframework.web.reactive.function.client; WebClient$Builder; false; baseUrl; ; ; Argument[0]; request-forgery; manual | -| 274 | Sink: org.springframework.web.reactive.function.client; WebClient; false; create; ; ; Argument[0]; request-forgery; manual | -| 275 | Sink: play.libs.ws; StandaloneWSClient; true; url; ; ; Argument[0]; request-forgery; manual | -| 276 | Sink: play.libs.ws; WSClient; true; url; ; ; Argument[0]; request-forgery; manual | -| 277 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 278 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[0]; Argument[this]; taint; manual | -| 279 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[this]; ReturnValue; value; manual | -| 280 | Summary: java.lang; CharSequence; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 281 | Summary: java.lang; String; false; format; (String,Object[]); ; Argument[1].ArrayElement; ReturnValue; taint; manual | -| 282 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | -| 283 | Summary: java.net.http; HttpRequest$Builder; true; build; (); ; Argument[this]; ReturnValue; taint; df-generated | -| 284 | Summary: java.net.http; HttpRequest; true; newBuilder; (URI); ; Argument[0]; ReturnValue; taint; df-generated | -| 285 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | -| 286 | Summary: java.net; URI; false; URI; (String,String,String); ; Argument[1]; Argument[this]; taint; ai-manual | -| 287 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 288 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | -| 289 | Summary: java.net; URL; false; URL; (String); ; Argument[0]; Argument[this]; taint; manual | -| 290 | Summary: java.util; List; false; of; (Object); ; Argument[0]; ReturnValue.Element; value; manual | -| 291 | Summary: java.util; List; true; get; (int); ; Argument[this].Element; ReturnValue; value; manual | -| 292 | Summary: java.util; Map; false; of; ; ; Argument[1]; ReturnValue.MapValue; value; manual | -| 293 | Summary: java.util; Map; false; of; ; ; Argument[3]; ReturnValue.MapValue; value; manual | -| 294 | Summary: java.util; Properties; true; setProperty; (String,String); ; Argument[1]; Argument[this].MapValue; value; manual | -| 295 | Summary: org.apache.hc.core5.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | -| 296 | Summary: org.apache.http.message; BasicRequestLine; false; BasicRequestLine; ; ; Argument[1]; Argument[this]; taint; manual | +| 228 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpHost,HttpRequest); ; Argument[0]; request-forgery; ai-manual | +| 229 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpHost,HttpRequest,HttpContext); ; Argument[0]; request-forgery; ai-manual | +| 230 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpHost,HttpRequest,ResponseHandler); ; Argument[0]; request-forgery; ai-manual | +| 231 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpHost,HttpRequest,ResponseHandler,HttpContext); ; Argument[0]; request-forgery; ai-manual | +| 232 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpUriRequest); ; Argument[0]; request-forgery; ai-manual | +| 233 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpUriRequest,HttpContext); ; Argument[0]; request-forgery; ai-manual | +| 234 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpUriRequest,ResponseHandler); ; Argument[0]; request-forgery; ai-manual | +| 235 | Sink: org.apache.http.client; HttpClient; true; execute; (HttpUriRequest,ResponseHandler,HttpContext); ; Argument[0]; request-forgery; ai-manual | +| 236 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (RequestLine); ; Argument[0]; request-forgery; manual | +| 237 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String); ; Argument[1]; request-forgery; manual | +| 238 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | +| 239 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (RequestLine); ; Argument[0]; request-forgery; manual | +| 240 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String); ; Argument[1]; request-forgery; manual | +| 241 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | +| 242 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[0]; request-forgery; ai-manual | +| 243 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String); ; Argument[0]; request-forgery; manual | +| 244 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,Properties); ; Argument[0]; request-forgery; manual | +| 245 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,String,String); ; Argument[0]; request-forgery; manual | +| 246 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String); ; Argument[0]; request-forgery; manual | +| 247 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,Properties); ; Argument[0]; request-forgery; manual | +| 248 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,String,String); ; Argument[0]; request-forgery; manual | +| 249 | Sink: org.kohsuke.stapler; HttpResponses; true; staticResource; (URL); ; Argument[0]; request-forgery; ai-manual | +| 250 | Sink: org.springframework.boot.jdbc; DataSourceBuilder; false; url; (String); ; Argument[0]; request-forgery; manual | +| 251 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (HttpMethod,URI); ; Argument[1]; request-forgery; manual | +| 252 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (MultiValueMap,HttpMethod,URI); ; Argument[2]; request-forgery; manual | +| 253 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI); ; Argument[2]; request-forgery; manual | +| 254 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI,Type); ; Argument[2]; request-forgery; manual | +| 255 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI); ; Argument[3]; request-forgery; manual | +| 256 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI,Type); ; Argument[3]; request-forgery; manual | +| 257 | Sink: org.springframework.http; RequestEntity; false; delete; ; ; Argument[0]; request-forgery; manual | +| 258 | Sink: org.springframework.http; RequestEntity; false; get; ; ; Argument[0]; request-forgery; manual | +| 259 | Sink: org.springframework.http; RequestEntity; false; head; ; ; Argument[0]; request-forgery; manual | +| 260 | Sink: org.springframework.http; RequestEntity; false; method; ; ; Argument[1]; request-forgery; manual | +| 261 | Sink: org.springframework.http; RequestEntity; false; options; ; ; Argument[0]; request-forgery; manual | +| 262 | Sink: org.springframework.http; RequestEntity; false; patch; ; ; Argument[0]; request-forgery; manual | +| 263 | Sink: org.springframework.http; RequestEntity; false; post; ; ; Argument[0]; request-forgery; manual | +| 264 | Sink: org.springframework.http; RequestEntity; false; put; ; ; Argument[0]; request-forgery; manual | +| 265 | Sink: org.springframework.jdbc.datasource; AbstractDriverBasedDataSource; false; setUrl; (String); ; Argument[0]; request-forgery; manual | +| 266 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String); ; Argument[0]; request-forgery; manual | +| 267 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,Properties); ; Argument[0]; request-forgery; manual | +| 268 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,String,String); ; Argument[0]; request-forgery; manual | +| 269 | Sink: org.springframework.web.client; RestTemplate; false; delete; ; ; Argument[0]; request-forgery; manual | +| 270 | Sink: org.springframework.web.client; RestTemplate; false; exchange; ; ; Argument[0]; request-forgery; manual | +| 271 | Sink: org.springframework.web.client; RestTemplate; false; execute; ; ; Argument[0]; request-forgery; manual | +| 272 | Sink: org.springframework.web.client; RestTemplate; false; getForEntity; ; ; Argument[0]; request-forgery; manual | +| 273 | Sink: org.springframework.web.client; RestTemplate; false; getForObject; ; ; Argument[0]; request-forgery; manual | +| 274 | Sink: org.springframework.web.client; RestTemplate; false; headForHeaders; ; ; Argument[0]; request-forgery; manual | +| 275 | Sink: org.springframework.web.client; RestTemplate; false; optionsForAllow; ; ; Argument[0]; request-forgery; manual | +| 276 | Sink: org.springframework.web.client; RestTemplate; false; patchForObject; ; ; Argument[0]; request-forgery; manual | +| 277 | Sink: org.springframework.web.client; RestTemplate; false; postForEntity; ; ; Argument[0]; request-forgery; manual | +| 278 | Sink: org.springframework.web.client; RestTemplate; false; postForLocation; ; ; Argument[0]; request-forgery; manual | +| 279 | Sink: org.springframework.web.client; RestTemplate; false; postForObject; ; ; Argument[0]; request-forgery; manual | +| 280 | Sink: org.springframework.web.client; RestTemplate; false; put; ; ; Argument[0]; request-forgery; manual | +| 281 | Sink: org.springframework.web.reactive.function.client; WebClient$Builder; false; baseUrl; ; ; Argument[0]; request-forgery; manual | +| 282 | Sink: org.springframework.web.reactive.function.client; WebClient; false; create; ; ; Argument[0]; request-forgery; manual | +| 283 | Sink: play.libs.ws; StandaloneWSClient; true; url; ; ; Argument[0]; request-forgery; manual | +| 284 | Sink: play.libs.ws; WSClient; true; url; ; ; Argument[0]; request-forgery; manual | +| 285 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 286 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[0]; Argument[this]; taint; manual | +| 287 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[this]; ReturnValue; value; manual | +| 288 | Summary: java.lang; CharSequence; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 289 | Summary: java.lang; String; false; format; (String,Object[]); ; Argument[1].ArrayElement; ReturnValue; taint; manual | +| 290 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | +| 291 | Summary: java.net.http; HttpRequest$Builder; true; build; (); ; Argument[this]; ReturnValue; taint; df-generated | +| 292 | Summary: java.net.http; HttpRequest; true; newBuilder; (URI); ; Argument[0]; ReturnValue; taint; df-generated | +| 293 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | +| 294 | Summary: java.net; URI; false; URI; (String,String,String); ; Argument[1]; Argument[this]; taint; ai-manual | +| 295 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 296 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | +| 297 | Summary: java.net; URL; false; URL; (String); ; Argument[0]; Argument[this]; taint; manual | +| 298 | Summary: java.util; List; false; of; (Object); ; Argument[0]; ReturnValue.Element; value; manual | +| 299 | Summary: java.util; List; true; get; (int); ; Argument[this].Element; ReturnValue; value; manual | +| 300 | Summary: java.util; Map; false; of; ; ; Argument[1]; ReturnValue.MapValue; value; manual | +| 301 | Summary: java.util; Map; false; of; ; ; Argument[3]; ReturnValue.MapValue; value; manual | +| 302 | Summary: java.util; Properties; true; setProperty; (String,String); ; Argument[1]; Argument[this].MapValue; value; manual | +| 303 | Summary: org.apache.hc.core5.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | +| 304 | Summary: org.apache.http.client.methods; RequestBuilder; true; build; (); ; Argument[this]; ReturnValue; taint; ai-manual | +| 305 | Summary: org.apache.http.client.methods; RequestBuilder; true; get; (String); ; Argument[0]; ReturnValue; taint; ai-manual | +| 306 | Summary: org.apache.http.message; BasicRequestLine; false; BasicRequestLine; ; ; Argument[1]; Argument[this]; taint; manual | +| 307 | Summary: org.apache.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | nodes +| ApacheHttpClientExecuteSSRF.java:23:29:23:56 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| ApacheHttpClientExecuteSSRF.java:25:29:25:48 | new HttpHost(...) : HttpHost | semmle.label | new HttpHost(...) : HttpHost | +| ApacheHttpClientExecuteSSRF.java:25:42:25:47 | source : String | semmle.label | source : String | +| ApacheHttpClientExecuteSSRF.java:27:37:27:62 | get(...) : RequestBuilder | semmle.label | get(...) : RequestBuilder | +| ApacheHttpClientExecuteSSRF.java:27:37:27:70 | build(...) : HttpUriRequest | semmle.label | build(...) : HttpUriRequest | +| ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source | semmle.label | source | +| ApacheHttpClientExecuteSSRF.java:27:56:27:61 | source : String | semmle.label | source : String | +| ApacheHttpClientExecuteSSRF.java:32:28:32:31 | host | semmle.label | host | +| ApacheHttpClientExecuteSSRF.java:33:28:33:31 | host | semmle.label | host | +| ApacheHttpClientExecuteSSRF.java:34:28:34:31 | host | semmle.label | host | +| ApacheHttpClientExecuteSSRF.java:35:28:35:31 | host | semmle.label | host | +| ApacheHttpClientExecuteSSRF.java:36:28:36:33 | uriReq | semmle.label | uriReq | +| ApacheHttpClientExecuteSSRF.java:37:28:37:33 | uriReq | semmle.label | uriReq | +| ApacheHttpClientExecuteSSRF.java:38:28:38:33 | uriReq | semmle.label | uriReq | +| ApacheHttpClientExecuteSSRF.java:39:28:39:33 | uriReq | semmle.label | uriReq | | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | semmle.label | new URI(...) : URI | | ApacheHttpSSRF.java:28:31:28:34 | sink : String | semmle.label | sink : String | diff --git a/java/ql/test/query-tests/security/CWE-918/options b/java/ql/test/query-tests/security/CWE-918/options index 6b6efaeca544..a5b2bf58d434 100644 --- a/java/ql/test/query-tests/security/CWE-918/options +++ b/java/ql/test/query-tests/security/CWE-918/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/javax-validation-constraints:${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang:${testdir}/../../../stubs/apache-http-5:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jaxws-api-2.0:${testdir}/../../../stubs/apache-cxf +//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/javax-validation-constraints:${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/apache-http-client-4.4.13:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang:${testdir}/../../../stubs/apache-http-5:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jaxws-api-2.0:${testdir}/../../../stubs/apache-cxf diff --git a/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/client/HttpClient.java b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/client/HttpClient.java new file mode 100644 index 000000000000..3cd8e33ab5c5 --- /dev/null +++ b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/client/HttpClient.java @@ -0,0 +1,23 @@ +// Generated automatically from org.apache.http.client.HttpClient for testing purposes + +package org.apache.http.client; + +import java.io.IOException; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.protocol.HttpContext; + +public interface HttpClient { + HttpResponse execute(HttpHost target, HttpRequest request) throws IOException; + HttpResponse execute(HttpHost target, HttpRequest request, HttpContext context) throws IOException; + T execute(HttpHost target, HttpRequest request, ResponseHandler responseHandler) throws IOException; + T execute(HttpHost target, HttpRequest request, ResponseHandler responseHandler, HttpContext context) + throws IOException; + HttpResponse execute(HttpUriRequest request) throws IOException; + HttpResponse execute(HttpUriRequest request, HttpContext context) throws IOException; + T execute(HttpUriRequest request, ResponseHandler responseHandler) throws IOException; + T execute(HttpUriRequest request, ResponseHandler responseHandler, HttpContext context) + throws IOException; +} diff --git a/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/client/ResponseHandler.java b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/client/ResponseHandler.java new file mode 100644 index 000000000000..0733cae3baf8 --- /dev/null +++ b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/client/ResponseHandler.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.http.client.ResponseHandler for testing purposes + +package org.apache.http.client; + +import org.apache.http.HttpResponse; + +public interface ResponseHandler { + T handleResponse(HttpResponse response); +} diff --git a/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/impl/client/CloseableHttpClient.java b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/impl/client/CloseableHttpClient.java new file mode 100644 index 000000000000..dff62322e5a7 --- /dev/null +++ b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/impl/client/CloseableHttpClient.java @@ -0,0 +1,7 @@ +package org.apache.http.impl.client; + +import org.apache.http.client.HttpClient; + +public abstract class CloseableHttpClient implements HttpClient { + +} diff --git a/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/impl/client/HttpClients.java b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/impl/client/HttpClients.java new file mode 100644 index 000000000000..e5d1a2537c52 --- /dev/null +++ b/java/ql/test/stubs/apache-http-client-4.4.13/org/apache/http/impl/client/HttpClients.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.http.client.HttpClient for testing purposes + +package org.apache.http.impl.client; + +import java.io.IOException; +import org.apache.http.impl.client.CloseableHttpClient; + +public final class HttpClients { + public static CloseableHttpClient createDefault() { return null; } +} diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index c201b3a4b134..6471aa3fe68f 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.7.2 + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `js/clear-text-logging`) may find more correct results and fewer false positive results after these changes. + ## 2.7.1 No user-facing changes. diff --git a/javascript/ql/lib/change-notes/released/2.7.2.md b/javascript/ql/lib/change-notes/released/2.7.2.md new file mode 100644 index 000000000000..9d0eca2cb4eb --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.7.2.md @@ -0,0 +1,5 @@ +## 2.7.2 + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `js/clear-text-logging`) may find more correct results and fewer false positive results after these changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 820fb65a5c74..5160df7b1b70 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.7.1 +lastReleaseVersion: 2.7.2 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index ff45431ce7a4..870ad58a1b83 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.7.1 +version: 2.7.3-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 1a69291d1453..b3a62befc5e8 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.11 + +No user-facing changes. + ## 2.3.10 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/2.3.11.md b/javascript/ql/src/change-notes/released/2.3.11.md new file mode 100644 index 000000000000..31b11998b741 --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.3.11.md @@ -0,0 +1,3 @@ +## 2.3.11 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index a4a2f98d5094..5ac091006e8c 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.3.10 +lastReleaseVersion: 2.3.11 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index ad653e83497a..09303bab573a 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.3.10 +version: 2.3.12-dev groups: - javascript - queries diff --git a/javascript/resources/codeql-extractor.yml b/javascript/resources/codeql-extractor.yml index 14ec56e2429d..bfc99d826fc5 100644 --- a/javascript/resources/codeql-extractor.yml +++ b/javascript/resources/codeql-extractor.yml @@ -21,13 +21,19 @@ file_coverage_languages: scc_languages: - TypeScript - TypeScript Typings + - name: vue + display_name: Vue.js component + scc_languages: + - Vue github_api_languages: - JavaScript - TypeScript + - Vue scc_languages: - JavaScript - TypeScript - TypeScript Typings + - Vue file_types: - name: javascript display_name: JavaScript diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 8e20945c6bfd..8f96c9ba8dd0 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.51.md b/misc/suite-helpers/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 4d751d815ec5..7ac4b0e1dc3e 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.50 +version: 1.0.52-dev groups: shared warnOnImplicitThis: true diff --git a/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected b/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected index de218a50e1e3..12a241ad7b68 100644 --- a/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected +++ b/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected @@ -17,13 +17,13 @@ ] }, "location": { - "file": "/repo_dir/syntaxerror3.py", + "file": "syntaxerror3.py", "startColumn": 0, "endColumn": 0, "startLine": 1, "endLine": 1 }, - "markdownMessage": "A parse error occurred while processing `/repo_dir/syntaxerror3.py`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.", + "markdownMessage": "A parse error occurred while processing `syntaxerror3.py`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.", "severity": "warning", "source": { "extractorName": "python", @@ -56,13 +56,13 @@ ] }, "location": { - "file": "/repo_dir/syntaxerror1.py", + "file": "syntaxerror1.py", "startColumn": 0, "endColumn": 0, "startLine": 3, "endLine": 3 }, - "markdownMessage": "A parse error occurred while processing `/repo_dir/syntaxerror1.py`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.", + "markdownMessage": "A parse error occurred while processing `syntaxerror1.py`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.", "severity": "warning", "source": { "extractorName": "python", @@ -95,13 +95,13 @@ ] }, "location": { - "file": "/repo_dir/syntaxerror2.py", + "file": "syntaxerror2.py", "startColumn": 0, "endColumn": 0, "startLine": 5, "endLine": 5 }, - "markdownMessage": "A parse error occurred while processing `/repo_dir/syntaxerror2.py`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.", + "markdownMessage": "A parse error occurred while processing `syntaxerror2.py`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.", "severity": "warning", "source": { "extractorName": "python", @@ -145,7 +145,7 @@ ] }, "location": { - "file": "/repo_dir/recursion_error.py" + "file": "recursion_error.py" }, "plaintextMessage": "maximum recursion depth exceeded while calling a Python object", "severity": "error", diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index 0e0b173a4d7d..31805040bf6d 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -359,11 +359,30 @@ def get_stack_trace_lines(): return lines[:i] return lines +def _get_source_root(): + """Get the source root directory for relativizing diagnostic paths.""" + return os.environ.get("LGTM_SRC", os.getcwd()) + +def _relative_path(path): + """Make a path relative to the source root for use in diagnostic locations. + If the path is not under the source root, return it unchanged.""" + source_root = os.path.abspath(_get_source_root()) + abs_path = os.path.abspath(path) + try: + relpath = os.path.relpath(abs_path, source_root) + except ValueError: + # On Windows, relpath raises ValueError for paths on different drives + return path + if relpath.startswith(os.pardir): + return path + return relpath.replace(os.sep, "/") + def syntax_error_message(exception, unit): - l = Location(file=unit.path, startLine=exception.lineno, startColumn=exception.offset) + diag_path = _relative_path(unit.path) + l = Location(file=diag_path, startLine=exception.lineno, startColumn=exception.offset) error = (DiagnosticMessage(Source("py/diagnostics/syntax-error", "Could not process some files due to syntax errors"), Severity.WARNING) .with_location(l) - .markdown("A parse error occurred while processing `{}`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.".format(unit.path)) + .markdown("A parse error occurred while processing `{}`, and as a result this file could not be analyzed. Check the syntax of the file using the `python -m py_compile` command and correct any invalid syntax.".format(diag_path)) .attribute("traceback", get_stack_trace_lines()) .attribute("args", exception.args) .status_page() @@ -374,7 +393,7 @@ def syntax_error_message(exception, unit): def recursion_error_message(exception, unit): # if unit is a BuiltinModuleExtractable, there will be no path attribute - l = Location(file=unit.path) if hasattr(unit, "path") else None + l = Location(file=_relative_path(unit.path)) if hasattr(unit, "path") else None return (DiagnosticMessage(Source("py/diagnostics/recursion-error", "Recursion error in Python extractor"), Severity.ERROR) .with_location(l) .text(exception.args[0]) @@ -385,7 +404,7 @@ def recursion_error_message(exception, unit): def internal_error_message(exception, unit): # if unit is a BuiltinModuleExtractable, there will be no path attribute - l = Location(file=unit.path) if hasattr(unit, "path") else None + l = Location(file=_relative_path(unit.path)) if hasattr(unit, "path") else None return (DiagnosticMessage(Source("py/diagnostics/internal-error", "Internal error in Python extractor"), Severity.ERROR) .with_location(l) .text("Internal error") diff --git a/python/ql/consistency-queries/DataFlowConsistency.ql b/python/ql/consistency-queries/DataFlowConsistency.ql index 829aa6debef2..e0ed207dc218 100644 --- a/python/ql/consistency-queries/DataFlowConsistency.ql +++ b/python/ql/consistency-queries/DataFlowConsistency.ql @@ -36,6 +36,8 @@ private module Input implements InputSig { // parameter, but dataflow-consistency queries should _not_ complain about there not // being a post-update node for the synthetic `**kwargs` parameter. n instanceof SynthDictSplatParameterNode + or + Private::Conversions::readStep(n, _, _) } predicate uniqueParameterNodePositionExclude(DataFlowCallable c, ParameterPosition pos, Node p) { diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 3d09821803b5..3efb4e574825 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.1.2 + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `py/clear-text-logging-sensitive-data`) may find more correct results and less fewer positive results after these changes. + ## 7.1.1 No user-facing changes. diff --git a/python/ql/lib/change-notes/2026-05-28-remove-imprecise-containter-steps.md b/python/ql/lib/change-notes/2026-05-28-remove-imprecise-containter-steps.md new file mode 100644 index 000000000000..25c664d6c05a --- /dev/null +++ b/python/ql/lib/change-notes/2026-05-28-remove-imprecise-containter-steps.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Python taint tracking is now more precise for values flowing through container contents, such as list, set, tuple, and dictionary elements. This may remove some false positive alerts. diff --git a/python/ql/lib/change-notes/released/7.1.2.md b/python/ql/lib/change-notes/released/7.1.2.md new file mode 100644 index 000000000000..523a14edfbe0 --- /dev/null +++ b/python/ql/lib/change-notes/released/7.1.2.md @@ -0,0 +1,5 @@ +## 7.1.2 + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `py/clear-text-logging-sensitive-data`) may find more correct results and less fewer positive results after these changes. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 8e970df6cae3..547681cc4408 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.1.1 +lastReleaseVersion: 7.1.2 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 826b35068691..210e683a54fc 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.1.1 +version: 7.1.3-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python 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 fffd0150008e..1ea5765dc37d 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -753,7 +753,7 @@ predicate jumpStepNotSharedWithTypeTracker(Node nodeFrom, Node nodeTo) { * As of 2024-04-02 the type-tracking library only supports precise content, so there is * no reason to include steps for list content right now. */ -predicate storeStepCommon(Node nodeFrom, ContentSet c, Node nodeTo) { +predicate storeStepCommon(Node nodeFrom, Content c, Node nodeTo) { tupleStoreStep(nodeFrom, c, nodeTo) or dictStoreStep(nodeFrom, c, nodeTo) @@ -767,29 +767,31 @@ predicate storeStepCommon(Node nodeFrom, ContentSet c, Node nodeTo) { * Holds if data can flow from `nodeFrom` to `nodeTo` via an assignment to * content `c`. */ -predicate storeStep(Node nodeFrom, ContentSet c, Node nodeTo) { - storeStepCommon(nodeFrom, c, nodeTo) - or - listStoreStep(nodeFrom, c, nodeTo) - or - setStoreStep(nodeFrom, c, nodeTo) - or - attributeStoreStep(nodeFrom, c, nodeTo) - or - matchStoreStep(nodeFrom, c, nodeTo) - or - any(Orm::AdditionalOrmSteps es).storeStep(nodeFrom, c, nodeTo) +predicate storeStep(Node nodeFrom, ContentSet cs, Node nodeTo) { + exists(Content c | cs = singleton(c) | + storeStepCommon(nodeFrom, c, nodeTo) + or + listStoreStep(nodeFrom, c, nodeTo) + or + setStoreStep(nodeFrom, c, nodeTo) + or + attributeStoreStep(nodeFrom, c, nodeTo) + or + matchStoreStep(nodeFrom, c, nodeTo) + or + any(Orm::AdditionalOrmSteps es).storeStep(nodeFrom, c, nodeTo) + or + synthStarArgsElementParameterNodeStoreStep(nodeFrom, c, nodeTo) + or + synthDictSplatArgumentNodeStoreStep(nodeFrom, c, nodeTo) + or + yieldStoreStep(nodeFrom, c, nodeTo) + or + VariableCapture::storeStep(nodeFrom, c, nodeTo) + ) or - FlowSummaryImpl::Private::Steps::summaryStoreStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), c, + FlowSummaryImpl::Private::Steps::summaryStoreStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), cs, nodeTo.(FlowSummaryNode).getSummaryNode()) - or - synthStarArgsElementParameterNodeStoreStep(nodeFrom, c, nodeTo) - or - synthDictSplatArgumentNodeStoreStep(nodeFrom, c, nodeTo) - or - yieldStoreStep(nodeFrom, c, nodeTo) - or - VariableCapture::storeStep(nodeFrom, c, nodeTo) } /** @@ -985,7 +987,7 @@ predicate attributeStoreStep(Node nodeFrom, AttributeContent c, Node nodeTo) { /** * Subset of `readStep` that should be shared with type-tracking. */ -predicate readStepCommon(Node nodeFrom, ContentSet c, Node nodeTo) { +predicate readStepCommon(Node nodeFrom, Content c, Node nodeTo) { subscriptReadStep(nodeFrom, c, nodeTo) or iterableUnpackingReadStep(nodeFrom, c, nodeTo) @@ -994,21 +996,25 @@ predicate readStepCommon(Node nodeFrom, ContentSet c, Node nodeTo) { /** * Holds if data can flow from `nodeFrom` to `nodeTo` via a read of content `c`. */ -predicate readStep(Node nodeFrom, ContentSet c, Node nodeTo) { - readStepCommon(nodeFrom, c, nodeTo) - or - matchReadStep(nodeFrom, c, nodeTo) - or - forReadStep(nodeFrom, c, nodeTo) - or - attributeReadStep(nodeFrom, c, nodeTo) +predicate readStep(Node nodeFrom, ContentSet cs, Node nodeTo) { + exists(Content c | cs = singleton(c) | + readStepCommon(nodeFrom, c, nodeTo) + or + matchReadStep(nodeFrom, c, nodeTo) + or + forReadStep(nodeFrom, c, nodeTo) + or + attributeReadStep(nodeFrom, c, nodeTo) + or + synthDictSplatParameterNodeReadStep(nodeFrom, c, nodeTo) + or + VariableCapture::readStep(nodeFrom, c, nodeTo) + ) or - FlowSummaryImpl::Private::Steps::summaryReadStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), c, + FlowSummaryImpl::Private::Steps::summaryReadStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), cs, nodeTo.(FlowSummaryNode).getSummaryNode()) or - synthDictSplatParameterNodeReadStep(nodeFrom, c, nodeTo) - or - VariableCapture::readStep(nodeFrom, c, nodeTo) + Conversions::readStep(nodeFrom, cs, nodeTo) } /** Data flows from a sequence to a subscript of the sequence. */ @@ -1064,23 +1070,68 @@ predicate attributeReadStep(Node nodeFrom, AttributeContent c, AttrRead nodeTo) nodeTo.accesses(nodeFrom, c.getAttribute()) } +module Conversions { + private import semmle.python.Concepts + + predicate decoderReadStep(Node nodeFrom, ContentSet c, Node nodeTo) { + exists(Decoding decoding | + nodeFrom = decoding.getAnInput() and + nodeTo = decoding.getOutput() + ) and + c.isAnyTupleOrDictionaryElement() + } + + predicate encoderReadStep(Node nodeFrom, ContentSet c, Node nodeTo) { + exists(Encoding encoding | + nodeFrom = encoding.getAnInput() and + nodeTo = encoding.getOutput() + ) and + c.isAnyTupleOrDictionaryElement() + } + + predicate formatReadStep(Node nodeFrom, ContentSet c, Node nodeTo) { + // % formatting + exists(BinaryExprNode fmt | fmt = nodeTo.asCfgNode() | + fmt.getOp() instanceof Mod and + fmt.getRight() = nodeFrom.asCfgNode() + ) and + c.isAnyTupleElement() + or + // format_map + // see https://docs.python.org/3/library/stdtypes.html#str.format_map + nodeTo.(MethodCallNode).calls(_, "format_map") and + nodeTo.(MethodCallNode).getArg(0) = nodeFrom and + c.isAnyDictionaryElement() + } + + predicate readStep(Node nodeFrom, ContentSet c, Node nodeTo) { + decoderReadStep(nodeFrom, c, nodeTo) + or + encoderReadStep(nodeFrom, c, nodeTo) + or + formatReadStep(nodeFrom, c, nodeTo) + } +} + /** * Holds if values stored inside content `c` are cleared at node `n`. For example, * any value stored inside `f` is cleared at the pre-update node associated with `x` * in `x.f = newValue`. */ -predicate clearsContent(Node n, ContentSet c) { - matchClearStep(n, c) - or - attributeClearStep(n, c) - or - dictClearStep(n, c) - or - FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(FlowSummaryNode).getSummaryNode(), c) - or - dictSplatParameterNodeClearStep(n, c) +predicate clearsContent(Node n, ContentSet cs) { + exists(Content c | cs = singleton(c) | + matchClearStep(n, c) + or + attributeClearStep(n, c) + or + dictClearStep(n, c) + or + dictSplatParameterNodeClearStep(n, c) + or + VariableCapture::clearsContent(n, c) + ) or - VariableCapture::clearsContent(n, c) + FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(FlowSummaryNode).getSummaryNode(), cs) } /** diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll index 8612d4a253e0..bb393630463c 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPublic.qll @@ -898,19 +898,78 @@ class CapturedVariableContent extends Content, TCapturedVariableContent { override string getMaDRepresentation() { none() } } +/** + * An entity that represents a set of `Content`s. + * + * Most `ContentSet`s are singletons (i.e. they consist of a single `Content`), + * but `AnyDictionaryElement` and `AnyTupleElement` act as wildcards on the + * read side: a read at such a `ContentSet` matches any specific dictionary + * key / tuple index store, as well as (for dictionaries) the + * "unknown-bucket" Content `DictionaryElementAnyContent`. + * + * Keeping these as wildcard `ContentSet`s (rather than enumerating one + * `ContentSet` per key/index) keeps the dataflow `readSetEx` relation small + * when implicit reads are used (e.g. at sinks via `defaultImplicitTaintRead`). + */ +private newtype TContentSet = + TSingletonContent(Content c) or + TAnyTupleElement() or + TAnyDictionaryElement() or + TAnyTupleOrDictionaryElement() + /** * An entity that represents a set of `Content`s. * * The set may be interpreted differently depending on whether it is * stored into (`getAStoreContent`) or read from (`getAReadContent`). */ -class ContentSet instanceof Content { +class ContentSet extends TContentSet { + /** Holds if this content set is the singleton `{c}`. */ + predicate isSingleton(Content c) { this = TSingletonContent(c) } + + /** Holds if this content set is the wildcard for all tuple elements. */ + predicate isAnyTupleElement() { this = TAnyTupleElement() } + + /** Holds if this content set is the wildcard for all dictionary elements. */ + predicate isAnyDictionaryElement() { this = TAnyDictionaryElement() } + + /** Holds if this content set is the wildcard for all tuple elements or dictionary elements. */ + predicate isAnyTupleOrDictionaryElement() { this = TAnyTupleOrDictionaryElement() } + /** Gets a content that may be stored into when storing into this set. */ - Content getAStoreContent() { result = this } + Content getAStoreContent() { this = TSingletonContent(result) } /** Gets a content that may be read from when reading from this set. */ - Content getAReadContent() { result = this } + Content getAReadContent() { + this = TSingletonContent(result) + or + // Wildcard expansion: a read at "any tuple element" matches a store at any + // specific tuple index. (Stores always target a specific index, so we don't + // need a `TupleElementAnyContent` Content kind here.) + this = TAnyTupleElement() and result instanceof TupleElementContent + or + this = TAnyDictionaryElement() and + (result instanceof DictionaryElementContent or result instanceof DictionaryElementAnyContent) + or + this = TAnyTupleOrDictionaryElement() and + ( + result instanceof TupleElementContent or + result instanceof DictionaryElementContent or + result instanceof DictionaryElementAnyContent + ) + } /** Gets a textual representation of this content set. */ - string toString() { result = super.toString() } + string toString() { + exists(Content c | this = TSingletonContent(c) | result = c.toString()) + or + this = TAnyTupleElement() and result = "Any tuple element" + or + this = TAnyDictionaryElement() and result = "Any dictionary element" + or + this = TAnyTupleOrDictionaryElement() and result = "Any tuple or dictionary element" + } } + +/** Gets the singleton `ContentSet` wrapping the `Content` `c`. */ +ContentSet singleton(Content c) { result = TSingletonContent(c) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll index 41cb0368b507..0931fcca0dc8 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll @@ -66,21 +66,29 @@ module Input implements InputSig } string encodeContent(ContentSet cs, string arg) { - cs = TListElementContent() and result = "ListElement" and arg = "" - or - cs = TSetElementContent() and result = "SetElement" and arg = "" - or - exists(int index | - cs = TTupleElementContent(index) and result = "TupleElement" and arg = index.toString() + exists(Content c | cs.isSingleton(c) | + c = TListElementContent() and result = "ListElement" and arg = "" + or + c = TSetElementContent() and result = "SetElement" and arg = "" + or + exists(int index | + c = TTupleElementContent(index) and result = "TupleElement" and arg = index.toString() + ) + or + exists(string key | + c = TDictionaryElementContent(key) and result = "DictionaryElement" and arg = key + ) + or + c = TDictionaryElementAnyContent() and result = "DictionaryElementAny" and arg = "" + or + exists(string attr | c = TAttributeContent(attr) and result = "Attribute" and arg = attr) ) or - exists(string key | - cs = TDictionaryElementContent(key) and result = "DictionaryElement" and arg = key - ) + cs.isAnyTupleElement() and result = "AnyTupleElement" and arg = "" or - cs = TDictionaryElementAnyContent() and result = "DictionaryElementAny" and arg = "" + cs.isAnyDictionaryElement() and result = "AnyDictionaryElement" and arg = "" or - exists(string attr | cs = TAttributeContent(attr) and result = "Attribute" and arg = attr) + cs.isAnyTupleOrDictionaryElement() and result = "AnyTupleOrDictionaryElement" and arg = "" } bindingset[token] @@ -139,27 +147,29 @@ module Private { predicate withContent = SC::withContent/1; /** Gets a summary component that represents a list element. */ - SummaryComponent listElement() { result = content(any(ListElementContent c)) } + SummaryComponent listElement() { result = content(singleton(any(ListElementContent c))) } /** Gets a summary component that represents a set element. */ - SummaryComponent setElement() { result = content(any(SetElementContent c)) } + SummaryComponent setElement() { result = content(singleton(any(SetElementContent c))) } /** Gets a summary component that represents a tuple element. */ SummaryComponent tupleElement(int index) { - exists(TupleElementContent c | c.getIndex() = index and result = content(c)) + exists(TupleElementContent c | c.getIndex() = index and result = content(singleton(c))) } /** Gets a summary component that represents a dictionary element. */ SummaryComponent dictionaryElement(string key) { - exists(DictionaryElementContent c | c.getKey() = key and result = content(c)) + exists(DictionaryElementContent c | c.getKey() = key and result = content(singleton(c))) } /** Gets a summary component that represents a dictionary element at any key. */ - SummaryComponent dictionaryElementAny() { result = content(any(DictionaryElementAnyContent c)) } + SummaryComponent dictionaryElementAny() { + result = content(singleton(any(DictionaryElementAnyContent c))) + } /** Gets a summary component that represents an attribute element. */ SummaryComponent attribute(string attr) { - exists(AttributeContent c | c.getAttribute() = attr and result = content(c)) + exists(AttributeContent c | c.getAttribute() = attr and result = content(singleton(c))) } /** Gets a summary component that represents the return value of a call. */ diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll index 62f5a76309b4..2213ff35b1b9 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll @@ -11,12 +11,34 @@ private import semmle.python.ApiGraphs */ predicate defaultTaintSanitizer(DataFlow::Node node) { none() } +/** + * Holds if default taint tracking should read content `contentSet` implicitly and + * propagate taint from a container to reads of that content. + */ +private predicate defaultTaintReadContent(DataFlow::ContentSet contentSet) { + // Tuple and dictionary content is precise, so use wildcard content sets to avoid + // blowing up the size of `Stage1::readSetEx` (otherwise this predicate would + // expand to one row per (node, distinct key or index) and the framework's + // read-set relation grows quadratically). `ContentSet.getAReadContent` expands + // these wildcards back to the specific contents when matching against stores. + contentSet.isAnyTupleOrDictionaryElement() + or + // List and set element content is already imprecise, so no wildcard expansion is + // needed. + contentSet.getAStoreContent() instanceof DataFlow::ListElementContent + or + contentSet.getAStoreContent() instanceof DataFlow::SetElementContent +} + /** * Holds if default `TaintTracking::Configuration`s should allow implicit reads * of `c` at sinks and inputs to additional taint steps. */ bindingset[node] -predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) { none() } +predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) { + exists(node) and + defaultTaintReadContent(c) +} private module Cached { /** @@ -128,11 +150,6 @@ predicate stringManipulation(DataFlow::CfgNode nodeFrom, DataFlow::CfgNode nodeT nodeFrom.getNode() = object and method_name in ["partition", "rpartition", "rsplit", "split", "splitlines"] or - // Iterable[str] -> str - // TODO: check if these should be handled differently in regards to content - method_name = "join" and - nodeFrom.getNode() = call.getArg(0) - or // Mapping[str, Any] -> str method_name = "format_map" and nodeFrom.getNode() = call.getArg(0) @@ -161,32 +178,21 @@ predicate stringManipulation(DataFlow::CfgNode nodeFrom, DataFlow::CfgNode nodeT } /** - * Holds if taint can flow from `nodeFrom` to `nodeTo` with a step related to containers - * (lists/sets/dictionaries): literals, constructor invocation, methods. Note that this - * is currently very imprecise, as an example, since we model `dict.get`, we treat any - * `.get()` will be tainted, whether it's true or not. + * Holds if taint can flow from `nodeFrom` to `nodeTo` with a step related to reading + * content from containers (lists/sets/dictionaries/tuples): subscripts, iteration, + * constructor invocation, methods. */ predicate containerStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { - // construction by literal - // - // TODO: once we have proper flow-summary modeling, we might not need this step any - // longer -- but there needs to be a matching read-step for the store-step, and we - // don't provide that right now. - DataFlowPrivate::listStoreStep(nodeFrom, _, nodeTo) - or - DataFlowPrivate::setStoreStep(nodeFrom, _, nodeTo) - or - DataFlowPrivate::tupleStoreStep(nodeFrom, _, nodeTo) - or - DataFlowPrivate::dictStoreStep(nodeFrom, _, nodeTo) - or - // comprehension, so there is taint-flow from `x` in `[x for x in xs]` to the - // resulting list of the list-comprehension. - // - // TODO: once we have proper flow-summary modeling, we might not need this step any - // longer -- but there needs to be a matching read-step for the store-step, and we - // don't provide that right now. - DataFlowPrivate::yieldStoreStep(nodeFrom, _, nodeTo) + exists(DataFlow::ContentSet contentSet | + DataFlowPrivate::readStep(nodeFrom, contentSet, nodeTo) and + exists(DataFlow::Content c | c = contentSet.getAReadContent() | + c instanceof DataFlow::TupleElementContent or + c instanceof DataFlow::DictionaryElementContent or + c instanceof DataFlow::DictionaryElementAnyContent or + c instanceof DataFlow::ListElementContent or + c instanceof DataFlow::SetElementContent + ) + ) } /** diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/TypeTrackingImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/TypeTrackingImpl.qll index 95434b05451d..215c7906e655 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/TypeTrackingImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/TypeTrackingImpl.qll @@ -241,7 +241,7 @@ module TypeTrackingInput implements Shared::TypeTrackingInput { // is only fed set/list content) not nodeFrom instanceof DataFlowPublic::IterableElementNode or - TypeTrackerSummaryFlow::basicStoreStep(nodeFrom, nodeTo, content) + TypeTrackerSummaryFlow::basicStoreStep(nodeFrom, nodeTo, DataFlowPublic::singleton(content)) } /** @@ -272,14 +272,15 @@ module TypeTrackingInput implements Shared::TypeTrackingInput { nodeFrom.asCfgNode() instanceof SequenceNode ) or - TypeTrackerSummaryFlow::basicLoadStep(nodeFrom, nodeTo, content) + TypeTrackerSummaryFlow::basicLoadStep(nodeFrom, nodeTo, DataFlowPublic::singleton(content)) } /** * Holds if the `loadContent` of `nodeFrom` is stored in the `storeContent` of `nodeTo`. */ predicate loadStoreStep(Node nodeFrom, Node nodeTo, Content loadContent, Content storeContent) { - TypeTrackerSummaryFlow::basicLoadStoreStep(nodeFrom, nodeTo, loadContent, storeContent) + TypeTrackerSummaryFlow::basicLoadStoreStep(nodeFrom, nodeTo, + DataFlowPublic::singleton(loadContent), DataFlowPublic::singleton(storeContent)) } /** diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index 5d3b994880a1..9364203436d2 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -4244,6 +4244,7 @@ module StdlibPrivate { ) // TODO: Once we have DictKeyContent, we need to transform that into ListElementContent ) and + // Element content is mutated into list element content output = "ReturnValue.ListElement" and preservesValue = true or @@ -4270,11 +4271,9 @@ module StdlibPrivate { preservesValue = true ) or - // TODO: We need to also translate iterable content such as list element - // but we currently lack TupleElementAny - input = "Argument[0]" and + input = "Argument[0].ListElement" and output = "ReturnValue" and - preservesValue = false + preservesValue = true } } @@ -4969,6 +4968,26 @@ module StdlibPrivate { } } + /** A flow summary for `str.join`. */ + class StrJoinSummary extends SummarizedCallable::Range { + StrJoinSummary() { this = "str.join" } + + override DataFlow::CallCfgNode getACall() { result.(DataFlow::MethodCallNode).calls(_, "join") } + + override DataFlow::ArgumentNode getACallback() { + result.(DataFlow::AttrRead).getAttributeName() = "join" + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + ( + // For code like `" ".join([name])` + input = "Argument[0,iterable:].ListElement" and + preservesValue = true + ) and + output = "ReturnValue" + } + } + // --------------------------------------------------------------------------- // asyncio // --------------------------------------------------------------------------- diff --git a/python/ql/lib/semmle/python/frameworks/lxml.model.yml b/python/ql/lib/semmle/python/frameworks/lxml.model.yml new file mode 100644 index 000000000000..77e69758ae86 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/lxml.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/python-all + extensible: summaryModel + data: + - ['lxml', 'Member[etree].Member[fromstringlist]', 'Argument[0,strings:].ListElement', 'ReturnValue', 'taint'] diff --git a/python/ql/lib/semmle/python/frameworks/xml.model.yml b/python/ql/lib/semmle/python/frameworks/xml.model.yml new file mode 100644 index 000000000000..96ea8480f93e --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/xml.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/python-all + extensible: summaryModel + data: + - ['xml', 'Member[etree].Member[fromstringlist]', 'Argument[0,strings:].ListElement', 'ReturnValue', 'taint'] diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 544b9778d4dd..27698f1d3df9 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.4 + +No user-facing changes. + ## 1.8.3 No user-facing changes. diff --git a/python/ql/src/Variables/LoopVariableCapture/LoopVariableCaptureQuery.qll b/python/ql/src/Variables/LoopVariableCapture/LoopVariableCaptureQuery.qll index 987740236f24..80577805e6df 100644 --- a/python/ql/src/Variables/LoopVariableCapture/LoopVariableCaptureQuery.qll +++ b/python/ql/src/Variables/LoopVariableCapture/LoopVariableCaptureQuery.qll @@ -61,10 +61,11 @@ module EscapingCaptureFlowConfig implements DataFlow::ConfigSig { predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet cs) { isSink(node) and ( - cs.(DataFlow::TupleElementContent).getIndex() in [0 .. 10] or - cs instanceof DataFlow::ListElementContent or - cs instanceof DataFlow::SetElementContent or - cs instanceof DataFlow::DictionaryElementAnyContent + cs.isAnyTupleOrDictionaryElement() + or + cs.getAStoreContent() instanceof DataFlow::ListElementContent + or + cs.getAStoreContent() instanceof DataFlow::SetElementContent ) } } diff --git a/python/ql/src/change-notes/released/1.8.4.md b/python/ql/src/change-notes/released/1.8.4.md new file mode 100644 index 000000000000..9aef6d10d1c8 --- /dev/null +++ b/python/ql/src/change-notes/released/1.8.4.md @@ -0,0 +1,3 @@ +## 1.8.4 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 8071ef421ab4..f2a60cd13271 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.3 +lastReleaseVersion: 1.8.4 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index ee265ad65e9f..0eba954079ea 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.3 +version: 1.8.5-dev groups: - python - queries diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected index 97527c300db5..6de2b27bfa76 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected @@ -3,11 +3,15 @@ edges | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:17:5:17:10 | ControlFlowNode for member | TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | provenance | | +| TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result [List element] | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | provenance | | | TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result | provenance | list.append | +| TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result [List element] | provenance | list.append | | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:28:9:28:14 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:28:9:28:14 | ControlFlowNode for member | TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | provenance | | +| TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result [List element] | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | provenance | | | TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result | provenance | list.append | +| TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result [List element] | provenance | list.append | | TarSlipImprov.py:38:1:38:3 | ControlFlowNode for tar | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:38:1:38:3 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | provenance | | @@ -34,16 +38,19 @@ edges | TarSlipImprov.py:142:9:142:13 | ControlFlowNode for entry | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | provenance | | | TarSlipImprov.py:151:14:151:50 | ControlFlowNode for closing() | TarSlipImprov.py:151:55:151:56 | ControlFlowNode for tf | provenance | | | TarSlipImprov.py:151:22:151:49 | ControlFlowNode for Attribute() | TarSlipImprov.py:151:14:151:50 | ControlFlowNode for closing() | provenance | Config | -| TarSlipImprov.py:151:55:151:56 | ControlFlowNode for tf | TarSlipImprov.py:152:13:152:20 | ControlFlowNode for Yield | provenance | | | TarSlipImprov.py:151:55:151:56 | ControlFlowNode for tf | TarSlipImprov.py:152:19:152:20 | ControlFlowNode for tf | provenance | | -| TarSlipImprov.py:152:13:152:20 | ControlFlowNode for Yield | TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() | provenance | | +| TarSlipImprov.py:152:13:152:20 | ControlFlowNode for Yield [List element] | TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() [List element] | provenance | | +| TarSlipImprov.py:152:19:152:20 | ControlFlowNode for tf | TarSlipImprov.py:152:13:152:20 | ControlFlowNode for Yield [List element] | provenance | | | TarSlipImprov.py:152:19:152:20 | ControlFlowNode for tf | TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() | provenance | | | TarSlipImprov.py:157:9:157:14 | ControlFlowNode for tar_cm | TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc | provenance | | +| TarSlipImprov.py:157:9:157:14 | ControlFlowNode for tar_cm [List element] | TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc [List element] | provenance | | | TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() | TarSlipImprov.py:157:9:157:14 | ControlFlowNode for tar_cm | provenance | | +| TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() [List element] | TarSlipImprov.py:157:9:157:14 | ControlFlowNode for tar_cm [List element] | provenance | | | TarSlipImprov.py:159:9:159:14 | ControlFlowNode for tar_cm | TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc | provenance | | | TarSlipImprov.py:159:18:159:52 | ControlFlowNode for closing() | TarSlipImprov.py:159:9:159:14 | ControlFlowNode for tar_cm | provenance | | | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:159:18:159:52 | ControlFlowNode for closing() | provenance | Config | | TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | provenance | | +| TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc [List element] | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | provenance | | | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:176:36:176:38 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:176:36:176:38 | ControlFlowNode for tar | TarSlipImprov.py:177:9:177:13 | ControlFlowNode for entry | provenance | | | TarSlipImprov.py:177:9:177:13 | ControlFlowNode for entry | TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | provenance | | @@ -60,7 +67,9 @@ edges | TarSlipImprov.py:231:43:231:52 | ControlFlowNode for corpus_tar | TarSlipImprov.py:233:9:233:9 | ControlFlowNode for f | provenance | | | TarSlipImprov.py:233:9:233:9 | ControlFlowNode for f | TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | provenance | | | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | provenance | | +| TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members [List element] | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | provenance | | | TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members | provenance | list.append | +| TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members [List element] | provenance | list.append | | TarSlipImprov.py:258:6:258:26 | ControlFlowNode for Attribute() | TarSlipImprov.py:258:31:258:33 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:258:31:258:33 | ControlFlowNode for tar | TarSlipImprov.py:259:9:259:13 | ControlFlowNode for entry | provenance | | | TarSlipImprov.py:259:9:259:13 | ControlFlowNode for entry | TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | provenance | | @@ -85,19 +94,24 @@ edges | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:304:1:304:3 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:306:5:306:10 | ControlFlowNode for member | TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | provenance | | +| TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result [List element] | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | provenance | | | TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result | provenance | list.append | +| TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result [List element] | provenance | list.append | nodes | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:17:5:17:10 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | +| TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | semmle.label | ControlFlowNode for tarfile | | TarSlipImprov.py:28:9:28:14 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | +| TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | +| TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | semmle.label | ControlFlowNode for result [List element] | | TarSlipImprov.py:38:1:38:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | semmle.label | ControlFlowNode for members_filter1() | @@ -133,14 +147,17 @@ nodes | TarSlipImprov.py:151:14:151:50 | ControlFlowNode for closing() | semmle.label | ControlFlowNode for closing() | | TarSlipImprov.py:151:22:151:49 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:151:55:151:56 | ControlFlowNode for tf | semmle.label | ControlFlowNode for tf | -| TarSlipImprov.py:152:13:152:20 | ControlFlowNode for Yield | semmle.label | ControlFlowNode for Yield | +| TarSlipImprov.py:152:13:152:20 | ControlFlowNode for Yield [List element] | semmle.label | ControlFlowNode for Yield [List element] | | TarSlipImprov.py:152:19:152:20 | ControlFlowNode for tf | semmle.label | ControlFlowNode for tf | | TarSlipImprov.py:157:9:157:14 | ControlFlowNode for tar_cm | semmle.label | ControlFlowNode for tar_cm | +| TarSlipImprov.py:157:9:157:14 | ControlFlowNode for tar_cm [List element] | semmle.label | ControlFlowNode for tar_cm [List element] | | TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() | semmle.label | ControlFlowNode for py2_tarxz() | +| TarSlipImprov.py:157:18:157:40 | ControlFlowNode for py2_tarxz() [List element] | semmle.label | ControlFlowNode for py2_tarxz() [List element] | | TarSlipImprov.py:159:9:159:14 | ControlFlowNode for tar_cm | semmle.label | ControlFlowNode for tar_cm | | TarSlipImprov.py:159:18:159:52 | ControlFlowNode for closing() | semmle.label | ControlFlowNode for closing() | | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc | semmle.label | ControlFlowNode for tarc | +| TarSlipImprov.py:162:20:162:23 | ControlFlowNode for tarc [List element] | semmle.label | ControlFlowNode for tarc [List element] | | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | semmle.label | ControlFlowNode for tarc | | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:176:36:176:38 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | @@ -163,6 +180,7 @@ nodes | TarSlipImprov.py:231:43:231:52 | ControlFlowNode for corpus_tar | semmle.label | ControlFlowNode for corpus_tar | | TarSlipImprov.py:233:9:233:9 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members | semmle.label | [post] ControlFlowNode for members | +| TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members [List element] | semmle.label | [post] ControlFlowNode for members [List element] | | TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | semmle.label | ControlFlowNode for members | | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | @@ -198,11 +216,13 @@ nodes | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:306:5:306:10 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | +| TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | subpaths | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | +| TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | #select | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | ControlFlowNode for result | | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | ControlFlowNode for members_filter1() | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected index de8721382bf3..ccc2daba50bf 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected @@ -93,7 +93,9 @@ edges | UnsafeUnpack.py:163:23:163:28 | ControlFlowNode for member | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | provenance | | | UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | UnsafeUnpack.py:163:23:163:28 | ControlFlowNode for member | provenance | | | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | provenance | | +| UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result [List element] | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | provenance | | | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | provenance | list.append | +| UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result [List element] | provenance | list.append | | UnsafeUnpack.py:171:1:171:8 | ControlFlowNode for response | UnsafeUnpack.py:174:15:174:22 | ControlFlowNode for response | provenance | | | UnsafeUnpack.py:171:12:171:50 | ControlFlowNode for Attribute() | UnsafeUnpack.py:171:1:171:8 | ControlFlowNode for response | provenance | | | UnsafeUnpack.py:173:11:173:17 | ControlFlowNode for tarpath | UnsafeUnpack.py:176:17:176:23 | ControlFlowNode for tarpath | provenance | | @@ -189,6 +191,7 @@ nodes | UnsafeUnpack.py:163:23:163:28 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | +| UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | UnsafeUnpack.py:171:1:171:8 | ControlFlowNode for response | semmle.label | ControlFlowNode for response | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-074-RemoteCommandExecution/RemoteCommandExecution.expected b/python/ql/test/experimental/query-tests/Security/CWE-074-RemoteCommandExecution/RemoteCommandExecution.expected index 914d6fbbee45..9ae14db94676 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-074-RemoteCommandExecution/RemoteCommandExecution.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-074-RemoteCommandExecution/RemoteCommandExecution.expected @@ -3,8 +3,10 @@ edges | Netmiko.py:18:16:18:18 | ControlFlowNode for cmd | Netmiko.py:20:45:20:47 | ControlFlowNode for cmd | provenance | | | Netmiko.py:18:16:18:18 | ControlFlowNode for cmd | Netmiko.py:21:52:21:54 | ControlFlowNode for cmd | provenance | | | Netmiko.py:18:16:18:18 | ControlFlowNode for cmd | Netmiko.py:22:52:22:54 | ControlFlowNode for cmd | provenance | | -| Netmiko.py:18:16:18:18 | ControlFlowNode for cmd | Netmiko.py:23:41:23:57 | ControlFlowNode for List | provenance | | +| Netmiko.py:18:16:18:18 | ControlFlowNode for cmd | Netmiko.py:23:43:23:45 | ControlFlowNode for cmd | provenance | | | Netmiko.py:18:16:18:18 | ControlFlowNode for cmd | Netmiko.py:24:48:24:50 | ControlFlowNode for cmd | provenance | | +| Netmiko.py:23:42:23:56 | ControlFlowNode for List [List element] | Netmiko.py:23:41:23:57 | ControlFlowNode for List | provenance | | +| Netmiko.py:23:43:23:45 | ControlFlowNode for cmd | Netmiko.py:23:42:23:56 | ControlFlowNode for List [List element] | provenance | | | Pexpect.py:15:16:15:18 | ControlFlowNode for cmd | Pexpect.py:16:14:16:16 | ControlFlowNode for cmd | provenance | | | Pexpect.py:15:16:15:18 | ControlFlowNode for cmd | Pexpect.py:18:18:18:20 | ControlFlowNode for cmd | provenance | | | Scrapli.py:13:16:13:18 | ControlFlowNode for cmd | Scrapli.py:24:42:24:44 | ControlFlowNode for cmd | provenance | | @@ -32,6 +34,8 @@ nodes | Netmiko.py:21:52:21:54 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | Netmiko.py:22:52:22:54 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | Netmiko.py:23:41:23:57 | ControlFlowNode for List | semmle.label | ControlFlowNode for List | +| Netmiko.py:23:42:23:56 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] | +| Netmiko.py:23:43:23:45 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | Netmiko.py:24:48:24:50 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | Pexpect.py:15:16:15:18 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | Pexpect.py:16:14:16:16 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-091-XsltInjection/XsltInjection.expected b/python/ql/test/experimental/query-tests/Security/CWE-091-XsltInjection/XsltInjection.expected index 64b10ac564de..8d960a22dfde 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-091-XsltInjection/XsltInjection.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-091-XsltInjection/XsltInjection.expected @@ -7,6 +7,7 @@ edges | xslt.py:10:17:10:43 | ControlFlowNode for Attribute() | xslt.py:10:5:10:13 | ControlFlowNode for xsltQuery | provenance | | | xslt.py:11:5:11:13 | ControlFlowNode for xslt_root | xslt.py:14:29:14:37 | ControlFlowNode for xslt_root | provenance | | | xslt.py:11:17:11:36 | ControlFlowNode for Attribute() | xslt.py:11:5:11:13 | ControlFlowNode for xslt_root | provenance | | +| xslt.py:11:27:11:35 | ControlFlowNode for xsltQuery | xslt.py:11:17:11:36 | ControlFlowNode for Attribute() | provenance | | | xslt.py:11:27:11:35 | ControlFlowNode for xsltQuery | xslt.py:11:17:11:36 | ControlFlowNode for Attribute() | provenance | Config | | xslt.py:11:27:11:35 | ControlFlowNode for xsltQuery | xslt.py:11:17:11:36 | ControlFlowNode for Attribute() | provenance | Decoding-XML | | xsltInjection.py:3:26:3:32 | ControlFlowNode for ImportMember | xsltInjection.py:3:26:3:32 | ControlFlowNode for request | provenance | | @@ -21,6 +22,7 @@ edges | xsltInjection.py:10:17:10:43 | ControlFlowNode for Attribute() | xsltInjection.py:10:5:10:13 | ControlFlowNode for xsltQuery | provenance | | | xsltInjection.py:11:5:11:13 | ControlFlowNode for xslt_root | xsltInjection.py:12:28:12:36 | ControlFlowNode for xslt_root | provenance | | | xsltInjection.py:11:17:11:36 | ControlFlowNode for Attribute() | xsltInjection.py:11:5:11:13 | ControlFlowNode for xslt_root | provenance | | +| xsltInjection.py:11:27:11:35 | ControlFlowNode for xsltQuery | xsltInjection.py:11:17:11:36 | ControlFlowNode for Attribute() | provenance | | | xsltInjection.py:11:27:11:35 | ControlFlowNode for xsltQuery | xsltInjection.py:11:17:11:36 | ControlFlowNode for Attribute() | provenance | Config | | xsltInjection.py:11:27:11:35 | ControlFlowNode for xsltQuery | xsltInjection.py:11:17:11:36 | ControlFlowNode for Attribute() | provenance | Decoding-XML | | xsltInjection.py:17:5:17:13 | ControlFlowNode for xsltQuery | xsltInjection.py:18:27:18:35 | ControlFlowNode for xsltQuery | provenance | | @@ -29,6 +31,7 @@ edges | xsltInjection.py:17:17:17:43 | ControlFlowNode for Attribute() | xsltInjection.py:17:5:17:13 | ControlFlowNode for xsltQuery | provenance | | | xsltInjection.py:18:5:18:13 | ControlFlowNode for xslt_root | xsltInjection.py:21:29:21:37 | ControlFlowNode for xslt_root | provenance | | | xsltInjection.py:18:17:18:36 | ControlFlowNode for Attribute() | xsltInjection.py:18:5:18:13 | ControlFlowNode for xslt_root | provenance | | +| xsltInjection.py:18:27:18:35 | ControlFlowNode for xsltQuery | xsltInjection.py:18:17:18:36 | ControlFlowNode for Attribute() | provenance | | | xsltInjection.py:18:27:18:35 | ControlFlowNode for xsltQuery | xsltInjection.py:18:17:18:36 | ControlFlowNode for Attribute() | provenance | Config | | xsltInjection.py:18:27:18:35 | ControlFlowNode for xsltQuery | xsltInjection.py:18:17:18:36 | ControlFlowNode for Attribute() | provenance | Decoding-XML | | xsltInjection.py:26:5:26:13 | ControlFlowNode for xsltQuery | xsltInjection.py:27:27:27:35 | ControlFlowNode for xsltQuery | provenance | | @@ -37,6 +40,7 @@ edges | xsltInjection.py:26:17:26:43 | ControlFlowNode for Attribute() | xsltInjection.py:26:5:26:13 | ControlFlowNode for xsltQuery | provenance | | | xsltInjection.py:27:5:27:13 | ControlFlowNode for xslt_root | xsltInjection.py:31:24:31:32 | ControlFlowNode for xslt_root | provenance | | | xsltInjection.py:27:17:27:36 | ControlFlowNode for Attribute() | xsltInjection.py:27:5:27:13 | ControlFlowNode for xslt_root | provenance | | +| xsltInjection.py:27:27:27:35 | ControlFlowNode for xsltQuery | xsltInjection.py:27:17:27:36 | ControlFlowNode for Attribute() | provenance | | | xsltInjection.py:27:27:27:35 | ControlFlowNode for xsltQuery | xsltInjection.py:27:17:27:36 | ControlFlowNode for Attribute() | provenance | Config | | xsltInjection.py:27:27:27:35 | ControlFlowNode for xsltQuery | xsltInjection.py:27:17:27:36 | ControlFlowNode for Attribute() | provenance | Decoding-XML | | xsltInjection.py:35:5:35:13 | ControlFlowNode for xsltQuery | xsltInjection.py:36:34:36:42 | ControlFlowNode for xsltQuery | provenance | | @@ -45,17 +49,22 @@ edges | xsltInjection.py:35:17:35:43 | ControlFlowNode for Attribute() | xsltInjection.py:35:5:35:13 | ControlFlowNode for xsltQuery | provenance | | | xsltInjection.py:36:5:36:13 | ControlFlowNode for xslt_root | xsltInjection.py:40:24:40:32 | ControlFlowNode for xslt_root | provenance | | | xsltInjection.py:36:17:36:43 | ControlFlowNode for Attribute() | xsltInjection.py:36:5:36:13 | ControlFlowNode for xslt_root | provenance | | +| xsltInjection.py:36:34:36:42 | ControlFlowNode for xsltQuery | xsltInjection.py:36:17:36:43 | ControlFlowNode for Attribute() | provenance | | | xsltInjection.py:36:34:36:42 | ControlFlowNode for xsltQuery | xsltInjection.py:36:17:36:43 | ControlFlowNode for Attribute() | provenance | Config | | xsltInjection.py:36:34:36:42 | ControlFlowNode for xsltQuery | xsltInjection.py:36:17:36:43 | ControlFlowNode for Attribute() | provenance | Decoding-XML | -| xsltInjection.py:44:5:44:13 | ControlFlowNode for xsltQuery | xsltInjection.py:45:5:45:15 | ControlFlowNode for xsltStrings | provenance | | +| xsltInjection.py:44:5:44:13 | ControlFlowNode for xsltQuery | xsltInjection.py:45:20:45:28 | ControlFlowNode for xsltQuery | provenance | | | xsltInjection.py:44:17:44:23 | ControlFlowNode for request | xsltInjection.py:44:17:44:28 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | xsltInjection.py:44:17:44:28 | ControlFlowNode for Attribute | xsltInjection.py:44:17:44:43 | ControlFlowNode for Attribute() | provenance | dict.get | | xsltInjection.py:44:17:44:43 | ControlFlowNode for Attribute() | xsltInjection.py:44:5:44:13 | ControlFlowNode for xsltQuery | provenance | | -| xsltInjection.py:45:5:45:15 | ControlFlowNode for xsltStrings | xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings | provenance | | +| xsltInjection.py:45:5:45:15 | ControlFlowNode for xsltStrings [List element] | xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings [List element] | provenance | | +| xsltInjection.py:45:19:45:44 | ControlFlowNode for List [List element] | xsltInjection.py:45:5:45:15 | ControlFlowNode for xsltStrings [List element] | provenance | | +| xsltInjection.py:45:20:45:28 | ControlFlowNode for xsltQuery | xsltInjection.py:45:19:45:44 | ControlFlowNode for List [List element] | provenance | | | xsltInjection.py:46:5:46:13 | ControlFlowNode for xslt_root | xsltInjection.py:50:24:50:32 | ControlFlowNode for xslt_root | provenance | | | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | xsltInjection.py:46:5:46:13 | ControlFlowNode for xslt_root | provenance | | -| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | provenance | Config | -| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | provenance | Decoding-XML | +| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings [List element] | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | provenance | | +| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings [List element] | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | provenance | Config | +| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings [List element] | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | provenance | Decoding-XML | +| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings [List element] | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | provenance | MaD:58660 | nodes | xslt.py:3:26:3:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | xslt.py:3:26:3:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -105,10 +114,12 @@ nodes | xsltInjection.py:44:17:44:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | xsltInjection.py:44:17:44:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | xsltInjection.py:44:17:44:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | -| xsltInjection.py:45:5:45:15 | ControlFlowNode for xsltStrings | semmle.label | ControlFlowNode for xsltStrings | +| xsltInjection.py:45:5:45:15 | ControlFlowNode for xsltStrings [List element] | semmle.label | ControlFlowNode for xsltStrings [List element] | +| xsltInjection.py:45:19:45:44 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] | +| xsltInjection.py:45:20:45:28 | ControlFlowNode for xsltQuery | semmle.label | ControlFlowNode for xsltQuery | | xsltInjection.py:46:5:46:13 | ControlFlowNode for xslt_root | semmle.label | ControlFlowNode for xslt_root | | xsltInjection.py:46:17:46:49 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | -| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings | semmle.label | ControlFlowNode for xsltStrings | +| xsltInjection.py:46:38:46:48 | ControlFlowNode for xsltStrings [List element] | semmle.label | ControlFlowNode for xsltStrings [List element] | | xsltInjection.py:50:24:50:32 | ControlFlowNode for xslt_root | semmle.label | ControlFlowNode for xslt_root | subpaths #select diff --git a/python/ql/test/experimental/query-tests/Security/CWE-1427-PromptInjection/PromptInjection.expected b/python/ql/test/experimental/query-tests/Security/CWE-1427-PromptInjection/PromptInjection.expected index 6acb03ce7f51..6e814aac4964 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-1427-PromptInjection/PromptInjection.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-1427-PromptInjection/PromptInjection.expected @@ -32,11 +32,13 @@ edges | agent_instructions.py:7:5:7:9 | ControlFlowNode for input | agent_instructions.py:9:50:9:89 | ControlFlowNode for BinaryExpr | provenance | Sink:MaD:11 | | agent_instructions.py:7:13:7:19 | ControlFlowNode for request | agent_instructions.py:7:13:7:24 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | agent_instructions.py:7:13:7:24 | ControlFlowNode for Attribute | agent_instructions.py:7:13:7:37 | ControlFlowNode for Attribute() | provenance | dict.get | +| agent_instructions.py:7:13:7:24 | ControlFlowNode for Attribute | agent_instructions.py:7:13:7:37 | ControlFlowNode for Attribute() | provenance | dict.get(input) | | agent_instructions.py:7:13:7:37 | ControlFlowNode for Attribute() | agent_instructions.py:7:5:7:9 | ControlFlowNode for input | provenance | | | agent_instructions.py:17:5:17:9 | ControlFlowNode for input | agent_instructions.py:25:28:25:32 | ControlFlowNode for input | provenance | | | agent_instructions.py:17:5:17:9 | ControlFlowNode for input | agent_instructions.py:35:28:35:32 | ControlFlowNode for input | provenance | | | agent_instructions.py:17:13:17:19 | ControlFlowNode for request | agent_instructions.py:17:13:17:24 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | agent_instructions.py:17:13:17:24 | ControlFlowNode for Attribute | agent_instructions.py:17:13:17:37 | ControlFlowNode for Attribute() | provenance | dict.get | +| agent_instructions.py:17:13:17:24 | ControlFlowNode for Attribute | agent_instructions.py:17:13:17:37 | ControlFlowNode for Attribute() | provenance | dict.get(input) | | agent_instructions.py:17:13:17:37 | ControlFlowNode for Attribute() | agent_instructions.py:17:5:17:9 | ControlFlowNode for input | provenance | | | anthropic_test.py:2:26:2:32 | ControlFlowNode for ImportMember | anthropic_test.py:2:26:2:32 | ControlFlowNode for request | provenance | | | anthropic_test.py:2:26:2:32 | ControlFlowNode for request | anthropic_test.py:11:15:11:21 | ControlFlowNode for request | provenance | | @@ -61,7 +63,7 @@ edges | openai_test.py:2:26:2:32 | ControlFlowNode for request | openai_test.py:13:13:13:19 | ControlFlowNode for request | provenance | | | openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:17:22:17:46 | ControlFlowNode for BinaryExpr | provenance | Sink:MaD:10 | | openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:22:22:22:46 | ControlFlowNode for BinaryExpr | provenance | Sink:MaD:10 | -| openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:23:15:37:9 | ControlFlowNode for List | provenance | Sink:MaD:9 | +| openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:26:28:26:51 | ControlFlowNode for BinaryExpr | provenance | | | openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:26:28:26:51 | ControlFlowNode for BinaryExpr | provenance | | | openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:41:22:41:46 | ControlFlowNode for BinaryExpr | provenance | Sink:MaD:10 | | openai_test.py:12:5:12:11 | ControlFlowNode for persona | openai_test.py:63:28:63:51 | ControlFlowNode for BinaryExpr | provenance | Sink:MaD:8 | @@ -72,7 +74,7 @@ edges | openai_test.py:12:15:12:26 | ControlFlowNode for Attribute | openai_test.py:12:15:12:41 | ControlFlowNode for Attribute() | provenance | dict.get | | openai_test.py:12:15:12:41 | ControlFlowNode for Attribute() | openai_test.py:12:5:12:11 | ControlFlowNode for persona | provenance | | | openai_test.py:13:5:13:9 | ControlFlowNode for query | openai_test.py:18:15:18:19 | ControlFlowNode for query | provenance | Sink:MaD:9 | -| openai_test.py:13:5:13:9 | ControlFlowNode for query | openai_test.py:23:15:37:9 | ControlFlowNode for List | provenance | Sink:MaD:9 | +| openai_test.py:13:5:13:9 | ControlFlowNode for query | openai_test.py:33:33:33:37 | ControlFlowNode for query | provenance | | | openai_test.py:13:5:13:9 | ControlFlowNode for query | openai_test.py:33:33:33:37 | ControlFlowNode for query | provenance | | | openai_test.py:13:5:13:9 | ControlFlowNode for query | openai_test.py:42:15:42:19 | ControlFlowNode for query | provenance | Sink:MaD:9 | | openai_test.py:13:5:13:9 | ControlFlowNode for query | openai_test.py:53:33:53:37 | ControlFlowNode for query | provenance | | @@ -82,6 +84,14 @@ edges | openai_test.py:13:13:13:19 | ControlFlowNode for request | openai_test.py:13:13:13:24 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | openai_test.py:13:13:13:24 | ControlFlowNode for Attribute | openai_test.py:13:13:13:37 | ControlFlowNode for Attribute() | provenance | dict.get | | openai_test.py:13:13:13:37 | ControlFlowNode for Attribute() | openai_test.py:13:5:13:9 | ControlFlowNode for query | provenance | | +| openai_test.py:24:13:27:13 | ControlFlowNode for Dict [Dictionary element at key content] | openai_test.py:23:15:37:9 | ControlFlowNode for List | provenance | Sink:MaD:9 Sink:MaD:9 | +| openai_test.py:26:28:26:51 | ControlFlowNode for BinaryExpr | openai_test.py:24:13:27:13 | ControlFlowNode for Dict [Dictionary element at key content] | provenance | | +| openai_test.py:28:13:36:13 | ControlFlowNode for Dict [Dictionary element at key content, List element, Dictionary element at key text] | openai_test.py:23:15:37:9 | ControlFlowNode for List | provenance | Sink:MaD:9 Sink:MaD:9 | +| openai_test.py:28:13:36:13 | ControlFlowNode for Dict [Dictionary element at key content, List element, Dictionary element at key text] | openai_test.py:23:15:37:9 | ControlFlowNode for List | provenance | Sink:MaD:9 Sink:MaD:9 Sink:MaD:9 | +| openai_test.py:28:13:36:13 | ControlFlowNode for Dict [Dictionary element at key content, List element, Dictionary element at key text] | openai_test.py:23:15:37:9 | ControlFlowNode for List | provenance | Sink:MaD:9 Sink:MaD:9 Sink:MaD:9 Sink:MaD:9 | +| openai_test.py:30:28:35:17 | ControlFlowNode for List [List element, Dictionary element at key text] | openai_test.py:28:13:36:13 | ControlFlowNode for Dict [Dictionary element at key content, List element, Dictionary element at key text] | provenance | | +| openai_test.py:31:21:34:21 | ControlFlowNode for Dict [Dictionary element at key text] | openai_test.py:30:28:35:17 | ControlFlowNode for List [List element, Dictionary element at key text] | provenance | | +| openai_test.py:33:33:33:37 | ControlFlowNode for query | openai_test.py:31:21:34:21 | ControlFlowNode for Dict [Dictionary element at key text] | provenance | | models | 1 | Sink: Anthropic; Member[beta].Member[messages].Member[create].Argument[messages:].ListElement.DictionaryElement[content]; prompt-injection | | 2 | Sink: Anthropic; Member[beta].Member[messages].Member[create].Argument[system:]; prompt-injection | @@ -140,7 +150,13 @@ nodes | openai_test.py:18:15:18:19 | ControlFlowNode for query | semmle.label | ControlFlowNode for query | | openai_test.py:22:22:22:46 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | | openai_test.py:23:15:37:9 | ControlFlowNode for List | semmle.label | ControlFlowNode for List | +| openai_test.py:24:13:27:13 | ControlFlowNode for Dict [Dictionary element at key content] | semmle.label | ControlFlowNode for Dict [Dictionary element at key content] | | openai_test.py:26:28:26:51 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | +| openai_test.py:26:28:26:51 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | +| openai_test.py:28:13:36:13 | ControlFlowNode for Dict [Dictionary element at key content, List element, Dictionary element at key text] | semmle.label | ControlFlowNode for Dict [Dictionary element at key content, List element, Dictionary element at key text] | +| openai_test.py:30:28:35:17 | ControlFlowNode for List [List element, Dictionary element at key text] | semmle.label | ControlFlowNode for List [List element, Dictionary element at key text] | +| openai_test.py:31:21:34:21 | ControlFlowNode for Dict [Dictionary element at key text] | semmle.label | ControlFlowNode for Dict [Dictionary element at key text] | +| openai_test.py:33:33:33:37 | ControlFlowNode for query | semmle.label | ControlFlowNode for query | | openai_test.py:33:33:33:37 | ControlFlowNode for query | semmle.label | ControlFlowNode for query | | openai_test.py:41:22:41:46 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | | openai_test.py:42:15:42:19 | ControlFlowNode for query | semmle.label | ControlFlowNode for query | diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/AllLiveReachable.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/AllLiveReachable.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/AllLiveReachable.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/AllLiveReachable.ql new file mode 100644 index 000000000000..886ccb4c3489 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/AllLiveReachable.ql @@ -0,0 +1,17 @@ +/** + * Checks that every live (non-dead) annotation in the test function's + * own scope is reachable from the function entry in the CFG. + * Annotations in nested scopes (generators, async, lambdas, comprehensions) + * have separate CFGs and are excluded from this check. + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerCfgNode a, TestFunction f +where allLiveReachable(a, f) +select a, "Unreachable live annotation; entry of $@ does not reach this node", f, f.getName() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/AnnotationHasCfgNode.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/AnnotationHasCfgNode.expected new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/AnnotationHasCfgNode.expected @@ -0,0 +1 @@ + diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/AnnotationHasCfgNode.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/AnnotationHasCfgNode.ql new file mode 100644 index 000000000000..04c01abf8a67 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/AnnotationHasCfgNode.ql @@ -0,0 +1,14 @@ +/** + * Checks that every timer annotation has a corresponding CFG node. + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils::CfgTests + +from TimerAnnotation ann +where annotationWithoutCfgNode(ann) +select ann, "Annotation in $@ has no CFG node", ann.getTestFunction(), + ann.getTestFunction().getName() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockAnnotationGap.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockAnnotationGap.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockAnnotationGap.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockAnnotationGap.ql new file mode 100644 index 000000000000..691144e06e4f --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockAnnotationGap.ql @@ -0,0 +1,21 @@ +/** + * Checks that within a basic block, if a node is annotated then its + * successor is also annotated (or excluded). A gap in annotations + * within a basic block indicates a missing annotation, since there + * are no branches to justify the gap. + * + * Nodes with exceptional successors are excluded, as the exception + * edge leaves the basic block and the normal successor may be dead. + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerCfgNode a, CfgNode succ +where basicBlockAnnotationGap(a, succ) +select a, "Annotated node followed by unannotated $@ in the same basic block", succ, + succ.getNode().toString() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockOrdering.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockOrdering.expected new file mode 100644 index 000000000000..910fd3c8a80d --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockOrdering.expected @@ -0,0 +1,14 @@ +| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:9:59:9:59 | IntegerLiteral | timestamp 2 | test_boolean.py:9:19:9:19 | IntegerLiteral | timestamp 0 | +| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:15:50:15:50 | IntegerLiteral | timestamp 1 | test_boolean.py:15:20:15:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:21:49:21:49 | IntegerLiteral | timestamp 1 | test_boolean.py:21:19:21:19 | IntegerLiteral | timestamp 0 | +| test_boolean.py:27:10:27:34 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:27:50:27:50 | IntegerLiteral | timestamp 2 | test_boolean.py:27:20:27:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:40:86:40:86 | IntegerLiteral | timestamp 3 | test_boolean.py:40:16:40:16 | IntegerLiteral | timestamp 0 | +| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:46:86:46:86 | IntegerLiteral | timestamp 3 | test_boolean.py:46:16:46:16 | IntegerLiteral | timestamp 0 | +| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:20:52:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:63:52:63 | IntegerLiteral | timestamp 2 | +| test_boolean.py:52:11:52:47 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:52:63:52:63 | IntegerLiteral | timestamp 2 | test_boolean.py:52:20:52:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:64:10:64:52 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:64:59:64:59 | IntegerLiteral | timestamp 6 | test_boolean.py:64:17:64:17 | IntegerLiteral | timestamp 0 | +| test_boolean.py:64:10:64:52 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:64:59:64:59 | IntegerLiteral | timestamp 6 | test_boolean.py:64:27:64:27 | IntegerLiteral | timestamp 2 | +| test_boolean.py:76:10:76:51 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:76:58:76:58 | IntegerLiteral | timestamp 6 | test_boolean.py:76:17:76:17 | IntegerLiteral | timestamp 0 | +| test_boolean.py:76:10:76:51 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:76:58:76:58 | IntegerLiteral | timestamp 6 | test_boolean.py:76:27:76:27 | IntegerLiteral | timestamp 2 | +| test_if.py:96:9:96:29 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_if.py:96:36:96:36 | IntegerLiteral | timestamp 4 | test_if.py:96:15:96:15 | IntegerLiteral | timestamp 2 | diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockOrdering.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockOrdering.ql new file mode 100644 index 000000000000..6c08d44a5a59 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/BasicBlockOrdering.ql @@ -0,0 +1,16 @@ +/** + * Checks that within a single basic block, annotations appear in + * increasing minimum-timestamp order. + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerCfgNode a, TimerCfgNode b, int minA, int minB +where basicBlockOrdering(a, b, minA, minB) +select a, "Basic block ordering: $@ appears before $@", a.getTimestampExpr(minA), + "timestamp " + minA, b.getTimestampExpr(minB), "timestamp " + minB diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/ConsecutiveTimestamps.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/ConsecutiveTimestamps.expected new file mode 100644 index 000000000000..ed22c971ecbc --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/ConsecutiveTimestamps.expected @@ -0,0 +1,12 @@ +| test_boolean.py:9:26:9:27 | IntegerLiteral | $@ in $@ has no consecutive successor (expected 2) | test_boolean.py:9:33:9:33 | IntegerLiteral | Timestamp 1 | test_boolean.py:7:1:7:27 | Function test_and_both_sides | test_and_both_sides | +| test_boolean.py:15:10:15:14 | False | $@ in $@ has no consecutive successor (expected 1) | test_boolean.py:15:20:15:20 | IntegerLiteral | Timestamp 0 | test_boolean.py:13:1:13:30 | Function test_and_short_circuit | test_and_short_circuit | +| test_boolean.py:21:10:21:13 | True | $@ in $@ has no consecutive successor (expected 1) | test_boolean.py:21:19:21:19 | IntegerLiteral | Timestamp 0 | test_boolean.py:19:1:19:29 | Function test_or_short_circuit | test_or_short_circuit | +| test_boolean.py:27:26:27:27 | IntegerLiteral | $@ in $@ has no consecutive successor (expected 2) | test_boolean.py:27:33:27:33 | IntegerLiteral | Timestamp 1 | test_boolean.py:25:1:25:26 | Function test_or_both_sides | test_or_both_sides | +| test_boolean.py:40:45:40:45 | IntegerLiteral | $@ in $@ has no consecutive successor (expected 3) | test_boolean.py:40:51:40:51 | IntegerLiteral | Timestamp 2 | test_boolean.py:38:1:38:24 | Function test_chained_and | test_chained_and | +| test_boolean.py:46:44:46:45 | IntegerLiteral | $@ in $@ has no consecutive successor (expected 3) | test_boolean.py:46:51:46:51 | IntegerLiteral | Timestamp 2 | test_boolean.py:44:1:44:23 | Function test_chained_or | test_chained_or | +| test_boolean.py:52:11:52:47 | BoolExpr | $@ in $@ has no consecutive successor (expected 3) | test_boolean.py:52:63:52:63 | IntegerLiteral | Timestamp 2 | test_boolean.py:50:1:50:25 | Function test_mixed_and_or | test_mixed_and_or | +| test_boolean.py:52:27:52:31 | False | $@ in $@ has no consecutive successor (expected 2) | test_boolean.py:52:37:52:37 | IntegerLiteral | Timestamp 1 | test_boolean.py:50:1:50:25 | Function test_mixed_and_or | test_mixed_and_or | +| test_boolean.py:52:78:52:79 | IntegerLiteral | $@ in $@ has no consecutive successor (expected 4) | test_boolean.py:52:85:52:85 | IntegerLiteral | Timestamp 3 | test_boolean.py:50:1:50:25 | Function test_mixed_and_or | test_mixed_and_or | +| test_if.py:95:9:95:13 | False | $@ in $@ has no consecutive successor (expected 2) | test_if.py:95:19:95:19 | IntegerLiteral | Timestamp 1 | test_if.py:93:1:93:34 | Function test_if_compound_condition | test_if_compound_condition | +| test_if.py:96:9:96:29 | BoolExpr | $@ in $@ has no consecutive successor (expected 5) | test_if.py:96:36:96:36 | IntegerLiteral | Timestamp 4 | test_if.py:93:1:93:34 | Function test_if_compound_condition | test_if_compound_condition | +| test_if.py:96:22:96:22 | y | $@ in $@ has no consecutive successor (expected 4) | test_if.py:96:28:96:28 | IntegerLiteral | Timestamp 3 | test_if.py:93:1:93:34 | Function test_if_compound_condition | test_if_compound_condition | diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/ConsecutiveTimestamps.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/ConsecutiveTimestamps.ql new file mode 100644 index 000000000000..01ff59b49bf6 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/ConsecutiveTimestamps.ql @@ -0,0 +1,24 @@ +/** + * Checks that consecutive annotated nodes have consecutive timestamps: + * for each annotation with timestamp `a`, some CFG node for that annotation + * must have a next annotation containing `a + 1`. + * + * Handles CFG splitting (e.g., finally blocks duplicated for normal/exceptional + * flow) by checking that at least one split has the required successor. + * + * Only applies to functions where all annotations are in the function's + * own scope (excludes tests with generators, async, comprehensions, or + * lambdas that have annotations in nested scopes). + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerAnnotation ann, int a +where consecutiveTimestamps(ann, a) +select ann, "$@ in $@ has no consecutive successor (expected " + (a + 1) + ")", + ann.getTimestampExpr(a), "Timestamp " + a, ann.getTestFunction(), ann.getTestFunction().getName() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/ContiguousTimestamps.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/ContiguousTimestamps.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/ContiguousTimestamps.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/ContiguousTimestamps.ql new file mode 100644 index 000000000000..f18c52750b52 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/ContiguousTimestamps.ql @@ -0,0 +1,17 @@ +/** + * Checks that timestamps form a contiguous sequence {0, 1, ..., max} + * within each test function. Every integer in the range must appear + * in at least one annotation (live or dead). + */ + +import TimerUtils + +from TestFunction f, int missing, int maxTs, TimerAnnotation maxAnn +where + maxTs = max(TimerAnnotation a | a.getTestFunction() = f | a.getATimestamp()) and + maxAnn.getTestFunction() = f and + maxAnn.getATimestamp() = maxTs and + missing = [0 .. maxTs] and + not exists(TimerAnnotation a | a.getTestFunction() = f and a.getATimestamp() = missing) +select f, "Missing timestamp " + missing + " (max is $@)", maxAnn.getTimestampExpr(maxTs), + maxTs.toString() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/MissingAnnotations.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/MissingAnnotations.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/MissingAnnotations.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/MissingAnnotations.ql new file mode 100644 index 000000000000..51f324e9399c --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/MissingAnnotations.ql @@ -0,0 +1,15 @@ +/** + * Finds expressions in test functions that lack a timer annotation + * and are not part of the timer mechanism or otherwise excluded. + * An empty result means every annotatable expression is covered. + */ + +import python +import TimerUtils + +from TestFunction f, Expr e +where + e.getScope().getEnclosingScope*() = f and + not isTimerMechanism(e, f) and + not isUnannotatable(e) +select e, "Missing annotation in $@", f, f.getName() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NeverReachable.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/NeverReachable.expected new file mode 100644 index 000000000000..874a7dfb0960 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NeverReachable.expected @@ -0,0 +1,2 @@ +| test_match.py:159:13:159:13 | IntegerLiteral | Node annotated with t.never is reachable in $@ | test_match.py:151:1:151:42 | Function test_match_exhaustive_return_first | test_match_exhaustive_return_first | +| test_match.py:172:13:172:13 | IntegerLiteral | Node annotated with t.never is reachable in $@ | test_match.py:164:1:164:45 | Function test_match_exhaustive_return_wildcard | test_match_exhaustive_return_wildcard | diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NeverReachable.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/NeverReachable.ql new file mode 100644 index 000000000000..9fbb9115814a --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NeverReachable.ql @@ -0,0 +1,16 @@ +/** + * Checks that expressions annotated with `t.never` either have no CFG + * node, or if they do, that the node is not reachable from its scope's + * entry (including within the same basic block). + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils::CfgTests + +from TimerAnnotation ann +where neverReachable(ann) +select ann, "Node annotated with t.never is reachable in $@", ann.getTestFunction(), + ann.getTestFunction().getName() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBackwardFlow.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBackwardFlow.expected new file mode 100644 index 000000000000..6e8ea12c9dd4 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBackwardFlow.expected @@ -0,0 +1,11 @@ +| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:9:59:9:59 | IntegerLiteral | 2 | test_boolean.py:9:10:9:13 | ControlFlowNode for True | True | test_boolean.py:9:19:9:19 | IntegerLiteral | 0 | +| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:15:50:15:50 | IntegerLiteral | 1 | test_boolean.py:15:10:15:14 | ControlFlowNode for False | False | test_boolean.py:15:20:15:20 | IntegerLiteral | 0 | +| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:21:49:21:49 | IntegerLiteral | 1 | test_boolean.py:21:10:21:13 | ControlFlowNode for True | True | test_boolean.py:21:19:21:19 | IntegerLiteral | 0 | +| test_boolean.py:27:10:27:34 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:27:50:27:50 | IntegerLiteral | 2 | test_boolean.py:27:10:27:14 | ControlFlowNode for False | False | test_boolean.py:27:20:27:20 | IntegerLiteral | 0 | +| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:40:86:40:86 | IntegerLiteral | 3 | test_boolean.py:40:10:40:10 | ControlFlowNode for IntegerLiteral | IntegerLiteral | test_boolean.py:40:16:40:16 | IntegerLiteral | 0 | +| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:46:86:46:86 | IntegerLiteral | 3 | test_boolean.py:46:10:46:10 | ControlFlowNode for IntegerLiteral | IntegerLiteral | test_boolean.py:46:16:46:16 | IntegerLiteral | 0 | +| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:52:120:52:120 | IntegerLiteral | 4 | test_boolean.py:52:11:52:47 | ControlFlowNode for BoolExpr | BoolExpr | test_boolean.py:52:63:52:63 | IntegerLiteral | 2 | +| test_boolean.py:52:11:52:47 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:52:63:52:63 | IntegerLiteral | 2 | test_boolean.py:52:11:52:14 | ControlFlowNode for True | True | test_boolean.py:52:20:52:20 | IntegerLiteral | 0 | +| test_boolean.py:64:10:64:52 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:64:59:64:59 | IntegerLiteral | 6 | test_boolean.py:64:11:64:11 | ControlFlowNode for f | f | test_boolean.py:64:17:64:17 | IntegerLiteral | 0 | +| test_boolean.py:76:10:76:51 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:76:58:76:58 | IntegerLiteral | 6 | test_boolean.py:76:11:76:11 | ControlFlowNode for f | f | test_boolean.py:76:17:76:17 | IntegerLiteral | 0 | +| test_if.py:96:9:96:29 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_if.py:96:36:96:36 | IntegerLiteral | 4 | test_if.py:96:9:96:9 | ControlFlowNode for x | x | test_if.py:96:15:96:15 | IntegerLiteral | 2 | diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBackwardFlow.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBackwardFlow.ql new file mode 100644 index 000000000000..e9926284295f --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBackwardFlow.ql @@ -0,0 +1,17 @@ +/** + * Checks that time never flows backward between consecutive timer annotations + * in the CFG. For each pair of consecutive annotated nodes (A -> B), there must + * exist timestamps a in A and b in B with a < b. + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerCfgNode a, TimerCfgNode b, int minA, int maxB +where noBackwardFlow(a, b, minA, maxB) +select a, "Backward flow: $@ flows to $@ (max timestamp $@)", a.getTimestampExpr(minA), + minA.toString(), b, b.getNode().toString(), b.getTimestampExpr(maxB), maxB.toString() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBasicBlock.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBasicBlock.expected new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBasicBlock.expected @@ -0,0 +1 @@ + diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBasicBlock.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBasicBlock.ql new file mode 100644 index 000000000000..82d9589a9750 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoBasicBlock.ql @@ -0,0 +1,14 @@ +/** + * Checks that every annotated CFG node belongs to a basic block. + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from CfgNode n, TestFunction f +where noBasicBlock(n, f) +select n, "CFG node in $@ does not belong to any basic block", f, f.getName() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NoSharedReachable.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoSharedReachable.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/NoSharedReachable.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoSharedReachable.ql new file mode 100644 index 000000000000..e9f685e8ffae --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/NoSharedReachable.ql @@ -0,0 +1,16 @@ +/** + * Checks that two annotations sharing a timestamp value are on + * mutually exclusive CFG paths (neither can reach the other). + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerCfgNode a, TimerCfgNode b, int ts +where noSharedReachable(a, b, ts) +select a, "Shared timestamp $@ but this node reaches $@", a.getTimestampExpr(ts), ts.toString(), b, + b.getNode().toString() diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/OldCfgImpl.qll b/python/ql/test/library-tests/ControlFlow/evaluation-order/OldCfgImpl.qll new file mode 100644 index 000000000000..cb7bbb495b87 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/OldCfgImpl.qll @@ -0,0 +1,16 @@ +/** + * Implementation of the evaluation-order CFG signature using the existing + * Python control flow graph. + */ + +private import python as PY +import TimerUtils + +/** Existing Python CFG implementation of the evaluation-order signature. */ +module OldCfg implements EvalOrderCfgSig { + class CfgNode = PY::ControlFlowNode; + + class BasicBlock = PY::BasicBlock; + + CfgNode scopeGetEntryNode(PY::Scope s) { result = s.getEntryNode() } +} diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/StrictForward.expected b/python/ql/test/library-tests/ControlFlow/evaluation-order/StrictForward.expected new file mode 100644 index 000000000000..6562ff9f7b2f --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/StrictForward.expected @@ -0,0 +1,11 @@ +| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:9:59:9:59 | IntegerLiteral | timestamp 2 | test_boolean.py:9:19:9:19 | IntegerLiteral | timestamp 0 | +| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:15:50:15:50 | IntegerLiteral | timestamp 1 | test_boolean.py:15:20:15:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:21:49:21:49 | IntegerLiteral | timestamp 1 | test_boolean.py:21:19:21:19 | IntegerLiteral | timestamp 0 | +| test_boolean.py:27:10:27:34 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:27:50:27:50 | IntegerLiteral | timestamp 2 | test_boolean.py:27:20:27:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:40:86:40:86 | IntegerLiteral | timestamp 3 | test_boolean.py:40:16:40:16 | IntegerLiteral | timestamp 0 | +| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:46:86:46:86 | IntegerLiteral | timestamp 3 | test_boolean.py:46:16:46:16 | IntegerLiteral | timestamp 0 | +| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:63:52:63 | IntegerLiteral | timestamp 2 | +| test_boolean.py:52:11:52:47 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:52:63:52:63 | IntegerLiteral | timestamp 2 | test_boolean.py:52:20:52:20 | IntegerLiteral | timestamp 0 | +| test_boolean.py:64:10:64:52 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:64:59:64:59 | IntegerLiteral | timestamp 6 | test_boolean.py:64:17:64:17 | IntegerLiteral | timestamp 0 | +| test_boolean.py:76:10:76:51 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:76:58:76:58 | IntegerLiteral | timestamp 6 | test_boolean.py:76:17:76:17 | IntegerLiteral | timestamp 0 | +| test_if.py:96:9:96:29 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_if.py:96:36:96:36 | IntegerLiteral | timestamp 4 | test_if.py:96:15:96:15 | IntegerLiteral | timestamp 2 | diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/StrictForward.ql b/python/ql/test/library-tests/ControlFlow/evaluation-order/StrictForward.ql new file mode 100644 index 000000000000..79b383a4acfa --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/StrictForward.ql @@ -0,0 +1,17 @@ +/** + * Stronger version of NoBackwardFlow: for consecutive annotated nodes + * A -> B that both have a single timestamp (non-loop code) and B does + * NOT dominate A (forward edge), requires max(A) < min(B). + */ + +import OldCfgImpl + +private module Utils = EvalOrderCfgUtils; + +private import Utils +private import Utils::CfgTests + +from TimerCfgNode a, TimerCfgNode b, int maxA, int minB +where strictForward(a, b, maxA, minB) +select a, "Strict forward violation: $@ flows to $@", a.getTimestampExpr(maxA), "timestamp " + maxA, + b.getTimestampExpr(minB), "timestamp " + minB diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/TimerUtils.qll b/python/ql/test/library-tests/ControlFlow/evaluation-order/TimerUtils.qll new file mode 100644 index 000000000000..23f8f3a50a0a --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/TimerUtils.qll @@ -0,0 +1,614 @@ +/** + * Utility library for identifying timer annotations in evaluation-order tests. + * + * Identifies `expr @ t[n]` (matmul) and `t(expr, n)` (call) patterns, + * including `dead(n)` and `never` markers within subscripts, extracts + * timestamp values, and provides predicates for traversing consecutive + * annotated CFG nodes. + */ + +import python + +/** + * A function decorated with `@test` from the timer module. + * The first parameter is the timer object. + */ +class TestFunction extends Function { + TestFunction() { + this.getADecorator().(Name).getId() = "test" and + this.getPositionalParameterCount() >= 1 + } + + /** Gets the name of the timer parameter (first parameter). */ + string getTimerParamName() { result = this.getArgName(0) } +} + +/** + * Gets an element from a timestamp subscript index. Each element is either + * an `IntegerLiteral` (live), a `Call` to `dead` (dead), a `Name("never")` + * (never), or a tuple containing any mix of these. + */ +private Expr timestampElement(Expr timestamps) { + result = timestamps and not timestamps instanceof Tuple + or + result = timestamps.(Tuple).getAnElt() +} + +/** Gets a live timestamp value from a subscript index expression. */ +private IntegerLiteral liveTimestampLiteral(Expr timestamps) { + result = timestampElement(timestamps) and + not result = any(Call c).getAnArg() +} + +/** Gets a dead timestamp value from a subscript index expression. */ +private IntegerLiteral deadTimestampLiteral(Expr timestamps) { + exists(Call c | + c = timestampElement(timestamps) and + c.getFunc().(Name).getId() = "dead" and + result = c.getArg(0) + ) +} + +/** Holds if the subscript index contains `never`. */ +private predicate hasNever(Expr timestamps) { + timestampElement(timestamps).(Name).getId() = "never" +} + +/** A timer annotation in the AST. */ +private newtype TTimerAnnotation = + /** `expr @ t[n]` or `expr @ t[n, m, ...]` or `expr @ t[dead(n), m, never]` */ + TMatmulAnnotation(TestFunction func, Expr annotated, Expr timestamps) { + exists(BinaryExpr be | + be.getOp() instanceof MatMult and + be.getRight().(Subscript).getObject().(Name).getId() = func.getTimerParamName() and + be.getScope().getEnclosingScope*() = func and + annotated = be.getLeft() and + timestamps = be.getRight().(Subscript).getIndex() + ) + } or + /** `t(expr, n)` */ + TCallAnnotation(TestFunction func, Expr annotated, Expr timestamps) { + exists(Call call | + call.getFunc().(Name).getId() = func.getTimerParamName() and + call.getScope().getEnclosingScope*() = func and + annotated = call.getArg(0) and + timestamps = call.getArg(1) + ) + } + +/** A timer annotation (wrapping the newtype for a clean API). */ +class TimerAnnotation extends TTimerAnnotation { + /** Gets a live timestamp value from this annotation. */ + int getATimestamp() { exists(this.getTimestampExpr(result)) } + + /** Gets the source expression for live timestamp value `ts`. */ + IntegerLiteral getTimestampExpr(int ts) { + result = liveTimestampLiteral(this.getTimestampsExpr()) and + result.getValue() = ts + } + + /** Gets a dead timestamp value from this annotation. */ + int getADeadTimestamp() { exists(this.getDeadTimestampExpr(result)) } + + /** Gets the source expression for dead timestamp value `ts`. */ + IntegerLiteral getDeadTimestampExpr(int ts) { + result = deadTimestampLiteral(this.getTimestampsExpr()) and + result.getValue() = ts + } + + /** Gets the raw timestamp expression (single element or tuple). */ + abstract Expr getTimestampsExpr(); + + /** Gets the test function this annotation belongs to. */ + abstract TestFunction getTestFunction(); + + /** Gets the annotated expression (the LHS of `@` or the first arg of `t(...)`). */ + abstract Expr getAnnotatedExpr(); + + /** Gets the enclosing annotation expression (the `BinaryExpr` or `Call`). */ + abstract Expr getTimerExpr(); + + /** Holds if timestamp `ts` is marked as dead in this annotation. */ + predicate isDeadTimestamp(int ts) { ts = this.getADeadTimestamp() } + + /** Holds if all timestamps in this annotation are dead (no live timestamps). */ + predicate isDead() { + not exists(this.getATimestamp()) and + not this.isNever() and + exists(this.getADeadTimestamp()) + } + + /** Holds if this is a never-evaluated annotation (contains `never`). */ + predicate isNever() { hasNever(this.getTimestampsExpr()) } + + string toString() { result = this.getAnnotatedExpr().toString() } + + Location getLocation() { result = this.getAnnotatedExpr().getLocation() } +} + +/** A matmul-based timer annotation: `expr @ t[...]`. */ +class MatmulTimerAnnotation extends TMatmulAnnotation, TimerAnnotation { + TestFunction func; + Expr annotated; + Expr timestamps; + + MatmulTimerAnnotation() { this = TMatmulAnnotation(func, annotated, timestamps) } + + override Expr getTimestampsExpr() { result = timestamps } + + override TestFunction getTestFunction() { result = func } + + override Expr getAnnotatedExpr() { result = annotated } + + override BinaryExpr getTimerExpr() { result.getLeft() = annotated } +} + +/** A call-based timer annotation: `t(expr, n)`. */ +class CallTimerAnnotation extends TCallAnnotation, TimerAnnotation { + TestFunction func; + Expr annotated; + Expr timestamps; + + CallTimerAnnotation() { this = TCallAnnotation(func, annotated, timestamps) } + + override Expr getTimestampsExpr() { result = timestamps } + + override TestFunction getTestFunction() { result = func } + + override Expr getAnnotatedExpr() { result = annotated } + + override Call getTimerExpr() { result.getArg(0) = annotated } +} + +/** + * Signature module defining the CFG interface needed by evaluation-order tests. + * This allows the test utilities to be instantiated with different CFG implementations. + */ +signature module EvalOrderCfgSig { + /** A control flow node. */ + class CfgNode { + /** Gets a textual representation of this node. */ + string toString(); + + /** Gets the location of this node. */ + Location getLocation(); + + /** Gets the AST node corresponding to this CFG node, if any. */ + AstNode getNode(); + + /** Gets a successor of this CFG node (including exceptional). */ + CfgNode getASuccessor(); + + /** Gets a true-branch successor of this CFG node, if any. */ + CfgNode getATrueSuccessor(); + + /** Gets a false-branch successor of this CFG node, if any. */ + CfgNode getAFalseSuccessor(); + + /** Gets an exceptional successor of this CFG node. */ + CfgNode getAnExceptionalSuccessor(); + + /** Gets the scope containing this CFG node. */ + Scope getScope(); + + /** Gets the basic block containing this CFG node. */ + BasicBlock getBasicBlock(); + } + + /** A basic block in the control flow graph. */ + class BasicBlock { + /** Gets the CFG node at position `n` in this basic block. */ + CfgNode getNode(int n); + + /** Holds if this basic block reaches `bb` (reflexive). */ + predicate reaches(BasicBlock bb); + + /** Holds if this basic block strictly reaches `bb` (non-reflexive). */ + predicate strictlyReaches(BasicBlock bb); + + /** Holds if this basic block strictly dominates `bb`. */ + predicate strictlyDominates(BasicBlock bb); + } + + /** Gets the entry CFG node for scope `s`. */ + CfgNode scopeGetEntryNode(Scope s); +} + +/** + * Parameterised module providing CFG-dependent utilities for evaluation-order tests. + * Instantiate with a specific CFG implementation to get `TimerCfgNode` and related predicates. + */ +module EvalOrderCfgUtils { + /** The CFG node type from the underlying implementation. */ + final class CfgNode = Input::CfgNode; + + /** The basic block type from the underlying implementation (named to avoid clash with `python::BasicBlock`). */ + final class CfgBasicBlock = Input::BasicBlock; + + /** Gets the entry CFG node for scope `s`. */ + CfgNode scopeGetEntryNode(Scope s) { result = Input::scopeGetEntryNode(s) } + + /** + * A CFG node corresponding to a timer annotation. + */ + class TimerCfgNode extends CfgNode { + private TimerAnnotation annot; + + TimerCfgNode() { annot.getAnnotatedExpr() = this.getNode() } + + /** Gets a timestamp value from this annotation. */ + int getATimestamp() { result = annot.getATimestamp() } + + /** Gets the source expression for timestamp value `ts`. */ + IntegerLiteral getTimestampExpr(int ts) { result = annot.getTimestampExpr(ts) } + + /** Gets the test function this annotation belongs to. */ + TestFunction getTestFunction() { result = annot.getTestFunction() } + + /** Holds if timestamp `ts` is marked as dead. */ + predicate isDeadTimestamp(int ts) { annot.isDeadTimestamp(ts) } + + /** Holds if all timestamps in this annotation are dead. */ + predicate isDead() { annot.isDead() } + + /** Holds if this is a never-evaluated annotation. */ + predicate isNever() { annot.isNever() } + } + + /** + * Holds if `next` is the next timer annotation reachable from `n` via + * CFG successors (both normal and exceptional), skipping non-annotated + * intermediaries within the same scope. + */ + predicate nextTimerAnnotation(CfgNode n, TimerCfgNode next) { + next = n.getASuccessor() and + next.getScope() = n.getScope() + or + exists(CfgNode mid | + mid = n.getASuccessor() and + not mid instanceof TimerCfgNode and + mid.getScope() = n.getScope() and + nextTimerAnnotation(mid, next) + ) + } + + /** + * Holds if `next` is the next timer annotation reachable from `n` via + * the true branch, skipping non-annotated intermediaries and after-value + * nodes for the same AST node. + */ + predicate nextTimerAnnotationFromTrue(CfgNode n, TimerCfgNode next) { + exists(CfgNode trueSucc | + trueSucc = n.getATrueSuccessor() and + trueSucc.getScope() = n.getScope() + | + // If the true successor is a different annotated node, use it + next = trueSucc and next.getNode() != n.getNode() + or + // Otherwise skip through it (it's an after-value node for the same expr) + nextTimerAnnotation(trueSucc, next) + ) + } + + /** + * Holds if `next` is the next timer annotation reachable from `n` via + * the false branch, skipping non-annotated intermediaries and after-value + * nodes for the same AST node. + */ + predicate nextTimerAnnotationFromFalse(CfgNode n, TimerCfgNode next) { + exists(CfgNode falseSucc | + falseSucc = n.getAFalseSuccessor() and + falseSucc.getScope() = n.getScope() + | + // If the false successor is a different annotated node, use it + next = falseSucc and next.getNode() != n.getNode() + or + // Otherwise skip through it (it's an after-value node for the same expr) + nextTimerAnnotation(falseSucc, next) + ) + } + + /** CFG-dependent test predicates, one per evaluation-order query. */ + module CfgTests { + /** + * Holds if live annotation `a` in function `f` is unreachable from + * the function entry in the CFG. + */ + predicate allLiveReachable(TimerCfgNode a, TestFunction f) { + not a.isDead() and + f = a.getTestFunction() and + a.getScope() = f and + not scopeGetEntryNode(f).getBasicBlock().reaches(a.getBasicBlock()) + } + + /** + * Holds if annotated node `a` is followed by unannotated `succ` in the + * same basic block. + */ + predicate basicBlockAnnotationGap(TimerCfgNode a, CfgNode succ) { + exists(CfgBasicBlock bb, int i | + a = bb.getNode(i) and + succ = bb.getNode(i + 1) + ) and + not succ instanceof TimerCfgNode and + not isUnannotatable(succ.getNode()) and + not isTimerMechanism(succ.getNode(), a.getTestFunction()) and + not exists(a.getAnExceptionalSuccessor()) and + succ.getNode() instanceof Expr + } + + /** + * Holds if annotations `a` and `b` appear in the same basic block with + * `a` before `b`, but `a`'s minimum timestamp is not less than `b`'s. + */ + predicate basicBlockOrdering(TimerCfgNode a, TimerCfgNode b, int minA, int minB) { + exists(CfgBasicBlock bb, int i, int j | a = bb.getNode(i) and b = bb.getNode(j) and i < j) and + minA = min(a.getATimestamp()) and + minB = min(b.getATimestamp()) and + minA >= minB + } + + /** + * Holds if function `f` has an annotation in a nested scope + * (generator, async function, comprehension, lambda). + */ + private predicate hasNestedScopeAnnotation(TestFunction f) { + exists(TimerAnnotation a | + a.getTestFunction() = f and + a.getAnnotatedExpr().getScope() != f + ) + } + + /** + * Holds if annotation `ann` with timestamp `a` has no consecutive + * successor (expected `a + 1`) in the CFG. + */ + predicate consecutiveTimestamps(TimerAnnotation ann, int a) { + not hasNestedScopeAnnotation(ann.getTestFunction()) and + not ann.isDead() and + a = ann.getATimestamp() and + not exists(TimerCfgNode x, TimerCfgNode y | + ann.getAnnotatedExpr() = x.getNode() and + nextTimerAnnotation(x, y) and + (a + 1) = y.getATimestamp() + ) and + // Exclude the maximum timestamp in the function (it has no successor) + not a = + max(TimerAnnotation other | + other.getTestFunction() = ann.getTestFunction() + | + other.getATimestamp() + ) + } + + /** + * Holds if the expression annotated with `t.never` is reachable from + * its scope's entry. + */ + predicate neverReachable(TimerAnnotation ann) { + ann.isNever() and + exists(CfgNode n, Scope s | + n.getNode() = ann.getAnnotatedExpr() and + s = n.getScope() and + ( + // Reachable via inter-block path (includes same block) + scopeGetEntryNode(s).getBasicBlock().reaches(n.getBasicBlock()) + or + // In same block as entry but at a later index + exists(CfgBasicBlock bb, int i, int j | + bb.getNode(i) = scopeGetEntryNode(s) and bb.getNode(j) = n and i < j + ) + ) + ) + } + + /** + * Holds if consecutive annotated nodes `a` -> `b` have backward time + * flow (`minA >= maxB`). + */ + predicate noBackwardFlow(TimerCfgNode a, TimerCfgNode b, int minA, int maxB) { + nextTimerAnnotation(a, b) and + not a.isDead() and + not b.isDead() and + minA = min(a.getATimestamp()) and + maxB = max(b.getATimestamp()) and + minA >= maxB + } + + /** + * Holds if annotations `a` and `b` share timestamp `ts` but `a` + * can reach `b` in the CFG. + */ + predicate noSharedReachable(TimerCfgNode a, TimerCfgNode b, int ts) { + a != b and + not a.isDead() and + not b.isDead() and + a.getTestFunction() = b.getTestFunction() and + ts = a.getATimestamp() and + ts = b.getATimestamp() and + ( + a.getBasicBlock().strictlyReaches(b.getBasicBlock()) + or + exists(CfgBasicBlock bb, int i, int j | a = bb.getNode(i) and b = bb.getNode(j) and i < j) + ) + } + + /** + * Holds if consecutive single-timestamp annotations `a` -> `b` on a + * forward edge have `maxA >= minB`. + */ + predicate strictForward(TimerCfgNode a, TimerCfgNode b, int maxA, int minB) { + nextTimerAnnotation(a, b) and + not a.isDead() and + not b.isDead() and + // Only apply to non-loop code (single timestamps on both sides) + strictcount(a.getATimestamp()) = 1 and + strictcount(b.getATimestamp()) = 1 and + // Forward edge: B does not strictly dominate A (excludes loop back-edges + // but still checks same-basic-block pairs) + not b.getBasicBlock().strictlyDominates(a.getBasicBlock()) and + maxA = max(a.getATimestamp()) and + minB = min(b.getATimestamp()) and + maxA >= minB + } + + /** + * Holds if CFG node `n` in test function `f` does not belong to any basic block. + */ + predicate noBasicBlock(CfgNode n, TestFunction f) { + n.getScope() = f and + not exists(n.getBasicBlock()) + } + + /** + * Holds if non-dead annotation `ann` has no corresponding CFG node. + */ + predicate annotationWithoutCfgNode(TimerAnnotation ann) { + not ann.isDead() and + not ann.isNever() and + not exists(CfgNode n | n.getNode() = ann.getAnnotatedExpr()) + } + + predicate annotationWithCfgNode(TimerAnnotation ann) { + exists(CfgNode n | n.getNode() = ann.getAnnotatedExpr()) + } + + /** + * Holds if annotation `ann` with timestamp `a` has no consecutive + * predecessor (expected `a - 1`) in the CFG. + */ + predicate consecutivePredecessorTimestamps(TimerAnnotation ann, int a) { + not hasNestedScopeAnnotation(ann.getTestFunction()) and + not ann.isDead() and + a = ann.getATimestamp() and + not exists(TimerCfgNode x, TimerCfgNode y | + ann.getAnnotatedExpr() = y.getNode() and + nextTimerAnnotation(x, y) and + (a - 1) = x.getATimestamp() + ) and + // Exclude the minimum timestamp in the function (it has no predecessor) + not a = + min(TimerAnnotation other | + other.getTestFunction() = ann.getTestFunction() and + not other.isDead() + | + other.getATimestamp() + ) + } + + /** + * Holds if `node` has both a true and false successor, but the true + * successor's timestamp `ts` is not marked as dead on the false + * successor (or vice versa). + * + * This checks that boolean branches are properly annotated: when a + * condition splits into true/false paths, the next annotated node + * on each side should account for the other side's timestamps as dead. + */ + predicate missingBranchTimestamp(TimerCfgNode node, int ts, string branch) { + not hasNestedScopeAnnotation(node.getTestFunction()) and + exists(TimerCfgNode trueNext, TimerCfgNode falseNext | + nextTimerAnnotationFromTrue(node, trueNext) and + nextTimerAnnotationFromFalse(node, falseNext) and + trueNext != falseNext + | + // True successor has live timestamp ts, but false successor + // doesn't have it as dead + ts = trueNext.getATimestamp() and + not falseNext.isDeadTimestamp(ts) and + not ts = falseNext.getATimestamp() and + branch = "false" + or + // False successor has live timestamp ts, but true successor + // doesn't have it as dead + ts = falseNext.getATimestamp() and + not trueNext.isDeadTimestamp(ts) and + not ts = trueNext.getATimestamp() and + branch = "true" + ) + } + } +} + +/** + * Holds if `e` is part of the timer mechanism: a top-level timer + * expression or a (transitive) sub-expression of one. + */ +predicate isTimerMechanism(Expr e, TestFunction f) { + exists(TimerAnnotation a | + a.getTestFunction() = f and + e = a.getTimerExpr().getASubExpression*() + ) +} + +/** + * Holds if expression `e` cannot be annotated due to Python syntax + * limitations (e.g., it is a definition target, a pattern, or part + * of a decorator application). + */ +predicate isUnannotatable(Expr e) { + // Function/class definitions + e instanceof FunctionExpr + or + e instanceof ClassExpr + or + // Docstrings are string literals used as expression statements + e instanceof StringLiteral and e.getParent() instanceof ExprStmt + or + // Function parameters are bound by the call, not evaluated in the body + e instanceof Parameter + or + // Name nodes that are definitions or deletions (assignment targets, def/class + // name bindings, augmented assignment targets, for-loop targets, del targets) + e.(Name).isDefinition() + or + e.(Name).isDeletion() + or + // Tuple/List/Starred nodes in assignment or for-loop targets are + // structural unpack patterns, not evaluations + (e instanceof Tuple or e instanceof List or e instanceof Starred) and + e = any(AssignStmt a).getATarget().getASubExpression*() + or + (e instanceof Tuple or e instanceof List or e instanceof Starred) and + e = any(For f).getTarget().getASubExpression*() + or + // The decorator call node wrapping a function/class definition, + // and its sub-expressions (the decorator name itself) + e = any(FunctionExpr func).getADecoratorCall().getASubExpression*() + or + e = any(ClassExpr cls).getADecoratorCall().getASubExpression*() + or + // Augmented assignment (x += e): the implicit BinaryExpr for the operation + e = any(AugAssign aug).getOperation() + or + // with-statement `as` variables are bindings + (e instanceof Name or e instanceof Tuple or e instanceof List) and + e = any(With w).getOptionalVars().getASubExpression*() + or + // except-clause exception type and `as` variable are part of except syntax + exists(ExceptStmt ex | e = ex.getType() or e = ex.getName()) + or + // match/case pattern expressions are part of pattern syntax + e.getParent+() instanceof Pattern + or + // Subscript/Attribute nodes on the LHS of an assignment are store + // operations, not value expressions (including nested ones like d["a"][1]) + (e instanceof Subscript or e instanceof Attribute) and + e = any(AssignStmt a).getATarget().getASubExpression*() + or + // Match/case guard nodes are part of case syntax + e instanceof Guard + or + // Yield/YieldFrom in statement position — the return value is + // discarded and cannot be meaningfully annotated + (e instanceof Yield or e instanceof YieldFrom) and + e.getParent() instanceof ExprStmt + or + // Synthetic nodes inside desugared comprehensions + e.getScope() = any(Comp c).getFunction() and + ( + e.(Name).getId() = ".0" + or + e instanceof Tuple and e.getParent() instanceof Yield + ) +} diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_assert_raise.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_assert_raise.py new file mode 100644 index 000000000000..692a9c6e407c --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_assert_raise.py @@ -0,0 +1,56 @@ +"""Assert and raise statement evaluation order.""" + +from timer import test, dead + + +@test +def test_assert_true(t): + x = True @ t[0] + assert x @ t[1] + y = 1 @ t[2] + + +@test +def test_assert_true_with_message(t): + x = True @ t[0] + assert x @ t[1], "msg" @ t[dead(2)] + y = 1 @ t[2] + + +@test +def test_assert_false_caught(t): + try: + x = False @ t[0] + assert x @ t[1], "fail" @ t[2] + except AssertionError: + y = 1 @ t[3] + + +@test +def test_raise_caught(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])("test" @ t[2]) @ t[3]) + except ValueError: + y = 2 @ t[4] + + +@test +def test_raise_from_caught(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])("test" @ t[2]) @ t[3]) from ((RuntimeError @ t[4])("cause" @ t[5]) @ t[6]) + except ValueError: + y = 2 @ t[7] + + +@test +def test_bare_reraise(t): + try: + try: + raise ((ValueError @ t[0])("test" @ t[1]) @ t[2]) + except ValueError: + x = 1 @ t[3] + raise + except ValueError: + y = 2 @ t[4] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_async.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_async.py new file mode 100644 index 000000000000..0c9b08e3e9eb --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_async.py @@ -0,0 +1,97 @@ +"""Async/await evaluation order tests. + +Coroutine bodies are lazy — like generators, the body runs only when +awaited (or driven by the event loop). asyncio.run() drives the +coroutine to completion synchronously from the caller's perspective. +""" + +import asyncio +from contextlib import asynccontextmanager +from timer import test + + +@test +def test_simple_async(t): + """Simple async function: body runs inside asyncio.run().""" + async def coro(): + x = 1 @ t[4] + return x @ t[5] + + result = ((asyncio @ t[0]).run @ t[1])((coro @ t[2])() @ t[3]) @ t[6] + + +@test +def test_await_expression(t): + """await suspends the caller until the inner coroutine completes.""" + async def helper(): + return 1 @ t[4] + + async def main(): + x = await helper() @ t[5] + return x @ t[6] + + result = ((asyncio @ t[0]).run @ t[1])((main @ t[2])() @ t[3]) @ t[7] + + +@test +def test_async_for(t): + """async for iterates an async generator.""" + async def agen(): + yield 1 @ t[5] + yield 2 @ t[7] + + async def main(): + async for val in agen() @ t[4]: + val @ t[6, 8] + + ((asyncio @ t[0]).run @ t[1])((main @ t[2])() @ t[3]) @ t[9] + + +@test +def test_async_with(t): + """async with enters/exits an async context manager.""" + @asynccontextmanager + async def ctx(): + yield 1 @ t[5] + + async def main(): + async with ctx() @ t[4] as val: + val @ t[6] + + ((asyncio @ t[0]).run @ t[1])((main @ t[2])() @ t[3]) @ t[7] + + +@test +def test_multiple_awaits(t): + """Sequential awaits in one coroutine.""" + async def task_a(): + return 10 @ t[4] + + async def task_b(): + return 20 @ t[6] + + async def main(): + a = await task_a() @ t[5] + b = await task_b() @ t[7] + return (a @ t[8] + b @ t[9]) @ t[10] + + result = ((asyncio @ t[0]).run @ t[1])((main @ t[2])() @ t[3]) @ t[11] + + +@test +def test_gather(t): + """asyncio.gather schedules coroutines as concurrent tasks.""" + async def task_a(): + return 1 @ t[6] + + async def task_b(): + return 2 @ t[7] + + async def main(): + results = await asyncio.gather( + task_a() @ t[4], + task_b() @ t[5], + ) @ t[8] + return results @ t[9] + + result = ((asyncio @ t[0]).run @ t[1])((main @ t[2])() @ t[3]) @ t[10] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_augassign.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_augassign.py new file mode 100644 index 000000000000..2f1d5eb5c3e6 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_augassign.py @@ -0,0 +1,53 @@ +"""Augmented assignment evaluation order.""" + +from timer import test + + +@test +def test_plus_equals(t): + x = 1 @ t[0] + x += 2 @ t[1] + y = x @ t[2] + + +@test +def test_sub_mul_div(t): + x = 20 @ t[0] + x -= 5 @ t[1] + x *= 2 @ t[2] + x /= 6 @ t[3] + x = 17 @ t[4] + x //= 3 @ t[5] + x %= 3 @ t[6] + y = x @ t[7] + + +@test +def test_power_equals(t): + x = 2 @ t[0] + x **= 3 @ t[1] + y = x @ t[2] + + +@test +def test_bitwise_equals(t): + x = 0b1111 @ t[0] + x &= 0b1010 @ t[1] + x |= 0b0101 @ t[2] + x ^= 0b0011 @ t[3] + y = x @ t[4] + + +@test +def test_shift_equals(t): + x = 1 @ t[0] + x <<= 4 @ t[1] + x >>= 2 @ t[2] + y = x @ t[3] + + +@test +def test_list_extend(t): + x = [1 @ t[0], 2 @ t[1]] @ t[2] + x += [3 @ t[3], 4 @ t[4]] @ t[5] + y = x @ t[6] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_basic.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_basic.py new file mode 100644 index 000000000000..efea733b0d97 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_basic.py @@ -0,0 +1,223 @@ +"""Basic expression evaluation order. + +These tests verify that sub-expressions within a single expression +are evaluated in the expected order (typically left to right for +operands of binary operators, elements of collection literals, etc.) + +Every evaluated expression has a timestamp annotation, except the +timer mechanism itself (t[n], t[dead(n)], t[never]). +""" + +from timer import test, never + + +@test +def test_sequential_statements(t): + """Statements execute top to bottom.""" + x = 1 @ t[0] + y = 2 @ t[1] + z = 3 @ t[2] + + +@test +def test_binary_add(t): + """In a + b, left operand evaluates before right.""" + x = (1 @ t[0] + 2 @ t[1]) @ t[2] + + +@test +def test_binary_subtract(t): + """In a - b, left operand evaluates before right.""" + x = (10 @ t[0] - 3 @ t[1]) @ t[2] + + +@test +def test_binary_multiply(t): + """In a * b, left operand evaluates before right.""" + x = ((3 @ t[0]) * (4 @ t[1])) @ t[2] + + +@test +def test_nested_binary(t): + """Sub-expressions evaluate before their containing expression.""" + x = ((1 @ t[0] + 2 @ t[1]) @ t[2] + (3 @ t[3] + 4 @ t[4]) @ t[5]) @ t[6] + + +@test +def test_chained_add(t): + """a + b + c is (a + b) + c: left to right.""" + x = (1 @ t[0] + 2 @ t[1] + 3 @ t[2]) @ t[3] + + +@test +def test_mixed_precedence(t): + """In a + b * c, all operands still evaluate left to right.""" + x = (1 @ t[0] + ((2 @ t[1]) * (3 @ t[2])) @ t[3]) @ t[4] + + +@test +def test_string_concat(t): + """String concatenation operands: left to right.""" + x = ("hello" @ t[0] + " " @ t[1] + "world" @ t[2]) @ t[3] + + +@test +def test_comparison(t): + """In a < b, left operand evaluates before right.""" + x = (1 @ t[0] < 2 @ t[1]) @ t[2] + + +@test +def test_chained_comparison(t): + """Chained a < b < c: all evaluated left to right (b only once).""" + x = (1 @ t[0] < 2 @ t[1] < 3 @ t[2]) @ t[3] + + +@test +def test_list_elements(t): + """List elements evaluate left to right.""" + x = [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3] + + +@test +def test_dict_entries(t): + """Dict: key before value, entries left to right.""" + d = {1 @ t[0]: "a" @ t[1], 2 @ t[2]: "b" @ t[3]} @ t[4] + + +@test +def test_tuple_elements(t): + """Tuple elements evaluate left to right.""" + x = (1 @ t[0], 2 @ t[1], 3 @ t[2]) @ t[3] + + +@test +def test_set_elements(t): + """Set elements evaluate left to right.""" + x = {1 @ t[0], 2 @ t[1], 3 @ t[2]} @ t[3] + + +@test +def test_subscript(t): + """In obj[idx], object evaluates before index.""" + x = ([10 @ t[0], 20 @ t[1], 30 @ t[2]] @ t[3])[1 @ t[4]] @ t[5] + + +@test +def test_slice(t): + """Slice parameters: object, then start, then stop.""" + x = ([1 @ t[0], 2 @ t[1], 3 @ t[2], 4 @ t[3], 5 @ t[4]] @ t[5])[1 @ t[6]:3 @ t[7]] @ t[8] + + +@test +def test_method_call(t): + """Object evaluated, then attribute lookup, then arguments left to right, then call.""" + x = (("hello world" @ t[0]).replace @ t[1])("world" @ t[2], "there" @ t[3]) @ t[4] + + +@test +def test_method_chaining(t): + """Chained method calls: left to right.""" + x = ((((" hello " @ t[0]).strip @ t[1])() @ t[2]).upper @ t[3])() @ t[4] + + +@test +def test_unary_not(t): + """Unary not: operand evaluated first.""" + x = (not True @ t[0]) @ t[1] + + +@test +def test_unary_neg(t): + """Unary negation: operand evaluated first.""" + x = (-(3 @ t[0])) @ t[1] + + +@test +def test_multiple_assignment(t): + """RHS evaluated once in x = y = expr.""" + x = y = (1 @ t[0] + 2 @ t[1]) @ t[2] + + +@test +def test_callable_syntax(t): + """t(value, n) is equivalent to value @ t[n].""" + x = t(t(1, 0) + t(2, 1), 2) + y = t(t(x, 3) * t(3, 4), 5) + + +@test +def test_subscript_assign(t): + """In obj[idx] = val, value is evaluated before target sub-expressions.""" + lst = [0 @ t[0], 0 @ t[1], 0 @ t[2]] @ t[3] + (lst @ t[5])[1 @ t[6]] = 42 @ t[4] + x = lst @ t[7] + + +@test +def test_attribute_assign(t): + """In obj.attr = val, value is evaluated before the object.""" + class Obj: + pass + o = (Obj @ t[0])() @ t[1] + (o @ t[3]).x = 42 @ t[2] + y = (o @ t[4]).x @ t[5] + + +@test +def test_nested_subscript_assign(t): + """Nested subscript assignment: val, then outer obj, then keys.""" + d = {"a" @ t[0]: [0 @ t[1], 0 @ t[2]] @ t[3]} @ t[4] + (d @ t[6])["a" @ t[7]][1 @ t[8]] = 99 @ t[5] + x = d @ t[9] + + +@test +def test_unreachable_after_return(t): + """Code after return has no CFG node.""" + def f(): + x = 1 @ t[1] + return x @ t[2] + y = 2 @ t[never] + result = (f @ t[0])() @ t[3] + + +@test +def test_none_literal(t): + """None is a name constant.""" + x = None @ t[0] + y = (x @ t[1] is None @ t[2]) @ t[3] + + +@test +def test_delete(t): + """del statement removes a variable binding.""" + x = 1 @ t[0] + del x + y = 2 @ t[1] + + +@test +def test_global(t): + """global statement allows writing to module-level variable.""" + global _test_global_var + _test_global_var = 1 @ t[0] + x = _test_global_var @ t[1] + + +@test +def test_nonlocal(t): + """nonlocal statement allows inner function to rebind outer variable.""" + x = 0 @ t[0] + def inner(): + nonlocal x + x = 1 @ t[2] + (inner @ t[1])() @ t[3] + y = x @ t[4] + + +@test +def test_walrus(t): + """Walrus operator := evaluates the RHS and binds it.""" + if (y := 1 @ t[0]) @ t[1]: + z = y @ t[2] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_boolean.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_boolean.py new file mode 100644 index 000000000000..a12975634f49 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_boolean.py @@ -0,0 +1,76 @@ +"""Short-circuit boolean operators and evaluation order.""" + +from timer import test, dead + + +@test +def test_and_both_sides(t): + # True and X — both operands evaluated, result is X + x = (True @ t[0] and 42 @ t[1, dead(2)]) @ t[dead(1), 2] + + +@test +def test_and_short_circuit(t): + # False and ... — right side never evaluated + x = (False @ t[0] and True @ t[dead(1)]) @ t[1, dead(2)] + + +@test +def test_or_short_circuit(t): + # True or ... — right side never evaluated + x = (True @ t[0] or False @ t[dead(1)]) @ t[1, dead(2)] + + +@test +def test_or_both_sides(t): + # False or X — both operands evaluated, result is X + x = (False @ t[0] or 42 @ t[1]) @ t[dead(1), 2] + + +@test +def test_not(t): + # not evaluates its operand, then negates + x = (not True @ t[0]) @ t[1] + y = (not False @ t[2]) @ t[3] + + +@test +def test_chained_and(t): + # 1 and 2 and 3 — all truthy, all evaluated left-to-right + x = (1 @ t[0] and 2 @ t[1, dead(3)] and 3 @ t[2, dead(3)]) @ t[dead(1), dead(2), 3] + + +@test +def test_chained_or(t): + # 0 or "" or 42 — first two falsy, all evaluated until truthy found + x = (0 @ t[0] or "" @ t[1, dead(3)] or 42 @ t[2, dead(3)]) @ t[dead(1), dead(2), 3] + + +@test +def test_mixed_and_or(t): + # True and False or 42 => (True and False) or 42 => False or 42 => 42 + x = ((True @ t[0] and False @ t[1, dead(2)]) @ t[dead(1), 2, dead(4)] or 42 @ t[3, dead(4)]) @ t[dead(2), dead(3), 4] + + +@test +def test_and_side_effects(t): + # Both functions called when left side is truthy + def f(): + return 10 @ t[1] + + def g(): + return 20 @ t[4] + + x = ((f @ t[0])() @ t[2] and (g @ t[3])() @ t[5]) @ t[6] + + +@test +def test_or_side_effects(t): + # Both functions called when left side is falsy + def f(): + return 0 @ t[1] + + def g(): + return 20 @ t[4] + + x = ((f @ t[0])() @ t[2] or (g @ t[3])() @ t[5]) @ t[6] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_classes.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_classes.py new file mode 100644 index 000000000000..92313b5073c3 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_classes.py @@ -0,0 +1,74 @@ +"""Class definitions — evaluation order.""" + +from timer import test + + +@test +def test_simple_class(t): + """Simple class definition and instantiation.""" + class Foo: + pass + obj = (Foo @ t[0])() @ t[1] + + +@test +def test_class_with_bases(t): + """Base class expressions evaluated at class definition time.""" + class Base: + pass + class Derived(Base @ t[0]): + pass + obj = (Derived @ t[1])() @ t[2] + + +@test +def test_class_with_methods(t): + """Object evaluated before method is called.""" + class Foo: + def greet(self, name): + return ("hello " @ t[5] + name @ t[6]) @ t[7] + obj = (Foo @ t[0])() @ t[1] + msg = ((obj @ t[2]).greet @ t[3])("world" @ t[4]) @ t[8] + + +@test +def test_class_instantiation(t): + """Arguments to __init__ evaluate before instantiation completes.""" + class Foo: + def __init__(self, x): + (self @ t[3]).x = x @ t[2] + obj = (Foo @ t[0])(42 @ t[1]) @ t[4] + val = (obj @ t[5]).x @ t[6] + + +@test +def test_method_call(t): + """Method arguments evaluate left-to-right before the call.""" + class Calculator: + def __init__(self, value): + (self @ t[3]).value = value @ t[2] + def add(self, x): + return ((self @ t[8]).value @ t[9] + x @ t[10]) @ t[11] + calc = (Calculator @ t[0])(10 @ t[1]) @ t[4] + result = ((calc @ t[5]).add @ t[6])(5 @ t[7]) @ t[12] + + +@test +def test_class_level_attribute(t): + """Multiple attribute accesses in a single expression.""" + class Config: + debug = True @ t[0] + version = 1 @ t[1] + x = ((Config @ t[2]).debug @ t[3], (Config @ t[4]).version @ t[5]) @ t[6] + + +@test +def test_class_decorator(t): + """Decorator expression evaluated, class defined, then decorator called.""" + def add_marker(cls): + (cls @ t[2]).marked = True @ t[1] + return cls @ t[3] + @(add_marker @ t[0]) + class Foo: + pass + result = (Foo @ t[4]).marked @ t[5] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_comprehensions.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_comprehensions.py new file mode 100644 index 000000000000..8ce8ca6e4c46 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_comprehensions.py @@ -0,0 +1,46 @@ +"""Evaluation order tests for comprehensions and generator expressions.""" + +from timer import test + + +@test +def test_list_comprehension(t): + items = [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3] + result = [x @ t[5, 6, 7] for x in items @ t[4]] @ t[8] + + +@test +def test_filtered_comprehension(t): + items = [1 @ t[0], 2 @ t[1], 3 @ t[2], 4 @ t[3]] @ t[4] + result = [x @ t[14, 23] for x in items @ t[5] if (x @ t[6, 10, 15, 19] % 2 @ t[7, 11, 16, 20] == 0 @ t[8, 12, 17, 21]) @ t[9, 13, 18, 22]] @ t[24] + + +@test +def test_dict_comprehension(t): + items = [("a" @ t[0], 1 @ t[1]) @ t[2], ("b" @ t[3], 2 @ t[4]) @ t[5]] @ t[6] + result = {k @ t[8, 10]: v @ t[9, 11] for k, v in items @ t[7]} @ t[12] + + +@test +def test_set_comprehension(t): + items = [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3] + result = {x @ t[5, 6, 7] for x in items @ t[4]} @ t[8] + + +@test +def test_generator_expression(t): + items = [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3] + gen = (x @ t[8, 9, 10] for x in items @ t[4]) @ t[5] + result = (list @ t[6])(gen @ t[7]) @ t[11] + + +@test +def test_nested_comprehension(t): + matrix = [[1 @ t[0], 2 @ t[1]] @ t[2], [3 @ t[3], 4 @ t[4]] @ t[5]] @ t[6] + result = [x @ t[9, 10, 12, 13] for row in matrix @ t[7] for x in row @ t[8, 11]] @ t[14] + + +@test +def test_comprehension_with_call(t): + items = [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3] + result = [(str @ t[5, 8, 11])(x @ t[6, 9, 12]) @ t[7, 10, 13] for x in items @ t[4]] @ t[14] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_conditional.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_conditional.py new file mode 100644 index 000000000000..48d45a779583 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_conditional.py @@ -0,0 +1,44 @@ +"""Ternary conditional expressions and evaluation order.""" + +from timer import test, dead + + +@test +def test_ternary_true(t): + # Condition is True — consequent evaluated, alternative skipped + x = (1 @ t[1] if True @ t[0] else 2 @ t[dead(1)]) @ t[2] + + +@test +def test_ternary_false(t): + # Condition is False — alternative evaluated, consequent skipped + x = (1 @ t[dead(1)] if False @ t[0] else 2 @ t[1]) @ t[2] + + +@test +def test_ternary_nested(t): + # Nested: outer condition True, inner condition True + # ((10 if C1 else 20) if C2 else 30) — C2 first, then C1, then 10 + x = ((10 @ t[2] if True @ t[1] else 20 @ t[dead(2)]) @ t[3] if True @ t[0] else 30 @ t[dead(1)]) @ t[4] + + +@test +def test_ternary_assignment(t): + # Ternary result assigned, then used in later expression + value = (100 @ t[1] if True @ t[0] else 200 @ t[dead(1)]) @ t[2] + result = (value @ t[3] + 1 @ t[4]) @ t[5] + + +@test +def test_ternary_complex_expressions(t): + # Complex sub-expressions in condition and consequent + x = ((1 @ t[3] + 2 @ t[4]) @ t[5] if (3 @ t[0] > 2 @ t[1]) @ t[2] else (4 @ t[dead(3)] + 5 @ t[dead(4)]) @ t[dead(5)]) @ t[6] + + +@test +def test_ternary_as_argument(t): + # Ternary used as a function argument + def f(a): + return a @ t[4] + + result = (f @ t[0])((1 @ t[2] if True @ t[1] else 2 @ t[dead(2)]) @ t[3]) @ t[5] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_fstring.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_fstring.py new file mode 100644 index 000000000000..2dd36f6ef36a --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_fstring.py @@ -0,0 +1,34 @@ +"""F-string evaluation order.""" + +from timer import test + + +@test +def test_simple_fstring(t): + name = "world" @ t[0] + s = f"hello {name @ t[1]}" @ t[2] + + +@test +def test_multi_expr_fstring(t): + a = "hello" @ t[0] + b = "world" @ t[1] + s = f"{a @ t[2]} {b @ t[3]}" @ t[4] + + +@test +def test_nested_fstring(t): + inner = "world" @ t[0] + s = f"hello {f'dear {inner @ t[1]}' @ t[2]}" @ t[3] + + +@test +def test_format_spec(t): + x = 3.14159 @ t[0] + s = f"{x @ t[1]:.2f}" @ t[2] + + +@test +def test_method_in_fstring(t): + name = "world" @ t[0] + s = f"hello {((name @ t[1]).upper @ t[2])() @ t[3]}" @ t[4] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_functions.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_functions.py new file mode 100644 index 000000000000..e19b944c4cef --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_functions.py @@ -0,0 +1,85 @@ +"""Function calls and definitions — evaluation order.""" + +from timer import test + + +@test +def test_argument_order(t): + """Arguments evaluate left-to-right before the call.""" + def add(a, b): + return (a @ t[3] + b @ t[4]) @ t[5] + result = (add @ t[0])(1 @ t[1], 2 @ t[2]) @ t[6] + + +@test +def test_multiple_arguments(t): + """All arguments left-to-right, then the call.""" + def f(a, b, c): + return ((a @ t[4] + b @ t[5]) @ t[6] + c @ t[7]) @ t[8] + result = (f @ t[0])(1 @ t[1], 2 @ t[2], 3 @ t[3]) @ t[9] + + +@test +def test_default_arguments(t): + """Default expressions are evaluated at definition time.""" + val = 5 @ t[0] + def f(a, b=val @ t[1]): + return (a @ t[4] + b @ t[5]) @ t[6] + result = (f @ t[2])(10 @ t[3]) @ t[7] + + +@test +def test_args_kwargs(t): + """*args and **kwargs — expressions evaluated before the call.""" + def f(*args, **kwargs): + return ((sum @ t[9])(args @ t[10]) @ t[11] + (sum @ t[12])(((kwargs @ t[13]).values @ t[14])() @ t[15]) @ t[16]) @ t[17] + args = [1 @ t[0], 2 @ t[1]] @ t[2] + kwargs = {"c" @ t[3]: 3 @ t[4]} @ t[5] + result = (f @ t[6])(*args @ t[7], **kwargs @ t[8]) @ t[18] + + +@test +def test_nested_calls(t): + """Inner call completes before becoming an argument to outer call.""" + def f(x): + return (x @ t[7] + 1 @ t[8]) @ t[9] + def g(x): + return (x @ t[3] * 2 @ t[4]) @ t[5] + result = (f @ t[0])((g @ t[1])(1 @ t[2]) @ t[6]) @ t[10] + + +@test +def test_function_as_argument(t): + """Function object is just another argument, evaluated left-to-right.""" + def apply(fn, x): + return (fn @ t[3])(x @ t[4]) @ t[8] + def double(x): + return (x @ t[5] * 2 @ t[6]) @ t[7] + result = (apply @ t[0])(double @ t[1], 5 @ t[2]) @ t[9] + + +@test +def test_decorator(t): + """Decorator: expression evaluated, function defined, decorator called.""" + def my_decorator(fn): + return fn @ t[1] + @(my_decorator @ t[0]) + def f(): + return 42 @ t[3] + result = (f @ t[2])() @ t[4] + + +@test +def test_keyword_arguments(t): + """Keyword argument values evaluate left-to-right.""" + def f(a, b): + return (a @ t[3] + b @ t[4]) @ t[5] + result = (f @ t[0])(a=1 @ t[1], b=2 @ t[2]) @ t[6] + + +@test +def test_return_value(t): + """The return value is just the result of the call expression.""" + def f(x): + return (x @ t[2] * 2 @ t[3]) @ t[4] + result = (f @ t[0])(3 @ t[1]) @ t[5] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_if.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_if.py new file mode 100644 index 000000000000..8880aaaef348 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_if.py @@ -0,0 +1,108 @@ +"""If/elif/else control flow evaluation order.""" + +from timer import test, dead + + +@test +def test_if_true(t): + x = True @ t[0] + if x @ t[1]: + y = 1 @ t[2] + z = 0 @ t[3] + + +@test +def test_if_false(t): + x = False @ t[0] + if x @ t[1]: + y = 1 @ t[dead(2)] + z = 0 @ t[2] + + +@test +def test_if_else_true(t): + x = True @ t[0] + if x @ t[1]: + y = 1 @ t[2] + else: + y = 2 @ t[dead(2)] + z = 0 @ t[3] + + +@test +def test_if_else_false(t): + x = False @ t[0] + if x @ t[1]: + y = 1 @ t[dead(2)] + else: + y = 2 @ t[2] + z = 0 @ t[3] + + +@test +def test_if_elif_else_first(t): + x = 1 @ t[0] + if (x @ t[1] == 1 @ t[2]) @ t[3]: + y = "first" @ t[4] + elif (x @ t[dead(4)] == 2 @ t[dead(5)]) @ t[dead(6)]: + y = "second" @ t[dead(4)] + else: + y = "third" @ t[dead(4)] + z = 0 @ t[5] + + +@test +def test_if_elif_else_second(t): + x = 2 @ t[0] + if (x @ t[1] == 1 @ t[2]) @ t[3]: + y = "first" @ t[dead(7)] + elif (x @ t[4] == 2 @ t[5]) @ t[6]: + y = "second" @ t[7] + else: + y = "third" @ t[dead(7)] + z = 0 @ t[8] + + +@test +def test_if_elif_else_third(t): + x = 3 @ t[0] + if (x @ t[1] == 1 @ t[2]) @ t[3]: + y = "first" @ t[dead(7)] + elif (x @ t[4] == 2 @ t[5]) @ t[6]: + y = "second" @ t[dead(7)] + else: + y = "third" @ t[7] + z = 0 @ t[8] + + +@test +def test_nested_if_else(t): + x = True @ t[0] + y = True @ t[1] + if x @ t[2]: + if y @ t[3]: + z = 1 @ t[4] + else: + z = 2 @ t[dead(4)] + else: + z = 3 @ t[dead(4)] + w = 0 @ t[5] + + +@test +def test_if_compound_condition(t): + x = True @ t[0] + y = False @ t[1] + if (x @ t[2] and y @ t[3]) @ t[4]: + z = 1 @ t[dead(5)] + else: + z = 2 @ t[5] + w = 0 @ t[6] + + +@test +def test_if_pass(t): + x = True @ t[0] + if x @ t[1]: + pass + z = 0 @ t[2] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_lambda.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_lambda.py new file mode 100644 index 000000000000..c60cbb5b3172 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_lambda.py @@ -0,0 +1,46 @@ +"""Lambda expressions — evaluation order.""" + +from timer import test + + +@test +def test_simple_lambda(t): + """Lambda creates a function object in one step.""" + f = (lambda x: (x @ t[3] + 1 @ t[4]) @ t[5]) @ t[0] + result = (f @ t[1])(10 @ t[2]) @ t[6] + + +@test +def test_lambda_multiple_args(t): + """Lambda call: arguments evaluate left to right.""" + f = (lambda a, b, c: ((a @ t[5] + b @ t[6]) @ t[7] + c @ t[8]) @ t[9]) @ t[0] + result = (f @ t[1])(1 @ t[2], 2 @ t[3], 3 @ t[4]) @ t[10] + + +@test +def test_lambda_default(t): + """Default argument evaluated at lambda creation time.""" + val = 5 @ t[0] + f = (lambda x, y=val @ t[1]: (x @ t[5] + y @ t[6]) @ t[7]) @ t[2] + result = (f @ t[3])(10 @ t[4]) @ t[8] + + +@test +def test_lambda_map(t): + """Lambda body runs once per element when consumed by list(map(...)).""" + f = (lambda x: (x @ t[9, 12, 15] * 2 @ t[10, 13, 16]) @ t[11, 14, 17]) @ t[0] + result = (list @ t[1])((map @ t[2])(f @ t[3], [1 @ t[4], 2 @ t[5], 3 @ t[6]] @ t[7]) @ t[8]) @ t[18] + + +@test +def test_immediately_invoked(t): + """Arguments evaluated, then immediately-invoked lambda called.""" + result = ((lambda x: (x @ t[2] + 1 @ t[3]) @ t[4]) @ t[0])(10 @ t[1]) @ t[5] + + +@test +def test_lambda_closure(t): + """Lambda captures enclosing scope; body runs at call time.""" + x = 10 @ t[0] + f = (lambda: x @ t[3]) @ t[1] + result = (f @ t[2])() @ t[4] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_loops.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_loops.py new file mode 100644 index 000000000000..17df7a4703a3 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_loops.py @@ -0,0 +1,146 @@ +"""Loop control flow evaluation order tests.""" + +from timer import test, dead + + +# 1. Simple while loop (fixed iterations) +@test +def test_while_loop(t): + i = 0 @ t[0] + while (i @ t[1, 7, 13, 19] < 3 @ t[2, 8, 14, 20]) @ t[3, 9, 15, 21]: # 4 checks: 3 true + 1 false + i = (i @ t[4, 10, 16] + 1 @ t[5, 11, 17]) @ t[6, 12, 18] + done = True @ t[22] + + +# 2. While loop with break +@test +def test_while_break(t): + i = 0 @ t[0] + while (i @ t[1, 10, 19] < 5 @ t[2, 11, 20]) @ t[3, 12, 21]: + if (i @ t[4, 13, 22] == 2 @ t[5, 14, 23]) @ t[6, 15, 24]: + break + i = (i @ t[7, 16] + 1 @ t[8, 17]) @ t[9, 18] + done = True @ t[25] + + +# 3. While loop with continue +@test +def test_while_continue(t): + i = 0 @ t[0] + total = 0 @ t[1] + while (i @ t[2, 14, 23, 35] < 3 @ t[3, 15, 24, 36]) @ t[4, 16, 25, 37]: + i = (i @ t[5, 17, 26] + 1 @ t[6, 18, 27]) @ t[7, 19, 28] + if (i @ t[8, 20, 29] == 2 @ t[9, 21, 30]) @ t[10, 22, 31]: + continue + total = (total @ t[11, 32] + i @ t[12, 33]) @ t[13, 34] + done = True @ t[38] + + +# 4. While/else (no break — else executes) +@test +def test_while_else(t): + i = 0 @ t[0] + while (i @ t[1, 7, 13] < 2 @ t[2, 8, 14]) @ t[3, 9, 15]: + i = (i @ t[4, 10] + 1 @ t[5, 11]) @ t[6, 12] + else: + done = True @ t[16] + + +# 5. While/else (with break — else skipped) +@test +def test_while_else_break(t): + i = 0 @ t[0] + while (i @ t[1, 10] < 5 @ t[2, 11]) @ t[3, 12]: + if (i @ t[4, 13] == 1 @ t[5, 14]) @ t[6, 15]: + break + i = (i @ t[7] + 1 @ t[8]) @ t[9] + else: + never = True @ t[dead(16)] + after = True @ t[16] + + +# 6. Simple for loop over a list +@test +def test_for_list(t): + for x in [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3]: + x @ t[4, 5, 6] + done = True @ t[7] + + +# 7. For loop with range +@test +def test_for_range(t): + for i in (range @ t[0])(3 @ t[1]) @ t[2]: + i @ t[3, 4, 5] + done = True @ t[6] + + +# 8. For loop with break +@test +def test_for_break(t): + for x in [1 @ t[0], 2 @ t[1], 3 @ t[2], 4 @ t[3]] @ t[4]: + if (x @ t[5, 9, 13] == 3 @ t[6, 10, 14]) @ t[7, 11, 15]: + break + x @ t[8, 12] + done = True @ t[16] + + +# 9. For loop with continue +@test +def test_for_continue(t): + total = 0 @ t[0] + for x in [1 @ t[1], 2 @ t[2], 3 @ t[3]] @ t[4]: + if (x @ t[5, 11, 14] == 2 @ t[6, 12, 15]) @ t[7, 13, 16]: + continue + total = (total @ t[8, 17] + x @ t[9, 18]) @ t[10, 19] + done = True @ t[20] + + +# 10. For/else (no break — else executes) +@test +def test_for_else(t): + for x in [1 @ t[0], 2 @ t[1]] @ t[2]: + x @ t[3, 4] + else: + done = True @ t[5] + + +# 11. For/else (with break — else skipped) +@test +def test_for_else_break(t): + for x in [1 @ t[0], 2 @ t[1], 3 @ t[2]] @ t[3]: + if (x @ t[4, 8] == 2 @ t[5, 9]) @ t[6, 10]: + break + x @ t[7] + else: + never = True @ t[dead(11)] + after = True @ t[11] + + +# 12. Nested loops +@test +def test_nested_loops(t): + for i in [1 @ t[0], 2 @ t[1]] @ t[2]: + for j in [10 @ t[3, 12], 20 @ t[4, 13]] @ t[5, 14]: + (i @ t[6, 9, 15, 18, dead(21)] + j @ t[7, 10, 16, 19]) @ t[8, 11, 17, 20] + done = True @ t[dead(3), dead(6), dead(9), dead(12), dead(15), dead(18), 21] + + +# 13. While True with conditional break +@test +def test_while_true_break(t): + i = 0 @ t[0] + while True @ t[1, 8, 15]: + i = (i @ t[2, 9, 16] + 1 @ t[3, 10, 17]) @ t[4, 11, 18] + if (i @ t[5, 12, 19] == 3 @ t[6, 13, 20]) @ t[7, 14, 21]: + break + done = True @ t[22] + + +# 14. For with enumerate +@test +def test_for_enumerate(t): + for idx, val in (enumerate @ t[0])(["a" @ t[1], "b" @ t[2], "c" @ t[3]] @ t[4]) @ t[5]: + idx @ t[6, 8, 10] + val @ t[7, 9, 11] + done = True @ t[12] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_match.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_match.py new file mode 100644 index 000000000000..ba15a2d7c857 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_match.py @@ -0,0 +1,173 @@ +"""Evaluation order for match/case (structural pattern matching, Python 3.10+).""" + +import sys +if sys.version_info < (3, 10): + print("Skipping match/case tests (requires Python 3.10+)") + print("---") + print("0/0 tests passed") + sys.exit(0) + +from timer import test, dead, never + + +@test +def test_match_literal(t): + x = 1 @ t[0] + match x @ t[1]: + case 1: + y = "one" @ t[2] + case 2: + y = "two" @ t[dead(2)] + z = y @ t[3] + + +@test +def test_match_literal_fallthrough(t): + x = 3 @ t[0] + match x @ t[1]: + case 1: + y = "one" @ t[dead(2)] + case 2: + y = "two" @ t[dead(2)] + case 3: + y = "three" @ t[2] + z = y @ t[3] + + +@test +def test_match_wildcard(t): + x = 42 @ t[0] + match x @ t[1]: + case 1: + y = "one" @ t[dead(2)] + case _: + y = "other" @ t[2] + z = y @ t[3] + + +@test +def test_match_capture(t): + x = 42 @ t[0] + match x @ t[1]: + case n: + y = n @ t[2] + z = y @ t[3] + + +@test +def test_match_or_pattern(t): + x = 2 @ t[0] + match x @ t[1]: + case 1 | 2: + y = "low" @ t[2] + case _: + y = "other" @ t[dead(2)] + z = y @ t[3] + + +@test +def test_match_guard(t): + x = 5 @ t[0] + match x @ t[1]: + case n if (n @ t[2] > 3 @ t[3]) @ t[4]: + y = n @ t[5] + case _: + y = 0 @ t[dead(5)] + z = y @ t[6] + + +@test +def test_match_class_pattern(t): + x = 42 @ t[0] + match x @ t[1]: + case int(): + y = "integer" @ t[2] + case str(): + y = "string" @ t[dead(2)] + z = y @ t[3] + + +@test +def test_match_sequence(t): + x = [1 @ t[0], 2 @ t[1]] @ t[2] + match x @ t[3]: + case [a, b]: + y = (a @ t[4] + b @ t[5]) @ t[6] + case _: + y = 0 @ t[dead(6)] + z = y @ t[7] + + +@test +def test_match_mapping(t): + x = {"key" @ t[0]: 42 @ t[1]} @ t[2] + match x @ t[3]: + case {"key": value}: + y = value @ t[4] + case _: + y = 0 @ t[dead(4)] + z = y @ t[5] + + +@test +def test_match_nested(t): + x = {"users" @ t[0]: [{"name" @ t[1]: "Alice" @ t[2]} @ t[3]] @ t[4]} @ t[5] + match x @ t[6]: + case {"users": [{"name": name}]}: + y = name @ t[7] + case _: + y = "unknown" @ t[dead(7)] + z = y @ t[8] + + +@test +def test_match_or_pattern_with_as(t): + """OR pattern with `as` binding and method call on the result.""" + clause = "foo@bar" @ t[0] + match clause @ t[1]: + case (str() as uses) | {"uses": uses}: + result = ((uses @ t[2]).partition @ t[3])("@" @ t[4]) @ t[5] + x = (result @ t[6])[0 @ t[7]] @ t[8] + case _: + raise ((ValueError @ t[dead(2)])(clause @ t[dead(3)]) @ t[dead(4)]) + y = x @ t[9] + + +@test +def test_match_wildcard_raise(t): + """Wildcard case that raises, with OR pattern on the other branch.""" + clause = 42 @ t[0] + try: + match clause @ t[1]: + case (str() as uses) | {"uses": uses}: + result = uses @ t[dead(2)] + case _: + raise ((ValueError @ t[2])(f"Invalid: {clause @ t[3]}" @ t[4]) @ t[5]) + except ValueError: + y = 0 @ t[6] + + +@test +def test_match_exhaustive_return_first(t): + """Every case returns; code after match is unreachable (first case taken).""" + def f(x): + match x @ t[2]: + case 1: + return "one" @ t[3] + case _: + return "other" @ t[dead(3)] + y = 0 @ t[never] + result = (f @ t[0])(1 @ t[1]) @ t[4] + + +@test +def test_match_exhaustive_return_wildcard(t): + """Every case returns; code after match is unreachable (wildcard taken).""" + def f(x): + match x @ t[2]: + case 1: + return "one" @ t[dead(3)] + case _: + return "other" @ t[3] + y = 0 @ t[never] + result = (f @ t[0])(99 @ t[1]) @ t[4] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_try.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_try.py new file mode 100644 index 000000000000..dd0b15457d69 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_try.py @@ -0,0 +1,182 @@ +"""Exception handling control flow: try/except/else/finally evaluation order.""" + +from timer import test, dead, never + + +# 1. try/except — no exception raised (except block skipped) +@test +def test_try_no_exception(t): + try: + x = 1 @ t[0] + y = 2 @ t[1] + except ValueError: + z = 3 @ t[dead(2)] + after = 0 @ t[2] + + +# 2. try/except — exception raised and caught +@test +def test_try_with_exception(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])() @ t[2]) + y = 2 @ t[never] + except ValueError: + z = 3 @ t[3] + after = 0 @ t[4] + + +# 3. try/except/else — no exception (else runs) +@test +def test_try_except_else_no_exception(t): + try: + x = 1 @ t[0] + except ValueError: + y = 2 @ t[dead(1)] + else: + z = 3 @ t[1] + after = 0 @ t[2] + + +# 4. try/except/else — exception raised (else skipped) +@test +def test_try_except_else_with_exception(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])() @ t[2]) + except ValueError: + y = 2 @ t[3] + else: + z = 3 @ t[dead(3)] + after = 0 @ t[4] + + +# 5. try/finally — no exception +@test +def test_try_finally_no_exception(t): + try: + x = 1 @ t[0] + y = 2 @ t[1] + finally: + z = 3 @ t[2] + after = 0 @ t[3] + + +# 6. try/finally — exception raised (finally runs, then exception propagates) +@test +def test_try_finally_exception(t): + try: + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])() @ t[2]) + finally: + y = 2 @ t[3] + except ValueError: + z = 3 @ t[4] + + +# 7. try/except/finally — no exception +@test +def test_try_except_finally_no_exception(t): + try: + x = 1 @ t[0] + except ValueError: + y = 2 @ t[dead(1)] + finally: + z = 3 @ t[1] + after = 0 @ t[2] + + +# 8. try/except/finally — exception caught +@test +def test_try_except_finally_exception(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])() @ t[2]) + except ValueError: + y = 2 @ t[3] + finally: + z = 3 @ t[4] + after = 0 @ t[5] + + +# 9. Multiple except clauses — first matching +@test +def test_multiple_except_first(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])() @ t[2]) + except ValueError: + y = 2 @ t[3] + except TypeError: + z = 3 @ t[dead(3)] + after = 0 @ t[4] + + +# 10. Multiple except clauses — second matching +@test +def test_multiple_except_second(t): + try: + x = 1 @ t[0] + raise ((TypeError @ t[1])() @ t[2]) + except ValueError: + y = 2 @ t[dead(3)] + except TypeError: + z = 3 @ t[3] + after = 0 @ t[4] + + +# 11. except with `as` binding +@test +def test_except_as_binding(t): + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])("msg" @ t[2]) @ t[3]) + except ValueError as e: + y = (str @ t[4])(e @ t[5]) @ t[6] + after = 0 @ t[7] + + +# 12. Nested try/except +@test +def test_nested_try_except(t): + try: + x = 1 @ t[0] + try: + y = 2 @ t[1] + raise ((ValueError @ t[2])() @ t[3]) + except ValueError: + z = 3 @ t[4] + w = 4 @ t[5] + except TypeError: + v = 5 @ t[dead(6)] + after = 0 @ t[6] + + +# 13. try/except in a loop +@test +def test_try_in_loop(t): + total = 0 @ t[0] + for i in (range @ t[1])(3 @ t[2]) @ t[3]: + try: + if (i @ t[4, 11, 20] == 1 @ t[5, 12, 21]) @ t[6, 13, 22]: + raise ((ValueError @ t[14])() @ t[15]) + total = (total @ t[7, 23] + 1 @ t[8, 24]) @ t[9, 25] + except ValueError: + total = (total @ t[16] + 10 @ t[17]) @ t[18] + r = 0 @ t[10, 19, 26] + + +# 14. Re-raise with bare `raise` +@test +def test_reraise(t): + try: + try: + x = 1 @ t[0] + raise ((ValueError @ t[1])() @ t[2]) + except ValueError: + y = 2 @ t[3] + raise + except ValueError: + z = 3 @ t[4] + after = 0 @ t[5] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_unpacking.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_unpacking.py new file mode 100644 index 000000000000..45f292cb0b7d --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_unpacking.py @@ -0,0 +1,48 @@ +"""Unpacking and star expressions evaluation order.""" + +from timer import test + + +@test +def test_tuple_unpack(t): + """RHS expression evaluates, then unpacking assigns targets.""" + a, b = (1 @ t[0], 2 @ t[1]) @ t[2] + x = (a @ t[3] + b @ t[4]) @ t[5] + + +@test +def test_list_unpack(t): + """List unpacking: RHS elements left to right, then unpack.""" + [a, b] = [1 @ t[0], 2 @ t[1]] @ t[2] + x = (a @ t[3] + b @ t[4]) @ t[5] + + +@test +def test_star_unpack(t): + """Star unpacking: RHS evaluates first.""" + a, *b = [1 @ t[0], 2 @ t[1], 3 @ t[2], 4 @ t[3]] @ t[4] + x = (a @ t[5], b @ t[6]) @ t[7] + + +@test +def test_nested_unpack(t): + """Nested unpacking: RHS evaluates first.""" + (a, b), c = ((1 @ t[0], 2 @ t[1]) @ t[2], 3 @ t[3]) @ t[4] + x = ((a @ t[5] + b @ t[6]) @ t[7] + c @ t[8]) @ t[9] + + +@test +def test_swap(t): + a = 1 @ t[0] + b = 2 @ t[1] + a, b = (b @ t[2], a @ t[3]) @ t[4] + x = a @ t[5] + y = b @ t[6] + + +@test +def test_unpack_for(t): + pairs = [(1 @ t[0], 2 @ t[1]) @ t[2], (3 @ t[3], 4 @ t[4]) @ t[5]] @ t[6] + for a, b in pairs @ t[7]: + x = a @ t[8, 10] + y = b @ t[9, 11] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_with.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_with.py new file mode 100644 index 000000000000..1dcc7169092b --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_with.py @@ -0,0 +1,58 @@ +"""Evaluation order tests for with statements.""" + +from contextlib import contextmanager +from timer import test + + +@contextmanager +def ctx(value=None): + yield value + + +@test +def test_simple_with(t): + x = 1 @ t[0] + with (ctx @ t[1])() @ t[2]: + y = 2 @ t[3] + z = 3 @ t[4] + + +@test +def test_with_as(t): + with (ctx @ t[0])(42 @ t[1]) @ t[2] as v: + x = v @ t[3] + y = 0 @ t[4] + + +@test +def test_nested_with(t): + with (ctx @ t[0])() @ t[1]: + with (ctx @ t[2])() @ t[3]: + x = 1 @ t[4] + y = 2 @ t[5] + + +@test +def test_multiple_context_managers(t): + with (ctx @ t[0])(1 @ t[1]) @ t[2] as a, (ctx @ t[3])(2 @ t[4]) @ t[5] as b: + x = (a @ t[6], b @ t[7]) @ t[8] + y = 0 @ t[9] + + +@test +def test_with_exception_handling(t): + try: + with (ctx @ t[0])() @ t[1]: + x = 1 @ t[2] + raise ((ValueError @ t[3])() @ t[4]) + except ValueError: + y = 2 @ t[5] + z = 3 @ t[6] + + +@test +def test_with_in_loop(t): + for i in [1 @ t[0], 2 @ t[1]] @ t[2]: + with (ctx @ t[3, 6])() @ t[4, 7]: + x = i @ t[5, 8] + y = 0 @ t[9] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/test_yield.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_yield.py new file mode 100644 index 000000000000..b2a28d793bc6 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/test_yield.py @@ -0,0 +1,105 @@ +"""Generator and yield evaluation order tests. + +Generator bodies are lazy — code runs only when iterated. The timer +annotations inside generator bodies fire interleaved with the caller's +annotations, reflecting the suspend/resume semantics of yield. +""" + +from timer import test + + +@test +def test_simple_generator(t): + """Basic generator: body runs on next(), not on gen().""" + def gen(): + yield 1 @ t[4] + yield 2 @ t[8] + + g = (gen @ t[0])() @ t[1] + x = (next @ t[2])(g @ t[3]) @ t[5] + y = (next @ t[6])(g @ t[7]) @ t[9] + + +@test +def test_multiple_yields(t): + """Three yields interleave with three next() calls.""" + def gen(): + yield 1 @ t[4] + yield 2 @ t[8] + yield 3 @ t[12] + + g = (gen @ t[0])() @ t[1] + a = (next @ t[2])(g @ t[3]) @ t[5] + b = (next @ t[6])(g @ t[7]) @ t[9] + c = (next @ t[10])(g @ t[11]) @ t[13] + + +@test +def test_generator_for_loop(t): + """for-loop consumes generator, interleaving body and loop.""" + def gen(): + yield 1 @ t[2] + yield 2 @ t[4] + + for val in (gen @ t[0])() @ t[1]: + val @ t[3, 5] + + +@test +def test_generator_list(t): + """list() consumes the entire generator without interleaving.""" + def gen(): + yield 10 @ t[3] + yield 20 @ t[4] + yield 30 @ t[5] + + result = (list @ t[0])((gen @ t[1])() @ t[2]) @ t[6] + + +@test +def test_yield_from(t): + """yield from delegates to an inner generator transparently.""" + def inner(): + yield 1 @ t[6] + yield 2 @ t[10] + + def outer(): + yield from (inner @ t[4])() @ t[5] + + g = (outer @ t[0])() @ t[1] + x = (next @ t[2])(g @ t[3]) @ t[7] + y = (next @ t[8])(g @ t[9]) @ t[11] + + +@test +def test_generator_return(t): + """Generator return value accessed via yield from.""" + def gen(): + yield 1 @ t[6] + return 42 @ t[10] + + def wrapper(): + result = (yield from (gen @ t[4])() @ t[5]) @ t[11] + yield result @ t[12] + + g = (wrapper @ t[0])() @ t[1] + x = (next @ t[2])(g @ t[3]) @ t[7] + y = (next @ t[8])(g @ t[9]) @ t[13] + + +@test +def test_generator_send(t): + """send() passes a value into the generator at the yield point.""" + def gen(): + x = (yield 1 @ t[4]) @ t[9] + yield (x @ t[10] + 10 @ t[11]) @ t[12] + + g = (gen @ t[0])() @ t[1] + first = (next @ t[2])(g @ t[3]) @ t[5] + second = ((g @ t[6]).send @ t[7])(42 @ t[8]) @ t[13] + + +@test +def test_generator_expression(t): + """Inline generator expression consumed by list().""" + result = (list @ t[0])(x @ t[5, 6, 7] for x in [10 @ t[1], 20 @ t[2], 30 @ t[3]] @ t[4]) @ t[8] diff --git a/python/ql/test/library-tests/ControlFlow/evaluation-order/timer.py b/python/ql/test/library-tests/ControlFlow/evaluation-order/timer.py new file mode 100644 index 000000000000..ccec5d64f7c3 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/evaluation-order/timer.py @@ -0,0 +1,194 @@ +"""Abstract timer for self-validating CFG evaluation-order tests. + +Provides a Timer context manager and a @test decorator for writing tests +that verify the order in which Python evaluates expressions. + +Usage with @test decorator (preferred): + + from timer import test, dead, never + + @test + def test_sequential(t): + x = 1 @ t[0] + y = 2 @ t[1] + z = (x + y) @ t[2] + +Annotation forms: + t[n] - assert current timestamp is n, return marker + t[n, m, ...] - assert current timestamp is one of {n, m, ...} + t[dead(n)] - mark timestamp n as dead (fails if evaluated) + t[dead(n), m] - dead at n, live at m + t[never] - mark as never evaluated (fails if evaluated) + t["label"] - record current timestamp under label (development aid) + t(value, n) - equivalent to: value @ t[n] + +Run a test file directly to self-validate: python test_file.py +""" + +import atexit +import os +import sys + +_results = [] + + +class _Check: + """Marker returned by t[n] — asserts the current timestamp. + + Receives the raw subscript elements: plain ints are live timestamps, + dead(n) markers are dead timestamps, and `never` means any evaluation + is an error. + """ + + __slots__ = ("_timer", "_live", "_dead", "_never") + + def __init__(self, timer, elements): + self._timer = timer + self._live = set() + self._dead = set() + self._never = False + for e in elements: + if isinstance(e, int): + self._live.add(e) + elif isinstance(e, _DeadMarker): + self._dead.add(e.timestamp) + elif isinstance(e, _NeverSentinel): + self._never = True + else: + raise TypeError( + f"Unknown element in timer subscript: {e!r} (type {type(e).__name__})" + ) + + def __rmatmul__(self, value): + ts = self._timer._tick() + if self._never: + self._timer._error( + f"expression annotated with t[never] was evaluated (timestamp {ts})" + ) + elif ts in self._dead: + self._timer._error( + f"timestamp {ts} is marked dead but was evaluated" + ) + elif ts not in self._live: + self._timer._error( + f"expected {sorted(self._live)}, got {ts}" + ) + return value + + +class _Label: + """Marker returned by t["name"] — records the timestamp under a label.""" + + __slots__ = ("_timer", "_name") + + def __init__(self, timer, name): + self._timer = timer + self._name = name + + def __rmatmul__(self, value): + ts = self._timer._tick() + self._timer._labels.setdefault(self._name, []).append(ts) + return value + + +class _DeadMarker: + """Marker returned by dead(n) — used inside t[...] to mark a timestamp as dead.""" + + def __init__(self, timestamp): + self.timestamp = timestamp + + +def dead(n): + """Mark timestamp `n` as dead code inside a timer subscript: t[dead(1), 2].""" + return _DeadMarker(n) + + +class _NeverSentinel: + """Sentinel for never-evaluated annotations: t[never].""" + pass + + +never = _NeverSentinel() + + +class Timer: + """Context manager tracking abstract evaluation timestamps. + + Each Timer instance maintains a counter starting at 0. Every time an + annotation (@ t[n] or t(value, n)) is encountered, the counter is + compared against the expected value and then incremented. + """ + + def __init__(self, name=""): + self._name = name + self._counter = 0 + self._errors = [] + self._labels = {} + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self._labels: + for name, timestamps in sorted(self._labels.items()): + print(f" {name}: {', '.join(map(str, timestamps))}") + _results.append((self._name, list(self._errors))) + if self._errors: + print(f"{self._name}: FAIL") + for err in self._errors: + print(f" {err}") + else: + print(f"{self._name}: ok") + return False + + def _tick(self): + ts = self._counter + self._counter += 1 + return ts + + def _error(self, msg): + self._errors.append(msg) + + def __getitem__(self, key): + if isinstance(key, str): + return _Label(self, key) + elif isinstance(key, tuple): + return _Check(self, key) + else: + return _Check(self, [key]) + + def __call__(self, value, key): + """Alternative to @ operator: t(value, 4) or t(value, [1, 2, 3]).""" + if isinstance(key, list): + key = tuple(key) + marker = self[key] + return marker.__rmatmul__(value) + + +def test(fn): + """Decorator that creates a Timer and runs the test function immediately. + + The function receives a fresh Timer as its sole argument. Errors are + collected (not raised) and reported after the function completes. + """ + with Timer(fn.__name__) as t: + try: + fn(t) + except Exception as e: + t._error(f"exception: {type(e).__name__}: {e}") + return fn + + +def _report(): + """Print summary at interpreter exit.""" + if not _results: + return + total = len(_results) + passed = sum(1 for _, errors in _results if not errors) + print("---") + print(f"{passed}/{total} tests passed") + if passed < total: + os._exit(1) + + +atexit.register(_report) diff --git a/python/ql/test/library-tests/dataflow/sensitive-data/test.py b/python/ql/test/library-tests/dataflow/sensitive-data/test.py index 77238a5e1dc1..d4a10511030b 100644 --- a/python/ql/test/library-tests/dataflow/sensitive-data/test.py +++ b/python/ql/test/library-tests/dataflow/sensitive-data/test.py @@ -131,6 +131,5 @@ def call_wrapper(func): print(password) # $ SensitiveUse=password _config = {"sleep_timer": 5, "mysql_password": password} -# since we have taint-step from store of `password`, we will consider any item in the -# dictionary to be a password :( -print(_config["sleep_timer"]) # $ SPURIOUS: SensitiveUse=password +# since we have precise dictionary content, other items of the config are not tainted +print(_config["sleep_timer"]) diff --git a/python/ql/test/library-tests/dataflow/summaries/summaries.expected b/python/ql/test/library-tests/dataflow/summaries/summaries.expected index 4a97116f8cd1..fbc09b5fa6e6 100644 --- a/python/ql/test/library-tests/dataflow/summaries/summaries.expected +++ b/python/ql/test/library-tests/dataflow/summaries/summaries.expected @@ -7,13 +7,9 @@ edges | summaries.py:36:38:36:38 | ControlFlowNode for x | summaries.py:36:41:36:45 | ControlFlowNode for BinaryExpr | provenance | | | summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | summaries.py:36:18:36:54 | ControlFlowNode for apply_lambda() | provenance | apply_lambda | | summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | summaries.py:36:38:36:38 | ControlFlowNode for x | provenance | apply_lambda | -| summaries.py:44:1:44:12 | ControlFlowNode for tainted_list | summaries.py:45:6:45:20 | ControlFlowNode for Subscript | provenance | | | summaries.py:44:1:44:12 | ControlFlowNode for tainted_list [List element] | summaries.py:45:6:45:17 | ControlFlowNode for tainted_list [List element] | provenance | | -| summaries.py:44:16:44:33 | ControlFlowNode for reversed() | summaries.py:44:1:44:12 | ControlFlowNode for tainted_list | provenance | | | summaries.py:44:16:44:33 | ControlFlowNode for reversed() [List element] | summaries.py:44:1:44:12 | ControlFlowNode for tainted_list [List element] | provenance | | -| summaries.py:44:25:44:32 | ControlFlowNode for List | summaries.py:44:16:44:33 | ControlFlowNode for reversed() | provenance | builtins.reversed | | summaries.py:44:25:44:32 | ControlFlowNode for List [List element] | summaries.py:44:16:44:33 | ControlFlowNode for reversed() [List element] | provenance | builtins.reversed | -| summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | summaries.py:44:25:44:32 | ControlFlowNode for List | provenance | | | summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | summaries.py:44:25:44:32 | ControlFlowNode for List [List element] | provenance | | | summaries.py:45:6:45:17 | ControlFlowNode for tainted_list [List element] | summaries.py:45:6:45:20 | ControlFlowNode for Subscript | provenance | | | summaries.py:48:15:48:15 | ControlFlowNode for x | summaries.py:49:12:49:18 | ControlFlowNode for BinaryExpr | provenance | | @@ -42,6 +38,7 @@ edges | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist | summaries.py:68:6:68:26 | ControlFlowNode for Subscript | provenance | | | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist [List element] | summaries.py:68:6:68:23 | ControlFlowNode for tainted_resultlist [List element] | provenance | | | summaries.py:67:22:67:39 | ControlFlowNode for json_loads() [List element] | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist [List element] | provenance | | +| summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist | provenance | | | summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist | provenance | Decoding-JSON | | summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | summaries.py:67:22:67:39 | ControlFlowNode for json_loads() [List element] | provenance | json.loads | | summaries.py:68:6:68:23 | ControlFlowNode for tainted_resultlist [List element] | summaries.py:68:6:68:26 | ControlFlowNode for Subscript | provenance | | @@ -56,11 +53,8 @@ nodes | summaries.py:36:41:36:45 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | | summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | | summaries.py:37:6:37:19 | ControlFlowNode for tainted_lambda | semmle.label | ControlFlowNode for tainted_lambda | -| summaries.py:44:1:44:12 | ControlFlowNode for tainted_list | semmle.label | ControlFlowNode for tainted_list | | summaries.py:44:1:44:12 | ControlFlowNode for tainted_list [List element] | semmle.label | ControlFlowNode for tainted_list [List element] | -| summaries.py:44:16:44:33 | ControlFlowNode for reversed() | semmle.label | ControlFlowNode for reversed() | | summaries.py:44:16:44:33 | ControlFlowNode for reversed() [List element] | semmle.label | ControlFlowNode for reversed() [List element] | -| summaries.py:44:25:44:32 | ControlFlowNode for List | semmle.label | ControlFlowNode for List | | summaries.py:44:25:44:32 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] | | summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | | summaries.py:45:6:45:17 | ControlFlowNode for tainted_list [List element] | semmle.label | ControlFlowNode for tainted_list [List element] | diff --git a/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py b/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py index 6c86d1c75d58..fa6087f3ebcd 100644 --- a/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py +++ b/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py @@ -32,7 +32,6 @@ def test_construction(): list(tainted_tuple), # $ tainted list(tainted_set), # $ tainted list(tainted_dict.values()), # $ tainted - list(tainted_dict.items()), # $ tainted tuple(tainted_list), # $ tainted set(tainted_list), # $ tainted @@ -41,10 +40,11 @@ def test_construction(): dict(k = tainted_string)["k"], # $ tainted dict(dict(k = tainted_string))["k"], # $ tainted dict(["k", tainted_string]), # $ tainted + list(tainted_dict.items()), # $ tainted ) ensure_not_tainted( - dict(k = tainted_string)["k1"] + dict(k = tainted_string)["k1"], ) @@ -59,7 +59,7 @@ def test_access(x, y, z): sorted(tainted_list), # $ tainted reversed(tainted_list), # $ tainted iter(tainted_list), # $ tainted - next(iter(tainted_list)), # $ MISSING: tainted + next(iter(tainted_list)), # $ tainted [i for i in tainted_list], # $ tainted [tainted_list for _i in [1,2,3]], # $ tainted ) diff --git a/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_unpacking.py b/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_unpacking.py index d8bfe71dbc44..2816e848470c 100644 --- a/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_unpacking.py +++ b/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_unpacking.py @@ -53,7 +53,7 @@ def contrived_1(): (a, b, c), (d, e, f) = tainted_list, no_taint_list ensure_tainted(a, b, c) # $ tainted - ensure_not_tainted(d, e, f) # $ SPURIOUS: tainted + ensure_not_tainted(d, e, f) def contrived_2(): diff --git a/python/ql/test/library-tests/frameworks/gradio/taint_step_test.expected b/python/ql/test/library-tests/frameworks/gradio/taint_step_test.expected index 2ebf825a19b5..e617488aac15 100644 --- a/python/ql/test/library-tests/frameworks/gradio/taint_step_test.expected +++ b/python/ql/test/library-tests/frameworks/gradio/taint_step_test.expected @@ -3,10 +3,12 @@ edges | taint_step_test.py:5:12:5:35 | ControlFlowNode for Attribute() | taint_step_test.py:5:5:5:8 | ControlFlowNode for path | provenance | | | taint_step_test.py:6:5:6:8 | ControlFlowNode for file | taint_step_test.py:19:48:19:51 | ControlFlowNode for file | provenance | | | taint_step_test.py:6:12:6:35 | ControlFlowNode for Attribute() | taint_step_test.py:6:5:6:8 | ControlFlowNode for file | provenance | | -| taint_step_test.py:11:18:11:21 | ControlFlowNode for path | taint_step_test.py:12:9:12:16 | ControlFlowNode for filepath | provenance | | | taint_step_test.py:11:18:11:21 | ControlFlowNode for path | taint_step_test.py:12:9:12:16 | ControlFlowNode for filepath | provenance | AdditionalTaintStep | +| taint_step_test.py:11:18:11:21 | ControlFlowNode for path | taint_step_test.py:12:33:12:36 | ControlFlowNode for path | provenance | | | taint_step_test.py:11:24:11:27 | ControlFlowNode for file | taint_step_test.py:12:9:12:16 | ControlFlowNode for filepath | provenance | AdditionalTaintStep | | taint_step_test.py:12:9:12:16 | ControlFlowNode for filepath | taint_step_test.py:13:19:13:26 | ControlFlowNode for filepath | provenance | | +| taint_step_test.py:12:20:12:43 | ControlFlowNode for Attribute() | taint_step_test.py:12:9:12:16 | ControlFlowNode for filepath | provenance | | +| taint_step_test.py:12:33:12:36 | ControlFlowNode for path | taint_step_test.py:12:20:12:43 | ControlFlowNode for Attribute() | provenance | str.join | | taint_step_test.py:19:43:19:46 | ControlFlowNode for path | taint_step_test.py:11:18:11:21 | ControlFlowNode for path | provenance | AdditionalTaintStep | | taint_step_test.py:19:48:19:51 | ControlFlowNode for file | taint_step_test.py:11:24:11:27 | ControlFlowNode for file | provenance | AdditionalTaintStep | nodes @@ -17,6 +19,8 @@ nodes | taint_step_test.py:11:18:11:21 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | taint_step_test.py:11:24:11:27 | ControlFlowNode for file | semmle.label | ControlFlowNode for file | | taint_step_test.py:12:9:12:16 | ControlFlowNode for filepath | semmle.label | ControlFlowNode for filepath | +| taint_step_test.py:12:20:12:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| taint_step_test.py:12:33:12:36 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | taint_step_test.py:13:19:13:26 | ControlFlowNode for filepath | semmle.label | ControlFlowNode for filepath | | taint_step_test.py:19:43:19:46 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | taint_step_test.py:19:48:19:51 | ControlFlowNode for file | semmle.label | ControlFlowNode for file | diff --git a/python/ql/test/library-tests/frameworks/stdlib/test_re.py b/python/ql/test/library-tests/frameworks/stdlib/test_re.py index 4cfe5d972b7b..8107b7dd9881 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/test_re.py +++ b/python/ql/test/library-tests/frameworks/stdlib/test_re.py @@ -6,16 +6,16 @@ compiled_pat = re.compile(pat) # see https://docs.python.org/3/library/re.html#functions -ensure_not_tainted( - # returns Match object, which is tested properly below. (note: with the flow summary - # modeling, objects containing tainted values are not themselves tainted). - re.search(pat, ts), - re.match(pat, ts), - re.fullmatch(pat, ts), - - compiled_pat.search(ts), - compiled_pat.match(ts), - compiled_pat.fullmatch(ts), +ensure_tainted( + # returns Match object, which is tested properly below. (note: the match objects contain + # tainted values but are not themselves tainted - this test relies on implicit reads at sinks). + re.search(pat, ts), # $ tainted + re.match(pat, ts), # $ tainted + re.fullmatch(pat, ts), # $ tainted + + compiled_pat.search(ts), # $ tainted + compiled_pat.match(ts), # $ tainted + compiled_pat.fullmatch(ts), # $ tainted ) # Match object @@ -80,9 +80,9 @@ ) ensure_not_tainted( - re.subn(pat, repl="safe", string=ts), re.subn(pat, repl="safe", string=ts)[1], # // the number of substitutions made ) ensure_tainted( + re.subn(pat, repl="safe", string=ts), # $ tainted // implicit read at sink re.subn(pat, repl="safe", string=ts)[0], # $ tainted // the string ) diff --git a/python/ql/test/library-tests/frameworks/tornado/taint_test.py b/python/ql/test/library-tests/frameworks/tornado/taint_test.py index 697a9e30af61..2a683d59d9ca 100644 --- a/python/ql/test/library-tests/frameworks/tornado/taint_test.py +++ b/python/ql/test/library-tests/frameworks/tornado/taint_test.py @@ -63,7 +63,8 @@ def get(self, name = "World!", number="0", foo="foo"): # $ requestHandler route request.headers["header-name"], # $ tainted request.headers.get_list("header-name"), # $ tainted request.headers.get_all(), # $ tainted - [(k, v) for (k, v) in request.headers.get_all()], # $ tainted + [(k, v) for (k, v) in request.headers.get_all()][0], # $ tainted + list([(k, v) for (k, v) in request.headers.get_all()])[0], # $ tainted # Dict[str, http.cookies.Morsel] request.cookies, # $ tainted @@ -71,6 +72,11 @@ def get(self, name = "World!", number="0", foo="foo"): # $ requestHandler route request.cookies["cookie-name"].key, # $ tainted request.cookies["cookie-name"].value, # $ tainted request.cookies["cookie-name"].coded_value, # $ tainted + + # The comprehension is not tainted, only the elements, but this passes due to implicit reads at sinks + [(k, v) for (k, v) in request.headers.get_all()], # $ tainted + # The list is not tainted, only the elements, but this passes due to implicit reads at sinks + list([(k, v) for (k, v) in request.headers.get_all()]), # $ tainted ) diff --git a/python/ql/test/query-tests/Security/CVE-2018-1281/BindToAllInterfaces.expected b/python/ql/test/query-tests/Security/CVE-2018-1281/BindToAllInterfaces.expected index 0b96b2df6508..c478fe78fd77 100644 --- a/python/ql/test/query-tests/Security/CVE-2018-1281/BindToAllInterfaces.expected +++ b/python/ql/test/query-tests/Security/CVE-2018-1281/BindToAllInterfaces.expected @@ -11,10 +11,13 @@ edges | BindToAllInterfaces_test.py:5:9:5:17 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:5:9:5:24 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | | BindToAllInterfaces_test.py:9:9:9:10 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:9:9:9:16 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | -| BindToAllInterfaces_test.py:16:1:16:10 | ControlFlowNode for ALL_LOCALS | BindToAllInterfaces_test.py:17:9:17:24 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | -| BindToAllInterfaces_test.py:16:1:16:10 | ControlFlowNode for ALL_LOCALS | BindToAllInterfaces_test.py:20:1:20:3 | ControlFlowNode for tup | provenance | | +| BindToAllInterfaces_test.py:16:1:16:10 | ControlFlowNode for ALL_LOCALS | BindToAllInterfaces_test.py:17:9:17:18 | ControlFlowNode for ALL_LOCALS | provenance | | +| BindToAllInterfaces_test.py:16:1:16:10 | ControlFlowNode for ALL_LOCALS | BindToAllInterfaces_test.py:20:8:20:17 | ControlFlowNode for ALL_LOCALS | provenance | | | BindToAllInterfaces_test.py:16:14:16:22 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:16:1:16:10 | ControlFlowNode for ALL_LOCALS | provenance | | -| BindToAllInterfaces_test.py:20:1:20:3 | ControlFlowNode for tup | BindToAllInterfaces_test.py:21:8:21:10 | ControlFlowNode for tup | provenance | Sink:MaD:63 | +| BindToAllInterfaces_test.py:17:9:17:18 | ControlFlowNode for ALL_LOCALS | BindToAllInterfaces_test.py:17:9:17:24 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | +| BindToAllInterfaces_test.py:20:1:20:3 | ControlFlowNode for tup [Tuple element at index 0] | BindToAllInterfaces_test.py:21:8:21:10 | ControlFlowNode for tup | provenance | Sink:MaD:63 | +| BindToAllInterfaces_test.py:20:8:20:17 | ControlFlowNode for ALL_LOCALS | BindToAllInterfaces_test.py:20:8:20:23 | ControlFlowNode for Tuple [Tuple element at index 0] | provenance | | +| BindToAllInterfaces_test.py:20:8:20:23 | ControlFlowNode for Tuple [Tuple element at index 0] | BindToAllInterfaces_test.py:20:1:20:3 | ControlFlowNode for tup [Tuple element at index 0] | provenance | | | BindToAllInterfaces_test.py:26:9:26:12 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:26:9:26:18 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | | BindToAllInterfaces_test.py:33:18:33:21 | ControlFlowNode for self [Return] [Attribute bind_addr] | BindToAllInterfaces_test.py:41:10:41:17 | ControlFlowNode for Server() [Attribute bind_addr] | provenance | | | BindToAllInterfaces_test.py:34:9:34:12 | [post] ControlFlowNode for self [Attribute bind_addr] | BindToAllInterfaces_test.py:33:18:33:21 | ControlFlowNode for self [Return] [Attribute bind_addr] | provenance | | @@ -25,9 +28,10 @@ edges | BindToAllInterfaces_test.py:41:1:41:6 | ControlFlowNode for server [Attribute bind_addr] | BindToAllInterfaces_test.py:42:1:42:6 | ControlFlowNode for server [Attribute bind_addr] | provenance | | | BindToAllInterfaces_test.py:41:10:41:17 | ControlFlowNode for Server() [Attribute bind_addr] | BindToAllInterfaces_test.py:41:1:41:6 | ControlFlowNode for server [Attribute bind_addr] | provenance | | | BindToAllInterfaces_test.py:42:1:42:6 | ControlFlowNode for server [Attribute bind_addr] | BindToAllInterfaces_test.py:37:15:37:18 | ControlFlowNode for self [Attribute bind_addr] | provenance | | -| BindToAllInterfaces_test.py:46:1:46:4 | ControlFlowNode for host | BindToAllInterfaces_test.py:48:9:48:18 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | +| BindToAllInterfaces_test.py:46:1:46:4 | ControlFlowNode for host | BindToAllInterfaces_test.py:48:9:48:12 | ControlFlowNode for host | provenance | | | BindToAllInterfaces_test.py:46:8:46:44 | ControlFlowNode for Attribute() | BindToAllInterfaces_test.py:46:1:46:4 | ControlFlowNode for host | provenance | | | BindToAllInterfaces_test.py:46:35:46:43 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:46:8:46:44 | ControlFlowNode for Attribute() | provenance | dict.get | +| BindToAllInterfaces_test.py:48:9:48:12 | ControlFlowNode for host | BindToAllInterfaces_test.py:48:9:48:18 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | | BindToAllInterfaces_test.py:53:10:53:18 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:53:10:53:25 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | | BindToAllInterfaces_test.py:58:10:58:18 | ControlFlowNode for StringLiteral | BindToAllInterfaces_test.py:58:10:58:25 | ControlFlowNode for Tuple | provenance | Sink:MaD:63 | nodes @@ -37,8 +41,11 @@ nodes | BindToAllInterfaces_test.py:9:9:9:16 | ControlFlowNode for Tuple | semmle.label | ControlFlowNode for Tuple | | BindToAllInterfaces_test.py:16:1:16:10 | ControlFlowNode for ALL_LOCALS | semmle.label | ControlFlowNode for ALL_LOCALS | | BindToAllInterfaces_test.py:16:14:16:22 | ControlFlowNode for StringLiteral | semmle.label | ControlFlowNode for StringLiteral | +| BindToAllInterfaces_test.py:17:9:17:18 | ControlFlowNode for ALL_LOCALS | semmle.label | ControlFlowNode for ALL_LOCALS | | BindToAllInterfaces_test.py:17:9:17:24 | ControlFlowNode for Tuple | semmle.label | ControlFlowNode for Tuple | -| BindToAllInterfaces_test.py:20:1:20:3 | ControlFlowNode for tup | semmle.label | ControlFlowNode for tup | +| BindToAllInterfaces_test.py:20:1:20:3 | ControlFlowNode for tup [Tuple element at index 0] | semmle.label | ControlFlowNode for tup [Tuple element at index 0] | +| BindToAllInterfaces_test.py:20:8:20:17 | ControlFlowNode for ALL_LOCALS | semmle.label | ControlFlowNode for ALL_LOCALS | +| BindToAllInterfaces_test.py:20:8:20:23 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] | | BindToAllInterfaces_test.py:21:8:21:10 | ControlFlowNode for tup | semmle.label | ControlFlowNode for tup | | BindToAllInterfaces_test.py:26:9:26:12 | ControlFlowNode for StringLiteral | semmle.label | ControlFlowNode for StringLiteral | | BindToAllInterfaces_test.py:26:9:26:18 | ControlFlowNode for Tuple | semmle.label | ControlFlowNode for Tuple | @@ -55,6 +62,7 @@ nodes | BindToAllInterfaces_test.py:46:1:46:4 | ControlFlowNode for host | semmle.label | ControlFlowNode for host | | BindToAllInterfaces_test.py:46:8:46:44 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | BindToAllInterfaces_test.py:46:35:46:43 | ControlFlowNode for StringLiteral | semmle.label | ControlFlowNode for StringLiteral | +| BindToAllInterfaces_test.py:48:9:48:12 | ControlFlowNode for host | semmle.label | ControlFlowNode for host | | BindToAllInterfaces_test.py:48:9:48:18 | ControlFlowNode for Tuple | semmle.label | ControlFlowNode for Tuple | | BindToAllInterfaces_test.py:53:10:53:18 | ControlFlowNode for StringLiteral | semmle.label | ControlFlowNode for StringLiteral | | BindToAllInterfaces_test.py:53:10:53:25 | ControlFlowNode for Tuple | semmle.label | ControlFlowNode for Tuple | diff --git a/python/ql/test/query-tests/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.expected b/python/ql/test/query-tests/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.expected index 08a5b798f71f..7f83ceae8fe0 100644 --- a/python/ql/test/query-tests/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.expected +++ b/python/ql/test/query-tests/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.expected @@ -5,11 +5,13 @@ edges | test.py:5:26:5:32 | ControlFlowNode for request | test.py:34:12:34:18 | ControlFlowNode for request | provenance | | | test.py:5:26:5:32 | ControlFlowNode for request | test.py:42:12:42:18 | ControlFlowNode for request | provenance | | | test.py:5:26:5:32 | ControlFlowNode for request | test.py:54:12:54:18 | ControlFlowNode for request | provenance | | +| test.py:13:5:13:12 | ControlFlowNode for data_raw | test.py:14:5:14:8 | ControlFlowNode for data | provenance | | | test.py:13:5:13:12 | ControlFlowNode for data_raw | test.py:14:5:14:8 | ControlFlowNode for data | provenance | Decoding-Base64 | | test.py:13:16:13:22 | ControlFlowNode for request | test.py:13:16:13:27 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | test.py:13:16:13:27 | ControlFlowNode for Attribute | test.py:13:16:13:39 | ControlFlowNode for Attribute() | provenance | dict.get | | test.py:13:16:13:39 | ControlFlowNode for Attribute() | test.py:13:5:13:12 | ControlFlowNode for data_raw | provenance | | | test.py:14:5:14:8 | ControlFlowNode for data | test.py:15:36:15:39 | ControlFlowNode for data | provenance | | +| test.py:23:5:23:12 | ControlFlowNode for data_raw | test.py:24:5:24:8 | ControlFlowNode for data | provenance | | | test.py:23:5:23:12 | ControlFlowNode for data_raw | test.py:24:5:24:8 | ControlFlowNode for data | provenance | Decoding-Base64 | | test.py:23:16:23:22 | ControlFlowNode for request | test.py:23:16:23:27 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | test.py:23:16:23:27 | ControlFlowNode for Attribute | test.py:23:16:23:39 | ControlFlowNode for Attribute() | provenance | dict.get | diff --git a/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected b/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected index e53508f61a5a..3bc075d618be 100644 --- a/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected +++ b/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected @@ -1,10 +1,13 @@ edges | src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:5:25:5:28 | ControlFlowNode for name | provenance | | | src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:8:23:8:26 | ControlFlowNode for name | provenance | | -| src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:11:25:11:38 | ControlFlowNode for Attribute() | provenance | | -| src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:14:25:14:40 | ControlFlowNode for Attribute() | provenance | | +| src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:11:34:11:37 | ControlFlowNode for name | provenance | | +| src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:14:35:14:38 | ControlFlowNode for name | provenance | | | src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:17:32:17:35 | ControlFlowNode for name | provenance | | | src/unsafe_shell_test.py:4:22:4:25 | ControlFlowNode for name | src/unsafe_shell_test.py:20:27:20:30 | ControlFlowNode for name | provenance | | +| src/unsafe_shell_test.py:11:34:11:37 | ControlFlowNode for name | src/unsafe_shell_test.py:11:25:11:38 | ControlFlowNode for Attribute() | provenance | str.join | +| src/unsafe_shell_test.py:14:34:14:39 | ControlFlowNode for List [List element] | src/unsafe_shell_test.py:14:25:14:40 | ControlFlowNode for Attribute() | provenance | str.join | +| src/unsafe_shell_test.py:14:35:14:38 | ControlFlowNode for name | src/unsafe_shell_test.py:14:34:14:39 | ControlFlowNode for List [List element] | provenance | | | src/unsafe_shell_test.py:26:20:26:23 | ControlFlowNode for name | src/unsafe_shell_test.py:29:30:29:33 | ControlFlowNode for name | provenance | | | src/unsafe_shell_test.py:36:22:36:25 | ControlFlowNode for name | src/unsafe_shell_test.py:39:30:39:33 | ControlFlowNode for name | provenance | | | src/unsafe_shell_test.py:36:22:36:25 | ControlFlowNode for name | src/unsafe_shell_test.py:44:20:44:23 | ControlFlowNode for name | provenance | | @@ -15,7 +18,10 @@ nodes | src/unsafe_shell_test.py:5:25:5:28 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | | src/unsafe_shell_test.py:8:23:8:26 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | | src/unsafe_shell_test.py:11:25:11:38 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| src/unsafe_shell_test.py:11:34:11:37 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | | src/unsafe_shell_test.py:14:25:14:40 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| src/unsafe_shell_test.py:14:34:14:39 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] | +| src/unsafe_shell_test.py:14:35:14:38 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | | src/unsafe_shell_test.py:17:32:17:35 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | | src/unsafe_shell_test.py:20:27:20:30 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | | src/unsafe_shell_test.py:26:20:26:23 | ControlFlowNode for name | semmle.label | ControlFlowNode for name | diff --git a/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.expected b/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.expected index 2e6c5c33fbcd..d332231e0c99 100644 --- a/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.expected +++ b/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.expected @@ -7,8 +7,10 @@ edges | reflected_xss.py:9:18:9:24 | ControlFlowNode for request | reflected_xss.py:9:18:9:29 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | | reflected_xss.py:9:18:9:29 | ControlFlowNode for Attribute | reflected_xss.py:9:18:9:45 | ControlFlowNode for Attribute() | provenance | dict.get | | reflected_xss.py:9:18:9:45 | ControlFlowNode for Attribute() | reflected_xss.py:9:5:9:14 | ControlFlowNode for first_name | provenance | | +| reflected_xss.py:21:5:21:8 | ControlFlowNode for data | reflected_xss.py:22:26:22:41 | ControlFlowNode for Attribute() | provenance | | | reflected_xss.py:21:5:21:8 | ControlFlowNode for data | reflected_xss.py:22:26:22:41 | ControlFlowNode for Attribute() | provenance | AdditionalTaintStep | | reflected_xss.py:21:23:21:29 | ControlFlowNode for request | reflected_xss.py:21:5:21:8 | ControlFlowNode for data | provenance | AdditionalTaintStep | +| reflected_xss.py:27:5:27:8 | ControlFlowNode for data | reflected_xss.py:28:26:28:41 | ControlFlowNode for Attribute() | provenance | | | reflected_xss.py:27:5:27:8 | ControlFlowNode for data | reflected_xss.py:28:26:28:41 | ControlFlowNode for Attribute() | provenance | AdditionalTaintStep | | reflected_xss.py:27:23:27:29 | ControlFlowNode for request | reflected_xss.py:27:5:27:8 | ControlFlowNode for data | provenance | AdditionalTaintStep | nodes diff --git a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected index e0321cab12eb..b24fd261ea88 100644 --- a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected +++ b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected @@ -7,7 +7,8 @@ edges | test.py:50:29:50:31 | ControlFlowNode for err | test.py:50:16:50:32 | ControlFlowNode for format_error() | provenance | | | test.py:50:29:50:31 | ControlFlowNode for err | test.py:52:18:52:20 | ControlFlowNode for msg | provenance | | | test.py:52:18:52:20 | ControlFlowNode for msg | test.py:53:12:53:27 | ControlFlowNode for BinaryExpr | provenance | | -| test.py:65:25:65:25 | ControlFlowNode for e | test.py:66:24:66:40 | ControlFlowNode for Dict | provenance | | +| test.py:65:25:65:25 | ControlFlowNode for e | test.py:66:34:66:39 | ControlFlowNode for str() | provenance | | +| test.py:66:34:66:39 | ControlFlowNode for str() | test.py:66:24:66:40 | ControlFlowNode for Dict | provenance | | nodes | test.py:16:16:16:37 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | test.py:23:25:23:25 | ControlFlowNode for e | semmle.label | ControlFlowNode for e | @@ -23,6 +24,7 @@ nodes | test.py:53:12:53:27 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | | test.py:65:25:65:25 | ControlFlowNode for e | semmle.label | ControlFlowNode for e | | test.py:66:24:66:40 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| test.py:66:34:66:39 | ControlFlowNode for str() | semmle.label | ControlFlowNode for str() | subpaths | test.py:50:29:50:31 | ControlFlowNode for err | test.py:52:18:52:20 | ControlFlowNode for msg | test.py:53:12:53:27 | ControlFlowNode for BinaryExpr | test.py:50:16:50:32 | ControlFlowNode for format_error() | #select diff --git a/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/CleartextLogging.expected b/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/CleartextLogging.expected index dca1a33e73a3..5da1b60eee12 100644 --- a/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/CleartextLogging.expected +++ b/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/CleartextLogging.expected @@ -10,6 +10,8 @@ edges | test.py:48:14:48:35 | ControlFlowNode for social_security_number | test.py:49:15:49:36 | ControlFlowNode for social_security_number | provenance | | | test.py:48:38:48:40 | ControlFlowNode for ssn | test.py:50:15:50:17 | ControlFlowNode for ssn | provenance | | | test.py:48:54:48:63 | ControlFlowNode for passportNo | test.py:52:15:52:24 | ControlFlowNode for passportNo | provenance | | +| test.py:54:14:54:22 | ControlFlowNode for post_code | test.py:55:15:55:23 | ControlFlowNode for post_code | provenance | | +| test.py:54:25:54:31 | ControlFlowNode for zipCode | test.py:56:15:56:21 | ControlFlowNode for zipCode | provenance | | | test.py:54:34:54:45 | ControlFlowNode for home_address | test.py:57:15:57:26 | ControlFlowNode for home_address | provenance | | | test.py:59:14:59:26 | ControlFlowNode for user_latitude | test.py:60:15:60:27 | ControlFlowNode for user_latitude | provenance | | | test.py:59:29:59:42 | ControlFlowNode for user_longitude | test.py:61:15:61:28 | ControlFlowNode for user_longitude | provenance | | @@ -20,8 +22,6 @@ edges | test.py:67:38:67:48 | ControlFlowNode for bank_number | test.py:70:15:70:25 | ControlFlowNode for bank_number | provenance | | | test.py:67:76:67:78 | ControlFlowNode for ccn | test.py:73:15:73:17 | ControlFlowNode for ccn | provenance | | | test.py:67:81:67:88 | ControlFlowNode for user_ccn | test.py:74:15:74:22 | ControlFlowNode for user_ccn | provenance | | -| test.py:101:5:101:10 | ControlFlowNode for config | test.py:105:11:105:31 | ControlFlowNode for Subscript | provenance | | -| test.py:103:21:103:37 | ControlFlowNode for Attribute | test.py:101:5:101:10 | ControlFlowNode for config | provenance | | nodes | test.py:19:5:19:12 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | | test.py:19:16:19:29 | ControlFlowNode for get_password() | semmle.label | ControlFlowNode for get_password() | @@ -42,7 +42,11 @@ nodes | test.py:49:15:49:36 | ControlFlowNode for social_security_number | semmle.label | ControlFlowNode for social_security_number | | test.py:50:15:50:17 | ControlFlowNode for ssn | semmle.label | ControlFlowNode for ssn | | test.py:52:15:52:24 | ControlFlowNode for passportNo | semmle.label | ControlFlowNode for passportNo | +| test.py:54:14:54:22 | ControlFlowNode for post_code | semmle.label | ControlFlowNode for post_code | +| test.py:54:25:54:31 | ControlFlowNode for zipCode | semmle.label | ControlFlowNode for zipCode | | test.py:54:34:54:45 | ControlFlowNode for home_address | semmle.label | ControlFlowNode for home_address | +| test.py:55:15:55:23 | ControlFlowNode for post_code | semmle.label | ControlFlowNode for post_code | +| test.py:56:15:56:21 | ControlFlowNode for zipCode | semmle.label | ControlFlowNode for zipCode | | test.py:57:15:57:26 | ControlFlowNode for home_address | semmle.label | ControlFlowNode for home_address | | test.py:59:14:59:26 | ControlFlowNode for user_latitude | semmle.label | ControlFlowNode for user_latitude | | test.py:59:29:59:42 | ControlFlowNode for user_longitude | semmle.label | ControlFlowNode for user_longitude | @@ -62,9 +66,6 @@ nodes | test.py:70:15:70:25 | ControlFlowNode for bank_number | semmle.label | ControlFlowNode for bank_number | | test.py:73:15:73:17 | ControlFlowNode for ccn | semmle.label | ControlFlowNode for ccn | | test.py:74:15:74:22 | ControlFlowNode for user_ccn | semmle.label | ControlFlowNode for user_ccn | -| test.py:101:5:101:10 | ControlFlowNode for config | semmle.label | ControlFlowNode for config | -| test.py:103:21:103:37 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:105:11:105:31 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | subpaths #select | test.py:20:48:20:55 | ControlFlowNode for password | test.py:19:16:19:29 | ControlFlowNode for get_password() | test.py:20:48:20:55 | ControlFlowNode for password | This expression logs $@ as clear text. | test.py:19:16:19:29 | ControlFlowNode for get_password() | sensitive data (password) | @@ -79,6 +80,8 @@ subpaths | test.py:49:15:49:36 | ControlFlowNode for social_security_number | test.py:48:14:48:35 | ControlFlowNode for social_security_number | test.py:49:15:49:36 | ControlFlowNode for social_security_number | This expression logs $@ as clear text. | test.py:48:14:48:35 | ControlFlowNode for social_security_number | sensitive data (private) | | test.py:50:15:50:17 | ControlFlowNode for ssn | test.py:48:38:48:40 | ControlFlowNode for ssn | test.py:50:15:50:17 | ControlFlowNode for ssn | This expression logs $@ as clear text. | test.py:48:38:48:40 | ControlFlowNode for ssn | sensitive data (private) | | test.py:52:15:52:24 | ControlFlowNode for passportNo | test.py:48:54:48:63 | ControlFlowNode for passportNo | test.py:52:15:52:24 | ControlFlowNode for passportNo | This expression logs $@ as clear text. | test.py:48:54:48:63 | ControlFlowNode for passportNo | sensitive data (private) | +| test.py:55:15:55:23 | ControlFlowNode for post_code | test.py:54:14:54:22 | ControlFlowNode for post_code | test.py:55:15:55:23 | ControlFlowNode for post_code | This expression logs $@ as clear text. | test.py:54:14:54:22 | ControlFlowNode for post_code | sensitive data (private) | +| test.py:56:15:56:21 | ControlFlowNode for zipCode | test.py:54:25:54:31 | ControlFlowNode for zipCode | test.py:56:15:56:21 | ControlFlowNode for zipCode | This expression logs $@ as clear text. | test.py:54:25:54:31 | ControlFlowNode for zipCode | sensitive data (private) | | test.py:57:15:57:26 | ControlFlowNode for home_address | test.py:54:34:54:45 | ControlFlowNode for home_address | test.py:57:15:57:26 | ControlFlowNode for home_address | This expression logs $@ as clear text. | test.py:54:34:54:45 | ControlFlowNode for home_address | sensitive data (private) | | test.py:60:15:60:27 | ControlFlowNode for user_latitude | test.py:59:14:59:26 | ControlFlowNode for user_latitude | test.py:60:15:60:27 | ControlFlowNode for user_latitude | This expression logs $@ as clear text. | test.py:59:14:59:26 | ControlFlowNode for user_latitude | sensitive data (private) | | test.py:61:15:61:28 | ControlFlowNode for user_longitude | test.py:59:29:59:42 | ControlFlowNode for user_longitude | test.py:61:15:61:28 | ControlFlowNode for user_longitude | This expression logs $@ as clear text. | test.py:59:29:59:42 | ControlFlowNode for user_longitude | sensitive data (private) | @@ -89,4 +92,3 @@ subpaths | test.py:70:15:70:25 | ControlFlowNode for bank_number | test.py:67:38:67:48 | ControlFlowNode for bank_number | test.py:70:15:70:25 | ControlFlowNode for bank_number | This expression logs $@ as clear text. | test.py:67:38:67:48 | ControlFlowNode for bank_number | sensitive data (private) | | test.py:73:15:73:17 | ControlFlowNode for ccn | test.py:67:76:67:78 | ControlFlowNode for ccn | test.py:73:15:73:17 | ControlFlowNode for ccn | This expression logs $@ as clear text. | test.py:67:76:67:78 | ControlFlowNode for ccn | sensitive data (private) | | test.py:74:15:74:22 | ControlFlowNode for user_ccn | test.py:67:81:67:88 | ControlFlowNode for user_ccn | test.py:74:15:74:22 | ControlFlowNode for user_ccn | This expression logs $@ as clear text. | test.py:67:81:67:88 | ControlFlowNode for user_ccn | sensitive data (private) | -| test.py:105:11:105:31 | ControlFlowNode for Subscript | test.py:103:21:103:37 | ControlFlowNode for Attribute | test.py:105:11:105:31 | ControlFlowNode for Subscript | This expression logs $@ as clear text. | test.py:103:21:103:37 | ControlFlowNode for Attribute | sensitive data (password) | diff --git a/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/test.py b/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/test.py index d8d70c56bd57..ff01680ed81c 100644 --- a/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/test.py +++ b/python/ql/test/query-tests/Security/CWE-312-CleartextLogging/test.py @@ -52,8 +52,8 @@ def log1(social_security_number, ssn, className, passportNo): print(passportNo) # NOT OK def log2(post_code, zipCode, home_address): - print(post_code) # NOT OK, but NOT FOUND - "code" is treated as encrypted and thus not sensitive - print(zipCode) # NOT OK, but NOT FOUND - "code" is treated as encrypted and thus not sensitive + print(post_code) # NOT OK + print(zipCode) # NOT OK print(home_address) # NOT OK def log3(user_latitude, user_longitude): diff --git a/python/ql/test/query-tests/Security/CWE-312-CleartextStorage/CleartextStorage.expected b/python/ql/test/query-tests/Security/CWE-312-CleartextStorage/CleartextStorage.expected index c3c1206ce927..ea41c1ba6516 100644 --- a/python/ql/test/query-tests/Security/CWE-312-CleartextStorage/CleartextStorage.expected +++ b/python/ql/test/query-tests/Security/CWE-312-CleartextStorage/CleartextStorage.expected @@ -4,9 +4,11 @@ edges | password_in_cookie.py:14:5:14:12 | ControlFlowNode for password | password_in_cookie.py:16:33:16:40 | ControlFlowNode for password | provenance | | | password_in_cookie.py:14:16:14:43 | ControlFlowNode for Attribute() | password_in_cookie.py:14:5:14:12 | ControlFlowNode for password | provenance | | | test.py:15:5:15:12 | ControlFlowNode for password | test.py:17:20:17:27 | ControlFlowNode for password | provenance | | -| test.py:15:5:15:12 | ControlFlowNode for password | test.py:18:9:18:13 | ControlFlowNode for lines | provenance | | +| test.py:15:5:15:12 | ControlFlowNode for password | test.py:18:18:18:32 | ControlFlowNode for BinaryExpr | provenance | | | test.py:15:16:15:29 | ControlFlowNode for get_password() | test.py:15:5:15:12 | ControlFlowNode for password | provenance | | -| test.py:18:9:18:13 | ControlFlowNode for lines | test.py:19:25:19:29 | ControlFlowNode for lines | provenance | | +| test.py:18:9:18:13 | ControlFlowNode for lines [List element] | test.py:19:25:19:29 | ControlFlowNode for lines | provenance | | +| test.py:18:17:18:33 | ControlFlowNode for List [List element] | test.py:18:9:18:13 | ControlFlowNode for lines [List element] | provenance | | +| test.py:18:18:18:32 | ControlFlowNode for BinaryExpr | test.py:18:17:18:33 | ControlFlowNode for List [List element] | provenance | | nodes | password_in_cookie.py:7:5:7:12 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | | password_in_cookie.py:7:16:7:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | @@ -17,7 +19,9 @@ nodes | test.py:15:5:15:12 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | | test.py:15:16:15:29 | ControlFlowNode for get_password() | semmle.label | ControlFlowNode for get_password() | | test.py:17:20:17:27 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | -| test.py:18:9:18:13 | ControlFlowNode for lines | semmle.label | ControlFlowNode for lines | +| test.py:18:9:18:13 | ControlFlowNode for lines [List element] | semmle.label | ControlFlowNode for lines [List element] | +| test.py:18:17:18:33 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] | +| test.py:18:18:18:32 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | | test.py:19:25:19:29 | ControlFlowNode for lines | semmle.label | ControlFlowNode for lines | subpaths #select diff --git a/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected b/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected index 0b8756071573..a8d907793129 100644 --- a/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected +++ b/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected @@ -82,14 +82,19 @@ edges | full_partial_test.py:61:5:61:7 | ControlFlowNode for url | full_partial_test.py:63:18:63:20 | ControlFlowNode for url | provenance | | | full_partial_test.py:66:5:66:14 | ControlFlowNode for user_input | full_partial_test.py:70:5:70:7 | ControlFlowNode for url | provenance | | | full_partial_test.py:66:5:66:14 | ControlFlowNode for user_input | full_partial_test.py:74:5:74:7 | ControlFlowNode for url | provenance | | -| full_partial_test.py:66:5:66:14 | ControlFlowNode for user_input | full_partial_test.py:78:5:78:7 | ControlFlowNode for url | provenance | | +| full_partial_test.py:66:5:66:14 | ControlFlowNode for user_input | full_partial_test.py:78:38:78:47 | ControlFlowNode for user_input | provenance | | | full_partial_test.py:66:18:66:24 | ControlFlowNode for request | full_partial_test.py:66:5:66:14 | ControlFlowNode for user_input | provenance | AdditionalTaintStep | | full_partial_test.py:66:18:66:24 | ControlFlowNode for request | full_partial_test.py:67:5:67:13 | ControlFlowNode for query_val | provenance | AdditionalTaintStep | -| full_partial_test.py:67:5:67:13 | ControlFlowNode for query_val | full_partial_test.py:78:5:78:7 | ControlFlowNode for url | provenance | | +| full_partial_test.py:67:5:67:13 | ControlFlowNode for query_val | full_partial_test.py:78:50:78:58 | ControlFlowNode for query_val | provenance | | | full_partial_test.py:67:17:67:23 | ControlFlowNode for request | full_partial_test.py:67:5:67:13 | ControlFlowNode for query_val | provenance | AdditionalTaintStep | | full_partial_test.py:70:5:70:7 | ControlFlowNode for url | full_partial_test.py:72:18:72:20 | ControlFlowNode for url | provenance | | | full_partial_test.py:74:5:74:7 | ControlFlowNode for url | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | provenance | | | full_partial_test.py:78:5:78:7 | ControlFlowNode for url | full_partial_test.py:80:18:80:20 | ControlFlowNode for url | provenance | | +| full_partial_test.py:78:11:78:59 | ControlFlowNode for BinaryExpr | full_partial_test.py:78:5:78:7 | ControlFlowNode for url | provenance | | +| full_partial_test.py:78:38:78:47 | ControlFlowNode for user_input | full_partial_test.py:78:38:78:58 | ControlFlowNode for Tuple [Tuple element at index 0] | provenance | | +| full_partial_test.py:78:38:78:58 | ControlFlowNode for Tuple [Tuple element at index 0] | full_partial_test.py:78:11:78:59 | ControlFlowNode for BinaryExpr | provenance | | +| full_partial_test.py:78:38:78:58 | ControlFlowNode for Tuple [Tuple element at index 1] | full_partial_test.py:78:11:78:59 | ControlFlowNode for BinaryExpr | provenance | | +| full_partial_test.py:78:50:78:58 | ControlFlowNode for query_val | full_partial_test.py:78:38:78:58 | ControlFlowNode for Tuple [Tuple element at index 1] | provenance | | | full_partial_test.py:83:5:83:14 | ControlFlowNode for user_input | full_partial_test.py:87:5:87:7 | ControlFlowNode for url | provenance | | | full_partial_test.py:83:5:83:14 | ControlFlowNode for user_input | full_partial_test.py:91:5:91:7 | ControlFlowNode for url | provenance | | | full_partial_test.py:83:5:83:14 | ControlFlowNode for user_input | full_partial_test.py:95:5:95:7 | ControlFlowNode for url | provenance | | @@ -274,6 +279,11 @@ nodes | full_partial_test.py:74:5:74:7 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:78:5:78:7 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | +| full_partial_test.py:78:11:78:59 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | +| full_partial_test.py:78:38:78:47 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | +| full_partial_test.py:78:38:78:58 | ControlFlowNode for Tuple [Tuple element at index 0] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 0] | +| full_partial_test.py:78:38:78:58 | ControlFlowNode for Tuple [Tuple element at index 1] | semmle.label | ControlFlowNode for Tuple [Tuple element at index 1] | +| full_partial_test.py:78:50:78:58 | ControlFlowNode for query_val | semmle.label | ControlFlowNode for query_val | | full_partial_test.py:80:18:80:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:83:5:83:14 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | | full_partial_test.py:83:18:83:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | diff --git a/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/NoSqlInjection.expected b/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/NoSqlInjection.expected index 810ece4f1074..fad6762e0f61 100644 --- a/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/NoSqlInjection.expected +++ b/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/NoSqlInjection.expected @@ -7,25 +7,34 @@ edges | PoC/server.py:1:26:1:32 | ControlFlowNode for request | PoC/server.py:98:14:98:20 | ControlFlowNode for request | provenance | | | PoC/server.py:26:5:26:17 | ControlFlowNode for author_string | PoC/server.py:27:25:27:37 | ControlFlowNode for author_string | provenance | | | PoC/server.py:26:21:26:27 | ControlFlowNode for request | PoC/server.py:26:5:26:17 | ControlFlowNode for author_string | provenance | AdditionalTaintStep | -| PoC/server.py:27:5:27:10 | ControlFlowNode for author | PoC/server.py:30:27:30:44 | ControlFlowNode for Dict | provenance | | -| PoC/server.py:27:5:27:10 | ControlFlowNode for author | PoC/server.py:31:34:31:51 | ControlFlowNode for Dict | provenance | | +| PoC/server.py:27:5:27:10 | ControlFlowNode for author | PoC/server.py:30:38:30:43 | ControlFlowNode for author | provenance | | +| PoC/server.py:27:5:27:10 | ControlFlowNode for author | PoC/server.py:31:45:31:50 | ControlFlowNode for author | provenance | | | PoC/server.py:27:14:27:38 | ControlFlowNode for Attribute() | PoC/server.py:27:5:27:10 | ControlFlowNode for author | provenance | | | PoC/server.py:27:25:27:37 | ControlFlowNode for author_string | PoC/server.py:27:14:27:38 | ControlFlowNode for Attribute() | provenance | Config | +| PoC/server.py:30:38:30:43 | ControlFlowNode for author | PoC/server.py:30:27:30:44 | ControlFlowNode for Dict | provenance | | +| PoC/server.py:31:45:31:50 | ControlFlowNode for author | PoC/server.py:31:34:31:51 | ControlFlowNode for Dict | provenance | | | PoC/server.py:43:5:43:10 | ControlFlowNode for author | PoC/server.py:47:38:47:67 | ControlFlowNode for BinaryExpr | provenance | | | PoC/server.py:43:14:43:20 | ControlFlowNode for request | PoC/server.py:43:5:43:10 | ControlFlowNode for author | provenance | AdditionalTaintStep | | PoC/server.py:47:38:47:67 | ControlFlowNode for BinaryExpr | PoC/server.py:47:27:47:68 | ControlFlowNode for Dict | provenance | Config | | PoC/server.py:52:5:52:10 | ControlFlowNode for author | PoC/server.py:54:17:54:70 | ControlFlowNode for BinaryExpr | provenance | | | PoC/server.py:52:14:52:20 | ControlFlowNode for request | PoC/server.py:52:5:52:10 | ControlFlowNode for author | provenance | AdditionalTaintStep | -| PoC/server.py:53:5:53:10 | ControlFlowNode for search | PoC/server.py:61:27:61:58 | ControlFlowNode for Dict | provenance | | +| PoC/server.py:53:5:53:10 | ControlFlowNode for search | PoC/server.py:61:51:61:56 | ControlFlowNode for search | provenance | | | PoC/server.py:53:14:57:5 | ControlFlowNode for Dict | PoC/server.py:53:5:53:10 | ControlFlowNode for search | provenance | | | PoC/server.py:54:17:54:70 | ControlFlowNode for BinaryExpr | PoC/server.py:53:14:57:5 | ControlFlowNode for Dict | provenance | Config | +| PoC/server.py:61:37:61:57 | ControlFlowNode for Dict [Dictionary element at key $function] | PoC/server.py:61:27:61:58 | ControlFlowNode for Dict | provenance | | +| PoC/server.py:61:51:61:56 | ControlFlowNode for search | PoC/server.py:61:37:61:57 | ControlFlowNode for Dict [Dictionary element at key $function] | provenance | | | PoC/server.py:77:5:77:10 | ControlFlowNode for author | PoC/server.py:80:23:80:101 | ControlFlowNode for BinaryExpr | provenance | | | PoC/server.py:77:14:77:20 | ControlFlowNode for request | PoC/server.py:77:5:77:10 | ControlFlowNode for author | provenance | AdditionalTaintStep | -| PoC/server.py:78:5:78:15 | ControlFlowNode for accumulator | PoC/server.py:84:5:84:9 | ControlFlowNode for group | provenance | | +| PoC/server.py:78:5:78:15 | ControlFlowNode for accumulator | PoC/server.py:86:37:86:47 | ControlFlowNode for accumulator | provenance | | | PoC/server.py:78:19:83:5 | ControlFlowNode for Dict | PoC/server.py:78:5:78:15 | ControlFlowNode for accumulator | provenance | | | PoC/server.py:80:23:80:101 | ControlFlowNode for BinaryExpr | PoC/server.py:78:19:83:5 | ControlFlowNode for Dict | provenance | Config | -| PoC/server.py:84:5:84:9 | ControlFlowNode for group | PoC/server.py:91:29:91:47 | ControlFlowNode for Dict | provenance | | -| PoC/server.py:84:5:84:9 | ControlFlowNode for group | PoC/server.py:92:38:92:56 | ControlFlowNode for Dict | provenance | | +| PoC/server.py:84:5:84:9 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | PoC/server.py:91:41:91:45 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | provenance | | +| PoC/server.py:84:5:84:9 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | PoC/server.py:92:50:92:54 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | provenance | | +| PoC/server.py:84:13:87:5 | ControlFlowNode for Dict [Dictionary element at key author, Dictionary element at key $accumulator] | PoC/server.py:84:5:84:9 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | provenance | | +| PoC/server.py:86:19:86:49 | ControlFlowNode for Dict [Dictionary element at key $accumulator] | PoC/server.py:84:13:87:5 | ControlFlowNode for Dict [Dictionary element at key author, Dictionary element at key $accumulator] | provenance | | +| PoC/server.py:86:37:86:47 | ControlFlowNode for accumulator | PoC/server.py:86:19:86:49 | ControlFlowNode for Dict [Dictionary element at key $accumulator] | provenance | | +| PoC/server.py:91:41:91:45 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | PoC/server.py:91:29:91:47 | ControlFlowNode for Dict | provenance | | +| PoC/server.py:92:50:92:54 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | PoC/server.py:92:38:92:56 | ControlFlowNode for Dict | provenance | | | PoC/server.py:98:5:98:10 | ControlFlowNode for author | PoC/server.py:99:5:99:10 | ControlFlowNode for mapper | provenance | | | PoC/server.py:98:14:98:20 | ControlFlowNode for request | PoC/server.py:98:5:98:10 | ControlFlowNode for author | provenance | AdditionalTaintStep | | PoC/server.py:99:5:99:10 | ControlFlowNode for mapper | PoC/server.py:102:9:102:14 | ControlFlowNode for mapper | provenance | | @@ -39,16 +48,18 @@ edges | flask_mongoengine_bad.py:20:30:20:42 | ControlFlowNode for unsafe_search | flask_mongoengine_bad.py:20:19:20:43 | ControlFlowNode for Attribute() | provenance | Config | | flask_mongoengine_bad.py:26:5:26:17 | ControlFlowNode for unsafe_search | flask_mongoengine_bad.py:27:30:27:42 | ControlFlowNode for unsafe_search | provenance | | | flask_mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | flask_mongoengine_bad.py:26:5:26:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| flask_mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | provenance | | +| flask_mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | flask_mongoengine_bad.py:30:48:30:58 | ControlFlowNode for json_search | provenance | | | flask_mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | flask_mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | provenance | | | flask_mongoengine_bad.py:27:30:27:42 | ControlFlowNode for unsafe_search | flask_mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | provenance | Config | +| flask_mongoengine_bad.py:30:48:30:58 | ControlFlowNode for json_search | flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | provenance | | | flask_pymongo_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | flask_pymongo_bad.py:1:26:1:32 | ControlFlowNode for request | provenance | | | flask_pymongo_bad.py:1:26:1:32 | ControlFlowNode for request | flask_pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | provenance | | | flask_pymongo_bad.py:11:5:11:17 | ControlFlowNode for unsafe_search | flask_pymongo_bad.py:12:30:12:42 | ControlFlowNode for unsafe_search | provenance | | | flask_pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | flask_pymongo_bad.py:11:5:11:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| flask_pymongo_bad.py:12:5:12:15 | ControlFlowNode for json_search | flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | provenance | | +| flask_pymongo_bad.py:12:5:12:15 | ControlFlowNode for json_search | flask_pymongo_bad.py:14:40:14:50 | ControlFlowNode for json_search | provenance | | | flask_pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | flask_pymongo_bad.py:12:5:12:15 | ControlFlowNode for json_search | provenance | | | flask_pymongo_bad.py:12:30:12:42 | ControlFlowNode for unsafe_search | flask_pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | provenance | Config | +| flask_pymongo_bad.py:14:40:14:50 | ControlFlowNode for json_search | flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | provenance | | | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for request | provenance | | | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for request | mongoengine_bad.py:18:21:18:27 | ControlFlowNode for request | provenance | | | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for request | mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | provenance | | @@ -58,24 +69,28 @@ edges | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for request | mongoengine_bad.py:57:21:57:27 | ControlFlowNode for request | provenance | | | mongoengine_bad.py:18:5:18:17 | ControlFlowNode for unsafe_search | mongoengine_bad.py:19:30:19:42 | ControlFlowNode for unsafe_search | provenance | | | mongoengine_bad.py:18:21:18:27 | ControlFlowNode for request | mongoengine_bad.py:18:5:18:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| mongoengine_bad.py:19:5:19:15 | ControlFlowNode for json_search | mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | provenance | | +| mongoengine_bad.py:19:5:19:15 | ControlFlowNode for json_search | mongoengine_bad.py:22:35:22:45 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:19:19:19:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:19:5:19:15 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:19:30:19:42 | ControlFlowNode for unsafe_search | mongoengine_bad.py:19:19:19:43 | ControlFlowNode for Attribute() | provenance | Config | +| mongoengine_bad.py:22:35:22:45 | ControlFlowNode for json_search | mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | provenance | | | mongoengine_bad.py:26:5:26:17 | ControlFlowNode for unsafe_search | mongoengine_bad.py:27:30:27:42 | ControlFlowNode for unsafe_search | provenance | | | mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | mongoengine_bad.py:26:5:26:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | provenance | | +| mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | mongoengine_bad.py:30:35:30:45 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:27:30:27:42 | ControlFlowNode for unsafe_search | mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | provenance | Config | +| mongoengine_bad.py:30:35:30:45 | ControlFlowNode for json_search | mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | provenance | | | mongoengine_bad.py:34:5:34:17 | ControlFlowNode for unsafe_search | mongoengine_bad.py:35:30:35:42 | ControlFlowNode for unsafe_search | provenance | | | mongoengine_bad.py:34:21:34:27 | ControlFlowNode for request | mongoengine_bad.py:34:5:34:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| mongoengine_bad.py:35:5:35:15 | ControlFlowNode for json_search | mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | provenance | | +| mongoengine_bad.py:35:5:35:15 | ControlFlowNode for json_search | mongoengine_bad.py:38:35:38:45 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:35:19:35:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:35:5:35:15 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:35:30:35:42 | ControlFlowNode for unsafe_search | mongoengine_bad.py:35:19:35:43 | ControlFlowNode for Attribute() | provenance | Config | +| mongoengine_bad.py:38:35:38:45 | ControlFlowNode for json_search | mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | provenance | | | mongoengine_bad.py:42:5:42:17 | ControlFlowNode for unsafe_search | mongoengine_bad.py:43:30:43:42 | ControlFlowNode for unsafe_search | provenance | | | mongoengine_bad.py:42:21:42:27 | ControlFlowNode for request | mongoengine_bad.py:42:5:42:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| mongoengine_bad.py:43:5:43:15 | ControlFlowNode for json_search | mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | provenance | | +| mongoengine_bad.py:43:5:43:15 | ControlFlowNode for json_search | mongoengine_bad.py:46:35:46:45 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:43:19:43:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:43:5:43:15 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:43:30:43:42 | ControlFlowNode for unsafe_search | mongoengine_bad.py:43:19:43:43 | ControlFlowNode for Attribute() | provenance | Config | +| mongoengine_bad.py:46:35:46:45 | ControlFlowNode for json_search | mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | provenance | | | mongoengine_bad.py:50:5:50:17 | ControlFlowNode for unsafe_search | mongoengine_bad.py:51:30:51:42 | ControlFlowNode for unsafe_search | provenance | | | mongoengine_bad.py:50:21:50:27 | ControlFlowNode for request | mongoengine_bad.py:50:5:50:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | | mongoengine_bad.py:51:5:51:15 | ControlFlowNode for json_search | mongoengine_bad.py:53:34:53:44 | ControlFlowNode for json_search | provenance | | @@ -83,9 +98,10 @@ edges | mongoengine_bad.py:51:30:51:42 | ControlFlowNode for unsafe_search | mongoengine_bad.py:51:19:51:43 | ControlFlowNode for Attribute() | provenance | Config | | mongoengine_bad.py:57:5:57:17 | ControlFlowNode for unsafe_search | mongoengine_bad.py:58:30:58:42 | ControlFlowNode for unsafe_search | provenance | | | mongoengine_bad.py:57:21:57:27 | ControlFlowNode for request | mongoengine_bad.py:57:5:57:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| mongoengine_bad.py:58:5:58:15 | ControlFlowNode for json_search | mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | provenance | | +| mongoengine_bad.py:58:5:58:15 | ControlFlowNode for json_search | mongoengine_bad.py:61:38:61:48 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:58:19:58:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:58:5:58:15 | ControlFlowNode for json_search | provenance | | | mongoengine_bad.py:58:30:58:42 | ControlFlowNode for unsafe_search | mongoengine_bad.py:58:19:58:43 | ControlFlowNode for Attribute() | provenance | Config | +| mongoengine_bad.py:61:38:61:48 | ControlFlowNode for json_search | mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | provenance | | | pymongo_test.py:1:26:1:32 | ControlFlowNode for ImportMember | pymongo_test.py:1:26:1:32 | ControlFlowNode for request | provenance | | | pymongo_test.py:1:26:1:32 | ControlFlowNode for request | pymongo_test.py:12:21:12:27 | ControlFlowNode for request | provenance | | | pymongo_test.py:1:26:1:32 | ControlFlowNode for request | pymongo_test.py:29:27:29:33 | ControlFlowNode for request | provenance | | @@ -93,9 +109,10 @@ edges | pymongo_test.py:1:26:1:32 | ControlFlowNode for request | pymongo_test.py:52:26:52:32 | ControlFlowNode for request | provenance | | | pymongo_test.py:12:5:12:17 | ControlFlowNode for unsafe_search | pymongo_test.py:13:30:13:42 | ControlFlowNode for unsafe_search | provenance | | | pymongo_test.py:12:21:12:27 | ControlFlowNode for request | pymongo_test.py:12:5:12:17 | ControlFlowNode for unsafe_search | provenance | AdditionalTaintStep | -| pymongo_test.py:13:5:13:15 | ControlFlowNode for json_search | pymongo_test.py:15:42:15:62 | ControlFlowNode for Dict | provenance | | +| pymongo_test.py:13:5:13:15 | ControlFlowNode for json_search | pymongo_test.py:15:51:15:61 | ControlFlowNode for json_search | provenance | | | pymongo_test.py:13:19:13:43 | ControlFlowNode for Attribute() | pymongo_test.py:13:5:13:15 | ControlFlowNode for json_search | provenance | | | pymongo_test.py:13:30:13:42 | ControlFlowNode for unsafe_search | pymongo_test.py:13:19:13:43 | ControlFlowNode for Attribute() | provenance | Config | +| pymongo_test.py:15:51:15:61 | ControlFlowNode for json_search | pymongo_test.py:15:42:15:62 | ControlFlowNode for Dict | provenance | | | pymongo_test.py:29:5:29:12 | ControlFlowNode for event_id | pymongo_test.py:33:45:33:72 | ControlFlowNode for Fstring | provenance | | | pymongo_test.py:29:16:29:51 | ControlFlowNode for Attribute() | pymongo_test.py:29:5:29:12 | ControlFlowNode for event_id | provenance | | | pymongo_test.py:29:27:29:33 | ControlFlowNode for request | pymongo_test.py:29:27:29:50 | ControlFlowNode for Subscript | provenance | AdditionalTaintStep | @@ -112,13 +129,23 @@ edges | pymongo_test.py:52:15:52:50 | ControlFlowNode for Attribute() | pymongo_test.py:52:5:52:11 | ControlFlowNode for decoded | provenance | | | pymongo_test.py:52:26:52:32 | ControlFlowNode for request | pymongo_test.py:52:26:52:49 | ControlFlowNode for Subscript | provenance | AdditionalTaintStep | | pymongo_test.py:52:26:52:49 | ControlFlowNode for Subscript | pymongo_test.py:52:15:52:50 | ControlFlowNode for Attribute() | provenance | Config | -| pymongo_test.py:54:5:54:10 | ControlFlowNode for search | pymongo_test.py:59:25:59:56 | ControlFlowNode for Dict | provenance | | +| pymongo_test.py:54:5:54:10 | ControlFlowNode for search | pymongo_test.py:59:49:59:54 | ControlFlowNode for search | provenance | | +| pymongo_test.py:54:5:54:10 | ControlFlowNode for search [Dictionary element at key body] | pymongo_test.py:59:49:59:54 | ControlFlowNode for search [Dictionary element at key body] | provenance | | | pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict | pymongo_test.py:54:5:54:10 | ControlFlowNode for search | provenance | | +| pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict [Dictionary element at key body] | pymongo_test.py:54:5:54:10 | ControlFlowNode for search [Dictionary element at key body] | provenance | | | pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict | provenance | | | pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict | provenance | Decoding-NoSQL | -| pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:61:25:61:57 | ControlFlowNode for Dict | provenance | | -| pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:62:25:62:42 | ControlFlowNode for Dict | provenance | | +| pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict [Dictionary element at key body] | provenance | | +| pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:61:49:61:55 | ControlFlowNode for decoded | provenance | | +| pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:62:35:62:41 | ControlFlowNode for decoded | provenance | | | pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | pymongo_test.py:63:25:63:31 | ControlFlowNode for decoded | provenance | | +| pymongo_test.py:59:35:59:55 | ControlFlowNode for Dict [Dictionary element at key $function, Dictionary element at key body] | pymongo_test.py:59:25:59:56 | ControlFlowNode for Dict | provenance | | +| pymongo_test.py:59:35:59:55 | ControlFlowNode for Dict [Dictionary element at key $function] | pymongo_test.py:59:25:59:56 | ControlFlowNode for Dict | provenance | | +| pymongo_test.py:59:49:59:54 | ControlFlowNode for search | pymongo_test.py:59:35:59:55 | ControlFlowNode for Dict [Dictionary element at key $function] | provenance | | +| pymongo_test.py:59:49:59:54 | ControlFlowNode for search [Dictionary element at key body] | pymongo_test.py:59:35:59:55 | ControlFlowNode for Dict [Dictionary element at key $function, Dictionary element at key body] | provenance | | +| pymongo_test.py:61:35:61:56 | ControlFlowNode for Dict [Dictionary element at key $function] | pymongo_test.py:61:25:61:57 | ControlFlowNode for Dict | provenance | | +| pymongo_test.py:61:49:61:55 | ControlFlowNode for decoded | pymongo_test.py:61:35:61:56 | ControlFlowNode for Dict [Dictionary element at key $function] | provenance | | +| pymongo_test.py:62:35:62:41 | ControlFlowNode for decoded | pymongo_test.py:62:25:62:42 | ControlFlowNode for Dict | provenance | | nodes | PoC/server.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | PoC/server.py:1:26:1:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -128,7 +155,9 @@ nodes | PoC/server.py:27:14:27:38 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | PoC/server.py:27:25:27:37 | ControlFlowNode for author_string | semmle.label | ControlFlowNode for author_string | | PoC/server.py:30:27:30:44 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| PoC/server.py:30:38:30:43 | ControlFlowNode for author | semmle.label | ControlFlowNode for author | | PoC/server.py:31:34:31:51 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| PoC/server.py:31:45:31:50 | ControlFlowNode for author | semmle.label | ControlFlowNode for author | | PoC/server.py:43:5:43:10 | ControlFlowNode for author | semmle.label | ControlFlowNode for author | | PoC/server.py:43:14:43:20 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | PoC/server.py:47:27:47:68 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | @@ -139,14 +168,21 @@ nodes | PoC/server.py:53:14:57:5 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | | PoC/server.py:54:17:54:70 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | | PoC/server.py:61:27:61:58 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| PoC/server.py:61:37:61:57 | ControlFlowNode for Dict [Dictionary element at key $function] | semmle.label | ControlFlowNode for Dict [Dictionary element at key $function] | +| PoC/server.py:61:51:61:56 | ControlFlowNode for search | semmle.label | ControlFlowNode for search | | PoC/server.py:77:5:77:10 | ControlFlowNode for author | semmle.label | ControlFlowNode for author | | PoC/server.py:77:14:77:20 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | PoC/server.py:78:5:78:15 | ControlFlowNode for accumulator | semmle.label | ControlFlowNode for accumulator | | PoC/server.py:78:19:83:5 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | | PoC/server.py:80:23:80:101 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr | -| PoC/server.py:84:5:84:9 | ControlFlowNode for group | semmle.label | ControlFlowNode for group | +| PoC/server.py:84:5:84:9 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | semmle.label | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | +| PoC/server.py:84:13:87:5 | ControlFlowNode for Dict [Dictionary element at key author, Dictionary element at key $accumulator] | semmle.label | ControlFlowNode for Dict [Dictionary element at key author, Dictionary element at key $accumulator] | +| PoC/server.py:86:19:86:49 | ControlFlowNode for Dict [Dictionary element at key $accumulator] | semmle.label | ControlFlowNode for Dict [Dictionary element at key $accumulator] | +| PoC/server.py:86:37:86:47 | ControlFlowNode for accumulator | semmle.label | ControlFlowNode for accumulator | | PoC/server.py:91:29:91:47 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| PoC/server.py:91:41:91:45 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | semmle.label | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | | PoC/server.py:92:38:92:56 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| PoC/server.py:92:50:92:54 | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | semmle.label | ControlFlowNode for group [Dictionary element at key author, Dictionary element at key $accumulator] | | PoC/server.py:98:5:98:10 | ControlFlowNode for author | semmle.label | ControlFlowNode for author | | PoC/server.py:98:14:98:20 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | PoC/server.py:99:5:99:10 | ControlFlowNode for mapper | semmle.label | ControlFlowNode for mapper | @@ -165,6 +201,7 @@ nodes | flask_mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | flask_mongoengine_bad.py:27:30:27:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| flask_mongoengine_bad.py:30:48:30:58 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | flask_pymongo_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | flask_pymongo_bad.py:1:26:1:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | flask_pymongo_bad.py:11:5:11:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | @@ -173,6 +210,7 @@ nodes | flask_pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | flask_pymongo_bad.py:12:30:12:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| flask_pymongo_bad.py:14:40:14:50 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | mongoengine_bad.py:1:26:1:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | mongoengine_bad.py:18:5:18:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | @@ -181,24 +219,28 @@ nodes | mongoengine_bad.py:19:19:19:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | mongoengine_bad.py:19:30:19:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:22:35:22:45 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:26:5:26:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | mongoengine_bad.py:27:5:27:15 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | mongoengine_bad.py:27:30:27:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:30:35:30:45 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:34:5:34:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:34:21:34:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | mongoengine_bad.py:35:5:35:15 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:35:19:35:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | mongoengine_bad.py:35:30:35:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:38:35:38:45 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:42:5:42:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:42:21:42:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | mongoengine_bad.py:43:5:43:15 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:43:19:43:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | mongoengine_bad.py:43:30:43:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:46:35:46:45 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | mongoengine_bad.py:50:5:50:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:50:21:50:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | mongoengine_bad.py:51:5:51:15 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | @@ -211,6 +253,7 @@ nodes | mongoengine_bad.py:58:19:58:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | mongoengine_bad.py:58:30:58:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:61:38:61:48 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | pymongo_test.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | pymongo_test.py:1:26:1:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | pymongo_test.py:12:5:12:17 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | @@ -219,6 +262,7 @@ nodes | pymongo_test.py:13:19:13:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | pymongo_test.py:13:30:13:42 | ControlFlowNode for unsafe_search | semmle.label | ControlFlowNode for unsafe_search | | pymongo_test.py:15:42:15:62 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| pymongo_test.py:15:51:15:61 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | | pymongo_test.py:29:5:29:12 | ControlFlowNode for event_id | semmle.label | ControlFlowNode for event_id | | pymongo_test.py:29:16:29:51 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | pymongo_test.py:29:27:29:33 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -236,11 +280,20 @@ nodes | pymongo_test.py:52:26:52:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | pymongo_test.py:52:26:52:49 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | pymongo_test.py:54:5:54:10 | ControlFlowNode for search | semmle.label | ControlFlowNode for search | +| pymongo_test.py:54:5:54:10 | ControlFlowNode for search [Dictionary element at key body] | semmle.label | ControlFlowNode for search [Dictionary element at key body] | | pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| pymongo_test.py:54:14:58:5 | ControlFlowNode for Dict [Dictionary element at key body] | semmle.label | ControlFlowNode for Dict [Dictionary element at key body] | | pymongo_test.py:55:17:55:23 | ControlFlowNode for decoded | semmle.label | ControlFlowNode for decoded | | pymongo_test.py:59:25:59:56 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| pymongo_test.py:59:35:59:55 | ControlFlowNode for Dict [Dictionary element at key $function, Dictionary element at key body] | semmle.label | ControlFlowNode for Dict [Dictionary element at key $function, Dictionary element at key body] | +| pymongo_test.py:59:35:59:55 | ControlFlowNode for Dict [Dictionary element at key $function] | semmle.label | ControlFlowNode for Dict [Dictionary element at key $function] | +| pymongo_test.py:59:49:59:54 | ControlFlowNode for search | semmle.label | ControlFlowNode for search | +| pymongo_test.py:59:49:59:54 | ControlFlowNode for search [Dictionary element at key body] | semmle.label | ControlFlowNode for search [Dictionary element at key body] | | pymongo_test.py:61:25:61:57 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| pymongo_test.py:61:35:61:56 | ControlFlowNode for Dict [Dictionary element at key $function] | semmle.label | ControlFlowNode for Dict [Dictionary element at key $function] | +| pymongo_test.py:61:49:61:55 | ControlFlowNode for decoded | semmle.label | ControlFlowNode for decoded | | pymongo_test.py:62:25:62:42 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| pymongo_test.py:62:35:62:41 | ControlFlowNode for decoded | semmle.label | ControlFlowNode for decoded | | pymongo_test.py:63:25:63:31 | ControlFlowNode for decoded | semmle.label | ControlFlowNode for decoded | subpaths #select diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 6632bf162eec..ba31581cc233 100644 --- a/ql/Cargo.lock +++ b/ql/Cargo.lock @@ -17,12 +17,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -119,6 +113,8 @@ version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -130,11 +126,10 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", @@ -200,6 +195,9 @@ dependencies = [ "tracing", "tracing-subscriber", "tree-sitter", + "url", + "yeast", + "zstd", ] [[package]] @@ -265,6 +263,17 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "either" version = "1.13.0" @@ -335,6 +344,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "flate2" version = "1.1.0" @@ -345,6 +360,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + [[package]] name = "globset" version = "0.4.15" @@ -354,10 +378,16 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "heck" version = "0.5.0" @@ -366,9 +396,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "iana-time-zone" @@ -393,6 +423,119 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -405,6 +548,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.72" @@ -426,6 +578,12 @@ version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + [[package]] name = "log" version = "0.4.22" @@ -434,11 +592,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -458,12 +616,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys", ] [[package]] @@ -477,9 +634,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -492,10 +649,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] -name = "overload" -version = "0.1.1" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -503,6 +660,21 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + [[package]] name = "proc-macro2" version = "1.0.89" @@ -514,18 +686,18 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "rayon" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -533,9 +705,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -543,42 +715,27 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -623,6 +780,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -644,6 +814,12 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "streaming-iterator" version = "0.1.9" @@ -667,6 +843,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -677,11 +864,21 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -690,9 +887,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -701,9 +898,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -722,14 +919,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -746,7 +943,7 @@ checksum = "b67baf55e7e1b6806063b1e51041069c90afff16afcbbccd278d899f9d84bca4" dependencies = [ "cc", "regex", - "regex-syntax 0.8.5", + "regex-syntax", "streaming-iterator", "tree-sitter-language", ] @@ -775,6 +972,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8ddffe35a0e5eeeadf13ff7350af564c6e73993a24db62caee1822b185c2600" +[[package]] +name = "tree-sitter-python" +version = "0.23.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d065aaa27f3aaceaf60c1f0e0ac09e1cb9eb8ed28e7bcdaa52129cffc7f4b04" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-ql" version = "0.23.0" @@ -793,12 +1000,46 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-ruby" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -866,28 +1107,6 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-core" version = "0.52.0" @@ -899,9 +1118,9 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" @@ -975,3 +1194,137 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yeast" +version = "0.1.0" +dependencies = [ + "clap", + "serde", + "serde_json", + "serde_yaml", + "tree-sitter", + "tree-sitter-python", + "tree-sitter-ruby", + "yeast-macros", +] + +[[package]] +name = "yeast-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/ruby/extractor/src/extractor.rs b/ruby/extractor/src/extractor.rs index 4849f473ccbc..d418c144bfc9 100644 --- a/ruby/extractor/src/extractor.rs +++ b/ruby/extractor/src/extractor.rs @@ -94,11 +94,14 @@ pub fn run(options: Options) -> std::io::Result<()> { node_types::read_node_types_str("erb", tree_sitter_embedded_template::NODE_TYPES)?; let lines: std::io::Result> = std::io::BufReader::new(file_list).lines().collect(); let lines = lines?; + let source_root = std::env::current_dir().ok().and_then(|d| d.canonicalize().ok()); lines .par_iter() .try_for_each(|line| { let mut diagnostics_writer = diagnostics.logger(); let path = PathBuf::from(line).canonicalize()?; + let diagnostics_file_path = + file_paths::relativize_for_diagnostic(&path, source_root.as_deref()); match &overlay_changed_files { Some(changed_files) if !changed_files.contains(&path) => { // We are extracting an overlay and this file is not in the list of changes files, so we should skip it. @@ -165,7 +168,7 @@ pub fn run(options: Options) -> std::io::Result<()> { "character-decoding-error", "Character decoding error", ) - .file(&file_paths::normalize_and_transform_path(&path, path_transformer.as_ref())) + .file(&diagnostics_file_path) .message( "Could not decode the file contents as {}: {}. The contents of the file must match the character encoding specified in the {} {}.", &[ @@ -185,7 +188,7 @@ pub fn run(options: Options) -> std::io::Result<()> { diagnostics_writer.write( diagnostics_writer .new_entry("unknown-character-encoding", "Could not process some files due to an unknown character encoding") - .file(&file_paths::normalize_and_transform_path(&path, path_transformer.as_ref())) + .file(&diagnostics_file_path) .message( "Unknown character encoding {} in {} {}.", &[ diff --git a/ruby/ql/consistency-queries/CfgConsistency.ql b/ruby/ql/consistency-queries/CfgConsistency.ql index c8d797b71f4c..5af4f22fc26a 100644 --- a/ruby/ql/consistency-queries/CfgConsistency.ql +++ b/ruby/ql/consistency-queries/CfgConsistency.ql @@ -11,9 +11,7 @@ import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl query predicate nonPostOrderExpr(Expr e, string cls) { cls = e.getPrimaryQlClasses() and not exists(e.getDesugared()) and - not e instanceof BeginExpr and - not e instanceof Namespace and - not e instanceof Toplevel and + not e instanceof BodyStmt and exists(AstNode last, Completion c | CfgImpl::last(e, last, c) and last != e and @@ -27,7 +25,7 @@ query predicate scopeNoFirst(CfgScope scope) { not scope = any(Callable c | not exists(c.getAParameter()) and - not c.(BodyStmt).hasEnsure() and - not exists(c.(BodyStmt).getARescue()) + not c.getBody().hasEnsure() and + not exists(c.getBody().getARescue()) ) } diff --git a/ruby/ql/integration-tests/diagnostics/syntax-error/diagnostics.expected b/ruby/ql/integration-tests/diagnostics/syntax-error/diagnostics.expected index d9ae8e1b617c..b688f22e39ac 100644 --- a/ruby/ql/integration-tests/diagnostics/syntax-error/diagnostics.expected +++ b/ruby/ql/integration-tests/diagnostics/syntax-error/diagnostics.expected @@ -5,7 +5,7 @@ "location": { "endColumn": 5, "endLine": 1, - "file": "/bad.rb", + "file": "bad.rb", "startColumn": 4, "startLine": 1 }, @@ -28,7 +28,7 @@ "location": { "endColumn": 7, "endLine": 3, - "file": "/bad.rb", + "file": "bad.rb", "startColumn": 8, "startLine": 3 }, diff --git a/ruby/ql/integration-tests/diagnostics/unknown-encoding/diagnostics.expected b/ruby/ql/integration-tests/diagnostics/unknown-encoding/diagnostics.expected index 1c9caa49824c..2470d9304303 100644 --- a/ruby/ql/integration-tests/diagnostics/unknown-encoding/diagnostics.expected +++ b/ruby/ql/integration-tests/diagnostics/unknown-encoding/diagnostics.expected @@ -3,7 +3,7 @@ "https://docs.ruby-lang.org/en/master/syntax/comments_rdoc.html#label-encoding+Directive" ], "location": { - "file": "/encoding.rb" + "file": "encoding.rb" }, "markdownMessage": "Unknown character encoding `silly` in `#encoding:` [directive](https://docs.ruby-lang.org/en/master/syntax/comments_rdoc.html#label-encoding+Directive).", "plaintextMessage": "Unknown character encoding silly in #encoding: directive.", diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 07859d0f0e6a..d26bfa6f205a 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.2.2 + +No user-facing changes. + ## 5.2.1 No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/5.2.2.md b/ruby/ql/lib/change-notes/released/5.2.2.md new file mode 100644 index 000000000000..22402d6e8fa9 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.2.2.md @@ -0,0 +1,3 @@ +## 5.2.2 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 1684d0e72a28..e3b1b0c079d8 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.2.1 +lastReleaseVersion: 5.2.2 diff --git a/ruby/ql/lib/codeql/ruby/ast/Erb.qll b/ruby/ql/lib/codeql/ruby/ast/Erb.qll index 4def19f7ceb5..93d7d6f5e082 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Erb.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Erb.qll @@ -156,14 +156,23 @@ class ErbDirective extends TDirectiveNode, ErbAstNode { ) } + pragma[nomagic] + private Stmt getAChildStmt0() { + this.containsAstNodeStart(result) and + not this.containsAstNodeStart(result.getParent()) + } + /** * Gets a statement that starts in directive that is not a child of any other * statement starting in this directive. */ cached Stmt getAChildStmt() { + result = this.getAChildStmt0() and + not result instanceof BodyStmt + or this.containsAstNodeStart(result) and - not this.containsAstNodeStart(result.getParent()) + result = this.getAChildStmt0().(BodyStmt).getAStmt() } /** diff --git a/ruby/ql/lib/codeql/ruby/ast/Expr.qll b/ruby/ql/lib/codeql/ruby/ast/Expr.qll index e932202e53fd..a49cafa82996 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Expr.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Expr.qll @@ -167,6 +167,8 @@ class StmtSequence extends Expr, TStmtSequence { */ class BodyStmt extends StmtSequence, TBodyStmt { final override Stmt getStmt(int n) { + synthChild(this, n, result) + or toGenerated(result) = rank[n + 1](Ruby::AstNode node, int i | node = getBodyStmtChild(this, i) and diff --git a/ruby/ql/lib/codeql/ruby/ast/Method.qll b/ruby/ql/lib/codeql/ruby/ast/Method.qll index 147782e3d08d..38892da721e5 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Method.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Method.qll @@ -8,7 +8,7 @@ private import internal.TreeSitter private import internal.Method /** A callable. */ -class Callable extends StmtSequence, Expr, Scope, TCallable { +class Callable extends Expr, Scope, TCallable { /** Gets the number of parameters of this callable. */ final int getNumberOfParameters() { result = count(this.getAParameter()) } @@ -18,27 +18,26 @@ class Callable extends StmtSequence, Expr, Scope, TCallable { /** Gets the `n`th parameter of this callable. */ Parameter getParameter(int n) { none() } + /** Gets the body of this callable. */ + BodyStmt getBody() { none() } + override AstNode getAChild(string pred) { result = super.getAChild(pred) or + pred = "getBody" and result = this.getBody() + or pred = "getParameter" and result = this.getParameter(_) } } /** A method. */ -class MethodBase extends Callable, BodyStmt, Scope, TMethodBase { +class MethodBase extends Callable, Scope, TMethodBase { /** Gets the name of this method. */ string getName() { none() } /** Holds if the name of this method is `name`. */ final predicate hasName(string name) { this.getName() = name } - override AstNode getAChild(string pred) { - result = Callable.super.getAChild(pred) - or - result = BodyStmt.super.getAChild(pred) - } - /** * Holds if this method is public. * Methods are public by default. @@ -218,6 +217,10 @@ class Method extends MethodBase, TMethod { toGenerated(result) = g.getParameters().getChild(n) } + final override BodyStmt getBody() { + toGenerated(result) = g.getBody() or synthChild(this, _, result) + } + final override string toString() { result = this.getName() } overlay[global] @@ -280,6 +283,10 @@ class SingletonMethod extends MethodBase, TSingletonMethod { toGenerated(result) = g.getParameters().getChild(n) } + final override BodyStmt getBody() { + toGenerated(result) = g.getBody() or synthChild(this, _, result) + } + final override string toString() { result = this.getName() } final override AstNode getAChild(string pred) { @@ -321,7 +328,7 @@ class SingletonMethod extends MethodBase, TSingletonMethod { * -> (x) { x + 1 } * ``` */ -class Lambda extends Callable, BodyStmt, TLambda { +class Lambda extends Callable, TLambda { private Ruby::Lambda g; Lambda() { this = TLambda(g) } @@ -332,17 +339,16 @@ class Lambda extends Callable, BodyStmt, TLambda { toGenerated(result) = g.getParameters().getChild(n) } - final override string toString() { result = "-> { ... }" } - - final override AstNode getAChild(string pred) { - result = Callable.super.getAChild(pred) - or - result = BodyStmt.super.getAChild(pred) + final override BodyStmt getBody() { + toGenerated(result) = g.getBody().(Ruby::DoBlock).getBody() or + toGenerated(result) = g.getBody().(Ruby::Block).getBody() } + + final override string toString() { result = "-> { ... }" } } /** A block. */ -class Block extends Callable, StmtSequence, Scope, TBlock { +class Block extends Callable, Scope, TBlock { /** * Gets a local variable declared by this block. * For example `local` in `{ | param; local| puts param }`. @@ -355,17 +361,15 @@ class Block extends Callable, StmtSequence, Scope, TBlock { */ LocalVariableWriteAccess getLocalVariable(int n) { none() } - override AstNode getAChild(string pred) { + final override AstNode getAChild(string pred) { result = Callable.super.getAChild(pred) or - result = StmtSequence.super.getAChild(pred) - or pred = "getLocalVariable" and result = this.getLocalVariable(_) } } /** A block enclosed within `do` and `end`. */ -class DoBlock extends Block, BodyStmt, TDoBlock { +class DoBlock extends Block, TDoBlock { private Ruby::DoBlock g; DoBlock() { this = TDoBlock(g) } @@ -378,13 +382,9 @@ class DoBlock extends Block, BodyStmt, TDoBlock { toGenerated(result) = g.getParameters().getChild(n) } - final override string toString() { result = "do ... end" } + final override BodyStmt getBody() { toGenerated(result) = g.getBody() } - final override AstNode getAChild(string pred) { - result = Block.super.getAChild(pred) - or - result = BodyStmt.super.getAChild(pred) - } + final override string toString() { result = "do ... end" } final override string getAPrimaryQlClass() { result = "DoBlock" } } diff --git a/ruby/ql/lib/codeql/ruby/ast/Parameter.qll b/ruby/ql/lib/codeql/ruby/ast/Parameter.qll index 5b3994378c16..953d3f01d923 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Parameter.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Parameter.qll @@ -134,7 +134,7 @@ class BlockParameter extends NamedParameter, TBlockParameter { final override string getName() { result = g.getName().getValue() } final override LocalVariable getVariable() { - result = TLocalVariableReal(_, _, g.getName()) or + result.(LocalVariableReal).getDefiningNode() = g.getName() or result = TLocalVariableSynth(this, 0) } @@ -164,7 +164,7 @@ class HashSplatParameter extends NamedParameter, THashSplatParameter { final override string getAPrimaryQlClass() { result = "HashSplatParameter" } final override LocalVariable getVariable() { - result = TLocalVariableReal(_, _, g.getName()) or + result.(LocalVariableReal).getDefiningNode() = g.getName() or result = TLocalVariableSynth(this, 0) } @@ -212,7 +212,9 @@ class KeywordParameter extends NamedParameter, TKeywordParameter { final override string getAPrimaryQlClass() { result = "KeywordParameter" } - final override LocalVariable getVariable() { result = TLocalVariableReal(_, _, g.getName()) } + final override LocalVariable getVariable() { + result.(LocalVariableReal).getDefiningNode() = g.getName() + } /** * Gets the default value, i.e. the value assigned to the parameter when one @@ -262,7 +264,9 @@ class OptionalParameter extends NamedParameter, TOptionalParameter { */ final Expr getDefaultValue() { toGenerated(result) = g.getValue() } - final override LocalVariable getVariable() { result = TLocalVariableReal(_, _, g.getName()) } + final override LocalVariable getVariable() { + result.(LocalVariableReal).getDefiningNode() = g.getName() + } final override string toString() { result = this.getName() } @@ -293,7 +297,7 @@ class SplatParameter extends NamedParameter, TSplatParameter { final override string getAPrimaryQlClass() { result = "SplatParameter" } final override LocalVariable getVariable() { - result = TLocalVariableReal(_, _, g.getName()) or + result.(LocalVariableReal).getDefiningNode() = g.getName() or result = TLocalVariableSynth(this, 0) } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/AST.qll b/ruby/ql/lib/codeql/ruby/ast/internal/AST.qll index ee46fbe8b66a..17d4a6bb8b6b 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/AST.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/AST.qll @@ -100,9 +100,16 @@ private module Cached { } or TBlockArgument(Ruby::BlockArgument g) or TBlockParameter(Ruby::BlockParameter g) or + TBodyStatement(Ruby::BodyStatement g) { + any(Ruby::Method m).getBody() = g or + any(Ruby::SingletonMethod m).getBody() = g or + any(Ruby::DoBlock b).getBody() = g + } or + TBodyStmtSynth(Ast::AstNode parent, int i) { mkSynthChild(BodyStmtKind(), parent, i) } or TBooleanLiteralSynth(Ast::AstNode parent, int i, boolean value) { mkSynthChild(BooleanLiteralKind(value), parent, i) } or + TBraceBlockBody(Ruby::BlockBody g) or TBraceBlockSynth(Ast::AstNode parent, int i) { mkSynthChild(BraceBlockKind(), parent, i) } or TBraceBlockReal(Ruby::Block g) { not g.getParent() instanceof Ruby::Lambda } or TBreakStmt(Ruby::Break g) or @@ -200,9 +207,7 @@ private module Cached { TLambda(Ruby::Lambda g) or TLine(Ruby::Line g) or TLeftAssignmentList(Ruby::LeftAssignmentList g) or - TLocalVariableAccessReal(Ruby::Identifier g, TLocalVariableReal v) { - LocalVariableAccess::range(g, v) - } or + TLocalVariableAccessReal(Ruby::Identifier g, TLocalVariableReal v) { access(g, v) } or TLocalVariableAccessSynth(Ast::AstNode parent, int i, Ast::LocalVariable v) { mkSynthChild(LocalVariableAccessRealKind(v), parent, i) or @@ -362,23 +367,24 @@ private module Cached { TAssignMulExpr or TAssignRShiftExpr or TAssignSubExpr or TBareStringLiteral or TBareSymbolLiteral or TBeginBlock or TBeginExpr or TBitwiseAndExprReal or TBitwiseOrExprReal or TBitwiseXorExprReal or TBlockArgument or TBlockParameter or - TBraceBlockReal or TBreakStmt or TCaseEqExpr or TCaseExpr or TCaseMatchReal or - TCharacterLiteral or TClassDeclaration or TClassVariableAccessReal or TComplementExpr or - TComplexLiteral or TDefinedExprReal or TDelimitedSymbolLiteral or - TDestructuredLeftAssignment or TDestructuredParameter or TDivExprReal or TDo or TDoBlock or - TElementReference or TElseReal or TElsif or TEmptyStmt or TEncoding or TEndBlock or - TEnsure or TEqExpr or TExponentExprReal or TFalseLiteral or TFile or TFindPattern or - TFloatLiteral or TForExpr or TForwardParameter or TForwardArgument or TGEExpr or TGTExpr or - TGlobalVariableAccessReal or THashKeySymbolLiteral or THashLiteral or THashPattern or - THashSplatExprReal or THashSplatNilParameter or THashSplatParameter or THereDoc or - TIdentifierMethodCall or TIfReal or TIfModifierExpr or TInClauseReal or - TInstanceVariableAccessReal or TIntegerLiteralReal or TKeywordParameter or TLEExpr or - TLShiftExprReal or TLTExpr or TLambda or TLeftAssignmentList or TLine or - TLocalVariableAccessReal or TLogicalAndExprReal or TLogicalOrExprReal or TMethod or - TMatchPattern or TModuleDeclaration or TModuloExprReal or TMulExprReal or TNEExpr or - TNextStmt or TNilLiteralReal or TNoRegExpMatchExpr or TNotExprReal or TOptionalParameter or - TPairReal or TParenthesizedExpr or TParenthesizedPattern or TRShiftExprReal or - TRangeLiteralReal or TRationalLiteral or TRedoStmt or TRegExpLiteral or TRegExpMatchExpr or + TBodyStatement or TBraceBlockBody or TBraceBlockReal or TBreakStmt or TCaseEqExpr or + TCaseExpr or TCaseMatchReal or TCharacterLiteral or TClassDeclaration or + TClassVariableAccessReal or TComplementExpr or TComplexLiteral or TDefinedExprReal or + TDelimitedSymbolLiteral or TDestructuredLeftAssignment or TDestructuredParameter or + TDivExprReal or TDo or TDoBlock or TElementReference or TElseReal or TElsif or TEmptyStmt or + TEncoding or TEndBlock or TEnsure or TEqExpr or TExponentExprReal or TFalseLiteral or + TFile or TFindPattern or TFloatLiteral or TForExpr or TForwardParameter or + TForwardArgument or TGEExpr or TGTExpr or TGlobalVariableAccessReal or + THashKeySymbolLiteral or THashLiteral or THashPattern or THashSplatExprReal or + THashSplatNilParameter or THashSplatParameter or THereDoc or TIdentifierMethodCall or + TIfReal or TIfModifierExpr or TInClauseReal or TInstanceVariableAccessReal or + TIntegerLiteralReal or TKeywordParameter or TLEExpr or TLShiftExprReal or TLTExpr or + TLambda or TLeftAssignmentList or TLine or TLocalVariableAccessReal or + TLogicalAndExprReal or TLogicalOrExprReal or TMethod or TMatchPattern or + TModuleDeclaration or TModuloExprReal or TMulExprReal or TNEExpr or TNextStmt or + TNilLiteralReal or TNoRegExpMatchExpr or TNotExprReal or TOptionalParameter or TPairReal or + TParenthesizedExpr or TParenthesizedPattern or TRShiftExprReal or TRangeLiteralReal or + TRationalLiteral or TRedoStmt or TRegExpLiteral or TRegExpMatchExpr or TRegularArrayLiteral or TRegularMethodCall or TRegularStringLiteral or TRegularSuperCall or TRescueClause or TRescueModifierExpr or TRetryStmt or TReturnStmt or TScopeResolutionConstantAccess or TSelfReal or TSimpleParameterReal or @@ -393,13 +399,13 @@ private module Cached { class TAstNodeSynth = TAddExprSynth or TAssignExprSynth or TBitwiseAndExprSynth or TBitwiseOrExprSynth or - TBitwiseXorExprSynth or TBraceBlockSynth or TBooleanLiteralSynth or TCaseMatchSynth or - TClassVariableAccessSynth or TConstantReadAccessSynth or TConstantWriteAccessSynth or - TDivExprSynth or TElseSynth or TExponentExprSynth or TGlobalVariableAccessSynth or - TIfSynth or TInClauseSynth or TInstanceVariableAccessSynth or TIntegerLiteralSynth or - TLShiftExprSynth or TLocalVariableAccessSynth or TLogicalAndExprSynth or - TLogicalOrExprSynth or TMethodCallSynth or TModuloExprSynth or TMulExprSynth or - TNilLiteralSynth or TRShiftExprSynth or TRangeLiteralSynth or TSelfSynth or + TBitwiseXorExprSynth or TBraceBlockSynth or TBodyStmtSynth or TBooleanLiteralSynth or + TCaseMatchSynth or TClassVariableAccessSynth or TConstantReadAccessSynth or + TConstantWriteAccessSynth or TDivExprSynth or TElseSynth or TExponentExprSynth or + TGlobalVariableAccessSynth or TIfSynth or TInClauseSynth or TInstanceVariableAccessSynth or + TIntegerLiteralSynth or TLShiftExprSynth or TLocalVariableAccessSynth or + TLogicalAndExprSynth or TLogicalOrExprSynth or TMethodCallSynth or TModuloExprSynth or + TMulExprSynth or TNilLiteralSynth or TRShiftExprSynth or TRangeLiteralSynth or TSelfSynth or TSimpleParameterSynth or TSplatExprSynth or THashSplatExprSynth or TStmtSequenceSynth or TSubExprSynth or TPairSynth or TSimpleSymbolLiteralSynth; @@ -439,6 +445,8 @@ private module Cached { n = TBitwiseXorExprReal(result) or n = TBlockArgument(result) or n = TBlockParameter(result) or + n = TBodyStatement(result) or + n = TBraceBlockBody(result) or n = TBraceBlockReal(result) or n = TBreakStmt(result) or n = TCaseEqExpr(result) or @@ -584,6 +592,8 @@ private module Cached { or result = TBitwiseXorExprSynth(parent, i) or + result = TBodyStmtSynth(parent, i) + or result = TBooleanLiteralSynth(parent, i, _) or result = TBraceBlockSynth(parent, i) @@ -757,9 +767,9 @@ class TElse = TElseReal or TElseSynth; class TStmtSequence = TBeginBlock or TEndBlock or TThen or TElse or TDo or TEnsure or TStringInterpolationComponent or - TBlock or TBodyStmt or TParenthesizedExpr or TStmtSequenceSynth; + TBodyStmt or TParenthesizedExpr or TStmtSequenceSynth; -class TBodyStmt = TBeginExpr or TModuleBase or TMethod or TLambda or TDoBlock or TSingletonMethod; +class TBodyStmt = TBeginExpr or TModuleBase or TBraceBlockBody or TBodyStatement or TBodyStmtSynth; class TNilLiteral = TNilLiteralReal or TNilLiteralSynth; diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Expr.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Expr.qll index fdeec446a937..656b53eec468 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Expr.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Expr.qll @@ -14,6 +14,18 @@ class StmtSequenceSynth extends StmtSequence, TStmtSequenceSynth { final override string toString() { result = "..." } } +class BodyStatement extends BodyStmt, TBodyStatement { + final override string toString() { result = "..." } +} + +class BraceBlockBody extends BodyStmt, TBraceBlockBody { + final override string toString() { result = "..." } +} + +class BodyStmtSynth extends BodyStmt, TBodyStmtSynth { + final override string toString() { result = "..." } +} + class Then extends StmtSequence, TThen { private Ruby::Then g; @@ -64,26 +76,9 @@ class Ensure extends StmtSequence, TEnsure { // Not defined by dispatch, as it should not be exposed Ruby::AstNode getBodyStmtChild(TBodyStmt b, int i) { - exists(Ruby::Method g, Ruby::AstNode body | b = TMethod(g) and body = g.getBody() | - result = body.(Ruby::BodyStatement).getChild(i) - or - i = 0 and result = body and not body instanceof Ruby::BodyStatement - ) - or - exists(Ruby::SingletonMethod g, Ruby::AstNode body | - b = TSingletonMethod(g) and body = g.getBody() - | - result = body.(Ruby::BodyStatement).getChild(i) - or - i = 0 and result = body and not body instanceof Ruby::BodyStatement - ) - or - exists(Ruby::Lambda g | b = TLambda(g) | - result = g.getBody().(Ruby::DoBlock).getBody().getChild(i) or - result = g.getBody().(Ruby::Block).getBody().getChild(i) - ) + result = any(Ruby::BlockBody g | b = TBraceBlockBody(g)).getChild(i) or - result = any(Ruby::DoBlock g | b = TDoBlock(g)).getBody().getChild(i) + result = any(Ruby::BodyStatement g | b = TBodyStatement(g)).getChild(i) or result = any(Ruby::Program g | b = TToplevel(g)).getChild(i) and not result instanceof Ruby::BeginBlock diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Method.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Method.qll index c4dd1abbee02..fc30ec0c44f3 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Method.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Method.qll @@ -18,7 +18,7 @@ class BraceBlockReal extends BraceBlock, TBraceBlockReal { toGenerated(result) = g.getParameters().getChild(n) } - final override Stmt getStmt(int i) { toGenerated(result) = g.getBody().getChild(i) } + final override BodyStmt getBody() { toGenerated(result) = g.getBody() } } /** @@ -28,8 +28,5 @@ class BraceBlockReal extends BraceBlock, TBraceBlockReal { class BraceBlockSynth extends BraceBlock, TBraceBlockSynth { final override Parameter getParameter(int n) { synthChild(this, n, result) } - final override Stmt getStmt(int i) { - i >= 0 and - synthChild(this, i + this.getNumberOfParameters(), result) - } + final override BodyStmt getBody() { synthChild(this, _, result) } } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Parameter.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Parameter.qll index 8f07554fb0c1..94d25aee032c 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Parameter.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Parameter.qll @@ -33,7 +33,7 @@ class SimpleParameterRealImpl extends SimpleParameterImpl, TSimpleParameterReal SimpleParameterRealImpl() { this = TSimpleParameterReal(g) } - override LocalVariable getVariableImpl() { result = TLocalVariableReal(_, _, g) } + override LocalVariable getVariableImpl() { result.(LocalVariableReal).getDefiningNode() = g } override string getNameImpl() { result = g.getValue() } } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Scope.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Scope.qll index 03fe2ce43504..9b77a342d53d 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Scope.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Scope.qll @@ -118,7 +118,7 @@ private Ruby::AstNode specialParentOf(Ruby::AstNode n) { ] } -private Ruby::AstNode parentOf(Ruby::AstNode n) { +Ruby::AstNode parentOf(Ruby::AstNode n) { n = getHereDocBody(result) or result = specialParentOf(n).getParent() @@ -172,13 +172,15 @@ private module Cached { } } +import Cached + bindingset[n] pragma[inline_late] -Scope::Range scopeOf(Ruby::AstNode n) { result = Cached::scopeOfImpl(n) } +Scope::Range scopeOf(Ruby::AstNode n) { result = scopeOfImpl(n) } bindingset[n] pragma[inline_late] -Scope scopeOfInclSynth(AstNode n) { result = Cached::scopeOfInclSynthImpl(n) } +Scope scopeOfInclSynth(AstNode n) { result = scopeOfInclSynthImpl(n) } abstract class ScopeImpl extends AstNode, TScopeType { final Scope getOuterScopeImpl() { result = scopeOfInclSynth(this) } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll index f2be91a63e51..ca40a4160d29 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll @@ -19,6 +19,7 @@ newtype TSynthKind = BitwiseAndExprKind() or BitwiseOrExprKind() or BitwiseXorExprKind() or + BodyStmtKind() or BooleanLiteralKind(boolean value) { value = true or value = false } or BraceBlockKind() or CaseMatchKind() or @@ -73,6 +74,8 @@ class SynthKind extends TSynthKind { or this = BitwiseXorExprKind() and result = "BitwiseXorExprKind" or + this = BodyStmtKind() and result = "BodyStmtKind" + or this = BooleanLiteralKind(_) and result = "BooleanLiteralKind" or this = BraceBlockKind() and result = "BraceBlockKind" @@ -296,9 +299,12 @@ private predicate hasLocation(AstNode n, Location l) { private module ImplicitSelfSynthesis { pragma[nomagic] private predicate identifierMethodCallSelfSynthesis(AstNode mc, int i, Child child) { - child = SynthChild(SelfKind(TSelfVariable(scopeOf(toGenerated(mc)).getEnclosingSelfScope()))) and - mc = TIdentifierMethodCall(_) and - i = 0 + exists(SelfVariableImpl self | + self.getDeclaringScopeImpl() = scopeOf(toGenerated(mc)).getEnclosingSelfScope() and + child = SynthChild(SelfKind(self)) and + mc = TIdentifierMethodCall(_) and + i = 0 + ) } private class IdentifierMethodCallSelfSynthesis extends Synthesis { @@ -309,13 +315,14 @@ private module ImplicitSelfSynthesis { pragma[nomagic] private predicate regularMethodCallSelfSynthesis(TRegularMethodCall mc, int i, Child child) { - exists(Ruby::AstNode g | + exists(Ruby::AstNode g, SelfVariableImpl self | mc = TRegularMethodCall(g) and // If there's no explicit receiver, then the receiver is implicitly `self`. - not exists(g.(Ruby::Call).getReceiver()) - ) and - child = SynthChild(SelfKind(TSelfVariable(scopeOf(toGenerated(mc)).getEnclosingSelfScope()))) and - i = 0 + not exists(g.(Ruby::Call).getReceiver()) and + self.getDeclaringScopeImpl() = scopeOf(toGenerated(mc)).getEnclosingSelfScope() and + child = SynthChild(SelfKind(self)) and + i = 0 + ) } private class RegularMethodCallSelfSynthesis extends Synthesis { @@ -338,9 +345,10 @@ private module ImplicitSelfSynthesis { */ pragma[nomagic] private SelfKind getSelfKind(InstanceVariableAccess var) { - exists(Ruby::AstNode owner | + exists(Ruby::AstNode owner, SelfVariableImpl self | + self.getDeclaringScopeImpl() = scopeOf(owner).getEnclosingSelfScope() and owner = toGenerated(instanceVarAccessSynthParentStar(var)) and - result = SelfKind(TSelfVariable(scopeOf(owner).getEnclosingSelfScope())) + result = SelfKind(self) ) } @@ -1475,17 +1483,24 @@ private module ForLoopDesugar { i = 0 and child = SynthChild(SimpleParameterKind()) or - exists(SimpleParameter param | param = TSimpleParameterSynth(block, 0) | + // block body + parent = block and + i = 1 and + child = SynthChild(BodyStmtKind()) + or + exists(SimpleParameter param, BodyStmt body | + param = TSimpleParameterSynth(block, 0) and body = TBodyStmtSynth(block, 1) + | parent = param and i = 0 and child = SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(param, 0))) or // assignment to pattern from for loop to synth parameter - parent = block and - i = 1 and + parent = body and + i = 0 and child = SynthChild(AssignExprKind()) or - parent = TAssignExprSynth(block, 1) and + parent = TAssignExprSynth(body, 0) and ( i = 0 and child = childRef(for.getPattern()) @@ -1493,11 +1508,11 @@ private module ForLoopDesugar { i = 1 and child = SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(param, 0))) ) + or + // rest of block body + parent = body and + child = childRef(for.getBody().(Do).getStmt(i - 1)) ) - or - // rest of block body - parent = block and - child = childRef(for.getBody().(Do).getStmt(i - 2)) ) ) ) @@ -1556,20 +1571,20 @@ private module ForLoopDesugar { * { a: a } * ``` */ -private module ImplicitHashValueSynthesis { - private Ruby::AstNode keyWithoutValue(AstNode parent, int i) { +module ImplicitHashValueSynthesis { + Ruby::AstNode keyWithoutValue(Ruby::AstNode parent, int i) { exists(Ruby::KeywordPattern pair | result = pair.getKey() and - result = toGenerated(parent.(HashPattern).getKey(i)) and + result = parent.(Ruby::HashPattern).getChild(i).(Ruby::KeywordPattern).getKey() and not exists(pair.getValue()) ) or - exists(Ruby::Pair pair | - i = 0 and - result = pair.getKey() and - pair = toGenerated(parent) and - not exists(pair.getValue()) - ) + parent = + any(Ruby::Pair pair | + i = 0 and + result = pair.getKey() and + not exists(pair.getValue()) + ) } private string keyName(Ruby::AstNode key) { @@ -1579,7 +1594,7 @@ private module ImplicitHashValueSynthesis { private class ImplicitHashValueSynthesis extends Synthesis { final override predicate child(AstNode parent, int i, Child child) { - exists(Ruby::AstNode key | key = keyWithoutValue(parent, i) | + exists(Ruby::AstNode key | key = keyWithoutValue(toGenerated(parent), i) | exists(TVariableReal variable | access(key, variable) and child = SynthChild(LocalVariableAccessRealKind(variable)) @@ -1606,7 +1621,7 @@ private module ImplicitHashValueSynthesis { } final override predicate location(AstNode n, Location l) { - exists(AstNode p, int i | l = keyWithoutValue(p, i).getLocation() | + exists(AstNode p, int i | l = keyWithoutValue(toGenerated(p), i).getLocation() | n = p.(HashPattern).getValue(i) or i = 0 and n = p.(Pair).getValue() @@ -1951,3 +1966,31 @@ private module ImplicitSuperArgsSynthesis { } } } + +private module CallableBodySynthesis { + private predicate bodySynthesis(AstNode parent, int i, Child child) { + exists(TMethodBase m, Ruby::AstNode body | + body = any(Ruby::Method g | m = TMethod(g)).getBody() + or + body = any(Ruby::SingletonMethod g | m = TSingletonMethod(g)).getBody() + | + parent = m and + not body instanceof Ruby::BodyStatement and + i = 0 and + child = SynthChild(BodyStmtKind()) + or + exists(Stmt bodyStmt | + parent = TBodyStmtSynth(m, 0) and + i = 0 and + bodyStmt = fromGenerated(body) and + child = childRef(bodyStmt) + ) + ) + } + + private class CallableBodySynthesis extends Synthesis { + final override predicate child(AstNode parent, int i, Child child) { + bodySynthesis(parent, i, child) + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Variable.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Variable.qll index 7c130220a86b..6e92b54c246f 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Variable.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Variable.qll @@ -2,6 +2,7 @@ overlay[local] module; private import TreeSitter +private import codeql.namebinding.LocalNameBinding private import codeql.ruby.AST private import codeql.ruby.CFG private import codeql.ruby.ast.internal.AST @@ -94,10 +95,11 @@ predicate scopeDefinesParameterVariable( // In case of overlapping parameter names (e.g. `_`), only the first // parameter will give rise to a variable i = - min(Ruby::Identifier other | - parameterAssignment(scope, name, other, _) + min(Ruby::Identifier other, int startline, int startcolumn | + parameterAssignment(scope, name, other, _) and + other.getLocation().hasLocationInfo(_, startline, startcolumn, _, _) | - other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn() + other order by startline, startcolumn ) and parameterAssignment(scope, name, _, pos) or @@ -113,7 +115,8 @@ predicate scopeDefinesParameterVariable( ) } -pragma[nomagic] +bindingset[i] +pragma[inline_late] private string variableNameInScope(Ruby::AstNode i, Scope::Range scope) { scope = scopeOf(i) and ( @@ -137,40 +140,142 @@ private predicate scopeAssigns(Scope::Range scope, string name, Ruby::AstNode i) name = variableNameInScope(i, scope) } +private module Input implements LocalNameBindingInputSig { + predicate cacheRevRef() { exists(TVariable v) implies any() } + + class AstNode = Ruby::AstNode; + + AstNode getChild(AstNode parent, int index) { + parent = parentOf(result) and + ( + index = result.getParentIndex() + or + not exists(result.getParentIndex()) and + index = -1 + ) + } + + class Conditional extends AstNode { + Conditional() { none() } + + AstNode getCondition() { none() } + + AstNode getThen() { none() } + + AstNode getElse() { none() } + } + + class SiblingShadowingDecl extends AstNode { + SiblingShadowingDecl() { none() } + + AstNode getLhs() { none() } + + AstNode getRhs() { none() } + + AstNode getElse() { none() } + } + + predicate isTopScope(AstNode scope) { + scope instanceof Scope::Range and + not ( + scope instanceof Ruby::Block or + scope instanceof Ruby::DoBlock or + scope instanceof Ruby::Lambda + ) + } + + private Scope::Range getParentScope(Scope::Range scope) { + result = scopeOf(scope) and + not isTopScope(scope) + } + + bindingset[name, scope] + pragma[inline_late] + private predicate declInScope0(AstNode definingNode, string name, AstNode scope) { + scopeDefinesParameterVariable(scope, name, definingNode, _) or + scopeAssigns(scope, name, definingNode) + } + + predicate declInScope(AstNode definingNode, string name, AstNode scope) { + scopeDefinesParameterVariable(scope, name, definingNode, _) + or + /* + * Variables are not declared explicitly in Ruby, so we consider the _first_ assignment to + * be the declaration: + * + * ```rb + * a = 1 # declares `a` + * a = 2 # does not declare `a` + * 1.times do | x | # declares `x` + * a = 2 # does not declare `a` + * end + * ``` + */ + + scopeAssigns(scope, name, definingNode) and + not scopeDefinesParameterVariable(scope, name, _, _) and + not exists(AstNode prev, AstNode prevScope | + prevScope = getParentScope*(scope) and + declInScope0(prev, name, prevScope) and + prev.getLocation().strictlyBefore(definingNode.getLocation()) + ) + } + + predicate implicitDeclInScope(string name, AstNode scope) { + name = "self" and + scope instanceof SelfBase::Range + } + + predicate accessCand(AstNode n, string name) { + name = variableNameInScope(n, _) and + ( + explicitAssignmentNode(n, _) + or + implicitAssignmentNode(n) + or + scopeDefinesParameterVariable(_, _, n, _) + or + vcall(n) + or + n = any(Ruby::VariableReferencePattern vr).getName() + or + n = ImplicitHashValueSynthesis::keyWithoutValue(_, _) + ) + or + n instanceof Ruby::Self and + name = "self" + } +} + +private import LocalNameBinding + cached private module Cached { cached newtype TVariable = - TGlobalVariable(string name) { name = any(Ruby::GlobalVariable var).getValue() } or + TGlobalVariable(string name) { + CachedStage::ref() and + name = any(Ruby::GlobalVariable var).getValue() + } or TClassVariable(Scope::Range scope, string name, Ruby::AstNode decl) { decl = - min(Ruby::ClassVariable other | - classVariableAccess(other, name, scope) + min(Ruby::ClassVariable other, int startline, int startcolumn | + classVariableAccess(other, name, scope) and + other.getLocation().hasLocationInfo(_, startline, startcolumn, _, _) | - other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn() + other order by startline, startcolumn ) } or TInstanceVariable(Scope::Range scope, string name, boolean instance, Ruby::AstNode decl) { decl = - min(Ruby::InstanceVariable other | - instanceVariableAccess(other, name, scope, instance) + min(Ruby::InstanceVariable other, int startline, int startcolumn | + instanceVariableAccess(other, name, scope, instance) and + other.getLocation().hasLocationInfo(_, startline, startcolumn, _, _) | - other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn() + other order by startline, startcolumn ) } or - TLocalVariableReal(Scope::Range scope, string name, Ruby::AstNode i) { - scopeDefinesParameterVariable(scope, name, i, _) - or - i = - min(Ruby::AstNode other | - scopeAssigns(scope, name, other) - | - other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn() - ) and - not scopeDefinesParameterVariable(scope, name, _, _) and - not inherits(scope, name, _) - } or - TSelfVariable(SelfBase::Range scope) or + TLocalVariableReal(Local l) or TLocalVariableSynth(AstNode n, int i) { any(Synthesis s).localVariable(n, i) } // Db types that can be vcalls @@ -321,39 +426,37 @@ private module Cached { i = any(Ruby::ExpressionReferencePattern x).getValue() } - pragma[nomagic] - private predicate hasScopeAndName(VariableReal variable, Scope::Range scope, string name) { - variable.getNameImpl() = name and - scope = variable.getDeclaringScopeImpl() - } - cached predicate access(Ruby::AstNode access, VariableReal variable) { - exists(string name, Scope::Range scope | - pragma[only_bind_into](name) = variableNameInScope(access, scope) + exists(Local l | + variable = TLocalVariableReal(l) and + access = l.getAnAccess() | - hasScopeAndName(variable, scope, name) and - not access.getLocation().strictlyBefore(variable.getLocationImpl()) and - // In case of overlapping parameter names, later parameters should not - // be considered accesses to the first parameter - if parameterAssignment(_, _, access, _) - then scopeDefinesParameterVariable(_, _, access, _) - else any() + l instanceof ImplicitLocal or - exists(Scope::Range declScope | - hasScopeAndName(variable, declScope, pragma[only_bind_into](name)) and - inherits(scope, name, declScope) - ) + /* + * In the example below, `a` is declared in the scope of `M`, but only the + * second mention of `a` is an actual access: + * + * ```rb + * module M + * puts a # calls method `a` + * a = 1 # declares `a` + * puts a # accesses variable `a` + * end + * ``` + */ + + not access.getLocation().strictlyBefore(l.getDefiningNode().getLocation()) ) } private class Access extends Ruby::Token { Access() { - access(this.(Ruby::Identifier), _) or + access(this, _) or this instanceof Ruby::GlobalVariable or this instanceof Ruby::InstanceVariable or - this instanceof Ruby::ClassVariable or - this instanceof Ruby::Self + this instanceof Ruby::ClassVariable } } @@ -398,29 +501,6 @@ private module Cached { import Cached -/** Holds if this scope inherits `name` from an outer scope `outer`. */ -private predicate inherits(Scope::Range scope, string name, Scope::Range outer) { - ( - scope instanceof Ruby::Block or - scope instanceof Ruby::DoBlock or - scope instanceof Ruby::Lambda - ) and - not scopeDefinesParameterVariable(scope, name, _, _) and - ( - outer = scope.getOuterScope() and - ( - scopeDefinesParameterVariable(outer, name, _, _) - or - exists(Ruby::AstNode i | - scopeAssigns(outer, name, i) and - i.getLocation().strictlyBefore(scope.getLocation()) - ) - ) - or - inherits(scope.getOuterScope(), name, outer) - ) -} - abstract class VariableImpl extends TVariable { abstract string getNameImpl(); @@ -429,10 +509,9 @@ abstract class VariableImpl extends TVariable { abstract Location getLocationImpl(); } -class TVariableReal = - TGlobalVariable or TClassVariable or TInstanceVariable or TLocalVariableReal or TSelfVariable; +class TVariableReal = TGlobalVariable or TClassVariable or TInstanceVariable or TLocalVariableReal; -class TLocalVariable = TLocalVariableReal or TLocalVariableSynth or TSelfVariable; +class TLocalVariable = TLocalVariableReal or TLocalVariableSynth; /** * A "real" (i.e. non-synthesized) variable. This class only exists to @@ -458,19 +537,19 @@ private class VariableRealAdapter extends VariableImpl, TVariableReal instanceof } class LocalVariableReal extends VariableReal, TLocalVariableReal { - private Scope::Range scope; - private string name; - private Ruby::AstNode i; + private Local l; - LocalVariableReal() { this = TLocalVariableReal(scope, name, i) } + LocalVariableReal() { this = TLocalVariableReal(l) } - final override string getNameImpl() { result = name } + Ruby::AstNode getDefiningNode() { result = l.getDefiningNode() } - final override Location getLocationImpl() { result = i.getLocation() } + final override string getNameImpl() { result = l.getName() } - final override Scope::Range getDeclaringScopeImpl() { result = scope } + final override Location getLocationImpl() { result = l.getLocation() } - final VariableAccess getDefiningAccessImpl() { toGenerated(result) = i } + final override Scope::Range getDeclaringScopeImpl() { result = l.getScope() } + + final VariableAccess getDefiningAccessImpl() { toGenerated(result) = l.getDefiningNode() } } class LocalVariableSynth extends VariableImpl, TLocalVariableSynth { @@ -531,34 +610,16 @@ class ClassVariableImpl extends VariableReal, TClassVariable { final override Scope::Range getDeclaringScopeImpl() { result = scope } } -class SelfVariableImpl extends VariableReal, TSelfVariable { - private SelfBase::Range scope; - - SelfVariableImpl() { this = TSelfVariable(scope) } +class SelfVariableImpl extends LocalVariableReal { + private ImplicitLocal l; - final override string getNameImpl() { result = "self" } - - final override Location getLocationImpl() { result = scope.getLocation() } - - final override Scope::Range getDeclaringScopeImpl() { result = scope } + SelfVariableImpl() { this = TLocalVariableReal(l) } } abstract class VariableAccessImpl extends Expr, TVariableAccess { abstract VariableImpl getVariableImpl(); } -module LocalVariableAccess { - predicate range(Ruby::Identifier id, TLocalVariableReal v) { - access(id, v) and - ( - explicitWriteAccess(id, _) or - implicitWriteAccess(id) or - vcall(id) or - id = any(Ruby::VariableReferencePattern vr).getName() - ) - } -} - class TVariableAccessReal = TLocalVariableAccessReal or TGlobalVariableAccess or TInstanceVariableAccess or TClassVariableAccess; @@ -681,7 +742,8 @@ private class SelfVariableAccessReal extends SelfVariableAccessImpl, TSelfReal { SelfVariableAccessReal() { exists(Ruby::Self self | - this = TSelfReal(self) and var = TSelfVariable(scopeOf(self).getEnclosingSelfScope()) + this = TSelfReal(self) and + access(self, var) ) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll index f564633bb00f..9658c51d6739 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -100,24 +100,26 @@ private class EndBlockScope extends CfgScopeImpl, EndBlock { } } -private class BodyStmtCallableScope extends CfgScopeImpl, AstInternal::TBodyStmt, Callable { - final override predicate entry(AstNode first) { this.(Trees::BodyStmtTree).firstInner(first) } - - final override predicate exit(AstNode last, Completion c) { - this.(Trees::BodyStmtTree).lastInner(last, c) - } -} - -private class BraceBlockScope extends CfgScopeImpl, BraceBlock { +private class CallableScope extends CfgScopeImpl, Callable { final override predicate entry(AstNode first) { - first(this.(Trees::BraceBlockTree).getBodyChild(0, _), first) + first(this.(Trees::CallableTree).getBodyChild(0), first) } final override predicate exit(AstNode last, Completion c) { - last(this.(Trees::BraceBlockTree).getLastBodyChild(), last, c) + this.getBody().(Trees::BodyStmtTree).last(last, c) or - last(this.(Trees::BraceBlockTree).getBodyChild(_, _), last, c) and - not c instanceof NormalCompletion + exists(int i | + not exists(this.getBody()) and + last(this.(Trees::CallableTree).getBodyChild(i), last, c) and + not exists(this.(Trees::CallableTree).getBodyChild(i + 1)) + ) + or + exists(AstNode child | + child = this.(Trees::CallableTree).getBodyChild(_) and + not child = this.getBody() and + last(child, last, c) and + not c instanceof NormalCompletion + ) } } @@ -159,10 +161,6 @@ module Trees { } private class BeginTree extends BodyStmtTree instanceof BeginExpr { - final override predicate first(AstNode first) { this.firstInner(first) } - - final override predicate last(AstNode last, Completion c) { this.lastInner(last, c) } - final override predicate propagatesAbnormal(AstNode child) { none() } } @@ -196,28 +194,21 @@ module Trees { private class BlockParameterTree extends NonDefaultValueParameterTree instanceof BlockParameter { } - abstract class BodyStmtTree extends StmtSequenceTree instanceof BodyStmt { + class BodyStmtTree extends StmtSequenceTree instanceof BodyStmt { /** Gets a rescue clause in this block. */ final RescueClause getARescue() { result = super.getRescue(_) } /** Gets the `ensure` clause in this block, if any. */ final StmtSequence getEnsure() { result = super.getEnsure() } - override predicate first(AstNode first) { first = this } - - predicate firstInner(AstNode first) { + override predicate first(AstNode first) { first(this.getBodyChild(0, _), first) or not exists(this.getBodyChild(_, _)) and - ( - first(super.getRescue(_), first) - or - not exists(super.getRescue(_)) and - first(super.getEnsure(), first) - ) + first(super.getEnsure(), first) } - predicate lastInner(AstNode last, Completion c) { + override predicate last(AstNode last, Completion c) { exists(boolean ensurable | last = this.getAnEnsurePredecessor(c, ensurable) | not super.hasEnsure() or @@ -387,27 +378,28 @@ module Trees { private class BooleanLiteralTree extends LeafTree instanceof BooleanLiteral { } - class BraceBlockTree extends StmtSequenceTree instanceof BraceBlock { - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getParameter(i) and rescuable = false + class BraceBlockTree extends CallableTree instanceof BraceBlock { + final override AstNode getBodyChild(int i) { + result = super.getParameter(i) or - result = super.getLocalVariable(i - super.getNumberOfParameters()) and rescuable = false + result = super.getLocalVariable(i - super.getNumberOfParameters()) or - result = - StmtSequenceTree.super - .getBodyChild(i - super.getNumberOfParameters() - count(super.getALocalVariable()), - rescuable) + result = super.getBody() and + i = super.getNumberOfParameters() + count(super.getALocalVariable()) } + } + + class CallableTree extends PostOrderTree instanceof Callable { + final override predicate propagatesAbnormal(AstNode child) { none() } override predicate first(AstNode first) { first = this } + abstract AstNode getBodyChild(int i); + override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and + last(this.getBodyChild(i), pred, c) and + first(this.getBodyChild(i + 1), succ) and c instanceof NormalCompletion ) } @@ -1016,20 +1008,16 @@ module Trees { final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } } - private class DoBlockTree extends BodyStmtTree instanceof DoBlock { + private class DoBlockTree extends CallableTree instanceof DoBlock { /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getParameter(i) and rescuable = false + final override AstNode getBodyChild(int i) { + result = super.getParameter(i) or - result = super.getLocalVariable(i - super.getNumberOfParameters()) and rescuable = false + result = super.getLocalVariable(i - super.getNumberOfParameters()) or - result = - BodyStmtTree.super - .getBodyChild(i - super.getNumberOfParameters() - count(super.getALocalVariable()), - rescuable) + result = super.getBody() and + i = super.getNumberOfParameters() + count(super.getALocalVariable()) } - - override predicate propagatesAbnormal(AstNode child) { none() } } private class EmptyStatementTree extends LeafTree instanceof EmptyStmt { } @@ -1073,14 +1061,12 @@ module Trees { final override AstNode getAccessNode() { result = super.getDefiningAccess() } } - private class LambdaTree extends BodyStmtTree instanceof Lambda { - final override predicate propagatesAbnormal(AstNode child) { none() } - + private class LambdaTree extends CallableTree instanceof Lambda { /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getParameter(i) and rescuable = false + final override AstNode getBodyChild(int i) { + result = super.getParameter(i) or - result = BodyStmtTree.super.getBodyChild(i - super.getNumberOfParameters(), rescuable) + result = super.getBody() and i = super.getNumberOfParameters() } } @@ -1151,14 +1137,12 @@ module Trees { private class MethodNameTree extends LeafTree instanceof MethodName, AstInternal::TTokenMethodName { } - private class MethodTree extends BodyStmtTree instanceof Method { - final override predicate propagatesAbnormal(AstNode child) { none() } - + private class MethodTree extends CallableTree instanceof Method { /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getParameter(i) and rescuable = false + final override AstNode getBodyChild(int i) { + result = super.getParameter(i) or - result = BodyStmtTree.super.getBodyChild(i - super.getNumberOfParameters(), rescuable) + result = super.getBody() and i = super.getNumberOfParameters() } } @@ -1183,12 +1167,12 @@ module Trees { BodyStmtTree.super.succ(pred, succ, c) or pred = this and - this.firstInner(succ) and + super.first(succ) and c instanceof SimpleCompletion } final override predicate last(AstNode last, Completion c) { - this.lastInner(last, c) + super.last(last, c) or not exists(this.getAChild(_)) and last = this and @@ -1328,7 +1312,7 @@ module Trees { private class SingletonClassTree extends BodyStmtTree instanceof SingletonClass { final override predicate first(AstNode first) { - this.firstInner(first) + super.first(first) or not exists(this.getAChild(_)) and first = this @@ -1338,7 +1322,12 @@ module Trees { BodyStmtTree.super.succ(pred, succ, c) or succ = this and - this.lastInner(pred, c) + super.last(pred, c) + } + + final override predicate last(AstNode last, Completion c) { + last = this and + c.isValidFor(this) } /** Gets the `i`th child in the body of this block. */ @@ -1351,20 +1340,18 @@ module Trees { } } - private class SingletonMethodTree extends BodyStmtTree instanceof SingletonMethod { - final override predicate propagatesAbnormal(AstNode child) { none() } - + private class SingletonMethodTree extends CallableTree instanceof SingletonMethod { /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getParameter(i) and rescuable = false + final override AstNode getBodyChild(int i) { + result = super.getParameter(i) or - result = BodyStmtTree.super.getBodyChild(i - super.getNumberOfParameters(), rescuable) + result = super.getBody() and i = super.getNumberOfParameters() } override predicate first(AstNode first) { first(super.getObject(), first) } override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) + CallableTree.super.succ(pred, succ, c) or last(super.getObject(), pred, c) and succ = this and @@ -1443,10 +1430,6 @@ module Trees { or result = BodyStmtTree.super.getBodyChild(i - count(super.getABeginBlock()), rescuable) } - - final override predicate first(AstNode first) { super.firstInner(first) } - - final override predicate last(AstNode last, Completion c) { super.lastInner(last, c) } } private class UndefStmtTree extends StandardPreOrderTree instanceof UndefStmt { diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll index 782315dc14ca..737f450b4f23 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll @@ -246,7 +246,7 @@ module EnsureSplitting { private predicate exit0(AstNode pred, Trees::BodyStmtTree block, int nestLevel, Completion c) { this.appliesToPredecessor(pred) and nestLevel = block.getNestLevel() and - block.lastInner(pred, c) + block.last(pred, c) } /** diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index e4bcf2537a7a..fb5ce7b01457 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -1662,7 +1662,7 @@ private module ReturnNodes { * last thing that is evaluated in the body of the callable. */ class ExprReturnNode extends SourceReturnNode, ExprNode { - ExprReturnNode() { exists(Callable c | implicitReturn(c, this) = c.getAStmt()) } + ExprReturnNode() { exists(Callable c | implicitReturn(c, this) = c.getBody().getAStmt()) } override ReturnKind getKindSource() { exists(CfgScope scope | scope = this.(NodeImpl).getCfgScope() | diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 6f2bc8b4accb..d0823fba0a77 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -1392,7 +1392,7 @@ class StmtSequenceNode extends ExprNode { /** * A data flow node corresponding to a method, block, or lambda expression. */ -class CallableNode extends StmtSequenceNode { +class CallableNode extends ExprNode { private Callable callable; CallableNode() { this.asExpr().getExpr() = callable } diff --git a/ruby/ql/lib/codeql/ruby/experimental/Rbi.qll b/ruby/ql/lib/codeql/ruby/experimental/Rbi.qll index 008089a62519..68efe353bb0a 100644 --- a/ruby/ql/lib/codeql/ruby/experimental/Rbi.qll +++ b/ruby/ql/lib/codeql/ruby/experimental/Rbi.qll @@ -83,11 +83,7 @@ module Rbi { /** * Gets the type aliased by this call. */ - RbiType getAliasedType() { - exists(ExprNodes::MethodCallCfgNode n | n.getExpr() = this | - result = n.getBlock().(ExprNodes::StmtSequenceCfgNode).getLastStmt().getExpr() - ) - } + RbiType getAliasedType() { result = this.getBlock().getBody().getLastStmt() } } /** @@ -304,7 +300,7 @@ module Rbi { private MethodSignatureCall sigCall; MethodSignatureDefiningCall() { - exists(MethodCall c | c = sigCall.getBlock().getAChild() | + exists(MethodCall c | c = sigCall.getBlock().getBody().getAChild() | // The typical pattern for the contents of a `sig` block is something // like `params().returns()` - we want to // pick up both of these calls. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Slim.qll b/ruby/ql/lib/codeql/ruby/frameworks/Slim.qll index 3c3c3987383e..7f85737bc046 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Slim.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Slim.qll @@ -18,7 +18,7 @@ module Slim { override DataFlow::Node getTemplate() { result.asExpr().getExpr() = - this.getBlock().(DataFlow::BlockNode).asCallableAstNode().getAStmt() + this.getBlock().(DataFlow::BlockNode).asCallableAstNode().getBody().getAStmt() } } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll b/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll index 91dc0ce5efad..b9b96fe1909f 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll @@ -38,6 +38,7 @@ private class NokogiriXmlParserCall extends XmlParserCall::Range, DataFlow::Call .getExpr() .(MethodCall) .getBlock() + .getBody() .getAStmt() .getAChild*() .(MethodCall) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Routing.qll b/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Routing.qll index e6e453d449f0..ac545481b9c7 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Routing.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Routing.qll @@ -98,7 +98,7 @@ module Routing { Block getBlock() { result = block } - override Stmt getAStmt() { result = block.getAStmt() } + override Stmt getAStmt() { result = block.getBody().getAStmt() } override RouteBlock getParent() { none() } @@ -128,7 +128,7 @@ module Routing { override string getAPrimaryQlClass() { result = "ConstraintsRouteBlock" } - override Stmt getAStmt() { result = block.getAStmt() } + override Stmt getAStmt() { result = block.getBody().getAStmt() } override string getPathComponent() { result = "" } @@ -156,7 +156,7 @@ module Routing { override string getAPrimaryQlClass() { result = "ScopeRouteBlock" } - override Stmt getAStmt() { result = block.getAStmt() } + override Stmt getAStmt() { result = block.getBody().getAStmt() } override string toString() { result = methodCall.toString() } @@ -216,7 +216,7 @@ module Routing { override string getAPrimaryQlClass() { result = "ResourcesRouteBlock" } - override Stmt getAStmt() { result = block.getAStmt() } + override Stmt getAStmt() { result = block.getBody().getAStmt() } /** * Gets the `resources` call that gives rise to this route block. @@ -282,7 +282,7 @@ module Routing { NamespaceRouteBlock() { this = TNamespaceRouteBlock(parent, methodCall, block) } - override Stmt getAStmt() { result = block.getAStmt() } + override Stmt getAStmt() { result = block.getBody().getAStmt() } override string getPathComponent() { result = this.getNamespace() } diff --git a/ruby/ql/lib/codeql/ruby/security/ImproperMemoizationQuery.qll b/ruby/ql/lib/codeql/ruby/security/ImproperMemoizationQuery.qll index dab75f00b9e5..f46540cc33a6 100644 --- a/ruby/ql/lib/codeql/ruby/security/ImproperMemoizationQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/ImproperMemoizationQuery.qll @@ -70,7 +70,7 @@ private predicate memoReturnedFromMethod(Method m, MemoStmt s) { or // If we don't have flow (e.g. due to the dataflow library not supporting instance variable flow yet), // fall back to a syntactic heuristic: does the last statement in the method mention the memoization variable? - m.getLastStmt().getAChild*().(InstanceVariableReadAccess).getVariable() = + m.getBody().getLastStmt().getAChild*().(InstanceVariableReadAccess).getVariable() = s.getVariableAccess().getVariable() } diff --git a/ruby/ql/lib/codeql/ruby/security/InsecureDependencyQuery.qll b/ruby/ql/lib/codeql/ruby/security/InsecureDependencyQuery.qll index b8298420f81d..dc18981a50b6 100644 --- a/ruby/ql/lib/codeql/ruby/security/InsecureDependencyQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/InsecureDependencyQuery.qll @@ -33,7 +33,7 @@ private class SourceCall extends RelevantGemCall { private class GitSourceCall extends RelevantGemCall { GitSourceCall() { this.getMethodName() = "git_source" } - override Expr getAUrlPart() { result = this.getBlock().getLastStmt() } + override Expr getAUrlPart() { result = this.getBlock().getBody().getLastStmt() } } /** diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 29c765d88eef..399564bdb33a 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 5.2.1 +version: 5.2.3-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme @@ -14,6 +14,7 @@ dependencies: codeql/ssa: ${workspace} codeql/tutorial: ${workspace} codeql/util: ${workspace} + codeql/namebinding: ${workspace} dataExtensions: - codeql/ruby/frameworks/**/model.yml - codeql/ruby/frameworks/**/*.model.yml diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index c874059c1510..384ca6332028 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.4 + +No user-facing changes. + ## 1.6.3 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.6.4.md b/ruby/ql/src/change-notes/released/1.6.4.md new file mode 100644 index 000000000000..5c811dc46384 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.6.4.md @@ -0,0 +1,3 @@ +## 1.6.4 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 00b51441d882..1910e09d6a6a 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.3 +lastReleaseVersion: 1.6.4 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index a745eae0790a..72b0258fa305 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.3 +version: 1.6.5-dev groups: - ruby - queries diff --git a/ruby/ql/test/library-tests/ast/Ast.expected b/ruby/ql/test/library-tests/ast/Ast.expected index 0bece506bfb4..c391b7f584d8 100644 --- a/ruby/ql/test/library-tests/ast/Ast.expected +++ b/ruby/ql/test/library-tests/ast/Ast.expected @@ -15,18 +15,19 @@ gems/Gemfile: # 5| getArgument: [StringLiteral] "https://gems.example.com" # 5| getComponent: [StringTextComponent] https://gems.example.com # 5| getBlock: [DoBlock] do ... end -# 6| getStmt: [MethodCall] call to gem -# 6| getReceiver: [SelfVariableAccess] self -# 6| getArgument: [StringLiteral] "my_gem" -# 6| getComponent: [StringTextComponent] my_gem -# 6| getArgument: [StringLiteral] "1.0" -# 6| getComponent: [StringTextComponent] 1.0 -# 7| getStmt: [MethodCall] call to gem -# 7| getReceiver: [SelfVariableAccess] self -# 7| getArgument: [StringLiteral] "another_gem" -# 7| getComponent: [StringTextComponent] another_gem -# 7| getArgument: [StringLiteral] "3.1.4" -# 7| getComponent: [StringTextComponent] 3.1.4 +# 6| getBody: [StmtSequence] ... +# 6| getStmt: [MethodCall] call to gem +# 6| getReceiver: [SelfVariableAccess] self +# 6| getArgument: [StringLiteral] "my_gem" +# 6| getComponent: [StringTextComponent] my_gem +# 6| getArgument: [StringLiteral] "1.0" +# 6| getComponent: [StringTextComponent] 1.0 +# 7| getStmt: [MethodCall] call to gem +# 7| getReceiver: [SelfVariableAccess] self +# 7| getArgument: [StringLiteral] "another_gem" +# 7| getComponent: [StringTextComponent] another_gem +# 7| getArgument: [StringLiteral] "3.1.4" +# 7| getComponent: [StringTextComponent] 3.1.4 calls/calls.rb: # 1| [Toplevel] calls.rb # 2| getStmt: [MethodCall] call to foo @@ -45,17 +46,19 @@ calls/calls.rb: # 14| getBlock: [BraceBlock] { ... } # 14| getParameter: [SimpleParameter] x # 14| getDefiningAccess: [LocalVariableAccess] x -# 14| getStmt: [AddExpr] ... + ... -# 14| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 14| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 +# 14| getBody: [StmtSequence] ... +# 14| getStmt: [AddExpr] ... + ... +# 14| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 14| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 # 17| getStmt: [MethodCall] call to foo # 17| getReceiver: [SelfVariableAccess] self # 17| getBlock: [DoBlock] do ... end # 17| getParameter: [SimpleParameter] x # 17| getDefiningAccess: [LocalVariableAccess] x -# 18| getStmt: [AddExpr] ... + ... -# 18| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 18| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 +# 18| getBody: [StmtSequence] ... +# 18| getStmt: [AddExpr] ... + ... +# 18| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 18| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 # 22| getStmt: [MethodCall] call to bar # 22| getReceiver: [IntegerLiteral] 123 # 22| getArgument: [StringLiteral] "foo" @@ -63,15 +66,18 @@ calls/calls.rb: # 22| getBlock: [DoBlock] do ... end # 22| getParameter: [SimpleParameter] x # 22| getDefiningAccess: [LocalVariableAccess] x -# 23| getStmt: [AddExpr] ... + ... -# 23| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 23| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 +# 23| getBody: [StmtSequence] ... +# 23| getStmt: [AddExpr] ... + ... +# 23| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 23| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 # 27| getStmt: [Method] method_that_yields -# 28| getStmt: [YieldCall] yield ... +# 28| getBody: [StmtSequence] ... +# 28| getStmt: [YieldCall] yield ... # 32| getStmt: [Method] another_method_that_yields -# 33| getStmt: [YieldCall] yield ... -# 33| getArgument: [IntegerLiteral] 100 -# 33| getArgument: [IntegerLiteral] 200 +# 33| getBody: [StmtSequence] ... +# 33| getStmt: [YieldCall] yield ... +# 33| getArgument: [IntegerLiteral] 100 +# 33| getArgument: [IntegerLiteral] 200 # 43| getStmt: [MethodCall] call to foo # 43| getReceiver: [SelfVariableAccess] self # 44| getStmt: [MethodCall] call to foo @@ -148,17 +154,19 @@ calls/calls.rb: # 89| getStmt: [MethodCall] call to foo # 89| getReceiver: [SelfVariableAccess] self # 89| getBlock: [BraceBlock] { ... } -# 89| getStmt: [MethodCall] call to bar -# 89| getReceiver: [SelfVariableAccess] self -# 89| getStmt: [MethodCall] call to baz -# 89| getReceiver: [ConstantReadAccess] X +# 89| getBody: [StmtSequence] ... +# 89| getStmt: [MethodCall] call to bar +# 89| getReceiver: [SelfVariableAccess] self +# 89| getStmt: [MethodCall] call to baz +# 89| getReceiver: [ConstantReadAccess] X # 92| getStmt: [MethodCall] call to foo # 92| getReceiver: [SelfVariableAccess] self # 92| getBlock: [DoBlock] do ... end -# 93| getStmt: [MethodCall] call to bar -# 93| getReceiver: [SelfVariableAccess] self -# 94| getStmt: [MethodCall] call to baz -# 94| getReceiver: [ConstantReadAccess] X +# 93| getBody: [StmtSequence] ... +# 93| getStmt: [MethodCall] call to bar +# 93| getReceiver: [SelfVariableAccess] self +# 94| getStmt: [MethodCall] call to baz +# 94| getReceiver: [ConstantReadAccess] X # 98| getStmt: [MethodCall] call to bar # 98| getReceiver: [MethodCall] call to foo # 98| getReceiver: [SelfVariableAccess] self @@ -205,17 +213,19 @@ calls/calls.rb: # 129| getStmt: [MethodCall] call to bar # 129| getReceiver: [ConstantReadAccess] X # 133| getStmt: [Method] some_method -# 134| getStmt: [MethodCall] call to foo -# 134| getReceiver: [SelfVariableAccess] self -# 135| getStmt: [MethodCall] call to bar -# 135| getReceiver: [ConstantReadAccess] X +# 134| getBody: [StmtSequence] ... +# 134| getStmt: [MethodCall] call to foo +# 134| getReceiver: [SelfVariableAccess] self +# 135| getStmt: [MethodCall] call to bar +# 135| getReceiver: [ConstantReadAccess] X # 139| getStmt: [SingletonMethod] some_method # 139| getObject: [MethodCall] call to foo # 139| getReceiver: [SelfVariableAccess] self -# 140| getStmt: [MethodCall] call to bar -# 140| getReceiver: [SelfVariableAccess] self -# 141| getStmt: [MethodCall] call to baz -# 141| getReceiver: [ConstantReadAccess] X +# 140| getBody: [StmtSequence] ... +# 140| getStmt: [MethodCall] call to bar +# 140| getReceiver: [SelfVariableAccess] self +# 141| getStmt: [MethodCall] call to baz +# 141| getReceiver: [ConstantReadAccess] X # 145| getStmt: [Method] method_with_keyword_param # 145| getParameter: [KeywordParameter] keyword # 145| getDefiningAccess: [LocalVariableAccess] keyword @@ -500,56 +510,62 @@ calls/calls.rb: # 278| getReceiver: [ConstantReadAccess] X # 283| getStmt: [ClassDeclaration] MyClass # 284| getStmt: [Method] my_method -# 285| getStmt: [SuperCall] super call to my_method -# 286| getStmt: [SuperCall] super call to my_method -# 287| getStmt: [SuperCall] super call to my_method -# 287| getArgument: [StringLiteral] "blah" -# 287| getComponent: [StringTextComponent] blah -# 288| getStmt: [SuperCall] super call to my_method -# 288| getArgument: [IntegerLiteral] 1 -# 288| getArgument: [IntegerLiteral] 2 -# 288| getArgument: [IntegerLiteral] 3 -# 289| getStmt: [SuperCall] super call to my_method -# 289| getBlock: [BraceBlock] { ... } -# 289| getParameter: [SimpleParameter] x -# 289| getDefiningAccess: [LocalVariableAccess] x -# 289| getStmt: [AddExpr] ... + ... -# 289| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 289| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 -# 290| getStmt: [SuperCall] super call to my_method -# 290| getBlock: [DoBlock] do ... end -# 290| getParameter: [SimpleParameter] x -# 290| getDefiningAccess: [LocalVariableAccess] x -# 290| getStmt: [MulExpr] ... * ... -# 290| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 290| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 2 -# 291| getStmt: [SuperCall] super call to my_method -# 291| getArgument: [IntegerLiteral] 4 -# 291| getArgument: [IntegerLiteral] 5 -# 291| getBlock: [BraceBlock] { ... } -# 291| getParameter: [SimpleParameter] x -# 291| getDefiningAccess: [LocalVariableAccess] x -# 291| getStmt: [AddExpr] ... + ... -# 291| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 291| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 100 -# 292| getStmt: [SuperCall] super call to my_method -# 292| getArgument: [IntegerLiteral] 6 -# 292| getArgument: [IntegerLiteral] 7 -# 292| getBlock: [DoBlock] do ... end -# 292| getParameter: [SimpleParameter] x -# 292| getDefiningAccess: [LocalVariableAccess] x -# 292| getStmt: [AddExpr] ... + ... -# 292| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 292| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 200 +# 285| getBody: [StmtSequence] ... +# 285| getStmt: [SuperCall] super call to my_method +# 286| getStmt: [SuperCall] super call to my_method +# 287| getStmt: [SuperCall] super call to my_method +# 287| getArgument: [StringLiteral] "blah" +# 287| getComponent: [StringTextComponent] blah +# 288| getStmt: [SuperCall] super call to my_method +# 288| getArgument: [IntegerLiteral] 1 +# 288| getArgument: [IntegerLiteral] 2 +# 288| getArgument: [IntegerLiteral] 3 +# 289| getStmt: [SuperCall] super call to my_method +# 289| getBlock: [BraceBlock] { ... } +# 289| getParameter: [SimpleParameter] x +# 289| getDefiningAccess: [LocalVariableAccess] x +# 289| getBody: [StmtSequence] ... +# 289| getStmt: [AddExpr] ... + ... +# 289| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 289| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 +# 290| getStmt: [SuperCall] super call to my_method +# 290| getBlock: [DoBlock] do ... end +# 290| getParameter: [SimpleParameter] x +# 290| getDefiningAccess: [LocalVariableAccess] x +# 290| getBody: [StmtSequence] ... +# 290| getStmt: [MulExpr] ... * ... +# 290| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 290| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 2 +# 291| getStmt: [SuperCall] super call to my_method +# 291| getArgument: [IntegerLiteral] 4 +# 291| getArgument: [IntegerLiteral] 5 +# 291| getBlock: [BraceBlock] { ... } +# 291| getParameter: [SimpleParameter] x +# 291| getDefiningAccess: [LocalVariableAccess] x +# 291| getBody: [StmtSequence] ... +# 291| getStmt: [AddExpr] ... + ... +# 291| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 291| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 100 +# 292| getStmt: [SuperCall] super call to my_method +# 292| getArgument: [IntegerLiteral] 6 +# 292| getArgument: [IntegerLiteral] 7 +# 292| getBlock: [DoBlock] do ... end +# 292| getParameter: [SimpleParameter] x +# 292| getDefiningAccess: [LocalVariableAccess] x +# 292| getBody: [StmtSequence] ... +# 292| getStmt: [AddExpr] ... + ... +# 292| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 292| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 200 # 300| getStmt: [ClassDeclaration] AnotherClass # 301| getStmt: [Method] another_method -# 302| getStmt: [MethodCall] call to super -# 302| getReceiver: [MethodCall] call to foo -# 302| getReceiver: [SelfVariableAccess] self -# 303| getStmt: [MethodCall] call to super -# 303| getReceiver: [SelfVariableAccess] self -# 304| getStmt: [MethodCall] call to super -# 304| getReceiver: [SuperCall] super call to another_method +# 302| getBody: [StmtSequence] ... +# 302| getStmt: [MethodCall] call to super +# 302| getReceiver: [MethodCall] call to foo +# 302| getReceiver: [SelfVariableAccess] self +# 303| getStmt: [MethodCall] call to super +# 303| getReceiver: [SelfVariableAccess] self +# 304| getStmt: [MethodCall] call to super +# 304| getReceiver: [SuperCall] super call to another_method # 309| getStmt: [MethodCall] call to call # 309| getReceiver: [MethodCall] call to foo # 309| getReceiver: [SelfVariableAccess] self @@ -619,49 +635,57 @@ calls/calls.rb: # 319| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 # 319| getAnOperand/getRightOperand: [IntegerLiteral] 2 # 322| getStmt: [Method] foo -# 322| getStmt: [MethodCall] call to bar -# 322| getReceiver: [SelfVariableAccess] self +# 322| getBody: [StmtSequence] ... +# 322| getStmt: [MethodCall] call to bar +# 322| getReceiver: [SelfVariableAccess] self # 323| getStmt: [Method] foo -# 323| getStmt: [MethodCall] call to bar -# 323| getReceiver: [SelfVariableAccess] self +# 323| getBody: [StmtSequence] ... +# 323| getStmt: [MethodCall] call to bar +# 323| getReceiver: [SelfVariableAccess] self # 324| getStmt: [Method] foo +# 324| getBody: [StmtSequence] ... +# 324| getStmt: [MethodCall] call to bar +# 324| getReceiver: [SelfVariableAccess] self # 324| getParameter: [SimpleParameter] x # 324| getDefiningAccess: [LocalVariableAccess] x -# 324| getStmt: [MethodCall] call to bar -# 324| getReceiver: [SelfVariableAccess] self # 325| getStmt: [SingletonMethod] foo +# 325| getBody: [StmtSequence] ... +# 325| getStmt: [MethodCall] call to bar +# 325| getReceiver: [SelfVariableAccess] self # 325| getObject: [ConstantReadAccess] Object -# 325| getStmt: [MethodCall] call to bar -# 325| getReceiver: [SelfVariableAccess] self # 326| getStmt: [SingletonMethod] foo +# 326| getBody: [StmtSequence] ... +# 326| getStmt: [MethodCall] call to bar +# 326| getReceiver: [SelfVariableAccess] self # 326| getObject: [ConstantReadAccess] Object # 326| getParameter: [SimpleParameter] x # 326| getDefiningAccess: [LocalVariableAccess] x -# 326| getStmt: [MethodCall] call to bar -# 326| getReceiver: [SelfVariableAccess] self # 327| getStmt: [Method] foo -# 327| getStmt: [RescueModifierExpr] ... rescue ... -# 327| getBody: [MethodCall] call to bar -# 327| getReceiver: [SelfVariableAccess] self -# 327| getHandler: [ParenthesizedExpr] ( ... ) -# 327| getStmt: [MethodCall] call to print +# 327| getBody: [StmtSequence] ... +# 327| getStmt: [RescueModifierExpr] ... rescue ... +# 327| getBody: [MethodCall] call to bar # 327| getReceiver: [SelfVariableAccess] self -# 327| getArgument: [StringLiteral] "error" -# 327| getComponent: [StringTextComponent] error +# 327| getHandler: [ParenthesizedExpr] ( ... ) +# 327| getStmt: [MethodCall] call to print +# 327| getReceiver: [SelfVariableAccess] self +# 327| getArgument: [StringLiteral] "error" +# 327| getComponent: [StringTextComponent] error # 330| getStmt: [Method] foo # 330| getParameter: [ForwardParameter] ... -# 331| getStmt: [SuperCall] super call to foo -# 331| getArgument: [ForwardedArguments] ... +# 331| getBody: [StmtSequence] ... +# 331| getStmt: [SuperCall] super call to foo +# 331| getArgument: [ForwardedArguments] ... # 334| getStmt: [Method] foo # 334| getParameter: [SimpleParameter] a # 334| getDefiningAccess: [LocalVariableAccess] a # 334| getParameter: [SimpleParameter] b # 334| getDefiningAccess: [LocalVariableAccess] b # 334| getParameter: [ForwardParameter] ... -# 335| getStmt: [MethodCall] call to bar -# 335| getReceiver: [SelfVariableAccess] self -# 335| getArgument: [LocalVariableAccess] b -# 335| getArgument: [ForwardedArguments] ... +# 335| getBody: [StmtSequence] ... +# 335| getStmt: [MethodCall] call to bar +# 335| getReceiver: [SelfVariableAccess] self +# 335| getArgument: [LocalVariableAccess] b +# 335| getArgument: [ForwardedArguments] ... # 339| getStmt: [ForExpr] for ... in ... # 339| getPattern: [DestructuredLhsExpr] (..., ...) # 339| getElement: [LocalVariableAccess] x @@ -718,31 +742,35 @@ calls/calls.rb: # 350| getAnOperand/getRightOperand: [Lambda] -> { ... } # 350| getParameter: [SimpleParameter] x # 350| getDefiningAccess: [LocalVariableAccess] x -# 350| getStmt: [LocalVariableAccess] y +# 350| getBody: [StmtSequence] ... +# 350| getStmt: [LocalVariableAccess] y # 351| getStmt: [AssignExpr] ... = ... # 351| getAnOperand/getLeftOperand: [LocalVariableAccess] f # 351| getAnOperand/getRightOperand: [Lambda] -> { ... } # 351| getParameter: [SimpleParameter] x # 351| getDefiningAccess: [LocalVariableAccess] x -# 351| getStmt: [MethodCall] call to foo -# 351| getReceiver: [SelfVariableAccess] self -# 351| getArgument: [LocalVariableAccess] x +# 351| getBody: [StmtSequence] ... +# 351| getStmt: [MethodCall] call to foo +# 351| getReceiver: [SelfVariableAccess] self +# 351| getArgument: [LocalVariableAccess] x # 352| getStmt: [AssignExpr] ... = ... # 352| getAnOperand/getLeftOperand: [LocalVariableAccess] g # 352| getAnOperand/getRightOperand: [Lambda] -> { ... } # 352| getParameter: [SimpleParameter] x # 352| getDefiningAccess: [LocalVariableAccess] x -# 352| getStmt: [MethodCall] call to unknown_call -# 352| getReceiver: [SelfVariableAccess] self +# 352| getBody: [StmtSequence] ... +# 352| getStmt: [MethodCall] call to unknown_call +# 352| getReceiver: [SelfVariableAccess] self # 353| getStmt: [AssignExpr] ... = ... # 353| getAnOperand/getLeftOperand: [LocalVariableAccess] h # 353| getAnOperand/getRightOperand: [Lambda] -> { ... } # 353| getParameter: [SimpleParameter] x # 353| getDefiningAccess: [LocalVariableAccess] x -# 354| getStmt: [LocalVariableAccess] x -# 355| getStmt: [LocalVariableAccess] y -# 356| getStmt: [MethodCall] call to unknown_call -# 356| getReceiver: [SelfVariableAccess] self +# 354| getBody: [StmtSequence] ... +# 354| getStmt: [LocalVariableAccess] x +# 355| getStmt: [LocalVariableAccess] y +# 356| getStmt: [MethodCall] call to unknown_call +# 356| getReceiver: [SelfVariableAccess] self # 360| getStmt: [MethodCall] call to empty? # 360| getReceiver: [MethodCall] call to list # 360| getReceiver: [SelfVariableAccess] self @@ -760,7 +788,8 @@ calls/calls.rb: # 363| getBlock: [BraceBlock] { ... } # 363| getParameter: [SimpleParameter] x # 363| getDefiningAccess: [LocalVariableAccess] x -# 363| getStmt: [LocalVariableAccess] x +# 363| getBody: [StmtSequence] ... +# 363| getStmt: [LocalVariableAccess] x control/cases.rb: # 1| [Toplevel] cases.rb # 2| getStmt: [AssignExpr] ... = ... @@ -1094,9 +1123,10 @@ control/cases.rb: # 101| getPattern: [Lambda] -> { ... } # 101| getParameter: [SimpleParameter] x # 101| getDefiningAccess: [LocalVariableAccess] x -# 101| getStmt: [EqExpr] ... == ... -# 101| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 101| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 10 +# 101| getBody: [StmtSequence] ... +# 101| getStmt: [EqExpr] ... == ... +# 101| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 101| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 10 # 102| getBranch: [InClause] in ... then ... # 102| getPattern: [SymbolLiteral] :foo # 102| getComponent: [StringTextComponent] foo @@ -1301,15 +1331,17 @@ modules/classes.rb: # 16| getScopeExpr: [ConstantReadAccess] MyModule # 20| getStmt: [ClassDeclaration] Wibble # 21| getStmt: [Method] method_a -# 22| getStmt: [MethodCall] call to puts -# 22| getReceiver: [SelfVariableAccess] self -# 22| getArgument: [StringLiteral] "a" -# 22| getComponent: [StringTextComponent] a +# 22| getBody: [StmtSequence] ... +# 22| getStmt: [MethodCall] call to puts +# 22| getReceiver: [SelfVariableAccess] self +# 22| getArgument: [StringLiteral] "a" +# 22| getComponent: [StringTextComponent] a # 25| getStmt: [Method] method_b -# 26| getStmt: [MethodCall] call to puts -# 26| getReceiver: [SelfVariableAccess] self -# 26| getArgument: [StringLiteral] "b" -# 26| getComponent: [StringTextComponent] b +# 26| getBody: [StmtSequence] ... +# 26| getStmt: [MethodCall] call to puts +# 26| getReceiver: [SelfVariableAccess] self +# 26| getArgument: [StringLiteral] "b" +# 26| getComponent: [StringTextComponent] b # 29| getStmt: [MethodCall] call to some_method_call # 29| getReceiver: [SelfVariableAccess] self # 30| getStmt: [AssignExpr] ... = ... @@ -1324,14 +1356,16 @@ modules/classes.rb: # 41| getStmt: [SingletonClass] class << ... # 41| getValue: [LocalVariableAccess] x # 42| getStmt: [Method] length -# 43| getStmt: [MulExpr] ... * ... -# 43| getAnOperand/getLeftOperand/getReceiver: [IntegerLiteral] 100 -# 43| getAnOperand/getArgument/getRightOperand: [SuperCall] super call to length +# 43| getBody: [StmtSequence] ... +# 43| getStmt: [MulExpr] ... * ... +# 43| getAnOperand/getLeftOperand/getReceiver: [IntegerLiteral] 100 +# 43| getAnOperand/getArgument/getRightOperand: [SuperCall] super call to length # 46| getStmt: [Method] wibble -# 47| getStmt: [MethodCall] call to puts -# 47| getReceiver: [SelfVariableAccess] self -# 47| getArgument: [StringLiteral] "wibble" -# 47| getComponent: [StringTextComponent] wibble +# 47| getBody: [StmtSequence] ... +# 47| getStmt: [MethodCall] call to puts +# 47| getReceiver: [SelfVariableAccess] self +# 47| getArgument: [StringLiteral] "wibble" +# 47| getComponent: [StringTextComponent] wibble # 50| getStmt: [MethodCall] call to another_method_call # 50| getReceiver: [SelfVariableAccess] self # 51| getStmt: [AssignExpr] ... = ... @@ -1533,32 +1567,34 @@ constants/constants.rb: # 17| getAnOperand/getArgument/getRightOperand: [ConstantReadAccess] CONST_B # 17| getScopeExpr: [ConstantReadAccess] ModuleA # 19| getStmt: [Method] foo -# 20| getStmt: [AssignExpr] ... = ... -# 20| getAnOperand/getLeftOperand: [ConstantAssignment] Names -# 20| getAnOperand/getRightOperand: [ArrayLiteral] [...] -# 20| getElement: [StringLiteral] "Vera" -# 20| getComponent: [StringTextComponent] Vera -# 20| getElement: [StringLiteral] "Chuck" -# 20| getComponent: [StringTextComponent] Chuck -# 20| getElement: [StringLiteral] "Dave" -# 20| getComponent: [StringTextComponent] Dave -# 22| getStmt: [MethodCall] call to each -# 22| getReceiver: [ConstantReadAccess] Names -# 22| getBlock: [DoBlock] do ... end -# 22| getParameter: [SimpleParameter] name -# 22| getDefiningAccess: [LocalVariableAccess] name -# 23| getStmt: [MethodCall] call to puts -# 23| getReceiver: [SelfVariableAccess] self -# 23| getArgument: [StringLiteral] "#{...} #{...}" -# 23| getComponent: [StringInterpolationComponent] #{...} -# 23| getStmt: [ConstantReadAccess] GREETING -# 23| getComponent: [StringTextComponent] -# 23| getComponent: [StringInterpolationComponent] #{...} -# 23| getStmt: [LocalVariableAccess] name -# 28| getStmt: [MethodCall] call to Array -# 28| getReceiver: [SelfVariableAccess] self -# 28| getArgument: [StringLiteral] "foo" -# 28| getComponent: [StringTextComponent] foo +# 20| getBody: [StmtSequence] ... +# 20| getStmt: [AssignExpr] ... = ... +# 20| getAnOperand/getLeftOperand: [ConstantAssignment] Names +# 20| getAnOperand/getRightOperand: [ArrayLiteral] [...] +# 20| getElement: [StringLiteral] "Vera" +# 20| getComponent: [StringTextComponent] Vera +# 20| getElement: [StringLiteral] "Chuck" +# 20| getComponent: [StringTextComponent] Chuck +# 20| getElement: [StringLiteral] "Dave" +# 20| getComponent: [StringTextComponent] Dave +# 22| getStmt: [MethodCall] call to each +# 22| getReceiver: [ConstantReadAccess] Names +# 22| getBlock: [DoBlock] do ... end +# 22| getParameter: [SimpleParameter] name +# 22| getDefiningAccess: [LocalVariableAccess] name +# 23| getBody: [StmtSequence] ... +# 23| getStmt: [MethodCall] call to puts +# 23| getReceiver: [SelfVariableAccess] self +# 23| getArgument: [StringLiteral] "#{...} #{...}" +# 23| getComponent: [StringInterpolationComponent] #{...} +# 23| getStmt: [ConstantReadAccess] GREETING +# 23| getComponent: [StringTextComponent] +# 23| getComponent: [StringInterpolationComponent] #{...} +# 23| getStmt: [LocalVariableAccess] name +# 28| getStmt: [MethodCall] call to Array +# 28| getReceiver: [SelfVariableAccess] self +# 28| getArgument: [StringLiteral] "foo" +# 28| getComponent: [StringTextComponent] foo # 31| getStmt: [ClassDeclaration] ClassD # 31| getScopeExpr: [ConstantReadAccess] ModuleA # 31| getSuperclassExpr: [ConstantReadAccess] ClassA @@ -2309,14 +2345,15 @@ literals/literals.rb: # 171| getComponent: [StringTextComponent] # 171| # 174| getStmt: [Method] m -# 175| getStmt: [AssignExpr] ... = ... -# 175| getAnOperand/getLeftOperand: [LocalVariableAccess] query -# 175| getAnOperand/getRightOperand: [HereDoc] <<-BLA -# 175| getComponent: [StringTextComponent] -# 175| some text -# 176| getComponent: [StringEscapeSequenceComponent] \n -# 176| getComponent: [StringTextComponent] and some more -# 176| +# 175| getBody: [StmtSequence] ... +# 175| getStmt: [AssignExpr] ... = ... +# 175| getAnOperand/getLeftOperand: [LocalVariableAccess] query +# 175| getAnOperand/getRightOperand: [HereDoc] <<-BLA +# 175| getComponent: [StringTextComponent] +# 175| some text +# 176| getComponent: [StringEscapeSequenceComponent] \n +# 176| getComponent: [StringTextComponent] and some more +# 176| # 180| getStmt: [AssignExpr] ... = ... # 180| getAnOperand/getLeftOperand: [LocalVariableAccess] query # 180| getAnOperand/getRightOperand: [HereDoc] <<~SQUIGGLY @@ -2648,9 +2685,10 @@ modules/modules.rb: # 90| getStmt: [MethodCall] call to module_eval # 90| getReceiver: [ConstantReadAccess] Object # 90| getBlock: [BraceBlock] { ... } -# 90| getStmt: [MethodCall] call to prepend -# 90| getReceiver: [SelfVariableAccess] self -# 90| getArgument: [ConstantReadAccess] Other +# 90| getBody: [StmtSequence] ... +# 90| getStmt: [MethodCall] call to prepend +# 90| getReceiver: [SelfVariableAccess] self +# 90| getArgument: [ConstantReadAccess] Other # 91| getStmt: [ModuleDeclaration] Y # 91| getScopeExpr: [ConstantReadAccess] Foo1 # 95| getStmt: [ModuleDeclaration] IncludeTest2 @@ -2745,26 +2783,27 @@ operations/operations.rb: # 28| getStmt: [DefinedExpr] defined? ... # 28| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] foo # 29| getStmt: [Method] foo -# 29| getStmt: [ReturnStmt] return -# 29| getValue: [ArgumentList] ..., ... -# 29| getElement: [IntegerLiteral] 1 -# 29| getElement: [SplatExpr] * ... -# 29| getAnOperand/getOperand/getReceiver: [ArrayLiteral] [...] -# 29| getElement: [IntegerLiteral] 2 -# 29| getElement: [Pair] Pair -# 29| getKey: [SymbolLiteral] :a -# 29| getComponent: [StringTextComponent] a -# 29| getValue: [IntegerLiteral] 3 -# 29| getElement: [HashSplatExpr] ** ... -# 29| getAnOperand/getOperand/getReceiver: [HashLiteral] {...} -# 29| getElement: [Pair] Pair -# 29| getKey: [SymbolLiteral] :b -# 29| getComponent: [StringTextComponent] b -# 29| getValue: [IntegerLiteral] 4 -# 29| getElement: [Pair] Pair -# 29| getKey: [SymbolLiteral] :c -# 29| getComponent: [StringTextComponent] c -# 29| getValue: [IntegerLiteral] 5 +# 29| getBody: [StmtSequence] ... +# 29| getStmt: [ReturnStmt] return +# 29| getValue: [ArgumentList] ..., ... +# 29| getElement: [IntegerLiteral] 1 +# 29| getElement: [SplatExpr] * ... +# 29| getAnOperand/getOperand/getReceiver: [ArrayLiteral] [...] +# 29| getElement: [IntegerLiteral] 2 +# 29| getElement: [Pair] Pair +# 29| getKey: [SymbolLiteral] :a +# 29| getComponent: [StringTextComponent] a +# 29| getValue: [IntegerLiteral] 3 +# 29| getElement: [HashSplatExpr] ** ... +# 29| getAnOperand/getOperand/getReceiver: [HashLiteral] {...} +# 29| getElement: [Pair] Pair +# 29| getKey: [SymbolLiteral] :b +# 29| getComponent: [StringTextComponent] b +# 29| getValue: [IntegerLiteral] 4 +# 29| getElement: [Pair] Pair +# 29| getKey: [SymbolLiteral] :c +# 29| getComponent: [StringTextComponent] c +# 29| getValue: [IntegerLiteral] 5 # 32| getStmt: [AddExpr] ... + ... # 32| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] w # 32| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 234 @@ -2899,10 +2938,11 @@ operations/operations.rb: # 95| getDefiningAccess: [LocalVariableAccess] a # 95| getParameter: [SimpleParameter] b # 95| getDefiningAccess: [LocalVariableAccess] b -# 96| getStmt: [ReturnStmt] return -# 96| getValue: [LogicalAndExpr] ... && ... -# 96| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a -# 97| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] b +# 96| getBody: [StmtSequence] ... +# 96| getStmt: [ReturnStmt] return +# 96| getValue: [LogicalAndExpr] ... && ... +# 96| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a +# 97| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] b # 107| getStmt: [ClassDeclaration] X # 108| getStmt: [AssignExpr] ... = ... # 108| getAnOperand/getLeftOperand: [InstanceVariableAccess] @x @@ -2979,14 +3019,15 @@ params/params.rb: # 9| getDefiningAccess: [LocalVariableAccess] key # 9| getParameter: [SimpleParameter] value # 9| getDefiningAccess: [LocalVariableAccess] value -# 10| getStmt: [MethodCall] call to puts -# 10| getReceiver: [SelfVariableAccess] self -# 10| getArgument: [StringLiteral] "#{...} -> #{...}" -# 10| getComponent: [StringInterpolationComponent] #{...} -# 10| getStmt: [LocalVariableAccess] key -# 10| getComponent: [StringTextComponent] -> -# 10| getComponent: [StringInterpolationComponent] #{...} -# 10| getStmt: [LocalVariableAccess] value +# 10| getBody: [StmtSequence] ... +# 10| getStmt: [MethodCall] call to puts +# 10| getReceiver: [SelfVariableAccess] self +# 10| getArgument: [StringLiteral] "#{...} -> #{...}" +# 10| getComponent: [StringInterpolationComponent] #{...} +# 10| getStmt: [LocalVariableAccess] key +# 10| getComponent: [StringTextComponent] -> +# 10| getComponent: [StringInterpolationComponent] #{...} +# 10| getStmt: [LocalVariableAccess] value # 14| getStmt: [AssignExpr] ... = ... # 14| getAnOperand/getLeftOperand: [LocalVariableAccess] sum # 14| getAnOperand/getRightOperand: [Lambda] -> { ... } @@ -2994,9 +3035,10 @@ params/params.rb: # 14| getDefiningAccess: [LocalVariableAccess] foo # 14| getParameter: [SimpleParameter] bar # 14| getDefiningAccess: [LocalVariableAccess] bar -# 14| getStmt: [AddExpr] ... + ... -# 14| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo -# 14| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] bar +# 14| getBody: [StmtSequence] ... +# 14| getStmt: [AddExpr] ... + ... +# 14| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo +# 14| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] bar # 17| getStmt: [Method] destructured_method_param # 17| getParameter: [DestructuredParameter] (..., ...) # 17| getElement: [LocalVariableAccess] a @@ -3011,11 +3053,12 @@ params/params.rb: # 22| getParameter: [DestructuredParameter] (..., ...) # 22| getElement: [LocalVariableAccess] a # 22| getElement: [LocalVariableAccess] b -# 22| getStmt: [MethodCall] call to puts -# 22| getReceiver: [SelfVariableAccess] self -# 22| getArgument: [AddExpr] ... + ... -# 22| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a -# 22| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] b +# 22| getBody: [StmtSequence] ... +# 22| getStmt: [MethodCall] call to puts +# 22| getReceiver: [SelfVariableAccess] self +# 22| getArgument: [AddExpr] ... + ... +# 22| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a +# 22| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] b # 25| getStmt: [AssignExpr] ... = ... # 25| getAnOperand/getLeftOperand: [LocalVariableAccess] sum_four_values # 25| getAnOperand/getRightOperand: [Lambda] -> { ... } @@ -3025,13 +3068,14 @@ params/params.rb: # 25| getParameter: [DestructuredParameter] (..., ...) # 25| getElement: [LocalVariableAccess] third # 25| getElement: [LocalVariableAccess] fourth -# 26| getStmt: [AddExpr] ... + ... -# 26| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... +# 26| getBody: [StmtSequence] ... +# 26| getStmt: [AddExpr] ... + ... # 26| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... -# 26| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] first -# 26| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] second -# 26| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] third -# 26| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] fourth +# 26| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... +# 26| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] first +# 26| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] second +# 26| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] third +# 26| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] fourth # 30| getStmt: [Method] method_with_splat # 30| getParameter: [SimpleParameter] wibble # 30| getDefiningAccess: [LocalVariableAccess] wibble @@ -3065,26 +3109,28 @@ params/params.rb: # 41| getParameter: [KeywordParameter] bar # 41| getDefiningAccess: [LocalVariableAccess] bar # 41| getDefaultValue: [IntegerLiteral] 7 -# 42| getStmt: [AddExpr] ... + ... -# 42| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... -# 42| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 42| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] foo -# 42| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] bar +# 42| getBody: [StmtSequence] ... +# 42| getStmt: [AddExpr] ... + ... +# 42| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... +# 42| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 42| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] foo +# 42| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] bar # 46| getStmt: [Method] use_block_with_keyword # 46| getParameter: [BlockParameter] &block # 46| getDefiningAccess: [LocalVariableAccess] block -# 47| getStmt: [MethodCall] call to puts -# 47| getReceiver: [SelfVariableAccess] self -# 47| getArgument: [MethodCall] call to call -# 47| getReceiver: [LocalVariableAccess] block -# 47| getArgument: [Pair] Pair -# 47| getKey: [SymbolLiteral] :bar -# 47| getComponent: [StringTextComponent] bar -# 47| getValue: [IntegerLiteral] 2 -# 47| getArgument: [Pair] Pair -# 47| getKey: [SymbolLiteral] :foo -# 47| getComponent: [StringTextComponent] foo -# 47| getValue: [IntegerLiteral] 3 +# 47| getBody: [StmtSequence] ... +# 47| getStmt: [MethodCall] call to puts +# 47| getReceiver: [SelfVariableAccess] self +# 47| getArgument: [MethodCall] call to call +# 47| getReceiver: [LocalVariableAccess] block +# 47| getArgument: [Pair] Pair +# 47| getKey: [SymbolLiteral] :bar +# 47| getComponent: [StringTextComponent] bar +# 47| getValue: [IntegerLiteral] 2 +# 47| getArgument: [Pair] Pair +# 47| getKey: [SymbolLiteral] :foo +# 47| getComponent: [StringTextComponent] foo +# 47| getValue: [IntegerLiteral] 3 # 49| getStmt: [MethodCall] call to use_block_with_keyword # 49| getReceiver: [SelfVariableAccess] self # 49| getBlock: [DoBlock] do ... end @@ -3093,9 +3139,10 @@ params/params.rb: # 49| getParameter: [KeywordParameter] yy # 49| getDefiningAccess: [LocalVariableAccess] yy # 49| getDefaultValue: [IntegerLiteral] 100 -# 50| getStmt: [AddExpr] ... + ... -# 50| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] xx -# 50| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] yy +# 50| getBody: [StmtSequence] ... +# 50| getStmt: [AddExpr] ... + ... +# 50| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] xx +# 50| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] yy # 53| getStmt: [AssignExpr] ... = ... # 53| getAnOperand/getLeftOperand: [LocalVariableAccess] lambda_with_keyword_params # 53| getAnOperand/getRightOperand: [Lambda] -> { ... } @@ -3106,11 +3153,12 @@ params/params.rb: # 53| getParameter: [KeywordParameter] z # 53| getDefiningAccess: [LocalVariableAccess] z # 53| getDefaultValue: [IntegerLiteral] 3 -# 54| getStmt: [AddExpr] ... + ... -# 54| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... -# 54| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 54| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] y -# 54| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] z +# 54| getBody: [StmtSequence] ... +# 54| getStmt: [AddExpr] ... + ... +# 54| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... +# 54| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 54| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] y +# 54| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] z # 58| getStmt: [Method] method_with_optional_params # 58| getParameter: [SimpleParameter] val1 # 58| getDefiningAccess: [LocalVariableAccess] val1 @@ -3123,10 +3171,11 @@ params/params.rb: # 62| getStmt: [Method] use_block_with_optional # 62| getParameter: [BlockParameter] &block # 62| getDefiningAccess: [LocalVariableAccess] block -# 63| getStmt: [MethodCall] call to call -# 63| getReceiver: [LocalVariableAccess] block -# 63| getArgument: [StringLiteral] "Zeus" -# 63| getComponent: [StringTextComponent] Zeus +# 63| getBody: [StmtSequence] ... +# 63| getStmt: [MethodCall] call to call +# 63| getReceiver: [LocalVariableAccess] block +# 63| getArgument: [StringLiteral] "Zeus" +# 63| getComponent: [StringTextComponent] Zeus # 65| getStmt: [MethodCall] call to use_block_with_optional # 65| getReceiver: [SelfVariableAccess] self # 65| getBlock: [DoBlock] do ... end @@ -3135,15 +3184,16 @@ params/params.rb: # 65| getParameter: [OptionalParameter] age # 65| getDefiningAccess: [LocalVariableAccess] age # 65| getDefaultValue: [IntegerLiteral] 99 -# 66| getStmt: [MethodCall] call to puts -# 66| getReceiver: [SelfVariableAccess] self -# 66| getArgument: [StringLiteral] "#{...} is #{...} years old" -# 66| getComponent: [StringInterpolationComponent] #{...} -# 66| getStmt: [LocalVariableAccess] name -# 66| getComponent: [StringTextComponent] is -# 66| getComponent: [StringInterpolationComponent] #{...} -# 66| getStmt: [LocalVariableAccess] age -# 66| getComponent: [StringTextComponent] years old +# 66| getBody: [StmtSequence] ... +# 66| getStmt: [MethodCall] call to puts +# 66| getReceiver: [SelfVariableAccess] self +# 66| getArgument: [StringLiteral] "#{...} is #{...} years old" +# 66| getComponent: [StringInterpolationComponent] #{...} +# 66| getStmt: [LocalVariableAccess] name +# 66| getComponent: [StringTextComponent] is +# 66| getComponent: [StringInterpolationComponent] #{...} +# 66| getStmt: [LocalVariableAccess] age +# 66| getComponent: [StringTextComponent] years old # 70| getStmt: [AssignExpr] ... = ... # 70| getAnOperand/getLeftOperand: [LocalVariableAccess] lambda_with_optional_params # 70| getAnOperand/getRightOperand: [Lambda] -> { ... } @@ -3155,11 +3205,12 @@ params/params.rb: # 70| getParameter: [OptionalParameter] c # 70| getDefiningAccess: [LocalVariableAccess] c # 70| getDefaultValue: [IntegerLiteral] 20 -# 70| getStmt: [AddExpr] ... + ... -# 70| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... -# 70| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a -# 70| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] b -# 70| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] c +# 70| getBody: [StmtSequence] ... +# 70| getStmt: [AddExpr] ... + ... +# 70| getAnOperand/getLeftOperand/getReceiver: [AddExpr] ... + ... +# 70| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a +# 70| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] b +# 70| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] c # 73| getStmt: [Method] method_with_nil_splat # 73| getParameter: [SimpleParameter] wibble # 73| getDefiningAccess: [LocalVariableAccess] wibble @@ -3175,14 +3226,15 @@ params/params.rb: # 81| getDefiningAccess: [LocalVariableAccess] array # 81| getParameter: [BlockParameter] & # 81| getDefiningAccess: [LocalVariableAccess] __synth__0 -# 82| getStmt: [MethodCall] call to proc -# 82| getReceiver: [SelfVariableAccess] self -# 82| getArgument: [BlockArgument] &... -# 82| getValue: [LocalVariableAccess] __synth__0 -# 83| getStmt: [MethodCall] call to each -# 83| getReceiver: [LocalVariableAccess] array -# 83| getArgument: [BlockArgument] &... -# 83| getValue: [LocalVariableAccess] __synth__0 +# 82| getBody: [StmtSequence] ... +# 82| getStmt: [MethodCall] call to proc +# 82| getReceiver: [SelfVariableAccess] self +# 82| getArgument: [BlockArgument] &... +# 82| getValue: [LocalVariableAccess] __synth__0 +# 83| getStmt: [MethodCall] call to each +# 83| getReceiver: [LocalVariableAccess] array +# 83| getArgument: [BlockArgument] &... +# 83| getValue: [LocalVariableAccess] __synth__0 # 86| getStmt: [MethodCall] call to run_block # 86| getReceiver: [SelfVariableAccess] self # 86| getBlock: [BraceBlock] { ... } @@ -3190,27 +3242,30 @@ params/params.rb: # 86| getDefiningAccess: [LocalVariableAccess] x # 86| getLocalVariable: [LocalVariableAccess] y # 86| getLocalVariable: [LocalVariableAccess] z -# 86| getStmt: [MethodCall] call to puts -# 86| getReceiver: [SelfVariableAccess] self -# 86| getArgument: [LocalVariableAccess] x +# 86| getBody: [StmtSequence] ... +# 86| getStmt: [MethodCall] call to puts +# 86| getReceiver: [SelfVariableAccess] self +# 86| getArgument: [LocalVariableAccess] x # 89| getStmt: [Method] anonymous_splat_parameter # 89| getParameter: [SimpleParameter] array # 89| getDefiningAccess: [LocalVariableAccess] array # 89| getParameter: [SplatParameter] * # 89| getDefiningAccess: [LocalVariableAccess] __synth__0 -# 90| getStmt: [MethodCall] call to concat -# 90| getReceiver: [LocalVariableAccess] array -# 90| getArgument: [SplatExpr] * ... -# 90| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0 +# 90| getBody: [StmtSequence] ... +# 90| getStmt: [MethodCall] call to concat +# 90| getReceiver: [LocalVariableAccess] array +# 90| getArgument: [SplatExpr] * ... +# 90| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0 # 94| getStmt: [Method] anonymous_hash_splat_parameter # 94| getParameter: [SimpleParameter] hash # 94| getDefiningAccess: [LocalVariableAccess] hash # 94| getParameter: [HashSplatParameter] ** # 94| getDefiningAccess: [LocalVariableAccess] __synth__0 -# 95| getStmt: [MethodCall] call to merge -# 95| getReceiver: [LocalVariableAccess] hash -# 95| getArgument: [HashSplatExpr] ** ... -# 95| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0 +# 95| getBody: [StmtSequence] ... +# 95| getStmt: [MethodCall] call to merge +# 95| getReceiver: [LocalVariableAccess] hash +# 95| getArgument: [HashSplatExpr] ** ... +# 95| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0 # 98| getStmt: [ClassDeclaration] Sup # 99| getStmt: [Method] m # 99| getParameter: [SimpleParameter] x @@ -3221,16 +3276,17 @@ params/params.rb: # 99| getDefiningAccess: [LocalVariableAccess] k # 99| getParameter: [HashSplatParameter] **kwargs # 99| getDefiningAccess: [LocalVariableAccess] kwargs -# 100| getStmt: [MethodCall] call to print -# 100| getReceiver: [SelfVariableAccess] self -# 100| getArgument: [AddExpr] ... + ... -# 100| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x -# 100| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 -# 101| getStmt: [MethodCall] call to print -# 101| getReceiver: [SelfVariableAccess] self -# 101| getArgument: [AddExpr] ... + ... -# 101| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] k -# 101| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 +# 100| getBody: [StmtSequence] ... +# 100| getStmt: [MethodCall] call to print +# 100| getReceiver: [SelfVariableAccess] self +# 100| getArgument: [AddExpr] ... + ... +# 100| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x +# 100| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 +# 101| getStmt: [MethodCall] call to print +# 101| getReceiver: [SelfVariableAccess] self +# 101| getArgument: [AddExpr] ... + ... +# 101| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] k +# 101| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1 # 105| getStmt: [ClassDeclaration] Sub # 105| getSuperclassExpr: [ConstantReadAccess] Sup # 106| getStmt: [Method] m @@ -3242,15 +3298,16 @@ params/params.rb: # 106| getDefiningAccess: [LocalVariableAccess] k # 106| getParameter: [HashSplatParameter] **kwargs # 106| getDefiningAccess: [LocalVariableAccess] kwargs -# 107| getStmt: [SuperCall] super call to m -# 107| getArgument: [LocalVariableAccess] y -# 107| getArgument: [SplatExpr] * ... -# 107| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] rest -# 107| getArgument: [Pair] Pair -# 107| getKey: [SymbolLiteral] k -# 107| getValue: [LocalVariableAccess] k -# 107| getArgument: [HashSplatExpr] ** ... -# 107| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] kwargs +# 107| getBody: [StmtSequence] ... +# 107| getStmt: [SuperCall] super call to m +# 107| getArgument: [LocalVariableAccess] y +# 107| getArgument: [SplatExpr] * ... +# 107| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] rest +# 107| getArgument: [Pair] Pair +# 107| getKey: [SymbolLiteral] k +# 107| getValue: [LocalVariableAccess] k +# 107| getArgument: [HashSplatExpr] ** ... +# 107| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] kwargs # 111| getStmt: [MethodCall] call to m # 111| getReceiver: [MethodCall] call to new # 111| getReceiver: [ConstantReadAccess] Sub @@ -3288,57 +3345,59 @@ gems/test.gemspec: # 1| getBlock: [DoBlock] do ... end # 1| getParameter: [SimpleParameter] s # 1| getDefiningAccess: [LocalVariableAccess] s -# 2| getStmt: [AssignExpr] ... = ... -# 2| getAnOperand/getLeftOperand: [MethodCall] call to name -# 2| getReceiver: [LocalVariableAccess] s -# 2| getAnOperand/getRightOperand: [StringLiteral] "test" -# 2| getComponent: [StringTextComponent] test -# 3| getStmt: [AssignExpr] ... = ... -# 3| getAnOperand/getLeftOperand: [MethodCall] call to version -# 3| getReceiver: [LocalVariableAccess] s -# 3| getAnOperand/getRightOperand: [StringLiteral] "0.0.0" -# 3| getComponent: [StringTextComponent] 0.0.0 -# 4| getStmt: [AssignExpr] ... = ... -# 4| getAnOperand/getLeftOperand: [MethodCall] call to summary -# 4| getReceiver: [LocalVariableAccess] s -# 4| getAnOperand/getRightOperand: [StringLiteral] "foo!" -# 4| getComponent: [StringTextComponent] foo! -# 5| getStmt: [AssignExpr] ... = ... -# 5| getAnOperand/getLeftOperand: [MethodCall] call to description -# 5| getReceiver: [LocalVariableAccess] s -# 5| getAnOperand/getRightOperand: [StringLiteral] "A test" -# 5| getComponent: [StringTextComponent] A test -# 6| getStmt: [AssignExpr] ... = ... -# 6| getAnOperand/getLeftOperand: [MethodCall] call to authors -# 6| getReceiver: [LocalVariableAccess] s -# 6| getAnOperand/getRightOperand: [ArrayLiteral] [...] -# 6| getElement: [StringLiteral] "Mona Lisa" -# 6| getComponent: [StringTextComponent] Mona Lisa -# 7| getStmt: [AssignExpr] ... = ... -# 7| getAnOperand/getLeftOperand: [MethodCall] call to email -# 7| getReceiver: [LocalVariableAccess] s -# 7| getAnOperand/getRightOperand: [StringLiteral] "mona@example.com" -# 7| getComponent: [StringTextComponent] mona@example.com -# 8| getStmt: [AssignExpr] ... = ... -# 8| getAnOperand/getLeftOperand: [MethodCall] call to files -# 8| getReceiver: [LocalVariableAccess] s -# 8| getAnOperand/getRightOperand: [ArrayLiteral] [...] -# 8| getElement: [StringLiteral] "lib/test.rb" -# 8| getComponent: [StringTextComponent] lib/test.rb -# 9| getStmt: [AssignExpr] ... = ... -# 9| getAnOperand/getLeftOperand: [MethodCall] call to homepage -# 9| getReceiver: [LocalVariableAccess] s -# 9| getAnOperand/getRightOperand: [StringLiteral] "https://github.com/github/cod..." -# 9| getComponent: [StringTextComponent] https://github.com/github/codeql-ruby +# 2| getBody: [StmtSequence] ... +# 2| getStmt: [AssignExpr] ... = ... +# 2| getAnOperand/getLeftOperand: [MethodCall] call to name +# 2| getReceiver: [LocalVariableAccess] s +# 2| getAnOperand/getRightOperand: [StringLiteral] "test" +# 2| getComponent: [StringTextComponent] test +# 3| getStmt: [AssignExpr] ... = ... +# 3| getAnOperand/getLeftOperand: [MethodCall] call to version +# 3| getReceiver: [LocalVariableAccess] s +# 3| getAnOperand/getRightOperand: [StringLiteral] "0.0.0" +# 3| getComponent: [StringTextComponent] 0.0.0 +# 4| getStmt: [AssignExpr] ... = ... +# 4| getAnOperand/getLeftOperand: [MethodCall] call to summary +# 4| getReceiver: [LocalVariableAccess] s +# 4| getAnOperand/getRightOperand: [StringLiteral] "foo!" +# 4| getComponent: [StringTextComponent] foo! +# 5| getStmt: [AssignExpr] ... = ... +# 5| getAnOperand/getLeftOperand: [MethodCall] call to description +# 5| getReceiver: [LocalVariableAccess] s +# 5| getAnOperand/getRightOperand: [StringLiteral] "A test" +# 5| getComponent: [StringTextComponent] A test +# 6| getStmt: [AssignExpr] ... = ... +# 6| getAnOperand/getLeftOperand: [MethodCall] call to authors +# 6| getReceiver: [LocalVariableAccess] s +# 6| getAnOperand/getRightOperand: [ArrayLiteral] [...] +# 6| getElement: [StringLiteral] "Mona Lisa" +# 6| getComponent: [StringTextComponent] Mona Lisa +# 7| getStmt: [AssignExpr] ... = ... +# 7| getAnOperand/getLeftOperand: [MethodCall] call to email +# 7| getReceiver: [LocalVariableAccess] s +# 7| getAnOperand/getRightOperand: [StringLiteral] "mona@example.com" +# 7| getComponent: [StringTextComponent] mona@example.com +# 8| getStmt: [AssignExpr] ... = ... +# 8| getAnOperand/getLeftOperand: [MethodCall] call to files +# 8| getReceiver: [LocalVariableAccess] s +# 8| getAnOperand/getRightOperand: [ArrayLiteral] [...] +# 8| getElement: [StringLiteral] "lib/test.rb" +# 8| getComponent: [StringTextComponent] lib/test.rb +# 9| getStmt: [AssignExpr] ... = ... +# 9| getAnOperand/getLeftOperand: [MethodCall] call to homepage +# 9| getReceiver: [LocalVariableAccess] s +# 9| getAnOperand/getRightOperand: [StringLiteral] "https://github.com/github/cod..." +# 9| getComponent: [StringTextComponent] https://github.com/github/codeql-ruby gems/lib/test.rb: # 1| [Toplevel] test.rb # 1| getStmt: [ClassDeclaration] Foo # 2| getStmt: [SingletonMethod] greet # 2| getObject: [SelfVariableAccess] self -# 3| getStmt: [MethodCall] call to puts -# 3| getReceiver: [SelfVariableAccess] self -# 3| getArgument: [StringLiteral] "Hello" -# 3| getComponent: [StringTextComponent] Hello +# 3| getBody: [StmtSequence] ... +# 3| getStmt: [MethodCall] call to puts +# 3| getReceiver: [SelfVariableAccess] self +# 3| getArgument: [StringLiteral] "Hello" +# 3| getComponent: [StringTextComponent] Hello modules/toplevel.rb: # 1| [Toplevel] toplevel.rb # 1| getStmt: [MethodCall] call to puts diff --git a/ruby/ql/test/library-tests/ast/AstDesugar.expected b/ruby/ql/test/library-tests/ast/AstDesugar.expected index 294438607496..40594888db15 100644 --- a/ruby/ql/test/library-tests/ast/AstDesugar.expected +++ b/ruby/ql/test/library-tests/ast/AstDesugar.expected @@ -38,11 +38,12 @@ calls/calls.rb: # 223| getBlock: [BraceBlock] { ... } # 223| getParameter: [SimpleParameter] __synth__0__1 # 223| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 223| getStmt: [AssignExpr] ... = ... -# 223| getAnOperand/getLeftOperand: [LocalVariableAccess] x -# 223| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 -# 224| getStmt: [MethodCall] call to baz -# 224| getReceiver: [SelfVariableAccess] self +# 223| getBody: [StmtSequence] ... +# 223| getStmt: [AssignExpr] ... = ... +# 223| getAnOperand/getLeftOperand: [LocalVariableAccess] x +# 223| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 +# 224| getStmt: [MethodCall] call to baz +# 224| getReceiver: [SelfVariableAccess] self # 226| [ForExpr] for ... in ... # 226| getDesugared: [StmtSequence] ... # 226| getStmt: [IfExpr] if ... @@ -58,11 +59,12 @@ calls/calls.rb: # 226| getBlock: [BraceBlock] { ... } # 226| getParameter: [SimpleParameter] __synth__0__1 # 226| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 226| getStmt: [AssignExpr] ... = ... -# 226| getAnOperand/getLeftOperand: [LocalVariableAccess] x -# 226| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 -# 227| getStmt: [MethodCall] call to baz -# 227| getReceiver: [ConstantReadAccess] X +# 226| getBody: [StmtSequence] ... +# 226| getStmt: [AssignExpr] ... = ... +# 226| getAnOperand/getLeftOperand: [LocalVariableAccess] x +# 226| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 +# 227| getStmt: [MethodCall] call to baz +# 227| getReceiver: [ConstantReadAccess] X # 246| [HashLiteral] {...} # 246| getDesugared: [MethodCall] call to [] # 246| getReceiver: [ConstantReadAccess] Hash @@ -302,33 +304,34 @@ calls/calls.rb: # 339| getBlock: [BraceBlock] { ... } # 339| getParameter: [SimpleParameter] __synth__0__1 # 339| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 339| getStmt: [AssignExpr] ... = ... -# 339| getDesugared: [StmtSequence] ... -# 339| getStmt: [AssignExpr] ... = ... -# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__3__1 -# 339| getAnOperand/getRightOperand: [SplatExpr] * ... -# 339| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1 -# 339| getStmt: [AssignExpr] ... = ... -# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] x -# 339| getAnOperand/getRightOperand: [MethodCall] call to [] -# 339| getReceiver: [LocalVariableAccess] __synth__3__1 -# 339| getArgument: [IntegerLiteral] 0 -# 339| getStmt: [AssignExpr] ... = ... -# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] y -# 339| getAnOperand/getRightOperand: [MethodCall] call to [] -# 339| getReceiver: [LocalVariableAccess] __synth__3__1 -# 339| getArgument: [IntegerLiteral] 1 -# 339| getStmt: [AssignExpr] ... = ... -# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] z -# 339| getAnOperand/getRightOperand: [MethodCall] call to [] -# 339| getReceiver: [LocalVariableAccess] __synth__3__1 -# 339| getArgument: [IntegerLiteral] 2 -# 339| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...) -# 340| getStmt: [MethodCall] call to foo -# 340| getReceiver: [SelfVariableAccess] self -# 340| getArgument: [LocalVariableAccess] x -# 340| getArgument: [LocalVariableAccess] y -# 340| getArgument: [LocalVariableAccess] z +# 339| getBody: [StmtSequence] ... +# 339| getStmt: [AssignExpr] ... = ... +# 339| getDesugared: [StmtSequence] ... +# 339| getStmt: [AssignExpr] ... = ... +# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__3__1 +# 339| getAnOperand/getRightOperand: [SplatExpr] * ... +# 339| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1 +# 339| getStmt: [AssignExpr] ... = ... +# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] x +# 339| getAnOperand/getRightOperand: [MethodCall] call to [] +# 339| getReceiver: [LocalVariableAccess] __synth__3__1 +# 339| getArgument: [IntegerLiteral] 0 +# 339| getStmt: [AssignExpr] ... = ... +# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] y +# 339| getAnOperand/getRightOperand: [MethodCall] call to [] +# 339| getReceiver: [LocalVariableAccess] __synth__3__1 +# 339| getArgument: [IntegerLiteral] 1 +# 339| getStmt: [AssignExpr] ... = ... +# 339| getAnOperand/getLeftOperand: [LocalVariableAccess] z +# 339| getAnOperand/getRightOperand: [MethodCall] call to [] +# 339| getReceiver: [LocalVariableAccess] __synth__3__1 +# 339| getArgument: [IntegerLiteral] 2 +# 339| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...) +# 340| getStmt: [MethodCall] call to foo +# 340| getReceiver: [SelfVariableAccess] self +# 340| getArgument: [LocalVariableAccess] x +# 340| getArgument: [LocalVariableAccess] y +# 340| getArgument: [LocalVariableAccess] z # 361| [MethodCall] call to empty? # 361| getDesugared: [StmtSequence] ... # 361| getStmt: [AssignExpr] ... = ... @@ -360,7 +363,8 @@ calls/calls.rb: # 363| getBlock: [BraceBlock] { ... } # 363| getParameter: [SimpleParameter] x # 363| getDefiningAccess: [LocalVariableAccess] x -# 363| getStmt: [LocalVariableAccess] x +# 363| getBody: [StmtSequence] ... +# 363| getStmt: [LocalVariableAccess] x control/cases.rb: # 90| [ArrayLiteral] %w(...) # 90| getDesugared: [MethodCall] call to [] @@ -647,18 +651,19 @@ control/loops.rb: # 9| getBlock: [BraceBlock] { ... } # 9| getParameter: [SimpleParameter] __synth__0__1 # 9| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 9| getStmt: [AssignExpr] ... = ... -# 9| getAnOperand/getLeftOperand: [LocalVariableAccess] n -# 9| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 -# 10| getStmt: [AssignAddExpr] ... += ... -# 10| getDesugared: [AssignExpr] ... = ... -# 10| getAnOperand/getLeftOperand: [LocalVariableAccess] sum -# 10| getAnOperand/getRightOperand: [AddExpr] ... + ... -# 10| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum -# 10| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] n -# 11| getStmt: [AssignExpr] ... = ... -# 11| getAnOperand/getLeftOperand: [LocalVariableAccess] foo -# 11| getAnOperand/getRightOperand: [LocalVariableAccess] n +# 9| getBody: [StmtSequence] ... +# 9| getStmt: [AssignExpr] ... = ... +# 9| getAnOperand/getLeftOperand: [LocalVariableAccess] n +# 9| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 +# 10| getStmt: [AssignAddExpr] ... += ... +# 10| getDesugared: [AssignExpr] ... = ... +# 10| getAnOperand/getLeftOperand: [LocalVariableAccess] sum +# 10| getAnOperand/getRightOperand: [AddExpr] ... + ... +# 10| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum +# 10| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] n +# 11| getStmt: [AssignExpr] ... = ... +# 11| getAnOperand/getLeftOperand: [LocalVariableAccess] foo +# 11| getAnOperand/getRightOperand: [LocalVariableAccess] n # 16| [ForExpr] for ... in ... # 16| getDesugared: [StmtSequence] ... # 16| getStmt: [IfExpr] if ... @@ -675,21 +680,22 @@ control/loops.rb: # 16| getBlock: [BraceBlock] { ... } # 16| getParameter: [SimpleParameter] __synth__0__1 # 16| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 16| getStmt: [AssignExpr] ... = ... -# 16| getAnOperand/getLeftOperand: [LocalVariableAccess] n -# 16| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 -# 17| getStmt: [AssignAddExpr] ... += ... -# 17| getDesugared: [AssignExpr] ... = ... -# 17| getAnOperand/getLeftOperand: [LocalVariableAccess] sum -# 17| getAnOperand/getRightOperand: [AddExpr] ... + ... -# 17| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum -# 17| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] n -# 18| getStmt: [AssignSubExpr] ... -= ... -# 18| getDesugared: [AssignExpr] ... = ... -# 18| getAnOperand/getLeftOperand: [LocalVariableAccess] foo -# 18| getAnOperand/getRightOperand: [SubExpr] ... - ... -# 18| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo -# 18| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] n +# 16| getBody: [StmtSequence] ... +# 16| getStmt: [AssignExpr] ... = ... +# 16| getAnOperand/getLeftOperand: [LocalVariableAccess] n +# 16| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 +# 17| getStmt: [AssignAddExpr] ... += ... +# 17| getDesugared: [AssignExpr] ... = ... +# 17| getAnOperand/getLeftOperand: [LocalVariableAccess] sum +# 17| getAnOperand/getRightOperand: [AddExpr] ... + ... +# 17| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum +# 17| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] n +# 18| getStmt: [AssignSubExpr] ... -= ... +# 18| getDesugared: [AssignExpr] ... = ... +# 18| getAnOperand/getLeftOperand: [LocalVariableAccess] foo +# 18| getAnOperand/getRightOperand: [SubExpr] ... - ... +# 18| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo +# 18| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] n # 22| [ForExpr] for ... in ... # 22| getDesugared: [StmtSequence] ... # 22| getStmt: [IfExpr] if ... @@ -721,35 +727,36 @@ control/loops.rb: # 22| getBlock: [BraceBlock] { ... } # 22| getParameter: [SimpleParameter] __synth__0__1 # 22| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 22| getStmt: [AssignExpr] ... = ... -# 22| getDesugared: [StmtSequence] ... -# 22| getStmt: [AssignExpr] ... = ... -# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2__1 -# 22| getAnOperand/getRightOperand: [SplatExpr] * ... -# 22| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1 -# 22| getStmt: [AssignExpr] ... = ... -# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] key -# 22| getAnOperand/getRightOperand: [MethodCall] call to [] -# 22| getReceiver: [LocalVariableAccess] __synth__2__1 -# 22| getArgument: [IntegerLiteral] 0 -# 22| getStmt: [AssignExpr] ... = ... -# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] value -# 22| getAnOperand/getRightOperand: [MethodCall] call to [] -# 22| getReceiver: [LocalVariableAccess] __synth__2__1 -# 22| getArgument: [IntegerLiteral] 1 -# 22| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...) -# 23| getStmt: [AssignAddExpr] ... += ... -# 23| getDesugared: [AssignExpr] ... = ... -# 23| getAnOperand/getLeftOperand: [LocalVariableAccess] sum -# 23| getAnOperand/getRightOperand: [AddExpr] ... + ... -# 23| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum -# 23| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value -# 24| getStmt: [AssignMulExpr] ... *= ... -# 24| getDesugared: [AssignExpr] ... = ... -# 24| getAnOperand/getLeftOperand: [LocalVariableAccess] foo -# 24| getAnOperand/getRightOperand: [MulExpr] ... * ... -# 24| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo -# 24| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value +# 22| getBody: [StmtSequence] ... +# 22| getStmt: [AssignExpr] ... = ... +# 22| getDesugared: [StmtSequence] ... +# 22| getStmt: [AssignExpr] ... = ... +# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2__1 +# 22| getAnOperand/getRightOperand: [SplatExpr] * ... +# 22| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1 +# 22| getStmt: [AssignExpr] ... = ... +# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] key +# 22| getAnOperand/getRightOperand: [MethodCall] call to [] +# 22| getReceiver: [LocalVariableAccess] __synth__2__1 +# 22| getArgument: [IntegerLiteral] 0 +# 22| getStmt: [AssignExpr] ... = ... +# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] value +# 22| getAnOperand/getRightOperand: [MethodCall] call to [] +# 22| getReceiver: [LocalVariableAccess] __synth__2__1 +# 22| getArgument: [IntegerLiteral] 1 +# 22| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...) +# 23| getStmt: [AssignAddExpr] ... += ... +# 23| getDesugared: [AssignExpr] ... = ... +# 23| getAnOperand/getLeftOperand: [LocalVariableAccess] sum +# 23| getAnOperand/getRightOperand: [AddExpr] ... + ... +# 23| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum +# 23| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value +# 24| getStmt: [AssignMulExpr] ... *= ... +# 24| getDesugared: [AssignExpr] ... = ... +# 24| getAnOperand/getLeftOperand: [LocalVariableAccess] foo +# 24| getAnOperand/getRightOperand: [MulExpr] ... * ... +# 24| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo +# 24| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value # 28| [ForExpr] for ... in ... # 28| getDesugared: [StmtSequence] ... # 28| getStmt: [IfExpr] if ... @@ -781,36 +788,37 @@ control/loops.rb: # 28| getBlock: [BraceBlock] { ... } # 28| getParameter: [SimpleParameter] __synth__0__1 # 28| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 28| getStmt: [AssignExpr] ... = ... -# 28| getDesugared: [StmtSequence] ... -# 28| getStmt: [AssignExpr] ... = ... -# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2__1 -# 28| getAnOperand/getRightOperand: [SplatExpr] * ... -# 28| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1 -# 28| getStmt: [AssignExpr] ... = ... -# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] key -# 28| getAnOperand/getRightOperand: [MethodCall] call to [] -# 28| getReceiver: [LocalVariableAccess] __synth__2__1 -# 28| getArgument: [IntegerLiteral] 0 -# 28| getStmt: [AssignExpr] ... = ... -# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] value -# 28| getAnOperand/getRightOperand: [MethodCall] call to [] -# 28| getReceiver: [LocalVariableAccess] __synth__2__1 -# 28| getArgument: [IntegerLiteral] 1 -# 28| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...) -# 29| getStmt: [AssignAddExpr] ... += ... -# 29| getDesugared: [AssignExpr] ... = ... -# 29| getAnOperand/getLeftOperand: [LocalVariableAccess] sum -# 29| getAnOperand/getRightOperand: [AddExpr] ... + ... -# 29| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum -# 29| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value -# 30| getStmt: [AssignDivExpr] ... /= ... -# 30| getDesugared: [AssignExpr] ... = ... -# 30| getAnOperand/getLeftOperand: [LocalVariableAccess] foo -# 30| getAnOperand/getRightOperand: [DivExpr] ... / ... -# 30| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo -# 30| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value -# 31| getStmt: [BreakStmt] break +# 28| getBody: [StmtSequence] ... +# 28| getStmt: [AssignExpr] ... = ... +# 28| getDesugared: [StmtSequence] ... +# 28| getStmt: [AssignExpr] ... = ... +# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2__1 +# 28| getAnOperand/getRightOperand: [SplatExpr] * ... +# 28| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1 +# 28| getStmt: [AssignExpr] ... = ... +# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] key +# 28| getAnOperand/getRightOperand: [MethodCall] call to [] +# 28| getReceiver: [LocalVariableAccess] __synth__2__1 +# 28| getArgument: [IntegerLiteral] 0 +# 28| getStmt: [AssignExpr] ... = ... +# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] value +# 28| getAnOperand/getRightOperand: [MethodCall] call to [] +# 28| getReceiver: [LocalVariableAccess] __synth__2__1 +# 28| getArgument: [IntegerLiteral] 1 +# 28| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...) +# 29| getStmt: [AssignAddExpr] ... += ... +# 29| getDesugared: [AssignExpr] ... = ... +# 29| getAnOperand/getLeftOperand: [LocalVariableAccess] sum +# 29| getAnOperand/getRightOperand: [AddExpr] ... + ... +# 29| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] sum +# 29| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value +# 30| getStmt: [AssignDivExpr] ... /= ... +# 30| getDesugared: [AssignExpr] ... = ... +# 30| getAnOperand/getLeftOperand: [LocalVariableAccess] foo +# 30| getAnOperand/getRightOperand: [DivExpr] ... / ... +# 30| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] foo +# 30| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] value +# 31| getStmt: [BreakStmt] break # 36| [AssignAddExpr] ... += ... # 36| getDesugared: [AssignExpr] ... = ... # 36| getAnOperand/getLeftOperand: [LocalVariableAccess] x @@ -1090,16 +1098,17 @@ erb/template.html.erb: # 27| getBlock: [BraceBlock] { ... } # 27| getParameter: [SimpleParameter] __synth__0__1 # 27| getDefiningAccess: [LocalVariableAccess] __synth__0__1 -# 27| getStmt: [AssignExpr] ... = ... -# 27| getAnOperand/getLeftOperand: [LocalVariableAccess] x -# 27| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 -# 28| getStmt: [AssignAddExpr] ... += ... -# 28| getDesugared: [AssignExpr] ... = ... -# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] xs -# 28| getAnOperand/getRightOperand: [AddExpr] ... + ... -# 28| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] xs -# 28| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] x -# 29| getStmt: [LocalVariableAccess] xs +# 27| getBody: [StmtSequence] ... +# 27| getStmt: [AssignExpr] ... = ... +# 27| getAnOperand/getLeftOperand: [LocalVariableAccess] x +# 27| getAnOperand/getRightOperand: [LocalVariableAccess] __synth__0__1 +# 28| getStmt: [AssignAddExpr] ... += ... +# 28| getDesugared: [AssignExpr] ... = ... +# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] xs +# 28| getAnOperand/getRightOperand: [AddExpr] ... + ... +# 28| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] xs +# 28| getAnOperand/getArgument/getRightOperand: [LocalVariableAccess] x +# 29| getStmt: [LocalVariableAccess] xs gems/test.gemspec: # 2| [AssignExpr] ... = ... # 2| getDesugared: [StmtSequence] ... diff --git a/ruby/ql/test/library-tests/modules/methods.expected b/ruby/ql/test/library-tests/modules/methods.expected index 95ca9e9c260a..272081218c56 100644 --- a/ruby/ql/test/library-tests/modules/methods.expected +++ b/ruby/ql/test/library-tests/modules/methods.expected @@ -709,32 +709,40 @@ lookupMethod | unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | puts | calls.rb:102:5:102:30 | puts | | unresolved_subclass.rb:21:1:22:3 | UnresolvedNamespace::X1::X2::X3::A | to_s | calls.rb:172:5:173:7 | to_s | enclosingMethod +| calls.rb:2:5:2:14 | ... | calls.rb:1:1:3:3 | foo | | calls.rb:2:5:2:14 | call to puts | calls.rb:1:1:3:3 | foo | | calls.rb:2:5:2:14 | self | calls.rb:1:1:3:3 | foo | | calls.rb:2:10:2:14 | "foo" | calls.rb:1:1:3:3 | foo | | calls.rb:2:11:2:13 | foo | calls.rb:1:1:3:3 | foo | +| calls.rb:8:5:8:15 | ... | calls.rb:7:1:9:3 | bar | | calls.rb:8:5:8:15 | call to puts | calls.rb:7:1:9:3 | bar | | calls.rb:8:5:8:15 | self | calls.rb:7:1:9:3 | bar | | calls.rb:8:10:8:15 | "bar1" | calls.rb:7:1:9:3 | bar | | calls.rb:8:11:8:14 | bar1 | calls.rb:7:1:9:3 | bar | +| calls.rb:14:5:14:15 | ... | calls.rb:13:1:15:3 | bar | | calls.rb:14:5:14:15 | call to puts | calls.rb:13:1:15:3 | bar | | calls.rb:14:5:14:15 | self | calls.rb:13:1:15:3 | bar | | calls.rb:14:10:14:15 | "bar2" | calls.rb:13:1:15:3 | bar | | calls.rb:14:11:14:14 | bar2 | calls.rb:13:1:15:3 | bar | | calls.rb:23:9:23:19 | call to singleton_m | calls.rb:22:5:24:7 | instance_m | | calls.rb:23:9:23:19 | self | calls.rb:22:5:24:7 | instance_m | +| calls.rb:23:9:23:35 | ... | calls.rb:22:5:24:7 | instance_m | | calls.rb:26:9:26:18 | call to instance_m | calls.rb:25:5:27:7 | singleton_m | | calls.rb:26:9:26:18 | self | calls.rb:25:5:27:7 | singleton_m | +| calls.rb:26:9:26:34 | ... | calls.rb:25:5:27:7 | singleton_m | | calls.rb:40:5:40:14 | call to instance_m | calls.rb:39:1:41:3 | call_instance_m | | calls.rb:40:5:40:14 | self | calls.rb:39:1:41:3 | call_instance_m | +| calls.rb:40:5:40:30 | ... | calls.rb:39:1:41:3 | call_instance_m | | calls.rb:52:9:52:18 | call to instance_m | calls.rb:51:5:57:7 | baz | | calls.rb:52:9:52:18 | self | calls.rb:51:5:57:7 | baz | +| calls.rb:52:9:56:40 | ... | calls.rb:51:5:57:7 | baz | | calls.rb:53:9:53:12 | self | calls.rb:51:5:57:7 | baz | | calls.rb:53:9:53:23 | call to instance_m | calls.rb:51:5:57:7 | baz | | calls.rb:55:9:55:19 | call to singleton_m | calls.rb:51:5:57:7 | baz | | calls.rb:55:9:55:19 | self | calls.rb:51:5:57:7 | baz | | calls.rb:56:9:56:12 | self | calls.rb:51:5:57:7 | baz | | calls.rb:56:9:56:24 | call to singleton_m | calls.rb:51:5:57:7 | baz | +| calls.rb:67:9:67:13 | ... | calls.rb:66:5:68:7 | baz | | calls.rb:67:9:67:13 | super call to baz | calls.rb:66:5:68:7 | baz | | calls.rb:76:18:76:18 | a | calls.rb:76:1:79:3 | optional_arg | | calls.rb:76:18:76:18 | a | calls.rb:76:1:79:3 | optional_arg | @@ -744,12 +752,15 @@ enclosingMethod | calls.rb:76:28:76:28 | 5 | calls.rb:76:1:79:3 | optional_arg | | calls.rb:77:5:77:5 | a | calls.rb:76:1:79:3 | optional_arg | | calls.rb:77:5:77:16 | call to bit_length | calls.rb:76:1:79:3 | optional_arg | +| calls.rb:77:5:78:16 | ... | calls.rb:76:1:79:3 | optional_arg | | calls.rb:78:5:78:5 | b | calls.rb:76:1:79:3 | optional_arg | | calls.rb:78:5:78:16 | call to bit_length | calls.rb:76:1:79:3 | optional_arg | +| calls.rb:82:5:82:11 | ... | calls.rb:81:1:83:3 | call_block | | calls.rb:82:5:82:11 | yield ... | calls.rb:81:1:83:3 | call_block | | calls.rb:82:11:82:11 | 1 | calls.rb:81:1:83:3 | call_block | | calls.rb:86:5:86:7 | var | calls.rb:85:1:89:3 | foo | | calls.rb:86:5:86:18 | ... = ... | calls.rb:85:1:89:3 | foo | +| calls.rb:86:5:88:29 | ... | calls.rb:85:1:89:3 | foo | | calls.rb:86:11:86:14 | Hash | calls.rb:85:1:89:3 | foo | | calls.rb:86:11:86:18 | call to new | calls.rb:85:1:89:3 | foo | | calls.rb:87:5:87:7 | var | calls.rb:85:1:89:3 | foo | @@ -761,25 +772,30 @@ enclosingMethod | calls.rb:88:19:88:19 | x | calls.rb:85:1:89:3 | foo | | calls.rb:88:19:88:19 | x | calls.rb:85:1:89:3 | foo | | calls.rb:88:22:88:24 | var | calls.rb:85:1:89:3 | foo | +| calls.rb:88:22:88:27 | ... | calls.rb:85:1:89:3 | foo | | calls.rb:88:22:88:27 | ...[...] | calls.rb:85:1:89:3 | foo | | calls.rb:88:26:88:26 | x | calls.rb:85:1:89:3 | foo | | calls.rb:102:14:102:14 | x | calls.rb:102:5:102:30 | puts | | calls.rb:102:14:102:14 | x | calls.rb:102:5:102:30 | puts | +| calls.rb:102:17:102:26 | ... | calls.rb:102:5:102:30 | puts | | calls.rb:102:17:102:26 | call to old_puts | calls.rb:102:5:102:30 | puts | | calls.rb:102:17:102:26 | self | calls.rb:102:5:102:30 | puts | | calls.rb:102:26:102:26 | x | calls.rb:102:5:102:30 | puts | | calls.rb:108:17:108:17 | x | calls.rb:108:5:110:7 | include | | calls.rb:108:17:108:17 | x | calls.rb:108:5:110:7 | include | +| calls.rb:109:9:109:21 | ... | calls.rb:108:5:110:7 | include | | calls.rb:109:9:109:21 | call to old_include | calls.rb:108:5:110:7 | include | | calls.rb:109:9:109:21 | self | calls.rb:108:5:110:7 | include | | calls.rb:109:21:109:21 | x | calls.rb:108:5:110:7 | include | | calls.rb:122:12:122:12 | x | calls.rb:122:5:122:31 | [] | | calls.rb:122:12:122:12 | x | calls.rb:122:5:122:31 | [] | +| calls.rb:122:15:122:27 | ... | calls.rb:122:5:122:31 | [] | | calls.rb:122:15:122:27 | call to old_lookup | calls.rb:122:5:122:31 | [] | | calls.rb:122:15:122:27 | self | calls.rb:122:5:122:31 | [] | | calls.rb:122:26:122:26 | x | calls.rb:122:5:122:31 | [] | | calls.rb:127:10:127:10 | x | calls.rb:127:3:127:29 | [] | | calls.rb:127:10:127:10 | x | calls.rb:127:3:127:29 | [] | +| calls.rb:127:13:127:25 | ... | calls.rb:127:3:127:29 | [] | | calls.rb:127:13:127:25 | call to old_lookup | calls.rb:127:3:127:29 | [] | | calls.rb:127:13:127:25 | self | calls.rb:127:3:127:29 | [] | | calls.rb:127:24:127:24 | x | calls.rb:127:3:127:29 | [] | @@ -787,6 +803,7 @@ enclosingMethod | calls.rb:131:16:131:19 | body | calls.rb:131:3:137:5 | foreach | | calls.rb:132:5:132:5 | x | calls.rb:131:3:137:5 | foreach | | calls.rb:132:5:132:9 | ... = ... | calls.rb:131:3:137:5 | foreach | +| calls.rb:132:5:136:7 | ... | calls.rb:131:3:137:5 | foreach | | calls.rb:132:9:132:9 | 0 | calls.rb:131:3:137:5 | foreach | | calls.rb:133:5:136:7 | while ... | calls.rb:131:3:137:5 | foreach | | calls.rb:133:11:133:11 | x | calls.rb:131:3:137:5 | foreach | @@ -805,65 +822,80 @@ enclosingMethod | calls.rb:135:9:135:14 | ... = ... | calls.rb:131:3:137:5 | foreach | | calls.rb:135:11:135:12 | ... + ... | calls.rb:131:3:137:5 | foreach | | calls.rb:135:14:135:14 | 1 | calls.rb:131:3:137:5 | foreach | +| calls.rb:141:5:141:20 | ... | calls.rb:140:1:142:3 | funny | | calls.rb:141:5:141:20 | yield ... | calls.rb:140:1:142:3 | funny | | calls.rb:141:11:141:20 | "prefix: " | calls.rb:140:1:142:3 | funny | | calls.rb:141:12:141:19 | prefix: | calls.rb:140:1:142:3 | funny | | calls.rb:158:14:158:15 | &b | calls.rb:158:1:160:3 | indirect | | calls.rb:158:15:158:15 | b | calls.rb:158:1:160:3 | indirect | +| calls.rb:159:5:159:17 | ... | calls.rb:158:1:160:3 | indirect | | calls.rb:159:5:159:17 | call to call_block | calls.rb:158:1:160:3 | indirect | | calls.rb:159:5:159:17 | self | calls.rb:158:1:160:3 | indirect | | calls.rb:159:16:159:17 | &... | calls.rb:158:1:160:3 | indirect | | calls.rb:159:17:159:17 | b | calls.rb:158:1:160:3 | indirect | | calls.rb:167:9:167:12 | self | calls.rb:166:5:168:7 | s_method | +| calls.rb:167:9:167:17 | ... | calls.rb:166:5:168:7 | s_method | | calls.rb:167:9:167:17 | call to to_s | calls.rb:166:5:168:7 | s_method | | calls.rb:192:9:192:26 | call to puts | calls.rb:191:5:194:7 | singleton_a | | calls.rb:192:9:192:26 | self | calls.rb:191:5:194:7 | singleton_a | +| calls.rb:192:9:193:24 | ... | calls.rb:191:5:194:7 | singleton_a | | calls.rb:192:14:192:26 | "singleton_a" | calls.rb:191:5:194:7 | singleton_a | | calls.rb:192:15:192:25 | singleton_a | calls.rb:191:5:194:7 | singleton_a | | calls.rb:193:9:193:12 | self | calls.rb:191:5:194:7 | singleton_a | | calls.rb:193:9:193:24 | call to singleton_b | calls.rb:191:5:194:7 | singleton_a | | calls.rb:197:9:197:26 | call to puts | calls.rb:196:5:199:7 | singleton_b | | calls.rb:197:9:197:26 | self | calls.rb:196:5:199:7 | singleton_b | +| calls.rb:197:9:198:24 | ... | calls.rb:196:5:199:7 | singleton_b | | calls.rb:197:14:197:26 | "singleton_b" | calls.rb:196:5:199:7 | singleton_b | | calls.rb:197:15:197:25 | singleton_b | calls.rb:196:5:199:7 | singleton_b | | calls.rb:198:9:198:12 | self | calls.rb:196:5:199:7 | singleton_b | | calls.rb:198:9:198:24 | call to singleton_c | calls.rb:196:5:199:7 | singleton_b | +| calls.rb:202:9:202:26 | ... | calls.rb:201:5:203:7 | singleton_c | | calls.rb:202:9:202:26 | call to puts | calls.rb:201:5:203:7 | singleton_c | | calls.rb:202:9:202:26 | self | calls.rb:201:5:203:7 | singleton_c | | calls.rb:202:14:202:26 | "singleton_c" | calls.rb:201:5:203:7 | singleton_c | | calls.rb:202:15:202:25 | singleton_c | calls.rb:201:5:203:7 | singleton_c | | calls.rb:206:9:206:26 | call to puts | calls.rb:205:5:208:7 | singleton_d | | calls.rb:206:9:206:26 | self | calls.rb:205:5:208:7 | singleton_d | +| calls.rb:206:9:207:24 | ... | calls.rb:205:5:208:7 | singleton_d | | calls.rb:206:14:206:26 | "singleton_d" | calls.rb:205:5:208:7 | singleton_d | | calls.rb:206:15:206:25 | singleton_d | calls.rb:205:5:208:7 | singleton_d | | calls.rb:207:9:207:12 | self | calls.rb:205:5:208:7 | singleton_d | | calls.rb:207:9:207:24 | call to singleton_a | calls.rb:205:5:208:7 | singleton_d | | calls.rb:211:9:213:11 | singleton_e | calls.rb:210:5:215:7 | instance | +| calls.rb:211:9:214:19 | ... | calls.rb:210:5:215:7 | instance | | calls.rb:211:13:211:16 | self | calls.rb:210:5:215:7 | instance | +| calls.rb:212:13:212:30 | ... | calls.rb:211:9:213:11 | singleton_e | | calls.rb:212:13:212:30 | call to puts | calls.rb:211:9:213:11 | singleton_e | | calls.rb:212:13:212:30 | self | calls.rb:211:9:213:11 | singleton_e | | calls.rb:212:18:212:30 | "singleton_e" | calls.rb:211:9:213:11 | singleton_e | | calls.rb:212:19:212:29 | singleton_e | calls.rb:211:9:213:11 | singleton_e | | calls.rb:214:9:214:19 | call to singleton_e | calls.rb:210:5:215:7 | instance | | calls.rb:214:9:214:19 | self | calls.rb:210:5:215:7 | instance | +| calls.rb:219:13:219:30 | ... | calls.rb:218:9:220:11 | singleton_f | | calls.rb:219:13:219:30 | call to puts | calls.rb:218:9:220:11 | singleton_f | | calls.rb:219:13:219:30 | self | calls.rb:218:9:220:11 | singleton_f | | calls.rb:219:18:219:30 | "singleton_f" | calls.rb:218:9:220:11 | singleton_f | | calls.rb:219:19:219:29 | singleton_f | calls.rb:218:9:220:11 | singleton_f | | calls.rb:224:9:224:12 | self | calls.rb:223:5:225:7 | call_singleton_g | +| calls.rb:224:9:224:24 | ... | calls.rb:223:5:225:7 | call_singleton_g | | calls.rb:224:9:224:24 | call to singleton_g | calls.rb:223:5:225:7 | call_singleton_g | +| calls.rb:237:5:237:24 | ... | calls.rb:236:1:238:3 | singleton_g | | calls.rb:237:5:237:24 | call to puts | calls.rb:236:1:238:3 | singleton_g | | calls.rb:237:5:237:24 | self | calls.rb:236:1:238:3 | singleton_g | | calls.rb:237:10:237:24 | "singleton_g_1" | calls.rb:236:1:238:3 | singleton_g | | calls.rb:237:11:237:23 | singleton_g_1 | calls.rb:236:1:238:3 | singleton_g | +| calls.rb:244:5:244:24 | ... | calls.rb:243:1:245:3 | singleton_g | | calls.rb:244:5:244:24 | call to puts | calls.rb:243:1:245:3 | singleton_g | | calls.rb:244:5:244:24 | self | calls.rb:243:1:245:3 | singleton_g | | calls.rb:244:10:244:24 | "singleton_g_2" | calls.rb:243:1:245:3 | singleton_g | | calls.rb:244:11:244:23 | singleton_g_2 | calls.rb:243:1:245:3 | singleton_g | +| calls.rb:252:9:252:28 | ... | calls.rb:251:5:253:7 | singleton_g | | calls.rb:252:9:252:28 | call to puts | calls.rb:251:5:253:7 | singleton_g | | calls.rb:252:9:252:28 | self | calls.rb:251:5:253:7 | singleton_g | | calls.rb:252:14:252:28 | "singleton_g_3" | calls.rb:251:5:253:7 | singleton_g | | calls.rb:252:15:252:27 | singleton_g_3 | calls.rb:251:5:253:7 | singleton_g | +| calls.rb:268:5:268:22 | ... | calls.rb:267:1:269:3 | singleton_g | | calls.rb:268:5:268:22 | call to puts | calls.rb:267:1:269:3 | singleton_g | | calls.rb:268:5:268:22 | self | calls.rb:267:1:269:3 | singleton_g | | calls.rb:268:10:268:22 | "singleton_g" | calls.rb:267:1:269:3 | singleton_g | @@ -873,24 +905,29 @@ enclosingMethod | calls.rb:279:5:279:8 | type | calls.rb:278:1:286:3 | create | | calls.rb:279:5:279:12 | call to new | calls.rb:278:1:286:3 | create | | calls.rb:279:5:279:21 | call to instance | calls.rb:278:1:286:3 | create | +| calls.rb:279:5:285:20 | ... | calls.rb:278:1:286:3 | create | | calls.rb:281:5:283:7 | singleton_h | calls.rb:278:1:286:3 | create | | calls.rb:281:9:281:12 | type | calls.rb:278:1:286:3 | create | +| calls.rb:282:9:282:26 | ... | calls.rb:281:5:283:7 | singleton_h | | calls.rb:282:9:282:26 | call to puts | calls.rb:281:5:283:7 | singleton_h | | calls.rb:282:9:282:26 | self | calls.rb:281:5:283:7 | singleton_h | | calls.rb:282:14:282:26 | "singleton_h" | calls.rb:281:5:283:7 | singleton_h | | calls.rb:282:15:282:25 | singleton_h | calls.rb:281:5:283:7 | singleton_h | | calls.rb:285:5:285:8 | type | calls.rb:278:1:286:3 | create | | calls.rb:285:5:285:20 | call to singleton_h | calls.rb:278:1:286:3 | create | +| calls.rb:295:9:295:26 | ... | calls.rb:294:5:296:7 | singleton_i | | calls.rb:295:9:295:26 | call to puts | calls.rb:294:5:296:7 | singleton_i | | calls.rb:295:9:295:26 | self | calls.rb:294:5:296:7 | singleton_i | | calls.rb:295:14:295:26 | "singleton_i" | calls.rb:294:5:296:7 | singleton_i | | calls.rb:295:15:295:25 | singleton_i | calls.rb:294:5:296:7 | singleton_i | +| calls.rb:304:9:304:26 | ... | calls.rb:303:5:305:7 | singleton_j | | calls.rb:304:9:304:26 | call to puts | calls.rb:303:5:305:7 | singleton_j | | calls.rb:304:9:304:26 | self | calls.rb:303:5:305:7 | singleton_j | | calls.rb:304:14:304:26 | "singleton_j" | calls.rb:303:5:305:7 | singleton_j | | calls.rb:304:15:304:25 | singleton_j | calls.rb:303:5:305:7 | singleton_j | | calls.rb:312:9:312:31 | call to puts | calls.rb:311:5:314:7 | instance | | calls.rb:312:9:312:31 | self | calls.rb:311:5:314:7 | instance | +| calls.rb:312:9:313:36 | ... | calls.rb:311:5:314:7 | instance | | calls.rb:312:14:312:31 | "SelfNew#instance" | calls.rb:311:5:314:7 | instance | | calls.rb:312:15:312:30 | SelfNew#instance | calls.rb:311:5:314:7 | instance | | calls.rb:313:9:313:11 | call to new | calls.rb:311:5:314:7 | instance | @@ -898,16 +935,21 @@ enclosingMethod | calls.rb:313:9:313:20 | call to instance | calls.rb:311:5:314:7 | instance | | calls.rb:317:9:317:11 | call to new | calls.rb:316:5:318:7 | singleton | | calls.rb:317:9:317:11 | self | calls.rb:316:5:318:7 | singleton | +| calls.rb:317:9:317:20 | ... | calls.rb:316:5:318:7 | singleton | | calls.rb:317:9:317:20 | call to instance | calls.rb:316:5:318:7 | singleton | +| calls.rb:327:9:327:26 | ... | calls.rb:326:5:328:7 | instance | | calls.rb:327:9:327:26 | call to puts | calls.rb:326:5:328:7 | instance | | calls.rb:327:9:327:26 | self | calls.rb:326:5:328:7 | instance | | calls.rb:327:14:327:26 | "C1#instance" | calls.rb:326:5:328:7 | instance | | calls.rb:327:15:327:25 | C1#instance | calls.rb:326:5:328:7 | instance | +| calls.rb:331:9:331:12 | ... | calls.rb:330:5:332:7 | return_self | | calls.rb:331:9:331:12 | self | calls.rb:330:5:332:7 | return_self | +| calls.rb:337:9:337:26 | ... | calls.rb:336:5:338:7 | instance | | calls.rb:337:9:337:26 | call to puts | calls.rb:336:5:338:7 | instance | | calls.rb:337:9:337:26 | self | calls.rb:336:5:338:7 | instance | | calls.rb:337:14:337:26 | "C2#instance" | calls.rb:336:5:338:7 | instance | | calls.rb:337:15:337:25 | C2#instance | calls.rb:336:5:338:7 | instance | +| calls.rb:343:9:343:26 | ... | calls.rb:342:5:344:7 | instance | | calls.rb:343:9:343:26 | call to puts | calls.rb:342:5:344:7 | instance | | calls.rb:343:9:343:26 | self | calls.rb:342:5:344:7 | instance | | calls.rb:343:14:343:26 | "C3#instance" | calls.rb:342:5:344:7 | instance | @@ -915,6 +957,7 @@ enclosingMethod | calls.rb:347:22:347:22 | x | calls.rb:347:1:363:3 | pattern_dispatch | | calls.rb:347:22:347:22 | x | calls.rb:347:1:363:3 | pattern_dispatch | | calls.rb:348:5:356:7 | case ... | calls.rb:347:1:363:3 | pattern_dispatch | +| calls.rb:348:5:362:7 | ... | calls.rb:347:1:363:3 | pattern_dispatch | | calls.rb:348:10:348:10 | x | calls.rb:347:1:363:3 | pattern_dispatch | | calls.rb:349:5:350:18 | when ... | calls.rb:347:1:363:3 | pattern_dispatch | | calls.rb:349:10:349:11 | C3 | calls.rb:347:1:363:3 | pattern_dispatch | @@ -955,89 +998,111 @@ enclosingMethod | calls.rb:361:26:361:36 | call to instance | calls.rb:347:1:363:3 | pattern_dispatch | | calls.rb:374:19:374:19 | x | calls.rb:374:1:378:3 | add_singleton | | calls.rb:374:19:374:19 | x | calls.rb:374:1:378:3 | add_singleton | +| calls.rb:375:5:377:7 | ... | calls.rb:374:1:378:3 | add_singleton | | calls.rb:375:5:377:7 | instance | calls.rb:374:1:378:3 | add_singleton | | calls.rb:375:9:375:9 | x | calls.rb:374:1:378:3 | add_singleton | +| calls.rb:376:9:376:28 | ... | calls.rb:375:5:377:7 | instance | | calls.rb:376:9:376:28 | call to puts | calls.rb:375:5:377:7 | instance | | calls.rb:376:9:376:28 | self | calls.rb:375:5:377:7 | instance | | calls.rb:376:14:376:28 | "instance_on x" | calls.rb:375:5:377:7 | instance | | calls.rb:376:15:376:27 | instance_on x | calls.rb:375:5:377:7 | instance | +| calls.rb:388:13:388:48 | ... | calls.rb:387:9:389:11 | singleton1 | | calls.rb:388:13:388:48 | call to puts | calls.rb:387:9:389:11 | singleton1 | | calls.rb:388:13:388:48 | self | calls.rb:387:9:389:11 | singleton1 | | calls.rb:388:18:388:48 | "SingletonOverride1#singleton1" | calls.rb:387:9:389:11 | singleton1 | | calls.rb:388:19:388:47 | SingletonOverride1#singleton1 | calls.rb:387:9:389:11 | singleton1 | +| calls.rb:392:13:392:22 | ... | calls.rb:391:9:393:11 | call_singleton1 | | calls.rb:392:13:392:22 | call to singleton1 | calls.rb:391:9:393:11 | call_singleton1 | | calls.rb:392:13:392:22 | self | calls.rb:391:9:393:11 | call_singleton1 | | calls.rb:396:13:396:16 | self | calls.rb:395:9:397:11 | factory | | calls.rb:396:13:396:20 | call to new | calls.rb:395:9:397:11 | factory | +| calls.rb:396:13:396:30 | ... | calls.rb:395:9:397:11 | factory | | calls.rb:396:13:396:30 | call to instance1 | calls.rb:395:9:397:11 | factory | +| calls.rb:401:9:401:44 | ... | calls.rb:400:5:402:7 | singleton2 | | calls.rb:401:9:401:44 | call to puts | calls.rb:400:5:402:7 | singleton2 | | calls.rb:401:9:401:44 | self | calls.rb:400:5:402:7 | singleton2 | | calls.rb:401:14:401:44 | "SingletonOverride1#singleton2" | calls.rb:400:5:402:7 | singleton2 | | calls.rb:401:15:401:43 | SingletonOverride1#singleton2 | calls.rb:400:5:402:7 | singleton2 | +| calls.rb:405:9:405:18 | ... | calls.rb:404:5:406:7 | call_singleton2 | | calls.rb:405:9:405:18 | call to singleton2 | calls.rb:404:5:406:7 | call_singleton2 | | calls.rb:405:9:405:18 | self | calls.rb:404:5:406:7 | call_singleton2 | +| calls.rb:411:9:411:43 | ... | calls.rb:410:5:412:7 | instance1 | | calls.rb:411:9:411:43 | call to puts | calls.rb:410:5:412:7 | instance1 | | calls.rb:411:9:411:43 | self | calls.rb:410:5:412:7 | instance1 | | calls.rb:411:14:411:43 | "SingletonOverride1#instance1" | calls.rb:410:5:412:7 | instance1 | | calls.rb:411:15:411:42 | SingletonOverride1#instance1 | calls.rb:410:5:412:7 | instance1 | +| calls.rb:423:13:423:48 | ... | calls.rb:422:9:424:11 | singleton1 | | calls.rb:423:13:423:48 | call to puts | calls.rb:422:9:424:11 | singleton1 | | calls.rb:423:13:423:48 | self | calls.rb:422:9:424:11 | singleton1 | | calls.rb:423:18:423:48 | "SingletonOverride2#singleton1" | calls.rb:422:9:424:11 | singleton1 | | calls.rb:423:19:423:47 | SingletonOverride2#singleton1 | calls.rb:422:9:424:11 | singleton1 | +| calls.rb:428:9:428:44 | ... | calls.rb:427:5:429:7 | singleton2 | | calls.rb:428:9:428:44 | call to puts | calls.rb:427:5:429:7 | singleton2 | | calls.rb:428:9:428:44 | self | calls.rb:427:5:429:7 | singleton2 | | calls.rb:428:14:428:44 | "SingletonOverride2#singleton2" | calls.rb:427:5:429:7 | singleton2 | | calls.rb:428:15:428:43 | SingletonOverride2#singleton2 | calls.rb:427:5:429:7 | singleton2 | +| calls.rb:432:9:432:43 | ... | calls.rb:431:5:433:7 | instance1 | | calls.rb:432:9:432:43 | call to puts | calls.rb:431:5:433:7 | instance1 | | calls.rb:432:9:432:43 | self | calls.rb:431:5:433:7 | instance1 | | calls.rb:432:14:432:43 | "SingletonOverride2#instance1" | calls.rb:431:5:433:7 | instance1 | | calls.rb:432:15:432:42 | SingletonOverride2#instance1 | calls.rb:431:5:433:7 | instance1 | +| calls.rb:444:13:444:48 | ... | calls.rb:443:9:445:11 | m1 | | calls.rb:444:13:444:48 | call to puts | calls.rb:443:9:445:11 | m1 | | calls.rb:444:13:444:48 | self | calls.rb:443:9:445:11 | m1 | | calls.rb:444:18:444:48 | "ConditionalInstanceMethods#m1" | calls.rb:443:9:445:11 | m1 | | calls.rb:444:19:444:47 | ConditionalInstanceMethods#m1 | calls.rb:443:9:445:11 | m1 | | calls.rb:449:9:449:44 | call to puts | calls.rb:448:5:460:7 | m2 | | calls.rb:449:9:449:44 | self | calls.rb:448:5:460:7 | m2 | +| calls.rb:449:9:459:10 | ... | calls.rb:448:5:460:7 | m2 | | calls.rb:449:14:449:44 | "ConditionalInstanceMethods#m2" | calls.rb:448:5:460:7 | m2 | | calls.rb:449:15:449:43 | ConditionalInstanceMethods#m2 | calls.rb:448:5:460:7 | m2 | | calls.rb:451:9:457:11 | m3 | calls.rb:448:5:460:7 | m2 | | calls.rb:452:13:452:48 | call to puts | calls.rb:451:9:457:11 | m3 | | calls.rb:452:13:452:48 | self | calls.rb:451:9:457:11 | m3 | +| calls.rb:452:13:456:15 | ... | calls.rb:451:9:457:11 | m3 | | calls.rb:452:18:452:48 | "ConditionalInstanceMethods#m3" | calls.rb:451:9:457:11 | m3 | | calls.rb:452:19:452:47 | ConditionalInstanceMethods#m3 | calls.rb:451:9:457:11 | m3 | | calls.rb:454:13:456:15 | m4 | calls.rb:451:9:457:11 | m3 | +| calls.rb:455:17:455:52 | ... | calls.rb:454:13:456:15 | m4 | | calls.rb:455:17:455:52 | call to puts | calls.rb:454:13:456:15 | m4 | | calls.rb:455:17:455:52 | self | calls.rb:454:13:456:15 | m4 | | calls.rb:455:22:455:52 | "ConditionalInstanceMethods#m4" | calls.rb:454:13:456:15 | m4 | | calls.rb:455:23:455:51 | ConditionalInstanceMethods#m4 | calls.rb:454:13:456:15 | m4 | | calls.rb:459:9:459:10 | call to m3 | calls.rb:448:5:460:7 | m2 | | calls.rb:459:9:459:10 | self | calls.rb:448:5:460:7 | m2 | +| calls.rb:465:17:465:40 | ... | calls.rb:464:13:466:15 | m5 | | calls.rb:465:17:465:40 | call to puts | calls.rb:464:13:466:15 | m5 | | calls.rb:465:17:465:40 | self | calls.rb:464:13:466:15 | m5 | | calls.rb:465:22:465:40 | "AnonymousClass#m5" | calls.rb:464:13:466:15 | m5 | | calls.rb:465:23:465:39 | AnonymousClass#m5 | calls.rb:464:13:466:15 | m5 | +| calls.rb:481:13:481:22 | ... | calls.rb:480:9:482:11 | foo | | calls.rb:481:13:481:22 | call to puts | calls.rb:480:9:482:11 | foo | | calls.rb:481:13:481:22 | self | calls.rb:480:9:482:11 | foo | | calls.rb:481:18:481:22 | "foo" | calls.rb:480:9:482:11 | foo | | calls.rb:481:19:481:21 | foo | calls.rb:480:9:482:11 | foo | +| calls.rb:487:13:487:22 | ... | calls.rb:486:9:488:11 | bar | | calls.rb:487:13:487:22 | call to puts | calls.rb:486:9:488:11 | bar | | calls.rb:487:13:487:22 | self | calls.rb:486:9:488:11 | bar | | calls.rb:487:18:487:22 | "bar" | calls.rb:486:9:488:11 | bar | | calls.rb:487:19:487:21 | bar | calls.rb:486:9:488:11 | bar | +| calls.rb:506:9:506:46 | ... | calls.rb:505:5:507:7 | singleton | | calls.rb:506:9:506:46 | call to puts | calls.rb:505:5:507:7 | singleton | | calls.rb:506:9:506:46 | self | calls.rb:505:5:507:7 | singleton | | calls.rb:506:14:506:46 | "ExtendSingletonMethod#singleton" | calls.rb:505:5:507:7 | singleton | | calls.rb:506:15:506:45 | ExtendSingletonMethod#singleton | calls.rb:505:5:507:7 | singleton | +| calls.rb:535:9:535:42 | ... | calls.rb:534:15:536:7 | foo | | calls.rb:535:9:535:42 | call to puts | calls.rb:534:15:536:7 | foo | | calls.rb:535:9:535:42 | self | calls.rb:534:15:536:7 | foo | | calls.rb:535:14:535:42 | "ProtectedMethodInModule#foo" | calls.rb:534:15:536:7 | foo | | calls.rb:535:15:535:41 | ProtectedMethodInModule#foo | calls.rb:534:15:536:7 | foo | +| calls.rb:543:9:543:35 | ... | calls.rb:542:15:544:7 | bar | | calls.rb:543:9:543:35 | call to puts | calls.rb:542:15:544:7 | bar | | calls.rb:543:9:543:35 | self | calls.rb:542:15:544:7 | bar | | calls.rb:543:14:543:35 | "ProtectedMethods#bar" | calls.rb:542:15:544:7 | bar | | calls.rb:543:15:543:34 | ProtectedMethods#bar | calls.rb:542:15:544:7 | bar | | calls.rb:547:9:547:11 | call to foo | calls.rb:546:5:551:7 | baz | | calls.rb:547:9:547:11 | self | calls.rb:546:5:551:7 | baz | +| calls.rb:547:9:550:32 | ... | calls.rb:546:5:551:7 | baz | | calls.rb:548:9:548:11 | call to bar | calls.rb:546:5:551:7 | baz | | calls.rb:548:9:548:11 | self | calls.rb:546:5:551:7 | baz | | calls.rb:549:9:549:24 | ProtectedMethods | calls.rb:546:5:551:7 | baz | @@ -1048,28 +1113,39 @@ enclosingMethod | calls.rb:550:9:550:32 | call to bar | calls.rb:546:5:551:7 | baz | | calls.rb:560:9:560:11 | call to foo | calls.rb:559:5:562:7 | baz | | calls.rb:560:9:560:11 | self | calls.rb:559:5:562:7 | baz | +| calls.rb:560:9:561:35 | ... | calls.rb:559:5:562:7 | baz | | calls.rb:561:9:561:27 | ProtectedMethodsSub | calls.rb:559:5:562:7 | baz | | calls.rb:561:9:561:31 | call to new | calls.rb:559:5:562:7 | baz | | calls.rb:561:9:561:35 | call to foo | calls.rb:559:5:562:7 | baz | | calls.rb:580:9:580:17 | call to singleton | calls.rb:579:5:582:7 | mid_method | | calls.rb:580:9:580:17 | self | calls.rb:579:5:582:7 | mid_method | +| calls.rb:580:9:581:35 | ... | calls.rb:579:5:582:7 | mid_method | | calls.rb:581:9:581:18 | call to singleton2 | calls.rb:579:5:582:7 | mid_method | | calls.rb:581:9:581:18 | self | calls.rb:579:5:582:7 | mid_method | +| calls.rb:596:9:596:18 | ... | calls.rb:595:5:597:7 | call_singleton1 | | calls.rb:596:9:596:18 | call to singleton1 | calls.rb:595:5:597:7 | call_singleton1 | | calls.rb:596:9:596:18 | self | calls.rb:595:5:597:7 | call_singleton1 | +| calls.rb:600:9:600:23 | ... | calls.rb:599:5:601:7 | call_call_singleton1 | | calls.rb:600:9:600:23 | call to call_singleton1 | calls.rb:599:5:601:7 | call_call_singleton1 | | calls.rb:600:9:600:23 | self | calls.rb:599:5:601:7 | call_call_singleton1 | | calls.rb:609:9:609:18 | call to singleton1 | calls.rb:608:5:610:7 | call_singleton1 | | calls.rb:609:9:609:18 | self | calls.rb:608:5:610:7 | call_singleton1 | +| calls.rb:609:9:609:105 | ... | calls.rb:608:5:610:7 | call_singleton1 | | calls.rb:618:9:618:18 | call to singleton1 | calls.rb:617:5:619:7 | call_singleton1 | | calls.rb:618:9:618:18 | self | calls.rb:617:5:619:7 | call_singleton1 | +| calls.rb:618:9:618:105 | ... | calls.rb:617:5:619:7 | call_singleton1 | | calls.rb:628:9:628:12 | self | calls.rb:627:5:629:7 | foo | +| calls.rb:628:9:628:16 | ... | calls.rb:627:5:629:7 | foo | | calls.rb:628:9:628:16 | call to bar | calls.rb:627:5:629:7 | foo | +| calls.rb:637:9:637:13 | ... | calls.rb:636:5:638:7 | bar | | calls.rb:637:9:637:13 | super call to bar | calls.rb:636:5:638:7 | bar | | calls.rb:643:9:643:10 | C1 | calls.rb:642:5:644:7 | new | +| calls.rb:643:9:643:14 | ... | calls.rb:642:5:644:7 | new | | calls.rb:643:9:643:14 | call to new | calls.rb:642:5:644:7 | new | | calls.rb:651:9:651:12 | self | calls.rb:650:5:652:7 | new | +| calls.rb:651:9:651:21 | ... | calls.rb:650:5:652:7 | new | | calls.rb:651:9:651:21 | call to allocate | calls.rb:650:5:652:7 | new | +| calls.rb:655:9:655:34 | ... | calls.rb:654:5:656:7 | instance | | calls.rb:655:9:655:34 | call to puts | calls.rb:654:5:656:7 | instance | | calls.rb:655:9:655:34 | self | calls.rb:654:5:656:7 | instance | | calls.rb:655:14:655:34 | "CustomNew2#instance" | calls.rb:654:5:656:7 | instance | @@ -1079,27 +1155,34 @@ enclosingMethod | calls.rb:662:5:662:11 | Array | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:5:662:11 | [...] | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:5:662:11 | call to [] | calls.rb:661:1:665:3 | capture_parameter | +| calls.rb:662:5:664:7 | ... | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:5:664:7 | call to each | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:6:662:6 | 0 | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:8:662:8 | 1 | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:10:662:10 | 2 | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:662:18:664:7 | do ... end | calls.rb:661:1:665:3 | capture_parameter | +| calls.rb:663:9:663:9 | ... | calls.rb:661:1:665:3 | capture_parameter | | calls.rb:663:9:663:9 | x | calls.rb:661:1:665:3 | capture_parameter | | element_reference.rb:2:12:2:12 | x | element_reference.rb:2:5:4:7 | [] | | element_reference.rb:2:12:2:12 | x | element_reference.rb:2:5:4:7 | [] | +| element_reference.rb:3:9:3:19 | ... | element_reference.rb:2:5:4:7 | [] | | element_reference.rb:3:9:3:19 | yield ... | element_reference.rb:2:5:4:7 | [] | | element_reference.rb:3:15:3:15 | x | element_reference.rb:2:5:4:7 | [] | | element_reference.rb:3:15:3:19 | ... + ... | element_reference.rb:2:5:4:7 | [] | | element_reference.rb:3:19:3:19 | 1 | element_reference.rb:2:5:4:7 | [] | +| hello.rb:3:9:3:22 | ... | hello.rb:2:5:4:7 | hello | | hello.rb:3:9:3:22 | return | hello.rb:2:5:4:7 | hello | | hello.rb:3:16:3:22 | "hello" | hello.rb:2:5:4:7 | hello | | hello.rb:3:17:3:21 | hello | hello.rb:2:5:4:7 | hello | +| hello.rb:6:9:6:22 | ... | hello.rb:5:5:7:7 | world | | hello.rb:6:9:6:22 | return | hello.rb:5:5:7:7 | world | | hello.rb:6:16:6:22 | "world" | hello.rb:5:5:7:7 | world | | hello.rb:6:17:6:21 | world | hello.rb:5:5:7:7 | world | +| hello.rb:14:9:14:20 | ... | hello.rb:13:5:15:7 | message | | hello.rb:14:9:14:20 | return | hello.rb:13:5:15:7 | message | | hello.rb:14:16:14:20 | call to hello | hello.rb:13:5:15:7 | message | | hello.rb:14:16:14:20 | self | hello.rb:13:5:15:7 | message | +| hello.rb:20:9:20:40 | ... | hello.rb:19:5:21:7 | message | | hello.rb:20:9:20:40 | return | hello.rb:19:5:21:7 | message | | hello.rb:20:16:20:20 | super call to message | hello.rb:19:5:21:7 | message | | hello.rb:20:16:20:26 | ... + ... | hello.rb:19:5:21:7 | message | @@ -1113,32 +1196,40 @@ enclosingMethod | hello.rb:20:39:20:39 | ! | hello.rb:19:5:21:7 | message | | instance_fields.rb:4:13:4:18 | @field | instance_fields.rb:3:9:5:11 | create | | instance_fields.rb:4:13:4:18 | self | instance_fields.rb:3:9:5:11 | create | +| instance_fields.rb:4:13:4:35 | ... | instance_fields.rb:3:9:5:11 | create | | instance_fields.rb:4:13:4:35 | ... = ... | instance_fields.rb:3:9:5:11 | create | | instance_fields.rb:4:22:4:31 | A_target | instance_fields.rb:3:9:5:11 | create | | instance_fields.rb:4:22:4:35 | call to new | instance_fields.rb:3:9:5:11 | create | | instance_fields.rb:7:13:7:18 | @field | instance_fields.rb:6:9:8:11 | use | | instance_fields.rb:7:13:7:18 | self | instance_fields.rb:6:9:8:11 | use | +| instance_fields.rb:7:13:7:25 | ... | instance_fields.rb:6:9:8:11 | use | | instance_fields.rb:7:13:7:25 | call to target | instance_fields.rb:6:9:8:11 | use | | instance_fields.rb:19:13:19:18 | @field | instance_fields.rb:18:9:20:11 | create | | instance_fields.rb:19:13:19:18 | self | instance_fields.rb:18:9:20:11 | create | +| instance_fields.rb:19:13:19:35 | ... | instance_fields.rb:18:9:20:11 | create | | instance_fields.rb:19:13:19:35 | ... = ... | instance_fields.rb:18:9:20:11 | create | | instance_fields.rb:19:22:19:31 | B_target | instance_fields.rb:18:9:20:11 | create | | instance_fields.rb:19:22:19:35 | call to new | instance_fields.rb:18:9:20:11 | create | | instance_fields.rb:22:13:22:18 | @field | instance_fields.rb:21:9:23:11 | use | | instance_fields.rb:22:13:22:18 | self | instance_fields.rb:21:9:23:11 | use | +| instance_fields.rb:22:13:22:25 | ... | instance_fields.rb:21:9:23:11 | use | | instance_fields.rb:22:13:22:25 | call to target | instance_fields.rb:21:9:23:11 | use | +| private.rb:84:7:84:32 | ... | private.rb:83:11:85:5 | m1 | | private.rb:84:7:84:32 | call to puts | private.rb:83:11:85:5 | m1 | | private.rb:84:7:84:32 | self | private.rb:83:11:85:5 | m1 | | private.rb:84:12:84:32 | "PrivateOverride1#m1" | private.rb:83:11:85:5 | m1 | | private.rb:84:13:84:31 | PrivateOverride1#m1 | private.rb:83:11:85:5 | m1 | +| private.rb:88:7:88:32 | ... | private.rb:87:11:89:5 | m2 | | private.rb:88:7:88:32 | call to puts | private.rb:87:11:89:5 | m2 | | private.rb:88:7:88:32 | self | private.rb:87:11:89:5 | m2 | | private.rb:88:12:88:32 | "PrivateOverride1#m2" | private.rb:87:11:89:5 | m2 | | private.rb:88:13:88:31 | PrivateOverride1#m2 | private.rb:87:11:89:5 | m2 | +| private.rb:92:7:92:8 | ... | private.rb:91:3:93:5 | call_m1 | | private.rb:92:7:92:8 | call to m1 | private.rb:91:3:93:5 | call_m1 | | private.rb:92:7:92:8 | self | private.rb:91:3:93:5 | call_m1 | | private.rb:98:7:98:32 | call to puts | private.rb:97:11:101:5 | m1 | | private.rb:98:7:98:32 | self | private.rb:97:11:101:5 | m1 | +| private.rb:98:7:100:45 | ... | private.rb:97:11:101:5 | m1 | | private.rb:98:12:98:32 | "PrivateOverride2#m1" | private.rb:97:11:101:5 | m1 | | private.rb:98:13:98:31 | PrivateOverride2#m1 | private.rb:97:11:101:5 | m1 | | private.rb:99:7:99:8 | call to m2 | private.rb:97:11:101:5 | m1 | @@ -1148,11 +1239,15 @@ enclosingMethod | private.rb:100:7:100:29 | call to m1 | private.rb:97:11:101:5 | m1 | | toplevel_self_singleton.rb:10:9:10:27 | call to ab_singleton_method | toplevel_self_singleton.rb:9:5:11:7 | method_in_block | | toplevel_self_singleton.rb:10:9:10:27 | self | toplevel_self_singleton.rb:9:5:11:7 | method_in_block | +| toplevel_self_singleton.rb:10:9:10:60 | ... | toplevel_self_singleton.rb:9:5:11:7 | method_in_block | | toplevel_self_singleton.rb:14:9:14:27 | call to ab_singleton_method | toplevel_self_singleton.rb:13:5:15:7 | method_in_block | | toplevel_self_singleton.rb:14:9:14:27 | self | toplevel_self_singleton.rb:13:5:15:7 | method_in_block | +| toplevel_self_singleton.rb:14:9:14:60 | ... | toplevel_self_singleton.rb:13:5:15:7 | method_in_block | | toplevel_self_singleton.rb:20:9:20:27 | call to ab_singleton_method | toplevel_self_singleton.rb:19:5:21:7 | method_in_struct | | toplevel_self_singleton.rb:20:9:20:27 | self | toplevel_self_singleton.rb:19:5:21:7 | method_in_struct | +| toplevel_self_singleton.rb:20:9:20:60 | ... | toplevel_self_singleton.rb:19:5:21:7 | method_in_struct | | toplevel_self_singleton.rb:30:13:30:19 | call to call_me | toplevel_self_singleton.rb:29:9:32:11 | call_you | | toplevel_self_singleton.rb:30:13:30:19 | self | toplevel_self_singleton.rb:29:9:32:11 | call_you | +| toplevel_self_singleton.rb:30:13:31:20 | ... | toplevel_self_singleton.rb:29:9:32:11 | call_you | | toplevel_self_singleton.rb:31:13:31:20 | call to call_you | toplevel_self_singleton.rb:29:9:32:11 | call_you | | toplevel_self_singleton.rb:31:13:31:20 | self | toplevel_self_singleton.rb:29:9:32:11 | call_you | diff --git a/ruby/ql/test/library-tests/modules/modules.expected b/ruby/ql/test/library-tests/modules/modules.expected index 967e90decaa6..09a2236772a3 100644 --- a/ruby/ql/test/library-tests/modules/modules.expected +++ b/ruby/ql/test/library-tests/modules/modules.expected @@ -571,6 +571,7 @@ resolveConstantWriteAccess | unresolved_subclass.rb:21:1:22:3 | A | UnresolvedNamespace::X1::X2::X3::A | enclosingModule | calls.rb:1:1:3:3 | foo | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:2:5:2:14 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:2:5:2:14 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:2:5:2:14 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:2:10:2:14 | "foo" | calls.rb:1:1:667:52 | calls.rb | @@ -579,6 +580,7 @@ enclosingModule | calls.rb:5:1:5:3 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:7:1:9:3 | bar | calls.rb:1:1:667:52 | calls.rb | | calls.rb:7:5:7:8 | self | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:8:5:8:15 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:8:5:8:15 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:8:5:8:15 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:8:10:8:15 | "bar1" | calls.rb:1:1:667:52 | calls.rb | @@ -587,6 +589,7 @@ enclosingModule | calls.rb:11:1:11:8 | call to bar | calls.rb:1:1:667:52 | calls.rb | | calls.rb:13:1:15:3 | bar | calls.rb:1:1:667:52 | calls.rb | | calls.rb:13:5:13:8 | self | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:14:5:14:15 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:14:5:14:15 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:14:5:14:15 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:14:10:14:15 | "bar2" | calls.rb:1:1:667:52 | calls.rb | @@ -599,10 +602,12 @@ enclosingModule | calls.rb:22:5:24:7 | instance_m | calls.rb:21:1:34:3 | M | | calls.rb:23:9:23:19 | call to singleton_m | calls.rb:21:1:34:3 | M | | calls.rb:23:9:23:19 | self | calls.rb:21:1:34:3 | M | +| calls.rb:23:9:23:35 | ... | calls.rb:21:1:34:3 | M | | calls.rb:25:5:27:7 | singleton_m | calls.rb:21:1:34:3 | M | | calls.rb:25:9:25:12 | self | calls.rb:21:1:34:3 | M | | calls.rb:26:9:26:18 | call to instance_m | calls.rb:21:1:34:3 | M | | calls.rb:26:9:26:18 | self | calls.rb:21:1:34:3 | M | +| calls.rb:26:9:26:34 | ... | calls.rb:21:1:34:3 | M | | calls.rb:29:5:29:14 | call to instance_m | calls.rb:21:1:34:3 | M | | calls.rb:29:5:29:14 | self | calls.rb:21:1:34:3 | M | | calls.rb:30:5:30:8 | self | calls.rb:21:1:34:3 | M | @@ -618,6 +623,7 @@ enclosingModule | calls.rb:39:1:41:3 | call_instance_m | calls.rb:1:1:667:52 | calls.rb | | calls.rb:40:5:40:14 | call to instance_m | calls.rb:1:1:667:52 | calls.rb | | calls.rb:40:5:40:14 | self | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:40:5:40:30 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:43:1:58:3 | C | calls.rb:1:1:667:52 | calls.rb | | calls.rb:44:5:44:13 | call to include | calls.rb:43:1:58:3 | C | | calls.rb:44:5:44:13 | self | calls.rb:43:1:58:3 | C | @@ -633,6 +639,7 @@ enclosingModule | calls.rb:51:5:57:7 | baz | calls.rb:43:1:58:3 | C | | calls.rb:52:9:52:18 | call to instance_m | calls.rb:43:1:58:3 | C | | calls.rb:52:9:52:18 | self | calls.rb:43:1:58:3 | C | +| calls.rb:52:9:56:40 | ... | calls.rb:43:1:58:3 | C | | calls.rb:53:9:53:12 | self | calls.rb:43:1:58:3 | C | | calls.rb:53:9:53:23 | call to instance_m | calls.rb:43:1:58:3 | C | | calls.rb:55:9:55:19 | call to singleton_m | calls.rb:43:1:58:3 | C | @@ -652,6 +659,7 @@ enclosingModule | calls.rb:65:1:69:3 | D | calls.rb:1:1:667:52 | calls.rb | | calls.rb:65:11:65:11 | C | calls.rb:1:1:667:52 | calls.rb | | calls.rb:66:5:68:7 | baz | calls.rb:65:1:69:3 | D | +| calls.rb:67:9:67:13 | ... | calls.rb:65:1:69:3 | D | | calls.rb:67:9:67:13 | super call to baz | calls.rb:65:1:69:3 | D | | calls.rb:71:1:71:1 | d | calls.rb:1:1:667:52 | calls.rb | | calls.rb:71:1:71:9 | ... = ... | calls.rb:1:1:667:52 | calls.rb | @@ -672,14 +680,17 @@ enclosingModule | calls.rb:76:28:76:28 | 5 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:77:5:77:5 | a | calls.rb:1:1:667:52 | calls.rb | | calls.rb:77:5:77:16 | call to bit_length | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:77:5:78:16 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:78:5:78:5 | b | calls.rb:1:1:667:52 | calls.rb | | calls.rb:78:5:78:16 | call to bit_length | calls.rb:1:1:667:52 | calls.rb | | calls.rb:81:1:83:3 | call_block | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:82:5:82:11 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:82:5:82:11 | yield ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:82:11:82:11 | 1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:85:1:89:3 | foo | calls.rb:1:1:667:52 | calls.rb | | calls.rb:86:5:86:7 | var | calls.rb:1:1:667:52 | calls.rb | | calls.rb:86:5:86:18 | ... = ... | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:86:5:88:29 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:86:11:86:14 | Hash | calls.rb:1:1:667:52 | calls.rb | | calls.rb:86:11:86:18 | call to new | calls.rb:1:1:667:52 | calls.rb | | calls.rb:87:5:87:7 | var | calls.rb:1:1:667:52 | calls.rb | @@ -691,6 +702,7 @@ enclosingModule | calls.rb:88:19:88:19 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:88:19:88:19 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:88:22:88:24 | var | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:88:22:88:27 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:88:22:88:27 | ...[...] | calls.rb:1:1:667:52 | calls.rb | | calls.rb:88:26:88:26 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:91:1:94:3 | Integer | calls.rb:1:1:667:52 | calls.rb | @@ -707,6 +719,7 @@ enclosingModule | calls.rb:102:5:102:30 | puts | calls.rb:100:1:103:3 | Kernel | | calls.rb:102:14:102:14 | x | calls.rb:100:1:103:3 | Kernel | | calls.rb:102:14:102:14 | x | calls.rb:100:1:103:3 | Kernel | +| calls.rb:102:17:102:26 | ... | calls.rb:100:1:103:3 | Kernel | | calls.rb:102:17:102:26 | call to old_puts | calls.rb:100:1:103:3 | Kernel | | calls.rb:102:17:102:26 | self | calls.rb:100:1:103:3 | Kernel | | calls.rb:102:26:102:26 | x | calls.rb:100:1:103:3 | Kernel | @@ -720,6 +733,7 @@ enclosingModule | calls.rb:108:5:110:7 | include | calls.rb:105:1:113:3 | Module | | calls.rb:108:17:108:17 | x | calls.rb:105:1:113:3 | Module | | calls.rb:108:17:108:17 | x | calls.rb:105:1:113:3 | Module | +| calls.rb:109:9:109:21 | ... | calls.rb:105:1:113:3 | Module | | calls.rb:109:9:109:21 | call to old_include | calls.rb:105:1:113:3 | Module | | calls.rb:109:9:109:21 | self | calls.rb:105:1:113:3 | Module | | calls.rb:109:21:109:21 | x | calls.rb:105:1:113:3 | Module | @@ -740,6 +754,7 @@ enclosingModule | calls.rb:122:5:122:31 | [] | calls.rb:120:1:123:3 | Hash | | calls.rb:122:12:122:12 | x | calls.rb:120:1:123:3 | Hash | | calls.rb:122:12:122:12 | x | calls.rb:120:1:123:3 | Hash | +| calls.rb:122:15:122:27 | ... | calls.rb:120:1:123:3 | Hash | | calls.rb:122:15:122:27 | call to old_lookup | calls.rb:120:1:123:3 | Hash | | calls.rb:122:15:122:27 | self | calls.rb:120:1:123:3 | Hash | | calls.rb:122:26:122:26 | x | calls.rb:120:1:123:3 | Hash | @@ -752,6 +767,7 @@ enclosingModule | calls.rb:127:3:127:29 | [] | calls.rb:125:1:138:3 | Array | | calls.rb:127:10:127:10 | x | calls.rb:125:1:138:3 | Array | | calls.rb:127:10:127:10 | x | calls.rb:125:1:138:3 | Array | +| calls.rb:127:13:127:25 | ... | calls.rb:125:1:138:3 | Array | | calls.rb:127:13:127:25 | call to old_lookup | calls.rb:125:1:138:3 | Array | | calls.rb:127:13:127:25 | self | calls.rb:125:1:138:3 | Array | | calls.rb:127:24:127:24 | x | calls.rb:125:1:138:3 | Array | @@ -761,6 +777,7 @@ enclosingModule | calls.rb:131:16:131:19 | body | calls.rb:125:1:138:3 | Array | | calls.rb:132:5:132:5 | x | calls.rb:125:1:138:3 | Array | | calls.rb:132:5:132:9 | ... = ... | calls.rb:125:1:138:3 | Array | +| calls.rb:132:5:136:7 | ... | calls.rb:125:1:138:3 | Array | | calls.rb:132:9:132:9 | 0 | calls.rb:125:1:138:3 | Array | | calls.rb:133:5:136:7 | while ... | calls.rb:125:1:138:3 | Array | | calls.rb:133:11:133:11 | x | calls.rb:125:1:138:3 | Array | @@ -780,6 +797,7 @@ enclosingModule | calls.rb:135:11:135:12 | ... + ... | calls.rb:125:1:138:3 | Array | | calls.rb:135:14:135:14 | 1 | calls.rb:125:1:138:3 | Array | | calls.rb:140:1:142:3 | funny | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:141:5:141:20 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:141:5:141:20 | yield ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:141:11:141:20 | "prefix: " | calls.rb:1:1:667:52 | calls.rb | | calls.rb:141:12:141:19 | prefix: | calls.rb:1:1:667:52 | calls.rb | @@ -788,6 +806,7 @@ enclosingModule | calls.rb:144:7:144:30 | { ... } | calls.rb:1:1:667:52 | calls.rb | | calls.rb:144:10:144:10 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:144:10:144:10 | i | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:144:13:144:29 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:144:13:144:29 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:144:13:144:29 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:144:18:144:18 | i | calls.rb:1:1:667:52 | calls.rb | @@ -814,6 +833,7 @@ enclosingModule | calls.rb:150:26:150:26 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:150:29:150:29 | v | calls.rb:1:1:667:52 | calls.rb | | calls.rb:150:29:150:29 | v | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:150:32:150:61 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:150:32:150:61 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:150:32:150:61 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:150:37:150:61 | "#{...} -> #{...}" | calls.rb:1:1:667:52 | calls.rb | @@ -834,6 +854,7 @@ enclosingModule | calls.rb:152:20:152:20 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:152:20:152:20 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:152:23:152:23 | i | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:152:23:152:34 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:152:23:152:34 | call to bit_length | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:1:154:7 | Array | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:1:154:7 | [...] | calls.rb:1:1:667:52 | calls.rb | @@ -845,6 +866,7 @@ enclosingModule | calls.rb:154:17:154:40 | { ... } | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:20:154:20 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:20:154:20 | i | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:154:23:154:39 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:23:154:39 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:23:154:39 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:154:28:154:28 | i | calls.rb:1:1:667:52 | calls.rb | @@ -862,6 +884,7 @@ enclosingModule | calls.rb:156:21:156:21 | _ | calls.rb:1:1:667:52 | calls.rb | | calls.rb:156:24:156:24 | v | calls.rb:1:1:667:52 | calls.rb | | calls.rb:156:24:156:24 | v | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:156:27:156:36 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:156:27:156:36 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:156:27:156:36 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:156:32:156:32 | v | calls.rb:1:1:667:52 | calls.rb | @@ -869,6 +892,7 @@ enclosingModule | calls.rb:158:1:160:3 | indirect | calls.rb:1:1:667:52 | calls.rb | | calls.rb:158:14:158:15 | &b | calls.rb:1:1:667:52 | calls.rb | | calls.rb:158:15:158:15 | b | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:159:5:159:17 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:159:5:159:17 | call to call_block | calls.rb:1:1:667:52 | calls.rb | | calls.rb:159:5:159:17 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:159:16:159:17 | &... | calls.rb:1:1:667:52 | calls.rb | @@ -879,10 +903,12 @@ enclosingModule | calls.rb:162:13:162:13 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:162:13:162:13 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:162:16:162:16 | i | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:162:16:162:27 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:162:16:162:27 | call to bit_length | calls.rb:1:1:667:52 | calls.rb | | calls.rb:165:1:169:3 | S | calls.rb:1:1:667:52 | calls.rb | | calls.rb:166:5:168:7 | s_method | calls.rb:165:1:169:3 | S | | calls.rb:167:9:167:12 | self | calls.rb:165:1:169:3 | S | +| calls.rb:167:9:167:17 | ... | calls.rb:165:1:169:3 | S | | calls.rb:167:9:167:17 | call to to_s | calls.rb:165:1:169:3 | S | | calls.rb:171:1:174:3 | A | calls.rb:1:1:667:52 | calls.rb | | calls.rb:171:11:171:11 | S | calls.rb:1:1:667:52 | calls.rb | @@ -907,6 +933,7 @@ enclosingModule | calls.rb:191:9:191:12 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:192:9:192:26 | call to puts | calls.rb:190:1:226:3 | Singletons | | calls.rb:192:9:192:26 | self | calls.rb:190:1:226:3 | Singletons | +| calls.rb:192:9:193:24 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:192:14:192:26 | "singleton_a" | calls.rb:190:1:226:3 | Singletons | | calls.rb:192:15:192:25 | singleton_a | calls.rb:190:1:226:3 | Singletons | | calls.rb:193:9:193:12 | self | calls.rb:190:1:226:3 | Singletons | @@ -915,12 +942,14 @@ enclosingModule | calls.rb:196:9:196:12 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:197:9:197:26 | call to puts | calls.rb:190:1:226:3 | Singletons | | calls.rb:197:9:197:26 | self | calls.rb:190:1:226:3 | Singletons | +| calls.rb:197:9:198:24 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:197:14:197:26 | "singleton_b" | calls.rb:190:1:226:3 | Singletons | | calls.rb:197:15:197:25 | singleton_b | calls.rb:190:1:226:3 | Singletons | | calls.rb:198:9:198:12 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:198:9:198:24 | call to singleton_c | calls.rb:190:1:226:3 | Singletons | | calls.rb:201:5:203:7 | singleton_c | calls.rb:190:1:226:3 | Singletons | | calls.rb:201:9:201:12 | self | calls.rb:190:1:226:3 | Singletons | +| calls.rb:202:9:202:26 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:202:9:202:26 | call to puts | calls.rb:190:1:226:3 | Singletons | | calls.rb:202:9:202:26 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:202:14:202:26 | "singleton_c" | calls.rb:190:1:226:3 | Singletons | @@ -929,13 +958,16 @@ enclosingModule | calls.rb:205:9:205:12 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:206:9:206:26 | call to puts | calls.rb:190:1:226:3 | Singletons | | calls.rb:206:9:206:26 | self | calls.rb:190:1:226:3 | Singletons | +| calls.rb:206:9:207:24 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:206:14:206:26 | "singleton_d" | calls.rb:190:1:226:3 | Singletons | | calls.rb:206:15:206:25 | singleton_d | calls.rb:190:1:226:3 | Singletons | | calls.rb:207:9:207:12 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:207:9:207:24 | call to singleton_a | calls.rb:190:1:226:3 | Singletons | | calls.rb:210:5:215:7 | instance | calls.rb:190:1:226:3 | Singletons | | calls.rb:211:9:213:11 | singleton_e | calls.rb:190:1:226:3 | Singletons | +| calls.rb:211:9:214:19 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:211:13:211:16 | self | calls.rb:190:1:226:3 | Singletons | +| calls.rb:212:13:212:30 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:212:13:212:30 | call to puts | calls.rb:190:1:226:3 | Singletons | | calls.rb:212:13:212:30 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:212:18:212:30 | "singleton_e" | calls.rb:190:1:226:3 | Singletons | @@ -945,12 +977,14 @@ enclosingModule | calls.rb:217:5:221:7 | class << ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:217:14:217:17 | self | calls.rb:190:1:226:3 | Singletons | | calls.rb:218:9:220:11 | singleton_f | calls.rb:217:5:221:7 | class << ... | +| calls.rb:219:13:219:30 | ... | calls.rb:217:5:221:7 | class << ... | | calls.rb:219:13:219:30 | call to puts | calls.rb:217:5:221:7 | class << ... | | calls.rb:219:13:219:30 | self | calls.rb:217:5:221:7 | class << ... | | calls.rb:219:18:219:30 | "singleton_f" | calls.rb:217:5:221:7 | class << ... | | calls.rb:219:19:219:29 | singleton_f | calls.rb:217:5:221:7 | class << ... | | calls.rb:223:5:225:7 | call_singleton_g | calls.rb:190:1:226:3 | Singletons | | calls.rb:224:9:224:12 | self | calls.rb:190:1:226:3 | Singletons | +| calls.rb:224:9:224:24 | ... | calls.rb:190:1:226:3 | Singletons | | calls.rb:224:9:224:24 | call to singleton_g | calls.rb:190:1:226:3 | Singletons | | calls.rb:228:1:228:10 | Singletons | calls.rb:1:1:667:52 | calls.rb | | calls.rb:228:1:228:22 | call to singleton_a | calls.rb:1:1:667:52 | calls.rb | @@ -966,6 +1000,7 @@ enclosingModule | calls.rb:234:1:234:14 | call to singleton_e | calls.rb:1:1:667:52 | calls.rb | | calls.rb:236:1:238:3 | singleton_g | calls.rb:1:1:667:52 | calls.rb | | calls.rb:236:5:236:6 | c1 | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:237:5:237:24 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:237:5:237:24 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:237:5:237:24 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:237:10:237:24 | "singleton_g_1" | calls.rb:1:1:667:52 | calls.rb | @@ -976,6 +1011,7 @@ enclosingModule | calls.rb:241:1:241:19 | call to call_singleton_g | calls.rb:1:1:667:52 | calls.rb | | calls.rb:243:1:245:3 | singleton_g | calls.rb:1:1:667:52 | calls.rb | | calls.rb:243:5:243:6 | c1 | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:244:5:244:24 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:244:5:244:24 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:244:5:244:24 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:244:10:244:24 | "singleton_g_2" | calls.rb:1:1:667:52 | calls.rb | @@ -987,6 +1023,7 @@ enclosingModule | calls.rb:250:1:254:3 | class << ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:250:10:250:11 | c1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:251:5:253:7 | singleton_g | calls.rb:250:1:254:3 | class << ... | +| calls.rb:252:9:252:28 | ... | calls.rb:250:1:254:3 | class << ... | | calls.rb:252:9:252:28 | call to puts | calls.rb:250:1:254:3 | class << ... | | calls.rb:252:9:252:28 | self | calls.rb:250:1:254:3 | class << ... | | calls.rb:252:14:252:28 | "singleton_g_3" | calls.rb:250:1:254:3 | class << ... | @@ -1011,6 +1048,7 @@ enclosingModule | calls.rb:265:7:265:15 | top-level | calls.rb:1:1:667:52 | calls.rb | | calls.rb:267:1:269:3 | singleton_g | calls.rb:1:1:667:52 | calls.rb | | calls.rb:267:5:267:14 | Singletons | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:268:5:268:22 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:268:5:268:22 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:268:5:268:22 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:268:10:268:22 | "singleton_g" | calls.rb:1:1:667:52 | calls.rb | @@ -1035,8 +1073,10 @@ enclosingModule | calls.rb:279:5:279:8 | type | calls.rb:1:1:667:52 | calls.rb | | calls.rb:279:5:279:12 | call to new | calls.rb:1:1:667:52 | calls.rb | | calls.rb:279:5:279:21 | call to instance | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:279:5:285:20 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:281:5:283:7 | singleton_h | calls.rb:1:1:667:52 | calls.rb | | calls.rb:281:9:281:12 | type | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:282:9:282:26 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:282:9:282:26 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:282:9:282:26 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:282:14:282:26 | "singleton_h" | calls.rb:1:1:667:52 | calls.rb | @@ -1054,6 +1094,7 @@ enclosingModule | calls.rb:293:1:297:3 | class << ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:293:10:293:10 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:294:5:296:7 | singleton_i | calls.rb:293:1:297:3 | class << ... | +| calls.rb:295:9:295:26 | ... | calls.rb:293:1:297:3 | class << ... | | calls.rb:295:9:295:26 | call to puts | calls.rb:293:1:297:3 | class << ... | | calls.rb:295:9:295:26 | self | calls.rb:293:1:297:3 | class << ... | | calls.rb:295:14:295:26 | "singleton_i" | calls.rb:293:1:297:3 | class << ... | @@ -1065,6 +1106,7 @@ enclosingModule | calls.rb:302:1:306:3 | class << ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:302:10:302:19 | Singletons | calls.rb:1:1:667:52 | calls.rb | | calls.rb:303:5:305:7 | singleton_j | calls.rb:302:1:306:3 | class << ... | +| calls.rb:304:9:304:26 | ... | calls.rb:302:1:306:3 | class << ... | | calls.rb:304:9:304:26 | call to puts | calls.rb:302:1:306:3 | class << ... | | calls.rb:304:9:304:26 | self | calls.rb:302:1:306:3 | class << ... | | calls.rb:304:14:304:26 | "singleton_j" | calls.rb:302:1:306:3 | class << ... | @@ -1075,6 +1117,7 @@ enclosingModule | calls.rb:311:5:314:7 | instance | calls.rb:310:1:321:3 | SelfNew | | calls.rb:312:9:312:31 | call to puts | calls.rb:310:1:321:3 | SelfNew | | calls.rb:312:9:312:31 | self | calls.rb:310:1:321:3 | SelfNew | +| calls.rb:312:9:313:36 | ... | calls.rb:310:1:321:3 | SelfNew | | calls.rb:312:14:312:31 | "SelfNew#instance" | calls.rb:310:1:321:3 | SelfNew | | calls.rb:312:15:312:30 | SelfNew#instance | calls.rb:310:1:321:3 | SelfNew | | calls.rb:313:9:313:11 | call to new | calls.rb:310:1:321:3 | SelfNew | @@ -1084,6 +1127,7 @@ enclosingModule | calls.rb:316:9:316:12 | self | calls.rb:310:1:321:3 | SelfNew | | calls.rb:317:9:317:11 | call to new | calls.rb:310:1:321:3 | SelfNew | | calls.rb:317:9:317:11 | self | calls.rb:310:1:321:3 | SelfNew | +| calls.rb:317:9:317:20 | ... | calls.rb:310:1:321:3 | SelfNew | | calls.rb:317:9:317:20 | call to instance | calls.rb:310:1:321:3 | SelfNew | | calls.rb:320:5:320:7 | call to new | calls.rb:310:1:321:3 | SelfNew | | calls.rb:320:5:320:7 | self | calls.rb:310:1:321:3 | SelfNew | @@ -1092,15 +1136,18 @@ enclosingModule | calls.rb:323:1:323:17 | call to singleton | calls.rb:1:1:667:52 | calls.rb | | calls.rb:325:1:333:3 | C1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:326:5:328:7 | instance | calls.rb:325:1:333:3 | C1 | +| calls.rb:327:9:327:26 | ... | calls.rb:325:1:333:3 | C1 | | calls.rb:327:9:327:26 | call to puts | calls.rb:325:1:333:3 | C1 | | calls.rb:327:9:327:26 | self | calls.rb:325:1:333:3 | C1 | | calls.rb:327:14:327:26 | "C1#instance" | calls.rb:325:1:333:3 | C1 | | calls.rb:327:15:327:25 | C1#instance | calls.rb:325:1:333:3 | C1 | | calls.rb:330:5:332:7 | return_self | calls.rb:325:1:333:3 | C1 | +| calls.rb:331:9:331:12 | ... | calls.rb:325:1:333:3 | C1 | | calls.rb:331:9:331:12 | self | calls.rb:325:1:333:3 | C1 | | calls.rb:335:1:339:3 | C2 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:335:12:335:13 | C1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:336:5:338:7 | instance | calls.rb:335:1:339:3 | C2 | +| calls.rb:337:9:337:26 | ... | calls.rb:335:1:339:3 | C2 | | calls.rb:337:9:337:26 | call to puts | calls.rb:335:1:339:3 | C2 | | calls.rb:337:9:337:26 | self | calls.rb:335:1:339:3 | C2 | | calls.rb:337:14:337:26 | "C2#instance" | calls.rb:335:1:339:3 | C2 | @@ -1108,6 +1155,7 @@ enclosingModule | calls.rb:341:1:345:3 | C3 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:341:12:341:13 | C2 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:342:5:344:7 | instance | calls.rb:341:1:345:3 | C3 | +| calls.rb:343:9:343:26 | ... | calls.rb:341:1:345:3 | C3 | | calls.rb:343:9:343:26 | call to puts | calls.rb:341:1:345:3 | C3 | | calls.rb:343:9:343:26 | self | calls.rb:341:1:345:3 | C3 | | calls.rb:343:14:343:26 | "C3#instance" | calls.rb:341:1:345:3 | C3 | @@ -1116,6 +1164,7 @@ enclosingModule | calls.rb:347:22:347:22 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:347:22:347:22 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:348:5:356:7 | case ... | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:348:5:362:7 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:348:10:348:10 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:349:5:350:18 | when ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:349:10:349:11 | C3 | calls.rb:1:1:667:52 | calls.rb | @@ -1182,8 +1231,10 @@ enclosingModule | calls.rb:374:1:378:3 | add_singleton | calls.rb:1:1:667:52 | calls.rb | | calls.rb:374:19:374:19 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:374:19:374:19 | x | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:375:5:377:7 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:375:5:377:7 | instance | calls.rb:1:1:667:52 | calls.rb | | calls.rb:375:9:375:9 | x | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:376:9:376:28 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:376:9:376:28 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:376:9:376:28 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:376:14:376:28 | "instance_on x" | calls.rb:1:1:667:52 | calls.rb | @@ -1204,30 +1255,36 @@ enclosingModule | calls.rb:386:5:398:7 | class << ... | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:386:14:386:17 | self | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:387:9:389:11 | singleton1 | calls.rb:386:5:398:7 | class << ... | +| calls.rb:388:13:388:48 | ... | calls.rb:386:5:398:7 | class << ... | | calls.rb:388:13:388:48 | call to puts | calls.rb:386:5:398:7 | class << ... | | calls.rb:388:13:388:48 | self | calls.rb:386:5:398:7 | class << ... | | calls.rb:388:18:388:48 | "SingletonOverride1#singleton1" | calls.rb:386:5:398:7 | class << ... | | calls.rb:388:19:388:47 | SingletonOverride1#singleton1 | calls.rb:386:5:398:7 | class << ... | | calls.rb:391:9:393:11 | call_singleton1 | calls.rb:386:5:398:7 | class << ... | +| calls.rb:392:13:392:22 | ... | calls.rb:386:5:398:7 | class << ... | | calls.rb:392:13:392:22 | call to singleton1 | calls.rb:386:5:398:7 | class << ... | | calls.rb:392:13:392:22 | self | calls.rb:386:5:398:7 | class << ... | | calls.rb:395:9:397:11 | factory | calls.rb:386:5:398:7 | class << ... | | calls.rb:396:13:396:16 | self | calls.rb:386:5:398:7 | class << ... | | calls.rb:396:13:396:20 | call to new | calls.rb:386:5:398:7 | class << ... | +| calls.rb:396:13:396:30 | ... | calls.rb:386:5:398:7 | class << ... | | calls.rb:396:13:396:30 | call to instance1 | calls.rb:386:5:398:7 | class << ... | | calls.rb:400:5:402:7 | singleton2 | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:400:9:400:12 | self | calls.rb:385:1:413:3 | SingletonOverride1 | +| calls.rb:401:9:401:44 | ... | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:401:9:401:44 | call to puts | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:401:9:401:44 | self | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:401:14:401:44 | "SingletonOverride1#singleton2" | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:401:15:401:43 | SingletonOverride1#singleton2 | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:404:5:406:7 | call_singleton2 | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:404:9:404:12 | self | calls.rb:385:1:413:3 | SingletonOverride1 | +| calls.rb:405:9:405:18 | ... | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:405:9:405:18 | call to singleton2 | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:405:9:405:18 | self | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:408:5:408:14 | call to singleton2 | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:408:5:408:14 | self | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:410:5:412:7 | instance1 | calls.rb:385:1:413:3 | SingletonOverride1 | +| calls.rb:411:9:411:43 | ... | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:411:9:411:43 | call to puts | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:411:9:411:43 | self | calls.rb:385:1:413:3 | SingletonOverride1 | | calls.rb:411:14:411:43 | "SingletonOverride1#instance1" | calls.rb:385:1:413:3 | SingletonOverride1 | @@ -1245,17 +1302,20 @@ enclosingModule | calls.rb:421:5:425:7 | class << ... | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:421:14:421:17 | self | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:422:9:424:11 | singleton1 | calls.rb:421:5:425:7 | class << ... | +| calls.rb:423:13:423:48 | ... | calls.rb:421:5:425:7 | class << ... | | calls.rb:423:13:423:48 | call to puts | calls.rb:421:5:425:7 | class << ... | | calls.rb:423:13:423:48 | self | calls.rb:421:5:425:7 | class << ... | | calls.rb:423:18:423:48 | "SingletonOverride2#singleton1" | calls.rb:421:5:425:7 | class << ... | | calls.rb:423:19:423:47 | SingletonOverride2#singleton1 | calls.rb:421:5:425:7 | class << ... | | calls.rb:427:5:429:7 | singleton2 | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:427:9:427:12 | self | calls.rb:420:1:434:3 | SingletonOverride2 | +| calls.rb:428:9:428:44 | ... | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:428:9:428:44 | call to puts | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:428:9:428:44 | self | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:428:14:428:44 | "SingletonOverride2#singleton2" | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:428:15:428:43 | SingletonOverride2#singleton2 | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:431:5:433:7 | instance1 | calls.rb:420:1:434:3 | SingletonOverride2 | +| calls.rb:432:9:432:43 | ... | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:432:9:432:43 | call to puts | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:432:9:432:43 | self | calls.rb:420:1:434:3 | SingletonOverride2 | | calls.rb:432:14:432:43 | "SingletonOverride2#instance1" | calls.rb:420:1:434:3 | SingletonOverride2 | @@ -1276,6 +1336,7 @@ enclosingModule | calls.rb:442:17:442:17 | 0 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:442:19:445:11 | then ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:443:9:445:11 | m1 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | +| calls.rb:444:13:444:48 | ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:444:13:444:48 | call to puts | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:444:13:444:48 | self | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:444:18:444:48 | "ConditionalInstanceMethods#m1" | calls.rb:441:1:469:3 | ConditionalInstanceMethods | @@ -1283,14 +1344,17 @@ enclosingModule | calls.rb:448:5:460:7 | m2 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:449:9:449:44 | call to puts | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:449:9:449:44 | self | calls.rb:441:1:469:3 | ConditionalInstanceMethods | +| calls.rb:449:9:459:10 | ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:449:14:449:44 | "ConditionalInstanceMethods#m2" | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:449:15:449:43 | ConditionalInstanceMethods#m2 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:451:9:457:11 | m3 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:452:13:452:48 | call to puts | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:452:13:452:48 | self | calls.rb:441:1:469:3 | ConditionalInstanceMethods | +| calls.rb:452:13:456:15 | ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:452:18:452:48 | "ConditionalInstanceMethods#m3" | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:452:19:452:47 | ConditionalInstanceMethods#m3 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:454:13:456:15 | m4 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | +| calls.rb:455:17:455:52 | ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:455:17:455:52 | call to puts | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:455:17:455:52 | self | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:455:22:455:52 | "ConditionalInstanceMethods#m4" | calls.rb:441:1:469:3 | ConditionalInstanceMethods | @@ -1308,7 +1372,9 @@ enclosingModule | calls.rb:463:9:467:15 | call to new | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:463:9:467:18 | call to m5 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:463:19:467:11 | do ... end | calls.rb:441:1:469:3 | ConditionalInstanceMethods | +| calls.rb:464:13:466:15 | ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:464:13:466:15 | m5 | calls.rb:441:1:469:3 | ConditionalInstanceMethods | +| calls.rb:465:17:465:40 | ... | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:465:17:465:40 | call to puts | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:465:17:465:40 | self | calls.rb:441:1:469:3 | ConditionalInstanceMethods | | calls.rb:465:22:465:40 | "AnonymousClass#m5" | calls.rb:441:1:469:3 | ConditionalInstanceMethods | @@ -1340,11 +1406,14 @@ enclosingModule | calls.rb:479:5:479:11 | [...] | calls.rb:1:1:667:52 | calls.rb | | calls.rb:479:5:479:11 | call to [] | calls.rb:1:1:667:52 | calls.rb | | calls.rb:479:5:483:7 | call to each | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:479:5:495:7 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:479:6:479:6 | 0 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:479:8:479:8 | 1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:479:10:479:10 | 2 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:479:18:483:7 | do ... end | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:480:9:482:11 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:480:9:482:11 | foo | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:481:13:481:22 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:481:13:481:22 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:481:13:481:22 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:481:18:481:22 | "foo" | calls.rb:1:1:667:52 | calls.rb | @@ -1354,7 +1423,9 @@ enclosingModule | calls.rb:485:5:489:11 | call to new | calls.rb:1:1:667:52 | calls.rb | | calls.rb:485:5:489:15 | call to bar | calls.rb:1:1:667:52 | calls.rb | | calls.rb:485:15:489:7 | do ... end | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:486:9:488:11 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:486:9:488:11 | bar | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:487:13:487:22 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:487:13:487:22 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:487:13:487:22 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:487:18:487:22 | "bar" | calls.rb:1:1:667:52 | calls.rb | @@ -1369,6 +1440,7 @@ enclosingModule | calls.rb:491:18:495:7 | do ... end | calls.rb:1:1:667:52 | calls.rb | | calls.rb:491:22:491:22 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:491:22:491:22 | i | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:492:9:494:11 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:492:9:494:11 | call to define_method | calls.rb:1:1:667:52 | calls.rb | | calls.rb:492:9:494:11 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:492:23:492:32 | "baz_#{...}" | calls.rb:1:1:667:52 | calls.rb | @@ -1376,6 +1448,7 @@ enclosingModule | calls.rb:492:28:492:31 | #{...} | calls.rb:1:1:667:52 | calls.rb | | calls.rb:492:30:492:30 | i | calls.rb:1:1:667:52 | calls.rb | | calls.rb:492:35:494:11 | do ... end | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:493:13:493:27 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:493:13:493:27 | call to puts | calls.rb:1:1:667:52 | calls.rb | | calls.rb:493:13:493:27 | self | calls.rb:1:1:667:52 | calls.rb | | calls.rb:493:18:493:27 | "baz_#{...}" | calls.rb:1:1:667:52 | calls.rb | @@ -1399,6 +1472,7 @@ enclosingModule | calls.rb:502:1:502:33 | call to baz_2 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:504:1:510:3 | ExtendSingletonMethod | calls.rb:1:1:667:52 | calls.rb | | calls.rb:505:5:507:7 | singleton | calls.rb:504:1:510:3 | ExtendSingletonMethod | +| calls.rb:506:9:506:46 | ... | calls.rb:504:1:510:3 | ExtendSingletonMethod | | calls.rb:506:9:506:46 | call to puts | calls.rb:504:1:510:3 | ExtendSingletonMethod | | calls.rb:506:9:506:46 | self | calls.rb:504:1:510:3 | ExtendSingletonMethod | | calls.rb:506:14:506:46 | "ExtendSingletonMethod#singleton" | calls.rb:504:1:510:3 | ExtendSingletonMethod | @@ -1435,6 +1509,7 @@ enclosingModule | calls.rb:534:5:536:7 | call to protected | calls.rb:533:1:537:3 | ProtectedMethodInModule | | calls.rb:534:5:536:7 | self | calls.rb:533:1:537:3 | ProtectedMethodInModule | | calls.rb:534:15:536:7 | foo | calls.rb:533:1:537:3 | ProtectedMethodInModule | +| calls.rb:535:9:535:42 | ... | calls.rb:533:1:537:3 | ProtectedMethodInModule | | calls.rb:535:9:535:42 | call to puts | calls.rb:533:1:537:3 | ProtectedMethodInModule | | calls.rb:535:9:535:42 | self | calls.rb:533:1:537:3 | ProtectedMethodInModule | | calls.rb:535:14:535:42 | "ProtectedMethodInModule#foo" | calls.rb:533:1:537:3 | ProtectedMethodInModule | @@ -1446,6 +1521,7 @@ enclosingModule | calls.rb:542:5:544:7 | call to protected | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:542:5:544:7 | self | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:542:15:544:7 | bar | calls.rb:539:1:552:3 | ProtectedMethods | +| calls.rb:543:9:543:35 | ... | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:543:9:543:35 | call to puts | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:543:9:543:35 | self | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:543:14:543:35 | "ProtectedMethods#bar" | calls.rb:539:1:552:3 | ProtectedMethods | @@ -1453,6 +1529,7 @@ enclosingModule | calls.rb:546:5:551:7 | baz | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:547:9:547:11 | call to foo | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:547:9:547:11 | self | calls.rb:539:1:552:3 | ProtectedMethods | +| calls.rb:547:9:550:32 | ... | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:548:9:548:11 | call to bar | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:548:9:548:11 | self | calls.rb:539:1:552:3 | ProtectedMethods | | calls.rb:549:9:549:24 | ProtectedMethods | calls.rb:539:1:552:3 | ProtectedMethods | @@ -1475,6 +1552,7 @@ enclosingModule | calls.rb:559:5:562:7 | baz | calls.rb:558:1:563:3 | ProtectedMethodsSub | | calls.rb:560:9:560:11 | call to foo | calls.rb:558:1:563:3 | ProtectedMethodsSub | | calls.rb:560:9:560:11 | self | calls.rb:558:1:563:3 | ProtectedMethodsSub | +| calls.rb:560:9:561:35 | ... | calls.rb:558:1:563:3 | ProtectedMethodsSub | | calls.rb:561:9:561:27 | ProtectedMethodsSub | calls.rb:558:1:563:3 | ProtectedMethodsSub | | calls.rb:561:9:561:31 | call to new | calls.rb:558:1:563:3 | ProtectedMethodsSub | | calls.rb:561:9:561:35 | call to foo | calls.rb:558:1:563:3 | ProtectedMethodsSub | @@ -1497,6 +1575,7 @@ enclosingModule | calls.rb:569:17:569:17 | c | calls.rb:1:1:667:52 | calls.rb | | calls.rb:569:17:569:17 | c | calls.rb:1:1:667:52 | calls.rb | | calls.rb:569:20:569:20 | c | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:569:20:569:24 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:569:20:569:24 | call to baz | calls.rb:1:1:667:52 | calls.rb | | calls.rb:570:1:570:13 | Array | calls.rb:1:1:667:52 | calls.rb | | calls.rb:570:1:570:13 | [...] | calls.rb:1:1:667:52 | calls.rb | @@ -1512,6 +1591,7 @@ enclosingModule | calls.rb:570:23:570:23 | s | calls.rb:1:1:667:52 | calls.rb | | calls.rb:570:23:570:23 | s | calls.rb:1:1:667:52 | calls.rb | | calls.rb:570:26:570:26 | s | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:570:26:570:37 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:570:26:570:37 | call to capitalize | calls.rb:1:1:667:52 | calls.rb | | calls.rb:572:1:575:3 | SingletonUpCall_Base | calls.rb:1:1:667:52 | calls.rb | | calls.rb:573:5:574:7 | singleton | calls.rb:572:1:575:3 | SingletonUpCall_Base | @@ -1526,6 +1606,7 @@ enclosingModule | calls.rb:579:9:579:12 | self | calls.rb:576:1:583:3 | SingletonUpCall_Sub | | calls.rb:580:9:580:17 | call to singleton | calls.rb:576:1:583:3 | SingletonUpCall_Sub | | calls.rb:580:9:580:17 | self | calls.rb:576:1:583:3 | SingletonUpCall_Sub | +| calls.rb:580:9:581:35 | ... | calls.rb:576:1:583:3 | SingletonUpCall_Sub | | calls.rb:581:9:581:18 | call to singleton2 | calls.rb:576:1:583:3 | SingletonUpCall_Sub | | calls.rb:581:9:581:18 | self | calls.rb:576:1:583:3 | SingletonUpCall_Sub | | calls.rb:584:1:589:3 | SingletonUpCall_SubSub | calls.rb:1:1:667:52 | calls.rb | @@ -1539,10 +1620,12 @@ enclosingModule | calls.rb:592:9:592:12 | self | calls.rb:591:1:602:3 | SingletonA | | calls.rb:595:5:597:7 | call_singleton1 | calls.rb:591:1:602:3 | SingletonA | | calls.rb:595:9:595:12 | self | calls.rb:591:1:602:3 | SingletonA | +| calls.rb:596:9:596:18 | ... | calls.rb:591:1:602:3 | SingletonA | | calls.rb:596:9:596:18 | call to singleton1 | calls.rb:591:1:602:3 | SingletonA | | calls.rb:596:9:596:18 | self | calls.rb:591:1:602:3 | SingletonA | | calls.rb:599:5:601:7 | call_call_singleton1 | calls.rb:591:1:602:3 | SingletonA | | calls.rb:599:9:599:12 | self | calls.rb:591:1:602:3 | SingletonA | +| calls.rb:600:9:600:23 | ... | calls.rb:591:1:602:3 | SingletonA | | calls.rb:600:9:600:23 | call to call_singleton1 | calls.rb:591:1:602:3 | SingletonA | | calls.rb:600:9:600:23 | self | calls.rb:591:1:602:3 | SingletonA | | calls.rb:604:1:611:3 | SingletonB | calls.rb:1:1:667:52 | calls.rb | @@ -1553,6 +1636,7 @@ enclosingModule | calls.rb:608:9:608:12 | self | calls.rb:604:1:611:3 | SingletonB | | calls.rb:609:9:609:18 | call to singleton1 | calls.rb:604:1:611:3 | SingletonB | | calls.rb:609:9:609:18 | self | calls.rb:604:1:611:3 | SingletonB | +| calls.rb:609:9:609:105 | ... | calls.rb:604:1:611:3 | SingletonB | | calls.rb:613:1:620:3 | SingletonC | calls.rb:1:1:667:52 | calls.rb | | calls.rb:613:20:613:29 | SingletonA | calls.rb:1:1:667:52 | calls.rb | | calls.rb:614:5:615:7 | singleton1 | calls.rb:613:1:620:3 | SingletonC | @@ -1561,6 +1645,7 @@ enclosingModule | calls.rb:617:9:617:12 | self | calls.rb:613:1:620:3 | SingletonC | | calls.rb:618:9:618:18 | call to singleton1 | calls.rb:613:1:620:3 | SingletonC | | calls.rb:618:9:618:18 | self | calls.rb:613:1:620:3 | SingletonC | +| calls.rb:618:9:618:105 | ... | calls.rb:613:1:620:3 | SingletonC | | calls.rb:622:1:622:10 | SingletonA | calls.rb:1:1:667:52 | calls.rb | | calls.rb:622:1:622:31 | call to call_call_singleton1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:623:1:623:10 | SingletonB | calls.rb:1:1:667:52 | calls.rb | @@ -1570,6 +1655,7 @@ enclosingModule | calls.rb:626:1:632:3 | Included | calls.rb:1:1:667:52 | calls.rb | | calls.rb:627:5:629:7 | foo | calls.rb:626:1:632:3 | Included | | calls.rb:628:9:628:12 | self | calls.rb:626:1:632:3 | Included | +| calls.rb:628:9:628:16 | ... | calls.rb:626:1:632:3 | Included | | calls.rb:628:9:628:16 | call to bar | calls.rb:626:1:632:3 | Included | | calls.rb:630:5:631:7 | bar | calls.rb:626:1:632:3 | Included | | calls.rb:634:1:639:3 | IncludesIncluded | calls.rb:1:1:667:52 | calls.rb | @@ -1577,11 +1663,13 @@ enclosingModule | calls.rb:635:5:635:20 | self | calls.rb:634:1:639:3 | IncludesIncluded | | calls.rb:635:13:635:20 | Included | calls.rb:634:1:639:3 | IncludesIncluded | | calls.rb:636:5:638:7 | bar | calls.rb:634:1:639:3 | IncludesIncluded | +| calls.rb:637:9:637:13 | ... | calls.rb:634:1:639:3 | IncludesIncluded | | calls.rb:637:9:637:13 | super call to bar | calls.rb:634:1:639:3 | IncludesIncluded | | calls.rb:641:1:645:3 | CustomNew1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:642:5:644:7 | new | calls.rb:641:1:645:3 | CustomNew1 | | calls.rb:642:9:642:12 | self | calls.rb:641:1:645:3 | CustomNew1 | | calls.rb:643:9:643:10 | C1 | calls.rb:641:1:645:3 | CustomNew1 | +| calls.rb:643:9:643:14 | ... | calls.rb:641:1:645:3 | CustomNew1 | | calls.rb:643:9:643:14 | call to new | calls.rb:641:1:645:3 | CustomNew1 | | calls.rb:647:1:647:10 | CustomNew1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:647:1:647:14 | call to new | calls.rb:1:1:667:52 | calls.rb | @@ -1590,8 +1678,10 @@ enclosingModule | calls.rb:650:5:652:7 | new | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:650:9:650:12 | self | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:651:9:651:12 | self | calls.rb:649:1:657:3 | CustomNew2 | +| calls.rb:651:9:651:21 | ... | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:651:9:651:21 | call to allocate | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:654:5:656:7 | instance | calls.rb:649:1:657:3 | CustomNew2 | +| calls.rb:655:9:655:34 | ... | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:655:9:655:34 | call to puts | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:655:9:655:34 | self | calls.rb:649:1:657:3 | CustomNew2 | | calls.rb:655:14:655:34 | "CustomNew2#instance" | calls.rb:649:1:657:3 | CustomNew2 | @@ -1605,11 +1695,13 @@ enclosingModule | calls.rb:662:5:662:11 | Array | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:5:662:11 | [...] | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:5:662:11 | call to [] | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:662:5:664:7 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:5:664:7 | call to each | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:6:662:6 | 0 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:8:662:8 | 1 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:10:662:10 | 2 | calls.rb:1:1:667:52 | calls.rb | | calls.rb:662:18:664:7 | do ... end | calls.rb:1:1:667:52 | calls.rb | +| calls.rb:663:9:663:9 | ... | calls.rb:1:1:667:52 | calls.rb | | calls.rb:663:9:663:9 | x | calls.rb:1:1:667:52 | calls.rb | | calls.rb:667:1:667:26 | ( ... ) | calls.rb:1:1:667:52 | calls.rb | | calls.rb:667:1:667:35 | call to instance | calls.rb:1:1:667:52 | calls.rb | @@ -1621,6 +1713,7 @@ enclosingModule | element_reference.rb:2:5:4:7 | [] | element_reference.rb:1:1:5:3 | ClassWithElementRef | | element_reference.rb:2:12:2:12 | x | element_reference.rb:1:1:5:3 | ClassWithElementRef | | element_reference.rb:2:12:2:12 | x | element_reference.rb:1:1:5:3 | ClassWithElementRef | +| element_reference.rb:3:9:3:19 | ... | element_reference.rb:1:1:5:3 | ClassWithElementRef | | element_reference.rb:3:9:3:19 | yield ... | element_reference.rb:1:1:5:3 | ClassWithElementRef | | element_reference.rb:3:15:3:15 | x | element_reference.rb:1:1:5:3 | ClassWithElementRef | | element_reference.rb:3:15:3:19 | ... + ... | element_reference.rb:1:1:5:3 | ClassWithElementRef | @@ -1635,6 +1728,7 @@ enclosingModule | element_reference.rb:9:6:9:19 | { ... } | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:9:9:9:9 | x | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:9:9:9:9 | x | element_reference.rb:1:1:13:4 | element_reference.rb | +| element_reference.rb:9:12:9:17 | ... | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:9:12:9:17 | call to puts | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:9:12:9:17 | self | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:9:17:9:17 | x | element_reference.rb:1:1:13:4 | element_reference.rb | @@ -1644,15 +1738,18 @@ enclosingModule | element_reference.rb:11:6:13:3 | do ... end | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:11:10:11:10 | x | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:11:10:11:10 | x | element_reference.rb:1:1:13:4 | element_reference.rb | +| element_reference.rb:12:5:12:10 | ... | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:12:5:12:10 | call to puts | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:12:5:12:10 | self | element_reference.rb:1:1:13:4 | element_reference.rb | | element_reference.rb:12:10:12:10 | x | element_reference.rb:1:1:13:4 | element_reference.rb | | hello.rb:1:1:8:3 | EnglishWords | hello.rb:1:1:22:3 | hello.rb | | hello.rb:2:5:4:7 | hello | hello.rb:1:1:8:3 | EnglishWords | +| hello.rb:3:9:3:22 | ... | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:3:9:3:22 | return | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:3:16:3:22 | "hello" | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:3:17:3:21 | hello | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:5:5:7:7 | world | hello.rb:1:1:8:3 | EnglishWords | +| hello.rb:6:9:6:22 | ... | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:6:9:6:22 | return | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:6:16:6:22 | "world" | hello.rb:1:1:8:3 | EnglishWords | | hello.rb:6:17:6:21 | world | hello.rb:1:1:8:3 | EnglishWords | @@ -1661,12 +1758,14 @@ enclosingModule | hello.rb:12:5:12:24 | self | hello.rb:11:1:16:3 | Greeting | | hello.rb:12:13:12:24 | EnglishWords | hello.rb:11:1:16:3 | Greeting | | hello.rb:13:5:15:7 | message | hello.rb:11:1:16:3 | Greeting | +| hello.rb:14:9:14:20 | ... | hello.rb:11:1:16:3 | Greeting | | hello.rb:14:9:14:20 | return | hello.rb:11:1:16:3 | Greeting | | hello.rb:14:16:14:20 | call to hello | hello.rb:11:1:16:3 | Greeting | | hello.rb:14:16:14:20 | self | hello.rb:11:1:16:3 | Greeting | | hello.rb:18:1:22:3 | HelloWorld | hello.rb:1:1:22:3 | hello.rb | | hello.rb:18:20:18:27 | Greeting | hello.rb:1:1:22:3 | hello.rb | | hello.rb:19:5:21:7 | message | hello.rb:18:1:22:3 | HelloWorld | +| hello.rb:20:9:20:40 | ... | hello.rb:18:1:22:3 | HelloWorld | | hello.rb:20:9:20:40 | return | hello.rb:18:1:22:3 | HelloWorld | | hello.rb:20:16:20:20 | super call to message | hello.rb:18:1:22:3 | HelloWorld | | hello.rb:20:16:20:26 | ... + ... | hello.rb:18:1:22:3 | HelloWorld | @@ -1684,12 +1783,14 @@ enclosingModule | instance_fields.rb:3:9:5:11 | create | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:4:13:4:18 | @field | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:4:13:4:18 | self | instance_fields.rb:2:5:9:7 | class << ... | +| instance_fields.rb:4:13:4:35 | ... | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:4:13:4:35 | ... = ... | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:4:22:4:31 | A_target | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:4:22:4:35 | call to new | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:6:9:8:11 | use | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:7:13:7:18 | @field | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:7:13:7:18 | self | instance_fields.rb:2:5:9:7 | class << ... | +| instance_fields.rb:7:13:7:25 | ... | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:7:13:7:25 | call to target | instance_fields.rb:2:5:9:7 | class << ... | | instance_fields.rb:11:1:14:3 | A_target | instance_fields.rb:1:1:29:4 | instance_fields.rb | | instance_fields.rb:12:5:13:7 | target | instance_fields.rb:11:1:14:3 | A_target | @@ -1699,12 +1800,14 @@ enclosingModule | instance_fields.rb:18:9:20:11 | create | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:19:13:19:18 | @field | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:19:13:19:18 | self | instance_fields.rb:17:5:24:7 | class << ... | +| instance_fields.rb:19:13:19:35 | ... | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:19:13:19:35 | ... = ... | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:19:22:19:31 | B_target | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:19:22:19:35 | call to new | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:21:9:23:11 | use | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:22:13:22:18 | @field | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:22:13:22:18 | self | instance_fields.rb:17:5:24:7 | class << ... | +| instance_fields.rb:22:13:22:25 | ... | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:22:13:22:25 | call to target | instance_fields.rb:17:5:24:7 | class << ... | | instance_fields.rb:26:1:29:3 | B_target | instance_fields.rb:1:1:29:4 | instance_fields.rb | | instance_fields.rb:27:5:28:7 | target | instance_fields.rb:26:1:29:3 | B_target | @@ -1784,6 +1887,7 @@ enclosingModule | modules.rb:90:3:90:8 | Object | modules.rb:88:1:93:3 | IncludeTest | | modules.rb:90:3:90:38 | call to module_eval | modules.rb:88:1:93:3 | IncludeTest | | modules.rb:90:22:90:38 | { ... } | modules.rb:88:1:93:3 | IncludeTest | +| modules.rb:90:24:90:36 | ... | modules.rb:88:1:93:3 | IncludeTest | | modules.rb:90:24:90:36 | call to prepend | modules.rb:88:1:93:3 | IncludeTest | | modules.rb:90:24:90:36 | self | modules.rb:88:1:93:3 | IncludeTest | | modules.rb:90:32:90:36 | Other | modules.rb:88:1:93:3 | IncludeTest | @@ -1908,6 +2012,7 @@ enclosingModule | private.rb:83:3:85:5 | call to private | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:83:3:85:5 | self | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:83:11:85:5 | m1 | private.rb:82:1:94:3 | PrivateOverride1 | +| private.rb:84:7:84:32 | ... | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:84:7:84:32 | call to puts | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:84:7:84:32 | self | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:84:12:84:32 | "PrivateOverride1#m1" | private.rb:82:1:94:3 | PrivateOverride1 | @@ -1915,11 +2020,13 @@ enclosingModule | private.rb:87:3:89:5 | call to private | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:87:3:89:5 | self | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:87:11:89:5 | m2 | private.rb:82:1:94:3 | PrivateOverride1 | +| private.rb:88:7:88:32 | ... | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:88:7:88:32 | call to puts | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:88:7:88:32 | self | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:88:12:88:32 | "PrivateOverride1#m2" | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:88:13:88:31 | PrivateOverride1#m2 | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:91:3:93:5 | call_m1 | private.rb:82:1:94:3 | PrivateOverride1 | +| private.rb:92:7:92:8 | ... | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:92:7:92:8 | call to m1 | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:92:7:92:8 | self | private.rb:82:1:94:3 | PrivateOverride1 | | private.rb:96:1:102:3 | PrivateOverride2 | private.rb:1:1:105:40 | private.rb | @@ -1929,6 +2036,7 @@ enclosingModule | private.rb:97:11:101:5 | m1 | private.rb:96:1:102:3 | PrivateOverride2 | | private.rb:98:7:98:32 | call to puts | private.rb:96:1:102:3 | PrivateOverride2 | | private.rb:98:7:98:32 | self | private.rb:96:1:102:3 | PrivateOverride2 | +| private.rb:98:7:100:45 | ... | private.rb:96:1:102:3 | PrivateOverride2 | | private.rb:98:12:98:32 | "PrivateOverride2#m1" | private.rb:96:1:102:3 | PrivateOverride2 | | private.rb:98:13:98:31 | PrivateOverride2#m1 | private.rb:96:1:102:3 | PrivateOverride2 | | private.rb:99:7:99:8 | call to m2 | private.rb:96:1:102:3 | PrivateOverride2 | @@ -1950,8 +2058,10 @@ enclosingModule | toplevel_self_singleton.rb:8:1:16:3 | self | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:8:14:16:3 | do ... end | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:9:5:11:7 | method_in_block | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | +| toplevel_self_singleton.rb:9:5:15:7 | ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:10:9:10:27 | call to ab_singleton_method | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:10:9:10:27 | self | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | +| toplevel_self_singleton.rb:10:9:10:60 | ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:12:5:12:7 | obj | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:12:5:12:12 | ... = ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:12:9:12:12 | self | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | @@ -1959,6 +2069,7 @@ enclosingModule | toplevel_self_singleton.rb:13:9:13:11 | obj | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:14:9:14:27 | call to ab_singleton_method | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:14:9:14:27 | self | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | +| toplevel_self_singleton.rb:14:9:14:60 | ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:18:1:18:8 | MyStruct | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:18:1:22:1 | ... = ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:18:12:18:17 | Struct | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | @@ -1968,10 +2079,12 @@ enclosingModule | toplevel_self_singleton.rb:18:29:18:32 | :bar | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:18:29:18:32 | bar | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:18:35:22:1 | { ... } | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | +| toplevel_self_singleton.rb:19:5:21:7 | ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:19:5:21:7 | method_in_struct | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:19:9:19:12 | self | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:20:9:20:27 | call to ab_singleton_method | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:20:9:20:27 | self | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | +| toplevel_self_singleton.rb:20:9:20:60 | ... | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:24:1:34:3 | Good | toplevel_self_singleton.rb:1:1:34:4 | toplevel_self_singleton.rb | | toplevel_self_singleton.rb:25:5:33:7 | class << ... | toplevel_self_singleton.rb:24:1:34:3 | Good | | toplevel_self_singleton.rb:25:14:25:17 | self | toplevel_self_singleton.rb:24:1:34:3 | Good | @@ -1979,6 +2092,7 @@ enclosingModule | toplevel_self_singleton.rb:29:9:32:11 | call_you | toplevel_self_singleton.rb:25:5:33:7 | class << ... | | toplevel_self_singleton.rb:30:13:30:19 | call to call_me | toplevel_self_singleton.rb:25:5:33:7 | class << ... | | toplevel_self_singleton.rb:30:13:30:19 | self | toplevel_self_singleton.rb:25:5:33:7 | class << ... | +| toplevel_self_singleton.rb:30:13:31:20 | ... | toplevel_self_singleton.rb:25:5:33:7 | class << ... | | toplevel_self_singleton.rb:31:13:31:20 | call to call_you | toplevel_self_singleton.rb:25:5:33:7 | class << ... | | toplevel_self_singleton.rb:31:13:31:20 | self | toplevel_self_singleton.rb:25:5:33:7 | class << ... | | unresolved_subclass.rb:1:1:2:3 | ResolvableBaseClass | unresolved_subclass.rb:1:1:22:4 | unresolved_subclass.rb | diff --git a/ruby/ql/test/library-tests/variables/parameter.expected b/ruby/ql/test/library-tests/variables/parameter.expected index 6e6c8426f865..c04df71117dc 100644 --- a/ruby/ql/test/library-tests/variables/parameter.expected +++ b/ruby/ql/test/library-tests/variables/parameter.expected @@ -28,6 +28,7 @@ parameterVariable | parameters.rb:59:22:59:26 | (..., ...) | parameters.rb:59:25:59:25 | c | | scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | | scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | +| scopes.rb:69:15:69:15 | x | scopes.rb:69:15:69:15 | x | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | diff --git a/ruby/ql/test/library-tests/variables/scopes.rb b/ruby/ql/test/library-tests/variables/scopes.rb index db55da3b77f2..c37146cd6810 100644 --- a/ruby/ql/test/library-tests/variables/scopes.rb +++ b/ruby/ql/test/library-tests/variables/scopes.rb @@ -47,3 +47,27 @@ module M #{var2} EOF end + +module ExceptionVariable + class MyException < Exception + end + + x = 1 + puts x + + begin + raise MyException + rescue MyException => x # reuses `x` from above + puts x + end + puts x # prints `MyException`, not `1` +end + +module ParameterShadowing + x = 1 + xs = [1, 2, 3] + xs.each do |x| + puts x + end + puts x # prints `1`, not `3` +end \ No newline at end of file diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index 8e69feef15b1..ab68d17ac2a5 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -86,12 +86,12 @@ definition | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | -| scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | +| scopes.rb:1:1:73:3 | self (scopes.rb) | scopes.rb:1:1:73:3 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | | scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | | scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | | scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | @@ -99,13 +99,18 @@ definition | scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | | scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | | scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | -| scopes.rb:26:1:26:12 | self (A) | scopes.rb:26:1:26:12 | self | | scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | -| scopes.rb:28:1:30:3 | self (B) | scopes.rb:28:1:30:3 | self | -| scopes.rb:34:1:36:3 | self (C) | scopes.rb:34:1:36:3 | self | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | +| scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:3 | x | +| scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | +| scopes.rb:66:1:73:3 | self (ParameterShadowing) | scopes.rb:66:1:73:3 | self | +| scopes.rb:67:3:67:3 | x | scopes.rb:67:3:67:3 | x | +| scopes.rb:68:3:68:4 | xs | scopes.rb:68:3:68:4 | xs | +| scopes.rb:69:11:71:5 | self | scopes.rb:66:1:73:3 | self | +| scopes.rb:69:15:69:15 | x | scopes.rb:69:15:69:15 | x | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | | ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | @@ -262,20 +267,20 @@ read | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | parameters.rb:60:11:60:11 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | parameters.rb:60:16:60:16 | b | | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | parameters.rb:60:21:60:21 | c | -| scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | scopes.rb:8:1:8:6 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:9:3:9 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:5:4:5:9 | self | +| scopes.rb:1:1:73:3 | self (scopes.rb) | scopes.rb:1:1:73:3 | self | scopes.rb:8:1:8:6 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:3:4:3:9 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:3:9:3:9 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:5:4:5:9 | self | | scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:12:4:12:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:14:4:14:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:17:4:17:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:10:4:10:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:12:4:12:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:14:4:14:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:15:4:15:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:16:4:16:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:17:4:17:9 | self | | scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | | scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | | scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | @@ -294,6 +299,18 @@ read | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:56:3:56:8 | self | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:59:5:59:21 | self | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:61:5:61:10 | self | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:63:3:63:8 | self | +| scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:3 | x | scopes.rb:56:8:56:8 | x | +| scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | scopes.rb:61:10:61:10 | x | +| scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | scopes.rb:63:8:63:8 | x | +| scopes.rb:66:1:73:3 | self (ParameterShadowing) | scopes.rb:66:1:73:3 | self | scopes.rb:72:3:72:8 | self | +| scopes.rb:67:3:67:3 | x | scopes.rb:67:3:67:3 | x | scopes.rb:72:8:72:8 | x | +| scopes.rb:68:3:68:4 | xs | scopes.rb:68:3:68:4 | xs | scopes.rb:69:3:69:4 | xs | +| scopes.rb:69:11:71:5 | self | scopes.rb:66:1:73:3 | self | scopes.rb:70:5:70:10 | self | +| scopes.rb:69:15:69:15 | x | scopes.rb:69:15:69:15 | x | scopes.rb:70:10:70:10 | x | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:7:5:7:10 | self | @@ -443,12 +460,12 @@ firstRead | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | parameters.rb:60:11:60:11 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | parameters.rb:60:16:60:16 | b | | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | parameters.rb:60:21:60:21 | c | -| scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | scopes.rb:8:1:8:6 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | +| scopes.rb:1:1:73:3 | self (scopes.rb) | scopes.rb:1:1:73:3 | self | scopes.rb:8:1:8:6 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:3:4:3:9 | self | | scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:10:4:10:9 | self | | scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | | scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | | scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | @@ -460,6 +477,14 @@ firstRead | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:56:3:56:8 | self | +| scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:3 | x | scopes.rb:56:8:56:8 | x | +| scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | scopes.rb:61:10:61:10 | x | +| scopes.rb:66:1:73:3 | self (ParameterShadowing) | scopes.rb:66:1:73:3 | self | scopes.rb:72:3:72:8 | self | +| scopes.rb:67:3:67:3 | x | scopes.rb:67:3:67:3 | x | scopes.rb:72:8:72:8 | x | +| scopes.rb:68:3:68:4 | xs | scopes.rb:68:3:68:4 | xs | scopes.rb:69:3:69:4 | xs | +| scopes.rb:69:11:71:5 | self | scopes.rb:66:1:73:3 | self | scopes.rb:70:5:70:10 | self | +| scopes.rb:69:15:69:15 | x | scopes.rb:69:15:69:15 | x | scopes.rb:70:10:70:10 | x | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | | ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | @@ -532,14 +557,14 @@ adjacentReads | parameters.rb:25:1:28:3 | self (opt_param) | parameters.rb:25:1:28:3 | self | parameters.rb:26:3:26:11 | self | parameters.rb:27:3:27:11 | self | | parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | parameters.rb:26:8:26:11 | name | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:55:4:55:9 | self | parameters.rb:56:4:56:9 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | scopes.rb:3:9:3:9 | self | -| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:9:3:9 | self | scopes.rb:5:4:5:9 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:3:4:3:9 | self | scopes.rb:3:9:3:9 | self | +| scopes.rb:2:9:6:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:3:9:3:9 | self | scopes.rb:5:4:5:9 | self | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | scopes.rb:11:4:11:4 | a | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | scopes.rb:12:4:12:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:12:4:12:9 | self | scopes.rb:14:4:14:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:14:4:14:9 | self | scopes.rb:15:4:15:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | scopes.rb:16:4:16:9 | self | -| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | scopes.rb:17:4:17:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:10:4:10:9 | self | scopes.rb:12:4:12:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:12:4:12:9 | self | scopes.rb:14:4:14:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:14:4:14:9 | self | scopes.rb:15:4:15:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:15:4:15:9 | self | scopes.rb:16:4:16:9 | self | +| scopes.rb:9:9:18:3 | self | scopes.rb:1:1:73:3 | self | scopes.rb:16:4:16:9 | self | scopes.rb:17:4:17:9 | self | | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:11:13:11 | __synth__2__1 | scopes.rb:13:14:13:14 | __synth__2__1 | | scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:4:13:4 | __synth__3 | scopes.rb:13:7:13:7 | __synth__3 | | scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:7:13:7 | __synth__3 | scopes.rb:13:10:13:15 | __synth__3 | @@ -547,6 +572,10 @@ adjacentReads | scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x | | scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | scopes.rb:34:14:34:14 | x | | scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:56:3:56:8 | self | scopes.rb:59:5:59:21 | self | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:59:5:59:21 | self | scopes.rb:61:5:61:10 | self | +| scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | scopes.rb:61:5:61:10 | self | scopes.rb:63:3:63:8 | self | +| scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | scopes.rb:61:10:61:10 | x | scopes.rb:63:8:63:8 | x | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | ssa.rb:4:3:4:12 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | ssa.rb:7:5:7:10 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | ssa.rb:11:5:11:10 | self | diff --git a/ruby/ql/test/library-tests/variables/varaccess.expected b/ruby/ql/test/library-tests/variables/varaccess.expected index e79f6ca30232..56113f13e35c 100644 --- a/ruby/ql/test/library-tests/variables/varaccess.expected +++ b/ruby/ql/test/library-tests/variables/varaccess.expected @@ -155,43 +155,43 @@ variableAccess | parameters.rb:60:16:60:16 | b | parameters.rb:59:23:59:23 | b | parameters.rb:59:1:61:3 | tuples_nested | | parameters.rb:60:21:60:21 | c | parameters.rb:59:25:59:25 | c | parameters.rb:59:1:61:3 | tuples_nested | | scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | do ... end | -| scopes.rb:3:4:3:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:3:9:3:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:3:4:3:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:3:9:3:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | do ... end | -| scopes.rb:5:4:5:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:5:4:5:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:5:9:5:9 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | do ... end | -| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:8:1:8:6 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:8:6:8:6 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:8:1:8:6 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:8:6:8:6 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | scopes.rb:9:9:18:3 | do ... end | -| scopes.rb:10:4:10:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:10:9:10:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:12:4:12:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:12:9:12:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:10:4:10:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:10:9:10:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:12:4:12:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:12:9:12:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:9:9:18:3 | do ... end | | scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:9:9:18:3 | do ... end | | scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:9:9:18:3 | do ... end | -| scopes.rb:14:4:14:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:14:9:14:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:15:4:15:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:14:4:14:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:14:9:14:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:15:4:15:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:15:9:15:9 | b | scopes.rb:13:7:13:7 | b | scopes.rb:9:9:18:3 | do ... end | -| scopes.rb:16:4:16:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:16:4:16:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:16:9:16:9 | c | scopes.rb:13:11:13:11 | c | scopes.rb:9:9:18:3 | do ... end | -| scopes.rb:17:4:17:9 | self | scopes.rb:1:1:49:4 | self | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:17:4:17:9 | self | scopes.rb:1:1:73:3 | self | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:17:9:17:9 | d | scopes.rb:13:14:13:14 | d | scopes.rb:9:9:18:3 | do ... end | -| scopes.rb:24:1:24:6 | script | scopes.rb:24:1:24:6 | script | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:28:8:28:8 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:24:1:24:6 | script | scopes.rb:24:1:24:6 | script | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:28:8:28:8 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:29:3:29:3 | x | scopes.rb:29:3:29:3 | x | scopes.rb:28:1:30:3 | B | -| scopes.rb:31:10:31:10 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:31:10:31:10 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:32:3:32:3 | x | scopes.rb:32:3:32:3 | x | scopes.rb:31:1:33:3 | class << ... | -| scopes.rb:34:7:34:7 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb | -| scopes.rb:34:14:34:14 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:34:7:34:7 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:73:3 | scopes.rb | +| scopes.rb:34:14:34:14 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:35:3:35:3 | x | scopes.rb:35:3:35:3 | x | scopes.rb:34:1:36:3 | C | -| scopes.rb:37:5:37:5 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:37:5:37:5 | x | scopes.rb:27:1:27:1 | x | scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:38:3:38:3 | x | scopes.rb:38:3:38:3 | x | scopes.rb:37:1:39:3 | foo | | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:41:1:49:3 | M | | scopes.rb:43:2:43:4 | foo | scopes.rb:43:2:43:4 | foo | scopes.rb:41:1:49:3 | M | @@ -199,6 +199,23 @@ variableAccess | scopes.rb:45:5:45:7 | self | scopes.rb:41:1:49:3 | self | scopes.rb:41:1:49:3 | M | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:41:1:49:3 | M | | scopes.rb:47:5:47:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:41:1:49:3 | M | +| scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:3 | x | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:56:3:56:8 | self | scopes.rb:51:1:64:3 | self | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:56:8:56:8 | x | scopes.rb:55:3:55:3 | x | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:59:5:59:21 | self | scopes.rb:51:1:64:3 | self | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:61:5:61:10 | self | scopes.rb:51:1:64:3 | self | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:61:10:61:10 | x | scopes.rb:55:3:55:3 | x | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:63:3:63:8 | self | scopes.rb:51:1:64:3 | self | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:63:8:63:8 | x | scopes.rb:55:3:55:3 | x | scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:67:3:67:3 | x | scopes.rb:67:3:67:3 | x | scopes.rb:66:1:73:3 | ParameterShadowing | +| scopes.rb:68:3:68:4 | xs | scopes.rb:68:3:68:4 | xs | scopes.rb:66:1:73:3 | ParameterShadowing | +| scopes.rb:69:3:69:4 | xs | scopes.rb:68:3:68:4 | xs | scopes.rb:66:1:73:3 | ParameterShadowing | +| scopes.rb:69:15:69:15 | x | scopes.rb:69:15:69:15 | x | scopes.rb:69:11:71:5 | do ... end | +| scopes.rb:70:5:70:10 | self | scopes.rb:66:1:73:3 | self | scopes.rb:66:1:73:3 | ParameterShadowing | +| scopes.rb:70:10:70:10 | x | scopes.rb:69:15:69:15 | x | scopes.rb:69:11:71:5 | do ... end | +| scopes.rb:72:3:72:8 | self | scopes.rb:66:1:73:3 | self | scopes.rb:66:1:73:3 | ParameterShadowing | +| scopes.rb:72:8:72:8 | x | scopes.rb:67:3:67:3 | x | scopes.rb:66:1:73:3 | ParameterShadowing | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:1:1:16:3 | m | | ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:1:1:16:3 | m | | ssa.rb:3:3:3:8 | self | ssa.rb:1:1:16:3 | self | ssa.rb:1:1:16:3 | m | @@ -350,6 +367,9 @@ explicitWrite | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:9 | ... = ... | | scopes.rb:43:2:43:4 | foo | scopes.rb:43:2:43:13 | ... = ... | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:13 | ... = ... | +| scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:7 | ... = ... | +| scopes.rb:67:3:67:3 | x | scopes.rb:67:3:67:7 | ... = ... | +| scopes.rb:68:3:68:4 | xs | scopes.rb:68:3:68:16 | ... = ... | | ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:7 | ... = ... | | ssa.rb:6:5:6:5 | i | ssa.rb:6:5:6:9 | ... = ... | | ssa.rb:10:5:10:5 | i | ssa.rb:10:5:10:9 | ... = ... | @@ -400,6 +420,8 @@ implicitWrite | parameters.rb:59:25:59:25 | c | | scopes.rb:2:14:2:14 | x | | scopes.rb:9:14:9:14 | x | +| scopes.rb:60:25:60:25 | x | +| scopes.rb:69:15:69:15 | x | | ssa.rb:1:7:1:7 | b | | ssa.rb:18:8:18:8 | x | | ssa.rb:25:8:25:15 | elements | @@ -550,6 +572,18 @@ readAccess | scopes.rb:44:5:44:7 | var | | scopes.rb:45:5:45:7 | self | | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:56:3:56:8 | self | +| scopes.rb:56:8:56:8 | x | +| scopes.rb:59:5:59:21 | self | +| scopes.rb:61:5:61:10 | self | +| scopes.rb:61:10:61:10 | x | +| scopes.rb:63:3:63:8 | self | +| scopes.rb:63:8:63:8 | x | +| scopes.rb:69:3:69:4 | xs | +| scopes.rb:70:5:70:10 | self | +| scopes.rb:70:10:70:10 | x | +| scopes.rb:72:3:72:8 | self | +| scopes.rb:72:8:72:8 | x | | ssa.rb:3:3:3:8 | self | | ssa.rb:3:8:3:8 | i | | ssa.rb:4:3:4:12 | self | @@ -647,6 +681,7 @@ captureAccess | scopes.rb:15:4:15:9 | self | | scopes.rb:16:4:16:9 | self | | scopes.rb:17:4:17:9 | self | +| scopes.rb:70:5:70:10 | self | | ssa.rb:26:7:26:10 | elem | | ssa.rb:27:5:27:13 | self | | ssa.rb:27:10:27:13 | elem | diff --git a/ruby/ql/test/library-tests/variables/variable.expected b/ruby/ql/test/library-tests/variables/variable.expected index 55288f740888..b0e23fb2045b 100644 --- a/ruby/ql/test/library-tests/variables/variable.expected +++ b/ruby/ql/test/library-tests/variables/variable.expected @@ -94,7 +94,7 @@ | parameters.rb:59:23:59:23 | b | | parameters.rb:59:25:59:25 | c | | scopes.rb:1:1:1:15 | self | -| scopes.rb:1:1:49:4 | self | +| scopes.rb:1:1:73:3 | self | | scopes.rb:2:14:2:14 | x | | scopes.rb:4:4:4:4 | a | | scopes.rb:7:1:7:1 | a | @@ -124,6 +124,13 @@ | scopes.rb:42:2:42:4 | var | | scopes.rb:43:2:43:4 | foo | | scopes.rb:46:5:46:8 | var2 | +| scopes.rb:51:1:64:3 | self | +| scopes.rb:52:3:53:5 | self | +| scopes.rb:55:3:55:3 | x | +| scopes.rb:66:1:73:3 | self | +| scopes.rb:67:3:67:3 | x | +| scopes.rb:68:3:68:4 | xs | +| scopes.rb:69:15:69:15 | x | | ssa.rb:1:1:16:3 | self | | ssa.rb:1:1:103:3 | self | | ssa.rb:1:7:1:7 | b | diff --git a/ruby/ql/test/library-tests/variables/varscopes.expected b/ruby/ql/test/library-tests/variables/varscopes.expected index 6b64ca6f97d8..958be320a5d6 100644 --- a/ruby/ql/test/library-tests/variables/varscopes.expected +++ b/ruby/ql/test/library-tests/variables/varscopes.expected @@ -47,7 +47,7 @@ | parameters.rb:54:9:57:3 | do ... end | | parameters.rb:59:1:61:3 | tuples_nested | | scopes.rb:1:1:1:15 | a | -| scopes.rb:1:1:49:4 | scopes.rb | +| scopes.rb:1:1:73:3 | scopes.rb | | scopes.rb:2:9:6:3 | do ... end | | scopes.rb:9:9:18:3 | do ... end | | scopes.rb:26:1:26:12 | A | @@ -56,6 +56,10 @@ | scopes.rb:34:1:36:3 | C | | scopes.rb:37:1:39:3 | foo | | scopes.rb:41:1:49:3 | M | +| scopes.rb:51:1:64:3 | ExceptionVariable | +| scopes.rb:52:3:53:5 | MyException | +| scopes.rb:66:1:73:3 | ParameterShadowing | +| scopes.rb:69:11:71:5 | do ... end | | ssa.rb:1:1:16:3 | m | | ssa.rb:1:1:103:3 | ssa.rb | | ssa.rb:18:1:23:3 | m1 | diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index b1de337f3aca..bcdab28dd62f 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -45,6 +45,7 @@ fn property_name(type_name: &str, field_name: &str) -> String { (_, "ty") => "type_repr", ("Function", "body") => "function_body", ("ClosureExpr", "body") => "closure_body", + ("Impl", "trait_") => "trait_ty", _ if field_name.contains("record") => &field_name.replacen("record", "struct", 1), _ => field_name, }; diff --git a/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/old.dbscheme b/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/old.dbscheme new file mode 100644 index 000000000000..77e9a70be4b0 --- /dev/null +++ b/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/old.dbscheme @@ -0,0 +1,3556 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- 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; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_trait_ties( + int id: @impl ref, + int trait_ty: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/rust.dbscheme b/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/rust.dbscheme new file mode 100644 index 000000000000..66a489863649 --- /dev/null +++ b/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/rust.dbscheme @@ -0,0 +1,3556 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- 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; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/upgrade.properties b/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/upgrade.properties new file mode 100644 index 000000000000..af2a93455706 --- /dev/null +++ b/rust/downgrades/77e9a70be4b0cf5ecb1d4c1d841b2d970715a912/upgrade.properties @@ -0,0 +1,5 @@ +description: Renamed `impl_trait_ties` to `impl_traits` +compatibility: full + +impl_traits.rel: reorder impl_trait_ties(@impl id, @type_repr trait_ty) id trait_ty +impl_trait_ties.rel: delete \ No newline at end of file diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 89659a4811dd..1cd4ba35b285 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs ea9c28694da3d0e90d09fc7d31824e35817c34720ea91e7c8bf8e7e74ffe4ee8 ea9c28694da3d0e90d09fc7d31824e35817c34720ea91e7c8bf8e7e74ffe4ee8 +top.rs 2e8e3b4e42b172708bb3a6ec3a92a6577c576887019603ca3d0f045bbdbfdbac 2e8e3b4e42b172708bb3a6ec3a92a6577c576887019603ca3d0f045bbdbfdbac diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 1c4fd0f00d61..b4a463bb4c75 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -9451,7 +9451,7 @@ pub struct Impl { pub is_default: bool, pub is_unsafe: bool, pub self_ty: Option>, - pub trait_: Option>, + pub trait_ty: Option>, pub visibility: Option>, pub where_clause: Option>, } @@ -9484,8 +9484,8 @@ impl trap::TrapEntry for Impl { if let Some(v) = self.self_ty { out.add_tuple("impl_self_ties", vec![id.into(), v.into()]); } - if let Some(v) = self.trait_ { - out.add_tuple("impl_traits", vec![id.into(), v.into()]); + if let Some(v) = self.trait_ty { + out.add_tuple("impl_trait_ties", vec![id.into(), v.into()]); } if let Some(v) = self.visibility { out.add_tuple("impl_visibilities", vec![id.into(), v.into()]); diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index e6cc06419fce..30ac31db7126 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -1229,7 +1229,7 @@ impl Translator<'_> { let is_default = node.default_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); let self_ty = node.self_ty().and_then(|x| self.emit_type(&x)); - let trait_ = node.trait_().and_then(|x| self.emit_type(&x)); + let trait_ty = node.trait_().and_then(|x| self.emit_type(&x)); let visibility = node.visibility().and_then(|x| self.emit_visibility(&x)); let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(&x)); let label = self.trap.emit(generated::Impl { @@ -1241,7 +1241,7 @@ impl Translator<'_> { is_default, is_unsafe, self_ty, - trait_, + trait_ty, visibility, where_clause, }); diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 003ede900234..daf63567c42b 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -69,7 +69,7 @@ lib/codeql/rust/elements/GenericParam.qll 87adf96aac385f2a182008a7b90aad46cf46d7 lib/codeql/rust/elements/GenericParamList.qll 25fcaa68bc7798d75974d12607fae0afc7f84d43091b2d0c66a504095ef05667 3b71115c6af0b8e7f84d8c2d5ac9f23595ad2b22dbd19a9ea71906ca99340878 lib/codeql/rust/elements/IdentPat.qll ad5f202316d4eeee3ca81ea445728f4ad7eb6bb7d81232bc958c22a93d064bf2 7ce2772e391e593d8fd23b2b44e26d0d7e780327ec973fcc9dce52a75fda0e36 lib/codeql/rust/elements/IfExpr.qll f62153e8098b3eb08b569d4e25c750bc686665651579db4bc9e11dcef8e75d63 55006a55d612f189e73caa02f7b4deda388c692f0a801cdda9f833f2afdca778 -lib/codeql/rust/elements/Impl.qll ce5225fd97b184db7235bcf2561cf23c679de2fc96fecaeb8cbcf7935dd48fbd 3fe755118c3d0b1eb626f359da362ad75dbdcd1e09f09825b10038fb41ddb35c +lib/codeql/rust/elements/Impl.qll 0d69c9ace5dac87ed095cfd5d4a8baf7e17ebce1132f3a7d6fa2bf4325deff8d d908fc5da7d3a59fb0a286a6ce581bdabdb48c4ac6ecd070455c271c2352208c lib/codeql/rust/elements/ImplTraitTypeRepr.qll 1d559b16c659f447a1bde94cc656718f20f133f767060437b755ac81eea9f852 de69c596701f0af4db28c5802d092a39c88a90bf42ea85aea25eecb79417e454 lib/codeql/rust/elements/IndexExpr.qll 0e2e9f018d06ae72be0fc4ddbc019a9aacd8a06f42b4c4431760bd149e7f2290 2bcfd557abd53a48e48de7915c4f2089107c62dfb3e732a904848248dfd3727b lib/codeql/rust/elements/InferTypeRepr.qll 1b8bdcb574a7b6e7dd49f4cfb96655a6ccc355744b424b8c2593fe8218090d53 c20a2a5b0346dc277721deb450e732a47812c8e872ffb60aaba351b1708e9477 @@ -332,7 +332,6 @@ lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef4 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a -lib/codeql/rust/elements/internal/ParamBaseImpl.qll fe11999c728c443c46c992e9bed7a2b3e23afa16ae99592e70054bc57ae371b8 df86fdb23266bdfb9ed8a8f02558a760b67f173943b9d075b081229eb5844f66 lib/codeql/rust/elements/internal/ParamConstructor.qll b98a2d8969f289fdcc8c0fb11cbd19a3b0c71be038c4a74f5988295a2bae52f0 77d81b31064167945b79b19d9697b57ca24462c3a7cc19e462c4693ce87db532 lib/codeql/rust/elements/internal/ParamListConstructor.qll 3123142ab3cab46fb53d7f3eff6ba2d3ff7a45b78839a53dc1979a9c6a54920e 165f3d777ea257cfcf142cc4ba9a0ebcd1902eb99842b8a6657c87087f3df6fe lib/codeql/rust/elements/internal/ParenExprConstructor.qll 104b67dc3fd53ab52e2a42ffde37f3a3a50647aa7bf35df9ba9528e9670da210 d1f5937756e87a477710c61698d141cdad0ccce8b07ecb51bab00330a1ca9835 @@ -374,7 +373,6 @@ lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll ba1a53a3ecc90a7f54c003fc lib/codeql/rust/elements/internal/SourceFileConstructor.qll 1dc559887ea7798774528b5505c8601c61030c17480f7ffca49b68b76fcc0321 75a635b88622e3110b16795bd12ca6fc4af176c92d6e441518d60aa47255edc1 lib/codeql/rust/elements/internal/SourceFileImpl.qll 829cc59d508c190fecfcfb0e27df232fd0a53cb98a6c6f110aecc7242db6f794 2834ab836557ae294410ccde023cca6ef6315aa4b78a7c238862437cec697583 lib/codeql/rust/elements/internal/StaticConstructor.qll 6dd7ee3fd16466c407de35b439074b56341fc97a9c36846b725c2eb43fd4a643 5bf5b0e78d0e9eb294a57b91075de6e4b86a9e6335f546c83ec11ab4c51e5679 -lib/codeql/rust/elements/internal/StaticImpl.qll 48071e29c72032b59ad82771d54be92ac0f4c1a68fb1129c5c7991385804d7b1 85c0be8e37a91d6e775b191f0cb52dd8bf70418e6e9947b82c58c40a6d73b406 lib/codeql/rust/elements/internal/StmtImpl.qll ea99d261f32592ff368cc3a1960864989897c92944f1675549e0753964cb562f 9117b4cdfad56f8fa3bc5d921c2146b4ff0658e8914ac51bf48eb3e68599dd6b lib/codeql/rust/elements/internal/StmtListConstructor.qll 435d59019e17a6279110a23d3d5dfbc1d1e16fc358a93a1d688484d22a754866 23fcb60a5cbb66174e459bc10bd7c28ed532fd1ab46f10b9f0c8a6291d3e343f lib/codeql/rust/elements/internal/StructConstructor.qll 52921ea6e70421fd08884dc061d0c2dfbbb8dd83d98f1f3c70572cfe57b2a173 dcb3ea8e45ee875525c645fe5d08e6db9013b86bd351c77df4590d0c1439ab9f @@ -512,7 +510,7 @@ lib/codeql/rust/elements/internal/generated/GenericParam.qll 85ac027a42b3300febc lib/codeql/rust/elements/internal/generated/GenericParamList.qll b18fa5fd435d94857c9863bbcc40571af0b1efba1b31ba9159c95568f5c58fce 6e70f1e9a1823d28d60e0e753ac8fbbe8deb10c94365f893b0c8f8ea4061b460 lib/codeql/rust/elements/internal/generated/IdentPat.qll 1fe5061759848fdc9588b27606efb1187ce9c13d12ad0a2a19666d250dd62db3 87dbc8b88c31079076a896b48e0c483a600d7d11c1c4bf266581bdfc9c93ae98 lib/codeql/rust/elements/internal/generated/IfExpr.qll 413dd7a20c6b98c0d2ad2e5b50981c14bf96c1a719ace3e341d78926219a5af7 c9a2d44e3baa6a265a29a683ca3c1683352457987c92f599c5771b4f3b4bafff -lib/codeql/rust/elements/internal/generated/Impl.qll 5afadb7f80c5ffbd5cd3816c6788ccb605fe4cb2d8c8507ec3f212913eac0ab5 761b72a5f35e2e766de6aa87d83b065f49b64f05b91ae47d0afbb20bb61c1003 +lib/codeql/rust/elements/internal/generated/Impl.qll bdc3da08b23ab098e92927a57c2e99eeb78ea8561cf11accc51db3033492b500 4b45be6b0c51f03999619705104574d78c262ed2497921f2ca8696844b17addc lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll e376a2e34ba51df403d42b02afe25140543e3e53aaf04b9ea118eb575acb4644 dc3a7e3eac758423c90a9803cc40dfdf53818bd62ee894982cd636f6b1596dfc lib/codeql/rust/elements/internal/generated/IndexExpr.qll cf951fc40f6690e966b4dc78fa9a6221aa5c6cade44759dcb52254f799292d11 1572e71918cc4e0b7e028331b6d98c9db23100a3646cd3874d1915e06ab6211d lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 4f101c1cb1278e919f9195cac4aa0c768e304c1881394b500874e7627e62d6c4 dca3f85d0a78ecc8bf030b4324f0d219ffff60784a2ecf565a4257e888dea0ff @@ -558,7 +556,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll b0e3c13b2ca75faaf0d92b2ca3d70cac7b78b3729aaccf635063cc5836c163af a340e8f34a6d7425f38845e789b4aeb83aec90c11429a68ad6632a5aa132fa57 +lib/codeql/rust/elements/internal/generated/ParentChild.qll dc5e9e16e0d43cf25ebdce03b84aa3bf0f52fe0c61de4db4a9887c961290b37e b26f0f2c27b664d0fe53aba35955df31a58adad0963a951039b6c6bbd34f83ea lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd @@ -573,7 +571,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 6e32bd7167d3eece2d22f893a92410129b1bd18e59533b1cf82f72f31465b43a bb25c56118df0e2755be2350cf307c19e6c4d85b2a39388c08f2cc1bad303692 +lib/codeql/rust/elements/internal/generated/Raw.qll 6e38ac8ae1fbd7af0dd516f1c37e52e6ef1169103ad7dd998796ff8cd2dbac7a f4a7515e1757404b101ea3c8bb154d11d1babb138cb2afddf1618eab377d9625 lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -693,7 +691,7 @@ test/extractor-tests/generated/GenericArgList/GenericArgList.ql 9bd6873e56a381a6 test/extractor-tests/generated/GenericParamList/GenericParamList.ql 206f270690f5c142777d43cf87b65d6dda5ec9f3953c17ee943fe3d0e7b7761c 38a6e0bbca916778f85b106609df6d5929baed006d55811ec0d71c75fe137e92 test/extractor-tests/generated/IdentPat/IdentPat.ql 23006eddf0ca1188e11ba5ee25ad62a83157b83e0b99119bf924c7f74fd8e70d 6e572f48f607f0ced309113304019ccc0a828f6ddd71e818369504dcf832a0b5 test/extractor-tests/generated/IfExpr/IfExpr.ql 540b21838ad3e1ed879b66c1903eb8517d280f99babcbf3c5307c278db42f003 a6f84a7588ce7587936f24375518a365c571210844b99cb614596e14dd5e4dfd -test/extractor-tests/generated/Impl/Impl.ql a36ea392729a6be3ee0cc0d8871b3682cf8f0c15fb657d4d35f2ca76eeef3a74 1fa345ca3b4c16c740b5684c7fdaf1116d52c2932287703b33143a08e4d7d38e +test/extractor-tests/generated/Impl/Impl.ql c96ec30d703aa607b7aad9f6eaca1b0069799cdefcc1481f4aa4f7378f477f7f 3528e1502b6f7b323d964630ecfb8255f683486b75300457e2a2d95aa36771f3 test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.ql 311c6c1e18bd74fbcd367f940d2cf91777eaba6b3d6307149beb529216d086fb 16c7c81618d7f49da30b4f026dcacfb23ed130dbfcfa19b5cb44dc6e15101401 test/extractor-tests/generated/IndexExpr/IndexExpr.ql ecfca80175a78b633bf41684a0f8f5eebe0b8a23f8de9ff27142936687711263 27d4832911f7272376a199550d57d8488e75e0eeeeb7abbfb3b135350a30d277 test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql 6ba01a9e229e7dfdb2878a0bdbeb6c0888c4a068984b820e7a48d4b84995daa2 7120cafd267e956dbb4af5e19d57237275d334ffe5ff0fb635d65d309381aa46 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index d8004cb5b35e..e88e5d2d9609 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -334,7 +334,6 @@ /lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OrPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ParamBaseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParenExprConstructor.qll linguist-generated @@ -376,7 +375,6 @@ /lib/codeql/rust/elements/internal/SourceFileConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/SourceFileImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StaticConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/StaticImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StmtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StmtListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructConstructor.qll linguist-generated diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index d85d27d88d67..3651026d737f 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.2.15 + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `rust/cleartext-logging`) may find more correct results and fewer false positive results after these changes. + ## 0.2.14 No user-facing changes. diff --git a/rust/ql/lib/change-notes/released/0.2.15.md b/rust/ql/lib/change-notes/released/0.2.15.md new file mode 100644 index 000000000000..3644126ec1f4 --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.2.15.md @@ -0,0 +1,5 @@ +## 0.2.15 + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `rust/cleartext-logging`) may find more correct results and fewer false positive results after these changes. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index c53820a76d54..0f574e080e4c 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.14 +lastReleaseVersion: 0.2.15 diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index 16e14ce84a2e..f8a182685b64 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -99,6 +99,8 @@ class FormatTemplateVariableAccessTree extends LeafTree, FormatTemplateVariableA class ItemTree extends LeafTree, Item { ItemTree() { not this instanceof MacroCall and + not this instanceof Const and + not this instanceof Static and this = any(StmtList s).getAStatement() } } diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll b/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll index 94c5300b062c..303920ce7d0e 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll @@ -45,3 +45,14 @@ final class CallableScope extends CfgScopeImpl, Callable { /** Holds if `scope` is exited when `last` finishes with completion `c`. */ override predicate scopeLast(AstNode last, Completion c) { last(this.getBody(), last, c) } } + +/** + * A special scope used to represent the context in which `const`s and + * `static`s are initialized. We do not actually compute a CFG for such + * scopes. + */ +final class SourceFileScope extends CfgScopeImpl, SourceFile { + override predicate scopeFirst(AstNode first) { none() } + + override predicate scopeLast(AstNode last, Completion c) { none() } +} diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 4ad3af0f42a0..a7e2e2e4c6bc 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -653,8 +653,22 @@ module RustDataFlowGen implements InputSig */ predicate jumpStep(Node node1, Node node2) { FlowSummaryImpl::Private::Steps::summaryJumpStep(node1.(FlowSummaryNode).getSummaryNode(), - node2.(FlowSummaryNode).getSummaryNode()) or + node2.(FlowSummaryNode).getSummaryNode()) + or FlowSummaryImpl::Private::Steps::sourceJumpStep(node1.(FlowSummaryNode).getSummaryNode(), node2) + or + exists(Const c | + node1.asExpr() = c.getBody() and + node2.asExpr() = c.getAnAccess() + ) + or + exists(StaticNode sn, Static s | s = sn.getStatic() | + node1 = sn and + node2.asExpr() = s.getAnAccess().(StaticReadAccess) + or + node1.asExpr() = [s.getBody(), s.getAnAccess().(StaticWriteAccess)] and + node2 = sn + ) } pragma[nomagic] diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll index 1ccb7db73f52..9ef2c3a08faf 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll @@ -704,6 +704,17 @@ final class CastNode extends ExprNode { CastNode() { none() } } +/** + * A node in the data flow graph that corresponds to a `static`. + */ +class StaticNode extends AstNodeNode, TStaticNode { + override Static n; + + StaticNode() { this = TStaticNode(n) } + + Static getStatic() { result = n } +} + cached newtype TNode = TExprNode(Expr e) { e.hasEnclosingCfgScope() and Stages::DataFlowStage::ref() } or @@ -755,4 +766,5 @@ newtype TNode = ) } or TClosureSelfReferenceNode(CfgScope c) { lambdaCreationExpr(c) } or - TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn) + TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn) or + TStaticNode(Static s) diff --git a/rust/ql/lib/codeql/rust/elements/Impl.qll b/rust/ql/lib/codeql/rust/elements/Impl.qll index a1567f315820..3324e05dc516 100644 --- a/rust/ql/lib/codeql/rust/elements/Impl.qll +++ b/rust/ql/lib/codeql/rust/elements/Impl.qll @@ -13,7 +13,7 @@ import codeql.rust.elements.Visibility import codeql.rust.elements.WhereClause /** - * An `impl`` block. + * An `impl` block. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/StaticAccess.qll b/rust/ql/lib/codeql/rust/elements/StaticAccess.qll new file mode 100644 index 000000000000..f0171a23771a --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/StaticAccess.qll @@ -0,0 +1,11 @@ +/** + * This module provides the public class `StaticAccess`. + */ + +private import internal.StaticImpl + +final class StaticAccess = Impl::StaticAccess; + +final class StaticWriteAccess = Impl::StaticWriteAccess; + +final class StaticReadAccess = Impl::StaticReadAccess; diff --git a/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll index 554942f0fddc..0c9d736cc57c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll @@ -48,15 +48,29 @@ module Impl { ) } + pragma[nomagic] + private predicate isConstOrStatic(File f) { + f = this.getFile() and + ( + this instanceof Const + or + this instanceof Static + ) + } + /** Gets the CFG scope that encloses this node, if any. */ cached CfgScope getEnclosingCfgScope() { exists(AstNode p | p = this.getParentNode() | - result = p + result = p and + not result instanceof SourceFile or not p instanceof CfgScope and + not this.isConstOrStatic(_) and result = p.getEnclosingCfgScope() ) + or + this.isConstOrStatic(result.(SourceFile).getFile()) } /** Holds if this node is inside a CFG scope. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll index 44114674a566..e90ae6217798 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll @@ -24,7 +24,12 @@ module Impl { * const X: i32 = 42; * ``` */ - class Const extends Generated::Const { } + class Const extends Generated::Const { + /** Gets an access to this constant item. */ + ConstAccess getAnAccess() { this = result.getConst() } + + override string toStringImpl() { result = "const " + this.getName().getText() } + } /** * A constant access. diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll index 3ff04276c638..4c039a6f957f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll @@ -4,7 +4,11 @@ * INTERNAL: Do not use. */ +private import rust private import codeql.rust.elements.internal.generated.Impl +private import codeql.rust.internal.PathResolution as PathResolution +private import codeql.rust.internal.typeinference.Type +private import codeql.rust.internal.typeinference.TypeMention /** * INTERNAL: This module contains the customizable definition of `Impl` and should not @@ -13,7 +17,7 @@ private import codeql.rust.elements.internal.generated.Impl module Impl { // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * An `impl`` block. + * An `impl` block. * * For example: * ```rust @@ -26,9 +30,9 @@ module Impl { override string toStringImpl() { exists(string trait | ( - trait = this.getTrait().toAbbreviatedString() + " for " + trait = this.getTraitTy().toAbbreviatedString() + " for " or - not this.hasTrait() and trait = "" + not this.hasTraitTy() and trait = "" ) and result = "impl " + trait + this.getSelfTy().toAbbreviatedString() + " { ... }" ) @@ -38,6 +42,40 @@ module Impl { * Holds if this is an inherent `impl` block, that is, one that does not implement a trait. */ pragma[nomagic] - predicate isInherent() { not this.hasTrait() } + predicate isInherent() { not this.hasTraitTy() } + + /** + * Gets the type being implemented. + * + * For example, in + * + * ```rust + * impl MyType { ... } + * + * impl MyTrait for MyType { ... } + * ``` + * + * the type being implemented is in both cases `MyType`. + */ + TypeItem getSelf() { + result = this.getSelfTy().(TypeMention).getType().(DataType).getTypeItem() + } + + /** + * Gets the trait being implemented, if any. + * + * For example, in + * + * ```rust + * impl MyType { ... } + * + * impl MyTrait for MyType { ... } + * ``` + * + * the trait being implemented is in the second case `MyTrait`. + */ + Trait getTrait() { + result = PathResolution::resolvePath(this.getTraitTy().(PathTypeRepr).getPath()) + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParamBaseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParamBaseImpl.qll index 3b0f82eb6c3d..ed7f0dd5d5ef 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParamBaseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParamBaseImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ParamBase`. * @@ -6,14 +5,19 @@ */ private import codeql.rust.elements.internal.generated.ParamBase +private import codeql.rust.elements.Callable /** * INTERNAL: This module contains the customizable definition of `ParamBase` and should not * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A normal parameter, `Param`, or a self parameter `SelfParam`. */ - class ParamBase extends Generated::ParamBase { } + class ParamBase extends Generated::ParamBase { + /** Gets the callable this parameter belongs to. */ + Callable getCallable() { this = result.getParamList().getAParamBase() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll index 53042411bca4..8002947bae8e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Static`. * @@ -6,12 +5,17 @@ */ private import codeql.rust.elements.internal.generated.Static +private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl +private import codeql.rust.elements.internal.PathExprImpl::Impl as PathExprImpl +private import codeql.rust.elements.internal.VariableImpl::Impl as VariableImpl +private import codeql.rust.internal.PathResolution /** * INTERNAL: This module contains the customizable definition of `Static` and should not * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A static item declaration. * @@ -20,5 +24,43 @@ module Impl { * static X: i32 = 42; * ``` */ - class Static extends Generated::Static { } + class Static extends Generated::Static { + /** Gets an access to this static item. */ + StaticAccess getAnAccess() { this = result.getStatic() } + + override string toStringImpl() { result = "static " + this.getName().getText() } + } + + /** + * A static access. + * + * For example: + * ```rust + * static X: i32 = 42; + * + * fn main() { + * println!("{}", X); + * } + * ``` + */ + class StaticAccess extends AstNodeImpl::AstNode, PathExprImpl::PathExpr { + private Static s; + + StaticAccess() { s = resolvePath(this.getPath()) } + + /** Gets the static being accessed. */ + Static getStatic() { result = s } + + override string getAPrimaryQlClass() { result = "StaticAccess" } + } + + /** A static write access. */ + class StaticWriteAccess extends StaticAccess { + StaticWriteAccess() { VariableImpl::assignmentOperationDescendant(_, this) } + } + + /** A static read access. */ + class StaticReadAccess extends StaticAccess { + StaticReadAccess() { not this instanceof StaticWriteAccess } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll index 37a2e4dacc07..80f2259623bb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll @@ -1,71 +1,13 @@ private import rust +private import codeql.namebinding.LocalNameBinding private import codeql.rust.controlflow.ControlFlowGraph private import codeql.rust.internal.PathResolution as PathResolution private import codeql.rust.elements.internal.generated.ParentChild as ParentChild private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl private import codeql.rust.elements.internal.PathImpl::Impl as PathImpl private import codeql.rust.elements.internal.FormatTemplateVariableAccessImpl::Impl as FormatTemplateVariableAccessImpl -private import codeql.util.DenseRank module Impl { - /** - * A variable scope. Either a block `{ ... }`, the guard/rhs - * of a match arm, or the body of a closure. - */ - abstract class VariableScope extends AstNode { } - - class BlockExprScope extends VariableScope, BlockExpr { } - - class MatchArmExprScope extends VariableScope { - MatchArmExprScope() { this = any(MatchArm arm).getExpr() } - } - - class MatchArmGuardScope extends VariableScope { - MatchArmGuardScope() { this = any(MatchArm arm).getGuard() } - } - - class ClosureBodyScope extends VariableScope { - ClosureBodyScope() { this = any(ClosureExpr ce).getBody() } - } - - /** - * A scope for conditions, which may introduce variables using `let` expressions. - * - * Such variables are only available in the body guarded by the condition. - */ - class ConditionScope extends VariableScope { - private AstNode parent; - private AstNode body; - - ConditionScope() { - parent = - any(IfExpr ie | - this = ie.getCondition() and - body = ie.getThen() - ) - or - parent = - any(WhileExpr we | - this = we.getCondition() and - body = we.getLoopBody() - ) - or - parent = - any(MatchArm ma | - this = ma.getGuard() and - body = ma.getExpr() - ) - } - - /** Gets the parent of this condition. */ - AstNode getParent() { result = parent } - - /** - * Gets the body in which variables introduced in this scope are available. - */ - AstNode getBody() { result = body } - } - private Pat getAPatAncestor(Pat p) { (p instanceof IdentPat or p instanceof OrPat) and exists(Pat p0 | result = p0.getParentPat() | @@ -100,7 +42,7 @@ module Impl { */ cached predicate variableDecl(AstNode definingNode, Name name, string text) { - Cached::ref() and + CachedStage::ref() and exists(SelfParam sp | name = sp.getName() and definingNode = name and @@ -127,553 +69,274 @@ module Impl { ) } - /** A variable. */ - class Variable extends MkVariable { - private AstNode definingNode; - private string text; + /** + * `let` chains like + * + * ```rust + * if let x1 = ... && let x2 = ... && ... && let xn = ... { ... } + * ``` + * + * are parsed left-associatively, so the AST for the condition looks like + * + * ```rust + * ((let x1 = ... && let x2 = ...) && ...) && let xn = ... + * ``` + * + * This, however, does not work with scoping and shadowing, so we instead treat + * `let` chains as if there is just a single root `&&` node with `n` children, + * skipping all intermediate `&&` nodes. + */ + private module LetChains { + predicate isLetChainAncestor(LogicalAndExpr lae) { + lae.getAnOperand() instanceof LetExpr + or + isLetChainAncestor(lae.getLhs()) + } - Variable() { this = MkVariable(definingNode, text) } + private predicate isLetChainRoot(LogicalAndExpr root) { + isLetChainAncestor(root) and + not root = any(LogicalAndExpr lae).getLhs() + } - /** Gets the name of this variable as a string. */ - string getText() { result = text } + private predicate leftMostChildOfLetChainRoot(LogicalAndExpr left, LogicalAndExpr root) { + isLetChainRoot(root) and + left = root.getLhs*() and + not left.getLhs() instanceof LogicalAndExpr + } - /** Gets the location of this variable. */ - Location getLocation() { result = definingNode.getLocation() } + private AstNode getLetChainChild(LogicalAndExpr sub, LogicalAndExpr root, int i) { + leftMostChildOfLetChainRoot(sub, root) and + i = 1 and + result = sub.getRhs() + or + exists(LogicalAndExpr mid | + exists(getLetChainChild(mid, root, i - 1)) and + sub.getLhs() = mid and + result = sub.getRhs() + ) + } - /** Gets a textual representation of this variable. */ - string toString() { result = this.getText() } + AstNode getLetChainChild(LogicalAndExpr lae, int i) { + exists(LogicalAndExpr left | + leftMostChildOfLetChainRoot(left, lae) and + i = 0 and + result = left.getLhs() + ) + or + result = getLetChainChild(_, lae, i) + } + } - /** Gets an access to this variable. */ - VariableAccess getAnAccess() { result.getVariable() = this } + private import LetChains - /** - * Get the name of this variable. - * - * Normally, the name is unique, except when introduced in an or pattern. - */ - Name getName() { variableDecl(definingNode, result, text) } + private module Input implements LocalNameBindingInputSig { + private import rust as Rust - /** Gets the block that encloses this variable, if any. */ - BlockExpr getEnclosingBlock() { result = definingNode.getEnclosingBlock() } + predicate cacheRevRef() { + (variableDecl(_, _, _) implies any()) + or + (exists(VariableReadAccess a) implies any()) + or + (exists(VariableWriteAccess a) implies any()) + or + (exists(any(Variable v).getParameter()) implies any()) + } - /** Gets the `self` parameter that declares this variable, if any. */ - SelfParam getSelfParam() { result.getName() = this.getName() } + class AstNode = Rust::AstNode; - /** - * Gets the pattern that declares this variable, if any. - * - * Normally, the pattern is unique, except when introduced in an or pattern: - * - * ```rust - * match either { - * Either::Left(x) | Either::Right(x) => println!(x), - * } - * ``` - */ - IdentPat getPat() { result.getName() = this.getName() } - - /** Gets the enclosing CFG scope for this variable declaration. */ - CfgScope getEnclosingCfgScope() { result = definingNode.getEnclosingCfgScope() } + AstNode getChild(AstNode parent, int index) { + result = ParentChild::getImmediateChild(parent, index) and + not isLetChainAncestor(parent) + or + result = getLetChainChild(parent, index) + or + exists(Format f | + f = result.(FormatTemplateVariableAccess).getArgument().getParent() and + parent = f.getParent() and + index = f.getIndex() + ) + } - /** Gets the `let` statement that introduces this variable, if any. */ - LetStmt getLetStmt() { this.getPat() = result.getPat() } + abstract class Conditional extends AstNode { + abstract AstNode getCondition(); - /** Gets the `let` expression that introduces this variable, if any. */ - LetExpr getLetExpr() { this.getPat() = result.getPat() } + abstract AstNode getThen(); - /** Gets the initial value of this variable, if any. */ - Expr getInitializer() { - result = this.getLetStmt().getInitializer() or - result = this.getLetExpr().getScrutinee() + abstract AstNode getElse(); } - /** Holds if this variable is captured. */ - predicate isCaptured() { this.getAnAccess().isCapture() } + private class IfExprConditional extends Conditional instanceof IfExpr { + override AstNode getCondition() { result = IfExpr.super.getCondition() } - /** Gets the parameter that introduces this variable, if any. */ - cached - ParamBase getParameter() { - Cached::ref() and - result = this.getSelfParam() - or - result.(Param).getPat() = getAVariablePatAncestor(this) + override AstNode getThen() { result = IfExpr.super.getThen() } + + override AstNode getElse() { result = IfExpr.super.getElse() } } - /** Hold is this variable is mutable. */ - predicate isMutable() { this.getPat().isMut() or this.getSelfParam().isMut() } + private class WhileExprConditional extends Conditional instanceof WhileExpr { + override AstNode getCondition() { result = WhileExpr.super.getCondition() } - /** Hold is this variable is immutable. */ - predicate isImmutable() { not this.isMutable() } - } - - /** - * A path expression that may access a local variable. These are paths that - * only consist of a simple name (i.e., without generic arguments, - * qualifiers, etc.). - */ - private class VariableAccessCand extends PathExprBase { - string name_; + override AstNode getThen() { result = WhileExpr.super.getLoopBody() } - VariableAccessCand() { - name_ = this.(PathExpr).getPath().(PathImpl::IdentPath).getName() - or - this.(FormatTemplateVariableAccess).getName() = name_ + override AstNode getElse() { none() } } - string toString() { result = name_ } + private class MatchGuardConditional extends Conditional instanceof MatchGuard { + override AstNode getCondition() { result = MatchGuard.super.getCondition() } - string getName() { result = name_ } - } + override AstNode getThen() { + exists(MatchArm arm | this = arm.getGuard() and result = arm.getExpr()) + } - pragma[nomagic] - private Element getImmediateChildAdj(Element e, int preOrd, int index) { - result = ParentChild::getImmediateChild(e, index) and - preOrd = 0 and - not exists(ConditionScope cs | - e = cs.getParent() and - result = cs.getBody() - ) - or - result = e.(ConditionScope).getBody() and - preOrd = 1 and - index = 0 - } + override AstNode getElse() { none() } + } - /** - * An adjusted version of `ParentChild::getImmediateChild`, which makes the following - * two adjustments: - * - * 1. For conditions like `if cond body`, instead of letting `body` be the second child - * of `if`, we make it the last child of `cond`. This ensures that variables - * introduced in the `cond` scope are available in `body`. - * - * 2. A similar adjustment is made for `while` loops: the body of the loop is made a - * child of the loop condition instead of the loop itself. - */ - pragma[nomagic] - private Element getImmediateChildAdj(Element e, int index) { - result = - rank[index + 1](Element res, int preOrd, int i | - res = getImmediateChildAdj(e, preOrd, i) - | - res order by preOrd, i - ) - } + abstract class SiblingShadowingDecl extends AstNode { + abstract AstNode getLhs(); - private Element getImmediateParentAdj(Element e) { e = getImmediateChildAdj(result, _) } - - private AstNode getAnAncestorInVariableScope(AstNode n) { - ( - n instanceof Pat or - n instanceof VariableAccessCand or - n instanceof LetStmt or - n = any(LetExpr le).getScrutinee() or - n instanceof VariableScope - ) and - exists(AstNode n0 | - result = getImmediateParentAdj(n0) or - result = n0.(FormatTemplateVariableAccess).getArgument().getParent().getParent() - | - n0 = n - or - n0 = getAnAncestorInVariableScope(n) and - not n0 instanceof VariableScope - ) - } + abstract AstNode getRhs(); - /** Gets the immediately enclosing variable scope of `n`. */ - private VariableScope getEnclosingScope(AstNode n) { result = getAnAncestorInVariableScope(n) } + abstract AstNode getElse(); + } - /** - * Get all the pattern ancestors of this variable up to an including the - * root of the pattern. - */ - private Pat getAVariablePatAncestor(Variable v) { - result = v.getPat() - or - exists(Pat mid | - mid = getAVariablePatAncestor(v) and - result = mid.getParentPat() - ) - } + private class LetStmtSiblingShadowingDecl extends SiblingShadowingDecl instanceof LetStmt { + override AstNode getLhs() { result = LetStmt.super.getPat() } - /** - * Holds if a parameter declares the variable `v` inside variable scope `scope`. - */ - private predicate parameterDeclInScope(Variable v, VariableScope scope) { - exists(Callable f | - v.getParameter() = f.getParamList().getAParamBase() and - scope = f.getBody() - ) - } + override AstNode getRhs() { result = LetStmt.super.getInitializer() } - /** A subset of `Element`s for which we want to compute pre-order numbers. */ - private class RelevantElement extends Element { - RelevantElement() { - this instanceof VariableScope or - this instanceof VariableAccessCand or - this instanceof LetStmt or - this = any(LetExpr le).getScrutinee() or - getImmediateChildAdj(this, _) instanceof RelevantElement + override AstNode getElse() { result = LetStmt.super.getLetElse() } } - pragma[nomagic] - private RelevantElement getChild(int index) { result = getImmediateChildAdj(this, index) } + private class LetExprSiblingShadowingDecl extends SiblingShadowingDecl instanceof LetExpr { + override AstNode getLhs() { result = LetExpr.super.getPat() } - pragma[nomagic] - private RelevantElement getImmediateChildAdjMin(int index) { - // A child may have multiple positions for different accessors, - // so always use the first - result = this.getChild(index) and - index = min(int i | result = this.getChild(i) | i) - } + override AstNode getRhs() { result = LetExpr.super.getScrutinee() } - pragma[nomagic] - RelevantElement getImmediateChildAdj(int index) { - result = - rank[index + 1](Element res, int i | res = this.getImmediateChildAdjMin(i) | res order by i) + override AstNode getElse() { none() } } - pragma[nomagic] - RelevantElement getImmediateLastChild() { - exists(int last | - result = this.getImmediateChildAdj(last) and - not exists(this.getImmediateChildAdj(last + 1)) - ) - } - } - - /** - * Gets the pre-order numbering of `n`, where the immediately enclosing - * variable scope of `n` is `scope`. - */ - pragma[nomagic] - private int getPreOrderNumbering(VariableScope scope, RelevantElement n) { - n = scope and - result = 0 - or - exists(RelevantElement parent | - not parent instanceof VariableScope - or - parent = scope - | - // first child of a previously numbered node - result = getPreOrderNumbering(scope, parent) + 1 and - n = parent.getImmediateChildAdj(0) - or - // non-first child of a previously numbered node - exists(RelevantElement child, int i | - result = getLastPreOrderNumbering(scope, child) + 1 and - child = parent.getImmediateChildAdj(i) and - n = parent.getImmediateChildAdj(i + 1) - ) - ) - } - - /** - * Gets the pre-order numbering of the _last_ node nested under `n`, where the - * immediately enclosing variable scope of `n` (and the last node) is `scope`. - */ - pragma[nomagic] - private int getLastPreOrderNumbering(VariableScope scope, RelevantElement n) { - exists(RelevantElement leaf | - result = getPreOrderNumbering(scope, leaf) and - leaf != scope and - ( - not exists(leaf.getImmediateChildAdj(_)) + predicate declInScope(AstNode definingNode, string name, AstNode scope) { + // local variable + exists(Name n | variableDecl(definingNode, n, name) | + scope = any(SelfParam self | n = self.getName()).getCallable() or - leaf instanceof VariableScope - ) - | - n = leaf - or - n.getImmediateLastChild() = leaf and - not n instanceof VariableScope - ) - or - exists(RelevantElement mid | - mid = n.getImmediateLastChild() and - result = getLastPreOrderNumbering(scope, mid) and - not mid instanceof VariableScope and - not n instanceof VariableScope - ) - } - - /** - * Holds if `v` is named `name` and is declared inside variable scope - * `scope`. The pre-order numbering of the binding site of `v`, amongst - * all nodes nested under `scope`, is `ord`. - */ - private predicate variableDeclInScope(Variable v, VariableScope scope, string name, int ord) { - name = v.getText() and - ( - parameterDeclInScope(v, scope) and - ord = getPreOrderNumbering(scope, scope) - or - exists(Pat pat | pat = getAVariablePatAncestor(v) | - exists(MatchArm arm | - pat = arm.getPat() and - ord = getPreOrderNumbering(scope, scope) + exists(Pat pat, Pat pat0 | + pat = getAPatAncestor*(pat0) and + (pat0 = definingNode or pat0.(IdentPat).getName() = n) | - scope = arm.getGuard() + scope = any(MatchArm arm | pat = arm.getPat()) or - not arm.hasGuard() and scope = arm.getExpr() - ) - or - exists(LetStmt let | - let.getPat() = pat and - scope = getEnclosingScope(let) and - // for `let` statements, variables are bound _after_ the statement, i.e. - // not in the RHS - ord = getLastPreOrderNumbering(scope, let) + 1 - ) - or - exists(LetExpr let, Expr scrutinee | - let.getPat() = pat and - scrutinee = let.getScrutinee() and - scope = getEnclosingScope(scrutinee) and - // for `let` expressions, variables are bound _after_ the expression, i.e. - // not in the RHS - ord = getLastPreOrderNumbering(scope, scrutinee) + 1 - ) - or - exists(ForExpr fe | - fe.getPat() = pat and - scope = fe.getLoopBody() and - ord = getPreOrderNumbering(scope, scope) + scope = any(Input::SiblingShadowingDecl let | pat = let.getLhs()) + or + scope = any(ForExpr fe | pat = fe.getPat()).getLoopBody() + or + scope = any(Param p | pat = p.getPat()).getCallable() ) ) - ) - } - - /** - * Holds if `cand` may access a variable named `name` at pre-order number `ord` - * in the variable scope `scope`. - * - * `nestLevel` is the number of nested scopes that need to be traversed - * to reach `scope` from `cand`. - */ - private predicate variableAccessCandInScope( - VariableAccessCand cand, VariableScope scope, string name, int nestLevel, int ord - ) { - name = cand.getName() and - ( - scope = cand or - not cand instanceof VariableScope and - scope = getEnclosingScope(cand) - ) and - ord = getPreOrderNumbering(scope, cand) and - nestLevel = 0 - or - exists(VariableScope inner | - variableAccessCandInScope(cand, inner, name, nestLevel - 1, _) and - scope = getEnclosingScope(inner) and - // Use the pre-order number of the inner scope as the number of the access. This allows - // us to collapse multiple accesses in inner scopes to a single entity - ord = getPreOrderNumbering(scope, inner) - ) - } - - private newtype TDefOrAccessCand = - TDefOrAccessCandNestedFunction(Function f, BlockExprScope scope) { - f = scope.getStmtList().getAStatement() - } or - TDefOrAccessCandVariable(Variable v) or - TDefOrAccessCandVariableAccessCand(VariableAccessCand va) - - /** - * A nested function declaration, variable declaration, or variable (or function) - * access candidate. - * - * In order to determine whether a candidate is an actual variable/function access, - * we rank declarations and candidates by their position in the AST. - * - * The ranking must take names into account, but also variable scopes; below a comment - * `rank(scope, name, i)` means that the declaration/access on the given line has rank - * `i` amongst all declarations/accesses inside variable scope `scope`, for name `name`: - * - * ```rust - * fn f() { // scope0 - * let x = 0; // rank(scope0, "x", 0) - * use(x); // rank(scope0, "x", 1) - * let x = // rank(scope0, "x", 3) - * x + 1; // rank(scope0, "x", 2) - * let y = // rank(scope0, "y", 0) - * x; // rank(scope0, "x", 4) - * - * { // scope1 - * use(x); // rank(scope1, "x", 0), rank(scope0, "x", 4) - * use(y); // rank(scope1, "y", 0), rank(scope0, "y", 1) - * let x = 2; // rank(scope1, "x", 1) - * use(x); // rank(scope1, "x", 2), rank(scope0, "x", 4) - * } - * } - * ``` - * - * Function/variable declarations are only ranked in the scope that they bind into, - * while accesses candidates propagate outwards through scopes, as they may access - * declarations from outer scopes. - * - * For an access candidate with ranks `{ rank(scope_i, name, rnk_i) | i in I }` and - * declarations `d in D` with ranks `rnk(scope_d, name, rnk_d)`, the target is - * calculated as - * ``` - * max_{i in I} ( - * max_{d in D | scope_d = scope_i and rnk_d < rnk_i} ( - * d - * ) - * ) - * ``` - * - * i.e., its the nearest declaration before the access in the same (or outer) scope - * as the access. - */ - abstract private class DefOrAccessCand extends TDefOrAccessCand { - abstract string toString(); - - abstract Location getLocation(); - - pragma[nomagic] - abstract predicate rankBy(string name, VariableScope scope, int ord, int kind); - } - - abstract private class NestedFunctionOrVariable extends DefOrAccessCand { } - - private class DefOrAccessCandNestedFunction extends NestedFunctionOrVariable, - TDefOrAccessCandNestedFunction - { - private Function f; - private BlockExprScope scope_; - - DefOrAccessCandNestedFunction() { this = TDefOrAccessCandNestedFunction(f, scope_) } - - override string toString() { result = f.toString() } - - override Location getLocation() { result = f.getLocation() } + // local function; behave as if they are defined at the beginning of the scope + definingNode = scope.(BlockExpr).getStmtList().getAStatement() and + name = definingNode.(Function).getName().getText() + } - override predicate rankBy(string name, VariableScope scope, int ord, int kind) { - // nested functions behave as if they are defined at the beginning of the scope - name = f.getName().getText() and - scope = scope_ and - ord = 0 and - kind = 0 + predicate accessCand(AstNode n, string name) { + name = n.(PathExpr).getPath().(PathImpl::IdentPath).getName() + or + name = n.(FormatTemplateVariableAccess).getName() } } - private class DefOrAccessCandVariable extends NestedFunctionOrVariable, TDefOrAccessCandVariable { - private Variable v; - - DefOrAccessCandVariable() { this = TDefOrAccessCandVariable(v) } - - override string toString() { result = v.toString() } + private import LocalNameBinding - override Location getLocation() { result = v.getLocation() } + /** A variable. */ + class Variable extends Local { + Variable() { variableDecl(this.getDefiningNode(), _, _) } - override predicate rankBy(string name, VariableScope scope, int ord, int kind) { - variableDeclInScope(v, scope, name, ord) and - kind = 1 - } - } + /** Gets an access to this variable. */ + VariableAccess getAnAccess() { result.getVariable() = this } - private class DefOrAccessCandVariableAccessCand extends DefOrAccessCand, - TDefOrAccessCandVariableAccessCand - { - private VariableAccessCand va; + /** Gets the name of this variable. */ + string getText() { result = super.getName() } - DefOrAccessCandVariableAccessCand() { this = TDefOrAccessCandVariableAccessCand(va) } + /** + * Get the name of this variable. + * + * Normally, the name is unique, except when introduced in an or pattern. + */ + Name getName() { variableDecl(this.getDefiningNode(), result, super.getName()) } - override string toString() { result = va.toString() } + /** Gets the block that encloses this variable, if any. */ + BlockExpr getEnclosingBlock() { result = this.getDefiningNode().getEnclosingBlock() } - override Location getLocation() { result = va.getLocation() } + /** Gets the `self` parameter that declares this variable, if any. */ + SelfParam getSelfParam() { result.getName() = this.getName() } - override predicate rankBy(string name, VariableScope scope, int ord, int kind) { - variableAccessCandInScope(va, scope, name, _, ord) and - kind = 2 - } - } + /** + * Gets the pattern that declares this variable, if any. + * + * Normally, the pattern is unique, except when introduced in an or pattern: + * + * ```rust + * match either { + * Either::Left(x) | Either::Right(x) => println!(x), + * } + * ``` + */ + IdentPat getPat() { result.getName() = this.getName() } - private module DenseRankInput implements DenseRankInputSig2 { - class C1 = VariableScope; + /** Gets the enclosing CFG scope for this variable declaration. */ + CfgScope getEnclosingCfgScope() { result = this.getDefiningNode().getEnclosingCfgScope() } - class C2 = string; + /** + * Gets the `let` statement that introduces this variable, if any. + * + * This is restricted to simple `let` statements of the form `let x = ...;`. + */ + LetStmt getLetStmt() { this.getPat() = result.getPat() } - class Ranked = DefOrAccessCand; + /** + * Gets the `let` expression that introduces this variable, if any. + * + * This is restricted to simple `let` expressions of the form `let x = ...`. + */ + LetExpr getLetExpr() { this.getPat() = result.getPat() } - int getRank(VariableScope scope, string name, DefOrAccessCand v) { - v = - rank[result](DefOrAccessCand v0, int ord, int kind | - v0.rankBy(name, scope, ord, kind) - | - v0 order by ord, kind - ) + /** Gets the initial value of this variable, if any. */ + Expr getInitializer() { + result = this.getLetStmt().getInitializer() or + result = this.getLetExpr().getScrutinee() } - } - /** - * Gets the rank of `v` amongst all other declarations or access candidates - * to a variable named `name` in the variable scope `scope`. - */ - private int rankVariableOrAccess(VariableScope scope, string name, DefOrAccessCand v) { - v = DenseRank2::denseRank(scope, name, result + 1) - } + /** Holds if this variable is captured. */ + predicate isCaptured() { this.getAnAccess().isCapture() } - /** - * Holds if `v` can reach rank `rnk` in the variable scope `scope`. This is needed to - * take shadowing into account, for example in - * - * ```rust - * let x = 0; // rank 0 - * use(x); // rank 1 - * let x = ""; // rank 2 - * use(x); // rank 3 - * ``` - * - * the declaration at rank 0 can only reach the access at rank 1, while the declaration - * at rank 2 can only reach the access at rank 3. - */ - private predicate variableReachesRank( - VariableScope scope, string name, NestedFunctionOrVariable v, int rnk - ) { - rnk = rankVariableOrAccess(scope, name, v) - or - variableReachesRank(scope, name, v, rnk - 1) and - rnk = rankVariableOrAccess(scope, name, TDefOrAccessCandVariableAccessCand(_)) - } + /** Gets the parameter that introduces this variable, if any. */ + cached + ParamBase getParameter() { + CachedStage::ref() and + result = this.getSelfParam() + or + result.(Param).getPat() = getAPatAncestor*(this.getPat()) + } - private predicate variableReachesCand( - VariableScope scope, string name, NestedFunctionOrVariable v, VariableAccessCand cand, - int nestLevel - ) { - exists(int rnk | - variableReachesRank(scope, name, v, rnk) and - rnk = rankVariableOrAccess(scope, name, TDefOrAccessCandVariableAccessCand(cand)) and - variableAccessCandInScope(cand, scope, name, nestLevel, _) - ) - } + /** Holds if this variable is mutable. */ + predicate isMutable() { this.getPat().isMut() or this.getSelfParam().isMut() } - pragma[nomagic] - predicate access(string name, NestedFunctionOrVariable v, VariableAccessCand cand) { - v = - min(NestedFunctionOrVariable v0, int nestLevel | - variableReachesCand(_, name, v0, cand, nestLevel) - | - v0 order by nestLevel - ) + /** Holds if this variable is immutable. */ + predicate isImmutable() { not this.isMutable() } } /** A variable access. */ - class VariableAccess extends PathExprBase { - private string name; - private Variable v; - - VariableAccess() { variableAccess(name, v, this) } + class VariableAccess extends LocalAccess { + VariableAccess() { this.getLocal() instanceof Variable } /** Gets the variable being accessed. */ - Variable getVariable() { result = v } + Variable getVariable() { result = super.getLocal() } /** Holds if this access is a capture. */ - predicate isCapture() { this.getEnclosingCfgScope() != v.getEnclosingCfgScope() } + predicate isCapture() { + this.getEnclosingCfgScope() != this.getVariable().getEnclosingCfgScope() + } } /** Holds if `e` occurs in the LHS of an assignment operation. */ @@ -682,7 +345,7 @@ module Impl { or exists(Expr mid | assignmentOperationDescendant(ao, mid) and - getImmediateParentAdj(e) = mid and + mid = e.getParentNode() and not mid instanceof DerefExpr and not mid instanceof FieldExpr and not mid instanceof IndexExpr @@ -695,7 +358,7 @@ module Impl { cached VariableWriteAccess() { - Cached::ref() and + CachedStage::ref() and assignmentOperationDescendant(ae, this) } @@ -707,7 +370,7 @@ module Impl { class VariableReadAccess extends VariableAccess { cached VariableReadAccess() { - Cached::ref() and + CachedStage::ref() and not this instanceof VariableWriteAccess and not this = any(RefExpr re).getExpr() and not this = any(CompoundAssignmentExpr cae).getLhs() @@ -715,47 +378,12 @@ module Impl { } /** A nested function access. */ - class NestedFunctionAccess extends PathExprBase { + class NestedFunctionAccess extends LocalAccess { private Function f; - NestedFunctionAccess() { nestedFunctionAccess(_, f, this) } + NestedFunctionAccess() { f = super.getLocal().getDefiningNode() } /** Gets the function being accessed. */ Function getFunction() { result = f } } - - cached - private module Cached { - cached - predicate ref() { 1 = 1 } - - cached - predicate backref() { - 1 = 1 - or - variableDecl(_, _, _) - or - exists(VariableReadAccess a) - or - exists(VariableWriteAccess a) - or - exists(any(Variable v).getParameter()) - } - - cached - newtype TVariable = - MkVariable(AstNode definingNode, string name) { variableDecl(definingNode, _, name) } - - cached - predicate variableAccess(string name, Variable v, VariableAccessCand cand) { - access(name, TDefOrAccessCandVariable(v), cand) - } - - cached - predicate nestedFunctionAccess(string name, Function f, VariableAccessCand cand) { - access(name, TDefOrAccessCandNestedFunction(f, _), cand) - } - } - - private import Cached } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll index ad307cb177f5..915e8940fb0e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll @@ -20,7 +20,7 @@ import codeql.rust.elements.WhereClause */ module Generated { /** - * An `impl`` block. + * An `impl` block. * * For example: * ```rust @@ -109,16 +109,16 @@ module Generated { final predicate hasSelfTy() { exists(this.getSelfTy()) } /** - * Gets the trait of this impl, if it exists. + * Gets the trait ty of this impl, if it exists. */ - TypeRepr getTrait() { - result = Synth::convertTypeReprFromRaw(Synth::convertImplToRaw(this).(Raw::Impl).getTrait()) + TypeRepr getTraitTy() { + result = Synth::convertTypeReprFromRaw(Synth::convertImplToRaw(this).(Raw::Impl).getTraitTy()) } /** - * Holds if `getTrait()` exists. + * Holds if `getTraitTy()` exists. */ - final predicate hasTrait() { exists(this.getTrait()) } + final predicate hasTraitTy() { exists(this.getTraitTy()) } /** * Gets the visibility of this impl, if it exists. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index c593451b9937..344898886c1b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -2328,7 +2328,7 @@ private module Impl { private Element getImmediateChildOfImpl(Impl e, int index, string partialPredicateCall) { exists( int n, int nAttributeMacroExpansion, int nAssocItemList, int nAttr, int nGenericParamList, - int nSelfTy, int nTrait, int nVisibility, int nWhereClause + int nSelfTy, int nTraitTy, int nVisibility, int nWhereClause | n = 0 and nAttributeMacroExpansion = n + 1 and @@ -2336,8 +2336,8 @@ private module Impl { nAttr = nAssocItemList + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and nSelfTy = nGenericParamList + 1 and - nTrait = nSelfTy + 1 and - nVisibility = nTrait + 1 and + nTraitTy = nSelfTy + 1 and + nVisibility = nTraitTy + 1 and nWhereClause = nVisibility + 1 and ( none() @@ -2359,9 +2359,9 @@ private module Impl { or index = nGenericParamList and result = e.getSelfTy() and partialPredicateCall = "SelfTy()" or - index = nSelfTy and result = e.getTrait() and partialPredicateCall = "Trait()" + index = nSelfTy and result = e.getTraitTy() and partialPredicateCall = "TraitTy()" or - index = nTrait and result = e.getVisibility() and partialPredicateCall = "Visibility()" + index = nTraitTy and result = e.getVisibility() and partialPredicateCall = "Visibility()" or index = nVisibility and result = e.getWhereClause() and diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index 01f54e7ab608..c2baf289b2e9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -6209,7 +6209,7 @@ module Raw { /** * INTERNAL: Do not use. - * An `impl`` block. + * An `impl` block. * * For example: * ```rust @@ -6262,9 +6262,9 @@ module Raw { TypeRepr getSelfTy() { impl_self_ties(this, result) } /** - * Gets the trait of this impl, if it exists. + * Gets the trait ty of this impl, if it exists. */ - TypeRepr getTrait() { impl_traits(this, result) } + TypeRepr getTraitTy() { impl_trait_ties(this, result) } /** * Gets the visibility of this impl, if it exists. @@ -6280,7 +6280,7 @@ module Raw { private Element getImmediateChildOfImpl(Impl e, int index) { exists( int n, int nAttributeMacroExpansion, int nAssocItemList, int nAttr, int nGenericParamList, - int nSelfTy, int nTrait, int nVisibility, int nWhereClause + int nSelfTy, int nTraitTy, int nVisibility, int nWhereClause | n = 0 and nAttributeMacroExpansion = n + 1 and @@ -6288,8 +6288,8 @@ module Raw { nAttr = nAssocItemList + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and nSelfTy = nGenericParamList + 1 and - nTrait = nSelfTy + 1 and - nVisibility = nTrait + 1 and + nTraitTy = nSelfTy + 1 and + nVisibility = nTraitTy + 1 and nWhereClause = nVisibility + 1 and ( none() @@ -6304,9 +6304,9 @@ module Raw { or index = nGenericParamList and result = e.getSelfTy() or - index = nSelfTy and result = e.getTrait() + index = nSelfTy and result = e.getTraitTy() or - index = nTrait and result = e.getVisibility() + index = nTraitTy and result = e.getVisibility() or index = nVisibility and result = e.getWhereClause() ) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 10d18786880b..1d2c70848247 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -659,6 +659,38 @@ private class ConstItemNode extends AssocItemNode instanceof Const { override TypeParam getTypeParam(int i) { none() } } +private class StaticItemNode extends ItemNode instanceof Static { + override string getName() { result = Static.super.getName().getText() } + + override Namespace getNamespace() { result.isValue() } + + override Visibility getVisibility() { result = Static.super.getVisibility() } + + override Attr getAnAttr() { result = Static.super.getAnAttr() } + + override TypeParam getTypeParam(int i) { none() } + + override predicate hasCanonicalPath(Crate c) { this.hasCanonicalPathPrefix(c) } + + bindingset[c] + private string getCanonicalPathPart(Crate c, int i) { + i = 0 and + result = this.getCanonicalPathPrefix(c) + or + i = 1 and + result = "::" + or + i = 2 and + result = this.getName() + } + + language[monotonicAggregates] + override string getCanonicalPath(Crate c) { + this.hasCanonicalPath(c) and + result = strictconcat(int i | i in [0 .. 2] | this.getCanonicalPathPart(c, i) order by i) + } +} + private class TypeItemTypeItemNode extends NamedItemNode, TypeItemNode instanceof TypeItem { override string getName() { result = TypeItem.super.getName().getText() } @@ -806,7 +838,7 @@ private TypeItemNode resolveBuiltin(TypeRepr tr) { final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { Path getSelfPath() { result = super.getSelfTy().(PathTypeRepr).getPath() } - Path getTraitPath() { result = super.getTrait().(PathTypeRepr).getPath() } + Path getTraitPath() { result = super.getTraitTy().(PathTypeRepr).getPath() } TypeItemNode resolveSelfTyBuiltin() { result = resolveBuiltin(this.(Impl).getSelfTy()) } diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll b/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll index 86bcdbe4fe8f..7c56300f3581 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll @@ -42,7 +42,7 @@ private predicate hasFirstNonTrivialTraitBound(TypeParamItemNode tp, Path traitB */ pragma[nomagic] predicate isBlanketLike(ImplItemNode i, TypePath blanketSelfPath, TypeParam blanketTypeParam) { - i.(Impl).hasTrait() and + i.(Impl).hasTraitTy() and ( blanketTypeParam = i.getBlanketImplementationTypeParam() and blanketSelfPath.isEmpty() diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll index 423ad21ae4ac..b5ed2be06f97 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll @@ -174,7 +174,7 @@ private module Input2Common { exists(Impl impl | abs = impl and condition = impl.getSelfTy() and - constraint = impl.getTrait() + constraint = impl.getTraitTy() ) or transitive = true and @@ -222,8 +222,6 @@ private module Input2Common { } private module PreInput2 implements InputSig2 { - PreTypeMention getABaseTypeMention(Type t) { none() } - PreTypeMention getATypeParameterConstraint(TypeParameter tp) { result = Input2Common::getATypeParameterConstraint(tp) } @@ -248,8 +246,6 @@ private module PreInput2 implements InputSig2 { module PreM2 = Make2; private module Input2 implements InputSig2 { - TypeMention getABaseTypeMention(Type t) { none() } - TypeMention getATypeParameterConstraint(TypeParameter tp) { result = Input2Common::getATypeParameterConstraint(tp) } @@ -1546,7 +1542,7 @@ private module AssocFunctionResolution { boolean hasReceiver | afc.hasSyntacticInfo(name, arity, typeQualifier, traitQualifier, hasReceiver) and - if not afc.hasATrait() and i.(Impl).hasTrait() + if not afc.hasATrait() and i.(Impl).hasTraitTy() then callVisibleImplTraitCandidate(afc, i) else any() | @@ -2536,7 +2532,7 @@ private module AssocFunctionResolution { AssocFunctionCallCand afcc, TypeAbstraction abs, AssocFunctionType constraint ) { potentialInstantiationOf0(afcc, abs, constraint) and - if abs.(Impl).hasTrait() + if abs.(Impl).hasTraitTy() then // inherent functions take precedence over trait functions, so only allow // trait functions when there are no matching inherent functions @@ -2588,7 +2584,7 @@ private module AssocFunctionResolution { exists(AssocFunctionCall afc, FunctionPosition selfPos | afcc = MkAssocFunctionCallCand(afc, selfPos, _, _) and blanketLikeCandidate(afc, _, selfPos, abs, constraint, _, _) and - if abs.(Impl).hasTrait() + if abs.(Impl).hasTraitTy() then // inherent functions take precedence over trait functions, so only allow // trait functions when there are no matching inherent functions diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 03f5418863c8..931c069ad24f 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.14 +version: 0.2.16-dev groups: rust extractor: rust dbscheme: rust.dbscheme @@ -16,6 +16,7 @@ dependencies: codeql/tutorial: ${workspace} codeql/typeinference: ${workspace} codeql/util: ${workspace} + codeql/namebinding: ${workspace} dataExtensions: - /**/*.model.yml warnOnImplicitThis: true diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 66a489863649..77e9a70be4b0 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -2907,9 +2907,9 @@ impl_self_ties( ); #keyset[id] -impl_traits( +impl_trait_ties( int id: @impl ref, - int trait: @type_repr ref + int trait_ty: @type_repr ref ); #keyset[id] diff --git a/rust/ql/lib/rust.qll b/rust/ql/lib/rust.qll index 410f062d91ea..46e6e605d418 100644 --- a/rust/ql/lib/rust.qll +++ b/rust/ql/lib/rust.qll @@ -11,6 +11,7 @@ import codeql.rust.elements.AssignmentOperation import codeql.rust.elements.BitwiseOperation import codeql.rust.elements.ComparisonOperation import codeql.rust.elements.ConstAccess +import codeql.rust.elements.StaticAccess import codeql.rust.elements.DerefExpr import codeql.rust.elements.LiteralExprExt import codeql.rust.elements.LogicalOperation diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme new file mode 100644 index 000000000000..66a489863649 --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme @@ -0,0 +1,3556 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- 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; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme new file mode 100644 index 000000000000..77e9a70be4b0 --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme @@ -0,0 +1,3556 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- 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; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_trait_ties( + int id: @impl ref, + int trait_ty: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties new file mode 100644 index 000000000000..518d6277cf5f --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties @@ -0,0 +1,5 @@ +description: Renamed `impl_traits` to `impl_trait_ties` +compatibility: full + +impl_trait_ties.rel: reorder impl_traits(@impl id, @type_repr trait) id trait +impl_traits.rel: delete \ No newline at end of file diff --git a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll index f4544cafacc1..a6ab8cd48cab 100644 --- a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll +++ b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll @@ -14,7 +14,7 @@ private module ResolveTest implements TestSig { i.getLocation().hasLocationInfo(filepath, _, _, line, _) } - private predicate commmentAt(string text, string filepath, int line) { + private predicate commentAt(string text, string filepath, int line) { exists(Comment c | c.getLocation().hasLocationInfo(filepath, line, _, _, _) and c.getCommentText().trim() = text and @@ -28,9 +28,9 @@ private module ResolveTest implements TestSig { if i instanceof SourceFile then value = i.getFile().getBaseName() else ( - commmentAt(value, filepath, line) + commentAt(value, filepath, line) or - not commmentAt(_, filepath, line) and + not commentAt(_, filepath, line) and value = i.getName() ) ) diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index ad1e8ef3bfe4..4f4807ff82e4 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.36 + +No user-facing changes. + ## 0.1.35 No user-facing changes. diff --git a/rust/ql/src/change-notes/released/0.1.36.md b/rust/ql/src/change-notes/released/0.1.36.md new file mode 100644 index 000000000000..8685189c564f --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.36.md @@ -0,0 +1,3 @@ +## 0.1.36 + +No user-facing changes. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index 6a5806eec2bf..270bd27a7aae 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.35 +lastReleaseVersion: 0.1.36 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 1de0db6c3454..9ba6302ecc0d 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.35 +version: 0.1.37-dev groups: - rust - queries diff --git a/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 8ec2f3354dbb..498195bdb8be 100644 --- a/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -26,7 +26,7 @@ private newtype TCallable = or // If a method implements a public trait it is exposed through the trait. // We overapproximate this by including all trait method implementations. - exists(R::Impl impl | impl.hasTrait() and impl.getAssocItemList().getAssocItem(_) = api) + exists(R::Impl impl | impl.hasTraitTy() and impl.getAssocItemList().getAssocItem(_) = api) ) } diff --git a/rust/ql/test/TestUtils.qll b/rust/ql/test/TestUtils.qll index a68d9554d34b..a55c24544b83 100644 --- a/rust/ql/test/TestUtils.qll +++ b/rust/ql/test/TestUtils.qll @@ -20,3 +20,12 @@ class CrateElement extends Element { class Builtin extends AstNode { Builtin() { this.getFile().getAbsolutePath().matches("%/builtins/%.rs") } } + +predicate commentAt(string text, string filepath, int line) { + exists(Comment c | + c.getLocation().hasLocationInfo(filepath, line, _, _, _) and + c.getCommentText().trim() = text and + c.fromSource() and + not text.matches("$%") + ) +} diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.ql b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.ql index e8b075ba4823..90c01ff3a65f 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.ql +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.ql @@ -11,7 +11,7 @@ query predicate canonicalPath(Addressable a, string path) { a = any(ImplItemNode i | i.resolveSelfTy() instanceof Str and - not i.(Impl).hasTrait() + not i.(Impl).hasTraitTy() ).getAnAssocItem() and a.(Function).getName().getText() = "trim" ) and diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index 73e2a1b767d3..0d23450af31f 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -52,7 +52,7 @@ GenericArgList/gen_generic_arg_list.rs cfb072d3b48f9dd568c23d4dfefba28766628678f GenericParamList/gen_generic_param_list.rs 3a1981a7c4731329ad6da0d887f09be04f31342d94f44711ac0ac455930f773a 3a1981a7c4731329ad6da0d887f09be04f31342d94f44711ac0ac455930f773a IdentPat/gen_ident_pat.rs 87f9201ca47683ff6f12a0c844c062fdedb6d86546794522d358b117ba0fe477 87f9201ca47683ff6f12a0c844c062fdedb6d86546794522d358b117ba0fe477 IfExpr/gen_if_expr.rs 2df66735394ebb20db29d3fbf2721ad4812afbe8d4614d03f26265c1f481f1e8 2df66735394ebb20db29d3fbf2721ad4812afbe8d4614d03f26265c1f481f1e8 -Impl/gen_impl.rs cfab33eb5e98b425b1d88be5f09f742be6c4f8d402e1becd4421aabb0431aadd cfab33eb5e98b425b1d88be5f09f742be6c4f8d402e1becd4421aabb0431aadd +Impl/gen_impl.rs a3f91dbcbb89f660e1c67eb6211def495cced5ab069515c6151e442365f64899 a3f91dbcbb89f660e1c67eb6211def495cced5ab069515c6151e442365f64899 ImplTraitTypeRepr/gen_impl_trait_type_repr.rs ebfa4d350ae5759bf7df6adf790d2d892c7a0d708f3340ccf3e12a681cb78f00 ebfa4d350ae5759bf7df6adf790d2d892c7a0d708f3340ccf3e12a681cb78f00 IndexExpr/gen_index_expr.rs 22d7f81ba43dc63f1f49e21a2c25ce25a1b8f6e8e95e1a66f518f010a4d73c61 22d7f81ba43dc63f1f49e21a2c25ce25a1b8f6e8e95e1a66f518f010a4d73c61 InferTypeRepr/gen_infer_type_repr.rs cd50eaeffdf16e0e896b14b665590251a4d383c123502ed667d8b1f75000f559 cd50eaeffdf16e0e896b14b665590251a4d383c123502ed667d8b1f75000f559 diff --git a/rust/ql/test/extractor-tests/generated/Const/Const.expected b/rust/ql/test/extractor-tests/generated/Const/Const.expected index cc1f282193fc..0ab5fbb85db4 100644 --- a/rust/ql/test/extractor-tests/generated/Const/Const.expected +++ b/rust/ql/test/extractor-tests/generated/Const/Const.expected @@ -1,13 +1,13 @@ instances -| gen_const.rs:4:5:7:22 | Const | isConst: | yes | isDefault: | no | hasImplementation: | yes | +| gen_const.rs:4:5:7:22 | const X | isConst: | yes | isDefault: | no | hasImplementation: | yes | getAttributeMacroExpansion getAttr getBody -| gen_const.rs:4:5:7:22 | Const | gen_const.rs:7:20:7:21 | 42 | +| gen_const.rs:4:5:7:22 | const X | gen_const.rs:7:20:7:21 | 42 | getGenericParamList getName -| gen_const.rs:4:5:7:22 | Const | gen_const.rs:7:11:7:11 | X | +| gen_const.rs:4:5:7:22 | const X | gen_const.rs:7:11:7:11 | X | getTypeRepr -| gen_const.rs:4:5:7:22 | Const | gen_const.rs:7:14:7:16 | i32 | +| gen_const.rs:4:5:7:22 | const X | gen_const.rs:7:14:7:16 | i32 | getVisibility getWhereClause diff --git a/rust/ql/test/extractor-tests/generated/ExternItemList/ExternItemList.expected b/rust/ql/test/extractor-tests/generated/ExternItemList/ExternItemList.expected index 8b6eb94b1b2c..579420663aff 100644 --- a/rust/ql/test/extractor-tests/generated/ExternItemList/ExternItemList.expected +++ b/rust/ql/test/extractor-tests/generated/ExternItemList/ExternItemList.expected @@ -3,4 +3,4 @@ instances getAttr getExternItem | gen_extern_item_list.rs:7:16:10:5 | ExternItemList | 0 | gen_extern_item_list.rs:8:9:8:17 | fn foo | -| gen_extern_item_list.rs:7:16:10:5 | ExternItemList | 1 | gen_extern_item_list.rs:9:9:9:24 | Static | +| gen_extern_item_list.rs:7:16:10:5 | ExternItemList | 1 | gen_extern_item_list.rs:9:9:9:24 | static BAR | diff --git a/rust/ql/test/extractor-tests/generated/Impl/Impl.expected b/rust/ql/test/extractor-tests/generated/Impl/Impl.expected index ec5e5705529a..125fa8bc380f 100644 --- a/rust/ql/test/extractor-tests/generated/Impl/Impl.expected +++ b/rust/ql/test/extractor-tests/generated/Impl/Impl.expected @@ -7,7 +7,7 @@ getAttr getGenericParamList getSelfTy | gen_impl.rs:4:5:9:5 | impl MyTrait for MyType { ... } | gen_impl.rs:7:22:7:27 | MyType | -getTrait +getTraitTy | gen_impl.rs:4:5:9:5 | impl MyTrait for MyType { ... } | gen_impl.rs:7:10:7:16 | MyTrait | getVisibility getWhereClause diff --git a/rust/ql/test/extractor-tests/generated/Impl/Impl.ql b/rust/ql/test/extractor-tests/generated/Impl/Impl.ql index 1d73e09a1a7e..0a791b4659dc 100644 --- a/rust/ql/test/extractor-tests/generated/Impl/Impl.ql +++ b/rust/ql/test/extractor-tests/generated/Impl/Impl.ql @@ -38,8 +38,8 @@ query predicate getSelfTy(Impl x, TypeRepr getSelfTy) { toBeTested(x) and not x.isUnknown() and getSelfTy = x.getSelfTy() } -query predicate getTrait(Impl x, TypeRepr getTrait) { - toBeTested(x) and not x.isUnknown() and getTrait = x.getTrait() +query predicate getTraitTy(Impl x, TypeRepr getTraitTy) { + toBeTested(x) and not x.isUnknown() and getTraitTy = x.getTraitTy() } query predicate getVisibility(Impl x, Visibility getVisibility) { diff --git a/rust/ql/test/extractor-tests/generated/Impl/gen_impl.rs b/rust/ql/test/extractor-tests/generated/Impl/gen_impl.rs index 717d2e29b87d..a59507ae29d0 100644 --- a/rust/ql/test/extractor-tests/generated/Impl/gen_impl.rs +++ b/rust/ql/test/extractor-tests/generated/Impl/gen_impl.rs @@ -1,7 +1,7 @@ // generated by codegen, do not edit fn test_impl() -> () { - // An `impl`` block. + // An `impl` block. // // For example: impl MyTrait for MyType { diff --git a/rust/ql/test/extractor-tests/generated/Static/Static.expected b/rust/ql/test/extractor-tests/generated/Static/Static.expected index 074c6600f8c1..9ac6884c18c0 100644 --- a/rust/ql/test/extractor-tests/generated/Static/Static.expected +++ b/rust/ql/test/extractor-tests/generated/Static/Static.expected @@ -1,11 +1,11 @@ instances -| gen_static.rs:4:5:7:23 | Static | isMut: | no | isStatic: | yes | isUnsafe: | no | +| gen_static.rs:4:5:7:23 | static X | isMut: | no | isStatic: | yes | isUnsafe: | no | getAttributeMacroExpansion getAttr getBody -| gen_static.rs:4:5:7:23 | Static | gen_static.rs:7:21:7:22 | 42 | +| gen_static.rs:4:5:7:23 | static X | gen_static.rs:7:21:7:22 | 42 | getName -| gen_static.rs:4:5:7:23 | Static | gen_static.rs:7:12:7:12 | X | +| gen_static.rs:4:5:7:23 | static X | gen_static.rs:7:12:7:12 | X | getTypeRepr -| gen_static.rs:4:5:7:23 | Static | gen_static.rs:7:15:7:17 | i32 | +| gen_static.rs:4:5:7:23 | static X | gen_static.rs:7:15:7:17 | i32 | getVisibility diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index 6f0b278d062e..1c584f952897 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -797,7 +797,7 @@ macro_expansion.rs: # 84| getSegment(): [PathSegment] MyDerive::<...> # 83| getGenericArgList(): [GenericArgList] <...> # 84| getIdentifier(): [NameRef] MyDerive -# 83| getTrait(): [PathTypeRepr] ...::Debug +# 83| getTraitTy(): [PathTypeRepr] ...::Debug # 83| getPath(): [Path] ...::Debug # 83| getQualifier(): [Path] ...::fmt # 83| getQualifier(): [Path] $crate @@ -901,7 +901,7 @@ macro_expansion.rs: # 89| getSegment(): [PathSegment] MyDeriveEnum::<...> # 88| getGenericArgList(): [GenericArgList] <...> # 89| getIdentifier(): [NameRef] MyDeriveEnum -# 88| getTrait(): [PathTypeRepr] ...::PartialEq +# 88| getTraitTy(): [PathTypeRepr] ...::PartialEq # 88| getPath(): [Path] ...::PartialEq # 88| getQualifier(): [Path] ...::cmp # 88| getQualifier(): [Path] $crate @@ -921,7 +921,7 @@ macro_expansion.rs: # 89| getSegment(): [PathSegment] MyDeriveEnum::<...> # 88| getGenericArgList(): [GenericArgList] <...> # 89| getIdentifier(): [NameRef] MyDeriveEnum -# 88| getTrait(): [PathTypeRepr] ...::Eq +# 88| getTraitTy(): [PathTypeRepr] ...::Eq # 88| getPath(): [Path] ...::Eq # 88| getQualifier(): [Path] ...::cmp # 88| getQualifier(): [Path] $crate @@ -957,7 +957,7 @@ macro_expansion.rs: # 94| getName(): [Name] MyTrait # 98| getItem(20): [Union] union MyDeriveUnion # 99| getDeriveMacroExpansion(0): [MacroItems] MacroItems -# 99| getItem(0): [Const] Const +# 99| getItem(0): [Const] const CONST_MyDeriveUnion # 98| getBody(): [IntegerLiteralExpr] 42 # 99| getName(): [Name] CONST_MyDeriveUnion # 98| getTypeRepr(): [PathTypeRepr] u32 @@ -984,7 +984,7 @@ macro_expansion.rs: # 99| getPath(): [Path] MyDeriveUnion # 99| getSegment(): [PathSegment] MyDeriveUnion # 99| getIdentifier(): [NameRef] MyDeriveUnion -# 98| getTrait(): [PathTypeRepr] MyTrait +# 98| getTraitTy(): [PathTypeRepr] MyTrait # 98| getPath(): [Path] MyTrait # 98| getSegment(): [PathSegment] MyTrait # 98| getIdentifier(): [NameRef] MyTrait diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.expected b/rust/ql/test/extractor-tests/macro-expansion/test.expected index f47a7455e916..f7d5cae7340e 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/test.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/test.expected @@ -18,7 +18,7 @@ derive_macros | macro_expansion.rs:83:1:86:1 | struct MyDerive | 0 | 0 | macro_expansion.rs:84:8:85:9 | impl ...::Debug for MyDerive::<...> { ... } | | macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 0 | 0 | macro_expansion.rs:89:6:91:12 | impl ...::PartialEq for MyDeriveEnum::<...> { ... } | | macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 1 | 0 | macro_expansion.rs:89:6:89:17 | impl ...::Eq for MyDeriveEnum::<...> { ... } | -| macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 0 | macro_expansion.rs:99:7:99:19 | Const | +| macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 0 | macro_expansion.rs:99:7:99:19 | const CONST_MyDeriveUnion | | macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 1 | macro_expansion.rs:99:7:99:19 | impl MyTrait for MyDeriveUnion { ... } | macro_calls | macro_expansion.rs:5:9:5:35 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | diff --git a/rust/ql/test/library-tests/const_access/const_access.expected b/rust/ql/test/library-tests/const_access/const_access.expected index 83c5022aca84..ccecf6365b49 100644 --- a/rust/ql/test/library-tests/const_access/const_access.expected +++ b/rust/ql/test/library-tests/const_access/const_access.expected @@ -1,8 +1,11 @@ testFailures constAccess -| main.rs:17:13:17:24 | GLOBAL_CONST | main.rs:1:1:1:29 | Const | -| main.rs:19:13:19:24 | STRING_CONST | main.rs:2:1:2:35 | Const | -| main.rs:21:13:21:33 | ...::ASSOC_CONST | main.rs:9:5:9:33 | Const | -| main.rs:23:13:23:35 | ...::MODULE_CONST | main.rs:13:5:13:38 | Const | -| main.rs:25:8:25:19 | GLOBAL_CONST | main.rs:1:1:1:29 | Const | -| main.rs:29:16:29:36 | ...::ASSOC_CONST | main.rs:9:5:9:33 | Const | +| main.rs:17:13:17:24 | GLOBAL_CONST | main.rs:1:1:1:29 | const GLOBAL_CONST | +| main.rs:19:13:19:24 | STRING_CONST | main.rs:2:1:2:35 | const STRING_CONST | +| main.rs:21:13:21:33 | ...::ASSOC_CONST | main.rs:9:5:9:33 | const ASSOC_CONST | +| main.rs:23:13:23:35 | ...::MODULE_CONST | main.rs:13:5:13:38 | const MODULE_CONST | +| main.rs:26:16:26:27 | GLOBAL_CONST | main.rs:1:1:1:29 | const GLOBAL_CONST | +| main.rs:30:16:30:36 | ...::ASSOC_CONST | main.rs:9:5:9:33 | const ASSOC_CONST | +| main.rs:33:20:33:31 | GLOBAL_CONST | main.rs:1:1:1:29 | const GLOBAL_CONST | +| main.rs:39:17:39:28 | STRING_CONST | main.rs:38:9:38:43 | const STRING_CONST | +| main.rs:43:21:43:32 | STRING_CONST | main.rs:42:13:42:48 | const STRING_CONST | diff --git a/rust/ql/test/library-tests/const_access/const_access.ql b/rust/ql/test/library-tests/const_access/const_access.ql index b3bb73633927..27d1726f1067 100644 --- a/rust/ql/test/library-tests/const_access/const_access.ql +++ b/rust/ql/test/library-tests/const_access/const_access.ql @@ -5,15 +5,25 @@ import TestUtils query predicate constAccess(ConstAccess ca, Const c) { toBeTested(ca) and c = ca.getConst() } module ConstAccessTest implements TestSig { + private predicate constAt(Const c, string filepath, int line) { + c.getLocation().hasLocationInfo(filepath, _, _, line, _) + } + string getARelevantTag() { result = "const_access" } predicate hasActualResult(Location location, string element, string tag, string value) { - exists(ConstAccess ca | + exists(ConstAccess ca, Const c, string filepath, int line | toBeTested(ca) and location = ca.getLocation() and element = ca.toString() and tag = "const_access" and - value = ca.getConst().getName().getText() + c = ca.getConst() and + constAt(c, filepath, line) + | + commentAt(value, filepath, line) + or + not commentAt(_, filepath, line) and + value = c.getName().getText() ) } } diff --git a/rust/ql/test/library-tests/const_access/main.rs b/rust/ql/test/library-tests/const_access/main.rs index 0cf2467d100a..aebf6bba1bfb 100644 --- a/rust/ql/test/library-tests/const_access/main.rs +++ b/rust/ql/test/library-tests/const_access/main.rs @@ -15,18 +15,34 @@ mod my_module { fn use_consts() { let x = GLOBAL_CONST; // $ const_access=GLOBAL_CONST - + let s = STRING_CONST; // $ const_access=STRING_CONST - + let y = MyStruct::ASSOC_CONST; // $ const_access=ASSOC_CONST - + let z = my_module::MODULE_CONST; // $ const_access=MODULE_CONST - - if GLOBAL_CONST > 0 { // $ const_access=GLOBAL_CONST + + #[rustfmt::skip] + let _ = if GLOBAL_CONST > 0 { // $ const_access=GLOBAL_CONST println!("positive"); - } - + }; + let arr = [MyStruct::ASSOC_CONST; 5]; // $ const_access=ASSOC_CONST + + #[rustfmt::skip] + let _ = if let GLOBAL_CONST = 0 { // $ const_access=GLOBAL_CONST + println!("zero"); + }; + + { + const STRING_CONST: &str = "inner"; // Inner1 + let _ = STRING_CONST; // $ const_access=Inner1 + + { + const STRING_CONST: &str = "inner2"; // Inner2 + let _ = STRING_CONST; // $ const_access=Inner2 + } + } } fn main() { diff --git a/rust/ql/test/library-tests/controlflow/Cfg.expected b/rust/ql/test/library-tests/controlflow/Cfg.expected index ef97a3b628f7..2d1036c93c93 100644 --- a/rust/ql/test/library-tests/controlflow/Cfg.expected +++ b/rust/ql/test/library-tests/controlflow/Cfg.expected @@ -1317,10 +1317,9 @@ edges | test.rs:533:21:533:48 | { ... } | test.rs:533:21:533:48 | { ... } | | | test.rs:533:48:533:48 | 0 | test.rs:533:21:533:48 | ... > ... | | | test.rs:536:9:536:10 | 42 | test.rs:529:41:537:5 | { ... } | | -| test.rs:539:5:548:5 | enter fn const_block_panic | test.rs:540:9:540:30 | Const | | +| test.rs:539:5:548:5 | enter fn const_block_panic | test.rs:541:9:546:9 | ExprStmt | | | test.rs:539:5:548:5 | exit fn const_block_panic (normal) | test.rs:539:5:548:5 | exit fn const_block_panic | | | test.rs:539:35:548:5 | { ... } | test.rs:539:5:548:5 | exit fn const_block_panic (normal) | | -| test.rs:540:9:540:30 | Const | test.rs:541:9:546:9 | ExprStmt | | | test.rs:541:9:546:9 | ExprStmt | test.rs:541:12:541:16 | false | | | test.rs:541:9:546:9 | if false {...} | test.rs:547:9:547:9 | N | | | test.rs:541:12:541:16 | false | test.rs:541:9:546:9 | if false {...} | false | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index 5caa5c1c3ed9..4828b56542b8 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -222,6 +222,15 @@ edges | main.rs:415:18:415:38 | i.get_double_number() | main.rs:415:13:415:14 | n4 | provenance | | | main.rs:418:13:418:14 | n5 | main.rs:419:14:419:15 | n5 | provenance | | | main.rs:418:18:418:41 | ...::get_default(...) | main.rs:418:13:418:14 | n5 | provenance | | +| main.rs:426:30:426:39 | source(...) | main.rs:430:35:430:45 | CONST_VALUE | provenance | | +| main.rs:427:5:427:46 | static STATIC_VALUE | main.rs:433:32:433:43 | STATIC_VALUE | provenance | | +| main.rs:427:5:427:46 | static STATIC_VALUE | main.rs:437:18:437:29 | STATIC_VALUE | provenance | | +| main.rs:427:36:427:45 | source(...) | main.rs:427:5:427:46 | static STATIC_VALUE | provenance | | +| main.rs:430:35:430:45 | CONST_VALUE | main.rs:431:14:431:25 | CONST_VALUE2 | provenance | | +| main.rs:433:17:433:28 | static_value | main.rs:434:18:434:29 | static_value | provenance | | +| main.rs:433:32:433:43 | STATIC_VALUE | main.rs:433:17:433:28 | static_value | provenance | | +| main.rs:436:13:436:24 | STATIC_VALUE | main.rs:427:5:427:46 | static STATIC_VALUE | provenance | | +| main.rs:436:28:436:37 | source(...) | main.rs:436:13:436:24 | STATIC_VALUE | provenance | | nodes | main.rs:12:28:14:1 | { ... } | semmle.label | { ... } | | main.rs:13:5:13:13 | source(...) | semmle.label | source(...) | @@ -464,6 +473,17 @@ nodes | main.rs:418:13:418:14 | n5 | semmle.label | n5 | | main.rs:418:18:418:41 | ...::get_default(...) | semmle.label | ...::get_default(...) | | main.rs:419:14:419:15 | n5 | semmle.label | n5 | +| main.rs:426:30:426:39 | source(...) | semmle.label | source(...) | +| main.rs:427:5:427:46 | static STATIC_VALUE | semmle.label | static STATIC_VALUE | +| main.rs:427:36:427:45 | source(...) | semmle.label | source(...) | +| main.rs:430:35:430:45 | CONST_VALUE | semmle.label | CONST_VALUE | +| main.rs:431:14:431:25 | CONST_VALUE2 | semmle.label | CONST_VALUE2 | +| main.rs:433:17:433:28 | static_value | semmle.label | static_value | +| main.rs:433:32:433:43 | STATIC_VALUE | semmle.label | STATIC_VALUE | +| main.rs:434:18:434:29 | static_value | semmle.label | static_value | +| main.rs:436:13:436:24 | STATIC_VALUE | semmle.label | STATIC_VALUE | +| main.rs:436:28:436:37 | source(...) | semmle.label | source(...) | +| main.rs:437:18:437:29 | STATIC_VALUE | semmle.label | STATIC_VALUE | subpaths | main.rs:38:16:38:24 | source(...) | main.rs:26:28:26:33 | ...: i64 | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | main.rs:38:5:38:5 | [post] a [MyStruct] | | main.rs:39:10:39:10 | a [MyStruct] | main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | main.rs:30:31:32:5 | { ... } | main.rs:39:10:39:21 | a.get_data() | @@ -525,3 +545,8 @@ testFailures | main.rs:412:14:412:15 | n3 | main.rs:371:13:371:21 | source(...) | main.rs:412:14:412:15 | n3 | $@ | main.rs:371:13:371:21 | source(...) | source(...) | | main.rs:416:14:416:15 | n4 | main.rs:391:13:391:22 | source(...) | main.rs:416:14:416:15 | n4 | $@ | main.rs:391:13:391:22 | source(...) | source(...) | | main.rs:419:14:419:15 | n5 | main.rs:395:13:395:21 | source(...) | main.rs:419:14:419:15 | n5 | $@ | main.rs:395:13:395:21 | source(...) | source(...) | +| main.rs:431:14:431:25 | CONST_VALUE2 | main.rs:426:30:426:39 | source(...) | main.rs:431:14:431:25 | CONST_VALUE2 | $@ | main.rs:426:30:426:39 | source(...) | source(...) | +| main.rs:434:18:434:29 | static_value | main.rs:427:36:427:45 | source(...) | main.rs:434:18:434:29 | static_value | $@ | main.rs:427:36:427:45 | source(...) | source(...) | +| main.rs:434:18:434:29 | static_value | main.rs:436:28:436:37 | source(...) | main.rs:434:18:434:29 | static_value | $@ | main.rs:436:28:436:37 | source(...) | source(...) | +| main.rs:437:18:437:29 | STATIC_VALUE | main.rs:427:36:427:45 | source(...) | main.rs:437:18:437:29 | STATIC_VALUE | $@ | main.rs:427:36:427:45 | source(...) | source(...) | +| main.rs:437:18:437:29 | STATIC_VALUE | main.rs:436:28:436:37 | source(...) | main.rs:437:18:437:29 | STATIC_VALUE | $@ | main.rs:436:28:436:37 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/global/main.rs b/rust/ql/test/library-tests/dataflow/global/main.rs index ac737570771f..b3a3af1be95e 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -1,4 +1,4 @@ -fn source(i: i64) -> i64 { +const fn source(i: i64) -> i64 { 1000 + i } @@ -420,6 +420,25 @@ mod not_trait_dispatch { } } +mod const_static { + use super::{sink, source}; + + const CONST_VALUE: i64 = source(42); + static mut STATIC_VALUE: i64 = source(43); + + fn test_const_static() { + const CONST_VALUE2: i64 = CONST_VALUE; + sink(CONST_VALUE2); // $ hasValueFlow=42 + unsafe { + let static_value = STATIC_VALUE; + sink(static_value); // $ hasValueFlow=43 $ SPURIOUS: hasValueFlow=44 (statics are not control-flow sensitive) + + STATIC_VALUE = source(44); + sink(STATIC_VALUE); // $ hasValueFlow=44 $ SPURIOUS: hasValueFlow=43 (statics are not control-flow sensitive) + } + } +} + fn main() { data_out_of_call(); data_out_of_call_side_effect1(); diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index 26db4dc3962e..6f30416d54a7 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -128,14 +128,20 @@ | main.rs:416:9:416:16 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:418:18:418:41 | ...::get_default(...) | main.rs:394:9:396:9 | fn get_default | | main.rs:419:9:419:16 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:424:5:424:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | -| main.rs:425:5:425:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | -| main.rs:426:5:426:35 | data_out_of_call_side_effect2(...) | main.rs:42:1:50:1 | fn data_out_of_call_side_effect2 | -| main.rs:427:5:427:21 | data_in_to_call(...) | main.rs:56:1:59:1 | fn data_in_to_call | -| main.rs:428:5:428:23 | data_through_call(...) | main.rs:65:1:69:1 | fn data_through_call | -| main.rs:429:5:429:34 | data_through_nested_function(...) | main.rs:79:1:88:1 | fn data_through_nested_function | -| main.rs:431:5:431:24 | data_out_of_method(...) | main.rs:152:1:162:1 | fn data_out_of_method | -| main.rs:432:5:432:28 | data_in_to_method_call(...) | main.rs:169:1:179:1 | fn data_in_to_method_call | -| main.rs:433:5:433:25 | data_through_method(...) | main.rs:187:1:199:1 | fn data_through_method | -| main.rs:435:5:435:31 | test_operator_overloading(...) | main.rs:256:1:298:1 | fn test_operator_overloading | -| main.rs:436:5:436:22 | test_async_await(...) | main.rs:353:1:358:1 | fn test_async_await | +| main.rs:426:30:426:39 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:427:36:427:45 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:431:9:431:26 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:434:13:434:30 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:436:28:436:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:437:13:437:30 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:443:5:443:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | +| main.rs:444:5:444:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | +| main.rs:445:5:445:35 | data_out_of_call_side_effect2(...) | main.rs:42:1:50:1 | fn data_out_of_call_side_effect2 | +| main.rs:446:5:446:21 | data_in_to_call(...) | main.rs:56:1:59:1 | fn data_in_to_call | +| main.rs:447:5:447:23 | data_through_call(...) | main.rs:65:1:69:1 | fn data_through_call | +| main.rs:448:5:448:34 | data_through_nested_function(...) | main.rs:79:1:88:1 | fn data_through_nested_function | +| main.rs:450:5:450:24 | data_out_of_method(...) | main.rs:152:1:162:1 | fn data_out_of_method | +| main.rs:451:5:451:28 | data_in_to_method_call(...) | main.rs:169:1:179:1 | fn data_in_to_method_call | +| main.rs:452:5:452:25 | data_through_method(...) | main.rs:187:1:199:1 | fn data_through_method | +| main.rs:454:5:454:31 | test_operator_overloading(...) | main.rs:256:1:298:1 | fn test_operator_overloading | +| main.rs:455:5:455:22 | test_async_await(...) | main.rs:353:1:358:1 | fn test_async_await | diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.ql b/rust/ql/test/library-tests/dataflow/global/viableCallable.ql index 3daa8b4b17f5..dbb49e4855dd 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.ql +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.ql @@ -1,5 +1,6 @@ import codeql.rust.dataflow.internal.DataFlowImpl query predicate viableCallable(DataFlowCall call, DataFlowCallable callee) { - RustDataFlow::viableCallable(call) = callee + RustDataFlow::viableCallable(call) = callee and + (call.asCall().fromSource() or call.isImplicitDerefCall(_, _, _, _)) } diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index e220a769eceb..7d70ff90eaa6 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,6 +1,4 @@ localStep -| file://:0:0:0:0 | [summary param] 0 in fn canonicalize | file://:0:0:0:0 | [summary] read: Argument[0].OptionalBarrier[normalize-path] in fn canonicalize | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in fn canonicalize | file://:0:0:0:0 | [summary] read: Argument[self].Reference.OptionalBarrier[normalize-path] in fn canonicalize | | main.rs:4:11:4:11 | [SSA] i | main.rs:5:12:5:12 | i | | main.rs:4:11:4:11 | i | main.rs:4:11:4:11 | [SSA] i | | main.rs:4:11:4:11 | i | main.rs:4:11:4:11 | i | diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.ql b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.ql index 21e459745291..14fa90e3d448 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.ql +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.ql @@ -5,7 +5,9 @@ import utils.test.TranslateModels query predicate localStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { // Local flow steps that don't originate from a flow summary. - RustDataFlow::simpleLocalFlowStep(nodeFrom, nodeTo, "") + RustDataFlow::simpleLocalFlowStep(nodeFrom, nodeTo, "") and + nodeFrom.getLocation().fromSource() and + nodeTo.getLocation().fromSource() } class Node extends DataFlow::Node { diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index c96f9ef30f0a..f95b6ef09ef3 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -1098,6 +1098,52 @@ mod self_types { } } +#[rustfmt::skip] +mod const_static { + use crate::const_static; // $ item=const_static + + pub const CONST_ITEM: i32 = 42; // $ item=i32 + + pub static STATIC_ITEM: i32 = 42; // $ item=i32 + + fn use_const_static() { + let _ = CONST_ITEM; // $ item=CONST_ITEM + let _ = STATIC_ITEM; // $ item=STATIC_ITEM + let _ = const_static::CONST_ITEM; // $ item=CONST_ITEM + let _ = const_static::STATIC_ITEM; // $ item=STATIC_ITEM + let _ = CONST_ALIAS; // $ item=C1 + let _ = STATIC_ALIAS; // $ item=S1 + + const CONST_ALIAS: i32 = CONST_ITEM // $ item=CONST_ITEM item=i32 + ; // C1 + static STATIC_ALIAS: i32 = STATIC_ITEM // $ item=STATIC_ITEM item=i32 + ; // S1 + + let _ = CONST_ALIAS; // $ item=C1 + let _ = STATIC_ALIAS; // $ item=S1 + + { + const CONST_ALIAS: i32 = CONST_ITEM // $ item=CONST_ITEM item=i32 + ; // C2 + static STATIC_ALIAS: i32 = STATIC_ITEM // $ item=STATIC_ITEM item=i32 + ; // S2 + + let _ = CONST_ALIAS; // $ item=C2 + let _ = STATIC_ALIAS; // $ item=S2 + } + + { + const CONST_ALIAS: i32 = CONST_ITEM // $ item=CONST_ITEM item=i32 + ; // C3 + static STATIC_ALIAS: i32 = STATIC_ITEM // $ item=STATIC_ITEM item=i32 + ; // S3 + + let _ = CONST_ALIAS; // $ item=C3 + let _ = STATIC_ALIAS; // $ item=S3 + } + } +} + fn main() { my::nested::nested1::nested2::f(); // $ item=I4 my::f(); // $ item=I38 diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index e85bb7876dab..ef881e62f53b 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -36,6 +36,7 @@ mod | main.rs:981:1:1022:1 | mod patterns | | main.rs:1024:1:1068:1 | mod self_constructors | | main.rs:1070:1:1099:1 | mod self_types | +| main.rs:1101:1:1145:1 | mod const_static | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -77,7 +78,7 @@ resolvePath | main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | | main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | -| main.rs:47:9:47:13 | super | main.rs:1:1:1138:2 | SourceFile | +| main.rs:47:9:47:13 | super | main.rs:1:1:1184:2 | SourceFile | | main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | | main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | | main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | @@ -92,7 +93,7 @@ resolvePath | main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | | main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | | main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | -| main.rs:75:5:75:8 | self | main.rs:1:1:1138:2 | SourceFile | +| main.rs:75:5:75:8 | self | main.rs:1:1:1184:2 | SourceFile | | main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | | main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | @@ -114,7 +115,7 @@ resolvePath | main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:125:13:125:17 | super | main.rs:1:1:1138:2 | SourceFile | +| main.rs:125:13:125:17 | super | main.rs:1:1:1184:2 | SourceFile | | main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | | main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | | main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | @@ -234,7 +235,7 @@ resolvePath | main.rs:407:13:407:16 | Self | main.rs:398:5:411:5 | trait Trait2 | | main.rs:407:13:407:19 | ...::g | main.rs:385:9:387:9 | fn g | | main.rs:409:13:409:16 | Self | main.rs:398:5:411:5 | trait Trait2 | -| main.rs:409:13:409:19 | ...::c | main.rs:394:9:395:9 | Const | +| main.rs:409:13:409:19 | ...::c | main.rs:394:9:395:9 | const c | | main.rs:416:10:418:5 | Trait1::<...> | main.rs:378:5:396:5 | trait Trait1 | | main.rs:417:7:417:7 | S | main.rs:413:5:413:13 | struct S | | main.rs:419:11:419:11 | S | main.rs:413:5:413:13 | struct S | @@ -245,7 +246,7 @@ resolvePath | main.rs:426:24:426:24 | S | main.rs:413:5:413:13 | struct S | | main.rs:427:13:427:19 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:428:13:428:16 | Self | main.rs:415:5:433:5 | impl Trait1::<...> for S { ... } | -| main.rs:428:13:428:19 | ...::c | main.rs:431:9:432:9 | Const | +| main.rs:428:13:428:19 | ...::c | main.rs:431:9:432:9 | const c | | main.rs:431:18:431:18 | S | main.rs:413:5:413:13 | struct S | | main.rs:431:22:431:22 | S | main.rs:413:5:413:13 | struct S | | main.rs:436:10:438:5 | Trait2::<...> | main.rs:398:5:411:5 | trait Trait2 | @@ -256,7 +257,7 @@ resolvePath | main.rs:441:13:441:19 | ...::g | main.rs:426:9:429:9 | fn g | | main.rs:442:13:442:19 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:443:13:443:16 | Self | main.rs:435:5:445:5 | impl Trait2::<...> for S { ... } | -| main.rs:443:13:443:19 | ...::c | main.rs:431:9:432:9 | Const | +| main.rs:443:13:443:19 | ...::c | main.rs:431:9:432:9 | const c | | main.rs:449:9:449:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:450:17:450:17 | S | main.rs:413:5:413:13 | struct S | | main.rs:451:9:455:9 | <...> | main.rs:378:5:396:5 | trait Trait1 | @@ -274,9 +275,9 @@ resolvePath | main.rs:463:9:463:9 | S | main.rs:413:5:413:13 | struct S | | main.rs:463:9:463:12 | ...::h | main.rs:389:9:392:9 | fn h | | main.rs:465:9:465:9 | S | main.rs:413:5:413:13 | struct S | -| main.rs:465:9:465:12 | ...::c | main.rs:431:9:432:9 | Const | +| main.rs:465:9:465:12 | ...::c | main.rs:431:9:432:9 | const c | | main.rs:466:9:470:9 | <...> | main.rs:378:5:396:5 | trait Trait1 | -| main.rs:466:9:470:12 | ...::c | main.rs:394:9:395:9 | Const | +| main.rs:466:9:470:12 | ...::c | main.rs:394:9:395:9 | const c | | main.rs:466:10:466:10 | S | main.rs:413:5:413:13 | struct S | | main.rs:467:14:469:11 | Trait1::<...> | main.rs:378:5:396:5 | trait Trait1 | | main.rs:468:13:468:13 | S | main.rs:413:5:413:13 | struct S | @@ -545,8 +546,8 @@ resolvePath | main.rs:1011:17:1011:20 | Some | {EXTERNAL LOCATION} | Some | | main.rs:1013:13:1013:16 | Some | {EXTERNAL LOCATION} | Some | | main.rs:1018:13:1018:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:1018:18:1018:18 | z | main.rs:1005:5:1007:12 | Const | -| main.rs:1018:24:1018:24 | z | main.rs:1005:5:1007:12 | Const | +| main.rs:1018:18:1018:18 | z | main.rs:1005:5:1007:12 | const z | +| main.rs:1018:24:1018:24 | z | main.rs:1005:5:1007:12 | const z | | main.rs:1026:24:1026:26 | i32 | {EXTERNAL LOCATION} | struct i32 | | main.rs:1029:10:1029:20 | TupleStruct | main.rs:1026:5:1026:28 | struct TupleStruct | | main.rs:1031:19:1031:21 | i32 | {EXTERNAL LOCATION} | struct i32 | @@ -582,79 +583,109 @@ resolvePath | main.rs:1096:17:1096:17 | T | main.rs:1093:9:1093:9 | T | | main.rs:1097:16:1097:16 | T | main.rs:1093:9:1093:9 | T | | main.rs:1097:23:1097:26 | Self | main.rs:1090:5:1098:5 | union NonEmptyListUnion | -| main.rs:1102:5:1102:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:1102:5:1102:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:1102:5:1102:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:1102:5:1102:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:1102:5:1102:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:1103:5:1103:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:1103:5:1103:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:1104:5:1104:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:1104:5:1104:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:1104:5:1104:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:1104:5:1104:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:1105:5:1105:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:1106:5:1106:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:1107:5:1107:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:1107:5:1107:12 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:1108:5:1108:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:1108:5:1108:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:1108:5:1108:13 | ...::g | main.rs:30:9:34:9 | fn g | -| main.rs:1109:5:1109:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:1109:5:1109:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:1109:5:1109:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | -| main.rs:1109:5:1109:17 | ...::h | main.rs:37:27:41:13 | fn h | -| main.rs:1110:5:1110:6 | m4 | main.rs:46:1:53:1 | mod m4 | -| main.rs:1110:5:1110:9 | ...::i | main.rs:49:5:52:5 | fn i | -| main.rs:1111:5:1111:5 | h | main.rs:57:1:76:1 | fn h | -| main.rs:1112:5:1112:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:1113:5:1113:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:1114:5:1114:5 | j | main.rs:104:1:108:1 | fn j | -| main.rs:1115:5:1115:6 | m6 | main.rs:116:1:128:1 | mod m6 | -| main.rs:1115:5:1115:9 | ...::g | main.rs:121:5:127:5 | fn g | -| main.rs:1116:5:1116:6 | m7 | main.rs:130:1:149:1 | mod m7 | -| main.rs:1116:5:1116:9 | ...::f | main.rs:141:5:148:5 | fn f | -| main.rs:1117:5:1117:6 | m8 | main.rs:151:1:205:1 | mod m8 | -| main.rs:1117:5:1117:9 | ...::g | main.rs:189:5:204:5 | fn g | -| main.rs:1118:5:1118:6 | m9 | main.rs:207:1:215:1 | mod m9 | -| main.rs:1118:5:1118:9 | ...::f | main.rs:210:5:214:5 | fn f | -| main.rs:1119:5:1119:7 | m11 | main.rs:238:1:275:1 | mod m11 | -| main.rs:1119:5:1119:10 | ...::f | main.rs:243:5:246:5 | fn f | -| main.rs:1120:5:1120:7 | m15 | main.rs:306:1:375:1 | mod m15 | -| main.rs:1120:5:1120:10 | ...::f | main.rs:362:5:374:5 | fn f | -| main.rs:1121:5:1121:7 | m16 | main.rs:377:1:575:1 | mod m16 | -| main.rs:1121:5:1121:10 | ...::f | main.rs:447:5:471:5 | fn f | -| main.rs:1122:5:1122:20 | trait_visibility | main.rs:577:1:634:1 | mod trait_visibility | -| main.rs:1122:5:1122:23 | ...::f | main.rs:604:5:633:5 | fn f | -| main.rs:1123:5:1123:7 | m17 | main.rs:636:1:666:1 | mod m17 | -| main.rs:1123:5:1123:10 | ...::f | main.rs:660:5:665:5 | fn f | -| main.rs:1124:5:1124:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:1124:5:1124:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:1125:5:1125:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:1125:5:1125:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:1126:5:1126:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:1126:5:1126:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:1127:5:1127:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:1128:5:1128:12 | my_alias | main.rs:1:1:1:7 | mod my | -| main.rs:1128:5:1128:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:1129:5:1129:7 | m18 | main.rs:668:1:686:1 | mod m18 | -| main.rs:1129:5:1129:12 | ...::m19 | main.rs:673:5:685:5 | mod m19 | -| main.rs:1129:5:1129:17 | ...::m20 | main.rs:678:9:684:9 | mod m20 | -| main.rs:1129:5:1129:20 | ...::g | main.rs:679:13:683:13 | fn g | -| main.rs:1130:5:1130:7 | m23 | main.rs:715:1:740:1 | mod m23 | -| main.rs:1130:5:1130:10 | ...::f | main.rs:735:5:739:5 | fn f | -| main.rs:1131:5:1131:7 | m24 | main.rs:742:1:810:1 | mod m24 | -| main.rs:1131:5:1131:10 | ...::f | main.rs:796:5:809:5 | fn f | -| main.rs:1132:5:1132:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:1132:5:1132:11 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:1133:5:1133:13 | z_changed | main.rs:815:1:815:9 | fn z_changed | -| main.rs:1134:5:1134:11 | AStruct | main.rs:817:1:817:17 | struct AStruct | -| main.rs:1134:5:1134:22 | ...::z_on_type | main.rs:821:5:821:17 | fn z_on_type | -| main.rs:1135:5:1135:11 | AStruct | main.rs:817:1:817:17 | struct AStruct | -| main.rs:1136:5:1136:29 | impl_with_attribute_macro | main.rs:960:1:979:1 | mod impl_with_attribute_macro | -| main.rs:1136:5:1136:35 | ...::test | main.rs:975:5:978:5 | fn test | -| main.rs:1137:5:1137:12 | patterns | main.rs:981:1:1022:1 | mod patterns | -| main.rs:1137:5:1137:18 | ...::test | main.rs:982:5:996:5 | fn test | +| main.rs:1103:9:1103:13 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:1103:9:1103:27 | ...::const_static | main.rs:1101:1:1145:1 | mod const_static | +| main.rs:1105:27:1105:29 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1107:29:1107:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1110:17:1110:26 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | +| main.rs:1111:17:1111:27 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | +| main.rs:1112:17:1112:28 | const_static | main.rs:1101:1:1145:1 | mod const_static | +| main.rs:1112:17:1112:40 | ...::CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | +| main.rs:1113:17:1113:28 | const_static | main.rs:1101:1:1145:1 | mod const_static | +| main.rs:1113:17:1113:41 | ...::STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | +| main.rs:1114:17:1114:27 | CONST_ALIAS | main.rs:1117:9:1118:13 | const CONST_ALIAS | +| main.rs:1115:17:1115:28 | STATIC_ALIAS | main.rs:1118:15:1120:13 | static STATIC_ALIAS | +| main.rs:1117:28:1117:30 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1117:34:1117:43 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | +| main.rs:1119:30:1119:32 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1119:36:1119:46 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | +| main.rs:1122:17:1122:27 | CONST_ALIAS | main.rs:1117:9:1118:13 | const CONST_ALIAS | +| main.rs:1123:17:1123:28 | STATIC_ALIAS | main.rs:1118:15:1120:13 | static STATIC_ALIAS | +| main.rs:1126:32:1126:34 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1126:38:1126:47 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | +| main.rs:1128:34:1128:36 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1128:40:1128:50 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | +| main.rs:1131:21:1131:31 | CONST_ALIAS | main.rs:1126:13:1127:17 | const CONST_ALIAS | +| main.rs:1132:21:1132:32 | STATIC_ALIAS | main.rs:1127:19:1129:17 | static STATIC_ALIAS | +| main.rs:1136:32:1136:34 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1136:38:1136:47 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | +| main.rs:1138:34:1138:36 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1138:40:1138:50 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | +| main.rs:1141:21:1141:31 | CONST_ALIAS | main.rs:1136:13:1137:17 | const CONST_ALIAS | +| main.rs:1142:21:1142:32 | STATIC_ALIAS | main.rs:1137:19:1139:17 | static STATIC_ALIAS | +| main.rs:1148:5:1148:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:1148:5:1148:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:1148:5:1148:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:1148:5:1148:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:1148:5:1148:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:1149:5:1149:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:1149:5:1149:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:1150:5:1150:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:1150:5:1150:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:1150:5:1150:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:1150:5:1150:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:1151:5:1151:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:1152:5:1152:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:1153:5:1153:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:1153:5:1153:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:1154:5:1154:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:1154:5:1154:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:1154:5:1154:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:1155:5:1155:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:1155:5:1155:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:1155:5:1155:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:1155:5:1155:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:1156:5:1156:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:1156:5:1156:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:1157:5:1157:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:1158:5:1158:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:1159:5:1159:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:1160:5:1160:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:1161:5:1161:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:1161:5:1161:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:1162:5:1162:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:1162:5:1162:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:1163:5:1163:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:1163:5:1163:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:1164:5:1164:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:1164:5:1164:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:1165:5:1165:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:1165:5:1165:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:1166:5:1166:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:1166:5:1166:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:1167:5:1167:7 | m16 | main.rs:377:1:575:1 | mod m16 | +| main.rs:1167:5:1167:10 | ...::f | main.rs:447:5:471:5 | fn f | +| main.rs:1168:5:1168:20 | trait_visibility | main.rs:577:1:634:1 | mod trait_visibility | +| main.rs:1168:5:1168:23 | ...::f | main.rs:604:5:633:5 | fn f | +| main.rs:1169:5:1169:7 | m17 | main.rs:636:1:666:1 | mod m17 | +| main.rs:1169:5:1169:10 | ...::f | main.rs:660:5:665:5 | fn f | +| main.rs:1170:5:1170:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:1170:5:1170:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:1171:5:1171:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:1171:5:1171:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:1172:5:1172:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:1172:5:1172:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:1173:5:1173:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:1174:5:1174:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:1174:5:1174:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:1175:5:1175:7 | m18 | main.rs:668:1:686:1 | mod m18 | +| main.rs:1175:5:1175:12 | ...::m19 | main.rs:673:5:685:5 | mod m19 | +| main.rs:1175:5:1175:17 | ...::m20 | main.rs:678:9:684:9 | mod m20 | +| main.rs:1175:5:1175:20 | ...::g | main.rs:679:13:683:13 | fn g | +| main.rs:1176:5:1176:7 | m23 | main.rs:715:1:740:1 | mod m23 | +| main.rs:1176:5:1176:10 | ...::f | main.rs:735:5:739:5 | fn f | +| main.rs:1177:5:1177:7 | m24 | main.rs:742:1:810:1 | mod m24 | +| main.rs:1177:5:1177:10 | ...::f | main.rs:796:5:809:5 | fn f | +| main.rs:1178:5:1178:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:1178:5:1178:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:1179:5:1179:13 | z_changed | main.rs:815:1:815:9 | fn z_changed | +| main.rs:1180:5:1180:11 | AStruct | main.rs:817:1:817:17 | struct AStruct | +| main.rs:1180:5:1180:22 | ...::z_on_type | main.rs:821:5:821:17 | fn z_on_type | +| main.rs:1181:5:1181:11 | AStruct | main.rs:817:1:817:17 | struct AStruct | +| main.rs:1182:5:1182:29 | impl_with_attribute_macro | main.rs:960:1:979:1 | mod impl_with_attribute_macro | +| main.rs:1182:5:1182:35 | ...::test | main.rs:975:5:978:5 | fn test | +| main.rs:1183:5:1183:12 | patterns | main.rs:981:1:1022:1 | mod patterns | +| main.rs:1183:5:1183:18 | ...::test | main.rs:982:5:996:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | @@ -680,7 +711,7 @@ resolvePath | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:4:5:4:5 | h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:1138:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:1184:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | diff --git a/rust/ql/test/library-tests/sensitivedata/test.rs b/rust/ql/test/library-tests/sensitivedata/test.rs index f8d850beeb80..e2bb5a5f595c 100644 --- a/rust/ql/test/library-tests/sensitivedata/test.rs +++ b/rust/ql/test/library-tests/sensitivedata/test.rs @@ -23,11 +23,14 @@ impl MyStruct { fn get_password() -> String { get_string() } fn test_passwords( - password: &str, pass_word: &str, passwd: &str, my_password: &str, password_str: &str, password_confirmation: &str, + password: &str, pass_word: &str, passwd: &str, my_password: &str, password_str: &str, password_confirmation: &str, profile_password: &str, pass_phrase: &str, passphrase: &str, passPhrase: &str, backup_code: &str, auth_key: &str, authkey: &str, authKey: &str, authentication_key: &str, authenticationkey: &str, authenticationKey: &str, oauth: &str, - one_time_code: &str, - harmless: &str, encrypted_password: &str, password_hash: &str, passwordFile: &str, + one_time_code: &str, api_token: &str, api_tok: &str, + harmless: &str, + encrypted_password: &str, unencrypted_password: &str, encoded_password: &str, unencoded_password: &str, + password_hash: &str, passwordFile: &str, coauthor: &str, + ms: &MyStruct ) { // passwords @@ -38,6 +41,9 @@ fn test_passwords( sink(my_password); // $ sensitive=password sink(password_str); // $ sensitive=password sink(password_confirmation); // $ sensitive=password + sink(profile_password); // $ sensitive=password + sink(unencrypted_password); // $ sensitive=password + sink(unencoded_password); // $ sensitive=password sink(pass_phrase); // $ sensitive=password sink(passphrase); // $ sensitive=password sink(passPhrase); // $ sensitive=password @@ -51,6 +57,8 @@ fn test_passwords( sink(authenticationKey); // $ sensitive=password sink(oauth); // $ sensitive=password sink(one_time_code); // $ MISSING: sensitive=password + sink(api_token); // $ sensitive=password + sink(api_tok); // $ sensitive=password sink(ms); // $ MISSING: sensitive=password sink(ms.password.as_str()); // $ sensitive=password @@ -67,8 +75,10 @@ fn test_passwords( sink(harmless); sink(encrypted_password); + sink(encoded_password); sink(password_hash); sink(passwordFile); + sink(coauthor); sink(ms.harmless.as_str()); sink(ms.password_file_path.as_str()); @@ -187,6 +197,10 @@ struct Financials { harmless: String, my_bank_account_number: String, credit_card_no: String, + card_no: String, + cardNumber: String, + card_security_code: String, + credit_rating: i32, user_ccn: String, cvv: String, @@ -201,6 +215,7 @@ struct Financials { accounting: i32, unaccounted: bool, multiband: bool, + wildcard_not_matched: bool, } enum Gender { @@ -298,6 +313,9 @@ fn test_private_info( sink(info.financials.my_bank_account_number.as_str()); // $ sensitive=private SPURIOUS: sensitive=id sink(info.financials.credit_card_no.as_str()); // $ sensitive=private + sink(info.financials.card_no.as_str()); // $ sensitive=private + sink(info.financials.cardNumber.as_str()); // $ sensitive=private + sink(info.financials.card_security_code.as_str()); // $ sensitive=private sink(info.financials.credit_rating); // $ sensitive=private sink(info.financials.user_ccn.as_str()); // $ sensitive=private sink(info.financials.cvv.as_str()); // $ sensitive=private @@ -350,6 +368,7 @@ fn test_private_info( sink(info.financials.accounting); sink(info.financials.unaccounted); sink(info.financials.multiband); + sink(info.financials.wildcard_not_matched); sink(ContactDetails::FavouriteColor("blue".to_string())); } diff --git a/rust/ql/test/library-tests/static_access/Cargo.lock b/rust/ql/test/library-tests/static_access/Cargo.lock new file mode 100644 index 000000000000..b9856cfaf77d --- /dev/null +++ b/rust/ql/test/library-tests/static_access/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "test" +version = "0.0.1" diff --git a/rust/ql/test/library-tests/static_access/main.rs b/rust/ql/test/library-tests/static_access/main.rs new file mode 100644 index 000000000000..33f170874cfb --- /dev/null +++ b/rust/ql/test/library-tests/static_access/main.rs @@ -0,0 +1,33 @@ +static GLOBAL_STATIC: i32 = 42; +static STRING_STATIC: &str = "hello"; + +mod my_module { + pub static MODULE_STATIC: i32 = 200; +} + +fn use_statics() { + let x = GLOBAL_STATIC; // $ static_access=GLOBAL_STATIC + + let s = STRING_STATIC; // $ static_access=STRING_STATIC + + let z = my_module::MODULE_STATIC; // $ static_access=MODULE_STATIC + + #[rustfmt::skip] + let _ = if GLOBAL_STATIC > 0 { // $ static_access=GLOBAL_STATIC + println!("positive"); + }; + + { + static STRING_STATIC: &str = "inner"; // Inner1 + let _ = STRING_STATIC; // $ static_access=Inner1 + + { + static STRING_STATIC: &str = "inner2"; // Inner2 + let _ = STRING_STATIC; // $ static_access=Inner2 + } + } +} + +fn main() { + use_statics(); +} diff --git a/rust/ql/test/library-tests/static_access/static_access.expected b/rust/ql/test/library-tests/static_access/static_access.expected new file mode 100644 index 000000000000..893b356418ff --- /dev/null +++ b/rust/ql/test/library-tests/static_access/static_access.expected @@ -0,0 +1,8 @@ +testFailures +staticAccess +| main.rs:9:13:9:25 | GLOBAL_STATIC | main.rs:1:1:1:31 | static GLOBAL_STATIC | +| main.rs:11:13:11:25 | STRING_STATIC | main.rs:2:1:2:37 | static STRING_STATIC | +| main.rs:13:13:13:36 | ...::MODULE_STATIC | main.rs:5:5:5:40 | static MODULE_STATIC | +| main.rs:16:16:16:28 | GLOBAL_STATIC | main.rs:1:1:1:31 | static GLOBAL_STATIC | +| main.rs:22:17:22:29 | STRING_STATIC | main.rs:21:9:21:45 | static STRING_STATIC | +| main.rs:26:21:26:33 | STRING_STATIC | main.rs:25:13:25:50 | static STRING_STATIC | diff --git a/rust/ql/test/library-tests/static_access/static_access.ql b/rust/ql/test/library-tests/static_access/static_access.ql new file mode 100644 index 000000000000..8a21ee5fb9b1 --- /dev/null +++ b/rust/ql/test/library-tests/static_access/static_access.ql @@ -0,0 +1,31 @@ +import rust +import utils.test.InlineExpectationsTest +import TestUtils + +query predicate staticAccess(StaticAccess sa, Static s) { toBeTested(sa) and s = sa.getStatic() } + +module StaticAccessTest implements TestSig { + private predicate staticAt(Static s, string filepath, int line) { + s.getLocation().hasLocationInfo(filepath, _, _, line, _) + } + + string getARelevantTag() { result = "static_access" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(StaticAccess sa, Static s, string filepath, int line | + toBeTested(sa) and + location = sa.getLocation() and + element = sa.toString() and + tag = "static_access" and + s = sa.getStatic() and + staticAt(s, filepath, line) + | + commentAt(value, filepath, line) + or + not commentAt(_, filepath, line) and + value = s.getName().getText() + ) + } +} + +import MakeTest diff --git a/rust/ql/test/library-tests/variables/Cfg.expected b/rust/ql/test/library-tests/variables/Cfg.expected index d3297eb8c30d..b64d4ad75596 100644 --- a/rust/ql/test/library-tests/variables/Cfg.expected +++ b/rust/ql/test/library-tests/variables/Cfg.expected @@ -272,1742 +272,1875 @@ edges | main.rs:109:5:109:16 | print_str(...) | main.rs:99:19:110:1 | { ... } | | | main.rs:109:5:109:17 | ExprStmt | main.rs:109:5:109:13 | print_str | | | main.rs:109:15:109:15 | x | main.rs:109:5:109:16 | print_str(...) | | -| main.rs:112:1:119:1 | enter fn let_pattern5 | main.rs:113:5:113:42 | let ... = ... | | +| main.rs:112:1:119:1 | enter fn let_pattern5 | main.rs:113:5:113:41 | let ... = ... | | | main.rs:112:1:119:1 | exit fn let_pattern5 (normal) | main.rs:112:1:119:1 | exit fn let_pattern5 | | | main.rs:112:19:119:1 | { ... } | main.rs:112:1:119:1 | exit fn let_pattern5 (normal) | | -| main.rs:113:5:113:42 | let ... = ... | main.rs:113:14:113:17 | Some | | -| main.rs:113:9:113:10 | s1 | main.rs:113:9:113:10 | s1 | | -| main.rs:113:9:113:10 | s1 | main.rs:116:11:116:12 | s1 | match | -| main.rs:113:14:113:17 | Some | main.rs:113:19:113:30 | ...::from | | -| main.rs:113:14:113:41 | Some(...) | main.rs:113:9:113:10 | s1 | | -| main.rs:113:19:113:30 | ...::from | main.rs:113:32:113:39 | "Hello!" | | -| main.rs:113:19:113:40 | ...::from(...) | main.rs:113:14:113:41 | Some(...) | | -| main.rs:113:32:113:39 | "Hello!" | main.rs:113:19:113:40 | ...::from(...) | | +| main.rs:113:5:113:41 | let ... = ... | main.rs:113:13:113:16 | Some | | +| main.rs:113:9:113:9 | s | main.rs:113:9:113:9 | s | | +| main.rs:113:9:113:9 | s | main.rs:116:11:116:11 | s | match | +| main.rs:113:13:113:16 | Some | main.rs:113:18:113:29 | ...::from | | +| main.rs:113:13:113:40 | Some(...) | main.rs:113:9:113:9 | s | | +| main.rs:113:18:113:29 | ...::from | main.rs:113:31:113:38 | "Hello!" | | +| main.rs:113:18:113:39 | ...::from(...) | main.rs:113:13:113:40 | Some(...) | | +| main.rs:113:31:113:38 | "Hello!" | main.rs:113:18:113:39 | ...::from(...) | | | main.rs:115:5:118:5 | while ... { ... } | main.rs:112:19:119:1 | { ... } | | -| main.rs:115:11:116:12 | [boolean(false)] let ... = s1 | main.rs:115:5:118:5 | while ... { ... } | false | -| main.rs:115:11:116:12 | [boolean(true)] let ... = s1 | main.rs:117:9:117:22 | ExprStmt | true | -| main.rs:115:15:115:26 | Some(...) | main.rs:115:11:116:12 | [boolean(false)] let ... = s1 | no-match | -| main.rs:115:15:115:26 | Some(...) | main.rs:115:24:115:25 | s2 | match | -| main.rs:115:20:115:25 | ref s2 | main.rs:115:11:116:12 | [boolean(true)] let ... = s1 | match | -| main.rs:115:24:115:25 | s2 | main.rs:115:20:115:25 | ref s2 | | -| main.rs:116:11:116:12 | s1 | main.rs:115:15:115:26 | Some(...) | | -| main.rs:116:14:118:5 | { ... } | main.rs:116:11:116:12 | s1 | | -| main.rs:117:9:117:17 | print_str | main.rs:117:19:117:20 | s2 | | -| main.rs:117:9:117:21 | print_str(...) | main.rs:116:14:118:5 | { ... } | | -| main.rs:117:9:117:22 | ExprStmt | main.rs:117:9:117:17 | print_str | | -| main.rs:117:19:117:20 | s2 | main.rs:117:9:117:21 | print_str(...) | | -| main.rs:121:1:136:1 | enter fn match_pattern1 | main.rs:122:5:122:21 | let ... = ... | | -| main.rs:121:1:136:1 | exit fn match_pattern1 (normal) | main.rs:121:1:136:1 | exit fn match_pattern1 | | -| main.rs:121:21:136:1 | { ... } | main.rs:121:1:136:1 | exit fn match_pattern1 (normal) | | -| main.rs:122:5:122:21 | let ... = ... | main.rs:122:14:122:17 | Some | | -| main.rs:122:9:122:10 | x6 | main.rs:122:9:122:10 | x6 | | -| main.rs:122:9:122:10 | x6 | main.rs:123:5:123:16 | let ... = 10 | match | -| main.rs:122:14:122:17 | Some | main.rs:122:19:122:19 | 5 | | -| main.rs:122:14:122:20 | Some(...) | main.rs:122:9:122:10 | x6 | | -| main.rs:122:19:122:19 | 5 | main.rs:122:14:122:20 | Some(...) | | -| main.rs:123:5:123:16 | let ... = 10 | main.rs:123:14:123:15 | 10 | | -| main.rs:123:9:123:10 | y1 | main.rs:123:9:123:10 | y1 | | -| main.rs:123:9:123:10 | y1 | main.rs:125:5:133:5 | ExprStmt | match | -| main.rs:123:14:123:15 | 10 | main.rs:123:9:123:10 | y1 | | -| main.rs:125:5:133:5 | ExprStmt | main.rs:125:11:125:12 | x6 | | -| main.rs:125:5:133:5 | match x6 { ... } | main.rs:135:5:135:18 | ExprStmt | | -| main.rs:125:11:125:12 | x6 | main.rs:126:9:126:16 | Some(...) | | -| main.rs:126:9:126:16 | Some(...) | main.rs:126:14:126:15 | 50 | match | -| main.rs:126:9:126:16 | Some(...) | main.rs:127:9:127:16 | Some(...) | no-match | -| main.rs:126:14:126:15 | 50 | main.rs:126:14:126:15 | 50 | | -| main.rs:126:14:126:15 | 50 | main.rs:126:21:126:29 | print_str | match | -| main.rs:126:14:126:15 | 50 | main.rs:127:9:127:16 | Some(...) | no-match | -| main.rs:126:21:126:29 | print_str | main.rs:126:31:126:38 | "Got 50" | | -| main.rs:126:21:126:39 | print_str(...) | main.rs:125:5:133:5 | match x6 { ... } | | -| main.rs:126:31:126:38 | "Got 50" | main.rs:126:21:126:39 | print_str(...) | | -| main.rs:127:9:127:16 | Some(...) | main.rs:127:14:127:15 | y1 | match | -| main.rs:127:9:127:16 | Some(...) | main.rs:132:9:132:12 | None | no-match | -| main.rs:127:14:127:15 | y1 | main.rs:127:14:127:15 | y1 | | -| main.rs:127:14:127:15 | y1 | main.rs:130:13:130:21 | print_i64 | match | -| main.rs:129:9:131:9 | { ... } | main.rs:125:5:133:5 | match x6 { ... } | | -| main.rs:130:13:130:21 | print_i64 | main.rs:130:23:130:24 | y1 | | -| main.rs:130:13:130:25 | print_i64(...) | main.rs:129:9:131:9 | { ... } | | -| main.rs:130:23:130:24 | y1 | main.rs:130:13:130:25 | print_i64(...) | | -| main.rs:132:9:132:12 | None | main.rs:132:9:132:12 | None | | -| main.rs:132:9:132:12 | None | main.rs:132:17:132:25 | print_str | match | -| main.rs:132:17:132:25 | print_str | main.rs:132:27:132:32 | "NONE" | | -| main.rs:132:17:132:33 | print_str(...) | main.rs:125:5:133:5 | match x6 { ... } | | -| main.rs:132:27:132:32 | "NONE" | main.rs:132:17:132:33 | print_str(...) | | -| main.rs:135:5:135:13 | print_i64 | main.rs:135:15:135:16 | y1 | | -| main.rs:135:5:135:17 | print_i64(...) | main.rs:121:21:136:1 | { ... } | | -| main.rs:135:5:135:18 | ExprStmt | main.rs:135:5:135:13 | print_i64 | | -| main.rs:135:15:135:16 | y1 | main.rs:135:5:135:17 | print_i64(...) | | -| main.rs:138:1:167:1 | enter fn match_pattern2 | main.rs:139:5:139:36 | let ... = ... | | -| main.rs:138:1:167:1 | exit fn match_pattern2 (normal) | main.rs:138:1:167:1 | exit fn match_pattern2 | | -| main.rs:138:21:167:1 | { ... } | main.rs:138:1:167:1 | exit fn match_pattern2 (normal) | | -| main.rs:139:5:139:36 | let ... = ... | main.rs:139:20:139:20 | 2 | | -| main.rs:139:9:139:15 | numbers | main.rs:139:9:139:15 | numbers | | -| main.rs:139:9:139:15 | numbers | main.rs:141:5:154:5 | ExprStmt | match | -| main.rs:139:19:139:35 | TupleExpr | main.rs:139:9:139:15 | numbers | | -| main.rs:139:20:139:20 | 2 | main.rs:139:23:139:23 | 4 | | -| main.rs:139:23:139:23 | 4 | main.rs:139:26:139:26 | 8 | | -| main.rs:139:26:139:26 | 8 | main.rs:139:29:139:30 | 16 | | -| main.rs:139:29:139:30 | 16 | main.rs:139:33:139:34 | 32 | | -| main.rs:139:33:139:34 | 32 | main.rs:139:19:139:35 | TupleExpr | | -| main.rs:141:5:154:5 | ExprStmt | main.rs:141:11:141:17 | numbers | | -| main.rs:141:5:154:5 | match numbers { ... } | main.rs:156:11:156:17 | numbers | | -| main.rs:141:11:141:17 | numbers | main.rs:143:9:149:9 | TuplePat | | -| main.rs:143:9:149:9 | TuplePat | main.rs:144:13:144:17 | first | match | -| main.rs:144:13:144:17 | first | main.rs:144:13:144:17 | first | | -| main.rs:144:13:144:17 | first | main.rs:145:13:145:13 | _ | match | -| main.rs:145:13:145:13 | _ | main.rs:146:13:146:17 | third | match | -| main.rs:146:13:146:17 | third | main.rs:146:13:146:17 | third | | -| main.rs:146:13:146:17 | third | main.rs:147:13:147:13 | _ | match | -| main.rs:147:13:147:13 | _ | main.rs:148:13:148:17 | fifth | match | -| main.rs:148:13:148:17 | fifth | main.rs:148:13:148:17 | fifth | | -| main.rs:148:13:148:17 | fifth | main.rs:150:13:150:29 | ExprStmt | match | -| main.rs:149:14:153:9 | { ... } | main.rs:141:5:154:5 | match numbers { ... } | | -| main.rs:150:13:150:21 | print_i64 | main.rs:150:23:150:27 | first | | -| main.rs:150:13:150:28 | print_i64(...) | main.rs:151:13:151:29 | ExprStmt | | -| main.rs:150:13:150:29 | ExprStmt | main.rs:150:13:150:21 | print_i64 | | -| main.rs:150:23:150:27 | first | main.rs:150:13:150:28 | print_i64(...) | | -| main.rs:151:13:151:21 | print_i64 | main.rs:151:23:151:27 | third | | -| main.rs:151:13:151:28 | print_i64(...) | main.rs:152:13:152:29 | ExprStmt | | -| main.rs:151:13:151:29 | ExprStmt | main.rs:151:13:151:21 | print_i64 | | -| main.rs:151:23:151:27 | third | main.rs:151:13:151:28 | print_i64(...) | | -| main.rs:152:13:152:21 | print_i64 | main.rs:152:23:152:27 | fifth | | -| main.rs:152:13:152:28 | print_i64(...) | main.rs:149:14:153:9 | { ... } | | -| main.rs:152:13:152:29 | ExprStmt | main.rs:152:13:152:21 | print_i64 | | -| main.rs:152:23:152:27 | fifth | main.rs:152:13:152:28 | print_i64(...) | | -| main.rs:156:5:166:5 | match numbers { ... } | main.rs:138:21:167:1 | { ... } | | -| main.rs:156:11:156:17 | numbers | main.rs:158:9:162:9 | TuplePat | | -| main.rs:158:9:162:9 | TuplePat | main.rs:159:13:159:17 | first | match | -| main.rs:159:13:159:17 | first | main.rs:159:13:159:17 | first | | -| main.rs:159:13:159:17 | first | main.rs:160:13:160:14 | .. | match | -| main.rs:160:13:160:14 | .. | main.rs:161:13:161:16 | last | match | -| main.rs:161:13:161:16 | last | main.rs:161:13:161:16 | last | | -| main.rs:161:13:161:16 | last | main.rs:163:13:163:29 | ExprStmt | match | -| main.rs:162:14:165:9 | { ... } | main.rs:156:5:166:5 | match numbers { ... } | | -| main.rs:163:13:163:21 | print_i64 | main.rs:163:23:163:27 | first | | -| main.rs:163:13:163:28 | print_i64(...) | main.rs:164:13:164:28 | ExprStmt | | -| main.rs:163:13:163:29 | ExprStmt | main.rs:163:13:163:21 | print_i64 | | -| main.rs:163:23:163:27 | first | main.rs:163:13:163:28 | print_i64(...) | | -| main.rs:164:13:164:21 | print_i64 | main.rs:164:23:164:26 | last | | -| main.rs:164:13:164:27 | print_i64(...) | main.rs:162:14:165:9 | { ... } | | -| main.rs:164:13:164:28 | ExprStmt | main.rs:164:13:164:21 | print_i64 | | -| main.rs:164:23:164:26 | last | main.rs:164:13:164:27 | print_i64(...) | | -| main.rs:169:1:177:1 | enter fn match_pattern3 | main.rs:170:5:170:38 | let ... = ... | | -| main.rs:169:1:177:1 | exit fn match_pattern3 (normal) | main.rs:169:1:177:1 | exit fn match_pattern3 | | -| main.rs:169:21:177:1 | { ... } | main.rs:169:1:177:1 | exit fn match_pattern3 (normal) | | -| main.rs:170:5:170:38 | let ... = ... | main.rs:170:25:170:27 | "x" | | -| main.rs:170:9:170:10 | p2 | main.rs:170:9:170:10 | p2 | | -| main.rs:170:9:170:10 | p2 | main.rs:172:11:172:12 | p2 | match | -| main.rs:170:14:170:37 | Point {...} | main.rs:170:9:170:10 | p2 | | -| main.rs:170:25:170:27 | "x" | main.rs:170:33:170:35 | "y" | | -| main.rs:170:33:170:35 | "y" | main.rs:170:14:170:37 | Point {...} | | -| main.rs:172:5:176:5 | match p2 { ... } | main.rs:169:21:177:1 | { ... } | | -| main.rs:172:11:172:12 | p2 | main.rs:173:9:175:9 | Point {...} | | -| main.rs:173:9:175:9 | Point {...} | main.rs:174:16:174:17 | x7 | match | -| main.rs:174:16:174:17 | x7 | main.rs:174:16:174:17 | x7 | | -| main.rs:174:16:174:17 | x7 | main.rs:174:20:174:21 | .. | match | -| main.rs:174:20:174:21 | .. | main.rs:175:14:175:22 | print_str | match | -| main.rs:175:14:175:22 | print_str | main.rs:175:24:175:25 | x7 | | -| main.rs:175:14:175:26 | print_str(...) | main.rs:172:5:176:5 | match p2 { ... } | | -| main.rs:175:24:175:25 | x7 | main.rs:175:14:175:26 | print_str(...) | | -| main.rs:183:1:200:1 | enter fn match_pattern4 | main.rs:184:5:184:39 | let ... = ... | | -| main.rs:183:1:200:1 | exit fn match_pattern4 (normal) | main.rs:183:1:200:1 | exit fn match_pattern4 | | -| main.rs:183:21:200:1 | { ... } | main.rs:183:1:200:1 | exit fn match_pattern4 (normal) | | -| main.rs:184:5:184:39 | let ... = ... | main.rs:184:36:184:36 | 0 | | -| main.rs:184:9:184:11 | msg | main.rs:184:9:184:11 | msg | | -| main.rs:184:9:184:11 | msg | main.rs:186:11:186:13 | msg | match | -| main.rs:184:15:184:38 | ...::Hello {...} | main.rs:184:9:184:11 | msg | | -| main.rs:184:36:184:36 | 0 | main.rs:184:15:184:38 | ...::Hello {...} | | -| main.rs:186:5:199:5 | match msg { ... } | main.rs:183:21:200:1 | { ... } | | -| main.rs:186:11:186:13 | msg | main.rs:188:9:190:9 | ...::Hello {...} | | -| main.rs:188:9:190:9 | ...::Hello {...} | main.rs:189:31:189:35 | RangePat | match | -| main.rs:188:9:190:9 | ...::Hello {...} | main.rs:191:9:191:38 | ...::Hello {...} | no-match | -| main.rs:189:17:189:27 | id_variable | main.rs:189:17:189:35 | id_variable @ ... | | -| main.rs:189:17:189:35 | id_variable @ ... | main.rs:190:14:190:22 | print_i64 | match | -| main.rs:189:31:189:31 | 3 | main.rs:189:31:189:31 | 3 | | -| main.rs:189:31:189:31 | 3 | main.rs:189:35:189:35 | 7 | match | -| main.rs:189:31:189:31 | 3 | main.rs:191:9:191:38 | ...::Hello {...} | no-match | -| main.rs:189:31:189:35 | RangePat | main.rs:189:31:189:31 | 3 | match | -| main.rs:189:35:189:35 | 7 | main.rs:189:17:189:27 | id_variable | match | -| main.rs:189:35:189:35 | 7 | main.rs:189:35:189:35 | 7 | | -| main.rs:189:35:189:35 | 7 | main.rs:191:9:191:38 | ...::Hello {...} | no-match | -| main.rs:190:14:190:22 | print_i64 | main.rs:190:24:190:34 | id_variable | | -| main.rs:190:14:190:35 | print_i64(...) | main.rs:186:5:199:5 | match msg { ... } | | -| main.rs:190:24:190:34 | id_variable | main.rs:190:14:190:35 | print_i64(...) | | -| main.rs:191:9:191:38 | ...::Hello {...} | main.rs:191:30:191:36 | RangePat | match | -| main.rs:191:9:191:38 | ...::Hello {...} | main.rs:194:9:194:29 | ...::Hello {...} | no-match | -| main.rs:191:30:191:31 | 10 | main.rs:191:30:191:31 | 10 | | -| main.rs:191:30:191:31 | 10 | main.rs:191:35:191:36 | 12 | match | -| main.rs:191:30:191:31 | 10 | main.rs:194:9:194:29 | ...::Hello {...} | no-match | -| main.rs:191:30:191:36 | RangePat | main.rs:191:30:191:31 | 10 | match | -| main.rs:191:35:191:36 | 12 | main.rs:191:35:191:36 | 12 | | -| main.rs:191:35:191:36 | 12 | main.rs:192:22:192:51 | ExprStmt | match | -| main.rs:191:35:191:36 | 12 | main.rs:194:9:194:29 | ...::Hello {...} | no-match | -| main.rs:191:43:193:9 | { ... } | main.rs:186:5:199:5 | match msg { ... } | | -| main.rs:192:13:192:20 | ...::_print | main.rs:192:22:192:51 | "Found an id in another range\\... | | -| main.rs:192:13:192:52 | MacroExpr | main.rs:191:43:193:9 | { ... } | | -| main.rs:192:13:192:52 | println!... | main.rs:192:13:192:52 | MacroExpr | | -| main.rs:192:22:192:51 | "Found an id in another range\\... | main.rs:192:22:192:51 | FormatArgsExpr | | -| main.rs:192:22:192:51 | ...::_print(...) | main.rs:192:22:192:51 | { ... } | | -| main.rs:192:22:192:51 | ...::format_args_nl!... | main.rs:192:22:192:51 | MacroExpr | | -| main.rs:192:22:192:51 | ExprStmt | main.rs:192:13:192:20 | ...::_print | | -| main.rs:192:22:192:51 | FormatArgsExpr | main.rs:192:22:192:51 | ...::format_args_nl!... | | -| main.rs:192:22:192:51 | MacroExpr | main.rs:192:22:192:51 | ...::_print(...) | | -| main.rs:192:22:192:51 | { ... } | main.rs:192:13:192:52 | println!... | | -| main.rs:192:22:192:51 | { ... } | main.rs:192:22:192:51 | { ... } | | -| main.rs:194:9:194:29 | ...::Hello {...} | main.rs:194:26:194:27 | id | match | -| main.rs:194:26:194:27 | id | main.rs:194:26:194:27 | id | | -| main.rs:194:26:194:27 | id | main.rs:197:13:197:21 | print_i64 | match | -| main.rs:196:9:198:9 | { ... } | main.rs:186:5:199:5 | match msg { ... } | | -| main.rs:197:13:197:21 | print_i64 | main.rs:197:23:197:24 | id | | -| main.rs:197:13:197:25 | print_i64(...) | main.rs:196:9:198:9 | { ... } | | -| main.rs:197:23:197:24 | id | main.rs:197:13:197:25 | print_i64(...) | | -| main.rs:207:1:213:1 | enter fn match_pattern5 | main.rs:208:5:208:34 | let ... = ... | | -| main.rs:207:1:213:1 | exit fn match_pattern5 (normal) | main.rs:207:1:213:1 | exit fn match_pattern5 | | -| main.rs:207:21:213:1 | { ... } | main.rs:207:1:213:1 | exit fn match_pattern5 (normal) | | -| main.rs:208:5:208:34 | let ... = ... | main.rs:208:18:208:29 | ...::Left | | -| main.rs:208:9:208:14 | either | main.rs:208:9:208:14 | either | | -| main.rs:208:9:208:14 | either | main.rs:209:11:209:16 | either | match | -| main.rs:208:18:208:29 | ...::Left | main.rs:208:31:208:32 | 32 | | -| main.rs:208:18:208:33 | ...::Left(...) | main.rs:208:9:208:14 | either | | -| main.rs:208:31:208:32 | 32 | main.rs:208:18:208:33 | ...::Left(...) | | -| main.rs:209:5:212:5 | match either { ... } | main.rs:207:21:213:1 | { ... } | | -| main.rs:209:11:209:16 | either | main.rs:210:9:210:24 | ...::Left(...) | | -| main.rs:210:9:210:24 | ...::Left(...) | main.rs:210:22:210:23 | a3 | match | -| main.rs:210:9:210:24 | ...::Left(...) | main.rs:210:28:210:44 | ...::Right(...) | no-match | -| main.rs:210:9:210:44 | ... \| ... | main.rs:211:16:211:24 | print_i64 | match | -| main.rs:210:22:210:23 | a3 | main.rs:210:9:210:44 | ... \| ... | match | -| main.rs:210:22:210:23 | a3 | main.rs:210:22:210:23 | a3 | | -| main.rs:210:28:210:44 | ...::Right(...) | main.rs:210:42:210:43 | a3 | match | -| main.rs:210:42:210:43 | a3 | main.rs:210:9:210:44 | ... \| ... | match | -| main.rs:210:42:210:43 | a3 | main.rs:210:42:210:43 | a3 | | -| main.rs:211:16:211:24 | print_i64 | main.rs:211:26:211:27 | a3 | | -| main.rs:211:16:211:28 | print_i64(...) | main.rs:209:5:212:5 | match either { ... } | | -| main.rs:211:26:211:27 | a3 | main.rs:211:16:211:28 | print_i64(...) | | -| main.rs:221:1:235:1 | enter fn match_pattern6 | main.rs:222:5:222:37 | let ... = ... | | -| main.rs:221:1:235:1 | exit fn match_pattern6 (normal) | main.rs:221:1:235:1 | exit fn match_pattern6 | | -| main.rs:221:21:235:1 | { ... } | main.rs:221:1:235:1 | exit fn match_pattern6 (normal) | | -| main.rs:222:5:222:37 | let ... = ... | main.rs:222:14:222:32 | ...::Second | | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | | -| main.rs:222:9:222:10 | tv | main.rs:223:5:226:5 | ExprStmt | match | -| main.rs:222:14:222:32 | ...::Second | main.rs:222:34:222:35 | 62 | | -| main.rs:222:14:222:36 | ...::Second(...) | main.rs:222:9:222:10 | tv | | -| main.rs:222:34:222:35 | 62 | main.rs:222:14:222:36 | ...::Second(...) | | -| main.rs:223:5:226:5 | ExprStmt | main.rs:223:11:223:12 | tv | | -| main.rs:223:5:226:5 | match tv { ... } | main.rs:227:5:230:5 | ExprStmt | | -| main.rs:223:11:223:12 | tv | main.rs:224:9:224:30 | ...::First(...) | | -| main.rs:224:9:224:30 | ...::First(...) | main.rs:224:28:224:29 | a4 | match | -| main.rs:224:9:224:30 | ...::First(...) | main.rs:224:34:224:56 | ...::Second(...) | no-match | -| main.rs:224:9:224:81 | ... \| ... \| ... | main.rs:225:16:225:24 | print_i64 | match | -| main.rs:224:28:224:29 | a4 | main.rs:224:9:224:81 | ... \| ... \| ... | match | -| main.rs:224:28:224:29 | a4 | main.rs:224:28:224:29 | a4 | | -| main.rs:224:34:224:56 | ...::Second(...) | main.rs:224:54:224:55 | a4 | match | -| main.rs:224:34:224:56 | ...::Second(...) | main.rs:224:60:224:81 | ...::Third(...) | no-match | -| main.rs:224:54:224:55 | a4 | main.rs:224:9:224:81 | ... \| ... \| ... | match | -| main.rs:224:54:224:55 | a4 | main.rs:224:54:224:55 | a4 | | -| main.rs:224:60:224:81 | ...::Third(...) | main.rs:224:79:224:80 | a4 | match | -| main.rs:224:79:224:80 | a4 | main.rs:224:9:224:81 | ... \| ... \| ... | match | -| main.rs:224:79:224:80 | a4 | main.rs:224:79:224:80 | a4 | | -| main.rs:225:16:225:24 | print_i64 | main.rs:225:26:225:27 | a4 | | -| main.rs:225:16:225:28 | print_i64(...) | main.rs:223:5:226:5 | match tv { ... } | | -| main.rs:225:26:225:27 | a4 | main.rs:225:16:225:28 | print_i64(...) | | -| main.rs:227:5:230:5 | ExprStmt | main.rs:227:11:227:12 | tv | | -| main.rs:227:5:230:5 | match tv { ... } | main.rs:231:11:231:12 | tv | | -| main.rs:227:11:227:12 | tv | main.rs:228:10:228:31 | ...::First(...) | | -| main.rs:228:9:228:83 | ... \| ... | main.rs:229:16:229:24 | print_i64 | match | -| main.rs:228:10:228:31 | ...::First(...) | main.rs:228:29:228:30 | a5 | match | -| main.rs:228:10:228:31 | ...::First(...) | main.rs:228:35:228:57 | ...::Second(...) | no-match | -| main.rs:228:10:228:57 | [match(false)] ... \| ... | main.rs:228:62:228:83 | ...::Third(...) | no-match | -| main.rs:228:10:228:57 | [match(true)] ... \| ... | main.rs:228:9:228:83 | ... \| ... | match | -| main.rs:228:29:228:30 | a5 | main.rs:228:10:228:57 | [match(true)] ... \| ... | match | -| main.rs:228:29:228:30 | a5 | main.rs:228:29:228:30 | a5 | | -| main.rs:228:35:228:57 | ...::Second(...) | main.rs:228:10:228:57 | [match(false)] ... \| ... | no-match | -| main.rs:228:35:228:57 | ...::Second(...) | main.rs:228:55:228:56 | a5 | match | -| main.rs:228:55:228:56 | a5 | main.rs:228:10:228:57 | [match(true)] ... \| ... | match | -| main.rs:228:55:228:56 | a5 | main.rs:228:55:228:56 | a5 | | -| main.rs:228:62:228:83 | ...::Third(...) | main.rs:228:81:228:82 | a5 | match | -| main.rs:228:81:228:82 | a5 | main.rs:228:9:228:83 | ... \| ... | match | -| main.rs:228:81:228:82 | a5 | main.rs:228:81:228:82 | a5 | | -| main.rs:229:16:229:24 | print_i64 | main.rs:229:26:229:27 | a5 | | -| main.rs:229:16:229:28 | print_i64(...) | main.rs:227:5:230:5 | match tv { ... } | | -| main.rs:229:26:229:27 | a5 | main.rs:229:16:229:28 | print_i64(...) | | -| main.rs:231:5:234:5 | match tv { ... } | main.rs:221:21:235:1 | { ... } | | -| main.rs:231:11:231:12 | tv | main.rs:232:9:232:30 | ...::First(...) | | -| main.rs:232:9:232:30 | ...::First(...) | main.rs:232:28:232:29 | a6 | match | -| main.rs:232:9:232:30 | ...::First(...) | main.rs:232:35:232:57 | ...::Second(...) | no-match | -| main.rs:232:9:232:83 | ... \| ... | main.rs:233:16:233:24 | print_i64 | match | -| main.rs:232:28:232:29 | a6 | main.rs:232:9:232:83 | ... \| ... | match | -| main.rs:232:28:232:29 | a6 | main.rs:232:28:232:29 | a6 | | -| main.rs:232:35:232:57 | ...::Second(...) | main.rs:232:55:232:56 | a6 | match | -| main.rs:232:35:232:57 | ...::Second(...) | main.rs:232:61:232:82 | ...::Third(...) | no-match | -| main.rs:232:35:232:82 | ... \| ... | main.rs:232:9:232:83 | ... \| ... | match | -| main.rs:232:55:232:56 | a6 | main.rs:232:35:232:82 | ... \| ... | match | -| main.rs:232:55:232:56 | a6 | main.rs:232:55:232:56 | a6 | | -| main.rs:232:61:232:82 | ...::Third(...) | main.rs:232:80:232:81 | a6 | match | -| main.rs:232:80:232:81 | a6 | main.rs:232:35:232:82 | ... \| ... | match | -| main.rs:232:80:232:81 | a6 | main.rs:232:80:232:81 | a6 | | -| main.rs:233:16:233:24 | print_i64 | main.rs:233:26:233:27 | a6 | | -| main.rs:233:16:233:28 | print_i64(...) | main.rs:231:5:234:5 | match tv { ... } | | -| main.rs:233:26:233:27 | a6 | main.rs:233:16:233:28 | print_i64(...) | | -| main.rs:237:1:245:1 | enter fn match_pattern7 | main.rs:238:5:238:34 | let ... = ... | | -| main.rs:237:1:245:1 | exit fn match_pattern7 (normal) | main.rs:237:1:245:1 | exit fn match_pattern7 | | -| main.rs:237:21:245:1 | { ... } | main.rs:237:1:245:1 | exit fn match_pattern7 (normal) | | -| main.rs:238:5:238:34 | let ... = ... | main.rs:238:18:238:29 | ...::Left | | -| main.rs:238:9:238:14 | either | main.rs:238:9:238:14 | either | | -| main.rs:238:9:238:14 | either | main.rs:239:11:239:16 | either | match | -| main.rs:238:18:238:29 | ...::Left | main.rs:238:31:238:32 | 32 | | -| main.rs:238:18:238:33 | ...::Left(...) | main.rs:238:9:238:14 | either | | -| main.rs:238:31:238:32 | 32 | main.rs:238:18:238:33 | ...::Left(...) | | -| main.rs:239:5:244:5 | match either { ... } | main.rs:237:21:245:1 | { ... } | | -| main.rs:239:11:239:16 | either | main.rs:240:9:240:24 | ...::Left(...) | | -| main.rs:240:9:240:24 | ...::Left(...) | main.rs:240:22:240:23 | a7 | match | -| main.rs:240:9:240:24 | ...::Left(...) | main.rs:240:28:240:44 | ...::Right(...) | no-match | -| main.rs:240:9:240:44 | [match(false)] ... \| ... | main.rs:243:9:243:9 | _ | no-match | -| main.rs:240:9:240:44 | [match(true)] ... \| ... | main.rs:241:16:241:17 | a7 | match | -| main.rs:240:22:240:23 | a7 | main.rs:240:9:240:44 | [match(true)] ... \| ... | match | -| main.rs:240:22:240:23 | a7 | main.rs:240:22:240:23 | a7 | | -| main.rs:240:28:240:44 | ...::Right(...) | main.rs:240:9:240:44 | [match(false)] ... \| ... | no-match | -| main.rs:240:28:240:44 | ...::Right(...) | main.rs:240:42:240:43 | a7 | match | -| main.rs:240:42:240:43 | a7 | main.rs:240:9:240:44 | [match(true)] ... \| ... | match | -| main.rs:240:42:240:43 | a7 | main.rs:240:42:240:43 | a7 | | -| main.rs:241:16:241:17 | a7 | main.rs:241:21:241:21 | 0 | | -| main.rs:241:16:241:21 | ... > ... | main.rs:242:16:242:24 | print_i64 | true | -| main.rs:241:16:241:21 | ... > ... | main.rs:243:9:243:9 | _ | false | -| main.rs:241:21:241:21 | 0 | main.rs:241:16:241:21 | ... > ... | | -| main.rs:242:16:242:24 | print_i64 | main.rs:242:26:242:27 | a7 | | -| main.rs:242:16:242:28 | print_i64(...) | main.rs:239:5:244:5 | match either { ... } | | -| main.rs:242:26:242:27 | a7 | main.rs:242:16:242:28 | print_i64(...) | | -| main.rs:243:9:243:9 | _ | main.rs:243:14:243:15 | TupleExpr | match | -| main.rs:243:14:243:15 | TupleExpr | main.rs:239:5:244:5 | match either { ... } | | -| main.rs:247:1:262:1 | enter fn match_pattern8 | main.rs:248:5:248:34 | let ... = ... | | -| main.rs:247:1:262:1 | exit fn match_pattern8 (normal) | main.rs:247:1:262:1 | exit fn match_pattern8 | | -| main.rs:247:21:262:1 | { ... } | main.rs:247:1:262:1 | exit fn match_pattern8 (normal) | | -| main.rs:248:5:248:34 | let ... = ... | main.rs:248:18:248:29 | ...::Left | | -| main.rs:248:9:248:14 | either | main.rs:248:9:248:14 | either | | -| main.rs:248:9:248:14 | either | main.rs:250:11:250:16 | either | match | -| main.rs:248:18:248:29 | ...::Left | main.rs:248:31:248:32 | 32 | | -| main.rs:248:18:248:33 | ...::Left(...) | main.rs:248:9:248:14 | either | | -| main.rs:248:31:248:32 | 32 | main.rs:248:18:248:33 | ...::Left(...) | | -| main.rs:250:5:261:5 | match either { ... } | main.rs:247:21:262:1 | { ... } | | -| main.rs:250:11:250:16 | either | main.rs:252:14:252:30 | ...::Left(...) | | -| main.rs:251:9:252:52 | ref e @ ... | main.rs:254:13:254:27 | ExprStmt | match | -| main.rs:251:13:251:13 | e | main.rs:251:9:252:52 | ref e @ ... | | -| main.rs:252:14:252:30 | ...::Left(...) | main.rs:252:27:252:29 | a11 | match | -| main.rs:252:14:252:30 | ...::Left(...) | main.rs:252:34:252:51 | ...::Right(...) | no-match | -| main.rs:252:14:252:51 | [match(false)] ... \| ... | main.rs:260:9:260:9 | _ | no-match | -| main.rs:252:14:252:51 | [match(true)] ... \| ... | main.rs:251:13:251:13 | e | match | -| main.rs:252:27:252:29 | a11 | main.rs:252:14:252:51 | [match(true)] ... \| ... | match | -| main.rs:252:27:252:29 | a11 | main.rs:252:27:252:29 | a11 | | -| main.rs:252:34:252:51 | ...::Right(...) | main.rs:252:14:252:51 | [match(false)] ... \| ... | no-match | -| main.rs:252:34:252:51 | ...::Right(...) | main.rs:252:48:252:50 | a11 | match | -| main.rs:252:48:252:50 | a11 | main.rs:252:14:252:51 | [match(true)] ... \| ... | match | -| main.rs:252:48:252:50 | a11 | main.rs:252:48:252:50 | a11 | | -| main.rs:253:12:259:9 | { ... } | main.rs:250:5:261:5 | match either { ... } | | -| main.rs:254:13:254:21 | print_i64 | main.rs:254:23:254:25 | a11 | | -| main.rs:254:13:254:26 | print_i64(...) | main.rs:256:15:256:15 | e | | -| main.rs:254:13:254:27 | ExprStmt | main.rs:254:13:254:21 | print_i64 | | -| main.rs:254:23:254:25 | a11 | main.rs:254:13:254:26 | print_i64(...) | | -| main.rs:255:13:258:13 | if ... {...} | main.rs:253:12:259:9 | { ... } | | -| main.rs:255:16:256:15 | [boolean(false)] let ... = e | main.rs:255:13:258:13 | if ... {...} | false | -| main.rs:255:16:256:15 | [boolean(true)] let ... = e | main.rs:257:17:257:32 | ExprStmt | true | -| main.rs:255:20:255:36 | ...::Left(...) | main.rs:255:16:256:15 | [boolean(false)] let ... = e | no-match | -| main.rs:255:20:255:36 | ...::Left(...) | main.rs:255:33:255:35 | a12 | match | -| main.rs:255:33:255:35 | a12 | main.rs:255:16:256:15 | [boolean(true)] let ... = e | match | -| main.rs:255:33:255:35 | a12 | main.rs:255:33:255:35 | a12 | | -| main.rs:256:15:256:15 | e | main.rs:255:20:255:36 | ...::Left(...) | | -| main.rs:256:17:258:13 | { ... } | main.rs:255:13:258:13 | if ... {...} | | -| main.rs:257:17:257:25 | print_i64 | main.rs:257:28:257:30 | a12 | | -| main.rs:257:17:257:31 | print_i64(...) | main.rs:256:17:258:13 | { ... } | | -| main.rs:257:17:257:32 | ExprStmt | main.rs:257:17:257:25 | print_i64 | | -| main.rs:257:27:257:30 | * ... | main.rs:257:17:257:31 | print_i64(...) | | -| main.rs:257:28:257:30 | a12 | main.rs:257:27:257:30 | * ... | | -| main.rs:260:9:260:9 | _ | main.rs:260:14:260:15 | TupleExpr | match | -| main.rs:260:14:260:15 | TupleExpr | main.rs:250:5:261:5 | match either { ... } | | -| main.rs:271:1:277:1 | enter fn match_pattern9 | main.rs:272:5:272:36 | let ... = ... | | -| main.rs:271:1:277:1 | exit fn match_pattern9 (normal) | main.rs:271:1:277:1 | exit fn match_pattern9 | | -| main.rs:271:21:277:1 | { ... } | main.rs:271:1:277:1 | exit fn match_pattern9 (normal) | | -| main.rs:272:5:272:36 | let ... = ... | main.rs:272:14:272:31 | ...::Second | | -| main.rs:272:9:272:10 | fv | main.rs:272:9:272:10 | fv | | -| main.rs:272:9:272:10 | fv | main.rs:273:11:273:12 | fv | match | -| main.rs:272:14:272:31 | ...::Second | main.rs:272:33:272:34 | 62 | | -| main.rs:272:14:272:35 | ...::Second(...) | main.rs:272:9:272:10 | fv | | -| main.rs:272:33:272:34 | 62 | main.rs:272:14:272:35 | ...::Second(...) | | -| main.rs:273:5:276:5 | match fv { ... } | main.rs:271:21:277:1 | { ... } | | -| main.rs:273:11:273:12 | fv | main.rs:274:9:274:30 | ...::First(...) | | -| main.rs:274:9:274:30 | ...::First(...) | main.rs:274:27:274:29 | a13 | match | -| main.rs:274:9:274:30 | ...::First(...) | main.rs:274:35:274:57 | ...::Second(...) | no-match | -| main.rs:274:9:274:109 | ... \| ... \| ... | main.rs:275:16:275:24 | print_i64 | match | -| main.rs:274:27:274:29 | a13 | main.rs:274:9:274:109 | ... \| ... \| ... | match | -| main.rs:274:27:274:29 | a13 | main.rs:274:27:274:29 | a13 | | -| main.rs:274:35:274:57 | ...::Second(...) | main.rs:274:54:274:56 | a13 | match | -| main.rs:274:35:274:57 | ...::Second(...) | main.rs:274:61:274:82 | ...::Third(...) | no-match | -| main.rs:274:35:274:82 | [match(false)] ... \| ... | main.rs:274:87:274:109 | ...::Fourth(...) | no-match | -| main.rs:274:35:274:82 | [match(true)] ... \| ... | main.rs:274:9:274:109 | ... \| ... \| ... | match | -| main.rs:274:54:274:56 | a13 | main.rs:274:35:274:82 | [match(true)] ... \| ... | match | -| main.rs:274:54:274:56 | a13 | main.rs:274:54:274:56 | a13 | | -| main.rs:274:61:274:82 | ...::Third(...) | main.rs:274:35:274:82 | [match(false)] ... \| ... | no-match | -| main.rs:274:61:274:82 | ...::Third(...) | main.rs:274:79:274:81 | a13 | match | -| main.rs:274:79:274:81 | a13 | main.rs:274:35:274:82 | [match(true)] ... \| ... | match | -| main.rs:274:79:274:81 | a13 | main.rs:274:79:274:81 | a13 | | -| main.rs:274:87:274:109 | ...::Fourth(...) | main.rs:274:106:274:108 | a13 | match | -| main.rs:274:106:274:108 | a13 | main.rs:274:9:274:109 | ... \| ... \| ... | match | -| main.rs:274:106:274:108 | a13 | main.rs:274:106:274:108 | a13 | | -| main.rs:275:16:275:24 | print_i64 | main.rs:275:26:275:28 | a13 | | -| main.rs:275:16:275:29 | print_i64(...) | main.rs:273:5:276:5 | match fv { ... } | | -| main.rs:275:26:275:28 | a13 | main.rs:275:16:275:29 | print_i64(...) | | -| main.rs:279:1:293:1 | enter fn match_pattern10 | main.rs:281:5:281:20 | let ... = ... | | -| main.rs:279:1:293:1 | exit fn match_pattern10 (normal) | main.rs:279:1:293:1 | exit fn match_pattern10 | | -| main.rs:280:22:293:1 | { ... } | main.rs:279:1:293:1 | exit fn match_pattern10 (normal) | | -| main.rs:281:5:281:20 | let ... = ... | main.rs:281:12:281:15 | Some | | -| main.rs:281:9:281:9 | x | main.rs:281:9:281:9 | x | | -| main.rs:281:9:281:9 | x | main.rs:283:7:283:7 | x | match | -| main.rs:281:12:281:15 | Some | main.rs:281:17:281:18 | 42 | | -| main.rs:281:12:281:19 | Some(...) | main.rs:281:9:281:9 | x | | -| main.rs:281:17:281:18 | 42 | main.rs:281:12:281:19 | Some(...) | | -| main.rs:282:5:292:5 | if ... {...} else {...} | main.rs:280:22:293:1 | { ... } | | -| main.rs:282:8:283:7 | [boolean(false)] let ... = x | main.rs:282:8:285:9 | [boolean(false)] ... && ... | false | -| main.rs:282:8:283:7 | [boolean(true)] let ... = x | main.rs:285:5:285:5 | x | true | -| main.rs:282:8:285:9 | [boolean(false)] ... && ... | main.rs:289:9:290:14 | let ... = x | false | -| main.rs:282:8:285:9 | [boolean(true)] ... && ... | main.rs:287:9:287:21 | ExprStmt | true | -| main.rs:282:12:282:18 | Some(...) | main.rs:282:8:283:7 | [boolean(false)] let ... = x | no-match | -| main.rs:282:12:282:18 | Some(...) | main.rs:282:17:282:17 | x | match | -| main.rs:282:17:282:17 | x | main.rs:282:8:283:7 | [boolean(true)] let ... = x | match | -| main.rs:282:17:282:17 | x | main.rs:282:17:282:17 | x | | -| main.rs:283:7:283:7 | x | main.rs:282:12:282:18 | Some(...) | | -| main.rs:285:5:285:5 | x | main.rs:285:9:285:9 | 0 | | -| main.rs:285:5:285:9 | ... > ... | main.rs:282:8:285:9 | [boolean(false)] ... && ... | false | -| main.rs:285:5:285:9 | ... > ... | main.rs:282:8:285:9 | [boolean(true)] ... && ... | true | -| main.rs:285:9:285:9 | 0 | main.rs:285:5:285:9 | ... > ... | | -| main.rs:286:5:288:5 | { ... } | main.rs:282:5:292:5 | if ... {...} else {...} | | -| main.rs:287:9:287:17 | print_i64 | main.rs:287:19:287:19 | x | | -| main.rs:287:9:287:20 | print_i64(...) | main.rs:286:5:288:5 | { ... } | | -| main.rs:287:9:287:21 | ExprStmt | main.rs:287:9:287:17 | print_i64 | | -| main.rs:287:19:287:19 | x | main.rs:287:9:287:20 | print_i64(...) | | -| main.rs:288:12:292:5 | { ... } | main.rs:282:5:292:5 | if ... {...} else {...} | | -| main.rs:289:9:290:14 | let ... = x | main.rs:290:13:290:13 | x | | -| main.rs:289:13:289:13 | x | main.rs:289:13:289:13 | x | | -| main.rs:289:13:289:13 | x | main.rs:291:9:291:30 | ExprStmt | match | -| main.rs:290:13:290:13 | x | main.rs:289:13:289:13 | x | | -| main.rs:291:9:291:17 | print_i64 | main.rs:291:19:291:19 | x | | -| main.rs:291:9:291:29 | print_i64(...) | main.rs:288:12:292:5 | { ... } | | -| main.rs:291:9:291:30 | ExprStmt | main.rs:291:9:291:17 | print_i64 | | -| main.rs:291:19:291:19 | x | main.rs:291:19:291:28 | x.unwrap() | | -| main.rs:291:19:291:28 | x.unwrap() | main.rs:291:9:291:29 | print_i64(...) | | -| main.rs:295:1:312:1 | enter fn match_pattern11 | main.rs:297:5:297:21 | let ... = ... | | -| main.rs:295:1:312:1 | exit fn match_pattern11 (normal) | main.rs:295:1:312:1 | exit fn match_pattern11 | | -| main.rs:296:22:312:1 | { ... } | main.rs:295:1:312:1 | exit fn match_pattern11 (normal) | | -| main.rs:297:5:297:21 | let ... = ... | main.rs:297:13:297:16 | Some | | -| main.rs:297:9:297:9 | x | main.rs:297:9:297:9 | x | | -| main.rs:297:9:297:9 | x | main.rs:299:7:299:7 | x | match | -| main.rs:297:13:297:16 | Some | main.rs:297:18:297:19 | 42 | | -| main.rs:297:13:297:20 | Some(...) | main.rs:297:9:297:9 | x | | -| main.rs:297:18:297:19 | 42 | main.rs:297:13:297:20 | Some(...) | | -| main.rs:298:5:311:5 | if ... {...} else {...} | main.rs:296:22:312:1 | { ... } | | -| main.rs:298:8:299:7 | [boolean(false)] let ... = x | main.rs:298:8:302:13 | [boolean(false)] ... && ... | false | -| main.rs:298:8:299:7 | [boolean(true)] let ... = x | main.rs:302:7:302:10 | Some | true | -| main.rs:298:8:302:13 | [boolean(false)] ... && ... | main.rs:298:8:304:9 | [boolean(false)] ... && ... | false | -| main.rs:298:8:302:13 | [boolean(true)] ... && ... | main.rs:304:5:304:5 | x | true | -| main.rs:298:8:304:9 | [boolean(false)] ... && ... | main.rs:308:9:309:14 | let ... = x | false | -| main.rs:298:8:304:9 | [boolean(true)] ... && ... | main.rs:306:9:306:21 | ExprStmt | true | -| main.rs:298:12:298:18 | Some(...) | main.rs:298:8:299:7 | [boolean(false)] let ... = x | no-match | -| main.rs:298:12:298:18 | Some(...) | main.rs:298:17:298:17 | x | match | -| main.rs:298:17:298:17 | x | main.rs:298:8:299:7 | [boolean(true)] let ... = x | match | -| main.rs:298:17:298:17 | x | main.rs:298:17:298:17 | x | | -| main.rs:299:7:299:7 | x | main.rs:298:12:298:18 | Some(...) | | -| main.rs:301:5:302:13 | [boolean(false)] let ... = ... | main.rs:298:8:302:13 | [boolean(false)] ... && ... | false | -| main.rs:301:5:302:13 | [boolean(true)] let ... = ... | main.rs:298:8:302:13 | [boolean(true)] ... && ... | true | -| main.rs:301:9:301:15 | Some(...) | main.rs:301:5:302:13 | [boolean(false)] let ... = ... | no-match | -| main.rs:301:9:301:15 | Some(...) | main.rs:301:14:301:14 | x | match | -| main.rs:301:14:301:14 | x | main.rs:301:5:302:13 | [boolean(true)] let ... = ... | match | -| main.rs:301:14:301:14 | x | main.rs:301:14:301:14 | x | | -| main.rs:302:7:302:10 | Some | main.rs:302:12:302:12 | x | | -| main.rs:302:7:302:13 | Some(...) | main.rs:301:9:301:15 | Some(...) | | -| main.rs:302:12:302:12 | x | main.rs:302:7:302:13 | Some(...) | | -| main.rs:304:5:304:5 | x | main.rs:304:9:304:9 | 0 | | -| main.rs:304:5:304:9 | ... > ... | main.rs:298:8:304:9 | [boolean(false)] ... && ... | false | -| main.rs:304:5:304:9 | ... > ... | main.rs:298:8:304:9 | [boolean(true)] ... && ... | true | -| main.rs:304:9:304:9 | 0 | main.rs:304:5:304:9 | ... > ... | | -| main.rs:305:5:307:5 | { ... } | main.rs:298:5:311:5 | if ... {...} else {...} | | -| main.rs:306:9:306:17 | print_i64 | main.rs:306:19:306:19 | x | | -| main.rs:306:9:306:20 | print_i64(...) | main.rs:305:5:307:5 | { ... } | | -| main.rs:306:9:306:21 | ExprStmt | main.rs:306:9:306:17 | print_i64 | | -| main.rs:306:19:306:19 | x | main.rs:306:9:306:20 | print_i64(...) | | -| main.rs:307:12:311:5 | { ... } | main.rs:298:5:311:5 | if ... {...} else {...} | | -| main.rs:308:9:309:14 | let ... = x | main.rs:309:13:309:13 | x | | -| main.rs:308:13:308:13 | x | main.rs:308:13:308:13 | x | | -| main.rs:308:13:308:13 | x | main.rs:310:9:310:30 | ExprStmt | match | -| main.rs:309:13:309:13 | x | main.rs:308:13:308:13 | x | | -| main.rs:310:9:310:17 | print_i64 | main.rs:310:19:310:19 | x | | -| main.rs:310:9:310:29 | print_i64(...) | main.rs:307:12:311:5 | { ... } | | -| main.rs:310:9:310:30 | ExprStmt | main.rs:310:9:310:17 | print_i64 | | -| main.rs:310:19:310:19 | x | main.rs:310:19:310:28 | x.unwrap() | | -| main.rs:310:19:310:28 | x.unwrap() | main.rs:310:9:310:29 | print_i64(...) | | -| main.rs:314:1:330:1 | enter fn match_pattern12 | main.rs:316:5:316:21 | let ... = ... | | -| main.rs:314:1:330:1 | exit fn match_pattern12 (normal) | main.rs:314:1:330:1 | exit fn match_pattern12 | | -| main.rs:315:22:330:1 | { ... } | main.rs:314:1:330:1 | exit fn match_pattern12 (normal) | | -| main.rs:316:5:316:21 | let ... = ... | main.rs:316:13:316:16 | Some | | +| main.rs:115:11:116:11 | [boolean(false)] let ... = s | main.rs:115:5:118:5 | while ... { ... } | false | +| main.rs:115:11:116:11 | [boolean(true)] let ... = s | main.rs:117:9:117:21 | ExprStmt | true | +| main.rs:115:15:115:25 | Some(...) | main.rs:115:11:116:11 | [boolean(false)] let ... = s | no-match | +| main.rs:115:15:115:25 | Some(...) | main.rs:115:24:115:24 | s | match | +| main.rs:115:20:115:24 | ref s | main.rs:115:11:116:11 | [boolean(true)] let ... = s | match | +| main.rs:115:24:115:24 | s | main.rs:115:20:115:24 | ref s | | +| main.rs:116:11:116:11 | s | main.rs:115:15:115:25 | Some(...) | | +| main.rs:116:13:118:5 | { ... } | main.rs:116:11:116:11 | s | | +| main.rs:117:9:117:17 | print_str | main.rs:117:19:117:19 | s | | +| main.rs:117:9:117:20 | print_str(...) | main.rs:116:13:118:5 | { ... } | | +| main.rs:117:9:117:21 | ExprStmt | main.rs:117:9:117:17 | print_str | | +| main.rs:117:19:117:19 | s | main.rs:117:9:117:20 | print_str(...) | | +| main.rs:121:1:129:1 | enter fn let_pattern6 | main.rs:123:22:123:25 | Some | | +| main.rs:121:1:129:1 | exit fn let_pattern6 (normal) | main.rs:121:1:129:1 | exit fn let_pattern6 | | +| main.rs:122:19:129:1 | { ... } | main.rs:121:1:129:1 | exit fn let_pattern6 (normal) | | +| main.rs:123:5:128:5 | if ... {...} | main.rs:122:19:129:1 | { ... } | | +| main.rs:123:8:123:29 | [boolean(false)] let ... = ... | main.rs:123:8:125:26 | [boolean(false)] ... && ... | false | +| main.rs:123:8:123:29 | [boolean(true)] let ... = ... | main.rs:125:13:125:23 | Ok::<...> | true | +| main.rs:123:8:125:26 | [boolean(false)] ... && ... | main.rs:123:5:128:5 | if ... {...} | false | +| main.rs:123:8:125:26 | [boolean(true)] ... && ... | main.rs:127:9:127:21 | ExprStmt | true | +| main.rs:123:12:123:18 | Some(...) | main.rs:123:8:123:29 | [boolean(false)] let ... = ... | no-match | +| main.rs:123:12:123:18 | Some(...) | main.rs:123:17:123:17 | x | match | +| main.rs:123:17:123:17 | x | main.rs:123:8:123:29 | [boolean(true)] let ... = ... | match | +| main.rs:123:17:123:17 | x | main.rs:123:17:123:17 | x | | +| main.rs:123:22:123:25 | Some | main.rs:123:27:123:28 | 43 | | +| main.rs:123:22:123:29 | Some(...) | main.rs:123:12:123:18 | Some(...) | | +| main.rs:123:27:123:28 | 43 | main.rs:123:22:123:29 | Some(...) | | +| main.rs:124:12:125:26 | [boolean(false)] let ... = ... | main.rs:123:8:125:26 | [boolean(false)] ... && ... | false | +| main.rs:124:12:125:26 | [boolean(true)] let ... = ... | main.rs:123:8:125:26 | [boolean(true)] ... && ... | true | +| main.rs:124:16:124:20 | Ok(...) | main.rs:124:12:125:26 | [boolean(false)] let ... = ... | no-match | +| main.rs:124:16:124:20 | Ok(...) | main.rs:124:19:124:19 | x | match | +| main.rs:124:19:124:19 | x | main.rs:124:12:125:26 | [boolean(true)] let ... = ... | match | +| main.rs:124:19:124:19 | x | main.rs:124:19:124:19 | x | | +| main.rs:125:13:125:23 | Ok::<...> | main.rs:125:25:125:25 | x | | +| main.rs:125:13:125:26 | Ok::<...>(...) | main.rs:124:16:124:20 | Ok(...) | | +| main.rs:125:25:125:25 | x | main.rs:125:13:125:26 | Ok::<...>(...) | | +| main.rs:126:5:128:5 | { ... } | main.rs:123:5:128:5 | if ... {...} | | +| main.rs:127:9:127:17 | print_i64 | main.rs:127:19:127:19 | x | | +| main.rs:127:9:127:20 | print_i64(...) | main.rs:126:5:128:5 | { ... } | | +| main.rs:127:9:127:21 | ExprStmt | main.rs:127:9:127:17 | print_i64 | | +| main.rs:127:19:127:19 | x | main.rs:127:9:127:20 | print_i64(...) | | +| main.rs:131:1:154:1 | enter fn let_pattern7 | main.rs:133:5:133:14 | let ... = 1 | | +| main.rs:131:1:154:1 | exit fn let_pattern7 (normal) | main.rs:131:1:154:1 | exit fn let_pattern7 | | +| main.rs:132:19:154:1 | { ... } | main.rs:131:1:154:1 | exit fn let_pattern7 (normal) | | +| main.rs:133:5:133:14 | let ... = 1 | main.rs:133:13:133:13 | 1 | | +| main.rs:133:9:133:9 | x | main.rs:133:9:133:9 | x | | +| main.rs:133:9:133:9 | x | main.rs:135:9:135:9 | x | match | +| main.rs:133:13:133:13 | 1 | main.rs:133:9:133:9 | x | | +| main.rs:134:5:153:5 | if ... {...} else {...} | main.rs:132:19:154:1 | { ... } | | +| main.rs:134:8:135:13 | [boolean(true)] let ... = ... | main.rs:137:9:137:9 | x | true | +| main.rs:134:8:137:13 | [boolean(true)] ... && ... | main.rs:139:9:139:9 | x | true | +| main.rs:134:8:139:13 | [boolean(true)] ... && ... | main.rs:141:9:141:9 | x | true | +| main.rs:134:8:141:13 | [boolean(true)] ... && ... | main.rs:143:9:143:9 | x | true | +| main.rs:134:8:143:13 | [boolean(true)] ... && ... | main.rs:145:9:145:9 | x | true | +| main.rs:134:8:145:13 | [boolean(true)] ... && ... | main.rs:147:9:147:9 | x | true | +| main.rs:134:8:147:13 | [boolean(true)] ... && ... | main.rs:149:9:149:21 | ExprStmt | true | +| main.rs:134:12:134:12 | x | main.rs:134:8:135:13 | [boolean(true)] let ... = ... | match | +| main.rs:134:12:134:12 | x | main.rs:134:12:134:12 | x | | +| main.rs:135:9:135:9 | x | main.rs:135:13:135:13 | 1 | | +| main.rs:135:9:135:13 | ... + ... | main.rs:134:12:134:12 | x | | +| main.rs:135:13:135:13 | 1 | main.rs:135:9:135:13 | ... + ... | | +| main.rs:136:8:137:13 | [boolean(true)] let ... = ... | main.rs:134:8:137:13 | [boolean(true)] ... && ... | true | +| main.rs:136:12:136:12 | x | main.rs:136:8:137:13 | [boolean(true)] let ... = ... | match | +| main.rs:136:12:136:12 | x | main.rs:136:12:136:12 | x | | +| main.rs:137:9:137:9 | x | main.rs:137:13:137:13 | 1 | | +| main.rs:137:9:137:13 | ... + ... | main.rs:136:12:136:12 | x | | +| main.rs:137:13:137:13 | 1 | main.rs:137:9:137:13 | ... + ... | | +| main.rs:138:8:139:13 | [boolean(true)] let ... = ... | main.rs:134:8:139:13 | [boolean(true)] ... && ... | true | +| main.rs:138:12:138:12 | x | main.rs:138:8:139:13 | [boolean(true)] let ... = ... | match | +| main.rs:138:12:138:12 | x | main.rs:138:12:138:12 | x | | +| main.rs:139:9:139:9 | x | main.rs:139:13:139:13 | 1 | | +| main.rs:139:9:139:13 | ... + ... | main.rs:138:12:138:12 | x | | +| main.rs:139:13:139:13 | 1 | main.rs:139:9:139:13 | ... + ... | | +| main.rs:140:8:141:13 | [boolean(true)] let ... = ... | main.rs:134:8:141:13 | [boolean(true)] ... && ... | true | +| main.rs:140:12:140:12 | x | main.rs:140:8:141:13 | [boolean(true)] let ... = ... | match | +| main.rs:140:12:140:12 | x | main.rs:140:12:140:12 | x | | +| main.rs:141:9:141:9 | x | main.rs:141:13:141:13 | 1 | | +| main.rs:141:9:141:13 | ... + ... | main.rs:140:12:140:12 | x | | +| main.rs:141:13:141:13 | 1 | main.rs:141:9:141:13 | ... + ... | | +| main.rs:142:8:143:13 | [boolean(true)] let ... = ... | main.rs:134:8:143:13 | [boolean(true)] ... && ... | true | +| main.rs:142:12:142:12 | x | main.rs:142:8:143:13 | [boolean(true)] let ... = ... | match | +| main.rs:142:12:142:12 | x | main.rs:142:12:142:12 | x | | +| main.rs:143:9:143:9 | x | main.rs:143:13:143:13 | 1 | | +| main.rs:143:9:143:13 | ... + ... | main.rs:142:12:142:12 | x | | +| main.rs:143:13:143:13 | 1 | main.rs:143:9:143:13 | ... + ... | | +| main.rs:144:8:145:13 | [boolean(true)] let ... = ... | main.rs:134:8:145:13 | [boolean(true)] ... && ... | true | +| main.rs:144:12:144:12 | x | main.rs:144:8:145:13 | [boolean(true)] let ... = ... | match | +| main.rs:144:12:144:12 | x | main.rs:144:12:144:12 | x | | +| main.rs:145:9:145:9 | x | main.rs:145:13:145:13 | 1 | | +| main.rs:145:9:145:13 | ... + ... | main.rs:144:12:144:12 | x | | +| main.rs:145:13:145:13 | 1 | main.rs:145:9:145:13 | ... + ... | | +| main.rs:146:8:147:13 | [boolean(true)] let ... = ... | main.rs:134:8:147:13 | [boolean(true)] ... && ... | true | +| main.rs:146:12:146:12 | x | main.rs:146:8:147:13 | [boolean(true)] let ... = ... | match | +| main.rs:146:12:146:12 | x | main.rs:146:12:146:12 | x | | +| main.rs:147:9:147:9 | x | main.rs:147:13:147:13 | 1 | | +| main.rs:147:9:147:13 | ... + ... | main.rs:146:12:146:12 | x | | +| main.rs:147:13:147:13 | 1 | main.rs:147:9:147:13 | ... + ... | | +| main.rs:148:5:150:5 | { ... } | main.rs:134:5:153:5 | if ... {...} else {...} | | +| main.rs:149:9:149:17 | print_i64 | main.rs:149:19:149:19 | x | | +| main.rs:149:9:149:20 | print_i64(...) | main.rs:148:5:150:5 | { ... } | | +| main.rs:149:9:149:21 | ExprStmt | main.rs:149:9:149:17 | print_i64 | | +| main.rs:149:19:149:19 | x | main.rs:149:9:149:20 | print_i64(...) | | +| main.rs:156:1:171:1 | enter fn match_pattern1 | main.rs:157:5:157:21 | let ... = ... | | +| main.rs:156:1:171:1 | exit fn match_pattern1 (normal) | main.rs:156:1:171:1 | exit fn match_pattern1 | | +| main.rs:156:21:171:1 | { ... } | main.rs:156:1:171:1 | exit fn match_pattern1 (normal) | | +| main.rs:157:5:157:21 | let ... = ... | main.rs:157:14:157:17 | Some | | +| main.rs:157:9:157:10 | x6 | main.rs:157:9:157:10 | x6 | | +| main.rs:157:9:157:10 | x6 | main.rs:158:5:158:16 | let ... = 10 | match | +| main.rs:157:14:157:17 | Some | main.rs:157:19:157:19 | 5 | | +| main.rs:157:14:157:20 | Some(...) | main.rs:157:9:157:10 | x6 | | +| main.rs:157:19:157:19 | 5 | main.rs:157:14:157:20 | Some(...) | | +| main.rs:158:5:158:16 | let ... = 10 | main.rs:158:14:158:15 | 10 | | +| main.rs:158:9:158:10 | y1 | main.rs:158:9:158:10 | y1 | | +| main.rs:158:9:158:10 | y1 | main.rs:160:5:168:5 | ExprStmt | match | +| main.rs:158:14:158:15 | 10 | main.rs:158:9:158:10 | y1 | | +| main.rs:160:5:168:5 | ExprStmt | main.rs:160:11:160:12 | x6 | | +| main.rs:160:5:168:5 | match x6 { ... } | main.rs:170:5:170:18 | ExprStmt | | +| main.rs:160:11:160:12 | x6 | main.rs:161:9:161:16 | Some(...) | | +| main.rs:161:9:161:16 | Some(...) | main.rs:161:14:161:15 | 50 | match | +| main.rs:161:9:161:16 | Some(...) | main.rs:162:9:162:16 | Some(...) | no-match | +| main.rs:161:14:161:15 | 50 | main.rs:161:14:161:15 | 50 | | +| main.rs:161:14:161:15 | 50 | main.rs:161:21:161:29 | print_str | match | +| main.rs:161:14:161:15 | 50 | main.rs:162:9:162:16 | Some(...) | no-match | +| main.rs:161:21:161:29 | print_str | main.rs:161:31:161:38 | "Got 50" | | +| main.rs:161:21:161:39 | print_str(...) | main.rs:160:5:168:5 | match x6 { ... } | | +| main.rs:161:31:161:38 | "Got 50" | main.rs:161:21:161:39 | print_str(...) | | +| main.rs:162:9:162:16 | Some(...) | main.rs:162:14:162:15 | y1 | match | +| main.rs:162:9:162:16 | Some(...) | main.rs:167:9:167:12 | None | no-match | +| main.rs:162:14:162:15 | y1 | main.rs:162:14:162:15 | y1 | | +| main.rs:162:14:162:15 | y1 | main.rs:165:13:165:21 | print_i64 | match | +| main.rs:164:9:166:9 | { ... } | main.rs:160:5:168:5 | match x6 { ... } | | +| main.rs:165:13:165:21 | print_i64 | main.rs:165:23:165:24 | y1 | | +| main.rs:165:13:165:25 | print_i64(...) | main.rs:164:9:166:9 | { ... } | | +| main.rs:165:23:165:24 | y1 | main.rs:165:13:165:25 | print_i64(...) | | +| main.rs:167:9:167:12 | None | main.rs:167:9:167:12 | None | | +| main.rs:167:9:167:12 | None | main.rs:167:17:167:25 | print_str | match | +| main.rs:167:17:167:25 | print_str | main.rs:167:27:167:32 | "NONE" | | +| main.rs:167:17:167:33 | print_str(...) | main.rs:160:5:168:5 | match x6 { ... } | | +| main.rs:167:27:167:32 | "NONE" | main.rs:167:17:167:33 | print_str(...) | | +| main.rs:170:5:170:13 | print_i64 | main.rs:170:15:170:16 | y1 | | +| main.rs:170:5:170:17 | print_i64(...) | main.rs:156:21:171:1 | { ... } | | +| main.rs:170:5:170:18 | ExprStmt | main.rs:170:5:170:13 | print_i64 | | +| main.rs:170:15:170:16 | y1 | main.rs:170:5:170:17 | print_i64(...) | | +| main.rs:173:1:202:1 | enter fn match_pattern2 | main.rs:174:5:174:36 | let ... = ... | | +| main.rs:173:1:202:1 | exit fn match_pattern2 (normal) | main.rs:173:1:202:1 | exit fn match_pattern2 | | +| main.rs:173:21:202:1 | { ... } | main.rs:173:1:202:1 | exit fn match_pattern2 (normal) | | +| main.rs:174:5:174:36 | let ... = ... | main.rs:174:20:174:20 | 2 | | +| main.rs:174:9:174:15 | numbers | main.rs:174:9:174:15 | numbers | | +| main.rs:174:9:174:15 | numbers | main.rs:176:5:189:5 | ExprStmt | match | +| main.rs:174:19:174:35 | TupleExpr | main.rs:174:9:174:15 | numbers | | +| main.rs:174:20:174:20 | 2 | main.rs:174:23:174:23 | 4 | | +| main.rs:174:23:174:23 | 4 | main.rs:174:26:174:26 | 8 | | +| main.rs:174:26:174:26 | 8 | main.rs:174:29:174:30 | 16 | | +| main.rs:174:29:174:30 | 16 | main.rs:174:33:174:34 | 32 | | +| main.rs:174:33:174:34 | 32 | main.rs:174:19:174:35 | TupleExpr | | +| main.rs:176:5:189:5 | ExprStmt | main.rs:176:11:176:17 | numbers | | +| main.rs:176:5:189:5 | match numbers { ... } | main.rs:191:11:191:17 | numbers | | +| main.rs:176:11:176:17 | numbers | main.rs:178:9:184:9 | TuplePat | | +| main.rs:178:9:184:9 | TuplePat | main.rs:179:13:179:17 | first | match | +| main.rs:179:13:179:17 | first | main.rs:179:13:179:17 | first | | +| main.rs:179:13:179:17 | first | main.rs:180:13:180:13 | _ | match | +| main.rs:180:13:180:13 | _ | main.rs:181:13:181:17 | third | match | +| main.rs:181:13:181:17 | third | main.rs:181:13:181:17 | third | | +| main.rs:181:13:181:17 | third | main.rs:182:13:182:13 | _ | match | +| main.rs:182:13:182:13 | _ | main.rs:183:13:183:17 | fifth | match | +| main.rs:183:13:183:17 | fifth | main.rs:183:13:183:17 | fifth | | +| main.rs:183:13:183:17 | fifth | main.rs:185:13:185:29 | ExprStmt | match | +| main.rs:184:14:188:9 | { ... } | main.rs:176:5:189:5 | match numbers { ... } | | +| main.rs:185:13:185:21 | print_i64 | main.rs:185:23:185:27 | first | | +| main.rs:185:13:185:28 | print_i64(...) | main.rs:186:13:186:29 | ExprStmt | | +| main.rs:185:13:185:29 | ExprStmt | main.rs:185:13:185:21 | print_i64 | | +| main.rs:185:23:185:27 | first | main.rs:185:13:185:28 | print_i64(...) | | +| main.rs:186:13:186:21 | print_i64 | main.rs:186:23:186:27 | third | | +| main.rs:186:13:186:28 | print_i64(...) | main.rs:187:13:187:29 | ExprStmt | | +| main.rs:186:13:186:29 | ExprStmt | main.rs:186:13:186:21 | print_i64 | | +| main.rs:186:23:186:27 | third | main.rs:186:13:186:28 | print_i64(...) | | +| main.rs:187:13:187:21 | print_i64 | main.rs:187:23:187:27 | fifth | | +| main.rs:187:13:187:28 | print_i64(...) | main.rs:184:14:188:9 | { ... } | | +| main.rs:187:13:187:29 | ExprStmt | main.rs:187:13:187:21 | print_i64 | | +| main.rs:187:23:187:27 | fifth | main.rs:187:13:187:28 | print_i64(...) | | +| main.rs:191:5:201:5 | match numbers { ... } | main.rs:173:21:202:1 | { ... } | | +| main.rs:191:11:191:17 | numbers | main.rs:193:9:197:9 | TuplePat | | +| main.rs:193:9:197:9 | TuplePat | main.rs:194:13:194:17 | first | match | +| main.rs:194:13:194:17 | first | main.rs:194:13:194:17 | first | | +| main.rs:194:13:194:17 | first | main.rs:195:13:195:14 | .. | match | +| main.rs:195:13:195:14 | .. | main.rs:196:13:196:16 | last | match | +| main.rs:196:13:196:16 | last | main.rs:196:13:196:16 | last | | +| main.rs:196:13:196:16 | last | main.rs:198:13:198:29 | ExprStmt | match | +| main.rs:197:14:200:9 | { ... } | main.rs:191:5:201:5 | match numbers { ... } | | +| main.rs:198:13:198:21 | print_i64 | main.rs:198:23:198:27 | first | | +| main.rs:198:13:198:28 | print_i64(...) | main.rs:199:13:199:28 | ExprStmt | | +| main.rs:198:13:198:29 | ExprStmt | main.rs:198:13:198:21 | print_i64 | | +| main.rs:198:23:198:27 | first | main.rs:198:13:198:28 | print_i64(...) | | +| main.rs:199:13:199:21 | print_i64 | main.rs:199:23:199:26 | last | | +| main.rs:199:13:199:27 | print_i64(...) | main.rs:197:14:200:9 | { ... } | | +| main.rs:199:13:199:28 | ExprStmt | main.rs:199:13:199:21 | print_i64 | | +| main.rs:199:23:199:26 | last | main.rs:199:13:199:27 | print_i64(...) | | +| main.rs:204:1:212:1 | enter fn match_pattern3 | main.rs:205:5:205:38 | let ... = ... | | +| main.rs:204:1:212:1 | exit fn match_pattern3 (normal) | main.rs:204:1:212:1 | exit fn match_pattern3 | | +| main.rs:204:21:212:1 | { ... } | main.rs:204:1:212:1 | exit fn match_pattern3 (normal) | | +| main.rs:205:5:205:38 | let ... = ... | main.rs:205:25:205:27 | "x" | | +| main.rs:205:9:205:10 | p2 | main.rs:205:9:205:10 | p2 | | +| main.rs:205:9:205:10 | p2 | main.rs:207:11:207:12 | p2 | match | +| main.rs:205:14:205:37 | Point {...} | main.rs:205:9:205:10 | p2 | | +| main.rs:205:25:205:27 | "x" | main.rs:205:33:205:35 | "y" | | +| main.rs:205:33:205:35 | "y" | main.rs:205:14:205:37 | Point {...} | | +| main.rs:207:5:211:5 | match p2 { ... } | main.rs:204:21:212:1 | { ... } | | +| main.rs:207:11:207:12 | p2 | main.rs:208:9:210:9 | Point {...} | | +| main.rs:208:9:210:9 | Point {...} | main.rs:209:16:209:17 | x7 | match | +| main.rs:209:16:209:17 | x7 | main.rs:209:16:209:17 | x7 | | +| main.rs:209:16:209:17 | x7 | main.rs:209:20:209:21 | .. | match | +| main.rs:209:20:209:21 | .. | main.rs:210:14:210:22 | print_str | match | +| main.rs:210:14:210:22 | print_str | main.rs:210:24:210:25 | x7 | | +| main.rs:210:14:210:26 | print_str(...) | main.rs:207:5:211:5 | match p2 { ... } | | +| main.rs:210:24:210:25 | x7 | main.rs:210:14:210:26 | print_str(...) | | +| main.rs:218:1:235:1 | enter fn match_pattern4 | main.rs:219:5:219:39 | let ... = ... | | +| main.rs:218:1:235:1 | exit fn match_pattern4 (normal) | main.rs:218:1:235:1 | exit fn match_pattern4 | | +| main.rs:218:21:235:1 | { ... } | main.rs:218:1:235:1 | exit fn match_pattern4 (normal) | | +| main.rs:219:5:219:39 | let ... = ... | main.rs:219:36:219:36 | 0 | | +| main.rs:219:9:219:11 | msg | main.rs:219:9:219:11 | msg | | +| main.rs:219:9:219:11 | msg | main.rs:221:11:221:13 | msg | match | +| main.rs:219:15:219:38 | ...::Hello {...} | main.rs:219:9:219:11 | msg | | +| main.rs:219:36:219:36 | 0 | main.rs:219:15:219:38 | ...::Hello {...} | | +| main.rs:221:5:234:5 | match msg { ... } | main.rs:218:21:235:1 | { ... } | | +| main.rs:221:11:221:13 | msg | main.rs:223:9:225:9 | ...::Hello {...} | | +| main.rs:223:9:225:9 | ...::Hello {...} | main.rs:224:31:224:35 | RangePat | match | +| main.rs:223:9:225:9 | ...::Hello {...} | main.rs:226:9:226:38 | ...::Hello {...} | no-match | +| main.rs:224:17:224:27 | id_variable | main.rs:224:17:224:35 | id_variable @ ... | | +| main.rs:224:17:224:35 | id_variable @ ... | main.rs:225:14:225:22 | print_i64 | match | +| main.rs:224:31:224:31 | 3 | main.rs:224:31:224:31 | 3 | | +| main.rs:224:31:224:31 | 3 | main.rs:224:35:224:35 | 7 | match | +| main.rs:224:31:224:31 | 3 | main.rs:226:9:226:38 | ...::Hello {...} | no-match | +| main.rs:224:31:224:35 | RangePat | main.rs:224:31:224:31 | 3 | match | +| main.rs:224:35:224:35 | 7 | main.rs:224:17:224:27 | id_variable | match | +| main.rs:224:35:224:35 | 7 | main.rs:224:35:224:35 | 7 | | +| main.rs:224:35:224:35 | 7 | main.rs:226:9:226:38 | ...::Hello {...} | no-match | +| main.rs:225:14:225:22 | print_i64 | main.rs:225:24:225:34 | id_variable | | +| main.rs:225:14:225:35 | print_i64(...) | main.rs:221:5:234:5 | match msg { ... } | | +| main.rs:225:24:225:34 | id_variable | main.rs:225:14:225:35 | print_i64(...) | | +| main.rs:226:9:226:38 | ...::Hello {...} | main.rs:226:30:226:36 | RangePat | match | +| main.rs:226:9:226:38 | ...::Hello {...} | main.rs:229:9:229:29 | ...::Hello {...} | no-match | +| main.rs:226:30:226:31 | 10 | main.rs:226:30:226:31 | 10 | | +| main.rs:226:30:226:31 | 10 | main.rs:226:35:226:36 | 12 | match | +| main.rs:226:30:226:31 | 10 | main.rs:229:9:229:29 | ...::Hello {...} | no-match | +| main.rs:226:30:226:36 | RangePat | main.rs:226:30:226:31 | 10 | match | +| main.rs:226:35:226:36 | 12 | main.rs:226:35:226:36 | 12 | | +| main.rs:226:35:226:36 | 12 | main.rs:227:22:227:51 | ExprStmt | match | +| main.rs:226:35:226:36 | 12 | main.rs:229:9:229:29 | ...::Hello {...} | no-match | +| main.rs:226:43:228:9 | { ... } | main.rs:221:5:234:5 | match msg { ... } | | +| main.rs:227:13:227:20 | ...::_print | main.rs:227:22:227:51 | "Found an id in another range\\... | | +| main.rs:227:13:227:52 | MacroExpr | main.rs:226:43:228:9 | { ... } | | +| main.rs:227:13:227:52 | println!... | main.rs:227:13:227:52 | MacroExpr | | +| main.rs:227:22:227:51 | "Found an id in another range\\... | main.rs:227:22:227:51 | FormatArgsExpr | | +| main.rs:227:22:227:51 | ...::_print(...) | main.rs:227:22:227:51 | { ... } | | +| main.rs:227:22:227:51 | ...::format_args_nl!... | main.rs:227:22:227:51 | MacroExpr | | +| main.rs:227:22:227:51 | ExprStmt | main.rs:227:13:227:20 | ...::_print | | +| main.rs:227:22:227:51 | FormatArgsExpr | main.rs:227:22:227:51 | ...::format_args_nl!... | | +| main.rs:227:22:227:51 | MacroExpr | main.rs:227:22:227:51 | ...::_print(...) | | +| main.rs:227:22:227:51 | { ... } | main.rs:227:13:227:52 | println!... | | +| main.rs:227:22:227:51 | { ... } | main.rs:227:22:227:51 | { ... } | | +| main.rs:229:9:229:29 | ...::Hello {...} | main.rs:229:26:229:27 | id | match | +| main.rs:229:26:229:27 | id | main.rs:229:26:229:27 | id | | +| main.rs:229:26:229:27 | id | main.rs:232:13:232:21 | print_i64 | match | +| main.rs:231:9:233:9 | { ... } | main.rs:221:5:234:5 | match msg { ... } | | +| main.rs:232:13:232:21 | print_i64 | main.rs:232:23:232:24 | id | | +| main.rs:232:13:232:25 | print_i64(...) | main.rs:231:9:233:9 | { ... } | | +| main.rs:232:23:232:24 | id | main.rs:232:13:232:25 | print_i64(...) | | +| main.rs:242:1:248:1 | enter fn match_pattern5 | main.rs:243:5:243:34 | let ... = ... | | +| main.rs:242:1:248:1 | exit fn match_pattern5 (normal) | main.rs:242:1:248:1 | exit fn match_pattern5 | | +| main.rs:242:21:248:1 | { ... } | main.rs:242:1:248:1 | exit fn match_pattern5 (normal) | | +| main.rs:243:5:243:34 | let ... = ... | main.rs:243:18:243:29 | ...::Left | | +| main.rs:243:9:243:14 | either | main.rs:243:9:243:14 | either | | +| main.rs:243:9:243:14 | either | main.rs:244:11:244:16 | either | match | +| main.rs:243:18:243:29 | ...::Left | main.rs:243:31:243:32 | 32 | | +| main.rs:243:18:243:33 | ...::Left(...) | main.rs:243:9:243:14 | either | | +| main.rs:243:31:243:32 | 32 | main.rs:243:18:243:33 | ...::Left(...) | | +| main.rs:244:5:247:5 | match either { ... } | main.rs:242:21:248:1 | { ... } | | +| main.rs:244:11:244:16 | either | main.rs:245:9:245:24 | ...::Left(...) | | +| main.rs:245:9:245:24 | ...::Left(...) | main.rs:245:22:245:23 | a3 | match | +| main.rs:245:9:245:24 | ...::Left(...) | main.rs:245:28:245:44 | ...::Right(...) | no-match | +| main.rs:245:9:245:44 | ... \| ... | main.rs:246:16:246:24 | print_i64 | match | +| main.rs:245:22:245:23 | a3 | main.rs:245:9:245:44 | ... \| ... | match | +| main.rs:245:22:245:23 | a3 | main.rs:245:22:245:23 | a3 | | +| main.rs:245:28:245:44 | ...::Right(...) | main.rs:245:42:245:43 | a3 | match | +| main.rs:245:42:245:43 | a3 | main.rs:245:9:245:44 | ... \| ... | match | +| main.rs:245:42:245:43 | a3 | main.rs:245:42:245:43 | a3 | | +| main.rs:246:16:246:24 | print_i64 | main.rs:246:26:246:27 | a3 | | +| main.rs:246:16:246:28 | print_i64(...) | main.rs:244:5:247:5 | match either { ... } | | +| main.rs:246:26:246:27 | a3 | main.rs:246:16:246:28 | print_i64(...) | | +| main.rs:256:1:270:1 | enter fn match_pattern6 | main.rs:257:5:257:37 | let ... = ... | | +| main.rs:256:1:270:1 | exit fn match_pattern6 (normal) | main.rs:256:1:270:1 | exit fn match_pattern6 | | +| main.rs:256:21:270:1 | { ... } | main.rs:256:1:270:1 | exit fn match_pattern6 (normal) | | +| main.rs:257:5:257:37 | let ... = ... | main.rs:257:14:257:32 | ...::Second | | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | | +| main.rs:257:9:257:10 | tv | main.rs:258:5:261:5 | ExprStmt | match | +| main.rs:257:14:257:32 | ...::Second | main.rs:257:34:257:35 | 62 | | +| main.rs:257:14:257:36 | ...::Second(...) | main.rs:257:9:257:10 | tv | | +| main.rs:257:34:257:35 | 62 | main.rs:257:14:257:36 | ...::Second(...) | | +| main.rs:258:5:261:5 | ExprStmt | main.rs:258:11:258:12 | tv | | +| main.rs:258:5:261:5 | match tv { ... } | main.rs:262:5:265:5 | ExprStmt | | +| main.rs:258:11:258:12 | tv | main.rs:259:9:259:30 | ...::First(...) | | +| main.rs:259:9:259:30 | ...::First(...) | main.rs:259:28:259:29 | a4 | match | +| main.rs:259:9:259:30 | ...::First(...) | main.rs:259:34:259:56 | ...::Second(...) | no-match | +| main.rs:259:9:259:81 | ... \| ... \| ... | main.rs:260:16:260:24 | print_i64 | match | +| main.rs:259:28:259:29 | a4 | main.rs:259:9:259:81 | ... \| ... \| ... | match | +| main.rs:259:28:259:29 | a4 | main.rs:259:28:259:29 | a4 | | +| main.rs:259:34:259:56 | ...::Second(...) | main.rs:259:54:259:55 | a4 | match | +| main.rs:259:34:259:56 | ...::Second(...) | main.rs:259:60:259:81 | ...::Third(...) | no-match | +| main.rs:259:54:259:55 | a4 | main.rs:259:9:259:81 | ... \| ... \| ... | match | +| main.rs:259:54:259:55 | a4 | main.rs:259:54:259:55 | a4 | | +| main.rs:259:60:259:81 | ...::Third(...) | main.rs:259:79:259:80 | a4 | match | +| main.rs:259:79:259:80 | a4 | main.rs:259:9:259:81 | ... \| ... \| ... | match | +| main.rs:259:79:259:80 | a4 | main.rs:259:79:259:80 | a4 | | +| main.rs:260:16:260:24 | print_i64 | main.rs:260:26:260:27 | a4 | | +| main.rs:260:16:260:28 | print_i64(...) | main.rs:258:5:261:5 | match tv { ... } | | +| main.rs:260:26:260:27 | a4 | main.rs:260:16:260:28 | print_i64(...) | | +| main.rs:262:5:265:5 | ExprStmt | main.rs:262:11:262:12 | tv | | +| main.rs:262:5:265:5 | match tv { ... } | main.rs:266:11:266:12 | tv | | +| main.rs:262:11:262:12 | tv | main.rs:263:10:263:31 | ...::First(...) | | +| main.rs:263:9:263:83 | ... \| ... | main.rs:264:16:264:24 | print_i64 | match | +| main.rs:263:10:263:31 | ...::First(...) | main.rs:263:29:263:30 | a5 | match | +| main.rs:263:10:263:31 | ...::First(...) | main.rs:263:35:263:57 | ...::Second(...) | no-match | +| main.rs:263:10:263:57 | [match(false)] ... \| ... | main.rs:263:62:263:83 | ...::Third(...) | no-match | +| main.rs:263:10:263:57 | [match(true)] ... \| ... | main.rs:263:9:263:83 | ... \| ... | match | +| main.rs:263:29:263:30 | a5 | main.rs:263:10:263:57 | [match(true)] ... \| ... | match | +| main.rs:263:29:263:30 | a5 | main.rs:263:29:263:30 | a5 | | +| main.rs:263:35:263:57 | ...::Second(...) | main.rs:263:10:263:57 | [match(false)] ... \| ... | no-match | +| main.rs:263:35:263:57 | ...::Second(...) | main.rs:263:55:263:56 | a5 | match | +| main.rs:263:55:263:56 | a5 | main.rs:263:10:263:57 | [match(true)] ... \| ... | match | +| main.rs:263:55:263:56 | a5 | main.rs:263:55:263:56 | a5 | | +| main.rs:263:62:263:83 | ...::Third(...) | main.rs:263:81:263:82 | a5 | match | +| main.rs:263:81:263:82 | a5 | main.rs:263:9:263:83 | ... \| ... | match | +| main.rs:263:81:263:82 | a5 | main.rs:263:81:263:82 | a5 | | +| main.rs:264:16:264:24 | print_i64 | main.rs:264:26:264:27 | a5 | | +| main.rs:264:16:264:28 | print_i64(...) | main.rs:262:5:265:5 | match tv { ... } | | +| main.rs:264:26:264:27 | a5 | main.rs:264:16:264:28 | print_i64(...) | | +| main.rs:266:5:269:5 | match tv { ... } | main.rs:256:21:270:1 | { ... } | | +| main.rs:266:11:266:12 | tv | main.rs:267:9:267:30 | ...::First(...) | | +| main.rs:267:9:267:30 | ...::First(...) | main.rs:267:28:267:29 | a6 | match | +| main.rs:267:9:267:30 | ...::First(...) | main.rs:267:35:267:57 | ...::Second(...) | no-match | +| main.rs:267:9:267:83 | ... \| ... | main.rs:268:16:268:24 | print_i64 | match | +| main.rs:267:28:267:29 | a6 | main.rs:267:9:267:83 | ... \| ... | match | +| main.rs:267:28:267:29 | a6 | main.rs:267:28:267:29 | a6 | | +| main.rs:267:35:267:57 | ...::Second(...) | main.rs:267:55:267:56 | a6 | match | +| main.rs:267:35:267:57 | ...::Second(...) | main.rs:267:61:267:82 | ...::Third(...) | no-match | +| main.rs:267:35:267:82 | ... \| ... | main.rs:267:9:267:83 | ... \| ... | match | +| main.rs:267:55:267:56 | a6 | main.rs:267:35:267:82 | ... \| ... | match | +| main.rs:267:55:267:56 | a6 | main.rs:267:55:267:56 | a6 | | +| main.rs:267:61:267:82 | ...::Third(...) | main.rs:267:80:267:81 | a6 | match | +| main.rs:267:80:267:81 | a6 | main.rs:267:35:267:82 | ... \| ... | match | +| main.rs:267:80:267:81 | a6 | main.rs:267:80:267:81 | a6 | | +| main.rs:268:16:268:24 | print_i64 | main.rs:268:26:268:27 | a6 | | +| main.rs:268:16:268:28 | print_i64(...) | main.rs:266:5:269:5 | match tv { ... } | | +| main.rs:268:26:268:27 | a6 | main.rs:268:16:268:28 | print_i64(...) | | +| main.rs:272:1:280:1 | enter fn match_pattern7 | main.rs:273:5:273:34 | let ... = ... | | +| main.rs:272:1:280:1 | exit fn match_pattern7 (normal) | main.rs:272:1:280:1 | exit fn match_pattern7 | | +| main.rs:272:21:280:1 | { ... } | main.rs:272:1:280:1 | exit fn match_pattern7 (normal) | | +| main.rs:273:5:273:34 | let ... = ... | main.rs:273:18:273:29 | ...::Left | | +| main.rs:273:9:273:14 | either | main.rs:273:9:273:14 | either | | +| main.rs:273:9:273:14 | either | main.rs:274:11:274:16 | either | match | +| main.rs:273:18:273:29 | ...::Left | main.rs:273:31:273:32 | 32 | | +| main.rs:273:18:273:33 | ...::Left(...) | main.rs:273:9:273:14 | either | | +| main.rs:273:31:273:32 | 32 | main.rs:273:18:273:33 | ...::Left(...) | | +| main.rs:274:5:279:5 | match either { ... } | main.rs:272:21:280:1 | { ... } | | +| main.rs:274:11:274:16 | either | main.rs:275:9:275:24 | ...::Left(...) | | +| main.rs:275:9:275:24 | ...::Left(...) | main.rs:275:22:275:23 | a7 | match | +| main.rs:275:9:275:24 | ...::Left(...) | main.rs:275:28:275:44 | ...::Right(...) | no-match | +| main.rs:275:9:275:44 | [match(false)] ... \| ... | main.rs:278:9:278:9 | _ | no-match | +| main.rs:275:9:275:44 | [match(true)] ... \| ... | main.rs:276:16:276:17 | a7 | match | +| main.rs:275:22:275:23 | a7 | main.rs:275:9:275:44 | [match(true)] ... \| ... | match | +| main.rs:275:22:275:23 | a7 | main.rs:275:22:275:23 | a7 | | +| main.rs:275:28:275:44 | ...::Right(...) | main.rs:275:9:275:44 | [match(false)] ... \| ... | no-match | +| main.rs:275:28:275:44 | ...::Right(...) | main.rs:275:42:275:43 | a7 | match | +| main.rs:275:42:275:43 | a7 | main.rs:275:9:275:44 | [match(true)] ... \| ... | match | +| main.rs:275:42:275:43 | a7 | main.rs:275:42:275:43 | a7 | | +| main.rs:276:16:276:17 | a7 | main.rs:276:21:276:21 | 0 | | +| main.rs:276:16:276:21 | ... > ... | main.rs:277:16:277:24 | print_i64 | true | +| main.rs:276:16:276:21 | ... > ... | main.rs:278:9:278:9 | _ | false | +| main.rs:276:21:276:21 | 0 | main.rs:276:16:276:21 | ... > ... | | +| main.rs:277:16:277:24 | print_i64 | main.rs:277:26:277:27 | a7 | | +| main.rs:277:16:277:28 | print_i64(...) | main.rs:274:5:279:5 | match either { ... } | | +| main.rs:277:26:277:27 | a7 | main.rs:277:16:277:28 | print_i64(...) | | +| main.rs:278:9:278:9 | _ | main.rs:278:14:278:15 | TupleExpr | match | +| main.rs:278:14:278:15 | TupleExpr | main.rs:274:5:279:5 | match either { ... } | | +| main.rs:282:1:297:1 | enter fn match_pattern8 | main.rs:283:5:283:34 | let ... = ... | | +| main.rs:282:1:297:1 | exit fn match_pattern8 (normal) | main.rs:282:1:297:1 | exit fn match_pattern8 | | +| main.rs:282:21:297:1 | { ... } | main.rs:282:1:297:1 | exit fn match_pattern8 (normal) | | +| main.rs:283:5:283:34 | let ... = ... | main.rs:283:18:283:29 | ...::Left | | +| main.rs:283:9:283:14 | either | main.rs:283:9:283:14 | either | | +| main.rs:283:9:283:14 | either | main.rs:285:11:285:16 | either | match | +| main.rs:283:18:283:29 | ...::Left | main.rs:283:31:283:32 | 32 | | +| main.rs:283:18:283:33 | ...::Left(...) | main.rs:283:9:283:14 | either | | +| main.rs:283:31:283:32 | 32 | main.rs:283:18:283:33 | ...::Left(...) | | +| main.rs:285:5:296:5 | match either { ... } | main.rs:282:21:297:1 | { ... } | | +| main.rs:285:11:285:16 | either | main.rs:287:14:287:30 | ...::Left(...) | | +| main.rs:286:9:287:52 | ref e @ ... | main.rs:289:13:289:27 | ExprStmt | match | +| main.rs:286:13:286:13 | e | main.rs:286:9:287:52 | ref e @ ... | | +| main.rs:287:14:287:30 | ...::Left(...) | main.rs:287:27:287:29 | a11 | match | +| main.rs:287:14:287:30 | ...::Left(...) | main.rs:287:34:287:51 | ...::Right(...) | no-match | +| main.rs:287:14:287:51 | [match(false)] ... \| ... | main.rs:295:9:295:9 | _ | no-match | +| main.rs:287:14:287:51 | [match(true)] ... \| ... | main.rs:286:13:286:13 | e | match | +| main.rs:287:27:287:29 | a11 | main.rs:287:14:287:51 | [match(true)] ... \| ... | match | +| main.rs:287:27:287:29 | a11 | main.rs:287:27:287:29 | a11 | | +| main.rs:287:34:287:51 | ...::Right(...) | main.rs:287:14:287:51 | [match(false)] ... \| ... | no-match | +| main.rs:287:34:287:51 | ...::Right(...) | main.rs:287:48:287:50 | a11 | match | +| main.rs:287:48:287:50 | a11 | main.rs:287:14:287:51 | [match(true)] ... \| ... | match | +| main.rs:287:48:287:50 | a11 | main.rs:287:48:287:50 | a11 | | +| main.rs:288:12:294:9 | { ... } | main.rs:285:5:296:5 | match either { ... } | | +| main.rs:289:13:289:21 | print_i64 | main.rs:289:23:289:25 | a11 | | +| main.rs:289:13:289:26 | print_i64(...) | main.rs:291:15:291:15 | e | | +| main.rs:289:13:289:27 | ExprStmt | main.rs:289:13:289:21 | print_i64 | | +| main.rs:289:23:289:25 | a11 | main.rs:289:13:289:26 | print_i64(...) | | +| main.rs:290:13:293:13 | if ... {...} | main.rs:288:12:294:9 | { ... } | | +| main.rs:290:16:291:15 | [boolean(false)] let ... = e | main.rs:290:13:293:13 | if ... {...} | false | +| main.rs:290:16:291:15 | [boolean(true)] let ... = e | main.rs:292:17:292:32 | ExprStmt | true | +| main.rs:290:20:290:36 | ...::Left(...) | main.rs:290:16:291:15 | [boolean(false)] let ... = e | no-match | +| main.rs:290:20:290:36 | ...::Left(...) | main.rs:290:33:290:35 | a12 | match | +| main.rs:290:33:290:35 | a12 | main.rs:290:16:291:15 | [boolean(true)] let ... = e | match | +| main.rs:290:33:290:35 | a12 | main.rs:290:33:290:35 | a12 | | +| main.rs:291:15:291:15 | e | main.rs:290:20:290:36 | ...::Left(...) | | +| main.rs:291:17:293:13 | { ... } | main.rs:290:13:293:13 | if ... {...} | | +| main.rs:292:17:292:25 | print_i64 | main.rs:292:28:292:30 | a12 | | +| main.rs:292:17:292:31 | print_i64(...) | main.rs:291:17:293:13 | { ... } | | +| main.rs:292:17:292:32 | ExprStmt | main.rs:292:17:292:25 | print_i64 | | +| main.rs:292:27:292:30 | * ... | main.rs:292:17:292:31 | print_i64(...) | | +| main.rs:292:28:292:30 | a12 | main.rs:292:27:292:30 | * ... | | +| main.rs:295:9:295:9 | _ | main.rs:295:14:295:15 | TupleExpr | match | +| main.rs:295:14:295:15 | TupleExpr | main.rs:285:5:296:5 | match either { ... } | | +| main.rs:306:1:312:1 | enter fn match_pattern9 | main.rs:307:5:307:36 | let ... = ... | | +| main.rs:306:1:312:1 | exit fn match_pattern9 (normal) | main.rs:306:1:312:1 | exit fn match_pattern9 | | +| main.rs:306:21:312:1 | { ... } | main.rs:306:1:312:1 | exit fn match_pattern9 (normal) | | +| main.rs:307:5:307:36 | let ... = ... | main.rs:307:14:307:31 | ...::Second | | +| main.rs:307:9:307:10 | fv | main.rs:307:9:307:10 | fv | | +| main.rs:307:9:307:10 | fv | main.rs:308:11:308:12 | fv | match | +| main.rs:307:14:307:31 | ...::Second | main.rs:307:33:307:34 | 62 | | +| main.rs:307:14:307:35 | ...::Second(...) | main.rs:307:9:307:10 | fv | | +| main.rs:307:33:307:34 | 62 | main.rs:307:14:307:35 | ...::Second(...) | | +| main.rs:308:5:311:5 | match fv { ... } | main.rs:306:21:312:1 | { ... } | | +| main.rs:308:11:308:12 | fv | main.rs:309:9:309:30 | ...::First(...) | | +| main.rs:309:9:309:30 | ...::First(...) | main.rs:309:27:309:29 | a13 | match | +| main.rs:309:9:309:30 | ...::First(...) | main.rs:309:35:309:57 | ...::Second(...) | no-match | +| main.rs:309:9:309:109 | ... \| ... \| ... | main.rs:310:16:310:24 | print_i64 | match | +| main.rs:309:27:309:29 | a13 | main.rs:309:9:309:109 | ... \| ... \| ... | match | +| main.rs:309:27:309:29 | a13 | main.rs:309:27:309:29 | a13 | | +| main.rs:309:35:309:57 | ...::Second(...) | main.rs:309:54:309:56 | a13 | match | +| main.rs:309:35:309:57 | ...::Second(...) | main.rs:309:61:309:82 | ...::Third(...) | no-match | +| main.rs:309:35:309:82 | [match(false)] ... \| ... | main.rs:309:87:309:109 | ...::Fourth(...) | no-match | +| main.rs:309:35:309:82 | [match(true)] ... \| ... | main.rs:309:9:309:109 | ... \| ... \| ... | match | +| main.rs:309:54:309:56 | a13 | main.rs:309:35:309:82 | [match(true)] ... \| ... | match | +| main.rs:309:54:309:56 | a13 | main.rs:309:54:309:56 | a13 | | +| main.rs:309:61:309:82 | ...::Third(...) | main.rs:309:35:309:82 | [match(false)] ... \| ... | no-match | +| main.rs:309:61:309:82 | ...::Third(...) | main.rs:309:79:309:81 | a13 | match | +| main.rs:309:79:309:81 | a13 | main.rs:309:35:309:82 | [match(true)] ... \| ... | match | +| main.rs:309:79:309:81 | a13 | main.rs:309:79:309:81 | a13 | | +| main.rs:309:87:309:109 | ...::Fourth(...) | main.rs:309:106:309:108 | a13 | match | +| main.rs:309:106:309:108 | a13 | main.rs:309:9:309:109 | ... \| ... \| ... | match | +| main.rs:309:106:309:108 | a13 | main.rs:309:106:309:108 | a13 | | +| main.rs:310:16:310:24 | print_i64 | main.rs:310:26:310:28 | a13 | | +| main.rs:310:16:310:29 | print_i64(...) | main.rs:308:5:311:5 | match fv { ... } | | +| main.rs:310:26:310:28 | a13 | main.rs:310:16:310:29 | print_i64(...) | | +| main.rs:314:1:328:1 | enter fn match_pattern10 | main.rs:316:5:316:20 | let ... = ... | | +| main.rs:314:1:328:1 | exit fn match_pattern10 (normal) | main.rs:314:1:328:1 | exit fn match_pattern10 | | +| main.rs:315:22:328:1 | { ... } | main.rs:314:1:328:1 | exit fn match_pattern10 (normal) | | +| main.rs:316:5:316:20 | let ... = ... | main.rs:316:12:316:15 | Some | | | main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | | -| main.rs:316:9:316:9 | x | main.rs:317:5:327:5 | ExprStmt | match | -| main.rs:316:13:316:16 | Some | main.rs:316:18:316:19 | 42 | | -| main.rs:316:13:316:20 | Some(...) | main.rs:316:9:316:9 | x | | -| main.rs:316:18:316:19 | 42 | main.rs:316:13:316:20 | Some(...) | | -| main.rs:317:5:327:5 | ExprStmt | main.rs:318:7:318:7 | x | | -| main.rs:317:5:327:5 | while ... { ... } | main.rs:329:5:329:26 | ExprStmt | | -| main.rs:317:11:318:7 | [boolean(false)] let ... = x | main.rs:317:11:321:13 | [boolean(false)] ... && ... | false | -| main.rs:317:11:318:7 | [boolean(true)] let ... = x | main.rs:321:7:321:10 | Some | true | -| main.rs:317:11:321:13 | [boolean(false)] ... && ... | main.rs:317:11:323:9 | [boolean(false)] ... && ... | false | -| main.rs:317:11:321:13 | [boolean(true)] ... && ... | main.rs:323:5:323:5 | x | true | -| main.rs:317:11:323:9 | [boolean(false)] ... && ... | main.rs:317:5:327:5 | while ... { ... } | false | -| main.rs:317:11:323:9 | [boolean(true)] ... && ... | main.rs:325:9:325:21 | ExprStmt | true | -| main.rs:317:15:317:21 | Some(...) | main.rs:317:11:318:7 | [boolean(false)] let ... = x | no-match | -| main.rs:317:15:317:21 | Some(...) | main.rs:317:20:317:20 | x | match | -| main.rs:317:20:317:20 | x | main.rs:317:11:318:7 | [boolean(true)] let ... = x | match | -| main.rs:317:20:317:20 | x | main.rs:317:20:317:20 | x | | -| main.rs:318:7:318:7 | x | main.rs:317:15:317:21 | Some(...) | | -| main.rs:320:5:321:13 | [boolean(false)] let ... = ... | main.rs:317:11:321:13 | [boolean(false)] ... && ... | false | -| main.rs:320:5:321:13 | [boolean(true)] let ... = ... | main.rs:317:11:321:13 | [boolean(true)] ... && ... | true | -| main.rs:320:9:320:15 | Some(...) | main.rs:320:5:321:13 | [boolean(false)] let ... = ... | no-match | -| main.rs:320:9:320:15 | Some(...) | main.rs:320:14:320:14 | x | match | -| main.rs:320:14:320:14 | x | main.rs:320:5:321:13 | [boolean(true)] let ... = ... | match | -| main.rs:320:14:320:14 | x | main.rs:320:14:320:14 | x | | -| main.rs:321:7:321:10 | Some | main.rs:321:12:321:12 | x | | -| main.rs:321:7:321:13 | Some(...) | main.rs:320:9:320:15 | Some(...) | | -| main.rs:321:12:321:12 | x | main.rs:321:7:321:13 | Some(...) | | -| main.rs:323:5:323:5 | x | main.rs:323:9:323:9 | 0 | | -| main.rs:323:5:323:9 | ... > ... | main.rs:317:11:323:9 | [boolean(false)] ... && ... | false | -| main.rs:323:5:323:9 | ... > ... | main.rs:317:11:323:9 | [boolean(true)] ... && ... | true | -| main.rs:323:9:323:9 | 0 | main.rs:323:5:323:9 | ... > ... | | -| main.rs:325:9:325:17 | print_i64 | main.rs:325:19:325:19 | x | | -| main.rs:325:9:325:20 | print_i64(...) | main.rs:326:9:326:14 | ExprStmt | | -| main.rs:325:9:325:21 | ExprStmt | main.rs:325:9:325:17 | print_i64 | | -| main.rs:325:19:325:19 | x | main.rs:325:9:325:20 | print_i64(...) | | -| main.rs:326:9:326:13 | break | main.rs:317:5:327:5 | while ... { ... } | break | -| main.rs:326:9:326:14 | ExprStmt | main.rs:326:9:326:13 | break | | -| main.rs:329:5:329:13 | print_i64 | main.rs:329:15:329:15 | x | | -| main.rs:329:5:329:25 | print_i64(...) | main.rs:315:22:330:1 | { ... } | | -| main.rs:329:5:329:26 | ExprStmt | main.rs:329:5:329:13 | print_i64 | | -| main.rs:329:15:329:15 | x | main.rs:329:15:329:24 | x.unwrap() | | -| main.rs:329:15:329:24 | x.unwrap() | main.rs:329:5:329:25 | print_i64(...) | | -| main.rs:332:1:344:1 | enter fn match_pattern13 | main.rs:334:5:334:21 | let ... = ... | | -| main.rs:332:1:344:1 | exit fn match_pattern13 (normal) | main.rs:332:1:344:1 | exit fn match_pattern13 | | -| main.rs:333:22:344:1 | { ... } | main.rs:332:1:344:1 | exit fn match_pattern13 (normal) | | -| main.rs:334:5:334:21 | let ... = ... | main.rs:334:13:334:16 | Some | | -| main.rs:334:9:334:9 | x | main.rs:334:9:334:9 | x | | -| main.rs:334:9:334:9 | x | main.rs:335:5:341:5 | ExprStmt | match | -| main.rs:334:13:334:16 | Some | main.rs:334:18:334:19 | 42 | | -| main.rs:334:13:334:20 | Some(...) | main.rs:334:9:334:9 | x | | -| main.rs:334:18:334:19 | 42 | main.rs:334:13:334:20 | Some(...) | | -| main.rs:335:5:341:5 | ExprStmt | main.rs:335:11:335:11 | x | | -| main.rs:335:5:341:5 | match x { ... } | main.rs:343:5:343:26 | ExprStmt | | -| main.rs:335:11:335:11 | x | main.rs:336:9:336:15 | Some(...) | | +| main.rs:316:9:316:9 | x | main.rs:318:7:318:7 | x | match | +| main.rs:316:12:316:15 | Some | main.rs:316:17:316:18 | 42 | | +| main.rs:316:12:316:19 | Some(...) | main.rs:316:9:316:9 | x | | +| main.rs:316:17:316:18 | 42 | main.rs:316:12:316:19 | Some(...) | | +| main.rs:317:5:327:5 | if ... {...} else {...} | main.rs:315:22:328:1 | { ... } | | +| main.rs:317:8:318:7 | [boolean(false)] let ... = x | main.rs:317:8:320:9 | [boolean(false)] ... && ... | false | +| main.rs:317:8:318:7 | [boolean(true)] let ... = x | main.rs:320:5:320:5 | x | true | +| main.rs:317:8:320:9 | [boolean(false)] ... && ... | main.rs:324:9:325:14 | let ... = x | false | +| main.rs:317:8:320:9 | [boolean(true)] ... && ... | main.rs:322:9:322:21 | ExprStmt | true | +| main.rs:317:12:317:18 | Some(...) | main.rs:317:8:318:7 | [boolean(false)] let ... = x | no-match | +| main.rs:317:12:317:18 | Some(...) | main.rs:317:17:317:17 | x | match | +| main.rs:317:17:317:17 | x | main.rs:317:8:318:7 | [boolean(true)] let ... = x | match | +| main.rs:317:17:317:17 | x | main.rs:317:17:317:17 | x | | +| main.rs:318:7:318:7 | x | main.rs:317:12:317:18 | Some(...) | | +| main.rs:320:5:320:5 | x | main.rs:320:9:320:9 | 0 | | +| main.rs:320:5:320:9 | ... > ... | main.rs:317:8:320:9 | [boolean(false)] ... && ... | false | +| main.rs:320:5:320:9 | ... > ... | main.rs:317:8:320:9 | [boolean(true)] ... && ... | true | +| main.rs:320:9:320:9 | 0 | main.rs:320:5:320:9 | ... > ... | | +| main.rs:321:5:323:5 | { ... } | main.rs:317:5:327:5 | if ... {...} else {...} | | +| main.rs:322:9:322:17 | print_i64 | main.rs:322:19:322:19 | x | | +| main.rs:322:9:322:20 | print_i64(...) | main.rs:321:5:323:5 | { ... } | | +| main.rs:322:9:322:21 | ExprStmt | main.rs:322:9:322:17 | print_i64 | | +| main.rs:322:19:322:19 | x | main.rs:322:9:322:20 | print_i64(...) | | +| main.rs:323:12:327:5 | { ... } | main.rs:317:5:327:5 | if ... {...} else {...} | | +| main.rs:324:9:325:14 | let ... = x | main.rs:325:13:325:13 | x | | +| main.rs:324:13:324:13 | x | main.rs:324:13:324:13 | x | | +| main.rs:324:13:324:13 | x | main.rs:326:9:326:30 | ExprStmt | match | +| main.rs:325:13:325:13 | x | main.rs:324:13:324:13 | x | | +| main.rs:326:9:326:17 | print_i64 | main.rs:326:19:326:19 | x | | +| main.rs:326:9:326:29 | print_i64(...) | main.rs:323:12:327:5 | { ... } | | +| main.rs:326:9:326:30 | ExprStmt | main.rs:326:9:326:17 | print_i64 | | +| main.rs:326:19:326:19 | x | main.rs:326:19:326:28 | x.unwrap() | | +| main.rs:326:19:326:28 | x.unwrap() | main.rs:326:9:326:29 | print_i64(...) | | +| main.rs:330:1:347:1 | enter fn match_pattern11 | main.rs:332:5:332:21 | let ... = ... | | +| main.rs:330:1:347:1 | exit fn match_pattern11 (normal) | main.rs:330:1:347:1 | exit fn match_pattern11 | | +| main.rs:331:22:347:1 | { ... } | main.rs:330:1:347:1 | exit fn match_pattern11 (normal) | | +| main.rs:332:5:332:21 | let ... = ... | main.rs:332:13:332:16 | Some | | +| main.rs:332:9:332:9 | x | main.rs:332:9:332:9 | x | | +| main.rs:332:9:332:9 | x | main.rs:334:7:334:7 | x | match | +| main.rs:332:13:332:16 | Some | main.rs:332:18:332:19 | 42 | | +| main.rs:332:13:332:20 | Some(...) | main.rs:332:9:332:9 | x | | +| main.rs:332:18:332:19 | 42 | main.rs:332:13:332:20 | Some(...) | | +| main.rs:333:5:346:5 | if ... {...} else {...} | main.rs:331:22:347:1 | { ... } | | +| main.rs:333:8:334:7 | [boolean(false)] let ... = x | main.rs:333:8:337:13 | [boolean(false)] ... && ... | false | +| main.rs:333:8:334:7 | [boolean(true)] let ... = x | main.rs:337:7:337:10 | Some | true | +| main.rs:333:8:337:13 | [boolean(false)] ... && ... | main.rs:333:8:339:9 | [boolean(false)] ... && ... | false | +| main.rs:333:8:337:13 | [boolean(true)] ... && ... | main.rs:339:5:339:5 | x | true | +| main.rs:333:8:339:9 | [boolean(false)] ... && ... | main.rs:343:9:344:14 | let ... = x | false | +| main.rs:333:8:339:9 | [boolean(true)] ... && ... | main.rs:341:9:341:21 | ExprStmt | true | +| main.rs:333:12:333:18 | Some(...) | main.rs:333:8:334:7 | [boolean(false)] let ... = x | no-match | +| main.rs:333:12:333:18 | Some(...) | main.rs:333:17:333:17 | x | match | +| main.rs:333:17:333:17 | x | main.rs:333:8:334:7 | [boolean(true)] let ... = x | match | +| main.rs:333:17:333:17 | x | main.rs:333:17:333:17 | x | | +| main.rs:334:7:334:7 | x | main.rs:333:12:333:18 | Some(...) | | +| main.rs:336:5:337:13 | [boolean(false)] let ... = ... | main.rs:333:8:337:13 | [boolean(false)] ... && ... | false | +| main.rs:336:5:337:13 | [boolean(true)] let ... = ... | main.rs:333:8:337:13 | [boolean(true)] ... && ... | true | +| main.rs:336:9:336:15 | Some(...) | main.rs:336:5:337:13 | [boolean(false)] let ... = ... | no-match | | main.rs:336:9:336:15 | Some(...) | main.rs:336:14:336:14 | x | match | -| main.rs:336:9:336:15 | Some(...) | main.rs:340:9:340:9 | _ | no-match | +| main.rs:336:14:336:14 | x | main.rs:336:5:337:13 | [boolean(true)] let ... = ... | match | | main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | | -| main.rs:336:14:336:14 | x | main.rs:338:18:338:18 | x | match | -| main.rs:337:16:338:18 | [boolean(true)] let ... = x | main.rs:339:19:339:19 | x | true | -| main.rs:337:16:339:23 | [boolean(false)] ... && ... | main.rs:340:9:340:9 | _ | false | -| main.rs:337:16:339:23 | [boolean(true)] ... && ... | main.rs:339:28:339:29 | TupleExpr | true | -| main.rs:337:20:337:20 | x | main.rs:337:16:338:18 | [boolean(true)] let ... = x | match | -| main.rs:337:20:337:20 | x | main.rs:337:20:337:20 | x | | -| main.rs:338:18:338:18 | x | main.rs:337:20:337:20 | x | | -| main.rs:339:19:339:19 | x | main.rs:339:23:339:23 | 0 | | -| main.rs:339:19:339:23 | ... > ... | main.rs:337:16:339:23 | [boolean(false)] ... && ... | false | -| main.rs:339:19:339:23 | ... > ... | main.rs:337:16:339:23 | [boolean(true)] ... && ... | true | -| main.rs:339:23:339:23 | 0 | main.rs:339:19:339:23 | ... > ... | | -| main.rs:339:28:339:29 | TupleExpr | main.rs:335:5:341:5 | match x { ... } | | -| main.rs:340:9:340:9 | _ | main.rs:340:14:340:15 | TupleExpr | match | -| main.rs:340:14:340:15 | TupleExpr | main.rs:335:5:341:5 | match x { ... } | | -| main.rs:343:5:343:13 | print_i64 | main.rs:343:15:343:15 | x | | -| main.rs:343:5:343:25 | print_i64(...) | main.rs:333:22:344:1 | { ... } | | -| main.rs:343:5:343:26 | ExprStmt | main.rs:343:5:343:13 | print_i64 | | -| main.rs:343:15:343:15 | x | main.rs:343:15:343:24 | x.unwrap() | | -| main.rs:343:15:343:24 | x.unwrap() | main.rs:343:5:343:25 | print_i64(...) | | -| main.rs:346:1:361:1 | enter fn match_pattern14 | main.rs:348:5:348:19 | let ... = ... | | -| main.rs:346:1:361:1 | exit fn match_pattern14 (normal) | main.rs:346:1:361:1 | exit fn match_pattern14 | | -| main.rs:347:22:361:1 | { ... } | main.rs:346:1:361:1 | exit fn match_pattern14 (normal) | | -| main.rs:348:5:348:19 | let ... = ... | main.rs:348:13:348:14 | Ok | | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | | -| main.rs:348:9:348:9 | x | main.rs:350:7:350:7 | x | match | -| main.rs:348:13:348:14 | Ok | main.rs:348:16:348:17 | 42 | | -| main.rs:348:13:348:18 | Ok(...) | main.rs:348:9:348:9 | x | | -| main.rs:348:16:348:17 | 42 | main.rs:348:13:348:18 | Ok(...) | | -| main.rs:349:5:360:5 | if ... {...} else {...} | main.rs:347:22:361:1 | { ... } | | -| main.rs:349:8:350:7 | [boolean(false)] let ... = x | main.rs:355:7:355:7 | x | false | -| main.rs:349:8:350:7 | [boolean(true)] let ... = x | main.rs:352:9:352:21 | ExprStmt | true | -| main.rs:349:12:349:17 | Err(...) | main.rs:349:8:350:7 | [boolean(false)] let ... = x | no-match | -| main.rs:349:12:349:17 | Err(...) | main.rs:349:16:349:16 | x | match | -| main.rs:349:16:349:16 | x | main.rs:349:8:350:7 | [boolean(true)] let ... = x | match | -| main.rs:349:16:349:16 | x | main.rs:349:16:349:16 | x | | -| main.rs:350:7:350:7 | x | main.rs:349:12:349:17 | Err(...) | | -| main.rs:351:5:353:5 | { ... } | main.rs:349:5:360:5 | if ... {...} else {...} | | -| main.rs:352:9:352:17 | print_i64 | main.rs:352:19:352:19 | x | | -| main.rs:352:9:352:20 | print_i64(...) | main.rs:351:5:353:5 | { ... } | | -| main.rs:352:9:352:21 | ExprStmt | main.rs:352:9:352:17 | print_i64 | | -| main.rs:352:19:352:19 | x | main.rs:352:9:352:20 | print_i64(...) | | -| main.rs:354:10:360:5 | if ... {...} else {...} | main.rs:349:5:360:5 | if ... {...} else {...} | | -| main.rs:354:13:355:7 | [boolean(false)] let ... = x | main.rs:359:9:359:30 | ExprStmt | false | -| main.rs:354:13:355:7 | [boolean(true)] let ... = x | main.rs:357:9:357:21 | ExprStmt | true | -| main.rs:354:17:354:21 | Ok(...) | main.rs:354:13:355:7 | [boolean(false)] let ... = x | no-match | -| main.rs:354:17:354:21 | Ok(...) | main.rs:354:20:354:20 | x | match | -| main.rs:354:20:354:20 | x | main.rs:354:13:355:7 | [boolean(true)] let ... = x | match | -| main.rs:354:20:354:20 | x | main.rs:354:20:354:20 | x | | -| main.rs:355:7:355:7 | x | main.rs:354:17:354:21 | Ok(...) | | -| main.rs:356:5:358:5 | { ... } | main.rs:354:10:360:5 | if ... {...} else {...} | | -| main.rs:357:9:357:17 | print_i64 | main.rs:357:19:357:19 | x | | -| main.rs:357:9:357:20 | print_i64(...) | main.rs:356:5:358:5 | { ... } | | -| main.rs:357:9:357:21 | ExprStmt | main.rs:357:9:357:17 | print_i64 | | -| main.rs:357:19:357:19 | x | main.rs:357:9:357:20 | print_i64(...) | | -| main.rs:358:12:360:5 | { ... } | main.rs:354:10:360:5 | if ... {...} else {...} | | -| main.rs:359:9:359:17 | print_i64 | main.rs:359:19:359:19 | x | | -| main.rs:359:9:359:29 | print_i64(...) | main.rs:358:12:360:5 | { ... } | | -| main.rs:359:9:359:30 | ExprStmt | main.rs:359:9:359:17 | print_i64 | | -| main.rs:359:19:359:19 | x | main.rs:359:19:359:28 | x.unwrap() | | -| main.rs:359:19:359:28 | x.unwrap() | main.rs:359:9:359:29 | print_i64(...) | | -| main.rs:363:1:370:1 | enter fn match_pattern15 | main.rs:364:5:364:20 | let ... = ... | | -| main.rs:363:1:370:1 | exit fn match_pattern15 (normal) | main.rs:363:1:370:1 | exit fn match_pattern15 | | -| main.rs:363:22:370:1 | { ... } | main.rs:363:1:370:1 | exit fn match_pattern15 (normal) | | -| main.rs:364:5:364:20 | let ... = ... | main.rs:364:13:364:16 | Some | | -| main.rs:364:9:364:9 | x | main.rs:364:9:364:9 | x | | -| main.rs:364:9:364:9 | x | main.rs:365:5:369:10 | ExprStmt | match | -| main.rs:364:13:364:16 | Some | main.rs:364:18:364:18 | 0 | | -| main.rs:364:13:364:19 | Some(...) | main.rs:364:9:364:9 | x | | -| main.rs:364:18:364:18 | 0 | main.rs:364:13:364:19 | Some(...) | | -| main.rs:365:5:369:9 | match x { ... } | main.rs:363:22:370:1 | { ... } | | -| main.rs:365:5:369:10 | ExprStmt | main.rs:365:11:365:11 | x | | -| main.rs:365:11:365:11 | x | main.rs:366:13:366:19 | Some(...) | | -| main.rs:366:13:366:19 | Some(...) | main.rs:366:18:366:18 | x | match | -| main.rs:366:13:366:19 | Some(...) | main.rs:368:13:368:13 | _ | no-match | -| main.rs:366:18:366:18 | x | main.rs:366:18:366:18 | x | | -| main.rs:366:18:366:18 | x | main.rs:367:20:367:20 | x | match | -| main.rs:367:20:367:20 | x | main.rs:365:5:369:9 | match x { ... } | | -| main.rs:368:13:368:13 | _ | main.rs:368:18:368:18 | 0 | match | -| main.rs:368:18:368:18 | 0 | main.rs:365:5:369:9 | match x { ... } | | -| main.rs:372:1:381:1 | enter fn match_pattern16 | main.rs:373:5:373:21 | let ... = ... | | -| main.rs:372:1:381:1 | exit fn match_pattern16 (normal) | main.rs:372:1:381:1 | exit fn match_pattern16 | | -| main.rs:372:22:381:1 | { ... } | main.rs:372:1:381:1 | exit fn match_pattern16 (normal) | | -| main.rs:373:5:373:21 | let ... = ... | main.rs:373:13:373:16 | Some | | -| main.rs:373:9:373:9 | x | main.rs:373:9:373:9 | x | | -| main.rs:373:9:373:9 | x | main.rs:374:11:374:11 | x | match | -| main.rs:373:13:373:16 | Some | main.rs:373:18:373:19 | 32 | | -| main.rs:373:13:373:20 | Some(...) | main.rs:373:9:373:9 | x | | -| main.rs:373:18:373:19 | 32 | main.rs:373:13:373:20 | Some(...) | | -| main.rs:374:5:380:5 | match x { ... } | main.rs:372:22:381:1 | { ... } | | -| main.rs:374:11:374:11 | x | main.rs:375:9:375:15 | Some(...) | | -| main.rs:375:9:375:15 | Some(...) | main.rs:375:14:375:14 | y | match | -| main.rs:375:9:375:15 | Some(...) | main.rs:379:9:379:9 | _ | no-match | -| main.rs:375:14:375:14 | y | main.rs:375:14:375:14 | y | | -| main.rs:375:14:375:14 | y | main.rs:377:17:377:20 | Some | match | -| main.rs:376:16:377:23 | [boolean(false)] let ... = ... | main.rs:379:9:379:9 | _ | false | -| main.rs:376:16:377:23 | [boolean(true)] let ... = ... | main.rs:378:16:378:24 | print_i64 | true | -| main.rs:376:20:376:26 | Some(...) | main.rs:376:16:377:23 | [boolean(false)] let ... = ... | no-match | -| main.rs:376:20:376:26 | Some(...) | main.rs:376:25:376:25 | y | match | -| main.rs:376:25:376:25 | y | main.rs:376:16:377:23 | [boolean(true)] let ... = ... | match | -| main.rs:376:25:376:25 | y | main.rs:376:25:376:25 | y | | -| main.rs:377:17:377:20 | Some | main.rs:377:22:377:22 | y | | -| main.rs:377:17:377:23 | Some(...) | main.rs:376:20:376:26 | Some(...) | | -| main.rs:377:22:377:22 | y | main.rs:377:17:377:23 | Some(...) | | -| main.rs:378:16:378:24 | print_i64 | main.rs:378:26:378:26 | y | | -| main.rs:378:16:378:27 | print_i64(...) | main.rs:374:5:380:5 | match x { ... } | | -| main.rs:378:26:378:26 | y | main.rs:378:16:378:27 | print_i64(...) | | -| main.rs:379:9:379:9 | _ | main.rs:379:14:379:15 | { ... } | match | -| main.rs:379:14:379:15 | { ... } | main.rs:374:5:380:5 | match x { ... } | | -| main.rs:383:1:393:1 | enter fn param_pattern1 | main.rs:384:5:384:6 | a8 | | -| main.rs:383:1:393:1 | exit fn param_pattern1 (normal) | main.rs:383:1:393:1 | exit fn param_pattern1 | | -| main.rs:384:5:384:6 | a8 | main.rs:384:5:384:6 | a8 | | -| main.rs:384:5:384:6 | a8 | main.rs:384:5:384:12 | ...: ... | match | -| main.rs:384:5:384:12 | ...: ... | main.rs:385:5:388:5 | TuplePat | | -| main.rs:385:5:388:5 | TuplePat | main.rs:386:9:386:10 | b3 | match | -| main.rs:385:5:388:19 | ...: ... | main.rs:390:5:390:18 | ExprStmt | | -| main.rs:386:9:386:10 | b3 | main.rs:386:9:386:10 | b3 | | -| main.rs:386:9:386:10 | b3 | main.rs:387:9:387:10 | c1 | match | -| main.rs:387:9:387:10 | c1 | main.rs:385:5:388:19 | ...: ... | match | -| main.rs:387:9:387:10 | c1 | main.rs:387:9:387:10 | c1 | | -| main.rs:389:9:393:1 | { ... } | main.rs:383:1:393:1 | exit fn param_pattern1 (normal) | | -| main.rs:390:5:390:13 | print_str | main.rs:390:15:390:16 | a8 | | -| main.rs:390:5:390:17 | print_str(...) | main.rs:391:5:391:18 | ExprStmt | | -| main.rs:390:5:390:18 | ExprStmt | main.rs:390:5:390:13 | print_str | | -| main.rs:390:15:390:16 | a8 | main.rs:390:5:390:17 | print_str(...) | | -| main.rs:391:5:391:13 | print_str | main.rs:391:15:391:16 | b3 | | -| main.rs:391:5:391:17 | print_str(...) | main.rs:392:5:392:18 | ExprStmt | | -| main.rs:391:5:391:18 | ExprStmt | main.rs:391:5:391:13 | print_str | | -| main.rs:391:15:391:16 | b3 | main.rs:391:5:391:17 | print_str(...) | | -| main.rs:392:5:392:13 | print_str | main.rs:392:15:392:16 | c1 | | -| main.rs:392:5:392:17 | print_str(...) | main.rs:389:9:393:1 | { ... } | | -| main.rs:392:5:392:18 | ExprStmt | main.rs:392:5:392:13 | print_str | | -| main.rs:392:15:392:16 | c1 | main.rs:392:5:392:17 | print_str(...) | | -| main.rs:395:1:398:1 | enter fn param_pattern2 | main.rs:395:20:395:35 | ...::Left(...) | | -| main.rs:395:1:398:1 | exit fn param_pattern2 (normal) | main.rs:395:1:398:1 | exit fn param_pattern2 | | -| main.rs:395:19:395:64 | ...: Either | main.rs:397:5:397:18 | ExprStmt | | -| main.rs:395:20:395:35 | ...::Left(...) | main.rs:395:33:395:34 | a9 | match | -| main.rs:395:20:395:35 | ...::Left(...) | main.rs:395:39:395:55 | ...::Right(...) | no-match | -| main.rs:395:20:395:55 | ... \| ... | main.rs:395:19:395:64 | ...: Either | match | -| main.rs:395:33:395:34 | a9 | main.rs:395:20:395:55 | ... \| ... | match | -| main.rs:395:33:395:34 | a9 | main.rs:395:33:395:34 | a9 | | -| main.rs:395:39:395:55 | ...::Right(...) | main.rs:395:53:395:54 | a9 | match | -| main.rs:395:53:395:54 | a9 | main.rs:395:20:395:55 | ... \| ... | match | -| main.rs:395:53:395:54 | a9 | main.rs:395:53:395:54 | a9 | | -| main.rs:396:9:398:1 | { ... } | main.rs:395:1:398:1 | exit fn param_pattern2 (normal) | | -| main.rs:397:5:397:13 | print_i64 | main.rs:397:15:397:16 | a9 | | -| main.rs:397:5:397:17 | print_i64(...) | main.rs:396:9:398:1 | { ... } | | -| main.rs:397:5:397:18 | ExprStmt | main.rs:397:5:397:13 | print_i64 | | -| main.rs:397:15:397:16 | a9 | main.rs:397:5:397:17 | print_i64(...) | | -| main.rs:400:1:435:1 | enter fn destruct_assignment | main.rs:401:5:405:18 | let ... = ... | | -| main.rs:400:1:435:1 | exit fn destruct_assignment (normal) | main.rs:400:1:435:1 | exit fn destruct_assignment | | -| main.rs:400:26:435:1 | { ... } | main.rs:400:1:435:1 | exit fn destruct_assignment (normal) | | -| main.rs:401:5:405:18 | let ... = ... | main.rs:405:10:405:10 | 1 | | -| main.rs:401:9:405:5 | TuplePat | main.rs:402:13:402:15 | a10 | match | -| main.rs:402:9:402:15 | mut a10 | main.rs:403:13:403:14 | b4 | match | -| main.rs:402:13:402:15 | a10 | main.rs:402:9:402:15 | mut a10 | | -| main.rs:403:9:403:14 | mut b4 | main.rs:404:13:404:14 | c2 | match | -| main.rs:403:13:403:14 | b4 | main.rs:403:9:403:14 | mut b4 | | -| main.rs:404:9:404:14 | mut c2 | main.rs:406:5:406:19 | ExprStmt | match | -| main.rs:404:13:404:14 | c2 | main.rs:404:9:404:14 | mut c2 | | -| main.rs:405:9:405:17 | TupleExpr | main.rs:401:9:405:5 | TuplePat | | -| main.rs:405:10:405:10 | 1 | main.rs:405:13:405:13 | 2 | | -| main.rs:405:13:405:13 | 2 | main.rs:405:16:405:16 | 3 | | -| main.rs:405:16:405:16 | 3 | main.rs:405:9:405:17 | TupleExpr | | -| main.rs:406:5:406:13 | print_i64 | main.rs:406:15:406:17 | a10 | | -| main.rs:406:5:406:18 | print_i64(...) | main.rs:407:5:407:18 | ExprStmt | | -| main.rs:406:5:406:19 | ExprStmt | main.rs:406:5:406:13 | print_i64 | | -| main.rs:406:15:406:17 | a10 | main.rs:406:5:406:18 | print_i64(...) | | -| main.rs:407:5:407:13 | print_i64 | main.rs:407:15:407:16 | b4 | | -| main.rs:407:5:407:17 | print_i64(...) | main.rs:408:5:408:18 | ExprStmt | | -| main.rs:407:5:407:18 | ExprStmt | main.rs:407:5:407:13 | print_i64 | | -| main.rs:407:15:407:16 | b4 | main.rs:407:5:407:17 | print_i64(...) | | -| main.rs:408:5:408:13 | print_i64 | main.rs:408:15:408:16 | c2 | | -| main.rs:408:5:408:17 | print_i64(...) | main.rs:410:5:418:6 | ExprStmt | | -| main.rs:408:5:408:18 | ExprStmt | main.rs:408:5:408:13 | print_i64 | | -| main.rs:408:15:408:16 | c2 | main.rs:408:5:408:17 | print_i64(...) | | -| main.rs:410:5:414:5 | TupleExpr | main.rs:415:9:415:11 | a10 | | -| main.rs:410:5:418:5 | ... = ... | main.rs:419:5:419:19 | ExprStmt | | -| main.rs:410:5:418:6 | ExprStmt | main.rs:411:9:411:10 | c2 | | -| main.rs:411:9:411:10 | c2 | main.rs:412:9:412:10 | b4 | | -| main.rs:412:9:412:10 | b4 | main.rs:413:9:413:11 | a10 | | -| main.rs:413:9:413:11 | a10 | main.rs:410:5:414:5 | TupleExpr | | -| main.rs:414:9:418:5 | TupleExpr | main.rs:410:5:418:5 | ... = ... | | -| main.rs:415:9:415:11 | a10 | main.rs:416:9:416:10 | b4 | | -| main.rs:416:9:416:10 | b4 | main.rs:417:9:417:10 | c2 | | -| main.rs:417:9:417:10 | c2 | main.rs:414:9:418:5 | TupleExpr | | -| main.rs:419:5:419:13 | print_i64 | main.rs:419:15:419:17 | a10 | | -| main.rs:419:5:419:18 | print_i64(...) | main.rs:420:5:420:18 | ExprStmt | | -| main.rs:419:5:419:19 | ExprStmt | main.rs:419:5:419:13 | print_i64 | | -| main.rs:419:15:419:17 | a10 | main.rs:419:5:419:18 | print_i64(...) | | -| main.rs:420:5:420:13 | print_i64 | main.rs:420:15:420:16 | b4 | | -| main.rs:420:5:420:17 | print_i64(...) | main.rs:421:5:421:18 | ExprStmt | | -| main.rs:420:5:420:18 | ExprStmt | main.rs:420:5:420:13 | print_i64 | | -| main.rs:420:15:420:16 | b4 | main.rs:420:5:420:17 | print_i64(...) | | -| main.rs:421:5:421:13 | print_i64 | main.rs:421:15:421:16 | c2 | | -| main.rs:421:5:421:17 | print_i64(...) | main.rs:423:5:431:5 | ExprStmt | | -| main.rs:421:5:421:18 | ExprStmt | main.rs:421:5:421:13 | print_i64 | | -| main.rs:421:15:421:16 | c2 | main.rs:421:5:421:17 | print_i64(...) | | -| main.rs:423:5:431:5 | ExprStmt | main.rs:423:12:423:12 | 4 | | -| main.rs:423:5:431:5 | match ... { ... } | main.rs:433:5:433:19 | ExprStmt | | -| main.rs:423:11:423:16 | TupleExpr | main.rs:424:9:427:9 | TuplePat | | -| main.rs:423:12:423:12 | 4 | main.rs:423:15:423:15 | 5 | | -| main.rs:423:15:423:15 | 5 | main.rs:423:11:423:16 | TupleExpr | | -| main.rs:424:9:427:9 | TuplePat | main.rs:425:13:425:15 | a10 | match | -| main.rs:425:13:425:15 | a10 | main.rs:425:13:425:15 | a10 | | -| main.rs:425:13:425:15 | a10 | main.rs:426:13:426:14 | b4 | match | -| main.rs:426:13:426:14 | b4 | main.rs:426:13:426:14 | b4 | | -| main.rs:426:13:426:14 | b4 | main.rs:428:13:428:27 | ExprStmt | match | -| main.rs:427:14:430:9 | { ... } | main.rs:423:5:431:5 | match ... { ... } | | -| main.rs:428:13:428:21 | print_i64 | main.rs:428:23:428:25 | a10 | | -| main.rs:428:13:428:26 | print_i64(...) | main.rs:429:13:429:26 | ExprStmt | | -| main.rs:428:13:428:27 | ExprStmt | main.rs:428:13:428:21 | print_i64 | | -| main.rs:428:23:428:25 | a10 | main.rs:428:13:428:26 | print_i64(...) | | -| main.rs:429:13:429:21 | print_i64 | main.rs:429:23:429:24 | b4 | | -| main.rs:429:13:429:25 | print_i64(...) | main.rs:427:14:430:9 | { ... } | | -| main.rs:429:13:429:26 | ExprStmt | main.rs:429:13:429:21 | print_i64 | | -| main.rs:429:23:429:24 | b4 | main.rs:429:13:429:25 | print_i64(...) | | -| main.rs:433:5:433:13 | print_i64 | main.rs:433:15:433:17 | a10 | | -| main.rs:433:5:433:18 | print_i64(...) | main.rs:434:5:434:18 | ExprStmt | | -| main.rs:433:5:433:19 | ExprStmt | main.rs:433:5:433:13 | print_i64 | | -| main.rs:433:15:433:17 | a10 | main.rs:433:5:433:18 | print_i64(...) | | -| main.rs:434:5:434:13 | print_i64 | main.rs:434:15:434:16 | b4 | | -| main.rs:434:5:434:17 | print_i64(...) | main.rs:400:26:435:1 | { ... } | | -| main.rs:434:5:434:18 | ExprStmt | main.rs:434:5:434:13 | print_i64 | | -| main.rs:434:15:434:16 | b4 | main.rs:434:5:434:17 | print_i64(...) | | -| main.rs:437:1:452:1 | enter fn closure_variable | main.rs:438:5:440:10 | let ... = ... | | -| main.rs:437:1:452:1 | exit fn closure_variable (normal) | main.rs:437:1:452:1 | exit fn closure_variable | | -| main.rs:437:23:452:1 | { ... } | main.rs:437:1:452:1 | exit fn closure_variable (normal) | | -| main.rs:438:5:440:10 | let ... = ... | main.rs:439:9:440:9 | \|...\| x | | -| main.rs:438:9:438:23 | example_closure | main.rs:438:9:438:23 | example_closure | | -| main.rs:438:9:438:23 | example_closure | main.rs:441:5:442:27 | let ... = ... | match | -| main.rs:439:9:440:9 | \|...\| x | main.rs:438:9:438:23 | example_closure | | -| main.rs:439:9:440:9 | enter \|...\| x | main.rs:439:10:439:10 | x | | -| main.rs:439:9:440:9 | exit \|...\| x (normal) | main.rs:439:9:440:9 | exit \|...\| x | | -| main.rs:439:10:439:10 | x | main.rs:439:10:439:10 | x | | -| main.rs:439:10:439:10 | x | main.rs:439:10:439:15 | ...: i64 | match | -| main.rs:439:10:439:15 | ...: i64 | main.rs:440:9:440:9 | x | | -| main.rs:440:9:440:9 | x | main.rs:439:9:440:9 | exit \|...\| x (normal) | | -| main.rs:441:5:442:27 | let ... = ... | main.rs:442:9:442:23 | example_closure | | -| main.rs:441:9:441:10 | n1 | main.rs:441:9:441:10 | n1 | | -| main.rs:441:9:441:10 | n1 | main.rs:443:5:443:18 | ExprStmt | match | -| main.rs:442:9:442:23 | example_closure | main.rs:442:25:442:25 | 5 | | -| main.rs:442:9:442:26 | example_closure(...) | main.rs:441:9:441:10 | n1 | | -| main.rs:442:25:442:25 | 5 | main.rs:442:9:442:26 | example_closure(...) | | -| main.rs:443:5:443:13 | print_i64 | main.rs:443:15:443:16 | n1 | | -| main.rs:443:5:443:17 | print_i64(...) | main.rs:445:5:445:25 | ExprStmt | | +| main.rs:337:7:337:10 | Some | main.rs:337:12:337:12 | x | | +| main.rs:337:7:337:13 | Some(...) | main.rs:336:9:336:15 | Some(...) | | +| main.rs:337:12:337:12 | x | main.rs:337:7:337:13 | Some(...) | | +| main.rs:339:5:339:5 | x | main.rs:339:9:339:9 | 0 | | +| main.rs:339:5:339:9 | ... > ... | main.rs:333:8:339:9 | [boolean(false)] ... && ... | false | +| main.rs:339:5:339:9 | ... > ... | main.rs:333:8:339:9 | [boolean(true)] ... && ... | true | +| main.rs:339:9:339:9 | 0 | main.rs:339:5:339:9 | ... > ... | | +| main.rs:340:5:342:5 | { ... } | main.rs:333:5:346:5 | if ... {...} else {...} | | +| main.rs:341:9:341:17 | print_i64 | main.rs:341:19:341:19 | x | | +| main.rs:341:9:341:20 | print_i64(...) | main.rs:340:5:342:5 | { ... } | | +| main.rs:341:9:341:21 | ExprStmt | main.rs:341:9:341:17 | print_i64 | | +| main.rs:341:19:341:19 | x | main.rs:341:9:341:20 | print_i64(...) | | +| main.rs:342:12:346:5 | { ... } | main.rs:333:5:346:5 | if ... {...} else {...} | | +| main.rs:343:9:344:14 | let ... = x | main.rs:344:13:344:13 | x | | +| main.rs:343:13:343:13 | x | main.rs:343:13:343:13 | x | | +| main.rs:343:13:343:13 | x | main.rs:345:9:345:30 | ExprStmt | match | +| main.rs:344:13:344:13 | x | main.rs:343:13:343:13 | x | | +| main.rs:345:9:345:17 | print_i64 | main.rs:345:19:345:19 | x | | +| main.rs:345:9:345:29 | print_i64(...) | main.rs:342:12:346:5 | { ... } | | +| main.rs:345:9:345:30 | ExprStmt | main.rs:345:9:345:17 | print_i64 | | +| main.rs:345:19:345:19 | x | main.rs:345:19:345:28 | x.unwrap() | | +| main.rs:345:19:345:28 | x.unwrap() | main.rs:345:9:345:29 | print_i64(...) | | +| main.rs:349:1:365:1 | enter fn match_pattern12 | main.rs:351:5:351:21 | let ... = ... | | +| main.rs:349:1:365:1 | exit fn match_pattern12 (normal) | main.rs:349:1:365:1 | exit fn match_pattern12 | | +| main.rs:350:22:365:1 | { ... } | main.rs:349:1:365:1 | exit fn match_pattern12 (normal) | | +| main.rs:351:5:351:21 | let ... = ... | main.rs:351:13:351:16 | Some | | +| main.rs:351:9:351:9 | x | main.rs:351:9:351:9 | x | | +| main.rs:351:9:351:9 | x | main.rs:352:5:362:5 | ExprStmt | match | +| main.rs:351:13:351:16 | Some | main.rs:351:18:351:19 | 42 | | +| main.rs:351:13:351:20 | Some(...) | main.rs:351:9:351:9 | x | | +| main.rs:351:18:351:19 | 42 | main.rs:351:13:351:20 | Some(...) | | +| main.rs:352:5:362:5 | ExprStmt | main.rs:353:7:353:7 | x | | +| main.rs:352:5:362:5 | while ... { ... } | main.rs:364:5:364:26 | ExprStmt | | +| main.rs:352:11:353:7 | [boolean(false)] let ... = x | main.rs:352:11:356:13 | [boolean(false)] ... && ... | false | +| main.rs:352:11:353:7 | [boolean(true)] let ... = x | main.rs:356:7:356:10 | Some | true | +| main.rs:352:11:356:13 | [boolean(false)] ... && ... | main.rs:352:11:358:9 | [boolean(false)] ... && ... | false | +| main.rs:352:11:356:13 | [boolean(true)] ... && ... | main.rs:358:5:358:5 | x | true | +| main.rs:352:11:358:9 | [boolean(false)] ... && ... | main.rs:352:5:362:5 | while ... { ... } | false | +| main.rs:352:11:358:9 | [boolean(true)] ... && ... | main.rs:360:9:360:21 | ExprStmt | true | +| main.rs:352:15:352:21 | Some(...) | main.rs:352:11:353:7 | [boolean(false)] let ... = x | no-match | +| main.rs:352:15:352:21 | Some(...) | main.rs:352:20:352:20 | x | match | +| main.rs:352:20:352:20 | x | main.rs:352:11:353:7 | [boolean(true)] let ... = x | match | +| main.rs:352:20:352:20 | x | main.rs:352:20:352:20 | x | | +| main.rs:353:7:353:7 | x | main.rs:352:15:352:21 | Some(...) | | +| main.rs:355:5:356:13 | [boolean(false)] let ... = ... | main.rs:352:11:356:13 | [boolean(false)] ... && ... | false | +| main.rs:355:5:356:13 | [boolean(true)] let ... = ... | main.rs:352:11:356:13 | [boolean(true)] ... && ... | true | +| main.rs:355:9:355:15 | Some(...) | main.rs:355:5:356:13 | [boolean(false)] let ... = ... | no-match | +| main.rs:355:9:355:15 | Some(...) | main.rs:355:14:355:14 | x | match | +| main.rs:355:14:355:14 | x | main.rs:355:5:356:13 | [boolean(true)] let ... = ... | match | +| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | | +| main.rs:356:7:356:10 | Some | main.rs:356:12:356:12 | x | | +| main.rs:356:7:356:13 | Some(...) | main.rs:355:9:355:15 | Some(...) | | +| main.rs:356:12:356:12 | x | main.rs:356:7:356:13 | Some(...) | | +| main.rs:358:5:358:5 | x | main.rs:358:9:358:9 | 0 | | +| main.rs:358:5:358:9 | ... > ... | main.rs:352:11:358:9 | [boolean(false)] ... && ... | false | +| main.rs:358:5:358:9 | ... > ... | main.rs:352:11:358:9 | [boolean(true)] ... && ... | true | +| main.rs:358:9:358:9 | 0 | main.rs:358:5:358:9 | ... > ... | | +| main.rs:360:9:360:17 | print_i64 | main.rs:360:19:360:19 | x | | +| main.rs:360:9:360:20 | print_i64(...) | main.rs:361:9:361:14 | ExprStmt | | +| main.rs:360:9:360:21 | ExprStmt | main.rs:360:9:360:17 | print_i64 | | +| main.rs:360:19:360:19 | x | main.rs:360:9:360:20 | print_i64(...) | | +| main.rs:361:9:361:13 | break | main.rs:352:5:362:5 | while ... { ... } | break | +| main.rs:361:9:361:14 | ExprStmt | main.rs:361:9:361:13 | break | | +| main.rs:364:5:364:13 | print_i64 | main.rs:364:15:364:15 | x | | +| main.rs:364:5:364:25 | print_i64(...) | main.rs:350:22:365:1 | { ... } | | +| main.rs:364:5:364:26 | ExprStmt | main.rs:364:5:364:13 | print_i64 | | +| main.rs:364:15:364:15 | x | main.rs:364:15:364:24 | x.unwrap() | | +| main.rs:364:15:364:24 | x.unwrap() | main.rs:364:5:364:25 | print_i64(...) | | +| main.rs:367:1:379:1 | enter fn match_pattern13 | main.rs:369:5:369:21 | let ... = ... | | +| main.rs:367:1:379:1 | exit fn match_pattern13 (normal) | main.rs:367:1:379:1 | exit fn match_pattern13 | | +| main.rs:368:22:379:1 | { ... } | main.rs:367:1:379:1 | exit fn match_pattern13 (normal) | | +| main.rs:369:5:369:21 | let ... = ... | main.rs:369:13:369:16 | Some | | +| main.rs:369:9:369:9 | x | main.rs:369:9:369:9 | x | | +| main.rs:369:9:369:9 | x | main.rs:370:5:376:5 | ExprStmt | match | +| main.rs:369:13:369:16 | Some | main.rs:369:18:369:19 | 42 | | +| main.rs:369:13:369:20 | Some(...) | main.rs:369:9:369:9 | x | | +| main.rs:369:18:369:19 | 42 | main.rs:369:13:369:20 | Some(...) | | +| main.rs:370:5:376:5 | ExprStmt | main.rs:370:11:370:11 | x | | +| main.rs:370:5:376:5 | match x { ... } | main.rs:378:5:378:26 | ExprStmt | | +| main.rs:370:11:370:11 | x | main.rs:371:9:371:15 | Some(...) | | +| main.rs:371:9:371:15 | Some(...) | main.rs:371:14:371:14 | x | match | +| main.rs:371:9:371:15 | Some(...) | main.rs:375:9:375:9 | _ | no-match | +| main.rs:371:14:371:14 | x | main.rs:371:14:371:14 | x | | +| main.rs:371:14:371:14 | x | main.rs:373:18:373:18 | x | match | +| main.rs:372:16:373:18 | [boolean(true)] let ... = x | main.rs:374:19:374:19 | x | true | +| main.rs:372:16:374:23 | [boolean(false)] ... && ... | main.rs:375:9:375:9 | _ | false | +| main.rs:372:16:374:23 | [boolean(true)] ... && ... | main.rs:374:28:374:29 | TupleExpr | true | +| main.rs:372:20:372:20 | x | main.rs:372:16:373:18 | [boolean(true)] let ... = x | match | +| main.rs:372:20:372:20 | x | main.rs:372:20:372:20 | x | | +| main.rs:373:18:373:18 | x | main.rs:372:20:372:20 | x | | +| main.rs:374:19:374:19 | x | main.rs:374:23:374:23 | 0 | | +| main.rs:374:19:374:23 | ... > ... | main.rs:372:16:374:23 | [boolean(false)] ... && ... | false | +| main.rs:374:19:374:23 | ... > ... | main.rs:372:16:374:23 | [boolean(true)] ... && ... | true | +| main.rs:374:23:374:23 | 0 | main.rs:374:19:374:23 | ... > ... | | +| main.rs:374:28:374:29 | TupleExpr | main.rs:370:5:376:5 | match x { ... } | | +| main.rs:375:9:375:9 | _ | main.rs:375:14:375:15 | TupleExpr | match | +| main.rs:375:14:375:15 | TupleExpr | main.rs:370:5:376:5 | match x { ... } | | +| main.rs:378:5:378:13 | print_i64 | main.rs:378:15:378:15 | x | | +| main.rs:378:5:378:25 | print_i64(...) | main.rs:368:22:379:1 | { ... } | | +| main.rs:378:5:378:26 | ExprStmt | main.rs:378:5:378:13 | print_i64 | | +| main.rs:378:15:378:15 | x | main.rs:378:15:378:24 | x.unwrap() | | +| main.rs:378:15:378:24 | x.unwrap() | main.rs:378:5:378:25 | print_i64(...) | | +| main.rs:381:1:396:1 | enter fn match_pattern14 | main.rs:383:5:383:19 | let ... = ... | | +| main.rs:381:1:396:1 | exit fn match_pattern14 (normal) | main.rs:381:1:396:1 | exit fn match_pattern14 | | +| main.rs:382:22:396:1 | { ... } | main.rs:381:1:396:1 | exit fn match_pattern14 (normal) | | +| main.rs:383:5:383:19 | let ... = ... | main.rs:383:13:383:14 | Ok | | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | | +| main.rs:383:9:383:9 | x | main.rs:385:7:385:7 | x | match | +| main.rs:383:13:383:14 | Ok | main.rs:383:16:383:17 | 42 | | +| main.rs:383:13:383:18 | Ok(...) | main.rs:383:9:383:9 | x | | +| main.rs:383:16:383:17 | 42 | main.rs:383:13:383:18 | Ok(...) | | +| main.rs:384:5:395:5 | if ... {...} else {...} | main.rs:382:22:396:1 | { ... } | | +| main.rs:384:8:385:7 | [boolean(false)] let ... = x | main.rs:390:7:390:7 | x | false | +| main.rs:384:8:385:7 | [boolean(true)] let ... = x | main.rs:387:9:387:21 | ExprStmt | true | +| main.rs:384:12:384:17 | Err(...) | main.rs:384:8:385:7 | [boolean(false)] let ... = x | no-match | +| main.rs:384:12:384:17 | Err(...) | main.rs:384:16:384:16 | x | match | +| main.rs:384:16:384:16 | x | main.rs:384:8:385:7 | [boolean(true)] let ... = x | match | +| main.rs:384:16:384:16 | x | main.rs:384:16:384:16 | x | | +| main.rs:385:7:385:7 | x | main.rs:384:12:384:17 | Err(...) | | +| main.rs:386:5:388:5 | { ... } | main.rs:384:5:395:5 | if ... {...} else {...} | | +| main.rs:387:9:387:17 | print_i64 | main.rs:387:19:387:19 | x | | +| main.rs:387:9:387:20 | print_i64(...) | main.rs:386:5:388:5 | { ... } | | +| main.rs:387:9:387:21 | ExprStmt | main.rs:387:9:387:17 | print_i64 | | +| main.rs:387:19:387:19 | x | main.rs:387:9:387:20 | print_i64(...) | | +| main.rs:389:10:395:5 | if ... {...} else {...} | main.rs:384:5:395:5 | if ... {...} else {...} | | +| main.rs:389:13:390:7 | [boolean(false)] let ... = x | main.rs:394:9:394:30 | ExprStmt | false | +| main.rs:389:13:390:7 | [boolean(true)] let ... = x | main.rs:392:9:392:21 | ExprStmt | true | +| main.rs:389:17:389:21 | Ok(...) | main.rs:389:13:390:7 | [boolean(false)] let ... = x | no-match | +| main.rs:389:17:389:21 | Ok(...) | main.rs:389:20:389:20 | x | match | +| main.rs:389:20:389:20 | x | main.rs:389:13:390:7 | [boolean(true)] let ... = x | match | +| main.rs:389:20:389:20 | x | main.rs:389:20:389:20 | x | | +| main.rs:390:7:390:7 | x | main.rs:389:17:389:21 | Ok(...) | | +| main.rs:391:5:393:5 | { ... } | main.rs:389:10:395:5 | if ... {...} else {...} | | +| main.rs:392:9:392:17 | print_i64 | main.rs:392:19:392:19 | x | | +| main.rs:392:9:392:20 | print_i64(...) | main.rs:391:5:393:5 | { ... } | | +| main.rs:392:9:392:21 | ExprStmt | main.rs:392:9:392:17 | print_i64 | | +| main.rs:392:19:392:19 | x | main.rs:392:9:392:20 | print_i64(...) | | +| main.rs:393:12:395:5 | { ... } | main.rs:389:10:395:5 | if ... {...} else {...} | | +| main.rs:394:9:394:17 | print_i64 | main.rs:394:19:394:19 | x | | +| main.rs:394:9:394:29 | print_i64(...) | main.rs:393:12:395:5 | { ... } | | +| main.rs:394:9:394:30 | ExprStmt | main.rs:394:9:394:17 | print_i64 | | +| main.rs:394:19:394:19 | x | main.rs:394:19:394:28 | x.unwrap() | | +| main.rs:394:19:394:28 | x.unwrap() | main.rs:394:9:394:29 | print_i64(...) | | +| main.rs:398:1:405:1 | enter fn match_pattern15 | main.rs:399:5:399:20 | let ... = ... | | +| main.rs:398:1:405:1 | exit fn match_pattern15 (normal) | main.rs:398:1:405:1 | exit fn match_pattern15 | | +| main.rs:398:22:405:1 | { ... } | main.rs:398:1:405:1 | exit fn match_pattern15 (normal) | | +| main.rs:399:5:399:20 | let ... = ... | main.rs:399:13:399:16 | Some | | +| main.rs:399:9:399:9 | x | main.rs:399:9:399:9 | x | | +| main.rs:399:9:399:9 | x | main.rs:400:5:404:10 | ExprStmt | match | +| main.rs:399:13:399:16 | Some | main.rs:399:18:399:18 | 0 | | +| main.rs:399:13:399:19 | Some(...) | main.rs:399:9:399:9 | x | | +| main.rs:399:18:399:18 | 0 | main.rs:399:13:399:19 | Some(...) | | +| main.rs:400:5:404:9 | match x { ... } | main.rs:398:22:405:1 | { ... } | | +| main.rs:400:5:404:10 | ExprStmt | main.rs:400:11:400:11 | x | | +| main.rs:400:11:400:11 | x | main.rs:401:13:401:19 | Some(...) | | +| main.rs:401:13:401:19 | Some(...) | main.rs:401:18:401:18 | x | match | +| main.rs:401:13:401:19 | Some(...) | main.rs:403:13:403:13 | _ | no-match | +| main.rs:401:18:401:18 | x | main.rs:401:18:401:18 | x | | +| main.rs:401:18:401:18 | x | main.rs:402:20:402:20 | x | match | +| main.rs:402:20:402:20 | x | main.rs:400:5:404:9 | match x { ... } | | +| main.rs:403:13:403:13 | _ | main.rs:403:18:403:18 | 0 | match | +| main.rs:403:18:403:18 | 0 | main.rs:400:5:404:9 | match x { ... } | | +| main.rs:407:1:417:1 | enter fn match_pattern16 | main.rs:408:5:408:21 | let ... = ... | | +| main.rs:407:1:417:1 | exit fn match_pattern16 (normal) | main.rs:407:1:417:1 | exit fn match_pattern16 | | +| main.rs:407:22:417:1 | { ... } | main.rs:407:1:417:1 | exit fn match_pattern16 (normal) | | +| main.rs:408:5:408:21 | let ... = ... | main.rs:408:13:408:16 | Some | | +| main.rs:408:9:408:9 | x | main.rs:408:9:408:9 | x | | +| main.rs:408:9:408:9 | x | main.rs:409:11:409:11 | x | match | +| main.rs:408:13:408:16 | Some | main.rs:408:18:408:19 | 32 | | +| main.rs:408:13:408:20 | Some(...) | main.rs:408:9:408:9 | x | | +| main.rs:408:18:408:19 | 32 | main.rs:408:13:408:20 | Some(...) | | +| main.rs:409:5:416:5 | match x { ... } | main.rs:407:22:417:1 | { ... } | | +| main.rs:409:11:409:11 | x | main.rs:410:9:410:15 | Some(...) | | +| main.rs:410:9:410:15 | Some(...) | main.rs:410:14:410:14 | y | match | +| main.rs:410:9:410:15 | Some(...) | main.rs:415:9:415:9 | _ | no-match | +| main.rs:410:14:410:14 | y | main.rs:410:14:410:14 | y | | +| main.rs:410:14:410:14 | y | main.rs:411:16:411:16 | y | match | +| main.rs:411:16:411:16 | y | main.rs:411:20:411:20 | 0 | | +| main.rs:411:16:411:20 | ... > ... | main.rs:411:16:413:23 | [boolean(false)] ... && ... | false | +| main.rs:411:16:411:20 | ... > ... | main.rs:413:17:413:20 | Some | true | +| main.rs:411:16:413:23 | [boolean(false)] ... && ... | main.rs:415:9:415:9 | _ | false | +| main.rs:411:16:413:23 | [boolean(true)] ... && ... | main.rs:414:16:414:24 | print_i64 | true | +| main.rs:411:20:411:20 | 0 | main.rs:411:16:411:20 | ... > ... | | +| main.rs:412:13:413:23 | [boolean(false)] let ... = ... | main.rs:411:16:413:23 | [boolean(false)] ... && ... | false | +| main.rs:412:13:413:23 | [boolean(true)] let ... = ... | main.rs:411:16:413:23 | [boolean(true)] ... && ... | true | +| main.rs:412:17:412:23 | Some(...) | main.rs:412:13:413:23 | [boolean(false)] let ... = ... | no-match | +| main.rs:412:17:412:23 | Some(...) | main.rs:412:22:412:22 | y | match | +| main.rs:412:22:412:22 | y | main.rs:412:13:413:23 | [boolean(true)] let ... = ... | match | +| main.rs:412:22:412:22 | y | main.rs:412:22:412:22 | y | | +| main.rs:413:17:413:20 | Some | main.rs:413:22:413:22 | y | | +| main.rs:413:17:413:23 | Some(...) | main.rs:412:17:412:23 | Some(...) | | +| main.rs:413:22:413:22 | y | main.rs:413:17:413:23 | Some(...) | | +| main.rs:414:16:414:24 | print_i64 | main.rs:414:26:414:26 | y | | +| main.rs:414:16:414:27 | print_i64(...) | main.rs:409:5:416:5 | match x { ... } | | +| main.rs:414:26:414:26 | y | main.rs:414:16:414:27 | print_i64(...) | | +| main.rs:415:9:415:9 | _ | main.rs:415:14:415:15 | { ... } | match | +| main.rs:415:14:415:15 | { ... } | main.rs:409:5:416:5 | match x { ... } | | +| main.rs:419:1:429:1 | enter fn param_pattern1 | main.rs:420:5:420:6 | a8 | | +| main.rs:419:1:429:1 | exit fn param_pattern1 (normal) | main.rs:419:1:429:1 | exit fn param_pattern1 | | +| main.rs:420:5:420:6 | a8 | main.rs:420:5:420:6 | a8 | | +| main.rs:420:5:420:6 | a8 | main.rs:420:5:420:12 | ...: ... | match | +| main.rs:420:5:420:12 | ...: ... | main.rs:421:5:424:5 | TuplePat | | +| main.rs:421:5:424:5 | TuplePat | main.rs:422:9:422:10 | b3 | match | +| main.rs:421:5:424:19 | ...: ... | main.rs:426:5:426:18 | ExprStmt | | +| main.rs:422:9:422:10 | b3 | main.rs:422:9:422:10 | b3 | | +| main.rs:422:9:422:10 | b3 | main.rs:423:9:423:10 | c1 | match | +| main.rs:423:9:423:10 | c1 | main.rs:421:5:424:19 | ...: ... | match | +| main.rs:423:9:423:10 | c1 | main.rs:423:9:423:10 | c1 | | +| main.rs:425:9:429:1 | { ... } | main.rs:419:1:429:1 | exit fn param_pattern1 (normal) | | +| main.rs:426:5:426:13 | print_str | main.rs:426:15:426:16 | a8 | | +| main.rs:426:5:426:17 | print_str(...) | main.rs:427:5:427:18 | ExprStmt | | +| main.rs:426:5:426:18 | ExprStmt | main.rs:426:5:426:13 | print_str | | +| main.rs:426:15:426:16 | a8 | main.rs:426:5:426:17 | print_str(...) | | +| main.rs:427:5:427:13 | print_str | main.rs:427:15:427:16 | b3 | | +| main.rs:427:5:427:17 | print_str(...) | main.rs:428:5:428:18 | ExprStmt | | +| main.rs:427:5:427:18 | ExprStmt | main.rs:427:5:427:13 | print_str | | +| main.rs:427:15:427:16 | b3 | main.rs:427:5:427:17 | print_str(...) | | +| main.rs:428:5:428:13 | print_str | main.rs:428:15:428:16 | c1 | | +| main.rs:428:5:428:17 | print_str(...) | main.rs:425:9:429:1 | { ... } | | +| main.rs:428:5:428:18 | ExprStmt | main.rs:428:5:428:13 | print_str | | +| main.rs:428:15:428:16 | c1 | main.rs:428:5:428:17 | print_str(...) | | +| main.rs:431:1:434:1 | enter fn param_pattern2 | main.rs:431:20:431:35 | ...::Left(...) | | +| main.rs:431:1:434:1 | exit fn param_pattern2 (normal) | main.rs:431:1:434:1 | exit fn param_pattern2 | | +| main.rs:431:19:431:64 | ...: Either | main.rs:433:5:433:18 | ExprStmt | | +| main.rs:431:20:431:35 | ...::Left(...) | main.rs:431:33:431:34 | a9 | match | +| main.rs:431:20:431:35 | ...::Left(...) | main.rs:431:39:431:55 | ...::Right(...) | no-match | +| main.rs:431:20:431:55 | ... \| ... | main.rs:431:19:431:64 | ...: Either | match | +| main.rs:431:33:431:34 | a9 | main.rs:431:20:431:55 | ... \| ... | match | +| main.rs:431:33:431:34 | a9 | main.rs:431:33:431:34 | a9 | | +| main.rs:431:39:431:55 | ...::Right(...) | main.rs:431:53:431:54 | a9 | match | +| main.rs:431:53:431:54 | a9 | main.rs:431:20:431:55 | ... \| ... | match | +| main.rs:431:53:431:54 | a9 | main.rs:431:53:431:54 | a9 | | +| main.rs:432:9:434:1 | { ... } | main.rs:431:1:434:1 | exit fn param_pattern2 (normal) | | +| main.rs:433:5:433:13 | print_i64 | main.rs:433:15:433:16 | a9 | | +| main.rs:433:5:433:17 | print_i64(...) | main.rs:432:9:434:1 | { ... } | | +| main.rs:433:5:433:18 | ExprStmt | main.rs:433:5:433:13 | print_i64 | | +| main.rs:433:15:433:16 | a9 | main.rs:433:5:433:17 | print_i64(...) | | +| main.rs:436:1:471:1 | enter fn destruct_assignment | main.rs:437:5:441:18 | let ... = ... | | +| main.rs:436:1:471:1 | exit fn destruct_assignment (normal) | main.rs:436:1:471:1 | exit fn destruct_assignment | | +| main.rs:436:26:471:1 | { ... } | main.rs:436:1:471:1 | exit fn destruct_assignment (normal) | | +| main.rs:437:5:441:18 | let ... = ... | main.rs:441:10:441:10 | 1 | | +| main.rs:437:9:441:5 | TuplePat | main.rs:438:13:438:15 | a10 | match | +| main.rs:438:9:438:15 | mut a10 | main.rs:439:13:439:14 | b4 | match | +| main.rs:438:13:438:15 | a10 | main.rs:438:9:438:15 | mut a10 | | +| main.rs:439:9:439:14 | mut b4 | main.rs:440:13:440:14 | c2 | match | +| main.rs:439:13:439:14 | b4 | main.rs:439:9:439:14 | mut b4 | | +| main.rs:440:9:440:14 | mut c2 | main.rs:442:5:442:19 | ExprStmt | match | +| main.rs:440:13:440:14 | c2 | main.rs:440:9:440:14 | mut c2 | | +| main.rs:441:9:441:17 | TupleExpr | main.rs:437:9:441:5 | TuplePat | | +| main.rs:441:10:441:10 | 1 | main.rs:441:13:441:13 | 2 | | +| main.rs:441:13:441:13 | 2 | main.rs:441:16:441:16 | 3 | | +| main.rs:441:16:441:16 | 3 | main.rs:441:9:441:17 | TupleExpr | | +| main.rs:442:5:442:13 | print_i64 | main.rs:442:15:442:17 | a10 | | +| main.rs:442:5:442:18 | print_i64(...) | main.rs:443:5:443:18 | ExprStmt | | +| main.rs:442:5:442:19 | ExprStmt | main.rs:442:5:442:13 | print_i64 | | +| main.rs:442:15:442:17 | a10 | main.rs:442:5:442:18 | print_i64(...) | | +| main.rs:443:5:443:13 | print_i64 | main.rs:443:15:443:16 | b4 | | +| main.rs:443:5:443:17 | print_i64(...) | main.rs:444:5:444:18 | ExprStmt | | | main.rs:443:5:443:18 | ExprStmt | main.rs:443:5:443:13 | print_i64 | | -| main.rs:443:15:443:16 | n1 | main.rs:443:5:443:17 | print_i64(...) | | -| main.rs:445:5:445:22 | immutable_variable | main.rs:445:5:445:24 | immutable_variable(...) | | -| main.rs:445:5:445:24 | immutable_variable(...) | main.rs:446:5:448:10 | let ... = ... | | -| main.rs:445:5:445:25 | ExprStmt | main.rs:445:5:445:22 | immutable_variable | | -| main.rs:446:5:448:10 | let ... = ... | main.rs:447:5:448:9 | \|...\| x | | -| main.rs:446:9:446:26 | immutable_variable | main.rs:446:9:446:26 | immutable_variable | | -| main.rs:446:9:446:26 | immutable_variable | main.rs:449:5:450:30 | let ... = ... | match | -| main.rs:447:5:448:9 | \|...\| x | main.rs:446:9:446:26 | immutable_variable | | -| main.rs:447:5:448:9 | enter \|...\| x | main.rs:447:6:447:6 | x | | -| main.rs:447:5:448:9 | exit \|...\| x (normal) | main.rs:447:5:448:9 | exit \|...\| x | | -| main.rs:447:6:447:6 | x | main.rs:447:6:447:6 | x | | -| main.rs:447:6:447:6 | x | main.rs:447:6:447:11 | ...: i64 | match | -| main.rs:447:6:447:11 | ...: i64 | main.rs:448:9:448:9 | x | | -| main.rs:448:9:448:9 | x | main.rs:447:5:448:9 | exit \|...\| x (normal) | | -| main.rs:449:5:450:30 | let ... = ... | main.rs:450:9:450:26 | immutable_variable | | -| main.rs:449:9:449:10 | n2 | main.rs:449:9:449:10 | n2 | | -| main.rs:449:9:449:10 | n2 | main.rs:451:5:451:18 | ExprStmt | match | -| main.rs:450:9:450:26 | immutable_variable | main.rs:450:28:450:28 | 6 | | -| main.rs:450:9:450:29 | immutable_variable(...) | main.rs:449:9:449:10 | n2 | | -| main.rs:450:28:450:28 | 6 | main.rs:450:9:450:29 | immutable_variable(...) | | -| main.rs:451:5:451:13 | print_i64 | main.rs:451:15:451:16 | n2 | | -| main.rs:451:5:451:17 | print_i64(...) | main.rs:437:23:452:1 | { ... } | | -| main.rs:451:5:451:18 | ExprStmt | main.rs:451:5:451:13 | print_i64 | | -| main.rs:451:15:451:16 | n2 | main.rs:451:5:451:17 | print_i64(...) | | -| main.rs:454:1:484:1 | enter fn nested_function | main.rs:456:5:458:10 | let ... = ... | | -| main.rs:454:1:484:1 | exit fn nested_function (normal) | main.rs:454:1:484:1 | exit fn nested_function | | -| main.rs:454:22:484:1 | { ... } | main.rs:454:1:484:1 | exit fn nested_function (normal) | | -| main.rs:456:5:458:10 | let ... = ... | main.rs:457:9:458:9 | \|...\| x | | -| main.rs:456:9:456:9 | f | main.rs:456:9:456:9 | f | | -| main.rs:456:9:456:9 | f | main.rs:459:5:459:20 | ExprStmt | match | -| main.rs:457:9:458:9 | \|...\| x | main.rs:456:9:456:9 | f | | -| main.rs:457:9:458:9 | enter \|...\| x | main.rs:457:10:457:10 | x | | -| main.rs:457:9:458:9 | exit \|...\| x (normal) | main.rs:457:9:458:9 | exit \|...\| x | | -| main.rs:457:10:457:10 | x | main.rs:457:10:457:10 | x | | -| main.rs:457:10:457:10 | x | main.rs:457:10:457:15 | ...: i64 | match | -| main.rs:457:10:457:15 | ...: i64 | main.rs:458:9:458:9 | x | | -| main.rs:458:9:458:9 | x | main.rs:457:9:458:9 | exit \|...\| x (normal) | | -| main.rs:459:5:459:13 | print_i64 | main.rs:459:15:459:15 | f | | -| main.rs:459:5:459:19 | print_i64(...) | main.rs:461:5:464:5 | fn f | | -| main.rs:459:5:459:20 | ExprStmt | main.rs:459:5:459:13 | print_i64 | | -| main.rs:459:15:459:15 | f | main.rs:459:17:459:17 | 1 | | -| main.rs:459:15:459:18 | f(...) | main.rs:459:5:459:19 | print_i64(...) | | -| main.rs:459:17:459:17 | 1 | main.rs:459:15:459:18 | f(...) | | -| main.rs:461:5:464:5 | enter fn f | main.rs:461:10:461:10 | x | | -| main.rs:461:5:464:5 | exit fn f (normal) | main.rs:461:5:464:5 | exit fn f | | -| main.rs:461:5:464:5 | fn f | main.rs:466:5:466:20 | ExprStmt | | -| main.rs:461:10:461:10 | x | main.rs:461:10:461:10 | x | | -| main.rs:461:10:461:10 | x | main.rs:461:10:461:15 | ...: i64 | match | -| main.rs:461:10:461:15 | ...: i64 | main.rs:463:9:463:9 | x | | -| main.rs:462:5:464:5 | { ... } | main.rs:461:5:464:5 | exit fn f (normal) | | -| main.rs:463:9:463:9 | x | main.rs:463:13:463:13 | 1 | | -| main.rs:463:9:463:13 | ... + ... | main.rs:462:5:464:5 | { ... } | | -| main.rs:463:13:463:13 | 1 | main.rs:463:9:463:13 | ... + ... | | -| main.rs:466:5:466:13 | print_i64 | main.rs:466:15:466:15 | f | | -| main.rs:466:5:466:19 | print_i64(...) | main.rs:469:9:469:24 | ExprStmt | | -| main.rs:466:5:466:20 | ExprStmt | main.rs:466:5:466:13 | print_i64 | | -| main.rs:466:15:466:15 | f | main.rs:466:17:466:17 | 2 | | -| main.rs:466:15:466:18 | f(...) | main.rs:466:5:466:19 | print_i64(...) | | -| main.rs:466:17:466:17 | 2 | main.rs:466:15:466:18 | f(...) | | -| main.rs:468:5:483:5 | { ... } | main.rs:454:22:484:1 | { ... } | | -| main.rs:469:9:469:17 | print_i64 | main.rs:469:19:469:19 | f | | -| main.rs:469:9:469:23 | print_i64(...) | main.rs:470:9:473:9 | fn f | | -| main.rs:469:9:469:24 | ExprStmt | main.rs:469:9:469:17 | print_i64 | | -| main.rs:469:19:469:19 | f | main.rs:469:21:469:21 | 3 | | -| main.rs:469:19:469:22 | f(...) | main.rs:469:9:469:23 | print_i64(...) | | -| main.rs:469:21:469:21 | 3 | main.rs:469:19:469:22 | f(...) | | -| main.rs:470:9:473:9 | enter fn f | main.rs:470:14:470:14 | x | | -| main.rs:470:9:473:9 | exit fn f (normal) | main.rs:470:9:473:9 | exit fn f | | -| main.rs:470:9:473:9 | fn f | main.rs:475:9:477:9 | ExprStmt | | -| main.rs:470:14:470:14 | x | main.rs:470:14:470:14 | x | | -| main.rs:470:14:470:14 | x | main.rs:470:14:470:19 | ...: i64 | match | -| main.rs:470:14:470:19 | ...: i64 | main.rs:472:13:472:13 | 2 | | -| main.rs:471:9:473:9 | { ... } | main.rs:470:9:473:9 | exit fn f (normal) | | -| main.rs:472:13:472:13 | 2 | main.rs:472:17:472:17 | x | | -| main.rs:472:13:472:17 | ... * ... | main.rs:471:9:473:9 | { ... } | | -| main.rs:472:17:472:17 | x | main.rs:472:13:472:17 | ... * ... | | -| main.rs:475:9:477:9 | ExprStmt | main.rs:476:13:476:28 | ExprStmt | | -| main.rs:475:9:477:9 | { ... } | main.rs:479:9:481:14 | let ... = ... | | -| main.rs:476:13:476:21 | print_i64 | main.rs:476:23:476:23 | f | | -| main.rs:476:13:476:27 | print_i64(...) | main.rs:475:9:477:9 | { ... } | | -| main.rs:476:13:476:28 | ExprStmt | main.rs:476:13:476:21 | print_i64 | | -| main.rs:476:23:476:23 | f | main.rs:476:25:476:25 | 4 | | -| main.rs:476:23:476:26 | f(...) | main.rs:476:13:476:27 | print_i64(...) | | -| main.rs:476:25:476:25 | 4 | main.rs:476:23:476:26 | f(...) | | -| main.rs:479:9:481:14 | let ... = ... | main.rs:480:13:481:13 | \|...\| x | | -| main.rs:479:13:479:13 | f | main.rs:479:13:479:13 | f | | -| main.rs:479:13:479:13 | f | main.rs:482:9:482:24 | ExprStmt | match | -| main.rs:480:13:481:13 | \|...\| x | main.rs:479:13:479:13 | f | | -| main.rs:480:13:481:13 | enter \|...\| x | main.rs:480:14:480:14 | x | | -| main.rs:480:13:481:13 | exit \|...\| x (normal) | main.rs:480:13:481:13 | exit \|...\| x | | -| main.rs:480:14:480:14 | x | main.rs:480:14:480:14 | x | | -| main.rs:480:14:480:14 | x | main.rs:480:14:480:19 | ...: i64 | match | -| main.rs:480:14:480:19 | ...: i64 | main.rs:481:13:481:13 | x | | -| main.rs:481:13:481:13 | x | main.rs:480:13:481:13 | exit \|...\| x (normal) | | -| main.rs:482:9:482:17 | print_i64 | main.rs:482:19:482:19 | f | | -| main.rs:482:9:482:23 | print_i64(...) | main.rs:468:5:483:5 | { ... } | | -| main.rs:482:9:482:24 | ExprStmt | main.rs:482:9:482:17 | print_i64 | | -| main.rs:482:19:482:19 | f | main.rs:482:21:482:21 | 5 | | -| main.rs:482:19:482:22 | f(...) | main.rs:482:9:482:23 | print_i64(...) | | -| main.rs:482:21:482:21 | 5 | main.rs:482:19:482:22 | f(...) | | -| main.rs:486:1:493:1 | enter fn for_variable | main.rs:487:5:487:42 | let ... = ... | | -| main.rs:486:1:493:1 | exit fn for_variable (normal) | main.rs:486:1:493:1 | exit fn for_variable | | -| main.rs:486:19:493:1 | { ... } | main.rs:486:1:493:1 | exit fn for_variable (normal) | | -| main.rs:487:5:487:42 | let ... = ... | main.rs:487:15:487:22 | "apples" | | -| main.rs:487:9:487:9 | v | main.rs:487:9:487:9 | v | | -| main.rs:487:9:487:9 | v | main.rs:490:12:490:12 | v | match | -| main.rs:487:13:487:41 | &... | main.rs:487:9:487:9 | v | | -| main.rs:487:14:487:41 | [...] | main.rs:487:13:487:41 | &... | | -| main.rs:487:15:487:22 | "apples" | main.rs:487:25:487:30 | "cake" | | -| main.rs:487:25:487:30 | "cake" | main.rs:487:33:487:40 | "coffee" | | -| main.rs:487:33:487:40 | "coffee" | main.rs:487:14:487:41 | [...] | | -| main.rs:489:5:492:5 | for ... in ... { ... } | main.rs:486:19:493:1 | { ... } | | -| main.rs:489:9:489:12 | text | main.rs:489:5:492:5 | for ... in ... { ... } | no-match | -| main.rs:489:9:489:12 | text | main.rs:489:9:489:12 | text | | -| main.rs:489:9:489:12 | text | main.rs:491:9:491:24 | ExprStmt | match | -| main.rs:490:12:490:12 | v | main.rs:489:9:489:12 | text | | -| main.rs:490:14:492:5 | { ... } | main.rs:489:9:489:12 | text | | -| main.rs:491:9:491:17 | print_str | main.rs:491:19:491:22 | text | | -| main.rs:491:9:491:23 | print_str(...) | main.rs:490:14:492:5 | { ... } | | -| main.rs:491:9:491:24 | ExprStmt | main.rs:491:9:491:17 | print_str | | -| main.rs:491:19:491:22 | text | main.rs:491:9:491:23 | print_str(...) | | -| main.rs:495:1:501:1 | enter fn add_assign | main.rs:496:5:496:18 | let ... = 0 | | -| main.rs:495:1:501:1 | exit fn add_assign (normal) | main.rs:495:1:501:1 | exit fn add_assign | | -| main.rs:495:17:501:1 | { ... } | main.rs:495:1:501:1 | exit fn add_assign (normal) | | -| main.rs:496:5:496:18 | let ... = 0 | main.rs:496:17:496:17 | 0 | | -| main.rs:496:9:496:13 | mut a | main.rs:497:5:497:11 | ExprStmt | match | -| main.rs:496:13:496:13 | a | main.rs:496:9:496:13 | mut a | | -| main.rs:496:17:496:17 | 0 | main.rs:496:13:496:13 | a | | -| main.rs:497:5:497:5 | a | main.rs:497:10:497:10 | 1 | | -| main.rs:497:5:497:10 | ... += ... | main.rs:498:5:498:17 | ExprStmt | | -| main.rs:497:5:497:11 | ExprStmt | main.rs:497:5:497:5 | a | | -| main.rs:497:10:497:10 | 1 | main.rs:497:5:497:10 | ... += ... | | -| main.rs:498:5:498:13 | print_i64 | main.rs:498:15:498:15 | a | | -| main.rs:498:5:498:16 | print_i64(...) | main.rs:499:5:499:28 | ExprStmt | | -| main.rs:498:5:498:17 | ExprStmt | main.rs:498:5:498:13 | print_i64 | | -| main.rs:498:15:498:15 | a | main.rs:498:5:498:16 | print_i64(...) | | -| main.rs:499:5:499:27 | ... .add_assign(...) | main.rs:500:5:500:17 | ExprStmt | | -| main.rs:499:5:499:28 | ExprStmt | main.rs:499:11:499:11 | a | | -| main.rs:499:6:499:11 | &mut a | main.rs:499:25:499:26 | 10 | | -| main.rs:499:11:499:11 | a | main.rs:499:6:499:11 | &mut a | | -| main.rs:499:25:499:26 | 10 | main.rs:499:5:499:27 | ... .add_assign(...) | | -| main.rs:500:5:500:13 | print_i64 | main.rs:500:15:500:15 | a | | -| main.rs:500:5:500:16 | print_i64(...) | main.rs:495:17:501:1 | { ... } | | -| main.rs:500:5:500:17 | ExprStmt | main.rs:500:5:500:13 | print_i64 | | -| main.rs:500:15:500:15 | a | main.rs:500:5:500:16 | print_i64(...) | | -| main.rs:503:1:509:1 | enter fn mutate | main.rs:504:5:504:18 | let ... = 1 | | -| main.rs:503:1:509:1 | exit fn mutate (normal) | main.rs:503:1:509:1 | exit fn mutate | | -| main.rs:503:13:509:1 | { ... } | main.rs:503:1:509:1 | exit fn mutate (normal) | | -| main.rs:504:5:504:18 | let ... = 1 | main.rs:504:17:504:17 | 1 | | -| main.rs:504:9:504:13 | mut i | main.rs:505:5:506:15 | let ... = ... | match | -| main.rs:504:13:504:13 | i | main.rs:504:9:504:13 | mut i | | -| main.rs:504:17:504:17 | 1 | main.rs:504:13:504:13 | i | | -| main.rs:505:5:506:15 | let ... = ... | main.rs:506:14:506:14 | i | | -| main.rs:505:9:505:13 | ref_i | main.rs:505:9:505:13 | ref_i | | -| main.rs:505:9:505:13 | ref_i | main.rs:507:5:507:15 | ExprStmt | match | -| main.rs:506:9:506:14 | &mut i | main.rs:505:9:505:13 | ref_i | | -| main.rs:506:14:506:14 | i | main.rs:506:9:506:14 | &mut i | | -| main.rs:507:5:507:10 | * ... | main.rs:507:14:507:14 | 2 | | -| main.rs:507:5:507:14 | ... = ... | main.rs:508:5:508:17 | ExprStmt | | -| main.rs:507:5:507:15 | ExprStmt | main.rs:507:6:507:10 | ref_i | | -| main.rs:507:6:507:10 | ref_i | main.rs:507:5:507:10 | * ... | | -| main.rs:507:14:507:14 | 2 | main.rs:507:5:507:14 | ... = ... | | -| main.rs:508:5:508:13 | print_i64 | main.rs:508:15:508:15 | i | | -| main.rs:508:5:508:16 | print_i64(...) | main.rs:503:13:509:1 | { ... } | | -| main.rs:508:5:508:17 | ExprStmt | main.rs:508:5:508:13 | print_i64 | | -| main.rs:508:15:508:15 | i | main.rs:508:5:508:16 | print_i64(...) | | -| main.rs:511:1:516:1 | enter fn mutate_param | main.rs:511:17:511:17 | x | | -| main.rs:511:1:516:1 | exit fn mutate_param (normal) | main.rs:511:1:516:1 | exit fn mutate_param | | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:27 | ...: ... | match | -| main.rs:511:17:511:27 | ...: ... | main.rs:512:5:514:11 | ExprStmt | | -| main.rs:512:5:512:6 | * ... | main.rs:513:10:513:10 | x | | -| main.rs:512:5:514:10 | ... = ... | main.rs:515:5:515:13 | ExprStmt | | -| main.rs:512:5:514:11 | ExprStmt | main.rs:512:6:512:6 | x | | -| main.rs:512:6:512:6 | x | main.rs:512:5:512:6 | * ... | | -| main.rs:513:9:513:10 | * ... | main.rs:514:10:514:10 | x | | -| main.rs:513:9:514:10 | ... + ... | main.rs:512:5:514:10 | ... = ... | | -| main.rs:513:10:513:10 | x | main.rs:513:9:513:10 | * ... | | -| main.rs:514:9:514:10 | * ... | main.rs:513:9:514:10 | ... + ... | | -| main.rs:514:10:514:10 | x | main.rs:514:9:514:10 | * ... | | -| main.rs:515:5:515:12 | return x | main.rs:511:1:516:1 | exit fn mutate_param (normal) | return | -| main.rs:515:5:515:13 | ExprStmt | main.rs:515:12:515:12 | x | | -| main.rs:515:12:515:12 | x | main.rs:515:5:515:12 | return x | | -| main.rs:518:1:524:1 | enter fn mutate_param2 | main.rs:518:22:518:22 | x | | -| main.rs:518:1:524:1 | exit fn mutate_param2 (normal) | main.rs:518:1:524:1 | exit fn mutate_param2 | | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:35 | ...: ... | match | -| main.rs:518:22:518:35 | ...: ... | main.rs:518:38:518:38 | y | | -| main.rs:518:38:518:38 | y | main.rs:518:38:518:38 | y | | -| main.rs:518:38:518:38 | y | main.rs:518:38:518:56 | ...: ... | match | -| main.rs:518:38:518:56 | ...: ... | main.rs:519:5:521:11 | ExprStmt | | -| main.rs:518:59:524:1 | { ... } | main.rs:518:1:524:1 | exit fn mutate_param2 (normal) | | -| main.rs:519:5:519:6 | * ... | main.rs:520:10:520:10 | x | | -| main.rs:519:5:521:10 | ... = ... | main.rs:522:5:523:10 | ExprStmt | | -| main.rs:519:5:521:11 | ExprStmt | main.rs:519:6:519:6 | x | | -| main.rs:519:6:519:6 | x | main.rs:519:5:519:6 | * ... | | -| main.rs:520:9:520:10 | * ... | main.rs:521:10:521:10 | x | | -| main.rs:520:9:521:10 | ... + ... | main.rs:519:5:521:10 | ... = ... | | -| main.rs:520:10:520:10 | x | main.rs:520:9:520:10 | * ... | | -| main.rs:521:9:521:10 | * ... | main.rs:520:9:521:10 | ... + ... | | -| main.rs:521:10:521:10 | x | main.rs:521:9:521:10 | * ... | | -| main.rs:522:5:522:6 | * ... | main.rs:523:9:523:9 | x | | -| main.rs:522:5:523:9 | ... = ... | main.rs:518:59:524:1 | { ... } | | -| main.rs:522:5:523:10 | ExprStmt | main.rs:522:6:522:6 | y | | -| main.rs:522:6:522:6 | y | main.rs:522:5:522:6 | * ... | | -| main.rs:523:9:523:9 | x | main.rs:522:5:523:9 | ... = ... | | -| main.rs:526:1:546:1 | enter fn mutate_arg | main.rs:527:5:527:18 | let ... = 2 | | -| main.rs:526:1:546:1 | exit fn mutate_arg (normal) | main.rs:526:1:546:1 | exit fn mutate_arg | | -| main.rs:526:17:546:1 | { ... } | main.rs:526:1:546:1 | exit fn mutate_arg (normal) | | -| main.rs:527:5:527:18 | let ... = 2 | main.rs:527:17:527:17 | 2 | | -| main.rs:527:9:527:13 | mut x | main.rs:528:5:529:29 | let ... = ... | match | -| main.rs:527:13:527:13 | x | main.rs:527:9:527:13 | mut x | | -| main.rs:527:17:527:17 | 2 | main.rs:527:13:527:13 | x | | -| main.rs:528:5:529:29 | let ... = ... | main.rs:529:9:529:20 | mutate_param | | -| main.rs:528:9:528:9 | y | main.rs:528:9:528:9 | y | | -| main.rs:528:9:528:9 | y | main.rs:530:5:530:12 | ExprStmt | match | -| main.rs:529:9:529:20 | mutate_param | main.rs:529:27:529:27 | x | | -| main.rs:529:9:529:28 | mutate_param(...) | main.rs:528:9:528:9 | y | | -| main.rs:529:22:529:27 | &mut x | main.rs:529:9:529:28 | mutate_param(...) | | -| main.rs:529:27:529:27 | x | main.rs:529:22:529:27 | &mut x | | -| main.rs:530:5:530:6 | * ... | main.rs:530:10:530:11 | 10 | | -| main.rs:530:5:530:11 | ... = ... | main.rs:533:5:533:17 | ExprStmt | | -| main.rs:530:5:530:12 | ExprStmt | main.rs:530:6:530:6 | y | | -| main.rs:530:6:530:6 | y | main.rs:530:5:530:6 | * ... | | -| main.rs:530:10:530:11 | 10 | main.rs:530:5:530:11 | ... = ... | | -| main.rs:533:5:533:13 | print_i64 | main.rs:533:15:533:15 | x | | -| main.rs:533:5:533:16 | print_i64(...) | main.rs:535:5:535:18 | let ... = 4 | | -| main.rs:533:5:533:17 | ExprStmt | main.rs:533:5:533:13 | print_i64 | | -| main.rs:533:15:533:15 | x | main.rs:533:5:533:16 | print_i64(...) | | -| main.rs:535:5:535:18 | let ... = 4 | main.rs:535:17:535:17 | 4 | | -| main.rs:535:9:535:13 | mut z | main.rs:536:5:537:20 | let ... = ... | match | -| main.rs:535:13:535:13 | z | main.rs:535:9:535:13 | mut z | | -| main.rs:535:17:535:17 | 4 | main.rs:535:13:535:13 | z | | -| main.rs:536:5:537:20 | let ... = ... | main.rs:537:19:537:19 | x | | -| main.rs:536:9:536:9 | w | main.rs:536:9:536:9 | w | | -| main.rs:536:9:536:9 | w | main.rs:538:5:541:6 | ExprStmt | match | -| main.rs:537:9:537:19 | &mut ... | main.rs:536:9:536:9 | w | | -| main.rs:537:14:537:19 | &mut x | main.rs:537:9:537:19 | &mut ... | | -| main.rs:537:19:537:19 | x | main.rs:537:14:537:19 | &mut x | | -| main.rs:538:5:538:17 | mutate_param2 | main.rs:539:14:539:14 | z | | -| main.rs:538:5:541:5 | mutate_param2(...) | main.rs:542:5:542:13 | ExprStmt | | -| main.rs:538:5:541:6 | ExprStmt | main.rs:538:5:538:17 | mutate_param2 | | -| main.rs:539:9:539:14 | &mut z | main.rs:540:9:540:9 | w | | -| main.rs:539:14:539:14 | z | main.rs:539:9:539:14 | &mut z | | -| main.rs:540:9:540:9 | w | main.rs:538:5:541:5 | mutate_param2(...) | | -| main.rs:542:5:542:7 | * ... | main.rs:542:11:542:12 | 11 | | -| main.rs:542:5:542:12 | ... = ... | main.rs:545:5:545:17 | ExprStmt | | -| main.rs:542:5:542:13 | ExprStmt | main.rs:542:7:542:7 | w | | -| main.rs:542:6:542:7 | * ... | main.rs:542:5:542:7 | * ... | | -| main.rs:542:7:542:7 | w | main.rs:542:6:542:7 | * ... | | -| main.rs:542:11:542:12 | 11 | main.rs:542:5:542:12 | ... = ... | | -| main.rs:545:5:545:13 | print_i64 | main.rs:545:15:545:15 | z | | -| main.rs:545:5:545:16 | print_i64(...) | main.rs:526:17:546:1 | { ... } | | -| main.rs:545:5:545:17 | ExprStmt | main.rs:545:5:545:13 | print_i64 | | -| main.rs:545:15:545:15 | z | main.rs:545:5:545:16 | print_i64(...) | | -| main.rs:548:1:554:1 | enter fn alias | main.rs:549:5:549:18 | let ... = 1 | | -| main.rs:548:1:554:1 | exit fn alias (normal) | main.rs:548:1:554:1 | exit fn alias | | -| main.rs:548:12:554:1 | { ... } | main.rs:548:1:554:1 | exit fn alias (normal) | | -| main.rs:549:5:549:18 | let ... = 1 | main.rs:549:17:549:17 | 1 | | -| main.rs:549:9:549:13 | mut x | main.rs:550:5:551:15 | let ... = ... | match | -| main.rs:549:13:549:13 | x | main.rs:549:9:549:13 | mut x | | -| main.rs:549:17:549:17 | 1 | main.rs:549:13:549:13 | x | | -| main.rs:550:5:551:15 | let ... = ... | main.rs:551:14:551:14 | x | | -| main.rs:550:9:550:9 | y | main.rs:550:9:550:9 | y | | -| main.rs:550:9:550:9 | y | main.rs:552:5:552:11 | ExprStmt | match | -| main.rs:551:9:551:14 | &mut x | main.rs:550:9:550:9 | y | | -| main.rs:551:14:551:14 | x | main.rs:551:9:551:14 | &mut x | | -| main.rs:552:5:552:6 | * ... | main.rs:552:10:552:10 | 2 | | -| main.rs:552:5:552:10 | ... = ... | main.rs:553:5:553:17 | ExprStmt | | -| main.rs:552:5:552:11 | ExprStmt | main.rs:552:6:552:6 | y | | -| main.rs:552:6:552:6 | y | main.rs:552:5:552:6 | * ... | | -| main.rs:552:10:552:10 | 2 | main.rs:552:5:552:10 | ... = ... | | -| main.rs:553:5:553:13 | print_i64 | main.rs:553:15:553:15 | x | | -| main.rs:553:5:553:16 | print_i64(...) | main.rs:548:12:554:1 | { ... } | | -| main.rs:553:5:553:17 | ExprStmt | main.rs:553:5:553:13 | print_i64 | | -| main.rs:553:15:553:15 | x | main.rs:553:5:553:16 | print_i64(...) | | -| main.rs:556:1:565:1 | enter fn capture_immut | main.rs:557:5:557:16 | let ... = 100 | | -| main.rs:556:1:565:1 | exit fn capture_immut (normal) | main.rs:556:1:565:1 | exit fn capture_immut | | -| main.rs:556:20:565:1 | { ... } | main.rs:556:1:565:1 | exit fn capture_immut (normal) | | -| main.rs:557:5:557:16 | let ... = 100 | main.rs:557:13:557:15 | 100 | | -| main.rs:557:9:557:9 | x | main.rs:557:9:557:9 | x | | -| main.rs:557:9:557:9 | x | main.rs:560:5:562:6 | let ... = ... | match | -| main.rs:557:13:557:15 | 100 | main.rs:557:9:557:9 | x | | -| main.rs:560:5:562:6 | let ... = ... | main.rs:560:15:562:5 | \|...\| ... | | -| main.rs:560:9:560:11 | cap | main.rs:560:9:560:11 | cap | | -| main.rs:560:9:560:11 | cap | main.rs:563:5:563:10 | ExprStmt | match | -| main.rs:560:15:562:5 | \|...\| ... | main.rs:560:9:560:11 | cap | | -| main.rs:560:15:562:5 | enter \|...\| ... | main.rs:561:9:561:21 | ExprStmt | | -| main.rs:560:15:562:5 | exit \|...\| ... (normal) | main.rs:560:15:562:5 | exit \|...\| ... | | -| main.rs:560:18:562:5 | { ... } | main.rs:560:15:562:5 | exit \|...\| ... (normal) | | -| main.rs:561:9:561:17 | print_i64 | main.rs:561:19:561:19 | x | | -| main.rs:561:9:561:20 | print_i64(...) | main.rs:560:18:562:5 | { ... } | | -| main.rs:561:9:561:21 | ExprStmt | main.rs:561:9:561:17 | print_i64 | | -| main.rs:561:19:561:19 | x | main.rs:561:9:561:20 | print_i64(...) | | -| main.rs:563:5:563:7 | cap | main.rs:563:5:563:9 | cap(...) | | -| main.rs:563:5:563:9 | cap(...) | main.rs:564:5:564:17 | ExprStmt | | -| main.rs:563:5:563:10 | ExprStmt | main.rs:563:5:563:7 | cap | | -| main.rs:564:5:564:13 | print_i64 | main.rs:564:15:564:15 | x | | -| main.rs:564:5:564:16 | print_i64(...) | main.rs:556:20:565:1 | { ... } | | -| main.rs:564:5:564:17 | ExprStmt | main.rs:564:5:564:13 | print_i64 | | -| main.rs:564:15:564:15 | x | main.rs:564:5:564:16 | print_i64(...) | | -| main.rs:567:1:594:1 | enter fn capture_mut | main.rs:568:5:568:18 | let ... = 1 | | -| main.rs:567:1:594:1 | exit fn capture_mut (normal) | main.rs:567:1:594:1 | exit fn capture_mut | | -| main.rs:567:18:594:1 | { ... } | main.rs:567:1:594:1 | exit fn capture_mut (normal) | | -| main.rs:568:5:568:18 | let ... = 1 | main.rs:568:17:568:17 | 1 | | -| main.rs:568:9:568:13 | mut x | main.rs:571:5:573:6 | let ... = ... | match | -| main.rs:568:13:568:13 | x | main.rs:568:9:568:13 | mut x | | -| main.rs:568:17:568:17 | 1 | main.rs:568:13:568:13 | x | | -| main.rs:571:5:573:6 | let ... = ... | main.rs:571:20:573:5 | \|...\| ... | | -| main.rs:571:9:571:16 | closure1 | main.rs:571:9:571:16 | closure1 | | -| main.rs:571:9:571:16 | closure1 | main.rs:574:5:574:15 | ExprStmt | match | -| main.rs:571:20:573:5 | \|...\| ... | main.rs:571:9:571:16 | closure1 | | -| main.rs:571:20:573:5 | enter \|...\| ... | main.rs:572:9:572:21 | ExprStmt | | -| main.rs:571:20:573:5 | exit \|...\| ... (normal) | main.rs:571:20:573:5 | exit \|...\| ... | | -| main.rs:571:23:573:5 | { ... } | main.rs:571:20:573:5 | exit \|...\| ... (normal) | | -| main.rs:572:9:572:17 | print_i64 | main.rs:572:19:572:19 | x | | -| main.rs:572:9:572:20 | print_i64(...) | main.rs:571:23:573:5 | { ... } | | -| main.rs:572:9:572:21 | ExprStmt | main.rs:572:9:572:17 | print_i64 | | -| main.rs:572:19:572:19 | x | main.rs:572:9:572:20 | print_i64(...) | | -| main.rs:574:5:574:12 | closure1 | main.rs:574:5:574:14 | closure1(...) | | -| main.rs:574:5:574:14 | closure1(...) | main.rs:575:5:575:17 | ExprStmt | | -| main.rs:574:5:574:15 | ExprStmt | main.rs:574:5:574:12 | closure1 | | -| main.rs:575:5:575:13 | print_i64 | main.rs:575:15:575:15 | x | | -| main.rs:575:5:575:16 | print_i64(...) | main.rs:577:5:577:18 | let ... = 2 | | -| main.rs:575:5:575:17 | ExprStmt | main.rs:575:5:575:13 | print_i64 | | -| main.rs:575:15:575:15 | x | main.rs:575:5:575:16 | print_i64(...) | | -| main.rs:577:5:577:18 | let ... = 2 | main.rs:577:17:577:17 | 2 | | -| main.rs:577:9:577:13 | mut y | main.rs:580:5:582:6 | let ... = ... | match | -| main.rs:577:13:577:13 | y | main.rs:577:9:577:13 | mut y | | -| main.rs:577:17:577:17 | 2 | main.rs:577:13:577:13 | y | | -| main.rs:580:5:582:6 | let ... = ... | main.rs:580:24:582:5 | \|...\| ... | | -| main.rs:580:9:580:20 | mut closure2 | main.rs:583:5:583:15 | ExprStmt | match | -| main.rs:580:13:580:20 | closure2 | main.rs:580:9:580:20 | mut closure2 | | -| main.rs:580:24:582:5 | \|...\| ... | main.rs:580:13:580:20 | closure2 | | -| main.rs:580:24:582:5 | enter \|...\| ... | main.rs:581:9:581:14 | ExprStmt | | -| main.rs:580:24:582:5 | exit \|...\| ... (normal) | main.rs:580:24:582:5 | exit \|...\| ... | | -| main.rs:580:27:582:5 | { ... } | main.rs:580:24:582:5 | exit \|...\| ... (normal) | | -| main.rs:581:9:581:9 | y | main.rs:581:13:581:13 | 3 | | -| main.rs:581:9:581:13 | ... = ... | main.rs:580:27:582:5 | { ... } | | -| main.rs:581:9:581:14 | ExprStmt | main.rs:581:9:581:9 | y | | -| main.rs:581:13:581:13 | 3 | main.rs:581:9:581:13 | ... = ... | | -| main.rs:583:5:583:12 | closure2 | main.rs:583:5:583:14 | closure2(...) | | -| main.rs:583:5:583:14 | closure2(...) | main.rs:584:5:584:17 | ExprStmt | | -| main.rs:583:5:583:15 | ExprStmt | main.rs:583:5:583:12 | closure2 | | -| main.rs:584:5:584:13 | print_i64 | main.rs:584:15:584:15 | y | | -| main.rs:584:5:584:16 | print_i64(...) | main.rs:586:5:586:18 | let ... = 2 | | -| main.rs:584:5:584:17 | ExprStmt | main.rs:584:5:584:13 | print_i64 | | -| main.rs:584:15:584:15 | y | main.rs:584:5:584:16 | print_i64(...) | | -| main.rs:586:5:586:18 | let ... = 2 | main.rs:586:17:586:17 | 2 | | -| main.rs:586:9:586:13 | mut z | main.rs:589:5:591:6 | let ... = ... | match | -| main.rs:586:13:586:13 | z | main.rs:586:9:586:13 | mut z | | -| main.rs:586:17:586:17 | 2 | main.rs:586:13:586:13 | z | | -| main.rs:589:5:591:6 | let ... = ... | main.rs:589:24:591:5 | \|...\| ... | | -| main.rs:589:9:589:20 | mut closure3 | main.rs:592:5:592:15 | ExprStmt | match | -| main.rs:589:13:589:20 | closure3 | main.rs:589:9:589:20 | mut closure3 | | -| main.rs:589:24:591:5 | \|...\| ... | main.rs:589:13:589:20 | closure3 | | -| main.rs:589:24:591:5 | enter \|...\| ... | main.rs:590:9:590:24 | ExprStmt | | -| main.rs:589:24:591:5 | exit \|...\| ... (normal) | main.rs:589:24:591:5 | exit \|...\| ... | | -| main.rs:589:27:591:5 | { ... } | main.rs:589:24:591:5 | exit \|...\| ... (normal) | | -| main.rs:590:9:590:9 | z | main.rs:590:22:590:22 | 1 | | -| main.rs:590:9:590:23 | z.add_assign(...) | main.rs:589:27:591:5 | { ... } | | -| main.rs:590:9:590:24 | ExprStmt | main.rs:590:9:590:9 | z | | -| main.rs:590:22:590:22 | 1 | main.rs:590:9:590:23 | z.add_assign(...) | | -| main.rs:592:5:592:12 | closure3 | main.rs:592:5:592:14 | closure3(...) | | -| main.rs:592:5:592:14 | closure3(...) | main.rs:593:5:593:17 | ExprStmt | | -| main.rs:592:5:592:15 | ExprStmt | main.rs:592:5:592:12 | closure3 | | -| main.rs:593:5:593:13 | print_i64 | main.rs:593:15:593:15 | z | | -| main.rs:593:5:593:16 | print_i64(...) | main.rs:567:18:594:1 | { ... } | | -| main.rs:593:5:593:17 | ExprStmt | main.rs:593:5:593:13 | print_i64 | | -| main.rs:593:15:593:15 | z | main.rs:593:5:593:16 | print_i64(...) | | -| main.rs:596:1:604:1 | enter fn async_block_capture | main.rs:597:5:597:23 | let ... = 0 | | -| main.rs:596:1:604:1 | exit fn async_block_capture (normal) | main.rs:596:1:604:1 | exit fn async_block_capture | | -| main.rs:596:32:604:1 | { ... } | main.rs:596:1:604:1 | exit fn async_block_capture (normal) | | -| main.rs:597:5:597:23 | let ... = 0 | main.rs:597:22:597:22 | 0 | | -| main.rs:597:9:597:13 | mut i | main.rs:598:5:600:6 | let ... = ... | match | -| main.rs:597:13:597:13 | i | main.rs:597:9:597:13 | mut i | | -| main.rs:597:22:597:22 | 0 | main.rs:597:13:597:13 | i | | -| main.rs:598:5:600:6 | let ... = ... | main.rs:598:17:600:5 | { ... } | | -| main.rs:598:9:598:13 | block | main.rs:598:9:598:13 | block | | -| main.rs:598:9:598:13 | block | main.rs:602:5:602:16 | ExprStmt | match | -| main.rs:598:17:600:5 | enter { ... } | main.rs:599:9:599:14 | ExprStmt | | -| main.rs:598:17:600:5 | exit { ... } (normal) | main.rs:598:17:600:5 | exit { ... } | | -| main.rs:598:17:600:5 | { ... } | main.rs:598:9:598:13 | block | | -| main.rs:599:9:599:9 | i | main.rs:599:13:599:13 | 1 | | -| main.rs:599:9:599:13 | ... = ... | main.rs:598:17:600:5 | exit { ... } (normal) | | -| main.rs:599:9:599:14 | ExprStmt | main.rs:599:9:599:9 | i | | -| main.rs:599:13:599:13 | 1 | main.rs:599:9:599:13 | ... = ... | | -| main.rs:602:5:602:9 | block | main.rs:602:5:602:15 | await block | | -| main.rs:602:5:602:15 | await block | main.rs:603:5:603:17 | ExprStmt | | -| main.rs:602:5:602:16 | ExprStmt | main.rs:602:5:602:9 | block | | -| main.rs:603:5:603:13 | print_i64 | main.rs:603:15:603:15 | i | | -| main.rs:603:5:603:16 | print_i64(...) | main.rs:596:32:604:1 | { ... } | | -| main.rs:603:5:603:17 | ExprStmt | main.rs:603:5:603:13 | print_i64 | | -| main.rs:603:15:603:15 | i | main.rs:603:5:603:16 | print_i64(...) | | -| main.rs:606:1:622:1 | enter fn phi | main.rs:606:8:606:8 | b | | -| main.rs:606:1:622:1 | exit fn phi (normal) | main.rs:606:1:622:1 | exit fn phi | | -| main.rs:606:8:606:8 | b | main.rs:606:8:606:8 | b | | -| main.rs:606:8:606:8 | b | main.rs:606:8:606:14 | ...: bool | match | -| main.rs:606:8:606:14 | ...: bool | main.rs:607:5:607:18 | let ... = 1 | | -| main.rs:606:17:622:1 | { ... } | main.rs:606:1:622:1 | exit fn phi (normal) | | -| main.rs:607:5:607:18 | let ... = 1 | main.rs:607:17:607:17 | 1 | | -| main.rs:607:9:607:13 | mut x | main.rs:608:5:608:17 | ExprStmt | match | -| main.rs:607:13:607:13 | x | main.rs:607:9:607:13 | mut x | | -| main.rs:607:17:607:17 | 1 | main.rs:607:13:607:13 | x | | -| main.rs:608:5:608:13 | print_i64 | main.rs:608:15:608:15 | x | | -| main.rs:608:5:608:16 | print_i64(...) | main.rs:609:5:609:21 | ExprStmt | | -| main.rs:608:5:608:17 | ExprStmt | main.rs:608:5:608:13 | print_i64 | | -| main.rs:608:15:608:15 | x | main.rs:608:5:608:16 | print_i64(...) | | -| main.rs:609:5:609:13 | print_i64 | main.rs:609:15:609:15 | x | | -| main.rs:609:5:609:20 | print_i64(...) | main.rs:610:5:620:6 | let _ = ... | | -| main.rs:609:5:609:21 | ExprStmt | main.rs:609:5:609:13 | print_i64 | | -| main.rs:609:15:609:15 | x | main.rs:609:19:609:19 | 1 | | -| main.rs:609:15:609:19 | ... + ... | main.rs:609:5:609:20 | print_i64(...) | | -| main.rs:609:19:609:19 | 1 | main.rs:609:15:609:19 | ... + ... | | -| main.rs:610:5:620:6 | let _ = ... | main.rs:611:16:611:16 | b | | -| main.rs:611:9:611:9 | _ | main.rs:621:5:621:17 | ExprStmt | match | -| main.rs:611:13:620:5 | if b {...} else {...} | main.rs:611:9:611:9 | _ | | -| main.rs:611:16:611:16 | b | main.rs:613:9:613:14 | ExprStmt | true | -| main.rs:611:16:611:16 | b | main.rs:617:9:617:14 | ExprStmt | false | -| main.rs:612:5:616:5 | { ... } | main.rs:611:13:620:5 | if b {...} else {...} | | -| main.rs:613:9:613:9 | x | main.rs:613:13:613:13 | 2 | | -| main.rs:613:9:613:13 | ... = ... | main.rs:614:9:614:21 | ExprStmt | | -| main.rs:613:9:613:14 | ExprStmt | main.rs:613:9:613:9 | x | | -| main.rs:613:13:613:13 | 2 | main.rs:613:9:613:13 | ... = ... | | -| main.rs:614:9:614:17 | print_i64 | main.rs:614:19:614:19 | x | | -| main.rs:614:9:614:20 | print_i64(...) | main.rs:615:9:615:25 | ExprStmt | | -| main.rs:614:9:614:21 | ExprStmt | main.rs:614:9:614:17 | print_i64 | | -| main.rs:614:19:614:19 | x | main.rs:614:9:614:20 | print_i64(...) | | -| main.rs:615:9:615:17 | print_i64 | main.rs:615:19:615:19 | x | | -| main.rs:615:9:615:24 | print_i64(...) | main.rs:612:5:616:5 | { ... } | | -| main.rs:615:9:615:25 | ExprStmt | main.rs:615:9:615:17 | print_i64 | | -| main.rs:615:19:615:19 | x | main.rs:615:23:615:23 | 1 | | -| main.rs:615:19:615:23 | ... + ... | main.rs:615:9:615:24 | print_i64(...) | | -| main.rs:615:23:615:23 | 1 | main.rs:615:19:615:23 | ... + ... | | -| main.rs:616:12:620:5 | { ... } | main.rs:611:13:620:5 | if b {...} else {...} | | -| main.rs:617:9:617:9 | x | main.rs:617:13:617:13 | 3 | | -| main.rs:617:9:617:13 | ... = ... | main.rs:618:9:618:21 | ExprStmt | | -| main.rs:617:9:617:14 | ExprStmt | main.rs:617:9:617:9 | x | | +| main.rs:443:15:443:16 | b4 | main.rs:443:5:443:17 | print_i64(...) | | +| main.rs:444:5:444:13 | print_i64 | main.rs:444:15:444:16 | c2 | | +| main.rs:444:5:444:17 | print_i64(...) | main.rs:446:5:454:6 | ExprStmt | | +| main.rs:444:5:444:18 | ExprStmt | main.rs:444:5:444:13 | print_i64 | | +| main.rs:444:15:444:16 | c2 | main.rs:444:5:444:17 | print_i64(...) | | +| main.rs:446:5:450:5 | TupleExpr | main.rs:451:9:451:11 | a10 | | +| main.rs:446:5:454:5 | ... = ... | main.rs:455:5:455:19 | ExprStmt | | +| main.rs:446:5:454:6 | ExprStmt | main.rs:447:9:447:10 | c2 | | +| main.rs:447:9:447:10 | c2 | main.rs:448:9:448:10 | b4 | | +| main.rs:448:9:448:10 | b4 | main.rs:449:9:449:11 | a10 | | +| main.rs:449:9:449:11 | a10 | main.rs:446:5:450:5 | TupleExpr | | +| main.rs:450:9:454:5 | TupleExpr | main.rs:446:5:454:5 | ... = ... | | +| main.rs:451:9:451:11 | a10 | main.rs:452:9:452:10 | b4 | | +| main.rs:452:9:452:10 | b4 | main.rs:453:9:453:10 | c2 | | +| main.rs:453:9:453:10 | c2 | main.rs:450:9:454:5 | TupleExpr | | +| main.rs:455:5:455:13 | print_i64 | main.rs:455:15:455:17 | a10 | | +| main.rs:455:5:455:18 | print_i64(...) | main.rs:456:5:456:18 | ExprStmt | | +| main.rs:455:5:455:19 | ExprStmt | main.rs:455:5:455:13 | print_i64 | | +| main.rs:455:15:455:17 | a10 | main.rs:455:5:455:18 | print_i64(...) | | +| main.rs:456:5:456:13 | print_i64 | main.rs:456:15:456:16 | b4 | | +| main.rs:456:5:456:17 | print_i64(...) | main.rs:457:5:457:18 | ExprStmt | | +| main.rs:456:5:456:18 | ExprStmt | main.rs:456:5:456:13 | print_i64 | | +| main.rs:456:15:456:16 | b4 | main.rs:456:5:456:17 | print_i64(...) | | +| main.rs:457:5:457:13 | print_i64 | main.rs:457:15:457:16 | c2 | | +| main.rs:457:5:457:17 | print_i64(...) | main.rs:459:5:467:5 | ExprStmt | | +| main.rs:457:5:457:18 | ExprStmt | main.rs:457:5:457:13 | print_i64 | | +| main.rs:457:15:457:16 | c2 | main.rs:457:5:457:17 | print_i64(...) | | +| main.rs:459:5:467:5 | ExprStmt | main.rs:459:12:459:12 | 4 | | +| main.rs:459:5:467:5 | match ... { ... } | main.rs:469:5:469:19 | ExprStmt | | +| main.rs:459:11:459:16 | TupleExpr | main.rs:460:9:463:9 | TuplePat | | +| main.rs:459:12:459:12 | 4 | main.rs:459:15:459:15 | 5 | | +| main.rs:459:15:459:15 | 5 | main.rs:459:11:459:16 | TupleExpr | | +| main.rs:460:9:463:9 | TuplePat | main.rs:461:13:461:15 | a10 | match | +| main.rs:461:13:461:15 | a10 | main.rs:461:13:461:15 | a10 | | +| main.rs:461:13:461:15 | a10 | main.rs:462:13:462:14 | b4 | match | +| main.rs:462:13:462:14 | b4 | main.rs:462:13:462:14 | b4 | | +| main.rs:462:13:462:14 | b4 | main.rs:464:13:464:27 | ExprStmt | match | +| main.rs:463:14:466:9 | { ... } | main.rs:459:5:467:5 | match ... { ... } | | +| main.rs:464:13:464:21 | print_i64 | main.rs:464:23:464:25 | a10 | | +| main.rs:464:13:464:26 | print_i64(...) | main.rs:465:13:465:26 | ExprStmt | | +| main.rs:464:13:464:27 | ExprStmt | main.rs:464:13:464:21 | print_i64 | | +| main.rs:464:23:464:25 | a10 | main.rs:464:13:464:26 | print_i64(...) | | +| main.rs:465:13:465:21 | print_i64 | main.rs:465:23:465:24 | b4 | | +| main.rs:465:13:465:25 | print_i64(...) | main.rs:463:14:466:9 | { ... } | | +| main.rs:465:13:465:26 | ExprStmt | main.rs:465:13:465:21 | print_i64 | | +| main.rs:465:23:465:24 | b4 | main.rs:465:13:465:25 | print_i64(...) | | +| main.rs:469:5:469:13 | print_i64 | main.rs:469:15:469:17 | a10 | | +| main.rs:469:5:469:18 | print_i64(...) | main.rs:470:5:470:18 | ExprStmt | | +| main.rs:469:5:469:19 | ExprStmt | main.rs:469:5:469:13 | print_i64 | | +| main.rs:469:15:469:17 | a10 | main.rs:469:5:469:18 | print_i64(...) | | +| main.rs:470:5:470:13 | print_i64 | main.rs:470:15:470:16 | b4 | | +| main.rs:470:5:470:17 | print_i64(...) | main.rs:436:26:471:1 | { ... } | | +| main.rs:470:5:470:18 | ExprStmt | main.rs:470:5:470:13 | print_i64 | | +| main.rs:470:15:470:16 | b4 | main.rs:470:5:470:17 | print_i64(...) | | +| main.rs:473:1:488:1 | enter fn closure_variable | main.rs:474:5:476:10 | let ... = ... | | +| main.rs:473:1:488:1 | exit fn closure_variable (normal) | main.rs:473:1:488:1 | exit fn closure_variable | | +| main.rs:473:23:488:1 | { ... } | main.rs:473:1:488:1 | exit fn closure_variable (normal) | | +| main.rs:474:5:476:10 | let ... = ... | main.rs:475:9:476:9 | \|...\| x | | +| main.rs:474:9:474:23 | example_closure | main.rs:474:9:474:23 | example_closure | | +| main.rs:474:9:474:23 | example_closure | main.rs:477:5:478:27 | let ... = ... | match | +| main.rs:475:9:476:9 | \|...\| x | main.rs:474:9:474:23 | example_closure | | +| main.rs:475:9:476:9 | enter \|...\| x | main.rs:475:10:475:10 | x | | +| main.rs:475:9:476:9 | exit \|...\| x (normal) | main.rs:475:9:476:9 | exit \|...\| x | | +| main.rs:475:10:475:10 | x | main.rs:475:10:475:10 | x | | +| main.rs:475:10:475:10 | x | main.rs:475:10:475:15 | ...: i64 | match | +| main.rs:475:10:475:15 | ...: i64 | main.rs:476:9:476:9 | x | | +| main.rs:476:9:476:9 | x | main.rs:475:9:476:9 | exit \|...\| x (normal) | | +| main.rs:477:5:478:27 | let ... = ... | main.rs:478:9:478:23 | example_closure | | +| main.rs:477:9:477:10 | n1 | main.rs:477:9:477:10 | n1 | | +| main.rs:477:9:477:10 | n1 | main.rs:479:5:479:18 | ExprStmt | match | +| main.rs:478:9:478:23 | example_closure | main.rs:478:25:478:25 | 5 | | +| main.rs:478:9:478:26 | example_closure(...) | main.rs:477:9:477:10 | n1 | | +| main.rs:478:25:478:25 | 5 | main.rs:478:9:478:26 | example_closure(...) | | +| main.rs:479:5:479:13 | print_i64 | main.rs:479:15:479:16 | n1 | | +| main.rs:479:5:479:17 | print_i64(...) | main.rs:481:5:481:25 | ExprStmt | | +| main.rs:479:5:479:18 | ExprStmt | main.rs:479:5:479:13 | print_i64 | | +| main.rs:479:15:479:16 | n1 | main.rs:479:5:479:17 | print_i64(...) | | +| main.rs:481:5:481:22 | immutable_variable | main.rs:481:5:481:24 | immutable_variable(...) | | +| main.rs:481:5:481:24 | immutable_variable(...) | main.rs:482:5:484:10 | let ... = ... | | +| main.rs:481:5:481:25 | ExprStmt | main.rs:481:5:481:22 | immutable_variable | | +| main.rs:482:5:484:10 | let ... = ... | main.rs:483:5:484:9 | \|...\| x | | +| main.rs:482:9:482:26 | immutable_variable | main.rs:482:9:482:26 | immutable_variable | | +| main.rs:482:9:482:26 | immutable_variable | main.rs:485:5:486:30 | let ... = ... | match | +| main.rs:483:5:484:9 | \|...\| x | main.rs:482:9:482:26 | immutable_variable | | +| main.rs:483:5:484:9 | enter \|...\| x | main.rs:483:6:483:6 | x | | +| main.rs:483:5:484:9 | exit \|...\| x (normal) | main.rs:483:5:484:9 | exit \|...\| x | | +| main.rs:483:6:483:6 | x | main.rs:483:6:483:6 | x | | +| main.rs:483:6:483:6 | x | main.rs:483:6:483:11 | ...: i64 | match | +| main.rs:483:6:483:11 | ...: i64 | main.rs:484:9:484:9 | x | | +| main.rs:484:9:484:9 | x | main.rs:483:5:484:9 | exit \|...\| x (normal) | | +| main.rs:485:5:486:30 | let ... = ... | main.rs:486:9:486:26 | immutable_variable | | +| main.rs:485:9:485:10 | n2 | main.rs:485:9:485:10 | n2 | | +| main.rs:485:9:485:10 | n2 | main.rs:487:5:487:18 | ExprStmt | match | +| main.rs:486:9:486:26 | immutable_variable | main.rs:486:28:486:28 | 6 | | +| main.rs:486:9:486:29 | immutable_variable(...) | main.rs:485:9:485:10 | n2 | | +| main.rs:486:28:486:28 | 6 | main.rs:486:9:486:29 | immutable_variable(...) | | +| main.rs:487:5:487:13 | print_i64 | main.rs:487:15:487:16 | n2 | | +| main.rs:487:5:487:17 | print_i64(...) | main.rs:473:23:488:1 | { ... } | | +| main.rs:487:5:487:18 | ExprStmt | main.rs:487:5:487:13 | print_i64 | | +| main.rs:487:15:487:16 | n2 | main.rs:487:5:487:17 | print_i64(...) | | +| main.rs:490:1:520:1 | enter fn nested_function | main.rs:492:5:494:10 | let ... = ... | | +| main.rs:490:1:520:1 | exit fn nested_function (normal) | main.rs:490:1:520:1 | exit fn nested_function | | +| main.rs:490:22:520:1 | { ... } | main.rs:490:1:520:1 | exit fn nested_function (normal) | | +| main.rs:492:5:494:10 | let ... = ... | main.rs:493:9:494:9 | \|...\| x | | +| main.rs:492:9:492:9 | f | main.rs:492:9:492:9 | f | | +| main.rs:492:9:492:9 | f | main.rs:495:5:495:20 | ExprStmt | match | +| main.rs:493:9:494:9 | \|...\| x | main.rs:492:9:492:9 | f | | +| main.rs:493:9:494:9 | enter \|...\| x | main.rs:493:10:493:10 | x | | +| main.rs:493:9:494:9 | exit \|...\| x (normal) | main.rs:493:9:494:9 | exit \|...\| x | | +| main.rs:493:10:493:10 | x | main.rs:493:10:493:10 | x | | +| main.rs:493:10:493:10 | x | main.rs:493:10:493:15 | ...: i64 | match | +| main.rs:493:10:493:15 | ...: i64 | main.rs:494:9:494:9 | x | | +| main.rs:494:9:494:9 | x | main.rs:493:9:494:9 | exit \|...\| x (normal) | | +| main.rs:495:5:495:13 | print_i64 | main.rs:495:15:495:15 | f | | +| main.rs:495:5:495:19 | print_i64(...) | main.rs:497:5:500:5 | fn f | | +| main.rs:495:5:495:20 | ExprStmt | main.rs:495:5:495:13 | print_i64 | | +| main.rs:495:15:495:15 | f | main.rs:495:17:495:17 | 1 | | +| main.rs:495:15:495:18 | f(...) | main.rs:495:5:495:19 | print_i64(...) | | +| main.rs:495:17:495:17 | 1 | main.rs:495:15:495:18 | f(...) | | +| main.rs:497:5:500:5 | enter fn f | main.rs:497:10:497:10 | x | | +| main.rs:497:5:500:5 | exit fn f (normal) | main.rs:497:5:500:5 | exit fn f | | +| main.rs:497:5:500:5 | fn f | main.rs:502:5:502:20 | ExprStmt | | +| main.rs:497:10:497:10 | x | main.rs:497:10:497:10 | x | | +| main.rs:497:10:497:10 | x | main.rs:497:10:497:15 | ...: i64 | match | +| main.rs:497:10:497:15 | ...: i64 | main.rs:499:9:499:9 | x | | +| main.rs:498:5:500:5 | { ... } | main.rs:497:5:500:5 | exit fn f (normal) | | +| main.rs:499:9:499:9 | x | main.rs:499:13:499:13 | 1 | | +| main.rs:499:9:499:13 | ... + ... | main.rs:498:5:500:5 | { ... } | | +| main.rs:499:13:499:13 | 1 | main.rs:499:9:499:13 | ... + ... | | +| main.rs:502:5:502:13 | print_i64 | main.rs:502:15:502:15 | f | | +| main.rs:502:5:502:19 | print_i64(...) | main.rs:505:9:505:24 | ExprStmt | | +| main.rs:502:5:502:20 | ExprStmt | main.rs:502:5:502:13 | print_i64 | | +| main.rs:502:15:502:15 | f | main.rs:502:17:502:17 | 2 | | +| main.rs:502:15:502:18 | f(...) | main.rs:502:5:502:19 | print_i64(...) | | +| main.rs:502:17:502:17 | 2 | main.rs:502:15:502:18 | f(...) | | +| main.rs:504:5:519:5 | { ... } | main.rs:490:22:520:1 | { ... } | | +| main.rs:505:9:505:17 | print_i64 | main.rs:505:19:505:19 | f | | +| main.rs:505:9:505:23 | print_i64(...) | main.rs:506:9:509:9 | fn f | | +| main.rs:505:9:505:24 | ExprStmt | main.rs:505:9:505:17 | print_i64 | | +| main.rs:505:19:505:19 | f | main.rs:505:21:505:21 | 3 | | +| main.rs:505:19:505:22 | f(...) | main.rs:505:9:505:23 | print_i64(...) | | +| main.rs:505:21:505:21 | 3 | main.rs:505:19:505:22 | f(...) | | +| main.rs:506:9:509:9 | enter fn f | main.rs:506:14:506:14 | x | | +| main.rs:506:9:509:9 | exit fn f (normal) | main.rs:506:9:509:9 | exit fn f | | +| main.rs:506:9:509:9 | fn f | main.rs:511:9:513:9 | ExprStmt | | +| main.rs:506:14:506:14 | x | main.rs:506:14:506:14 | x | | +| main.rs:506:14:506:14 | x | main.rs:506:14:506:19 | ...: i64 | match | +| main.rs:506:14:506:19 | ...: i64 | main.rs:508:13:508:13 | 2 | | +| main.rs:507:9:509:9 | { ... } | main.rs:506:9:509:9 | exit fn f (normal) | | +| main.rs:508:13:508:13 | 2 | main.rs:508:17:508:17 | x | | +| main.rs:508:13:508:17 | ... * ... | main.rs:507:9:509:9 | { ... } | | +| main.rs:508:17:508:17 | x | main.rs:508:13:508:17 | ... * ... | | +| main.rs:511:9:513:9 | ExprStmt | main.rs:512:13:512:28 | ExprStmt | | +| main.rs:511:9:513:9 | { ... } | main.rs:515:9:517:14 | let ... = ... | | +| main.rs:512:13:512:21 | print_i64 | main.rs:512:23:512:23 | f | | +| main.rs:512:13:512:27 | print_i64(...) | main.rs:511:9:513:9 | { ... } | | +| main.rs:512:13:512:28 | ExprStmt | main.rs:512:13:512:21 | print_i64 | | +| main.rs:512:23:512:23 | f | main.rs:512:25:512:25 | 4 | | +| main.rs:512:23:512:26 | f(...) | main.rs:512:13:512:27 | print_i64(...) | | +| main.rs:512:25:512:25 | 4 | main.rs:512:23:512:26 | f(...) | | +| main.rs:515:9:517:14 | let ... = ... | main.rs:516:13:517:13 | \|...\| x | | +| main.rs:515:13:515:13 | f | main.rs:515:13:515:13 | f | | +| main.rs:515:13:515:13 | f | main.rs:518:9:518:24 | ExprStmt | match | +| main.rs:516:13:517:13 | \|...\| x | main.rs:515:13:515:13 | f | | +| main.rs:516:13:517:13 | enter \|...\| x | main.rs:516:14:516:14 | x | | +| main.rs:516:13:517:13 | exit \|...\| x (normal) | main.rs:516:13:517:13 | exit \|...\| x | | +| main.rs:516:14:516:14 | x | main.rs:516:14:516:14 | x | | +| main.rs:516:14:516:14 | x | main.rs:516:14:516:19 | ...: i64 | match | +| main.rs:516:14:516:19 | ...: i64 | main.rs:517:13:517:13 | x | | +| main.rs:517:13:517:13 | x | main.rs:516:13:517:13 | exit \|...\| x (normal) | | +| main.rs:518:9:518:17 | print_i64 | main.rs:518:19:518:19 | f | | +| main.rs:518:9:518:23 | print_i64(...) | main.rs:504:5:519:5 | { ... } | | +| main.rs:518:9:518:24 | ExprStmt | main.rs:518:9:518:17 | print_i64 | | +| main.rs:518:19:518:19 | f | main.rs:518:21:518:21 | 5 | | +| main.rs:518:19:518:22 | f(...) | main.rs:518:9:518:23 | print_i64(...) | | +| main.rs:518:21:518:21 | 5 | main.rs:518:19:518:22 | f(...) | | +| main.rs:522:1:529:1 | enter fn for_variable | main.rs:523:5:523:42 | let ... = ... | | +| main.rs:522:1:529:1 | exit fn for_variable (normal) | main.rs:522:1:529:1 | exit fn for_variable | | +| main.rs:522:19:529:1 | { ... } | main.rs:522:1:529:1 | exit fn for_variable (normal) | | +| main.rs:523:5:523:42 | let ... = ... | main.rs:523:15:523:22 | "apples" | | +| main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | v | | +| main.rs:523:9:523:9 | v | main.rs:526:12:526:12 | v | match | +| main.rs:523:13:523:41 | &... | main.rs:523:9:523:9 | v | | +| main.rs:523:14:523:41 | [...] | main.rs:523:13:523:41 | &... | | +| main.rs:523:15:523:22 | "apples" | main.rs:523:25:523:30 | "cake" | | +| main.rs:523:25:523:30 | "cake" | main.rs:523:33:523:40 | "coffee" | | +| main.rs:523:33:523:40 | "coffee" | main.rs:523:14:523:41 | [...] | | +| main.rs:525:5:528:5 | for ... in ... { ... } | main.rs:522:19:529:1 | { ... } | | +| main.rs:525:9:525:12 | text | main.rs:525:5:528:5 | for ... in ... { ... } | no-match | +| main.rs:525:9:525:12 | text | main.rs:525:9:525:12 | text | | +| main.rs:525:9:525:12 | text | main.rs:527:9:527:24 | ExprStmt | match | +| main.rs:526:12:526:12 | v | main.rs:525:9:525:12 | text | | +| main.rs:526:14:528:5 | { ... } | main.rs:525:9:525:12 | text | | +| main.rs:527:9:527:17 | print_str | main.rs:527:19:527:22 | text | | +| main.rs:527:9:527:23 | print_str(...) | main.rs:526:14:528:5 | { ... } | | +| main.rs:527:9:527:24 | ExprStmt | main.rs:527:9:527:17 | print_str | | +| main.rs:527:19:527:22 | text | main.rs:527:9:527:23 | print_str(...) | | +| main.rs:531:1:537:1 | enter fn add_assign | main.rs:532:5:532:18 | let ... = 0 | | +| main.rs:531:1:537:1 | exit fn add_assign (normal) | main.rs:531:1:537:1 | exit fn add_assign | | +| main.rs:531:17:537:1 | { ... } | main.rs:531:1:537:1 | exit fn add_assign (normal) | | +| main.rs:532:5:532:18 | let ... = 0 | main.rs:532:17:532:17 | 0 | | +| main.rs:532:9:532:13 | mut a | main.rs:533:5:533:11 | ExprStmt | match | +| main.rs:532:13:532:13 | a | main.rs:532:9:532:13 | mut a | | +| main.rs:532:17:532:17 | 0 | main.rs:532:13:532:13 | a | | +| main.rs:533:5:533:5 | a | main.rs:533:10:533:10 | 1 | | +| main.rs:533:5:533:10 | ... += ... | main.rs:534:5:534:17 | ExprStmt | | +| main.rs:533:5:533:11 | ExprStmt | main.rs:533:5:533:5 | a | | +| main.rs:533:10:533:10 | 1 | main.rs:533:5:533:10 | ... += ... | | +| main.rs:534:5:534:13 | print_i64 | main.rs:534:15:534:15 | a | | +| main.rs:534:5:534:16 | print_i64(...) | main.rs:535:5:535:28 | ExprStmt | | +| main.rs:534:5:534:17 | ExprStmt | main.rs:534:5:534:13 | print_i64 | | +| main.rs:534:15:534:15 | a | main.rs:534:5:534:16 | print_i64(...) | | +| main.rs:535:5:535:27 | ... .add_assign(...) | main.rs:536:5:536:17 | ExprStmt | | +| main.rs:535:5:535:28 | ExprStmt | main.rs:535:11:535:11 | a | | +| main.rs:535:6:535:11 | &mut a | main.rs:535:25:535:26 | 10 | | +| main.rs:535:11:535:11 | a | main.rs:535:6:535:11 | &mut a | | +| main.rs:535:25:535:26 | 10 | main.rs:535:5:535:27 | ... .add_assign(...) | | +| main.rs:536:5:536:13 | print_i64 | main.rs:536:15:536:15 | a | | +| main.rs:536:5:536:16 | print_i64(...) | main.rs:531:17:537:1 | { ... } | | +| main.rs:536:5:536:17 | ExprStmt | main.rs:536:5:536:13 | print_i64 | | +| main.rs:536:15:536:15 | a | main.rs:536:5:536:16 | print_i64(...) | | +| main.rs:539:1:545:1 | enter fn mutate | main.rs:540:5:540:18 | let ... = 1 | | +| main.rs:539:1:545:1 | exit fn mutate (normal) | main.rs:539:1:545:1 | exit fn mutate | | +| main.rs:539:13:545:1 | { ... } | main.rs:539:1:545:1 | exit fn mutate (normal) | | +| main.rs:540:5:540:18 | let ... = 1 | main.rs:540:17:540:17 | 1 | | +| main.rs:540:9:540:13 | mut i | main.rs:541:5:542:15 | let ... = ... | match | +| main.rs:540:13:540:13 | i | main.rs:540:9:540:13 | mut i | | +| main.rs:540:17:540:17 | 1 | main.rs:540:13:540:13 | i | | +| main.rs:541:5:542:15 | let ... = ... | main.rs:542:14:542:14 | i | | +| main.rs:541:9:541:13 | ref_i | main.rs:541:9:541:13 | ref_i | | +| main.rs:541:9:541:13 | ref_i | main.rs:543:5:543:15 | ExprStmt | match | +| main.rs:542:9:542:14 | &mut i | main.rs:541:9:541:13 | ref_i | | +| main.rs:542:14:542:14 | i | main.rs:542:9:542:14 | &mut i | | +| main.rs:543:5:543:10 | * ... | main.rs:543:14:543:14 | 2 | | +| main.rs:543:5:543:14 | ... = ... | main.rs:544:5:544:17 | ExprStmt | | +| main.rs:543:5:543:15 | ExprStmt | main.rs:543:6:543:10 | ref_i | | +| main.rs:543:6:543:10 | ref_i | main.rs:543:5:543:10 | * ... | | +| main.rs:543:14:543:14 | 2 | main.rs:543:5:543:14 | ... = ... | | +| main.rs:544:5:544:13 | print_i64 | main.rs:544:15:544:15 | i | | +| main.rs:544:5:544:16 | print_i64(...) | main.rs:539:13:545:1 | { ... } | | +| main.rs:544:5:544:17 | ExprStmt | main.rs:544:5:544:13 | print_i64 | | +| main.rs:544:15:544:15 | i | main.rs:544:5:544:16 | print_i64(...) | | +| main.rs:547:1:552:1 | enter fn mutate_param | main.rs:547:17:547:17 | x | | +| main.rs:547:1:552:1 | exit fn mutate_param (normal) | main.rs:547:1:552:1 | exit fn mutate_param | | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:27 | ...: ... | match | +| main.rs:547:17:547:27 | ...: ... | main.rs:548:5:550:11 | ExprStmt | | +| main.rs:548:5:548:6 | * ... | main.rs:549:10:549:10 | x | | +| main.rs:548:5:550:10 | ... = ... | main.rs:551:5:551:13 | ExprStmt | | +| main.rs:548:5:550:11 | ExprStmt | main.rs:548:6:548:6 | x | | +| main.rs:548:6:548:6 | x | main.rs:548:5:548:6 | * ... | | +| main.rs:549:9:549:10 | * ... | main.rs:550:10:550:10 | x | | +| main.rs:549:9:550:10 | ... + ... | main.rs:548:5:550:10 | ... = ... | | +| main.rs:549:10:549:10 | x | main.rs:549:9:549:10 | * ... | | +| main.rs:550:9:550:10 | * ... | main.rs:549:9:550:10 | ... + ... | | +| main.rs:550:10:550:10 | x | main.rs:550:9:550:10 | * ... | | +| main.rs:551:5:551:12 | return x | main.rs:547:1:552:1 | exit fn mutate_param (normal) | return | +| main.rs:551:5:551:13 | ExprStmt | main.rs:551:12:551:12 | x | | +| main.rs:551:12:551:12 | x | main.rs:551:5:551:12 | return x | | +| main.rs:554:1:560:1 | enter fn mutate_param2 | main.rs:554:22:554:22 | x | | +| main.rs:554:1:560:1 | exit fn mutate_param2 (normal) | main.rs:554:1:560:1 | exit fn mutate_param2 | | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:35 | ...: ... | match | +| main.rs:554:22:554:35 | ...: ... | main.rs:554:38:554:38 | y | | +| main.rs:554:38:554:38 | y | main.rs:554:38:554:38 | y | | +| main.rs:554:38:554:38 | y | main.rs:554:38:554:56 | ...: ... | match | +| main.rs:554:38:554:56 | ...: ... | main.rs:555:5:557:11 | ExprStmt | | +| main.rs:554:59:560:1 | { ... } | main.rs:554:1:560:1 | exit fn mutate_param2 (normal) | | +| main.rs:555:5:555:6 | * ... | main.rs:556:10:556:10 | x | | +| main.rs:555:5:557:10 | ... = ... | main.rs:558:5:559:10 | ExprStmt | | +| main.rs:555:5:557:11 | ExprStmt | main.rs:555:6:555:6 | x | | +| main.rs:555:6:555:6 | x | main.rs:555:5:555:6 | * ... | | +| main.rs:556:9:556:10 | * ... | main.rs:557:10:557:10 | x | | +| main.rs:556:9:557:10 | ... + ... | main.rs:555:5:557:10 | ... = ... | | +| main.rs:556:10:556:10 | x | main.rs:556:9:556:10 | * ... | | +| main.rs:557:9:557:10 | * ... | main.rs:556:9:557:10 | ... + ... | | +| main.rs:557:10:557:10 | x | main.rs:557:9:557:10 | * ... | | +| main.rs:558:5:558:6 | * ... | main.rs:559:9:559:9 | x | | +| main.rs:558:5:559:9 | ... = ... | main.rs:554:59:560:1 | { ... } | | +| main.rs:558:5:559:10 | ExprStmt | main.rs:558:6:558:6 | y | | +| main.rs:558:6:558:6 | y | main.rs:558:5:558:6 | * ... | | +| main.rs:559:9:559:9 | x | main.rs:558:5:559:9 | ... = ... | | +| main.rs:562:1:582:1 | enter fn mutate_arg | main.rs:563:5:563:18 | let ... = 2 | | +| main.rs:562:1:582:1 | exit fn mutate_arg (normal) | main.rs:562:1:582:1 | exit fn mutate_arg | | +| main.rs:562:17:582:1 | { ... } | main.rs:562:1:582:1 | exit fn mutate_arg (normal) | | +| main.rs:563:5:563:18 | let ... = 2 | main.rs:563:17:563:17 | 2 | | +| main.rs:563:9:563:13 | mut x | main.rs:564:5:565:29 | let ... = ... | match | +| main.rs:563:13:563:13 | x | main.rs:563:9:563:13 | mut x | | +| main.rs:563:17:563:17 | 2 | main.rs:563:13:563:13 | x | | +| main.rs:564:5:565:29 | let ... = ... | main.rs:565:9:565:20 | mutate_param | | +| main.rs:564:9:564:9 | y | main.rs:564:9:564:9 | y | | +| main.rs:564:9:564:9 | y | main.rs:566:5:566:12 | ExprStmt | match | +| main.rs:565:9:565:20 | mutate_param | main.rs:565:27:565:27 | x | | +| main.rs:565:9:565:28 | mutate_param(...) | main.rs:564:9:564:9 | y | | +| main.rs:565:22:565:27 | &mut x | main.rs:565:9:565:28 | mutate_param(...) | | +| main.rs:565:27:565:27 | x | main.rs:565:22:565:27 | &mut x | | +| main.rs:566:5:566:6 | * ... | main.rs:566:10:566:11 | 10 | | +| main.rs:566:5:566:11 | ... = ... | main.rs:569:5:569:17 | ExprStmt | | +| main.rs:566:5:566:12 | ExprStmt | main.rs:566:6:566:6 | y | | +| main.rs:566:6:566:6 | y | main.rs:566:5:566:6 | * ... | | +| main.rs:566:10:566:11 | 10 | main.rs:566:5:566:11 | ... = ... | | +| main.rs:569:5:569:13 | print_i64 | main.rs:569:15:569:15 | x | | +| main.rs:569:5:569:16 | print_i64(...) | main.rs:571:5:571:18 | let ... = 4 | | +| main.rs:569:5:569:17 | ExprStmt | main.rs:569:5:569:13 | print_i64 | | +| main.rs:569:15:569:15 | x | main.rs:569:5:569:16 | print_i64(...) | | +| main.rs:571:5:571:18 | let ... = 4 | main.rs:571:17:571:17 | 4 | | +| main.rs:571:9:571:13 | mut z | main.rs:572:5:573:20 | let ... = ... | match | +| main.rs:571:13:571:13 | z | main.rs:571:9:571:13 | mut z | | +| main.rs:571:17:571:17 | 4 | main.rs:571:13:571:13 | z | | +| main.rs:572:5:573:20 | let ... = ... | main.rs:573:19:573:19 | x | | +| main.rs:572:9:572:9 | w | main.rs:572:9:572:9 | w | | +| main.rs:572:9:572:9 | w | main.rs:574:5:577:6 | ExprStmt | match | +| main.rs:573:9:573:19 | &mut ... | main.rs:572:9:572:9 | w | | +| main.rs:573:14:573:19 | &mut x | main.rs:573:9:573:19 | &mut ... | | +| main.rs:573:19:573:19 | x | main.rs:573:14:573:19 | &mut x | | +| main.rs:574:5:574:17 | mutate_param2 | main.rs:575:14:575:14 | z | | +| main.rs:574:5:577:5 | mutate_param2(...) | main.rs:578:5:578:13 | ExprStmt | | +| main.rs:574:5:577:6 | ExprStmt | main.rs:574:5:574:17 | mutate_param2 | | +| main.rs:575:9:575:14 | &mut z | main.rs:576:9:576:9 | w | | +| main.rs:575:14:575:14 | z | main.rs:575:9:575:14 | &mut z | | +| main.rs:576:9:576:9 | w | main.rs:574:5:577:5 | mutate_param2(...) | | +| main.rs:578:5:578:7 | * ... | main.rs:578:11:578:12 | 11 | | +| main.rs:578:5:578:12 | ... = ... | main.rs:581:5:581:17 | ExprStmt | | +| main.rs:578:5:578:13 | ExprStmt | main.rs:578:7:578:7 | w | | +| main.rs:578:6:578:7 | * ... | main.rs:578:5:578:7 | * ... | | +| main.rs:578:7:578:7 | w | main.rs:578:6:578:7 | * ... | | +| main.rs:578:11:578:12 | 11 | main.rs:578:5:578:12 | ... = ... | | +| main.rs:581:5:581:13 | print_i64 | main.rs:581:15:581:15 | z | | +| main.rs:581:5:581:16 | print_i64(...) | main.rs:562:17:582:1 | { ... } | | +| main.rs:581:5:581:17 | ExprStmt | main.rs:581:5:581:13 | print_i64 | | +| main.rs:581:15:581:15 | z | main.rs:581:5:581:16 | print_i64(...) | | +| main.rs:584:1:590:1 | enter fn alias | main.rs:585:5:585:18 | let ... = 1 | | +| main.rs:584:1:590:1 | exit fn alias (normal) | main.rs:584:1:590:1 | exit fn alias | | +| main.rs:584:12:590:1 | { ... } | main.rs:584:1:590:1 | exit fn alias (normal) | | +| main.rs:585:5:585:18 | let ... = 1 | main.rs:585:17:585:17 | 1 | | +| main.rs:585:9:585:13 | mut x | main.rs:586:5:587:15 | let ... = ... | match | +| main.rs:585:13:585:13 | x | main.rs:585:9:585:13 | mut x | | +| main.rs:585:17:585:17 | 1 | main.rs:585:13:585:13 | x | | +| main.rs:586:5:587:15 | let ... = ... | main.rs:587:14:587:14 | x | | +| main.rs:586:9:586:9 | y | main.rs:586:9:586:9 | y | | +| main.rs:586:9:586:9 | y | main.rs:588:5:588:11 | ExprStmt | match | +| main.rs:587:9:587:14 | &mut x | main.rs:586:9:586:9 | y | | +| main.rs:587:14:587:14 | x | main.rs:587:9:587:14 | &mut x | | +| main.rs:588:5:588:6 | * ... | main.rs:588:10:588:10 | 2 | | +| main.rs:588:5:588:10 | ... = ... | main.rs:589:5:589:17 | ExprStmt | | +| main.rs:588:5:588:11 | ExprStmt | main.rs:588:6:588:6 | y | | +| main.rs:588:6:588:6 | y | main.rs:588:5:588:6 | * ... | | +| main.rs:588:10:588:10 | 2 | main.rs:588:5:588:10 | ... = ... | | +| main.rs:589:5:589:13 | print_i64 | main.rs:589:15:589:15 | x | | +| main.rs:589:5:589:16 | print_i64(...) | main.rs:584:12:590:1 | { ... } | | +| main.rs:589:5:589:17 | ExprStmt | main.rs:589:5:589:13 | print_i64 | | +| main.rs:589:15:589:15 | x | main.rs:589:5:589:16 | print_i64(...) | | +| main.rs:592:1:601:1 | enter fn capture_immut | main.rs:593:5:593:16 | let ... = 100 | | +| main.rs:592:1:601:1 | exit fn capture_immut (normal) | main.rs:592:1:601:1 | exit fn capture_immut | | +| main.rs:592:20:601:1 | { ... } | main.rs:592:1:601:1 | exit fn capture_immut (normal) | | +| main.rs:593:5:593:16 | let ... = 100 | main.rs:593:13:593:15 | 100 | | +| main.rs:593:9:593:9 | x | main.rs:593:9:593:9 | x | | +| main.rs:593:9:593:9 | x | main.rs:596:5:598:6 | let ... = ... | match | +| main.rs:593:13:593:15 | 100 | main.rs:593:9:593:9 | x | | +| main.rs:596:5:598:6 | let ... = ... | main.rs:596:15:598:5 | \|...\| ... | | +| main.rs:596:9:596:11 | cap | main.rs:596:9:596:11 | cap | | +| main.rs:596:9:596:11 | cap | main.rs:599:5:599:10 | ExprStmt | match | +| main.rs:596:15:598:5 | \|...\| ... | main.rs:596:9:596:11 | cap | | +| main.rs:596:15:598:5 | enter \|...\| ... | main.rs:597:9:597:21 | ExprStmt | | +| main.rs:596:15:598:5 | exit \|...\| ... (normal) | main.rs:596:15:598:5 | exit \|...\| ... | | +| main.rs:596:18:598:5 | { ... } | main.rs:596:15:598:5 | exit \|...\| ... (normal) | | +| main.rs:597:9:597:17 | print_i64 | main.rs:597:19:597:19 | x | | +| main.rs:597:9:597:20 | print_i64(...) | main.rs:596:18:598:5 | { ... } | | +| main.rs:597:9:597:21 | ExprStmt | main.rs:597:9:597:17 | print_i64 | | +| main.rs:597:19:597:19 | x | main.rs:597:9:597:20 | print_i64(...) | | +| main.rs:599:5:599:7 | cap | main.rs:599:5:599:9 | cap(...) | | +| main.rs:599:5:599:9 | cap(...) | main.rs:600:5:600:17 | ExprStmt | | +| main.rs:599:5:599:10 | ExprStmt | main.rs:599:5:599:7 | cap | | +| main.rs:600:5:600:13 | print_i64 | main.rs:600:15:600:15 | x | | +| main.rs:600:5:600:16 | print_i64(...) | main.rs:592:20:601:1 | { ... } | | +| main.rs:600:5:600:17 | ExprStmt | main.rs:600:5:600:13 | print_i64 | | +| main.rs:600:15:600:15 | x | main.rs:600:5:600:16 | print_i64(...) | | +| main.rs:603:1:630:1 | enter fn capture_mut | main.rs:604:5:604:18 | let ... = 1 | | +| main.rs:603:1:630:1 | exit fn capture_mut (normal) | main.rs:603:1:630:1 | exit fn capture_mut | | +| main.rs:603:18:630:1 | { ... } | main.rs:603:1:630:1 | exit fn capture_mut (normal) | | +| main.rs:604:5:604:18 | let ... = 1 | main.rs:604:17:604:17 | 1 | | +| main.rs:604:9:604:13 | mut x | main.rs:607:5:609:6 | let ... = ... | match | +| main.rs:604:13:604:13 | x | main.rs:604:9:604:13 | mut x | | +| main.rs:604:17:604:17 | 1 | main.rs:604:13:604:13 | x | | +| main.rs:607:5:609:6 | let ... = ... | main.rs:607:20:609:5 | \|...\| ... | | +| main.rs:607:9:607:16 | closure1 | main.rs:607:9:607:16 | closure1 | | +| main.rs:607:9:607:16 | closure1 | main.rs:610:5:610:15 | ExprStmt | match | +| main.rs:607:20:609:5 | \|...\| ... | main.rs:607:9:607:16 | closure1 | | +| main.rs:607:20:609:5 | enter \|...\| ... | main.rs:608:9:608:21 | ExprStmt | | +| main.rs:607:20:609:5 | exit \|...\| ... (normal) | main.rs:607:20:609:5 | exit \|...\| ... | | +| main.rs:607:23:609:5 | { ... } | main.rs:607:20:609:5 | exit \|...\| ... (normal) | | +| main.rs:608:9:608:17 | print_i64 | main.rs:608:19:608:19 | x | | +| main.rs:608:9:608:20 | print_i64(...) | main.rs:607:23:609:5 | { ... } | | +| main.rs:608:9:608:21 | ExprStmt | main.rs:608:9:608:17 | print_i64 | | +| main.rs:608:19:608:19 | x | main.rs:608:9:608:20 | print_i64(...) | | +| main.rs:610:5:610:12 | closure1 | main.rs:610:5:610:14 | closure1(...) | | +| main.rs:610:5:610:14 | closure1(...) | main.rs:611:5:611:17 | ExprStmt | | +| main.rs:610:5:610:15 | ExprStmt | main.rs:610:5:610:12 | closure1 | | +| main.rs:611:5:611:13 | print_i64 | main.rs:611:15:611:15 | x | | +| main.rs:611:5:611:16 | print_i64(...) | main.rs:613:5:613:18 | let ... = 2 | | +| main.rs:611:5:611:17 | ExprStmt | main.rs:611:5:611:13 | print_i64 | | +| main.rs:611:15:611:15 | x | main.rs:611:5:611:16 | print_i64(...) | | +| main.rs:613:5:613:18 | let ... = 2 | main.rs:613:17:613:17 | 2 | | +| main.rs:613:9:613:13 | mut y | main.rs:616:5:618:6 | let ... = ... | match | +| main.rs:613:13:613:13 | y | main.rs:613:9:613:13 | mut y | | +| main.rs:613:17:613:17 | 2 | main.rs:613:13:613:13 | y | | +| main.rs:616:5:618:6 | let ... = ... | main.rs:616:24:618:5 | \|...\| ... | | +| main.rs:616:9:616:20 | mut closure2 | main.rs:619:5:619:15 | ExprStmt | match | +| main.rs:616:13:616:20 | closure2 | main.rs:616:9:616:20 | mut closure2 | | +| main.rs:616:24:618:5 | \|...\| ... | main.rs:616:13:616:20 | closure2 | | +| main.rs:616:24:618:5 | enter \|...\| ... | main.rs:617:9:617:14 | ExprStmt | | +| main.rs:616:24:618:5 | exit \|...\| ... (normal) | main.rs:616:24:618:5 | exit \|...\| ... | | +| main.rs:616:27:618:5 | { ... } | main.rs:616:24:618:5 | exit \|...\| ... (normal) | | +| main.rs:617:9:617:9 | y | main.rs:617:13:617:13 | 3 | | +| main.rs:617:9:617:13 | ... = ... | main.rs:616:27:618:5 | { ... } | | +| main.rs:617:9:617:14 | ExprStmt | main.rs:617:9:617:9 | y | | | main.rs:617:13:617:13 | 3 | main.rs:617:9:617:13 | ... = ... | | -| main.rs:618:9:618:17 | print_i64 | main.rs:618:19:618:19 | x | | -| main.rs:618:9:618:20 | print_i64(...) | main.rs:619:9:619:25 | ExprStmt | | -| main.rs:618:9:618:21 | ExprStmt | main.rs:618:9:618:17 | print_i64 | | -| main.rs:618:19:618:19 | x | main.rs:618:9:618:20 | print_i64(...) | | -| main.rs:619:9:619:17 | print_i64 | main.rs:619:19:619:19 | x | | -| main.rs:619:9:619:24 | print_i64(...) | main.rs:616:12:620:5 | { ... } | | -| main.rs:619:9:619:25 | ExprStmt | main.rs:619:9:619:17 | print_i64 | | -| main.rs:619:19:619:19 | x | main.rs:619:23:619:23 | 1 | | -| main.rs:619:19:619:23 | ... + ... | main.rs:619:9:619:24 | print_i64(...) | | -| main.rs:619:23:619:23 | 1 | main.rs:619:19:619:23 | ... + ... | | -| main.rs:621:5:621:13 | print_i64 | main.rs:621:15:621:15 | x | | -| main.rs:621:5:621:16 | print_i64(...) | main.rs:606:17:622:1 | { ... } | | -| main.rs:621:5:621:17 | ExprStmt | main.rs:621:5:621:13 | print_i64 | | -| main.rs:621:15:621:15 | x | main.rs:621:5:621:16 | print_i64(...) | | -| main.rs:624:1:641:1 | enter fn phi_read | main.rs:624:13:624:14 | b1 | | -| main.rs:624:1:641:1 | exit fn phi_read (normal) | main.rs:624:1:641:1 | exit fn phi_read | | -| main.rs:624:13:624:14 | b1 | main.rs:624:13:624:14 | b1 | | -| main.rs:624:13:624:14 | b1 | main.rs:624:13:624:20 | ...: bool | match | -| main.rs:624:13:624:20 | ...: bool | main.rs:624:23:624:24 | b2 | | -| main.rs:624:23:624:24 | b2 | main.rs:624:23:624:24 | b2 | | -| main.rs:624:23:624:24 | b2 | main.rs:624:23:624:30 | ...: bool | match | -| main.rs:624:23:624:30 | ...: bool | main.rs:625:5:625:14 | let ... = 1 | | -| main.rs:624:33:641:1 | { ... } | main.rs:624:1:641:1 | exit fn phi_read (normal) | | -| main.rs:625:5:625:14 | let ... = 1 | main.rs:625:13:625:13 | 1 | | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | | -| main.rs:625:9:625:9 | x | main.rs:626:5:632:6 | let _ = ... | match | -| main.rs:625:13:625:13 | 1 | main.rs:625:9:625:9 | x | | -| main.rs:626:5:632:6 | let _ = ... | main.rs:627:16:627:17 | b1 | | -| main.rs:627:9:627:9 | _ | main.rs:634:5:640:6 | let _ = ... | match | -| main.rs:627:13:632:5 | if b1 {...} else {...} | main.rs:627:9:627:9 | _ | | -| main.rs:627:16:627:17 | b1 | main.rs:629:9:629:21 | ExprStmt | true | -| main.rs:627:16:627:17 | b1 | main.rs:631:9:631:21 | ExprStmt | false | -| main.rs:628:5:630:5 | { ... } | main.rs:627:13:632:5 | if b1 {...} else {...} | | -| main.rs:629:9:629:17 | print_i64 | main.rs:629:19:629:19 | x | | -| main.rs:629:9:629:20 | print_i64(...) | main.rs:628:5:630:5 | { ... } | | -| main.rs:629:9:629:21 | ExprStmt | main.rs:629:9:629:17 | print_i64 | | -| main.rs:629:19:629:19 | x | main.rs:629:9:629:20 | print_i64(...) | | -| main.rs:630:12:632:5 | { ... } | main.rs:627:13:632:5 | if b1 {...} else {...} | | -| main.rs:631:9:631:17 | print_i64 | main.rs:631:19:631:19 | x | | -| main.rs:631:9:631:20 | print_i64(...) | main.rs:630:12:632:5 | { ... } | | -| main.rs:631:9:631:21 | ExprStmt | main.rs:631:9:631:17 | print_i64 | | -| main.rs:631:19:631:19 | x | main.rs:631:9:631:20 | print_i64(...) | | -| main.rs:634:5:640:6 | let _ = ... | main.rs:635:16:635:17 | b2 | | -| main.rs:635:9:635:9 | _ | main.rs:624:33:641:1 | { ... } | match | -| main.rs:635:13:640:5 | if b2 {...} else {...} | main.rs:635:9:635:9 | _ | | -| main.rs:635:16:635:17 | b2 | main.rs:637:9:637:21 | ExprStmt | true | -| main.rs:635:16:635:17 | b2 | main.rs:639:9:639:21 | ExprStmt | false | -| main.rs:636:5:638:5 | { ... } | main.rs:635:13:640:5 | if b2 {...} else {...} | | -| main.rs:637:9:637:17 | print_i64 | main.rs:637:19:637:19 | x | | -| main.rs:637:9:637:20 | print_i64(...) | main.rs:636:5:638:5 | { ... } | | -| main.rs:637:9:637:21 | ExprStmt | main.rs:637:9:637:17 | print_i64 | | -| main.rs:637:19:637:19 | x | main.rs:637:9:637:20 | print_i64(...) | | -| main.rs:638:12:640:5 | { ... } | main.rs:635:13:640:5 | if b2 {...} else {...} | | -| main.rs:639:9:639:17 | print_i64 | main.rs:639:19:639:19 | x | | -| main.rs:639:9:639:20 | print_i64(...) | main.rs:638:12:640:5 | { ... } | | -| main.rs:639:9:639:21 | ExprStmt | main.rs:639:9:639:17 | print_i64 | | -| main.rs:639:19:639:19 | x | main.rs:639:9:639:20 | print_i64(...) | | -| main.rs:648:5:650:5 | enter fn my_get | main.rs:648:20:648:23 | self | | -| main.rs:648:5:650:5 | exit fn my_get (normal) | main.rs:648:5:650:5 | exit fn my_get | | -| main.rs:648:15:648:23 | SelfParam | main.rs:649:9:649:24 | ExprStmt | | -| main.rs:648:20:648:23 | self | main.rs:648:15:648:23 | SelfParam | | -| main.rs:649:9:649:23 | return ... | main.rs:648:5:650:5 | exit fn my_get (normal) | return | -| main.rs:649:9:649:24 | ExprStmt | main.rs:649:16:649:19 | self | | -| main.rs:649:16:649:19 | self | main.rs:649:16:649:23 | self.val | | -| main.rs:649:16:649:23 | self.val | main.rs:649:9:649:23 | return ... | | -| main.rs:652:5:654:5 | enter fn id | main.rs:652:11:652:14 | self | | -| main.rs:652:5:654:5 | exit fn id (normal) | main.rs:652:5:654:5 | exit fn id | | -| main.rs:652:11:652:14 | SelfParam | main.rs:653:9:653:12 | self | | -| main.rs:652:11:652:14 | self | main.rs:652:11:652:14 | SelfParam | | -| main.rs:652:25:654:5 | { ... } | main.rs:652:5:654:5 | exit fn id (normal) | | -| main.rs:653:9:653:12 | self | main.rs:652:25:654:5 | { ... } | | -| main.rs:656:5:663:5 | enter fn my_method | main.rs:656:23:656:26 | self | | -| main.rs:656:5:663:5 | exit fn my_method (normal) | main.rs:656:5:663:5 | exit fn my_method | | -| main.rs:656:18:656:26 | SelfParam | main.rs:657:9:660:10 | let ... = ... | | -| main.rs:656:23:656:26 | self | main.rs:656:18:656:26 | SelfParam | | -| main.rs:656:29:663:5 | { ... } | main.rs:656:5:663:5 | exit fn my_method (normal) | | -| main.rs:657:9:660:10 | let ... = ... | main.rs:657:21:660:9 | \|...\| ... | | -| main.rs:657:13:657:17 | mut f | main.rs:661:9:661:13 | ExprStmt | match | -| main.rs:657:17:657:17 | f | main.rs:657:13:657:17 | mut f | | -| main.rs:657:21:660:9 | \|...\| ... | main.rs:657:17:657:17 | f | | -| main.rs:657:21:660:9 | enter \|...\| ... | main.rs:657:22:657:22 | n | | -| main.rs:657:21:660:9 | exit \|...\| ... (normal) | main.rs:657:21:660:9 | exit \|...\| ... | | -| main.rs:657:22:657:22 | ... | main.rs:659:13:659:26 | ExprStmt | | -| main.rs:657:22:657:22 | n | main.rs:657:22:657:22 | ... | match | -| main.rs:657:22:657:22 | n | main.rs:657:22:657:22 | n | | -| main.rs:657:25:660:9 | { ... } | main.rs:657:21:660:9 | exit \|...\| ... (normal) | | -| main.rs:659:13:659:16 | self | main.rs:659:13:659:20 | self.val | | -| main.rs:659:13:659:20 | self.val | main.rs:659:25:659:25 | n | | -| main.rs:659:13:659:25 | ... += ... | main.rs:657:25:660:9 | { ... } | | -| main.rs:659:13:659:26 | ExprStmt | main.rs:659:13:659:16 | self | | -| main.rs:659:25:659:25 | n | main.rs:659:13:659:25 | ... += ... | | -| main.rs:661:9:661:9 | f | main.rs:661:11:661:11 | 3 | | -| main.rs:661:9:661:12 | f(...) | main.rs:662:9:662:13 | ExprStmt | | -| main.rs:661:9:661:13 | ExprStmt | main.rs:661:9:661:9 | f | | -| main.rs:661:11:661:11 | 3 | main.rs:661:9:661:12 | f(...) | | -| main.rs:662:9:662:9 | f | main.rs:662:11:662:11 | 4 | | -| main.rs:662:9:662:12 | f(...) | main.rs:656:29:663:5 | { ... } | | -| main.rs:662:9:662:13 | ExprStmt | main.rs:662:9:662:9 | f | | -| main.rs:662:11:662:11 | 4 | main.rs:662:9:662:12 | f(...) | | -| main.rs:666:1:673:1 | enter fn structs | main.rs:667:5:667:36 | let ... = ... | | -| main.rs:666:1:673:1 | exit fn structs (normal) | main.rs:666:1:673:1 | exit fn structs | | -| main.rs:666:14:673:1 | { ... } | main.rs:666:1:673:1 | exit fn structs (normal) | | -| main.rs:667:5:667:36 | let ... = ... | main.rs:667:33:667:33 | 1 | | -| main.rs:667:9:667:13 | mut a | main.rs:668:5:668:26 | ExprStmt | match | -| main.rs:667:13:667:13 | a | main.rs:667:9:667:13 | mut a | | -| main.rs:667:17:667:35 | MyStruct {...} | main.rs:667:13:667:13 | a | | -| main.rs:667:33:667:33 | 1 | main.rs:667:17:667:35 | MyStruct {...} | | -| main.rs:668:5:668:13 | print_i64 | main.rs:668:15:668:15 | a | | -| main.rs:668:5:668:25 | print_i64(...) | main.rs:669:5:669:14 | ExprStmt | | -| main.rs:668:5:668:26 | ExprStmt | main.rs:668:5:668:13 | print_i64 | | -| main.rs:668:15:668:15 | a | main.rs:668:15:668:24 | a.my_get() | | -| main.rs:668:15:668:24 | a.my_get() | main.rs:668:5:668:25 | print_i64(...) | | -| main.rs:669:5:669:5 | a | main.rs:669:5:669:9 | a.val | | -| main.rs:669:5:669:9 | a.val | main.rs:669:13:669:13 | 5 | | -| main.rs:669:5:669:13 | ... = ... | main.rs:670:5:670:26 | ExprStmt | | -| main.rs:669:5:669:14 | ExprStmt | main.rs:669:5:669:5 | a | | -| main.rs:669:13:669:13 | 5 | main.rs:669:5:669:13 | ... = ... | | -| main.rs:670:5:670:13 | print_i64 | main.rs:670:15:670:15 | a | | -| main.rs:670:5:670:25 | print_i64(...) | main.rs:671:5:671:28 | ExprStmt | | -| main.rs:670:5:670:26 | ExprStmt | main.rs:670:5:670:13 | print_i64 | | -| main.rs:670:15:670:15 | a | main.rs:670:15:670:24 | a.my_get() | | -| main.rs:670:15:670:24 | a.my_get() | main.rs:670:5:670:25 | print_i64(...) | | -| main.rs:671:5:671:5 | a | main.rs:671:25:671:25 | 2 | | -| main.rs:671:5:671:27 | ... = ... | main.rs:672:5:672:26 | ExprStmt | | -| main.rs:671:5:671:28 | ExprStmt | main.rs:671:5:671:5 | a | | -| main.rs:671:9:671:27 | MyStruct {...} | main.rs:671:5:671:27 | ... = ... | | -| main.rs:671:25:671:25 | 2 | main.rs:671:9:671:27 | MyStruct {...} | | -| main.rs:672:5:672:13 | print_i64 | main.rs:672:15:672:15 | a | | -| main.rs:672:5:672:25 | print_i64(...) | main.rs:666:14:673:1 | { ... } | | -| main.rs:672:5:672:26 | ExprStmt | main.rs:672:5:672:13 | print_i64 | | -| main.rs:672:15:672:15 | a | main.rs:672:15:672:24 | a.my_get() | | -| main.rs:672:15:672:24 | a.my_get() | main.rs:672:5:672:25 | print_i64(...) | | -| main.rs:675:1:682:1 | enter fn arrays | main.rs:676:5:676:26 | let ... = ... | | -| main.rs:675:1:682:1 | exit fn arrays (normal) | main.rs:675:1:682:1 | exit fn arrays | | -| main.rs:675:13:682:1 | { ... } | main.rs:675:1:682:1 | exit fn arrays (normal) | | -| main.rs:676:5:676:26 | let ... = ... | main.rs:676:18:676:18 | 1 | | -| main.rs:676:9:676:13 | mut a | main.rs:677:5:677:20 | ExprStmt | match | -| main.rs:676:13:676:13 | a | main.rs:676:9:676:13 | mut a | | -| main.rs:676:17:676:25 | [...] | main.rs:676:13:676:13 | a | | -| main.rs:676:18:676:18 | 1 | main.rs:676:21:676:21 | 2 | | -| main.rs:676:21:676:21 | 2 | main.rs:676:24:676:24 | 3 | | -| main.rs:676:24:676:24 | 3 | main.rs:676:17:676:25 | [...] | | -| main.rs:677:5:677:13 | print_i64 | main.rs:677:15:677:15 | a | | -| main.rs:677:5:677:19 | print_i64(...) | main.rs:678:5:678:13 | ExprStmt | | -| main.rs:677:5:677:20 | ExprStmt | main.rs:677:5:677:13 | print_i64 | | -| main.rs:677:15:677:15 | a | main.rs:677:17:677:17 | 0 | | -| main.rs:677:15:677:18 | a[0] | main.rs:677:5:677:19 | print_i64(...) | | -| main.rs:677:17:677:17 | 0 | main.rs:677:15:677:18 | a[0] | | -| main.rs:678:5:678:5 | a | main.rs:678:7:678:7 | 1 | | -| main.rs:678:5:678:8 | a[1] | main.rs:678:12:678:12 | 5 | | -| main.rs:678:5:678:12 | ... = ... | main.rs:679:5:679:20 | ExprStmt | | -| main.rs:678:5:678:13 | ExprStmt | main.rs:678:5:678:5 | a | | -| main.rs:678:7:678:7 | 1 | main.rs:678:5:678:8 | a[1] | | -| main.rs:678:12:678:12 | 5 | main.rs:678:5:678:12 | ... = ... | | -| main.rs:679:5:679:13 | print_i64 | main.rs:679:15:679:15 | a | | -| main.rs:679:5:679:19 | print_i64(...) | main.rs:680:5:680:18 | ExprStmt | | -| main.rs:679:5:679:20 | ExprStmt | main.rs:679:5:679:13 | print_i64 | | -| main.rs:679:15:679:15 | a | main.rs:679:17:679:17 | 1 | | -| main.rs:679:15:679:18 | a[1] | main.rs:679:5:679:19 | print_i64(...) | | -| main.rs:679:17:679:17 | 1 | main.rs:679:15:679:18 | a[1] | | -| main.rs:680:5:680:5 | a | main.rs:680:10:680:10 | 4 | | -| main.rs:680:5:680:17 | ... = ... | main.rs:681:5:681:20 | ExprStmt | | -| main.rs:680:5:680:18 | ExprStmt | main.rs:680:5:680:5 | a | | -| main.rs:680:9:680:17 | [...] | main.rs:680:5:680:17 | ... = ... | | -| main.rs:680:10:680:10 | 4 | main.rs:680:13:680:13 | 5 | | -| main.rs:680:13:680:13 | 5 | main.rs:680:16:680:16 | 6 | | -| main.rs:680:16:680:16 | 6 | main.rs:680:9:680:17 | [...] | | -| main.rs:681:5:681:13 | print_i64 | main.rs:681:15:681:15 | a | | -| main.rs:681:5:681:19 | print_i64(...) | main.rs:675:13:682:1 | { ... } | | -| main.rs:681:5:681:20 | ExprStmt | main.rs:681:5:681:13 | print_i64 | | -| main.rs:681:15:681:15 | a | main.rs:681:17:681:17 | 2 | | -| main.rs:681:15:681:18 | a[2] | main.rs:681:5:681:19 | print_i64(...) | | -| main.rs:681:17:681:17 | 2 | main.rs:681:15:681:18 | a[2] | | -| main.rs:684:1:691:1 | enter fn ref_arg | main.rs:685:5:685:15 | let ... = 16 | | -| main.rs:684:1:691:1 | exit fn ref_arg (normal) | main.rs:684:1:691:1 | exit fn ref_arg | | -| main.rs:684:14:691:1 | { ... } | main.rs:684:1:691:1 | exit fn ref_arg (normal) | | -| main.rs:685:5:685:15 | let ... = 16 | main.rs:685:13:685:14 | 16 | | -| main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | | -| main.rs:685:9:685:9 | x | main.rs:686:5:686:22 | ExprStmt | match | -| main.rs:685:13:685:14 | 16 | main.rs:685:9:685:9 | x | | -| main.rs:686:5:686:17 | print_i64_ref | main.rs:686:20:686:20 | x | | -| main.rs:686:5:686:21 | print_i64_ref(...) | main.rs:687:5:687:17 | ExprStmt | | -| main.rs:686:5:686:22 | ExprStmt | main.rs:686:5:686:17 | print_i64_ref | | -| main.rs:686:19:686:20 | &x | main.rs:686:5:686:21 | print_i64_ref(...) | | -| main.rs:686:20:686:20 | x | main.rs:686:19:686:20 | &x | | -| main.rs:687:5:687:13 | print_i64 | main.rs:687:15:687:15 | x | | -| main.rs:687:5:687:16 | print_i64(...) | main.rs:689:5:689:15 | let ... = 17 | | -| main.rs:687:5:687:17 | ExprStmt | main.rs:687:5:687:13 | print_i64 | | -| main.rs:687:15:687:15 | x | main.rs:687:5:687:16 | print_i64(...) | | -| main.rs:689:5:689:15 | let ... = 17 | main.rs:689:13:689:14 | 17 | | -| main.rs:689:9:689:9 | z | main.rs:689:9:689:9 | z | | -| main.rs:689:9:689:9 | z | main.rs:690:5:690:22 | ExprStmt | match | -| main.rs:689:13:689:14 | 17 | main.rs:689:9:689:9 | z | | -| main.rs:690:5:690:17 | print_i64_ref | main.rs:690:20:690:20 | z | | -| main.rs:690:5:690:21 | print_i64_ref(...) | main.rs:684:14:691:1 | { ... } | | -| main.rs:690:5:690:22 | ExprStmt | main.rs:690:5:690:17 | print_i64_ref | | -| main.rs:690:19:690:20 | &z | main.rs:690:5:690:21 | print_i64_ref(...) | | -| main.rs:690:20:690:20 | z | main.rs:690:19:690:20 | &z | | -| main.rs:698:5:700:5 | enter fn bar | main.rs:698:17:698:20 | self | | -| main.rs:698:5:700:5 | exit fn bar (normal) | main.rs:698:5:700:5 | exit fn bar | | -| main.rs:698:12:698:20 | SelfParam | main.rs:699:9:699:36 | ExprStmt | | -| main.rs:698:17:698:20 | self | main.rs:698:12:698:20 | SelfParam | | -| main.rs:698:23:700:5 | { ... } | main.rs:698:5:700:5 | exit fn bar (normal) | | -| main.rs:699:9:699:13 | * ... | main.rs:699:33:699:33 | 3 | | -| main.rs:699:9:699:35 | ... = ... | main.rs:698:23:700:5 | { ... } | | -| main.rs:699:9:699:36 | ExprStmt | main.rs:699:10:699:13 | self | | -| main.rs:699:10:699:13 | self | main.rs:699:9:699:13 | * ... | | -| main.rs:699:17:699:35 | MyStruct {...} | main.rs:699:9:699:35 | ... = ... | | -| main.rs:699:33:699:33 | 3 | main.rs:699:17:699:35 | MyStruct {...} | | -| main.rs:703:1:709:1 | enter fn ref_methodcall_receiver | main.rs:704:5:704:36 | let ... = ... | | -| main.rs:703:1:709:1 | exit fn ref_methodcall_receiver (normal) | main.rs:703:1:709:1 | exit fn ref_methodcall_receiver | | -| main.rs:703:30:709:1 | { ... } | main.rs:703:1:709:1 | exit fn ref_methodcall_receiver (normal) | | -| main.rs:704:5:704:36 | let ... = ... | main.rs:704:33:704:33 | 1 | | -| main.rs:704:9:704:13 | mut a | main.rs:705:5:705:12 | ExprStmt | match | -| main.rs:704:13:704:13 | a | main.rs:704:9:704:13 | mut a | | -| main.rs:704:17:704:35 | MyStruct {...} | main.rs:704:13:704:13 | a | | -| main.rs:704:33:704:33 | 1 | main.rs:704:17:704:35 | MyStruct {...} | | -| main.rs:705:5:705:5 | a | main.rs:705:5:705:11 | a.bar() | | -| main.rs:705:5:705:11 | a.bar() | main.rs:708:5:708:21 | ExprStmt | | -| main.rs:705:5:705:12 | ExprStmt | main.rs:705:5:705:5 | a | | +| main.rs:619:5:619:12 | closure2 | main.rs:619:5:619:14 | closure2(...) | | +| main.rs:619:5:619:14 | closure2(...) | main.rs:620:5:620:17 | ExprStmt | | +| main.rs:619:5:619:15 | ExprStmt | main.rs:619:5:619:12 | closure2 | | +| main.rs:620:5:620:13 | print_i64 | main.rs:620:15:620:15 | y | | +| main.rs:620:5:620:16 | print_i64(...) | main.rs:622:5:622:18 | let ... = 2 | | +| main.rs:620:5:620:17 | ExprStmt | main.rs:620:5:620:13 | print_i64 | | +| main.rs:620:15:620:15 | y | main.rs:620:5:620:16 | print_i64(...) | | +| main.rs:622:5:622:18 | let ... = 2 | main.rs:622:17:622:17 | 2 | | +| main.rs:622:9:622:13 | mut z | main.rs:625:5:627:6 | let ... = ... | match | +| main.rs:622:13:622:13 | z | main.rs:622:9:622:13 | mut z | | +| main.rs:622:17:622:17 | 2 | main.rs:622:13:622:13 | z | | +| main.rs:625:5:627:6 | let ... = ... | main.rs:625:24:627:5 | \|...\| ... | | +| main.rs:625:9:625:20 | mut closure3 | main.rs:628:5:628:15 | ExprStmt | match | +| main.rs:625:13:625:20 | closure3 | main.rs:625:9:625:20 | mut closure3 | | +| main.rs:625:24:627:5 | \|...\| ... | main.rs:625:13:625:20 | closure3 | | +| main.rs:625:24:627:5 | enter \|...\| ... | main.rs:626:9:626:24 | ExprStmt | | +| main.rs:625:24:627:5 | exit \|...\| ... (normal) | main.rs:625:24:627:5 | exit \|...\| ... | | +| main.rs:625:27:627:5 | { ... } | main.rs:625:24:627:5 | exit \|...\| ... (normal) | | +| main.rs:626:9:626:9 | z | main.rs:626:22:626:22 | 1 | | +| main.rs:626:9:626:23 | z.add_assign(...) | main.rs:625:27:627:5 | { ... } | | +| main.rs:626:9:626:24 | ExprStmt | main.rs:626:9:626:9 | z | | +| main.rs:626:22:626:22 | 1 | main.rs:626:9:626:23 | z.add_assign(...) | | +| main.rs:628:5:628:12 | closure3 | main.rs:628:5:628:14 | closure3(...) | | +| main.rs:628:5:628:14 | closure3(...) | main.rs:629:5:629:17 | ExprStmt | | +| main.rs:628:5:628:15 | ExprStmt | main.rs:628:5:628:12 | closure3 | | +| main.rs:629:5:629:13 | print_i64 | main.rs:629:15:629:15 | z | | +| main.rs:629:5:629:16 | print_i64(...) | main.rs:603:18:630:1 | { ... } | | +| main.rs:629:5:629:17 | ExprStmt | main.rs:629:5:629:13 | print_i64 | | +| main.rs:629:15:629:15 | z | main.rs:629:5:629:16 | print_i64(...) | | +| main.rs:632:1:640:1 | enter fn async_block_capture | main.rs:633:5:633:23 | let ... = 0 | | +| main.rs:632:1:640:1 | exit fn async_block_capture (normal) | main.rs:632:1:640:1 | exit fn async_block_capture | | +| main.rs:632:32:640:1 | { ... } | main.rs:632:1:640:1 | exit fn async_block_capture (normal) | | +| main.rs:633:5:633:23 | let ... = 0 | main.rs:633:22:633:22 | 0 | | +| main.rs:633:9:633:13 | mut i | main.rs:634:5:636:6 | let ... = ... | match | +| main.rs:633:13:633:13 | i | main.rs:633:9:633:13 | mut i | | +| main.rs:633:22:633:22 | 0 | main.rs:633:13:633:13 | i | | +| main.rs:634:5:636:6 | let ... = ... | main.rs:634:17:636:5 | { ... } | | +| main.rs:634:9:634:13 | block | main.rs:634:9:634:13 | block | | +| main.rs:634:9:634:13 | block | main.rs:638:5:638:16 | ExprStmt | match | +| main.rs:634:17:636:5 | enter { ... } | main.rs:635:9:635:14 | ExprStmt | | +| main.rs:634:17:636:5 | exit { ... } (normal) | main.rs:634:17:636:5 | exit { ... } | | +| main.rs:634:17:636:5 | { ... } | main.rs:634:9:634:13 | block | | +| main.rs:635:9:635:9 | i | main.rs:635:13:635:13 | 1 | | +| main.rs:635:9:635:13 | ... = ... | main.rs:634:17:636:5 | exit { ... } (normal) | | +| main.rs:635:9:635:14 | ExprStmt | main.rs:635:9:635:9 | i | | +| main.rs:635:13:635:13 | 1 | main.rs:635:9:635:13 | ... = ... | | +| main.rs:638:5:638:9 | block | main.rs:638:5:638:15 | await block | | +| main.rs:638:5:638:15 | await block | main.rs:639:5:639:17 | ExprStmt | | +| main.rs:638:5:638:16 | ExprStmt | main.rs:638:5:638:9 | block | | +| main.rs:639:5:639:13 | print_i64 | main.rs:639:15:639:15 | i | | +| main.rs:639:5:639:16 | print_i64(...) | main.rs:632:32:640:1 | { ... } | | +| main.rs:639:5:639:17 | ExprStmt | main.rs:639:5:639:13 | print_i64 | | +| main.rs:639:15:639:15 | i | main.rs:639:5:639:16 | print_i64(...) | | +| main.rs:642:1:658:1 | enter fn phi | main.rs:642:8:642:8 | b | | +| main.rs:642:1:658:1 | exit fn phi (normal) | main.rs:642:1:658:1 | exit fn phi | | +| main.rs:642:8:642:8 | b | main.rs:642:8:642:8 | b | | +| main.rs:642:8:642:8 | b | main.rs:642:8:642:14 | ...: bool | match | +| main.rs:642:8:642:14 | ...: bool | main.rs:643:5:643:18 | let ... = 1 | | +| main.rs:642:17:658:1 | { ... } | main.rs:642:1:658:1 | exit fn phi (normal) | | +| main.rs:643:5:643:18 | let ... = 1 | main.rs:643:17:643:17 | 1 | | +| main.rs:643:9:643:13 | mut x | main.rs:644:5:644:17 | ExprStmt | match | +| main.rs:643:13:643:13 | x | main.rs:643:9:643:13 | mut x | | +| main.rs:643:17:643:17 | 1 | main.rs:643:13:643:13 | x | | +| main.rs:644:5:644:13 | print_i64 | main.rs:644:15:644:15 | x | | +| main.rs:644:5:644:16 | print_i64(...) | main.rs:645:5:645:21 | ExprStmt | | +| main.rs:644:5:644:17 | ExprStmt | main.rs:644:5:644:13 | print_i64 | | +| main.rs:644:15:644:15 | x | main.rs:644:5:644:16 | print_i64(...) | | +| main.rs:645:5:645:13 | print_i64 | main.rs:645:15:645:15 | x | | +| main.rs:645:5:645:20 | print_i64(...) | main.rs:646:5:656:6 | let _ = ... | | +| main.rs:645:5:645:21 | ExprStmt | main.rs:645:5:645:13 | print_i64 | | +| main.rs:645:15:645:15 | x | main.rs:645:19:645:19 | 1 | | +| main.rs:645:15:645:19 | ... + ... | main.rs:645:5:645:20 | print_i64(...) | | +| main.rs:645:19:645:19 | 1 | main.rs:645:15:645:19 | ... + ... | | +| main.rs:646:5:656:6 | let _ = ... | main.rs:647:16:647:16 | b | | +| main.rs:647:9:647:9 | _ | main.rs:657:5:657:17 | ExprStmt | match | +| main.rs:647:13:656:5 | if b {...} else {...} | main.rs:647:9:647:9 | _ | | +| main.rs:647:16:647:16 | b | main.rs:649:9:649:14 | ExprStmt | true | +| main.rs:647:16:647:16 | b | main.rs:653:9:653:14 | ExprStmt | false | +| main.rs:648:5:652:5 | { ... } | main.rs:647:13:656:5 | if b {...} else {...} | | +| main.rs:649:9:649:9 | x | main.rs:649:13:649:13 | 2 | | +| main.rs:649:9:649:13 | ... = ... | main.rs:650:9:650:21 | ExprStmt | | +| main.rs:649:9:649:14 | ExprStmt | main.rs:649:9:649:9 | x | | +| main.rs:649:13:649:13 | 2 | main.rs:649:9:649:13 | ... = ... | | +| main.rs:650:9:650:17 | print_i64 | main.rs:650:19:650:19 | x | | +| main.rs:650:9:650:20 | print_i64(...) | main.rs:651:9:651:25 | ExprStmt | | +| main.rs:650:9:650:21 | ExprStmt | main.rs:650:9:650:17 | print_i64 | | +| main.rs:650:19:650:19 | x | main.rs:650:9:650:20 | print_i64(...) | | +| main.rs:651:9:651:17 | print_i64 | main.rs:651:19:651:19 | x | | +| main.rs:651:9:651:24 | print_i64(...) | main.rs:648:5:652:5 | { ... } | | +| main.rs:651:9:651:25 | ExprStmt | main.rs:651:9:651:17 | print_i64 | | +| main.rs:651:19:651:19 | x | main.rs:651:23:651:23 | 1 | | +| main.rs:651:19:651:23 | ... + ... | main.rs:651:9:651:24 | print_i64(...) | | +| main.rs:651:23:651:23 | 1 | main.rs:651:19:651:23 | ... + ... | | +| main.rs:652:12:656:5 | { ... } | main.rs:647:13:656:5 | if b {...} else {...} | | +| main.rs:653:9:653:9 | x | main.rs:653:13:653:13 | 3 | | +| main.rs:653:9:653:13 | ... = ... | main.rs:654:9:654:21 | ExprStmt | | +| main.rs:653:9:653:14 | ExprStmt | main.rs:653:9:653:9 | x | | +| main.rs:653:13:653:13 | 3 | main.rs:653:9:653:13 | ... = ... | | +| main.rs:654:9:654:17 | print_i64 | main.rs:654:19:654:19 | x | | +| main.rs:654:9:654:20 | print_i64(...) | main.rs:655:9:655:25 | ExprStmt | | +| main.rs:654:9:654:21 | ExprStmt | main.rs:654:9:654:17 | print_i64 | | +| main.rs:654:19:654:19 | x | main.rs:654:9:654:20 | print_i64(...) | | +| main.rs:655:9:655:17 | print_i64 | main.rs:655:19:655:19 | x | | +| main.rs:655:9:655:24 | print_i64(...) | main.rs:652:12:656:5 | { ... } | | +| main.rs:655:9:655:25 | ExprStmt | main.rs:655:9:655:17 | print_i64 | | +| main.rs:655:19:655:19 | x | main.rs:655:23:655:23 | 1 | | +| main.rs:655:19:655:23 | ... + ... | main.rs:655:9:655:24 | print_i64(...) | | +| main.rs:655:23:655:23 | 1 | main.rs:655:19:655:23 | ... + ... | | +| main.rs:657:5:657:13 | print_i64 | main.rs:657:15:657:15 | x | | +| main.rs:657:5:657:16 | print_i64(...) | main.rs:642:17:658:1 | { ... } | | +| main.rs:657:5:657:17 | ExprStmt | main.rs:657:5:657:13 | print_i64 | | +| main.rs:657:15:657:15 | x | main.rs:657:5:657:16 | print_i64(...) | | +| main.rs:660:1:677:1 | enter fn phi_read | main.rs:660:13:660:14 | b1 | | +| main.rs:660:1:677:1 | exit fn phi_read (normal) | main.rs:660:1:677:1 | exit fn phi_read | | +| main.rs:660:13:660:14 | b1 | main.rs:660:13:660:14 | b1 | | +| main.rs:660:13:660:14 | b1 | main.rs:660:13:660:20 | ...: bool | match | +| main.rs:660:13:660:20 | ...: bool | main.rs:660:23:660:24 | b2 | | +| main.rs:660:23:660:24 | b2 | main.rs:660:23:660:24 | b2 | | +| main.rs:660:23:660:24 | b2 | main.rs:660:23:660:30 | ...: bool | match | +| main.rs:660:23:660:30 | ...: bool | main.rs:661:5:661:14 | let ... = 1 | | +| main.rs:660:33:677:1 | { ... } | main.rs:660:1:677:1 | exit fn phi_read (normal) | | +| main.rs:661:5:661:14 | let ... = 1 | main.rs:661:13:661:13 | 1 | | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | | +| main.rs:661:9:661:9 | x | main.rs:662:5:668:6 | let _ = ... | match | +| main.rs:661:13:661:13 | 1 | main.rs:661:9:661:9 | x | | +| main.rs:662:5:668:6 | let _ = ... | main.rs:663:16:663:17 | b1 | | +| main.rs:663:9:663:9 | _ | main.rs:670:5:676:6 | let _ = ... | match | +| main.rs:663:13:668:5 | if b1 {...} else {...} | main.rs:663:9:663:9 | _ | | +| main.rs:663:16:663:17 | b1 | main.rs:665:9:665:21 | ExprStmt | true | +| main.rs:663:16:663:17 | b1 | main.rs:667:9:667:21 | ExprStmt | false | +| main.rs:664:5:666:5 | { ... } | main.rs:663:13:668:5 | if b1 {...} else {...} | | +| main.rs:665:9:665:17 | print_i64 | main.rs:665:19:665:19 | x | | +| main.rs:665:9:665:20 | print_i64(...) | main.rs:664:5:666:5 | { ... } | | +| main.rs:665:9:665:21 | ExprStmt | main.rs:665:9:665:17 | print_i64 | | +| main.rs:665:19:665:19 | x | main.rs:665:9:665:20 | print_i64(...) | | +| main.rs:666:12:668:5 | { ... } | main.rs:663:13:668:5 | if b1 {...} else {...} | | +| main.rs:667:9:667:17 | print_i64 | main.rs:667:19:667:19 | x | | +| main.rs:667:9:667:20 | print_i64(...) | main.rs:666:12:668:5 | { ... } | | +| main.rs:667:9:667:21 | ExprStmt | main.rs:667:9:667:17 | print_i64 | | +| main.rs:667:19:667:19 | x | main.rs:667:9:667:20 | print_i64(...) | | +| main.rs:670:5:676:6 | let _ = ... | main.rs:671:16:671:17 | b2 | | +| main.rs:671:9:671:9 | _ | main.rs:660:33:677:1 | { ... } | match | +| main.rs:671:13:676:5 | if b2 {...} else {...} | main.rs:671:9:671:9 | _ | | +| main.rs:671:16:671:17 | b2 | main.rs:673:9:673:21 | ExprStmt | true | +| main.rs:671:16:671:17 | b2 | main.rs:675:9:675:21 | ExprStmt | false | +| main.rs:672:5:674:5 | { ... } | main.rs:671:13:676:5 | if b2 {...} else {...} | | +| main.rs:673:9:673:17 | print_i64 | main.rs:673:19:673:19 | x | | +| main.rs:673:9:673:20 | print_i64(...) | main.rs:672:5:674:5 | { ... } | | +| main.rs:673:9:673:21 | ExprStmt | main.rs:673:9:673:17 | print_i64 | | +| main.rs:673:19:673:19 | x | main.rs:673:9:673:20 | print_i64(...) | | +| main.rs:674:12:676:5 | { ... } | main.rs:671:13:676:5 | if b2 {...} else {...} | | +| main.rs:675:9:675:17 | print_i64 | main.rs:675:19:675:19 | x | | +| main.rs:675:9:675:20 | print_i64(...) | main.rs:674:12:676:5 | { ... } | | +| main.rs:675:9:675:21 | ExprStmt | main.rs:675:9:675:17 | print_i64 | | +| main.rs:675:19:675:19 | x | main.rs:675:9:675:20 | print_i64(...) | | +| main.rs:684:5:686:5 | enter fn my_get | main.rs:684:20:684:23 | self | | +| main.rs:684:5:686:5 | exit fn my_get (normal) | main.rs:684:5:686:5 | exit fn my_get | | +| main.rs:684:15:684:23 | SelfParam | main.rs:685:9:685:24 | ExprStmt | | +| main.rs:684:20:684:23 | self | main.rs:684:15:684:23 | SelfParam | | +| main.rs:685:9:685:23 | return ... | main.rs:684:5:686:5 | exit fn my_get (normal) | return | +| main.rs:685:9:685:24 | ExprStmt | main.rs:685:16:685:19 | self | | +| main.rs:685:16:685:19 | self | main.rs:685:16:685:23 | self.val | | +| main.rs:685:16:685:23 | self.val | main.rs:685:9:685:23 | return ... | | +| main.rs:688:5:690:5 | enter fn id | main.rs:688:11:688:14 | self | | +| main.rs:688:5:690:5 | exit fn id (normal) | main.rs:688:5:690:5 | exit fn id | | +| main.rs:688:11:688:14 | SelfParam | main.rs:689:9:689:12 | self | | +| main.rs:688:11:688:14 | self | main.rs:688:11:688:14 | SelfParam | | +| main.rs:688:25:690:5 | { ... } | main.rs:688:5:690:5 | exit fn id (normal) | | +| main.rs:689:9:689:12 | self | main.rs:688:25:690:5 | { ... } | | +| main.rs:692:5:699:5 | enter fn my_method | main.rs:692:23:692:26 | self | | +| main.rs:692:5:699:5 | exit fn my_method (normal) | main.rs:692:5:699:5 | exit fn my_method | | +| main.rs:692:18:692:26 | SelfParam | main.rs:693:9:696:10 | let ... = ... | | +| main.rs:692:23:692:26 | self | main.rs:692:18:692:26 | SelfParam | | +| main.rs:692:29:699:5 | { ... } | main.rs:692:5:699:5 | exit fn my_method (normal) | | +| main.rs:693:9:696:10 | let ... = ... | main.rs:693:21:696:9 | \|...\| ... | | +| main.rs:693:13:693:17 | mut f | main.rs:697:9:697:13 | ExprStmt | match | +| main.rs:693:17:693:17 | f | main.rs:693:13:693:17 | mut f | | +| main.rs:693:21:696:9 | \|...\| ... | main.rs:693:17:693:17 | f | | +| main.rs:693:21:696:9 | enter \|...\| ... | main.rs:693:22:693:22 | n | | +| main.rs:693:21:696:9 | exit \|...\| ... (normal) | main.rs:693:21:696:9 | exit \|...\| ... | | +| main.rs:693:22:693:22 | ... | main.rs:695:13:695:26 | ExprStmt | | +| main.rs:693:22:693:22 | n | main.rs:693:22:693:22 | ... | match | +| main.rs:693:22:693:22 | n | main.rs:693:22:693:22 | n | | +| main.rs:693:25:696:9 | { ... } | main.rs:693:21:696:9 | exit \|...\| ... (normal) | | +| main.rs:695:13:695:16 | self | main.rs:695:13:695:20 | self.val | | +| main.rs:695:13:695:20 | self.val | main.rs:695:25:695:25 | n | | +| main.rs:695:13:695:25 | ... += ... | main.rs:693:25:696:9 | { ... } | | +| main.rs:695:13:695:26 | ExprStmt | main.rs:695:13:695:16 | self | | +| main.rs:695:25:695:25 | n | main.rs:695:13:695:25 | ... += ... | | +| main.rs:697:9:697:9 | f | main.rs:697:11:697:11 | 3 | | +| main.rs:697:9:697:12 | f(...) | main.rs:698:9:698:13 | ExprStmt | | +| main.rs:697:9:697:13 | ExprStmt | main.rs:697:9:697:9 | f | | +| main.rs:697:11:697:11 | 3 | main.rs:697:9:697:12 | f(...) | | +| main.rs:698:9:698:9 | f | main.rs:698:11:698:11 | 4 | | +| main.rs:698:9:698:12 | f(...) | main.rs:692:29:699:5 | { ... } | | +| main.rs:698:9:698:13 | ExprStmt | main.rs:698:9:698:9 | f | | +| main.rs:698:11:698:11 | 4 | main.rs:698:9:698:12 | f(...) | | +| main.rs:702:1:709:1 | enter fn structs | main.rs:703:5:703:36 | let ... = ... | | +| main.rs:702:1:709:1 | exit fn structs (normal) | main.rs:702:1:709:1 | exit fn structs | | +| main.rs:702:14:709:1 | { ... } | main.rs:702:1:709:1 | exit fn structs (normal) | | +| main.rs:703:5:703:36 | let ... = ... | main.rs:703:33:703:33 | 1 | | +| main.rs:703:9:703:13 | mut a | main.rs:704:5:704:26 | ExprStmt | match | +| main.rs:703:13:703:13 | a | main.rs:703:9:703:13 | mut a | | +| main.rs:703:17:703:35 | MyStruct {...} | main.rs:703:13:703:13 | a | | +| main.rs:703:33:703:33 | 1 | main.rs:703:17:703:35 | MyStruct {...} | | +| main.rs:704:5:704:13 | print_i64 | main.rs:704:15:704:15 | a | | +| main.rs:704:5:704:25 | print_i64(...) | main.rs:705:5:705:14 | ExprStmt | | +| main.rs:704:5:704:26 | ExprStmt | main.rs:704:5:704:13 | print_i64 | | +| main.rs:704:15:704:15 | a | main.rs:704:15:704:24 | a.my_get() | | +| main.rs:704:15:704:24 | a.my_get() | main.rs:704:5:704:25 | print_i64(...) | | +| main.rs:705:5:705:5 | a | main.rs:705:5:705:9 | a.val | | +| main.rs:705:5:705:9 | a.val | main.rs:705:13:705:13 | 5 | | +| main.rs:705:5:705:13 | ... = ... | main.rs:706:5:706:26 | ExprStmt | | +| main.rs:705:5:705:14 | ExprStmt | main.rs:705:5:705:5 | a | | +| main.rs:705:13:705:13 | 5 | main.rs:705:5:705:13 | ... = ... | | +| main.rs:706:5:706:13 | print_i64 | main.rs:706:15:706:15 | a | | +| main.rs:706:5:706:25 | print_i64(...) | main.rs:707:5:707:28 | ExprStmt | | +| main.rs:706:5:706:26 | ExprStmt | main.rs:706:5:706:13 | print_i64 | | +| main.rs:706:15:706:15 | a | main.rs:706:15:706:24 | a.my_get() | | +| main.rs:706:15:706:24 | a.my_get() | main.rs:706:5:706:25 | print_i64(...) | | +| main.rs:707:5:707:5 | a | main.rs:707:25:707:25 | 2 | | +| main.rs:707:5:707:27 | ... = ... | main.rs:708:5:708:26 | ExprStmt | | +| main.rs:707:5:707:28 | ExprStmt | main.rs:707:5:707:5 | a | | +| main.rs:707:9:707:27 | MyStruct {...} | main.rs:707:5:707:27 | ... = ... | | +| main.rs:707:25:707:25 | 2 | main.rs:707:9:707:27 | MyStruct {...} | | | main.rs:708:5:708:13 | print_i64 | main.rs:708:15:708:15 | a | | -| main.rs:708:5:708:20 | print_i64(...) | main.rs:703:30:709:1 | { ... } | | -| main.rs:708:5:708:21 | ExprStmt | main.rs:708:5:708:13 | print_i64 | | -| main.rs:708:15:708:15 | a | main.rs:708:15:708:19 | a.val | | -| main.rs:708:15:708:19 | a.val | main.rs:708:5:708:20 | print_i64(...) | | -| main.rs:725:1:736:1 | enter fn macro_invocation | main.rs:726:5:727:26 | let ... = ... | | -| main.rs:725:1:736:1 | exit fn macro_invocation (normal) | main.rs:725:1:736:1 | exit fn macro_invocation | | -| main.rs:725:23:736:1 | { ... } | main.rs:725:1:736:1 | exit fn macro_invocation (normal) | | -| main.rs:726:5:727:26 | let ... = ... | main.rs:727:23:727:24 | let ... = 37 | | -| main.rs:726:9:726:22 | var_from_macro | main.rs:726:9:726:22 | var_from_macro | | -| main.rs:726:9:726:22 | var_from_macro | main.rs:728:5:728:30 | ExprStmt | match | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | match | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:23:727:24 | { ... } | | -| main.rs:727:9:727:25 | MacroExpr | main.rs:726:9:726:22 | var_from_macro | | -| main.rs:727:9:727:25 | let_in_macro!... | main.rs:727:9:727:25 | MacroExpr | | -| main.rs:727:23:727:24 | 37 | main.rs:727:9:727:21 | var_in_macro | | -| main.rs:727:23:727:24 | let ... = 37 | main.rs:727:23:727:24 | 37 | | -| main.rs:727:23:727:24 | { ... } | main.rs:727:9:727:25 | let_in_macro!... | | -| main.rs:728:5:728:13 | print_i64 | main.rs:728:15:728:28 | var_from_macro | | -| main.rs:728:5:728:29 | print_i64(...) | main.rs:729:5:729:26 | let ... = 33 | | -| main.rs:728:5:728:30 | ExprStmt | main.rs:728:5:728:13 | print_i64 | | -| main.rs:728:15:728:28 | var_from_macro | main.rs:728:5:728:29 | print_i64(...) | | -| main.rs:729:5:729:26 | let ... = 33 | main.rs:729:24:729:25 | 33 | | -| main.rs:729:9:729:20 | var_in_macro | main.rs:729:9:729:20 | var_in_macro | | -| main.rs:729:9:729:20 | var_in_macro | main.rs:734:5:734:44 | ExprStmt | match | -| main.rs:729:24:729:25 | 33 | main.rs:729:9:729:20 | var_in_macro | | -| main.rs:734:5:734:13 | print_i64 | main.rs:734:15:734:28 | let ... = 0 | | -| main.rs:734:5:734:43 | print_i64(...) | main.rs:735:5:735:28 | ExprStmt | | -| main.rs:734:5:734:44 | ExprStmt | main.rs:734:5:734:13 | print_i64 | | -| main.rs:734:15:734:28 | 0 | main.rs:734:15:734:28 | var_in_macro | | -| main.rs:734:15:734:28 | let ... = 0 | main.rs:734:15:734:28 | 0 | | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | var_in_macro | | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:30:734:41 | var_in_macro | match | -| main.rs:734:15:734:42 | MacroExpr | main.rs:734:5:734:43 | print_i64(...) | | -| main.rs:734:15:734:42 | let_in_macro2!... | main.rs:734:15:734:42 | MacroExpr | | -| main.rs:734:30:734:41 | var_in_macro | main.rs:734:30:734:41 | { ... } | | -| main.rs:734:30:734:41 | { ... } | main.rs:734:15:734:42 | let_in_macro2!... | | -| main.rs:735:5:735:13 | print_i64 | main.rs:735:15:735:26 | var_in_macro | | -| main.rs:735:5:735:27 | print_i64(...) | main.rs:725:23:736:1 | { ... } | | -| main.rs:735:5:735:28 | ExprStmt | main.rs:735:5:735:13 | print_i64 | | -| main.rs:735:15:735:26 | var_in_macro | main.rs:735:5:735:27 | print_i64(...) | | -| main.rs:738:1:742:1 | enter fn let_without_initializer | main.rs:739:5:739:10 | let ... | | -| main.rs:738:1:742:1 | exit fn let_without_initializer (normal) | main.rs:738:1:742:1 | exit fn let_without_initializer | | -| main.rs:738:30:742:1 | { ... } | main.rs:738:1:742:1 | exit fn let_without_initializer (normal) | | -| main.rs:739:5:739:10 | let ... | main.rs:739:9:739:9 | x | | -| main.rs:739:9:739:9 | x | main.rs:739:9:739:9 | x | | -| main.rs:739:9:739:9 | x | main.rs:740:5:740:10 | ExprStmt | match | -| main.rs:740:5:740:5 | x | main.rs:740:9:740:9 | 1 | | -| main.rs:740:5:740:9 | ... = ... | main.rs:741:5:741:17 | ExprStmt | | -| main.rs:740:5:740:10 | ExprStmt | main.rs:740:5:740:5 | x | | -| main.rs:740:9:740:9 | 1 | main.rs:740:5:740:9 | ... = ... | | -| main.rs:741:5:741:13 | print_i64 | main.rs:741:15:741:15 | x | | -| main.rs:741:5:741:16 | print_i64(...) | main.rs:738:30:742:1 | { ... } | | -| main.rs:741:5:741:17 | ExprStmt | main.rs:741:5:741:13 | print_i64 | | -| main.rs:741:15:741:15 | x | main.rs:741:5:741:16 | print_i64(...) | | -| main.rs:744:1:754:1 | enter fn capture_phi | main.rs:745:5:745:20 | let ... = 100 | | -| main.rs:744:1:754:1 | exit fn capture_phi (normal) | main.rs:744:1:754:1 | exit fn capture_phi | | -| main.rs:744:18:754:1 | { ... } | main.rs:744:1:754:1 | exit fn capture_phi (normal) | | -| main.rs:745:5:745:20 | let ... = 100 | main.rs:745:17:745:19 | 100 | | -| main.rs:745:9:745:13 | mut x | main.rs:746:5:751:6 | let ... = ... | match | -| main.rs:745:13:745:13 | x | main.rs:745:9:745:13 | mut x | | -| main.rs:745:17:745:19 | 100 | main.rs:745:13:745:13 | x | | -| main.rs:746:5:751:6 | let ... = ... | main.rs:746:19:751:5 | \|...\| ... | | -| main.rs:746:9:746:15 | mut cap | main.rs:752:5:752:14 | ExprStmt | match | -| main.rs:746:13:746:15 | cap | main.rs:746:9:746:15 | mut cap | | -| main.rs:746:19:751:5 | \|...\| ... | main.rs:746:13:746:15 | cap | | -| main.rs:746:19:751:5 | enter \|...\| ... | main.rs:746:20:746:20 | b | | -| main.rs:746:19:751:5 | exit \|...\| ... (normal) | main.rs:746:19:751:5 | exit \|...\| ... | | -| main.rs:746:20:746:20 | b | main.rs:746:20:746:20 | b | | -| main.rs:746:20:746:20 | b | main.rs:746:20:746:26 | ...: bool | match | -| main.rs:746:20:746:26 | ...: bool | main.rs:747:9:750:10 | let _ = ... | | -| main.rs:746:29:751:5 | { ... } | main.rs:746:19:751:5 | exit \|...\| ... (normal) | | -| main.rs:747:9:750:10 | let _ = ... | main.rs:748:20:748:20 | b | | -| main.rs:748:13:748:13 | _ | main.rs:746:29:751:5 | { ... } | match | -| main.rs:748:17:750:9 | if b {...} | main.rs:748:13:748:13 | _ | | -| main.rs:748:20:748:20 | b | main.rs:748:17:750:9 | if b {...} | false | -| main.rs:748:20:748:20 | b | main.rs:749:13:749:20 | ExprStmt | true | -| main.rs:748:22:750:9 | { ... } | main.rs:748:17:750:9 | if b {...} | | -| main.rs:749:13:749:13 | x | main.rs:749:17:749:19 | 200 | | -| main.rs:749:13:749:19 | ... = ... | main.rs:748:22:750:9 | { ... } | | -| main.rs:749:13:749:20 | ExprStmt | main.rs:749:13:749:13 | x | | -| main.rs:749:17:749:19 | 200 | main.rs:749:13:749:19 | ... = ... | | -| main.rs:752:5:752:7 | cap | main.rs:752:9:752:12 | true | | -| main.rs:752:5:752:13 | cap(...) | main.rs:753:5:753:17 | ExprStmt | | -| main.rs:752:5:752:14 | ExprStmt | main.rs:752:5:752:7 | cap | | -| main.rs:752:9:752:12 | true | main.rs:752:5:752:13 | cap(...) | | -| main.rs:753:5:753:13 | print_i64 | main.rs:753:15:753:15 | x | | -| main.rs:753:5:753:16 | print_i64(...) | main.rs:744:18:754:1 | { ... } | | -| main.rs:753:5:753:17 | ExprStmt | main.rs:753:5:753:13 | print_i64 | | -| main.rs:753:15:753:15 | x | main.rs:753:5:753:16 | print_i64(...) | | -| main.rs:757:5:772:5 | enter fn test | main.rs:759:9:759:25 | let ... = ... | | -| main.rs:757:5:772:5 | exit fn test (normal) | main.rs:757:5:772:5 | exit fn test | | -| main.rs:758:34:772:5 | { ... } | main.rs:757:5:772:5 | exit fn test (normal) | | -| main.rs:759:9:759:25 | let ... = ... | main.rs:759:17:759:20 | Some | | -| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | | -| main.rs:759:13:759:13 | x | main.rs:760:9:767:10 | let ... = ... | match | -| main.rs:759:17:759:20 | Some | main.rs:759:22:759:23 | 42 | | -| main.rs:759:17:759:24 | Some(...) | main.rs:759:13:759:13 | x | | -| main.rs:759:22:759:23 | 42 | main.rs:759:17:759:24 | Some(...) | | -| main.rs:760:9:767:10 | let ... = ... | main.rs:761:19:761:19 | x | | -| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | | -| main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y | match | -| main.rs:761:13:767:9 | match x { ... } | main.rs:760:13:760:13 | y | | -| main.rs:761:19:761:19 | x | main.rs:762:13:762:19 | Some(...) | | -| main.rs:762:13:762:19 | Some(...) | main.rs:762:18:762:18 | y | match | -| main.rs:762:13:762:19 | Some(...) | main.rs:765:13:765:16 | None | no-match | -| main.rs:762:18:762:18 | y | main.rs:762:18:762:18 | y | | -| main.rs:762:18:762:18 | y | main.rs:763:17:763:20 | None | match | -| main.rs:762:24:764:13 | { ... } | main.rs:761:13:767:9 | match x { ... } | | -| main.rs:763:17:763:20 | None | main.rs:762:24:764:13 | { ... } | | -| main.rs:765:13:765:16 | None | main.rs:765:13:765:16 | None | | -| main.rs:765:13:765:16 | None | main.rs:766:17:766:20 | None | match | -| main.rs:766:17:766:20 | None | main.rs:761:13:767:9 | match x { ... } | | -| main.rs:768:9:771:9 | match y { ... } | main.rs:758:34:772:5 | { ... } | | -| main.rs:768:15:768:15 | y | main.rs:769:13:769:16 | N0ne | | -| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | | -| main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne | match | -| main.rs:770:17:770:20 | N0ne | main.rs:768:9:771:9 | match y { ... } | | -| main.rs:774:5:781:5 | enter fn test2 | main.rs:776:9:777:17 | let ... = test | | -| main.rs:774:5:781:5 | exit fn test2 (normal) | main.rs:774:5:781:5 | exit fn test2 | | -| main.rs:775:31:781:5 | { ... } | main.rs:774:5:781:5 | exit fn test2 (normal) | | -| main.rs:776:9:777:17 | let ... = test | main.rs:777:13:777:16 | test | | -| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | | -| main.rs:776:13:776:22 | test_alias | main.rs:778:9:779:25 | let ... = ... | match | -| main.rs:777:13:777:16 | test | main.rs:776:13:776:22 | test_alias | | -| main.rs:778:9:779:25 | let ... = ... | main.rs:779:13:779:22 | test_alias | | -| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | | -| main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test | match | -| main.rs:779:13:779:22 | test_alias | main.rs:779:13:779:24 | test_alias(...) | | -| main.rs:779:13:779:24 | test_alias(...) | main.rs:778:13:778:16 | test | | -| main.rs:780:9:780:12 | test | main.rs:775:31:781:5 | { ... } | | -| main.rs:785:5:798:5 | enter fn test3 | main.rs:787:9:787:24 | let ... = ... | | -| main.rs:785:5:798:5 | exit fn test3 (normal) | main.rs:785:5:798:5 | exit fn test3 | | -| main.rs:786:16:798:5 | { ... } | main.rs:785:5:798:5 | exit fn test3 (normal) | | -| main.rs:787:9:787:24 | let ... = ... | main.rs:787:17:787:20 | Some | | -| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | | -| main.rs:787:13:787:13 | x | main.rs:788:9:792:10 | ExprStmt | match | -| main.rs:787:17:787:20 | Some | main.rs:787:22:787:22 | 0 | | -| main.rs:787:17:787:23 | Some(...) | main.rs:787:13:787:13 | x | | -| main.rs:787:22:787:22 | 0 | main.rs:787:17:787:23 | Some(...) | | -| main.rs:788:9:792:9 | match x { ... } | main.rs:793:9:797:10 | ExprStmt | | -| main.rs:788:9:792:10 | ExprStmt | main.rs:788:15:788:15 | x | | -| main.rs:788:15:788:15 | x | main.rs:789:13:789:19 | Some(...) | | -| main.rs:789:13:789:19 | Some(...) | main.rs:789:18:789:18 | x | match | -| main.rs:789:13:789:19 | Some(...) | main.rs:791:13:791:13 | _ | no-match | -| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | | -| main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x | match | -| main.rs:790:20:790:20 | x | main.rs:788:9:792:9 | match x { ... } | | -| main.rs:791:13:791:13 | _ | main.rs:791:18:791:18 | 0 | match | -| main.rs:791:18:791:18 | 0 | main.rs:788:9:792:9 | match x { ... } | | -| main.rs:793:9:797:9 | match x { ... } | main.rs:786:16:798:5 | { ... } | | -| main.rs:793:9:797:10 | ExprStmt | main.rs:793:15:793:15 | x | | -| main.rs:793:15:793:15 | x | main.rs:794:13:794:19 | Some(...) | | -| main.rs:794:13:794:19 | Some(...) | main.rs:794:18:794:18 | z | match | -| main.rs:794:13:794:19 | Some(...) | main.rs:796:13:796:13 | _ | no-match | -| main.rs:794:18:794:18 | z | main.rs:794:18:794:18 | z | | -| main.rs:794:18:794:18 | z | main.rs:795:17:795:17 | z | match | -| main.rs:794:18:794:18 | z | main.rs:796:13:796:13 | _ | no-match | -| main.rs:795:17:795:17 | z | main.rs:793:9:797:9 | match x { ... } | | -| main.rs:796:13:796:13 | _ | main.rs:796:18:796:18 | 0 | match | -| main.rs:796:18:796:18 | 0 | main.rs:793:9:797:9 | match x { ... } | | -| main.rs:801:1:845:1 | enter fn main | main.rs:802:5:802:25 | ExprStmt | | -| main.rs:801:1:845:1 | exit fn main (normal) | main.rs:801:1:845:1 | exit fn main | | -| main.rs:801:11:845:1 | { ... } | main.rs:801:1:845:1 | exit fn main (normal) | | -| main.rs:802:5:802:22 | immutable_variable | main.rs:802:5:802:24 | immutable_variable(...) | | -| main.rs:802:5:802:24 | immutable_variable(...) | main.rs:803:5:803:23 | ExprStmt | | -| main.rs:802:5:802:25 | ExprStmt | main.rs:802:5:802:22 | immutable_variable | | -| main.rs:803:5:803:20 | mutable_variable | main.rs:803:5:803:22 | mutable_variable(...) | | -| main.rs:803:5:803:22 | mutable_variable(...) | main.rs:804:5:804:40 | ExprStmt | | -| main.rs:803:5:803:23 | ExprStmt | main.rs:803:5:803:20 | mutable_variable | | -| main.rs:804:5:804:37 | mutable_variable_immutable_borrow | main.rs:804:5:804:39 | mutable_variable_immutable_borrow(...) | | -| main.rs:804:5:804:39 | mutable_variable_immutable_borrow(...) | main.rs:805:5:805:23 | ExprStmt | | -| main.rs:804:5:804:40 | ExprStmt | main.rs:804:5:804:37 | mutable_variable_immutable_borrow | | -| main.rs:805:5:805:20 | variable_shadow1 | main.rs:805:5:805:22 | variable_shadow1(...) | | -| main.rs:805:5:805:22 | variable_shadow1(...) | main.rs:806:5:806:23 | ExprStmt | | -| main.rs:805:5:805:23 | ExprStmt | main.rs:805:5:805:20 | variable_shadow1 | | -| main.rs:806:5:806:20 | variable_shadow2 | main.rs:806:5:806:22 | variable_shadow2(...) | | -| main.rs:806:5:806:22 | variable_shadow2(...) | main.rs:807:5:807:19 | ExprStmt | | -| main.rs:806:5:806:23 | ExprStmt | main.rs:806:5:806:20 | variable_shadow2 | | -| main.rs:807:5:807:16 | let_pattern1 | main.rs:807:5:807:18 | let_pattern1(...) | | -| main.rs:807:5:807:18 | let_pattern1(...) | main.rs:808:5:808:19 | ExprStmt | | -| main.rs:807:5:807:19 | ExprStmt | main.rs:807:5:807:16 | let_pattern1 | | -| main.rs:808:5:808:16 | let_pattern2 | main.rs:808:5:808:18 | let_pattern2(...) | | -| main.rs:808:5:808:18 | let_pattern2(...) | main.rs:809:5:809:19 | ExprStmt | | -| main.rs:808:5:808:19 | ExprStmt | main.rs:808:5:808:16 | let_pattern2 | | -| main.rs:809:5:809:16 | let_pattern3 | main.rs:809:5:809:18 | let_pattern3(...) | | -| main.rs:809:5:809:18 | let_pattern3(...) | main.rs:810:5:810:19 | ExprStmt | | -| main.rs:809:5:809:19 | ExprStmt | main.rs:809:5:809:16 | let_pattern3 | | -| main.rs:810:5:810:16 | let_pattern4 | main.rs:810:5:810:18 | let_pattern4(...) | | -| main.rs:810:5:810:18 | let_pattern4(...) | main.rs:811:5:811:21 | ExprStmt | | -| main.rs:810:5:810:19 | ExprStmt | main.rs:810:5:810:16 | let_pattern4 | | -| main.rs:811:5:811:18 | match_pattern1 | main.rs:811:5:811:20 | match_pattern1(...) | | -| main.rs:811:5:811:20 | match_pattern1(...) | main.rs:812:5:812:21 | ExprStmt | | -| main.rs:811:5:811:21 | ExprStmt | main.rs:811:5:811:18 | match_pattern1 | | -| main.rs:812:5:812:18 | match_pattern2 | main.rs:812:5:812:20 | match_pattern2(...) | | -| main.rs:812:5:812:20 | match_pattern2(...) | main.rs:813:5:813:21 | ExprStmt | | -| main.rs:812:5:812:21 | ExprStmt | main.rs:812:5:812:18 | match_pattern2 | | -| main.rs:813:5:813:18 | match_pattern3 | main.rs:813:5:813:20 | match_pattern3(...) | | -| main.rs:813:5:813:20 | match_pattern3(...) | main.rs:814:5:814:21 | ExprStmt | | -| main.rs:813:5:813:21 | ExprStmt | main.rs:813:5:813:18 | match_pattern3 | | -| main.rs:814:5:814:18 | match_pattern4 | main.rs:814:5:814:20 | match_pattern4(...) | | -| main.rs:814:5:814:20 | match_pattern4(...) | main.rs:815:5:815:21 | ExprStmt | | -| main.rs:814:5:814:21 | ExprStmt | main.rs:814:5:814:18 | match_pattern4 | | -| main.rs:815:5:815:18 | match_pattern5 | main.rs:815:5:815:20 | match_pattern5(...) | | -| main.rs:815:5:815:20 | match_pattern5(...) | main.rs:816:5:816:21 | ExprStmt | | -| main.rs:815:5:815:21 | ExprStmt | main.rs:815:5:815:18 | match_pattern5 | | -| main.rs:816:5:816:18 | match_pattern6 | main.rs:816:5:816:20 | match_pattern6(...) | | -| main.rs:816:5:816:20 | match_pattern6(...) | main.rs:817:5:817:21 | ExprStmt | | -| main.rs:816:5:816:21 | ExprStmt | main.rs:816:5:816:18 | match_pattern6 | | -| main.rs:817:5:817:18 | match_pattern7 | main.rs:817:5:817:20 | match_pattern7(...) | | -| main.rs:817:5:817:20 | match_pattern7(...) | main.rs:818:5:818:21 | ExprStmt | | -| main.rs:817:5:817:21 | ExprStmt | main.rs:817:5:817:18 | match_pattern7 | | -| main.rs:818:5:818:18 | match_pattern8 | main.rs:818:5:818:20 | match_pattern8(...) | | -| main.rs:818:5:818:20 | match_pattern8(...) | main.rs:819:5:819:21 | ExprStmt | | -| main.rs:818:5:818:21 | ExprStmt | main.rs:818:5:818:18 | match_pattern8 | | -| main.rs:819:5:819:18 | match_pattern9 | main.rs:819:5:819:20 | match_pattern9(...) | | -| main.rs:819:5:819:20 | match_pattern9(...) | main.rs:820:5:820:22 | ExprStmt | | -| main.rs:819:5:819:21 | ExprStmt | main.rs:819:5:819:18 | match_pattern9 | | -| main.rs:820:5:820:19 | match_pattern10 | main.rs:820:5:820:21 | match_pattern10(...) | | -| main.rs:820:5:820:21 | match_pattern10(...) | main.rs:821:5:821:22 | ExprStmt | | -| main.rs:820:5:820:22 | ExprStmt | main.rs:820:5:820:19 | match_pattern10 | | -| main.rs:821:5:821:19 | match_pattern11 | main.rs:821:5:821:21 | match_pattern11(...) | | -| main.rs:821:5:821:21 | match_pattern11(...) | main.rs:822:5:822:22 | ExprStmt | | -| main.rs:821:5:821:22 | ExprStmt | main.rs:821:5:821:19 | match_pattern11 | | -| main.rs:822:5:822:19 | match_pattern12 | main.rs:822:5:822:21 | match_pattern12(...) | | -| main.rs:822:5:822:21 | match_pattern12(...) | main.rs:823:5:823:22 | ExprStmt | | -| main.rs:822:5:822:22 | ExprStmt | main.rs:822:5:822:19 | match_pattern12 | | -| main.rs:823:5:823:19 | match_pattern13 | main.rs:823:5:823:21 | match_pattern13(...) | | -| main.rs:823:5:823:21 | match_pattern13(...) | main.rs:824:5:824:22 | ExprStmt | | -| main.rs:823:5:823:22 | ExprStmt | main.rs:823:5:823:19 | match_pattern13 | | -| main.rs:824:5:824:19 | match_pattern14 | main.rs:824:5:824:21 | match_pattern14(...) | | -| main.rs:824:5:824:21 | match_pattern14(...) | main.rs:825:5:825:22 | ExprStmt | | -| main.rs:824:5:824:22 | ExprStmt | main.rs:824:5:824:19 | match_pattern14 | | -| main.rs:825:5:825:19 | match_pattern15 | main.rs:825:5:825:21 | match_pattern15(...) | | -| main.rs:825:5:825:21 | match_pattern15(...) | main.rs:826:5:826:22 | ExprStmt | | -| main.rs:825:5:825:22 | ExprStmt | main.rs:825:5:825:19 | match_pattern15 | | -| main.rs:826:5:826:19 | match_pattern16 | main.rs:826:5:826:21 | match_pattern16(...) | | -| main.rs:826:5:826:21 | match_pattern16(...) | main.rs:827:5:827:36 | ExprStmt | | -| main.rs:826:5:826:22 | ExprStmt | main.rs:826:5:826:19 | match_pattern16 | | -| main.rs:827:5:827:18 | param_pattern1 | main.rs:827:20:827:22 | "a" | | -| main.rs:827:5:827:35 | param_pattern1(...) | main.rs:828:5:828:37 | ExprStmt | | -| main.rs:827:5:827:36 | ExprStmt | main.rs:827:5:827:18 | param_pattern1 | | -| main.rs:827:20:827:22 | "a" | main.rs:827:26:827:28 | "b" | | -| main.rs:827:25:827:34 | TupleExpr | main.rs:827:5:827:35 | param_pattern1(...) | | -| main.rs:827:26:827:28 | "b" | main.rs:827:31:827:33 | "c" | | -| main.rs:827:31:827:33 | "c" | main.rs:827:25:827:34 | TupleExpr | | -| main.rs:828:5:828:18 | param_pattern2 | main.rs:828:20:828:31 | ...::Left | | -| main.rs:828:5:828:36 | param_pattern2(...) | main.rs:829:5:829:26 | ExprStmt | | -| main.rs:828:5:828:37 | ExprStmt | main.rs:828:5:828:18 | param_pattern2 | | -| main.rs:828:20:828:31 | ...::Left | main.rs:828:33:828:34 | 45 | | -| main.rs:828:20:828:35 | ...::Left(...) | main.rs:828:5:828:36 | param_pattern2(...) | | -| main.rs:828:33:828:34 | 45 | main.rs:828:20:828:35 | ...::Left(...) | | -| main.rs:829:5:829:23 | destruct_assignment | main.rs:829:5:829:25 | destruct_assignment(...) | | -| main.rs:829:5:829:25 | destruct_assignment(...) | main.rs:830:5:830:23 | ExprStmt | | -| main.rs:829:5:829:26 | ExprStmt | main.rs:829:5:829:23 | destruct_assignment | | -| main.rs:830:5:830:20 | closure_variable | main.rs:830:5:830:22 | closure_variable(...) | | -| main.rs:830:5:830:22 | closure_variable(...) | main.rs:831:5:831:22 | ExprStmt | | -| main.rs:830:5:830:23 | ExprStmt | main.rs:830:5:830:20 | closure_variable | | -| main.rs:831:5:831:19 | nested_function | main.rs:831:5:831:21 | nested_function(...) | | -| main.rs:831:5:831:21 | nested_function(...) | main.rs:832:5:832:19 | ExprStmt | | -| main.rs:831:5:831:22 | ExprStmt | main.rs:831:5:831:19 | nested_function | | -| main.rs:832:5:832:16 | for_variable | main.rs:832:5:832:18 | for_variable(...) | | -| main.rs:832:5:832:18 | for_variable(...) | main.rs:833:5:833:17 | ExprStmt | | -| main.rs:832:5:832:19 | ExprStmt | main.rs:832:5:832:16 | for_variable | | -| main.rs:833:5:833:14 | add_assign | main.rs:833:5:833:16 | add_assign(...) | | -| main.rs:833:5:833:16 | add_assign(...) | main.rs:834:5:834:13 | ExprStmt | | -| main.rs:833:5:833:17 | ExprStmt | main.rs:833:5:833:14 | add_assign | | -| main.rs:834:5:834:10 | mutate | main.rs:834:5:834:12 | mutate(...) | | -| main.rs:834:5:834:12 | mutate(...) | main.rs:835:5:835:17 | ExprStmt | | -| main.rs:834:5:834:13 | ExprStmt | main.rs:834:5:834:10 | mutate | | -| main.rs:835:5:835:14 | mutate_arg | main.rs:835:5:835:16 | mutate_arg(...) | | -| main.rs:835:5:835:16 | mutate_arg(...) | main.rs:836:5:836:12 | ExprStmt | | -| main.rs:835:5:835:17 | ExprStmt | main.rs:835:5:835:14 | mutate_arg | | -| main.rs:836:5:836:9 | alias | main.rs:836:5:836:11 | alias(...) | | -| main.rs:836:5:836:11 | alias(...) | main.rs:837:5:837:18 | ExprStmt | | -| main.rs:836:5:836:12 | ExprStmt | main.rs:836:5:836:9 | alias | | -| main.rs:837:5:837:15 | capture_mut | main.rs:837:5:837:17 | capture_mut(...) | | -| main.rs:837:5:837:17 | capture_mut(...) | main.rs:838:5:838:20 | ExprStmt | | -| main.rs:837:5:837:18 | ExprStmt | main.rs:837:5:837:15 | capture_mut | | -| main.rs:838:5:838:17 | capture_immut | main.rs:838:5:838:19 | capture_immut(...) | | -| main.rs:838:5:838:19 | capture_immut(...) | main.rs:839:5:839:26 | ExprStmt | | -| main.rs:838:5:838:20 | ExprStmt | main.rs:838:5:838:17 | capture_immut | | -| main.rs:839:5:839:23 | async_block_capture | main.rs:839:5:839:25 | async_block_capture(...) | | -| main.rs:839:5:839:25 | async_block_capture(...) | main.rs:840:5:840:14 | ExprStmt | | -| main.rs:839:5:839:26 | ExprStmt | main.rs:839:5:839:23 | async_block_capture | | -| main.rs:840:5:840:11 | structs | main.rs:840:5:840:13 | structs(...) | | -| main.rs:840:5:840:13 | structs(...) | main.rs:841:5:841:14 | ExprStmt | | -| main.rs:840:5:840:14 | ExprStmt | main.rs:840:5:840:11 | structs | | -| main.rs:841:5:841:11 | ref_arg | main.rs:841:5:841:13 | ref_arg(...) | | -| main.rs:841:5:841:13 | ref_arg(...) | main.rs:842:5:842:30 | ExprStmt | | -| main.rs:841:5:841:14 | ExprStmt | main.rs:841:5:841:11 | ref_arg | | -| main.rs:842:5:842:27 | ref_methodcall_receiver | main.rs:842:5:842:29 | ref_methodcall_receiver(...) | | -| main.rs:842:5:842:29 | ref_methodcall_receiver(...) | main.rs:843:5:843:23 | ExprStmt | | -| main.rs:842:5:842:30 | ExprStmt | main.rs:842:5:842:27 | ref_methodcall_receiver | | -| main.rs:843:5:843:20 | macro_invocation | main.rs:843:5:843:22 | macro_invocation(...) | | -| main.rs:843:5:843:22 | macro_invocation(...) | main.rs:844:5:844:18 | ExprStmt | | -| main.rs:843:5:843:23 | ExprStmt | main.rs:843:5:843:20 | macro_invocation | | -| main.rs:844:5:844:15 | capture_phi | main.rs:844:5:844:17 | capture_phi(...) | | -| main.rs:844:5:844:17 | capture_phi(...) | main.rs:801:11:845:1 | { ... } | | -| main.rs:844:5:844:18 | ExprStmt | main.rs:844:5:844:15 | capture_phi | | +| main.rs:708:5:708:25 | print_i64(...) | main.rs:702:14:709:1 | { ... } | | +| main.rs:708:5:708:26 | ExprStmt | main.rs:708:5:708:13 | print_i64 | | +| main.rs:708:15:708:15 | a | main.rs:708:15:708:24 | a.my_get() | | +| main.rs:708:15:708:24 | a.my_get() | main.rs:708:5:708:25 | print_i64(...) | | +| main.rs:711:1:718:1 | enter fn arrays | main.rs:712:5:712:26 | let ... = ... | | +| main.rs:711:1:718:1 | exit fn arrays (normal) | main.rs:711:1:718:1 | exit fn arrays | | +| main.rs:711:13:718:1 | { ... } | main.rs:711:1:718:1 | exit fn arrays (normal) | | +| main.rs:712:5:712:26 | let ... = ... | main.rs:712:18:712:18 | 1 | | +| main.rs:712:9:712:13 | mut a | main.rs:713:5:713:20 | ExprStmt | match | +| main.rs:712:13:712:13 | a | main.rs:712:9:712:13 | mut a | | +| main.rs:712:17:712:25 | [...] | main.rs:712:13:712:13 | a | | +| main.rs:712:18:712:18 | 1 | main.rs:712:21:712:21 | 2 | | +| main.rs:712:21:712:21 | 2 | main.rs:712:24:712:24 | 3 | | +| main.rs:712:24:712:24 | 3 | main.rs:712:17:712:25 | [...] | | +| main.rs:713:5:713:13 | print_i64 | main.rs:713:15:713:15 | a | | +| main.rs:713:5:713:19 | print_i64(...) | main.rs:714:5:714:13 | ExprStmt | | +| main.rs:713:5:713:20 | ExprStmt | main.rs:713:5:713:13 | print_i64 | | +| main.rs:713:15:713:15 | a | main.rs:713:17:713:17 | 0 | | +| main.rs:713:15:713:18 | a[0] | main.rs:713:5:713:19 | print_i64(...) | | +| main.rs:713:17:713:17 | 0 | main.rs:713:15:713:18 | a[0] | | +| main.rs:714:5:714:5 | a | main.rs:714:7:714:7 | 1 | | +| main.rs:714:5:714:8 | a[1] | main.rs:714:12:714:12 | 5 | | +| main.rs:714:5:714:12 | ... = ... | main.rs:715:5:715:20 | ExprStmt | | +| main.rs:714:5:714:13 | ExprStmt | main.rs:714:5:714:5 | a | | +| main.rs:714:7:714:7 | 1 | main.rs:714:5:714:8 | a[1] | | +| main.rs:714:12:714:12 | 5 | main.rs:714:5:714:12 | ... = ... | | +| main.rs:715:5:715:13 | print_i64 | main.rs:715:15:715:15 | a | | +| main.rs:715:5:715:19 | print_i64(...) | main.rs:716:5:716:18 | ExprStmt | | +| main.rs:715:5:715:20 | ExprStmt | main.rs:715:5:715:13 | print_i64 | | +| main.rs:715:15:715:15 | a | main.rs:715:17:715:17 | 1 | | +| main.rs:715:15:715:18 | a[1] | main.rs:715:5:715:19 | print_i64(...) | | +| main.rs:715:17:715:17 | 1 | main.rs:715:15:715:18 | a[1] | | +| main.rs:716:5:716:5 | a | main.rs:716:10:716:10 | 4 | | +| main.rs:716:5:716:17 | ... = ... | main.rs:717:5:717:20 | ExprStmt | | +| main.rs:716:5:716:18 | ExprStmt | main.rs:716:5:716:5 | a | | +| main.rs:716:9:716:17 | [...] | main.rs:716:5:716:17 | ... = ... | | +| main.rs:716:10:716:10 | 4 | main.rs:716:13:716:13 | 5 | | +| main.rs:716:13:716:13 | 5 | main.rs:716:16:716:16 | 6 | | +| main.rs:716:16:716:16 | 6 | main.rs:716:9:716:17 | [...] | | +| main.rs:717:5:717:13 | print_i64 | main.rs:717:15:717:15 | a | | +| main.rs:717:5:717:19 | print_i64(...) | main.rs:711:13:718:1 | { ... } | | +| main.rs:717:5:717:20 | ExprStmt | main.rs:717:5:717:13 | print_i64 | | +| main.rs:717:15:717:15 | a | main.rs:717:17:717:17 | 2 | | +| main.rs:717:15:717:18 | a[2] | main.rs:717:5:717:19 | print_i64(...) | | +| main.rs:717:17:717:17 | 2 | main.rs:717:15:717:18 | a[2] | | +| main.rs:720:1:727:1 | enter fn ref_arg | main.rs:721:5:721:15 | let ... = 16 | | +| main.rs:720:1:727:1 | exit fn ref_arg (normal) | main.rs:720:1:727:1 | exit fn ref_arg | | +| main.rs:720:14:727:1 | { ... } | main.rs:720:1:727:1 | exit fn ref_arg (normal) | | +| main.rs:721:5:721:15 | let ... = 16 | main.rs:721:13:721:14 | 16 | | +| main.rs:721:9:721:9 | x | main.rs:721:9:721:9 | x | | +| main.rs:721:9:721:9 | x | main.rs:722:5:722:22 | ExprStmt | match | +| main.rs:721:13:721:14 | 16 | main.rs:721:9:721:9 | x | | +| main.rs:722:5:722:17 | print_i64_ref | main.rs:722:20:722:20 | x | | +| main.rs:722:5:722:21 | print_i64_ref(...) | main.rs:723:5:723:17 | ExprStmt | | +| main.rs:722:5:722:22 | ExprStmt | main.rs:722:5:722:17 | print_i64_ref | | +| main.rs:722:19:722:20 | &x | main.rs:722:5:722:21 | print_i64_ref(...) | | +| main.rs:722:20:722:20 | x | main.rs:722:19:722:20 | &x | | +| main.rs:723:5:723:13 | print_i64 | main.rs:723:15:723:15 | x | | +| main.rs:723:5:723:16 | print_i64(...) | main.rs:725:5:725:15 | let ... = 17 | | +| main.rs:723:5:723:17 | ExprStmt | main.rs:723:5:723:13 | print_i64 | | +| main.rs:723:15:723:15 | x | main.rs:723:5:723:16 | print_i64(...) | | +| main.rs:725:5:725:15 | let ... = 17 | main.rs:725:13:725:14 | 17 | | +| main.rs:725:9:725:9 | z | main.rs:725:9:725:9 | z | | +| main.rs:725:9:725:9 | z | main.rs:726:5:726:22 | ExprStmt | match | +| main.rs:725:13:725:14 | 17 | main.rs:725:9:725:9 | z | | +| main.rs:726:5:726:17 | print_i64_ref | main.rs:726:20:726:20 | z | | +| main.rs:726:5:726:21 | print_i64_ref(...) | main.rs:720:14:727:1 | { ... } | | +| main.rs:726:5:726:22 | ExprStmt | main.rs:726:5:726:17 | print_i64_ref | | +| main.rs:726:19:726:20 | &z | main.rs:726:5:726:21 | print_i64_ref(...) | | +| main.rs:726:20:726:20 | z | main.rs:726:19:726:20 | &z | | +| main.rs:734:5:736:5 | enter fn bar | main.rs:734:17:734:20 | self | | +| main.rs:734:5:736:5 | exit fn bar (normal) | main.rs:734:5:736:5 | exit fn bar | | +| main.rs:734:12:734:20 | SelfParam | main.rs:735:9:735:36 | ExprStmt | | +| main.rs:734:17:734:20 | self | main.rs:734:12:734:20 | SelfParam | | +| main.rs:734:23:736:5 | { ... } | main.rs:734:5:736:5 | exit fn bar (normal) | | +| main.rs:735:9:735:13 | * ... | main.rs:735:33:735:33 | 3 | | +| main.rs:735:9:735:35 | ... = ... | main.rs:734:23:736:5 | { ... } | | +| main.rs:735:9:735:36 | ExprStmt | main.rs:735:10:735:13 | self | | +| main.rs:735:10:735:13 | self | main.rs:735:9:735:13 | * ... | | +| main.rs:735:17:735:35 | MyStruct {...} | main.rs:735:9:735:35 | ... = ... | | +| main.rs:735:33:735:33 | 3 | main.rs:735:17:735:35 | MyStruct {...} | | +| main.rs:739:1:745:1 | enter fn ref_methodcall_receiver | main.rs:740:5:740:36 | let ... = ... | | +| main.rs:739:1:745:1 | exit fn ref_methodcall_receiver (normal) | main.rs:739:1:745:1 | exit fn ref_methodcall_receiver | | +| main.rs:739:30:745:1 | { ... } | main.rs:739:1:745:1 | exit fn ref_methodcall_receiver (normal) | | +| main.rs:740:5:740:36 | let ... = ... | main.rs:740:33:740:33 | 1 | | +| main.rs:740:9:740:13 | mut a | main.rs:741:5:741:12 | ExprStmt | match | +| main.rs:740:13:740:13 | a | main.rs:740:9:740:13 | mut a | | +| main.rs:740:17:740:35 | MyStruct {...} | main.rs:740:13:740:13 | a | | +| main.rs:740:33:740:33 | 1 | main.rs:740:17:740:35 | MyStruct {...} | | +| main.rs:741:5:741:5 | a | main.rs:741:5:741:11 | a.bar() | | +| main.rs:741:5:741:11 | a.bar() | main.rs:744:5:744:21 | ExprStmt | | +| main.rs:741:5:741:12 | ExprStmt | main.rs:741:5:741:5 | a | | +| main.rs:744:5:744:13 | print_i64 | main.rs:744:15:744:15 | a | | +| main.rs:744:5:744:20 | print_i64(...) | main.rs:739:30:745:1 | { ... } | | +| main.rs:744:5:744:21 | ExprStmt | main.rs:744:5:744:13 | print_i64 | | +| main.rs:744:15:744:15 | a | main.rs:744:15:744:19 | a.val | | +| main.rs:744:15:744:19 | a.val | main.rs:744:5:744:20 | print_i64(...) | | +| main.rs:761:1:772:1 | enter fn macro_invocation | main.rs:762:5:763:26 | let ... = ... | | +| main.rs:761:1:772:1 | exit fn macro_invocation (normal) | main.rs:761:1:772:1 | exit fn macro_invocation | | +| main.rs:761:23:772:1 | { ... } | main.rs:761:1:772:1 | exit fn macro_invocation (normal) | | +| main.rs:762:5:763:26 | let ... = ... | main.rs:763:23:763:24 | let ... = 37 | | +| main.rs:762:9:762:22 | var_from_macro | main.rs:762:9:762:22 | var_from_macro | | +| main.rs:762:9:762:22 | var_from_macro | main.rs:764:5:764:30 | ExprStmt | match | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | match | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:23:763:24 | { ... } | | +| main.rs:763:9:763:25 | MacroExpr | main.rs:762:9:762:22 | var_from_macro | | +| main.rs:763:9:763:25 | let_in_macro!... | main.rs:763:9:763:25 | MacroExpr | | +| main.rs:763:23:763:24 | 37 | main.rs:763:9:763:21 | var_in_macro | | +| main.rs:763:23:763:24 | let ... = 37 | main.rs:763:23:763:24 | 37 | | +| main.rs:763:23:763:24 | { ... } | main.rs:763:9:763:25 | let_in_macro!... | | +| main.rs:764:5:764:13 | print_i64 | main.rs:764:15:764:28 | var_from_macro | | +| main.rs:764:5:764:29 | print_i64(...) | main.rs:765:5:765:26 | let ... = 33 | | +| main.rs:764:5:764:30 | ExprStmt | main.rs:764:5:764:13 | print_i64 | | +| main.rs:764:15:764:28 | var_from_macro | main.rs:764:5:764:29 | print_i64(...) | | +| main.rs:765:5:765:26 | let ... = 33 | main.rs:765:24:765:25 | 33 | | +| main.rs:765:9:765:20 | var_in_macro | main.rs:765:9:765:20 | var_in_macro | | +| main.rs:765:9:765:20 | var_in_macro | main.rs:770:5:770:44 | ExprStmt | match | +| main.rs:765:24:765:25 | 33 | main.rs:765:9:765:20 | var_in_macro | | +| main.rs:770:5:770:13 | print_i64 | main.rs:770:15:770:28 | let ... = 0 | | +| main.rs:770:5:770:43 | print_i64(...) | main.rs:771:5:771:28 | ExprStmt | | +| main.rs:770:5:770:44 | ExprStmt | main.rs:770:5:770:13 | print_i64 | | +| main.rs:770:15:770:28 | 0 | main.rs:770:15:770:28 | var_in_macro | | +| main.rs:770:15:770:28 | let ... = 0 | main.rs:770:15:770:28 | 0 | | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:15:770:28 | var_in_macro | | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:30:770:41 | var_in_macro | match | +| main.rs:770:15:770:42 | MacroExpr | main.rs:770:5:770:43 | print_i64(...) | | +| main.rs:770:15:770:42 | let_in_macro2!... | main.rs:770:15:770:42 | MacroExpr | | +| main.rs:770:30:770:41 | var_in_macro | main.rs:770:30:770:41 | { ... } | | +| main.rs:770:30:770:41 | { ... } | main.rs:770:15:770:42 | let_in_macro2!... | | +| main.rs:771:5:771:13 | print_i64 | main.rs:771:15:771:26 | var_in_macro | | +| main.rs:771:5:771:27 | print_i64(...) | main.rs:761:23:772:1 | { ... } | | +| main.rs:771:5:771:28 | ExprStmt | main.rs:771:5:771:13 | print_i64 | | +| main.rs:771:15:771:26 | var_in_macro | main.rs:771:5:771:27 | print_i64(...) | | +| main.rs:774:1:778:1 | enter fn let_without_initializer | main.rs:775:5:775:10 | let ... | | +| main.rs:774:1:778:1 | exit fn let_without_initializer (normal) | main.rs:774:1:778:1 | exit fn let_without_initializer | | +| main.rs:774:30:778:1 | { ... } | main.rs:774:1:778:1 | exit fn let_without_initializer (normal) | | +| main.rs:775:5:775:10 | let ... | main.rs:775:9:775:9 | x | | +| main.rs:775:9:775:9 | x | main.rs:775:9:775:9 | x | | +| main.rs:775:9:775:9 | x | main.rs:776:5:776:10 | ExprStmt | match | +| main.rs:776:5:776:5 | x | main.rs:776:9:776:9 | 1 | | +| main.rs:776:5:776:9 | ... = ... | main.rs:777:5:777:17 | ExprStmt | | +| main.rs:776:5:776:10 | ExprStmt | main.rs:776:5:776:5 | x | | +| main.rs:776:9:776:9 | 1 | main.rs:776:5:776:9 | ... = ... | | +| main.rs:777:5:777:13 | print_i64 | main.rs:777:15:777:15 | x | | +| main.rs:777:5:777:16 | print_i64(...) | main.rs:774:30:778:1 | { ... } | | +| main.rs:777:5:777:17 | ExprStmt | main.rs:777:5:777:13 | print_i64 | | +| main.rs:777:15:777:15 | x | main.rs:777:5:777:16 | print_i64(...) | | +| main.rs:780:1:790:1 | enter fn capture_phi | main.rs:781:5:781:20 | let ... = 100 | | +| main.rs:780:1:790:1 | exit fn capture_phi (normal) | main.rs:780:1:790:1 | exit fn capture_phi | | +| main.rs:780:18:790:1 | { ... } | main.rs:780:1:790:1 | exit fn capture_phi (normal) | | +| main.rs:781:5:781:20 | let ... = 100 | main.rs:781:17:781:19 | 100 | | +| main.rs:781:9:781:13 | mut x | main.rs:782:5:787:6 | let ... = ... | match | +| main.rs:781:13:781:13 | x | main.rs:781:9:781:13 | mut x | | +| main.rs:781:17:781:19 | 100 | main.rs:781:13:781:13 | x | | +| main.rs:782:5:787:6 | let ... = ... | main.rs:782:19:787:5 | \|...\| ... | | +| main.rs:782:9:782:15 | mut cap | main.rs:788:5:788:14 | ExprStmt | match | +| main.rs:782:13:782:15 | cap | main.rs:782:9:782:15 | mut cap | | +| main.rs:782:19:787:5 | \|...\| ... | main.rs:782:13:782:15 | cap | | +| main.rs:782:19:787:5 | enter \|...\| ... | main.rs:782:20:782:20 | b | | +| main.rs:782:19:787:5 | exit \|...\| ... (normal) | main.rs:782:19:787:5 | exit \|...\| ... | | +| main.rs:782:20:782:20 | b | main.rs:782:20:782:20 | b | | +| main.rs:782:20:782:20 | b | main.rs:782:20:782:26 | ...: bool | match | +| main.rs:782:20:782:26 | ...: bool | main.rs:783:9:786:10 | let _ = ... | | +| main.rs:782:29:787:5 | { ... } | main.rs:782:19:787:5 | exit \|...\| ... (normal) | | +| main.rs:783:9:786:10 | let _ = ... | main.rs:784:20:784:20 | b | | +| main.rs:784:13:784:13 | _ | main.rs:782:29:787:5 | { ... } | match | +| main.rs:784:17:786:9 | if b {...} | main.rs:784:13:784:13 | _ | | +| main.rs:784:20:784:20 | b | main.rs:784:17:786:9 | if b {...} | false | +| main.rs:784:20:784:20 | b | main.rs:785:13:785:20 | ExprStmt | true | +| main.rs:784:22:786:9 | { ... } | main.rs:784:17:786:9 | if b {...} | | +| main.rs:785:13:785:13 | x | main.rs:785:17:785:19 | 200 | | +| main.rs:785:13:785:19 | ... = ... | main.rs:784:22:786:9 | { ... } | | +| main.rs:785:13:785:20 | ExprStmt | main.rs:785:13:785:13 | x | | +| main.rs:785:17:785:19 | 200 | main.rs:785:13:785:19 | ... = ... | | +| main.rs:788:5:788:7 | cap | main.rs:788:9:788:12 | true | | +| main.rs:788:5:788:13 | cap(...) | main.rs:789:5:789:17 | ExprStmt | | +| main.rs:788:5:788:14 | ExprStmt | main.rs:788:5:788:7 | cap | | +| main.rs:788:9:788:12 | true | main.rs:788:5:788:13 | cap(...) | | +| main.rs:789:5:789:13 | print_i64 | main.rs:789:15:789:15 | x | | +| main.rs:789:5:789:16 | print_i64(...) | main.rs:780:18:790:1 | { ... } | | +| main.rs:789:5:789:17 | ExprStmt | main.rs:789:5:789:13 | print_i64 | | +| main.rs:789:15:789:15 | x | main.rs:789:5:789:16 | print_i64(...) | | +| main.rs:793:5:808:5 | enter fn test | main.rs:795:9:795:25 | let ... = ... | | +| main.rs:793:5:808:5 | exit fn test (normal) | main.rs:793:5:808:5 | exit fn test | | +| main.rs:794:34:808:5 | { ... } | main.rs:793:5:808:5 | exit fn test (normal) | | +| main.rs:795:9:795:25 | let ... = ... | main.rs:795:17:795:20 | Some | | +| main.rs:795:13:795:13 | x | main.rs:795:13:795:13 | x | | +| main.rs:795:13:795:13 | x | main.rs:796:9:803:10 | let ... = ... | match | +| main.rs:795:17:795:20 | Some | main.rs:795:22:795:23 | 42 | | +| main.rs:795:17:795:24 | Some(...) | main.rs:795:13:795:13 | x | | +| main.rs:795:22:795:23 | 42 | main.rs:795:17:795:24 | Some(...) | | +| main.rs:796:9:803:10 | let ... = ... | main.rs:797:19:797:19 | x | | +| main.rs:796:13:796:13 | y | main.rs:796:13:796:13 | y | | +| main.rs:796:13:796:13 | y | main.rs:804:15:804:15 | y | match | +| main.rs:797:13:803:9 | match x { ... } | main.rs:796:13:796:13 | y | | +| main.rs:797:19:797:19 | x | main.rs:798:13:798:19 | Some(...) | | +| main.rs:798:13:798:19 | Some(...) | main.rs:798:18:798:18 | y | match | +| main.rs:798:13:798:19 | Some(...) | main.rs:801:13:801:16 | None | no-match | +| main.rs:798:18:798:18 | y | main.rs:798:18:798:18 | y | | +| main.rs:798:18:798:18 | y | main.rs:799:17:799:20 | None | match | +| main.rs:798:24:800:13 | { ... } | main.rs:797:13:803:9 | match x { ... } | | +| main.rs:799:17:799:20 | None | main.rs:798:24:800:13 | { ... } | | +| main.rs:801:13:801:16 | None | main.rs:801:13:801:16 | None | | +| main.rs:801:13:801:16 | None | main.rs:802:17:802:20 | None | match | +| main.rs:802:17:802:20 | None | main.rs:797:13:803:9 | match x { ... } | | +| main.rs:804:9:807:9 | match y { ... } | main.rs:794:34:808:5 | { ... } | | +| main.rs:804:15:804:15 | y | main.rs:805:13:805:16 | N0ne | | +| main.rs:805:13:805:16 | N0ne | main.rs:805:13:805:16 | N0ne | | +| main.rs:805:13:805:16 | N0ne | main.rs:806:17:806:20 | N0ne | match | +| main.rs:806:17:806:20 | N0ne | main.rs:804:9:807:9 | match y { ... } | | +| main.rs:810:5:817:5 | enter fn test2 | main.rs:812:9:813:17 | let ... = test | | +| main.rs:810:5:817:5 | exit fn test2 (normal) | main.rs:810:5:817:5 | exit fn test2 | | +| main.rs:811:31:817:5 | { ... } | main.rs:810:5:817:5 | exit fn test2 (normal) | | +| main.rs:812:9:813:17 | let ... = test | main.rs:813:13:813:16 | test | | +| main.rs:812:13:812:22 | test_alias | main.rs:812:13:812:22 | test_alias | | +| main.rs:812:13:812:22 | test_alias | main.rs:814:9:815:25 | let ... = ... | match | +| main.rs:813:13:813:16 | test | main.rs:812:13:812:22 | test_alias | | +| main.rs:814:9:815:25 | let ... = ... | main.rs:815:13:815:22 | test_alias | | +| main.rs:814:13:814:16 | test | main.rs:814:13:814:16 | test | | +| main.rs:814:13:814:16 | test | main.rs:816:9:816:12 | test | match | +| main.rs:815:13:815:22 | test_alias | main.rs:815:13:815:24 | test_alias(...) | | +| main.rs:815:13:815:24 | test_alias(...) | main.rs:814:13:814:16 | test | | +| main.rs:816:9:816:12 | test | main.rs:811:31:817:5 | { ... } | | +| main.rs:821:5:834:5 | enter fn test3 | main.rs:823:9:823:24 | let ... = ... | | +| main.rs:821:5:834:5 | exit fn test3 (normal) | main.rs:821:5:834:5 | exit fn test3 | | +| main.rs:822:16:834:5 | { ... } | main.rs:821:5:834:5 | exit fn test3 (normal) | | +| main.rs:823:9:823:24 | let ... = ... | main.rs:823:17:823:20 | Some | | +| main.rs:823:13:823:13 | x | main.rs:823:13:823:13 | x | | +| main.rs:823:13:823:13 | x | main.rs:824:9:828:10 | ExprStmt | match | +| main.rs:823:17:823:20 | Some | main.rs:823:22:823:22 | 0 | | +| main.rs:823:17:823:23 | Some(...) | main.rs:823:13:823:13 | x | | +| main.rs:823:22:823:22 | 0 | main.rs:823:17:823:23 | Some(...) | | +| main.rs:824:9:828:9 | match x { ... } | main.rs:829:9:833:10 | ExprStmt | | +| main.rs:824:9:828:10 | ExprStmt | main.rs:824:15:824:15 | x | | +| main.rs:824:15:824:15 | x | main.rs:825:13:825:19 | Some(...) | | +| main.rs:825:13:825:19 | Some(...) | main.rs:825:18:825:18 | x | match | +| main.rs:825:13:825:19 | Some(...) | main.rs:827:13:827:13 | _ | no-match | +| main.rs:825:18:825:18 | x | main.rs:825:18:825:18 | x | | +| main.rs:825:18:825:18 | x | main.rs:826:20:826:20 | x | match | +| main.rs:826:20:826:20 | x | main.rs:824:9:828:9 | match x { ... } | | +| main.rs:827:13:827:13 | _ | main.rs:827:18:827:18 | 0 | match | +| main.rs:827:18:827:18 | 0 | main.rs:824:9:828:9 | match x { ... } | | +| main.rs:829:9:833:9 | match x { ... } | main.rs:822:16:834:5 | { ... } | | +| main.rs:829:9:833:10 | ExprStmt | main.rs:829:15:829:15 | x | | +| main.rs:829:15:829:15 | x | main.rs:830:13:830:19 | Some(...) | | +| main.rs:830:13:830:19 | Some(...) | main.rs:830:18:830:18 | z | match | +| main.rs:830:13:830:19 | Some(...) | main.rs:832:13:832:13 | _ | no-match | +| main.rs:830:18:830:18 | z | main.rs:830:18:830:18 | z | | +| main.rs:830:18:830:18 | z | main.rs:831:17:831:17 | z | match | +| main.rs:830:18:830:18 | z | main.rs:832:13:832:13 | _ | no-match | +| main.rs:831:17:831:17 | z | main.rs:829:9:833:9 | match x { ... } | | +| main.rs:832:13:832:13 | _ | main.rs:832:18:832:18 | 0 | match | +| main.rs:832:18:832:18 | 0 | main.rs:829:9:833:9 | match x { ... } | | +| main.rs:837:1:847:1 | enter fn let_in_block_in_cond | main.rs:838:5:838:14 | let ... = 1 | | +| main.rs:837:1:847:1 | exit fn let_in_block_in_cond (normal) | main.rs:837:1:847:1 | exit fn let_in_block_in_cond | | +| main.rs:837:27:847:1 | { ... } | main.rs:837:1:847:1 | exit fn let_in_block_in_cond (normal) | | +| main.rs:838:5:838:14 | let ... = 1 | main.rs:838:13:838:13 | 1 | | +| main.rs:838:9:838:9 | x | main.rs:838:9:838:9 | x | | +| main.rs:838:9:838:9 | x | main.rs:840:9:840:18 | let ... = 1 | match | +| main.rs:838:13:838:13 | 1 | main.rs:838:9:838:9 | x | | +| main.rs:839:5:846:5 | if ... {...} else {...} | main.rs:837:27:847:1 | { ... } | | +| main.rs:839:8:842:5 | [boolean(false)] { ... } | main.rs:845:9:845:21 | ExprStmt | false | +| main.rs:839:8:842:5 | [boolean(true)] { ... } | main.rs:843:9:843:21 | ExprStmt | true | +| main.rs:840:9:840:18 | let ... = 1 | main.rs:840:17:840:17 | 1 | | +| main.rs:840:13:840:13 | x | main.rs:840:13:840:13 | x | | +| main.rs:840:13:840:13 | x | main.rs:841:9:841:9 | x | match | +| main.rs:840:17:840:17 | 1 | main.rs:840:13:840:13 | x | | +| main.rs:841:9:841:9 | x | main.rs:841:13:841:13 | 0 | | +| main.rs:841:9:841:13 | ... > ... | main.rs:839:8:842:5 | [boolean(false)] { ... } | false | +| main.rs:841:9:841:13 | ... > ... | main.rs:839:8:842:5 | [boolean(true)] { ... } | true | +| main.rs:841:13:841:13 | 0 | main.rs:841:9:841:13 | ... > ... | | +| main.rs:842:7:844:5 | { ... } | main.rs:839:5:846:5 | if ... {...} else {...} | | +| main.rs:843:9:843:17 | print_i64 | main.rs:843:19:843:19 | x | | +| main.rs:843:9:843:20 | print_i64(...) | main.rs:842:7:844:5 | { ... } | | +| main.rs:843:9:843:21 | ExprStmt | main.rs:843:9:843:17 | print_i64 | | +| main.rs:843:19:843:19 | x | main.rs:843:9:843:20 | print_i64(...) | | +| main.rs:844:12:846:5 | { ... } | main.rs:839:5:846:5 | if ... {...} else {...} | | +| main.rs:845:9:845:17 | print_i64 | main.rs:845:19:845:19 | x | | +| main.rs:845:9:845:20 | print_i64(...) | main.rs:844:12:846:5 | { ... } | | +| main.rs:845:9:845:21 | ExprStmt | main.rs:845:9:845:17 | print_i64 | | +| main.rs:845:19:845:19 | x | main.rs:845:9:845:20 | print_i64(...) | | +| main.rs:849:1:896:1 | enter fn main | main.rs:850:5:850:25 | ExprStmt | | +| main.rs:849:1:896:1 | exit fn main (normal) | main.rs:849:1:896:1 | exit fn main | | +| main.rs:849:11:896:1 | { ... } | main.rs:849:1:896:1 | exit fn main (normal) | | +| main.rs:850:5:850:22 | immutable_variable | main.rs:850:5:850:24 | immutable_variable(...) | | +| main.rs:850:5:850:24 | immutable_variable(...) | main.rs:851:5:851:23 | ExprStmt | | +| main.rs:850:5:850:25 | ExprStmt | main.rs:850:5:850:22 | immutable_variable | | +| main.rs:851:5:851:20 | mutable_variable | main.rs:851:5:851:22 | mutable_variable(...) | | +| main.rs:851:5:851:22 | mutable_variable(...) | main.rs:852:5:852:40 | ExprStmt | | +| main.rs:851:5:851:23 | ExprStmt | main.rs:851:5:851:20 | mutable_variable | | +| main.rs:852:5:852:37 | mutable_variable_immutable_borrow | main.rs:852:5:852:39 | mutable_variable_immutable_borrow(...) | | +| main.rs:852:5:852:39 | mutable_variable_immutable_borrow(...) | main.rs:853:5:853:23 | ExprStmt | | +| main.rs:852:5:852:40 | ExprStmt | main.rs:852:5:852:37 | mutable_variable_immutable_borrow | | +| main.rs:853:5:853:20 | variable_shadow1 | main.rs:853:5:853:22 | variable_shadow1(...) | | +| main.rs:853:5:853:22 | variable_shadow1(...) | main.rs:854:5:854:23 | ExprStmt | | +| main.rs:853:5:853:23 | ExprStmt | main.rs:853:5:853:20 | variable_shadow1 | | +| main.rs:854:5:854:20 | variable_shadow2 | main.rs:854:5:854:22 | variable_shadow2(...) | | +| main.rs:854:5:854:22 | variable_shadow2(...) | main.rs:855:5:855:19 | ExprStmt | | +| main.rs:854:5:854:23 | ExprStmt | main.rs:854:5:854:20 | variable_shadow2 | | +| main.rs:855:5:855:16 | let_pattern1 | main.rs:855:5:855:18 | let_pattern1(...) | | +| main.rs:855:5:855:18 | let_pattern1(...) | main.rs:856:5:856:19 | ExprStmt | | +| main.rs:855:5:855:19 | ExprStmt | main.rs:855:5:855:16 | let_pattern1 | | +| main.rs:856:5:856:16 | let_pattern2 | main.rs:856:5:856:18 | let_pattern2(...) | | +| main.rs:856:5:856:18 | let_pattern2(...) | main.rs:857:5:857:19 | ExprStmt | | +| main.rs:856:5:856:19 | ExprStmt | main.rs:856:5:856:16 | let_pattern2 | | +| main.rs:857:5:857:16 | let_pattern3 | main.rs:857:5:857:18 | let_pattern3(...) | | +| main.rs:857:5:857:18 | let_pattern3(...) | main.rs:858:5:858:19 | ExprStmt | | +| main.rs:857:5:857:19 | ExprStmt | main.rs:857:5:857:16 | let_pattern3 | | +| main.rs:858:5:858:16 | let_pattern4 | main.rs:858:5:858:18 | let_pattern4(...) | | +| main.rs:858:5:858:18 | let_pattern4(...) | main.rs:859:5:859:19 | ExprStmt | | +| main.rs:858:5:858:19 | ExprStmt | main.rs:858:5:858:16 | let_pattern4 | | +| main.rs:859:5:859:16 | let_pattern5 | main.rs:859:5:859:18 | let_pattern5(...) | | +| main.rs:859:5:859:18 | let_pattern5(...) | main.rs:860:5:860:19 | ExprStmt | | +| main.rs:859:5:859:19 | ExprStmt | main.rs:859:5:859:16 | let_pattern5 | | +| main.rs:860:5:860:16 | let_pattern6 | main.rs:860:5:860:18 | let_pattern6(...) | | +| main.rs:860:5:860:18 | let_pattern6(...) | main.rs:861:5:861:21 | ExprStmt | | +| main.rs:860:5:860:19 | ExprStmt | main.rs:860:5:860:16 | let_pattern6 | | +| main.rs:861:5:861:18 | match_pattern1 | main.rs:861:5:861:20 | match_pattern1(...) | | +| main.rs:861:5:861:20 | match_pattern1(...) | main.rs:862:5:862:21 | ExprStmt | | +| main.rs:861:5:861:21 | ExprStmt | main.rs:861:5:861:18 | match_pattern1 | | +| main.rs:862:5:862:18 | match_pattern2 | main.rs:862:5:862:20 | match_pattern2(...) | | +| main.rs:862:5:862:20 | match_pattern2(...) | main.rs:863:5:863:21 | ExprStmt | | +| main.rs:862:5:862:21 | ExprStmt | main.rs:862:5:862:18 | match_pattern2 | | +| main.rs:863:5:863:18 | match_pattern3 | main.rs:863:5:863:20 | match_pattern3(...) | | +| main.rs:863:5:863:20 | match_pattern3(...) | main.rs:864:5:864:21 | ExprStmt | | +| main.rs:863:5:863:21 | ExprStmt | main.rs:863:5:863:18 | match_pattern3 | | +| main.rs:864:5:864:18 | match_pattern4 | main.rs:864:5:864:20 | match_pattern4(...) | | +| main.rs:864:5:864:20 | match_pattern4(...) | main.rs:865:5:865:21 | ExprStmt | | +| main.rs:864:5:864:21 | ExprStmt | main.rs:864:5:864:18 | match_pattern4 | | +| main.rs:865:5:865:18 | match_pattern5 | main.rs:865:5:865:20 | match_pattern5(...) | | +| main.rs:865:5:865:20 | match_pattern5(...) | main.rs:866:5:866:21 | ExprStmt | | +| main.rs:865:5:865:21 | ExprStmt | main.rs:865:5:865:18 | match_pattern5 | | +| main.rs:866:5:866:18 | match_pattern6 | main.rs:866:5:866:20 | match_pattern6(...) | | +| main.rs:866:5:866:20 | match_pattern6(...) | main.rs:867:5:867:21 | ExprStmt | | +| main.rs:866:5:866:21 | ExprStmt | main.rs:866:5:866:18 | match_pattern6 | | +| main.rs:867:5:867:18 | match_pattern7 | main.rs:867:5:867:20 | match_pattern7(...) | | +| main.rs:867:5:867:20 | match_pattern7(...) | main.rs:868:5:868:21 | ExprStmt | | +| main.rs:867:5:867:21 | ExprStmt | main.rs:867:5:867:18 | match_pattern7 | | +| main.rs:868:5:868:18 | match_pattern8 | main.rs:868:5:868:20 | match_pattern8(...) | | +| main.rs:868:5:868:20 | match_pattern8(...) | main.rs:869:5:869:21 | ExprStmt | | +| main.rs:868:5:868:21 | ExprStmt | main.rs:868:5:868:18 | match_pattern8 | | +| main.rs:869:5:869:18 | match_pattern9 | main.rs:869:5:869:20 | match_pattern9(...) | | +| main.rs:869:5:869:20 | match_pattern9(...) | main.rs:870:5:870:22 | ExprStmt | | +| main.rs:869:5:869:21 | ExprStmt | main.rs:869:5:869:18 | match_pattern9 | | +| main.rs:870:5:870:19 | match_pattern10 | main.rs:870:5:870:21 | match_pattern10(...) | | +| main.rs:870:5:870:21 | match_pattern10(...) | main.rs:871:5:871:22 | ExprStmt | | +| main.rs:870:5:870:22 | ExprStmt | main.rs:870:5:870:19 | match_pattern10 | | +| main.rs:871:5:871:19 | match_pattern11 | main.rs:871:5:871:21 | match_pattern11(...) | | +| main.rs:871:5:871:21 | match_pattern11(...) | main.rs:872:5:872:22 | ExprStmt | | +| main.rs:871:5:871:22 | ExprStmt | main.rs:871:5:871:19 | match_pattern11 | | +| main.rs:872:5:872:19 | match_pattern12 | main.rs:872:5:872:21 | match_pattern12(...) | | +| main.rs:872:5:872:21 | match_pattern12(...) | main.rs:873:5:873:22 | ExprStmt | | +| main.rs:872:5:872:22 | ExprStmt | main.rs:872:5:872:19 | match_pattern12 | | +| main.rs:873:5:873:19 | match_pattern13 | main.rs:873:5:873:21 | match_pattern13(...) | | +| main.rs:873:5:873:21 | match_pattern13(...) | main.rs:874:5:874:22 | ExprStmt | | +| main.rs:873:5:873:22 | ExprStmt | main.rs:873:5:873:19 | match_pattern13 | | +| main.rs:874:5:874:19 | match_pattern14 | main.rs:874:5:874:21 | match_pattern14(...) | | +| main.rs:874:5:874:21 | match_pattern14(...) | main.rs:875:5:875:22 | ExprStmt | | +| main.rs:874:5:874:22 | ExprStmt | main.rs:874:5:874:19 | match_pattern14 | | +| main.rs:875:5:875:19 | match_pattern15 | main.rs:875:5:875:21 | match_pattern15(...) | | +| main.rs:875:5:875:21 | match_pattern15(...) | main.rs:876:5:876:22 | ExprStmt | | +| main.rs:875:5:875:22 | ExprStmt | main.rs:875:5:875:19 | match_pattern15 | | +| main.rs:876:5:876:19 | match_pattern16 | main.rs:876:5:876:21 | match_pattern16(...) | | +| main.rs:876:5:876:21 | match_pattern16(...) | main.rs:877:5:877:36 | ExprStmt | | +| main.rs:876:5:876:22 | ExprStmt | main.rs:876:5:876:19 | match_pattern16 | | +| main.rs:877:5:877:18 | param_pattern1 | main.rs:877:20:877:22 | "a" | | +| main.rs:877:5:877:35 | param_pattern1(...) | main.rs:878:5:878:37 | ExprStmt | | +| main.rs:877:5:877:36 | ExprStmt | main.rs:877:5:877:18 | param_pattern1 | | +| main.rs:877:20:877:22 | "a" | main.rs:877:26:877:28 | "b" | | +| main.rs:877:25:877:34 | TupleExpr | main.rs:877:5:877:35 | param_pattern1(...) | | +| main.rs:877:26:877:28 | "b" | main.rs:877:31:877:33 | "c" | | +| main.rs:877:31:877:33 | "c" | main.rs:877:25:877:34 | TupleExpr | | +| main.rs:878:5:878:18 | param_pattern2 | main.rs:878:20:878:31 | ...::Left | | +| main.rs:878:5:878:36 | param_pattern2(...) | main.rs:879:5:879:26 | ExprStmt | | +| main.rs:878:5:878:37 | ExprStmt | main.rs:878:5:878:18 | param_pattern2 | | +| main.rs:878:20:878:31 | ...::Left | main.rs:878:33:878:34 | 45 | | +| main.rs:878:20:878:35 | ...::Left(...) | main.rs:878:5:878:36 | param_pattern2(...) | | +| main.rs:878:33:878:34 | 45 | main.rs:878:20:878:35 | ...::Left(...) | | +| main.rs:879:5:879:23 | destruct_assignment | main.rs:879:5:879:25 | destruct_assignment(...) | | +| main.rs:879:5:879:25 | destruct_assignment(...) | main.rs:880:5:880:23 | ExprStmt | | +| main.rs:879:5:879:26 | ExprStmt | main.rs:879:5:879:23 | destruct_assignment | | +| main.rs:880:5:880:20 | closure_variable | main.rs:880:5:880:22 | closure_variable(...) | | +| main.rs:880:5:880:22 | closure_variable(...) | main.rs:881:5:881:22 | ExprStmt | | +| main.rs:880:5:880:23 | ExprStmt | main.rs:880:5:880:20 | closure_variable | | +| main.rs:881:5:881:19 | nested_function | main.rs:881:5:881:21 | nested_function(...) | | +| main.rs:881:5:881:21 | nested_function(...) | main.rs:882:5:882:19 | ExprStmt | | +| main.rs:881:5:881:22 | ExprStmt | main.rs:881:5:881:19 | nested_function | | +| main.rs:882:5:882:16 | for_variable | main.rs:882:5:882:18 | for_variable(...) | | +| main.rs:882:5:882:18 | for_variable(...) | main.rs:883:5:883:17 | ExprStmt | | +| main.rs:882:5:882:19 | ExprStmt | main.rs:882:5:882:16 | for_variable | | +| main.rs:883:5:883:14 | add_assign | main.rs:883:5:883:16 | add_assign(...) | | +| main.rs:883:5:883:16 | add_assign(...) | main.rs:884:5:884:13 | ExprStmt | | +| main.rs:883:5:883:17 | ExprStmt | main.rs:883:5:883:14 | add_assign | | +| main.rs:884:5:884:10 | mutate | main.rs:884:5:884:12 | mutate(...) | | +| main.rs:884:5:884:12 | mutate(...) | main.rs:885:5:885:17 | ExprStmt | | +| main.rs:884:5:884:13 | ExprStmt | main.rs:884:5:884:10 | mutate | | +| main.rs:885:5:885:14 | mutate_arg | main.rs:885:5:885:16 | mutate_arg(...) | | +| main.rs:885:5:885:16 | mutate_arg(...) | main.rs:886:5:886:12 | ExprStmt | | +| main.rs:885:5:885:17 | ExprStmt | main.rs:885:5:885:14 | mutate_arg | | +| main.rs:886:5:886:9 | alias | main.rs:886:5:886:11 | alias(...) | | +| main.rs:886:5:886:11 | alias(...) | main.rs:887:5:887:18 | ExprStmt | | +| main.rs:886:5:886:12 | ExprStmt | main.rs:886:5:886:9 | alias | | +| main.rs:887:5:887:15 | capture_mut | main.rs:887:5:887:17 | capture_mut(...) | | +| main.rs:887:5:887:17 | capture_mut(...) | main.rs:888:5:888:20 | ExprStmt | | +| main.rs:887:5:887:18 | ExprStmt | main.rs:887:5:887:15 | capture_mut | | +| main.rs:888:5:888:17 | capture_immut | main.rs:888:5:888:19 | capture_immut(...) | | +| main.rs:888:5:888:19 | capture_immut(...) | main.rs:889:5:889:26 | ExprStmt | | +| main.rs:888:5:888:20 | ExprStmt | main.rs:888:5:888:17 | capture_immut | | +| main.rs:889:5:889:23 | async_block_capture | main.rs:889:5:889:25 | async_block_capture(...) | | +| main.rs:889:5:889:25 | async_block_capture(...) | main.rs:890:5:890:14 | ExprStmt | | +| main.rs:889:5:889:26 | ExprStmt | main.rs:889:5:889:23 | async_block_capture | | +| main.rs:890:5:890:11 | structs | main.rs:890:5:890:13 | structs(...) | | +| main.rs:890:5:890:13 | structs(...) | main.rs:891:5:891:14 | ExprStmt | | +| main.rs:890:5:890:14 | ExprStmt | main.rs:890:5:890:11 | structs | | +| main.rs:891:5:891:11 | ref_arg | main.rs:891:5:891:13 | ref_arg(...) | | +| main.rs:891:5:891:13 | ref_arg(...) | main.rs:892:5:892:30 | ExprStmt | | +| main.rs:891:5:891:14 | ExprStmt | main.rs:891:5:891:11 | ref_arg | | +| main.rs:892:5:892:27 | ref_methodcall_receiver | main.rs:892:5:892:29 | ref_methodcall_receiver(...) | | +| main.rs:892:5:892:29 | ref_methodcall_receiver(...) | main.rs:893:5:893:23 | ExprStmt | | +| main.rs:892:5:892:30 | ExprStmt | main.rs:892:5:892:27 | ref_methodcall_receiver | | +| main.rs:893:5:893:20 | macro_invocation | main.rs:893:5:893:22 | macro_invocation(...) | | +| main.rs:893:5:893:22 | macro_invocation(...) | main.rs:894:5:894:18 | ExprStmt | | +| main.rs:893:5:893:23 | ExprStmt | main.rs:893:5:893:20 | macro_invocation | | +| main.rs:894:5:894:15 | capture_phi | main.rs:894:5:894:17 | capture_phi(...) | | +| main.rs:894:5:894:17 | capture_phi(...) | main.rs:895:5:895:27 | ExprStmt | | +| main.rs:894:5:894:18 | ExprStmt | main.rs:894:5:894:15 | capture_phi | | +| main.rs:895:5:895:24 | let_in_block_in_cond | main.rs:895:5:895:26 | let_in_block_in_cond(...) | | +| main.rs:895:5:895:26 | let_in_block_in_cond(...) | main.rs:849:11:896:1 | { ... } | | +| main.rs:895:5:895:27 | ExprStmt | main.rs:895:5:895:24 | let_in_block_in_cond | | breakTarget -| main.rs:326:9:326:13 | break | main.rs:317:5:327:5 | while ... { ... } | +| main.rs:361:9:361:13 | break | main.rs:352:5:362:5 | while ... { ... } | continueTarget diff --git a/rust/ql/test/library-tests/variables/Ssa.expected b/rust/ql/test/library-tests/variables/Ssa.expected index 0acf3e94c5b5..a5583df8be4d 100644 --- a/rust/ql/test/library-tests/variables/Ssa.expected +++ b/rust/ql/test/library-tests/variables/Ssa.expected @@ -24,185 +24,197 @@ definition | main.rs:100:9:100:9 | x | main.rs:100:9:100:9 | x | | main.rs:101:14:101:14 | x | main.rs:101:14:101:14 | x | | main.rs:104:13:104:13 | x | main.rs:104:13:104:13 | x | -| main.rs:113:9:113:10 | s1 | main.rs:113:9:113:10 | s1 | -| main.rs:115:24:115:25 | s2 | main.rs:115:24:115:25 | s2 | -| main.rs:122:9:122:10 | x6 | main.rs:122:9:122:10 | x6 | -| main.rs:123:9:123:10 | y1 | main.rs:123:9:123:10 | y1 | -| main.rs:127:14:127:15 | y1 | main.rs:127:14:127:15 | y1 | -| main.rs:139:9:139:15 | numbers | main.rs:139:9:139:15 | numbers | -| main.rs:144:13:144:17 | first | main.rs:144:13:144:17 | first | -| main.rs:146:13:146:17 | third | main.rs:146:13:146:17 | third | -| main.rs:148:13:148:17 | fifth | main.rs:148:13:148:17 | fifth | -| main.rs:159:13:159:17 | first | main.rs:159:13:159:17 | first | -| main.rs:161:13:161:16 | last | main.rs:161:13:161:16 | last | -| main.rs:170:9:170:10 | p2 | main.rs:170:9:170:10 | p2 | -| main.rs:174:16:174:17 | x7 | main.rs:174:16:174:17 | x7 | -| main.rs:184:9:184:11 | msg | main.rs:184:9:184:11 | msg | -| main.rs:189:17:189:27 | id_variable | main.rs:189:17:189:27 | id_variable | -| main.rs:194:26:194:27 | id | main.rs:194:26:194:27 | id | -| main.rs:208:9:208:14 | either | main.rs:208:9:208:14 | either | -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | -| main.rs:210:22:210:23 | a3 | main.rs:210:9:210:44 | a3 | -| main.rs:210:42:210:43 | a3 | main.rs:210:9:210:44 | a3 | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:9:224:81 | a4 | -| main.rs:224:28:224:29 | a4 | main.rs:224:9:224:81 | a4 | -| main.rs:224:54:224:55 | a4 | main.rs:224:9:224:81 | a4 | -| main.rs:224:79:224:80 | a4 | main.rs:224:9:224:81 | a4 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:9:228:83 | a5 | -| main.rs:228:10:228:57 | [match(true)] SSA phi(a5) | main.rs:228:9:228:83 | a5 | -| main.rs:228:29:228:30 | a5 | main.rs:228:9:228:83 | a5 | -| main.rs:228:55:228:56 | a5 | main.rs:228:9:228:83 | a5 | -| main.rs:228:81:228:82 | a5 | main.rs:228:9:228:83 | a5 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | -| main.rs:232:28:232:29 | a6 | main.rs:232:9:232:83 | a6 | -| main.rs:232:35:232:82 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | -| main.rs:232:55:232:56 | a6 | main.rs:232:9:232:83 | a6 | -| main.rs:232:80:232:81 | a6 | main.rs:232:9:232:83 | a6 | -| main.rs:238:9:238:14 | either | main.rs:238:9:238:14 | either | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | -| main.rs:240:22:240:23 | a7 | main.rs:240:9:240:44 | a7 | -| main.rs:240:42:240:43 | a7 | main.rs:240:9:240:44 | a7 | -| main.rs:248:9:248:14 | either | main.rs:248:9:248:14 | either | -| main.rs:251:13:251:13 | e | main.rs:251:13:251:13 | e | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:14:252:51 | a11 | -| main.rs:252:27:252:29 | a11 | main.rs:252:14:252:51 | a11 | -| main.rs:252:48:252:50 | a11 | main.rs:252:14:252:51 | a11 | -| main.rs:255:33:255:35 | a12 | main.rs:255:33:255:35 | a12 | -| main.rs:272:9:272:10 | fv | main.rs:272:9:272:10 | fv | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:9:274:109 | a13 | -| main.rs:274:27:274:29 | a13 | main.rs:274:9:274:109 | a13 | -| main.rs:274:35:274:82 | [match(true)] SSA phi(a13) | main.rs:274:9:274:109 | a13 | -| main.rs:274:54:274:56 | a13 | main.rs:274:9:274:109 | a13 | -| main.rs:274:79:274:81 | a13 | main.rs:274:9:274:109 | a13 | -| main.rs:274:106:274:108 | a13 | main.rs:274:9:274:109 | a13 | -| main.rs:281:9:281:9 | x | main.rs:281:9:281:9 | x | -| main.rs:282:17:282:17 | x | main.rs:282:17:282:17 | x | -| main.rs:289:13:289:13 | x | main.rs:289:13:289:13 | x | -| main.rs:297:9:297:9 | x | main.rs:297:9:297:9 | x | -| main.rs:298:17:298:17 | x | main.rs:298:17:298:17 | x | -| main.rs:301:14:301:14 | x | main.rs:301:14:301:14 | x | -| main.rs:308:13:308:13 | x | main.rs:308:13:308:13 | x | +| main.rs:113:9:113:9 | s | main.rs:113:9:113:9 | s | +| main.rs:115:24:115:24 | s | main.rs:115:24:115:24 | s | +| main.rs:123:17:123:17 | x | main.rs:123:17:123:17 | x | +| main.rs:124:19:124:19 | x | main.rs:124:19:124:19 | x | +| main.rs:133:9:133:9 | x | main.rs:133:9:133:9 | x | +| main.rs:134:12:134:12 | x | main.rs:134:12:134:12 | x | +| main.rs:136:12:136:12 | x | main.rs:136:12:136:12 | x | +| main.rs:138:12:138:12 | x | main.rs:138:12:138:12 | x | +| main.rs:140:12:140:12 | x | main.rs:140:12:140:12 | x | +| main.rs:142:12:142:12 | x | main.rs:142:12:142:12 | x | +| main.rs:144:12:144:12 | x | main.rs:144:12:144:12 | x | +| main.rs:146:12:146:12 | x | main.rs:146:12:146:12 | x | +| main.rs:157:9:157:10 | x6 | main.rs:157:9:157:10 | x6 | +| main.rs:158:9:158:10 | y1 | main.rs:158:9:158:10 | y1 | +| main.rs:162:14:162:15 | y1 | main.rs:162:14:162:15 | y1 | +| main.rs:174:9:174:15 | numbers | main.rs:174:9:174:15 | numbers | +| main.rs:179:13:179:17 | first | main.rs:179:13:179:17 | first | +| main.rs:181:13:181:17 | third | main.rs:181:13:181:17 | third | +| main.rs:183:13:183:17 | fifth | main.rs:183:13:183:17 | fifth | +| main.rs:194:13:194:17 | first | main.rs:194:13:194:17 | first | +| main.rs:196:13:196:16 | last | main.rs:196:13:196:16 | last | +| main.rs:205:9:205:10 | p2 | main.rs:205:9:205:10 | p2 | +| main.rs:209:16:209:17 | x7 | main.rs:209:16:209:17 | x7 | +| main.rs:219:9:219:11 | msg | main.rs:219:9:219:11 | msg | +| main.rs:224:17:224:27 | id_variable | main.rs:224:17:224:27 | id_variable | +| main.rs:229:26:229:27 | id | main.rs:229:26:229:27 | id | +| main.rs:243:9:243:14 | either | main.rs:243:9:243:14 | either | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:9:245:44 | a3 | +| main.rs:245:22:245:23 | a3 | main.rs:245:9:245:44 | a3 | +| main.rs:245:42:245:43 | a3 | main.rs:245:9:245:44 | a3 | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:9:259:81 | a4 | +| main.rs:259:28:259:29 | a4 | main.rs:259:9:259:81 | a4 | +| main.rs:259:54:259:55 | a4 | main.rs:259:9:259:81 | a4 | +| main.rs:259:79:259:80 | a4 | main.rs:259:9:259:81 | a4 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:9:263:83 | a5 | +| main.rs:263:10:263:57 | [match(true)] SSA phi(a5) | main.rs:263:9:263:83 | a5 | +| main.rs:263:29:263:30 | a5 | main.rs:263:9:263:83 | a5 | +| main.rs:263:55:263:56 | a5 | main.rs:263:9:263:83 | a5 | +| main.rs:263:81:263:82 | a5 | main.rs:263:9:263:83 | a5 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | +| main.rs:267:28:267:29 | a6 | main.rs:267:9:267:83 | a6 | +| main.rs:267:35:267:82 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | +| main.rs:267:55:267:56 | a6 | main.rs:267:9:267:83 | a6 | +| main.rs:267:80:267:81 | a6 | main.rs:267:9:267:83 | a6 | +| main.rs:273:9:273:14 | either | main.rs:273:9:273:14 | either | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | +| main.rs:275:22:275:23 | a7 | main.rs:275:9:275:44 | a7 | +| main.rs:275:42:275:43 | a7 | main.rs:275:9:275:44 | a7 | +| main.rs:283:9:283:14 | either | main.rs:283:9:283:14 | either | +| main.rs:286:13:286:13 | e | main.rs:286:13:286:13 | e | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:14:287:51 | a11 | +| main.rs:287:27:287:29 | a11 | main.rs:287:14:287:51 | a11 | +| main.rs:287:48:287:50 | a11 | main.rs:287:14:287:51 | a11 | +| main.rs:290:33:290:35 | a12 | main.rs:290:33:290:35 | a12 | +| main.rs:307:9:307:10 | fv | main.rs:307:9:307:10 | fv | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:9:309:109 | a13 | +| main.rs:309:27:309:29 | a13 | main.rs:309:9:309:109 | a13 | +| main.rs:309:35:309:82 | [match(true)] SSA phi(a13) | main.rs:309:9:309:109 | a13 | +| main.rs:309:54:309:56 | a13 | main.rs:309:9:309:109 | a13 | +| main.rs:309:79:309:81 | a13 | main.rs:309:9:309:109 | a13 | +| main.rs:309:106:309:108 | a13 | main.rs:309:9:309:109 | a13 | | main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | -| main.rs:317:20:317:20 | x | main.rs:317:20:317:20 | x | -| main.rs:320:14:320:14 | x | main.rs:320:14:320:14 | x | -| main.rs:334:9:334:9 | x | main.rs:334:9:334:9 | x | +| main.rs:317:17:317:17 | x | main.rs:317:17:317:17 | x | +| main.rs:324:13:324:13 | x | main.rs:324:13:324:13 | x | +| main.rs:332:9:332:9 | x | main.rs:332:9:332:9 | x | +| main.rs:333:17:333:17 | x | main.rs:333:17:333:17 | x | | main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | -| main.rs:337:20:337:20 | x | main.rs:337:20:337:20 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | -| main.rs:349:16:349:16 | x | main.rs:349:16:349:16 | x | -| main.rs:354:20:354:20 | x | main.rs:354:20:354:20 | x | -| main.rs:364:9:364:9 | x | main.rs:364:9:364:9 | x | -| main.rs:366:18:366:18 | x | main.rs:366:18:366:18 | x | -| main.rs:373:9:373:9 | x | main.rs:373:9:373:9 | x | -| main.rs:375:14:375:14 | y | main.rs:375:14:375:14 | y | -| main.rs:376:25:376:25 | y | main.rs:376:25:376:25 | y | -| main.rs:384:5:384:6 | a8 | main.rs:384:5:384:6 | a8 | -| main.rs:386:9:386:10 | b3 | main.rs:386:9:386:10 | b3 | -| main.rs:387:9:387:10 | c1 | main.rs:387:9:387:10 | c1 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:20:395:55 | a9 | -| main.rs:395:33:395:34 | a9 | main.rs:395:20:395:55 | a9 | -| main.rs:395:53:395:54 | a9 | main.rs:395:20:395:55 | a9 | -| main.rs:402:13:402:15 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:403:13:403:14 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:404:13:404:14 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:411:9:411:10 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:425:13:425:15 | a10 | main.rs:425:13:425:15 | a10 | -| main.rs:426:13:426:14 | b4 | main.rs:426:13:426:14 | b4 | -| main.rs:438:9:438:23 | example_closure | main.rs:438:9:438:23 | example_closure | -| main.rs:439:10:439:10 | x | main.rs:439:10:439:10 | x | -| main.rs:441:9:441:10 | n1 | main.rs:441:9:441:10 | n1 | -| main.rs:446:9:446:26 | immutable_variable | main.rs:446:9:446:26 | immutable_variable | -| main.rs:447:6:447:6 | x | main.rs:447:6:447:6 | x | -| main.rs:449:9:449:10 | n2 | main.rs:449:9:449:10 | n2 | -| main.rs:456:9:456:9 | f | main.rs:456:9:456:9 | f | -| main.rs:457:10:457:10 | x | main.rs:457:10:457:10 | x | -| main.rs:461:10:461:10 | x | main.rs:461:10:461:10 | x | -| main.rs:470:14:470:14 | x | main.rs:470:14:470:14 | x | -| main.rs:479:13:479:13 | f | main.rs:479:13:479:13 | f | -| main.rs:480:14:480:14 | x | main.rs:480:14:480:14 | x | -| main.rs:487:9:487:9 | v | main.rs:487:9:487:9 | v | -| main.rs:489:9:489:12 | text | main.rs:489:9:489:12 | text | -| main.rs:496:13:496:13 | a | main.rs:496:13:496:13 | a | -| main.rs:497:5:497:5 | a | main.rs:496:13:496:13 | a | -| main.rs:499:6:499:11 | &mut a | main.rs:496:13:496:13 | a | -| main.rs:504:13:504:13 | i | main.rs:504:13:504:13 | i | -| main.rs:505:9:505:13 | ref_i | main.rs:505:9:505:13 | ref_i | -| main.rs:506:9:506:14 | &mut i | main.rs:504:13:504:13 | i | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | -| main.rs:518:38:518:38 | y | main.rs:518:38:518:38 | y | -| main.rs:527:13:527:13 | x | main.rs:527:13:527:13 | x | -| main.rs:528:9:528:9 | y | main.rs:528:9:528:9 | y | -| main.rs:529:22:529:27 | &mut x | main.rs:527:13:527:13 | x | -| main.rs:535:13:535:13 | z | main.rs:535:13:535:13 | z | -| main.rs:536:9:536:9 | w | main.rs:536:9:536:9 | w | -| main.rs:539:9:539:14 | &mut z | main.rs:535:13:535:13 | z | -| main.rs:549:13:549:13 | x | main.rs:549:13:549:13 | x | -| main.rs:550:9:550:9 | y | main.rs:550:9:550:9 | y | -| main.rs:551:9:551:14 | &mut x | main.rs:549:13:549:13 | x | -| main.rs:557:9:557:9 | x | main.rs:557:9:557:9 | x | -| main.rs:560:9:560:11 | cap | main.rs:560:9:560:11 | cap | -| main.rs:560:15:562:5 | x | main.rs:557:9:557:9 | x | -| main.rs:568:13:568:13 | x | main.rs:568:13:568:13 | x | -| main.rs:571:9:571:16 | closure1 | main.rs:571:9:571:16 | closure1 | -| main.rs:571:20:573:5 | x | main.rs:568:13:568:13 | x | -| main.rs:577:13:577:13 | y | main.rs:577:13:577:13 | y | -| main.rs:580:13:580:20 | closure2 | main.rs:580:13:580:20 | closure2 | -| main.rs:581:9:581:9 | y | main.rs:577:13:577:13 | y | -| main.rs:583:5:583:14 | y | main.rs:577:13:577:13 | y | -| main.rs:586:13:586:13 | z | main.rs:586:13:586:13 | z | -| main.rs:589:13:589:20 | closure3 | main.rs:589:13:589:20 | closure3 | -| main.rs:589:24:591:5 | z | main.rs:586:13:586:13 | z | -| main.rs:597:13:597:13 | i | main.rs:597:13:597:13 | i | -| main.rs:598:9:598:13 | block | main.rs:598:9:598:13 | block | -| main.rs:599:9:599:9 | i | main.rs:597:13:597:13 | i | -| main.rs:602:5:602:15 | i | main.rs:597:13:597:13 | i | -| main.rs:606:8:606:8 | b | main.rs:606:8:606:8 | b | -| main.rs:607:13:607:13 | x | main.rs:607:13:607:13 | x | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:607:13:607:13 | x | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | -| main.rs:624:13:624:14 | b1 | main.rs:624:13:624:14 | b1 | -| main.rs:624:23:624:24 | b2 | main.rs:624:23:624:24 | b2 | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | -| main.rs:648:20:648:23 | self | main.rs:648:20:648:23 | self | -| main.rs:652:11:652:14 | self | main.rs:652:11:652:14 | self | -| main.rs:656:23:656:26 | self | main.rs:656:23:656:26 | self | -| main.rs:657:17:657:17 | f | main.rs:657:17:657:17 | f | -| main.rs:657:21:660:9 | self | main.rs:656:23:656:26 | self | -| main.rs:657:22:657:22 | n | main.rs:657:22:657:22 | n | -| main.rs:667:13:667:13 | a | main.rs:667:13:667:13 | a | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | -| main.rs:671:5:671:5 | a | main.rs:667:13:667:13 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | -| main.rs:680:5:680:5 | a | main.rs:676:13:676:13 | a | -| main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | -| main.rs:689:9:689:9 | z | main.rs:689:9:689:9 | z | -| main.rs:698:17:698:20 | self | main.rs:698:17:698:20 | self | -| main.rs:704:13:704:13 | a | main.rs:704:13:704:13 | a | -| main.rs:705:5:705:5 | a | main.rs:704:13:704:13 | a | -| main.rs:726:9:726:22 | var_from_macro | main.rs:726:9:726:22 | var_from_macro | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | -| main.rs:729:9:729:20 | var_in_macro | main.rs:729:9:729:20 | var_in_macro | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | var_in_macro | -| main.rs:740:5:740:5 | x | main.rs:739:9:739:9 | x | -| main.rs:745:13:745:13 | x | main.rs:745:13:745:13 | x | -| main.rs:746:13:746:15 | cap | main.rs:746:13:746:15 | cap | -| main.rs:746:19:751:5 | x | main.rs:745:13:745:13 | x | -| main.rs:746:20:746:20 | b | main.rs:746:20:746:20 | b | -| main.rs:748:17:750:9 | SSA phi(x) | main.rs:745:13:745:13 | x | -| main.rs:749:13:749:13 | x | main.rs:745:13:745:13 | x | -| main.rs:752:5:752:13 | x | main.rs:745:13:745:13 | x | -| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | -| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | -| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | -| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | -| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | -| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | -| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | +| main.rs:343:13:343:13 | x | main.rs:343:13:343:13 | x | +| main.rs:351:9:351:9 | x | main.rs:351:9:351:9 | x | +| main.rs:352:20:352:20 | x | main.rs:352:20:352:20 | x | +| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | +| main.rs:369:9:369:9 | x | main.rs:369:9:369:9 | x | +| main.rs:371:14:371:14 | x | main.rs:371:14:371:14 | x | +| main.rs:372:20:372:20 | x | main.rs:372:20:372:20 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | +| main.rs:384:16:384:16 | x | main.rs:384:16:384:16 | x | +| main.rs:389:20:389:20 | x | main.rs:389:20:389:20 | x | +| main.rs:399:9:399:9 | x | main.rs:399:9:399:9 | x | +| main.rs:401:18:401:18 | x | main.rs:401:18:401:18 | x | +| main.rs:408:9:408:9 | x | main.rs:408:9:408:9 | x | +| main.rs:410:14:410:14 | y | main.rs:410:14:410:14 | y | +| main.rs:412:22:412:22 | y | main.rs:412:22:412:22 | y | +| main.rs:420:5:420:6 | a8 | main.rs:420:5:420:6 | a8 | +| main.rs:422:9:422:10 | b3 | main.rs:422:9:422:10 | b3 | +| main.rs:423:9:423:10 | c1 | main.rs:423:9:423:10 | c1 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:20:431:55 | a9 | +| main.rs:431:33:431:34 | a9 | main.rs:431:20:431:55 | a9 | +| main.rs:431:53:431:54 | a9 | main.rs:431:20:431:55 | a9 | +| main.rs:438:13:438:15 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:439:13:439:14 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:440:13:440:14 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:447:9:447:10 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:461:13:461:15 | a10 | main.rs:461:13:461:15 | a10 | +| main.rs:462:13:462:14 | b4 | main.rs:462:13:462:14 | b4 | +| main.rs:474:9:474:23 | example_closure | main.rs:474:9:474:23 | example_closure | +| main.rs:475:10:475:10 | x | main.rs:475:10:475:10 | x | +| main.rs:477:9:477:10 | n1 | main.rs:477:9:477:10 | n1 | +| main.rs:482:9:482:26 | immutable_variable | main.rs:482:9:482:26 | immutable_variable | +| main.rs:483:6:483:6 | x | main.rs:483:6:483:6 | x | +| main.rs:485:9:485:10 | n2 | main.rs:485:9:485:10 | n2 | +| main.rs:492:9:492:9 | f | main.rs:492:9:492:9 | f | +| main.rs:493:10:493:10 | x | main.rs:493:10:493:10 | x | +| main.rs:497:10:497:10 | x | main.rs:497:10:497:10 | x | +| main.rs:506:14:506:14 | x | main.rs:506:14:506:14 | x | +| main.rs:515:13:515:13 | f | main.rs:515:13:515:13 | f | +| main.rs:516:14:516:14 | x | main.rs:516:14:516:14 | x | +| main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | v | +| main.rs:525:9:525:12 | text | main.rs:525:9:525:12 | text | +| main.rs:532:13:532:13 | a | main.rs:532:13:532:13 | a | +| main.rs:533:5:533:5 | a | main.rs:532:13:532:13 | a | +| main.rs:535:6:535:11 | &mut a | main.rs:532:13:532:13 | a | +| main.rs:540:13:540:13 | i | main.rs:540:13:540:13 | i | +| main.rs:541:9:541:13 | ref_i | main.rs:541:9:541:13 | ref_i | +| main.rs:542:9:542:14 | &mut i | main.rs:540:13:540:13 | i | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | +| main.rs:554:38:554:38 | y | main.rs:554:38:554:38 | y | +| main.rs:563:13:563:13 | x | main.rs:563:13:563:13 | x | +| main.rs:564:9:564:9 | y | main.rs:564:9:564:9 | y | +| main.rs:565:22:565:27 | &mut x | main.rs:563:13:563:13 | x | +| main.rs:571:13:571:13 | z | main.rs:571:13:571:13 | z | +| main.rs:572:9:572:9 | w | main.rs:572:9:572:9 | w | +| main.rs:575:9:575:14 | &mut z | main.rs:571:13:571:13 | z | +| main.rs:585:13:585:13 | x | main.rs:585:13:585:13 | x | +| main.rs:586:9:586:9 | y | main.rs:586:9:586:9 | y | +| main.rs:587:9:587:14 | &mut x | main.rs:585:13:585:13 | x | +| main.rs:593:9:593:9 | x | main.rs:593:9:593:9 | x | +| main.rs:596:9:596:11 | cap | main.rs:596:9:596:11 | cap | +| main.rs:596:15:598:5 | x | main.rs:593:9:593:9 | x | +| main.rs:604:13:604:13 | x | main.rs:604:13:604:13 | x | +| main.rs:607:9:607:16 | closure1 | main.rs:607:9:607:16 | closure1 | +| main.rs:607:20:609:5 | x | main.rs:604:13:604:13 | x | +| main.rs:613:13:613:13 | y | main.rs:613:13:613:13 | y | +| main.rs:616:13:616:20 | closure2 | main.rs:616:13:616:20 | closure2 | +| main.rs:617:9:617:9 | y | main.rs:613:13:613:13 | y | +| main.rs:619:5:619:14 | y | main.rs:613:13:613:13 | y | +| main.rs:622:13:622:13 | z | main.rs:622:13:622:13 | z | +| main.rs:625:13:625:20 | closure3 | main.rs:625:13:625:20 | closure3 | +| main.rs:625:24:627:5 | z | main.rs:622:13:622:13 | z | +| main.rs:633:13:633:13 | i | main.rs:633:13:633:13 | i | +| main.rs:634:9:634:13 | block | main.rs:634:9:634:13 | block | +| main.rs:635:9:635:9 | i | main.rs:633:13:633:13 | i | +| main.rs:638:5:638:15 | i | main.rs:633:13:633:13 | i | +| main.rs:642:8:642:8 | b | main.rs:642:8:642:8 | b | +| main.rs:643:13:643:13 | x | main.rs:643:13:643:13 | x | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:643:13:643:13 | x | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | +| main.rs:660:13:660:14 | b1 | main.rs:660:13:660:14 | b1 | +| main.rs:660:23:660:24 | b2 | main.rs:660:23:660:24 | b2 | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | +| main.rs:684:20:684:23 | self | main.rs:684:20:684:23 | self | +| main.rs:688:11:688:14 | self | main.rs:688:11:688:14 | self | +| main.rs:692:23:692:26 | self | main.rs:692:23:692:26 | self | +| main.rs:693:17:693:17 | f | main.rs:693:17:693:17 | f | +| main.rs:693:21:696:9 | self | main.rs:692:23:692:26 | self | +| main.rs:693:22:693:22 | n | main.rs:693:22:693:22 | n | +| main.rs:703:13:703:13 | a | main.rs:703:13:703:13 | a | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | +| main.rs:707:5:707:5 | a | main.rs:703:13:703:13 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | +| main.rs:716:5:716:5 | a | main.rs:712:13:712:13 | a | +| main.rs:721:9:721:9 | x | main.rs:721:9:721:9 | x | +| main.rs:725:9:725:9 | z | main.rs:725:9:725:9 | z | +| main.rs:734:17:734:20 | self | main.rs:734:17:734:20 | self | +| main.rs:740:13:740:13 | a | main.rs:740:13:740:13 | a | +| main.rs:741:5:741:5 | a | main.rs:740:13:740:13 | a | +| main.rs:762:9:762:22 | var_from_macro | main.rs:762:9:762:22 | var_from_macro | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | +| main.rs:765:9:765:20 | var_in_macro | main.rs:765:9:765:20 | var_in_macro | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:15:770:28 | var_in_macro | +| main.rs:776:5:776:5 | x | main.rs:775:9:775:9 | x | +| main.rs:781:13:781:13 | x | main.rs:781:13:781:13 | x | +| main.rs:782:13:782:15 | cap | main.rs:782:13:782:15 | cap | +| main.rs:782:19:787:5 | x | main.rs:781:13:781:13 | x | +| main.rs:782:20:782:20 | b | main.rs:782:20:782:20 | b | +| main.rs:784:17:786:9 | SSA phi(x) | main.rs:781:13:781:13 | x | +| main.rs:785:13:785:13 | x | main.rs:781:13:781:13 | x | +| main.rs:788:5:788:13 | x | main.rs:781:13:781:13 | x | +| main.rs:795:13:795:13 | x | main.rs:795:13:795:13 | x | +| main.rs:796:13:796:13 | y | main.rs:796:13:796:13 | y | +| main.rs:805:13:805:16 | N0ne | main.rs:805:13:805:16 | N0ne | +| main.rs:812:13:812:22 | test_alias | main.rs:812:13:812:22 | test_alias | +| main.rs:814:13:814:16 | test | main.rs:814:13:814:16 | test | +| main.rs:823:13:823:13 | x | main.rs:823:13:823:13 | x | +| main.rs:825:18:825:18 | x | main.rs:825:18:825:18 | x | +| main.rs:838:9:838:9 | x | main.rs:838:9:838:9 | x | +| main.rs:840:13:840:13 | x | main.rs:840:13:840:13 | x | read | main.rs:5:14:5:14 | s | main.rs:5:14:5:14 | s | main.rs:7:20:7:20 | s | | main.rs:10:14:10:14 | i | main.rs:10:14:10:14 | i | main.rs:12:20:12:20 | i | @@ -233,192 +245,206 @@ read | main.rs:100:9:100:9 | x | main.rs:100:9:100:9 | x | main.rs:105:13:105:13 | x | | main.rs:101:14:101:14 | x | main.rs:101:14:101:14 | x | main.rs:109:15:109:15 | x | | main.rs:104:13:104:13 | x | main.rs:104:13:104:13 | x | main.rs:106:19:106:19 | x | -| main.rs:113:9:113:10 | s1 | main.rs:113:9:113:10 | s1 | main.rs:116:11:116:12 | s1 | -| main.rs:115:24:115:25 | s2 | main.rs:115:24:115:25 | s2 | main.rs:117:19:117:20 | s2 | -| main.rs:122:9:122:10 | x6 | main.rs:122:9:122:10 | x6 | main.rs:125:11:125:12 | x6 | -| main.rs:123:9:123:10 | y1 | main.rs:123:9:123:10 | y1 | main.rs:135:15:135:16 | y1 | -| main.rs:127:14:127:15 | y1 | main.rs:127:14:127:15 | y1 | main.rs:130:23:130:24 | y1 | -| main.rs:139:9:139:15 | numbers | main.rs:139:9:139:15 | numbers | main.rs:141:11:141:17 | numbers | -| main.rs:139:9:139:15 | numbers | main.rs:139:9:139:15 | numbers | main.rs:156:11:156:17 | numbers | -| main.rs:144:13:144:17 | first | main.rs:144:13:144:17 | first | main.rs:150:23:150:27 | first | -| main.rs:146:13:146:17 | third | main.rs:146:13:146:17 | third | main.rs:151:23:151:27 | third | -| main.rs:148:13:148:17 | fifth | main.rs:148:13:148:17 | fifth | main.rs:152:23:152:27 | fifth | -| main.rs:159:13:159:17 | first | main.rs:159:13:159:17 | first | main.rs:163:23:163:27 | first | -| main.rs:161:13:161:16 | last | main.rs:161:13:161:16 | last | main.rs:164:23:164:26 | last | -| main.rs:170:9:170:10 | p2 | main.rs:170:9:170:10 | p2 | main.rs:172:11:172:12 | p2 | -| main.rs:174:16:174:17 | x7 | main.rs:174:16:174:17 | x7 | main.rs:175:24:175:25 | x7 | -| main.rs:184:9:184:11 | msg | main.rs:184:9:184:11 | msg | main.rs:186:11:186:13 | msg | -| main.rs:189:17:189:27 | id_variable | main.rs:189:17:189:27 | id_variable | main.rs:190:24:190:34 | id_variable | -| main.rs:194:26:194:27 | id | main.rs:194:26:194:27 | id | main.rs:197:23:197:24 | id | -| main.rs:208:9:208:14 | either | main.rs:208:9:208:14 | either | main.rs:209:11:209:16 | either | -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | main.rs:211:26:211:27 | a3 | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | main.rs:223:11:223:12 | tv | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | main.rs:227:11:227:12 | tv | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | main.rs:231:11:231:12 | tv | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:9:224:81 | a4 | main.rs:225:26:225:27 | a4 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:9:228:83 | a5 | main.rs:229:26:229:27 | a5 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | main.rs:233:26:233:27 | a6 | -| main.rs:238:9:238:14 | either | main.rs:238:9:238:14 | either | main.rs:239:11:239:16 | either | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | main.rs:241:16:241:17 | a7 | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | main.rs:242:26:242:27 | a7 | -| main.rs:248:9:248:14 | either | main.rs:248:9:248:14 | either | main.rs:250:11:250:16 | either | -| main.rs:251:13:251:13 | e | main.rs:251:13:251:13 | e | main.rs:256:15:256:15 | e | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:14:252:51 | a11 | main.rs:254:23:254:25 | a11 | -| main.rs:255:33:255:35 | a12 | main.rs:255:33:255:35 | a12 | main.rs:257:28:257:30 | a12 | -| main.rs:272:9:272:10 | fv | main.rs:272:9:272:10 | fv | main.rs:273:11:273:12 | fv | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:275:26:275:28 | a13 | -| main.rs:281:9:281:9 | x | main.rs:281:9:281:9 | x | main.rs:283:7:283:7 | x | -| main.rs:281:9:281:9 | x | main.rs:281:9:281:9 | x | main.rs:290:13:290:13 | x | -| main.rs:282:17:282:17 | x | main.rs:282:17:282:17 | x | main.rs:285:5:285:5 | x | -| main.rs:282:17:282:17 | x | main.rs:282:17:282:17 | x | main.rs:287:19:287:19 | x | -| main.rs:289:13:289:13 | x | main.rs:289:13:289:13 | x | main.rs:291:19:291:19 | x | -| main.rs:297:9:297:9 | x | main.rs:297:9:297:9 | x | main.rs:299:7:299:7 | x | -| main.rs:297:9:297:9 | x | main.rs:297:9:297:9 | x | main.rs:309:13:309:13 | x | -| main.rs:298:17:298:17 | x | main.rs:298:17:298:17 | x | main.rs:302:12:302:12 | x | -| main.rs:301:14:301:14 | x | main.rs:301:14:301:14 | x | main.rs:304:5:304:5 | x | -| main.rs:301:14:301:14 | x | main.rs:301:14:301:14 | x | main.rs:306:19:306:19 | x | -| main.rs:308:13:308:13 | x | main.rs:308:13:308:13 | x | main.rs:310:19:310:19 | x | +| main.rs:113:9:113:9 | s | main.rs:113:9:113:9 | s | main.rs:116:11:116:11 | s | +| main.rs:115:24:115:24 | s | main.rs:115:24:115:24 | s | main.rs:117:19:117:19 | s | +| main.rs:123:17:123:17 | x | main.rs:123:17:123:17 | x | main.rs:125:25:125:25 | x | +| main.rs:124:19:124:19 | x | main.rs:124:19:124:19 | x | main.rs:127:19:127:19 | x | +| main.rs:133:9:133:9 | x | main.rs:133:9:133:9 | x | main.rs:135:9:135:9 | x | +| main.rs:134:12:134:12 | x | main.rs:134:12:134:12 | x | main.rs:137:9:137:9 | x | +| main.rs:136:12:136:12 | x | main.rs:136:12:136:12 | x | main.rs:139:9:139:9 | x | +| main.rs:138:12:138:12 | x | main.rs:138:12:138:12 | x | main.rs:141:9:141:9 | x | +| main.rs:140:12:140:12 | x | main.rs:140:12:140:12 | x | main.rs:143:9:143:9 | x | +| main.rs:142:12:142:12 | x | main.rs:142:12:142:12 | x | main.rs:145:9:145:9 | x | +| main.rs:144:12:144:12 | x | main.rs:144:12:144:12 | x | main.rs:147:9:147:9 | x | +| main.rs:146:12:146:12 | x | main.rs:146:12:146:12 | x | main.rs:149:19:149:19 | x | +| main.rs:157:9:157:10 | x6 | main.rs:157:9:157:10 | x6 | main.rs:160:11:160:12 | x6 | +| main.rs:158:9:158:10 | y1 | main.rs:158:9:158:10 | y1 | main.rs:170:15:170:16 | y1 | +| main.rs:162:14:162:15 | y1 | main.rs:162:14:162:15 | y1 | main.rs:165:23:165:24 | y1 | +| main.rs:174:9:174:15 | numbers | main.rs:174:9:174:15 | numbers | main.rs:176:11:176:17 | numbers | +| main.rs:174:9:174:15 | numbers | main.rs:174:9:174:15 | numbers | main.rs:191:11:191:17 | numbers | +| main.rs:179:13:179:17 | first | main.rs:179:13:179:17 | first | main.rs:185:23:185:27 | first | +| main.rs:181:13:181:17 | third | main.rs:181:13:181:17 | third | main.rs:186:23:186:27 | third | +| main.rs:183:13:183:17 | fifth | main.rs:183:13:183:17 | fifth | main.rs:187:23:187:27 | fifth | +| main.rs:194:13:194:17 | first | main.rs:194:13:194:17 | first | main.rs:198:23:198:27 | first | +| main.rs:196:13:196:16 | last | main.rs:196:13:196:16 | last | main.rs:199:23:199:26 | last | +| main.rs:205:9:205:10 | p2 | main.rs:205:9:205:10 | p2 | main.rs:207:11:207:12 | p2 | +| main.rs:209:16:209:17 | x7 | main.rs:209:16:209:17 | x7 | main.rs:210:24:210:25 | x7 | +| main.rs:219:9:219:11 | msg | main.rs:219:9:219:11 | msg | main.rs:221:11:221:13 | msg | +| main.rs:224:17:224:27 | id_variable | main.rs:224:17:224:27 | id_variable | main.rs:225:24:225:34 | id_variable | +| main.rs:229:26:229:27 | id | main.rs:229:26:229:27 | id | main.rs:232:23:232:24 | id | +| main.rs:243:9:243:14 | either | main.rs:243:9:243:14 | either | main.rs:244:11:244:16 | either | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:9:245:44 | a3 | main.rs:246:26:246:27 | a3 | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | main.rs:258:11:258:12 | tv | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | main.rs:262:11:262:12 | tv | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | main.rs:266:11:266:12 | tv | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:9:259:81 | a4 | main.rs:260:26:260:27 | a4 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:9:263:83 | a5 | main.rs:264:26:264:27 | a5 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | main.rs:268:26:268:27 | a6 | +| main.rs:273:9:273:14 | either | main.rs:273:9:273:14 | either | main.rs:274:11:274:16 | either | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | main.rs:276:16:276:17 | a7 | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | main.rs:277:26:277:27 | a7 | +| main.rs:283:9:283:14 | either | main.rs:283:9:283:14 | either | main.rs:285:11:285:16 | either | +| main.rs:286:13:286:13 | e | main.rs:286:13:286:13 | e | main.rs:291:15:291:15 | e | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:14:287:51 | a11 | main.rs:289:23:289:25 | a11 | +| main.rs:290:33:290:35 | a12 | main.rs:290:33:290:35 | a12 | main.rs:292:28:292:30 | a12 | +| main.rs:307:9:307:10 | fv | main.rs:307:9:307:10 | fv | main.rs:308:11:308:12 | fv | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:310:26:310:28 | a13 | | main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | main.rs:318:7:318:7 | x | -| main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | main.rs:329:15:329:15 | x | -| main.rs:317:20:317:20 | x | main.rs:317:20:317:20 | x | main.rs:321:12:321:12 | x | -| main.rs:320:14:320:14 | x | main.rs:320:14:320:14 | x | main.rs:323:5:323:5 | x | -| main.rs:320:14:320:14 | x | main.rs:320:14:320:14 | x | main.rs:325:19:325:19 | x | -| main.rs:334:9:334:9 | x | main.rs:334:9:334:9 | x | main.rs:335:11:335:11 | x | -| main.rs:334:9:334:9 | x | main.rs:334:9:334:9 | x | main.rs:343:15:343:15 | x | -| main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | main.rs:338:18:338:18 | x | -| main.rs:337:20:337:20 | x | main.rs:337:20:337:20 | x | main.rs:339:19:339:19 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | main.rs:350:7:350:7 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | main.rs:355:7:355:7 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | main.rs:359:19:359:19 | x | -| main.rs:349:16:349:16 | x | main.rs:349:16:349:16 | x | main.rs:352:19:352:19 | x | -| main.rs:354:20:354:20 | x | main.rs:354:20:354:20 | x | main.rs:357:19:357:19 | x | -| main.rs:364:9:364:9 | x | main.rs:364:9:364:9 | x | main.rs:365:11:365:11 | x | -| main.rs:366:18:366:18 | x | main.rs:366:18:366:18 | x | main.rs:367:20:367:20 | x | -| main.rs:373:9:373:9 | x | main.rs:373:9:373:9 | x | main.rs:374:11:374:11 | x | -| main.rs:375:14:375:14 | y | main.rs:375:14:375:14 | y | main.rs:377:22:377:22 | y | -| main.rs:376:25:376:25 | y | main.rs:376:25:376:25 | y | main.rs:378:26:378:26 | y | -| main.rs:384:5:384:6 | a8 | main.rs:384:5:384:6 | a8 | main.rs:390:15:390:16 | a8 | -| main.rs:386:9:386:10 | b3 | main.rs:386:9:386:10 | b3 | main.rs:391:15:391:16 | b3 | -| main.rs:387:9:387:10 | c1 | main.rs:387:9:387:10 | c1 | main.rs:392:15:392:16 | c1 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:20:395:55 | a9 | main.rs:397:15:397:16 | a9 | -| main.rs:402:13:402:15 | a10 | main.rs:402:13:402:15 | a10 | main.rs:406:15:406:17 | a10 | -| main.rs:402:13:402:15 | a10 | main.rs:402:13:402:15 | a10 | main.rs:415:9:415:11 | a10 | -| main.rs:403:13:403:14 | b4 | main.rs:403:13:403:14 | b4 | main.rs:407:15:407:16 | b4 | -| main.rs:403:13:403:14 | b4 | main.rs:403:13:403:14 | b4 | main.rs:416:9:416:10 | b4 | -| main.rs:404:13:404:14 | c2 | main.rs:404:13:404:14 | c2 | main.rs:408:15:408:16 | c2 | -| main.rs:404:13:404:14 | c2 | main.rs:404:13:404:14 | c2 | main.rs:417:9:417:10 | c2 | -| main.rs:411:9:411:10 | c2 | main.rs:404:13:404:14 | c2 | main.rs:421:15:421:16 | c2 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | main.rs:420:15:420:16 | b4 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | main.rs:434:15:434:16 | b4 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | main.rs:419:15:419:17 | a10 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | main.rs:433:15:433:17 | a10 | -| main.rs:425:13:425:15 | a10 | main.rs:425:13:425:15 | a10 | main.rs:428:23:428:25 | a10 | -| main.rs:426:13:426:14 | b4 | main.rs:426:13:426:14 | b4 | main.rs:429:23:429:24 | b4 | -| main.rs:438:9:438:23 | example_closure | main.rs:438:9:438:23 | example_closure | main.rs:442:9:442:23 | example_closure | -| main.rs:439:10:439:10 | x | main.rs:439:10:439:10 | x | main.rs:440:9:440:9 | x | -| main.rs:441:9:441:10 | n1 | main.rs:441:9:441:10 | n1 | main.rs:443:15:443:16 | n1 | -| main.rs:446:9:446:26 | immutable_variable | main.rs:446:9:446:26 | immutable_variable | main.rs:450:9:450:26 | immutable_variable | -| main.rs:447:6:447:6 | x | main.rs:447:6:447:6 | x | main.rs:448:9:448:9 | x | -| main.rs:449:9:449:10 | n2 | main.rs:449:9:449:10 | n2 | main.rs:451:15:451:16 | n2 | -| main.rs:456:9:456:9 | f | main.rs:456:9:456:9 | f | main.rs:459:15:459:15 | f | -| main.rs:456:9:456:9 | f | main.rs:456:9:456:9 | f | main.rs:466:15:466:15 | f | -| main.rs:457:10:457:10 | x | main.rs:457:10:457:10 | x | main.rs:458:9:458:9 | x | -| main.rs:461:10:461:10 | x | main.rs:461:10:461:10 | x | main.rs:463:9:463:9 | x | -| main.rs:470:14:470:14 | x | main.rs:470:14:470:14 | x | main.rs:472:17:472:17 | x | -| main.rs:479:13:479:13 | f | main.rs:479:13:479:13 | f | main.rs:482:19:482:19 | f | -| main.rs:480:14:480:14 | x | main.rs:480:14:480:14 | x | main.rs:481:13:481:13 | x | -| main.rs:487:9:487:9 | v | main.rs:487:9:487:9 | v | main.rs:490:12:490:12 | v | -| main.rs:489:9:489:12 | text | main.rs:489:9:489:12 | text | main.rs:491:19:491:22 | text | -| main.rs:496:13:496:13 | a | main.rs:496:13:496:13 | a | main.rs:497:5:497:5 | a | -| main.rs:497:5:497:5 | a | main.rs:496:13:496:13 | a | main.rs:498:15:498:15 | a | -| main.rs:497:5:497:5 | a | main.rs:496:13:496:13 | a | main.rs:499:11:499:11 | a | -| main.rs:499:6:499:11 | &mut a | main.rs:496:13:496:13 | a | main.rs:500:15:500:15 | a | -| main.rs:504:13:504:13 | i | main.rs:504:13:504:13 | i | main.rs:506:14:506:14 | i | -| main.rs:505:9:505:13 | ref_i | main.rs:505:9:505:13 | ref_i | main.rs:507:6:507:10 | ref_i | -| main.rs:506:9:506:14 | &mut i | main.rs:504:13:504:13 | i | main.rs:508:15:508:15 | i | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:512:6:512:6 | x | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:513:10:513:10 | x | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:514:10:514:10 | x | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:515:12:515:12 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:519:6:519:6 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:520:10:520:10 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:521:10:521:10 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:523:9:523:9 | x | -| main.rs:518:38:518:38 | y | main.rs:518:38:518:38 | y | main.rs:522:6:522:6 | y | -| main.rs:527:13:527:13 | x | main.rs:527:13:527:13 | x | main.rs:529:27:529:27 | x | -| main.rs:528:9:528:9 | y | main.rs:528:9:528:9 | y | main.rs:530:6:530:6 | y | -| main.rs:529:22:529:27 | &mut x | main.rs:527:13:527:13 | x | main.rs:533:15:533:15 | x | -| main.rs:529:22:529:27 | &mut x | main.rs:527:13:527:13 | x | main.rs:537:19:537:19 | x | -| main.rs:535:13:535:13 | z | main.rs:535:13:535:13 | z | main.rs:539:14:539:14 | z | -| main.rs:536:9:536:9 | w | main.rs:536:9:536:9 | w | main.rs:540:9:540:9 | w | -| main.rs:536:9:536:9 | w | main.rs:536:9:536:9 | w | main.rs:542:7:542:7 | w | -| main.rs:539:9:539:14 | &mut z | main.rs:535:13:535:13 | z | main.rs:545:15:545:15 | z | -| main.rs:549:13:549:13 | x | main.rs:549:13:549:13 | x | main.rs:551:14:551:14 | x | -| main.rs:550:9:550:9 | y | main.rs:550:9:550:9 | y | main.rs:552:6:552:6 | y | -| main.rs:551:9:551:14 | &mut x | main.rs:549:13:549:13 | x | main.rs:553:15:553:15 | x | -| main.rs:557:9:557:9 | x | main.rs:557:9:557:9 | x | main.rs:564:15:564:15 | x | -| main.rs:560:9:560:11 | cap | main.rs:560:9:560:11 | cap | main.rs:563:5:563:7 | cap | -| main.rs:560:15:562:5 | x | main.rs:557:9:557:9 | x | main.rs:561:19:561:19 | x | -| main.rs:568:13:568:13 | x | main.rs:568:13:568:13 | x | main.rs:575:15:575:15 | x | -| main.rs:571:9:571:16 | closure1 | main.rs:571:9:571:16 | closure1 | main.rs:574:5:574:12 | closure1 | -| main.rs:571:20:573:5 | x | main.rs:568:13:568:13 | x | main.rs:572:19:572:19 | x | -| main.rs:580:13:580:20 | closure2 | main.rs:580:13:580:20 | closure2 | main.rs:583:5:583:12 | closure2 | -| main.rs:583:5:583:14 | y | main.rs:577:13:577:13 | y | main.rs:584:15:584:15 | y | -| main.rs:586:13:586:13 | z | main.rs:586:13:586:13 | z | main.rs:593:15:593:15 | z | -| main.rs:589:13:589:20 | closure3 | main.rs:589:13:589:20 | closure3 | main.rs:592:5:592:12 | closure3 | -| main.rs:589:24:591:5 | z | main.rs:586:13:586:13 | z | main.rs:590:9:590:9 | z | -| main.rs:598:9:598:13 | block | main.rs:598:9:598:13 | block | main.rs:602:5:602:9 | block | -| main.rs:602:5:602:15 | i | main.rs:597:13:597:13 | i | main.rs:603:15:603:15 | i | -| main.rs:606:8:606:8 | b | main.rs:606:8:606:8 | b | main.rs:611:16:611:16 | b | -| main.rs:607:13:607:13 | x | main.rs:607:13:607:13 | x | main.rs:608:15:608:15 | x | -| main.rs:607:13:607:13 | x | main.rs:607:13:607:13 | x | main.rs:609:15:609:15 | x | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:607:13:607:13 | x | main.rs:621:15:621:15 | x | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | main.rs:614:19:614:19 | x | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | main.rs:615:19:615:19 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | main.rs:618:19:618:19 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | main.rs:619:19:619:19 | x | -| main.rs:624:13:624:14 | b1 | main.rs:624:13:624:14 | b1 | main.rs:627:16:627:17 | b1 | -| main.rs:624:23:624:24 | b2 | main.rs:624:23:624:24 | b2 | main.rs:635:16:635:17 | b2 | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:629:19:629:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:631:19:631:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:637:19:637:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:639:19:639:19 | x | -| main.rs:648:20:648:23 | self | main.rs:648:20:648:23 | self | main.rs:649:16:649:19 | self | -| main.rs:652:11:652:14 | self | main.rs:652:11:652:14 | self | main.rs:653:9:653:12 | self | -| main.rs:657:17:657:17 | f | main.rs:657:17:657:17 | f | main.rs:661:9:661:9 | f | -| main.rs:657:17:657:17 | f | main.rs:657:17:657:17 | f | main.rs:662:9:662:9 | f | -| main.rs:657:21:660:9 | self | main.rs:656:23:656:26 | self | main.rs:659:13:659:16 | self | -| main.rs:657:22:657:22 | n | main.rs:657:22:657:22 | n | main.rs:659:25:659:25 | n | -| main.rs:667:13:667:13 | a | main.rs:667:13:667:13 | a | main.rs:668:15:668:15 | a | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | main.rs:669:5:669:5 | a | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | main.rs:670:15:670:15 | a | -| main.rs:671:5:671:5 | a | main.rs:667:13:667:13 | a | main.rs:672:15:672:15 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:677:15:677:15 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:678:5:678:5 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:679:15:679:15 | a | -| main.rs:680:5:680:5 | a | main.rs:676:13:676:13 | a | main.rs:681:15:681:15 | a | -| main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | main.rs:686:20:686:20 | x | -| main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | main.rs:687:15:687:15 | x | -| main.rs:689:9:689:9 | z | main.rs:689:9:689:9 | z | main.rs:690:20:690:20 | z | -| main.rs:698:17:698:20 | self | main.rs:698:17:698:20 | self | main.rs:699:10:699:13 | self | -| main.rs:704:13:704:13 | a | main.rs:704:13:704:13 | a | main.rs:705:5:705:5 | a | -| main.rs:705:5:705:5 | a | main.rs:704:13:704:13 | a | main.rs:708:15:708:15 | a | -| main.rs:726:9:726:22 | var_from_macro | main.rs:726:9:726:22 | var_from_macro | main.rs:728:15:728:28 | var_from_macro | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | -| main.rs:729:9:729:20 | var_in_macro | main.rs:729:9:729:20 | var_in_macro | main.rs:735:15:735:26 | var_in_macro | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | var_in_macro | main.rs:734:30:734:41 | var_in_macro | -| main.rs:740:5:740:5 | x | main.rs:739:9:739:9 | x | main.rs:741:15:741:15 | x | -| main.rs:746:13:746:15 | cap | main.rs:746:13:746:15 | cap | main.rs:752:5:752:7 | cap | -| main.rs:746:20:746:20 | b | main.rs:746:20:746:20 | b | main.rs:748:20:748:20 | b | -| main.rs:752:5:752:13 | x | main.rs:745:13:745:13 | x | main.rs:753:15:753:15 | x | -| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | main.rs:761:19:761:19 | x | -| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y | -| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne | -| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | main.rs:779:13:779:22 | test_alias | -| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test | -| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x | -| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:793:15:793:15 | x | -| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x | +| main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | main.rs:325:13:325:13 | x | +| main.rs:317:17:317:17 | x | main.rs:317:17:317:17 | x | main.rs:320:5:320:5 | x | +| main.rs:317:17:317:17 | x | main.rs:317:17:317:17 | x | main.rs:322:19:322:19 | x | +| main.rs:324:13:324:13 | x | main.rs:324:13:324:13 | x | main.rs:326:19:326:19 | x | +| main.rs:332:9:332:9 | x | main.rs:332:9:332:9 | x | main.rs:334:7:334:7 | x | +| main.rs:332:9:332:9 | x | main.rs:332:9:332:9 | x | main.rs:344:13:344:13 | x | +| main.rs:333:17:333:17 | x | main.rs:333:17:333:17 | x | main.rs:337:12:337:12 | x | +| main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | main.rs:339:5:339:5 | x | +| main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | main.rs:341:19:341:19 | x | +| main.rs:343:13:343:13 | x | main.rs:343:13:343:13 | x | main.rs:345:19:345:19 | x | +| main.rs:351:9:351:9 | x | main.rs:351:9:351:9 | x | main.rs:353:7:353:7 | x | +| main.rs:351:9:351:9 | x | main.rs:351:9:351:9 | x | main.rs:364:15:364:15 | x | +| main.rs:352:20:352:20 | x | main.rs:352:20:352:20 | x | main.rs:356:12:356:12 | x | +| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:358:5:358:5 | x | +| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:360:19:360:19 | x | +| main.rs:369:9:369:9 | x | main.rs:369:9:369:9 | x | main.rs:370:11:370:11 | x | +| main.rs:369:9:369:9 | x | main.rs:369:9:369:9 | x | main.rs:378:15:378:15 | x | +| main.rs:371:14:371:14 | x | main.rs:371:14:371:14 | x | main.rs:373:18:373:18 | x | +| main.rs:372:20:372:20 | x | main.rs:372:20:372:20 | x | main.rs:374:19:374:19 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | main.rs:385:7:385:7 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | main.rs:390:7:390:7 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | main.rs:394:19:394:19 | x | +| main.rs:384:16:384:16 | x | main.rs:384:16:384:16 | x | main.rs:387:19:387:19 | x | +| main.rs:389:20:389:20 | x | main.rs:389:20:389:20 | x | main.rs:392:19:392:19 | x | +| main.rs:399:9:399:9 | x | main.rs:399:9:399:9 | x | main.rs:400:11:400:11 | x | +| main.rs:401:18:401:18 | x | main.rs:401:18:401:18 | x | main.rs:402:20:402:20 | x | +| main.rs:408:9:408:9 | x | main.rs:408:9:408:9 | x | main.rs:409:11:409:11 | x | +| main.rs:410:14:410:14 | y | main.rs:410:14:410:14 | y | main.rs:411:16:411:16 | y | +| main.rs:410:14:410:14 | y | main.rs:410:14:410:14 | y | main.rs:413:22:413:22 | y | +| main.rs:412:22:412:22 | y | main.rs:412:22:412:22 | y | main.rs:414:26:414:26 | y | +| main.rs:420:5:420:6 | a8 | main.rs:420:5:420:6 | a8 | main.rs:426:15:426:16 | a8 | +| main.rs:422:9:422:10 | b3 | main.rs:422:9:422:10 | b3 | main.rs:427:15:427:16 | b3 | +| main.rs:423:9:423:10 | c1 | main.rs:423:9:423:10 | c1 | main.rs:428:15:428:16 | c1 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:20:431:55 | a9 | main.rs:433:15:433:16 | a9 | +| main.rs:438:13:438:15 | a10 | main.rs:438:13:438:15 | a10 | main.rs:442:15:442:17 | a10 | +| main.rs:438:13:438:15 | a10 | main.rs:438:13:438:15 | a10 | main.rs:451:9:451:11 | a10 | +| main.rs:439:13:439:14 | b4 | main.rs:439:13:439:14 | b4 | main.rs:443:15:443:16 | b4 | +| main.rs:439:13:439:14 | b4 | main.rs:439:13:439:14 | b4 | main.rs:452:9:452:10 | b4 | +| main.rs:440:13:440:14 | c2 | main.rs:440:13:440:14 | c2 | main.rs:444:15:444:16 | c2 | +| main.rs:440:13:440:14 | c2 | main.rs:440:13:440:14 | c2 | main.rs:453:9:453:10 | c2 | +| main.rs:447:9:447:10 | c2 | main.rs:440:13:440:14 | c2 | main.rs:457:15:457:16 | c2 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | main.rs:456:15:456:16 | b4 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | main.rs:470:15:470:16 | b4 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | main.rs:455:15:455:17 | a10 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | main.rs:469:15:469:17 | a10 | +| main.rs:461:13:461:15 | a10 | main.rs:461:13:461:15 | a10 | main.rs:464:23:464:25 | a10 | +| main.rs:462:13:462:14 | b4 | main.rs:462:13:462:14 | b4 | main.rs:465:23:465:24 | b4 | +| main.rs:474:9:474:23 | example_closure | main.rs:474:9:474:23 | example_closure | main.rs:478:9:478:23 | example_closure | +| main.rs:475:10:475:10 | x | main.rs:475:10:475:10 | x | main.rs:476:9:476:9 | x | +| main.rs:477:9:477:10 | n1 | main.rs:477:9:477:10 | n1 | main.rs:479:15:479:16 | n1 | +| main.rs:482:9:482:26 | immutable_variable | main.rs:482:9:482:26 | immutable_variable | main.rs:486:9:486:26 | immutable_variable | +| main.rs:483:6:483:6 | x | main.rs:483:6:483:6 | x | main.rs:484:9:484:9 | x | +| main.rs:485:9:485:10 | n2 | main.rs:485:9:485:10 | n2 | main.rs:487:15:487:16 | n2 | +| main.rs:492:9:492:9 | f | main.rs:492:9:492:9 | f | main.rs:495:15:495:15 | f | +| main.rs:492:9:492:9 | f | main.rs:492:9:492:9 | f | main.rs:502:15:502:15 | f | +| main.rs:493:10:493:10 | x | main.rs:493:10:493:10 | x | main.rs:494:9:494:9 | x | +| main.rs:497:10:497:10 | x | main.rs:497:10:497:10 | x | main.rs:499:9:499:9 | x | +| main.rs:506:14:506:14 | x | main.rs:506:14:506:14 | x | main.rs:508:17:508:17 | x | +| main.rs:515:13:515:13 | f | main.rs:515:13:515:13 | f | main.rs:518:19:518:19 | f | +| main.rs:516:14:516:14 | x | main.rs:516:14:516:14 | x | main.rs:517:13:517:13 | x | +| main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | v | main.rs:526:12:526:12 | v | +| main.rs:525:9:525:12 | text | main.rs:525:9:525:12 | text | main.rs:527:19:527:22 | text | +| main.rs:532:13:532:13 | a | main.rs:532:13:532:13 | a | main.rs:533:5:533:5 | a | +| main.rs:533:5:533:5 | a | main.rs:532:13:532:13 | a | main.rs:534:15:534:15 | a | +| main.rs:533:5:533:5 | a | main.rs:532:13:532:13 | a | main.rs:535:11:535:11 | a | +| main.rs:535:6:535:11 | &mut a | main.rs:532:13:532:13 | a | main.rs:536:15:536:15 | a | +| main.rs:540:13:540:13 | i | main.rs:540:13:540:13 | i | main.rs:542:14:542:14 | i | +| main.rs:541:9:541:13 | ref_i | main.rs:541:9:541:13 | ref_i | main.rs:543:6:543:10 | ref_i | +| main.rs:542:9:542:14 | &mut i | main.rs:540:13:540:13 | i | main.rs:544:15:544:15 | i | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:548:6:548:6 | x | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:549:10:549:10 | x | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:550:10:550:10 | x | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:551:12:551:12 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:555:6:555:6 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:556:10:556:10 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:557:10:557:10 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:559:9:559:9 | x | +| main.rs:554:38:554:38 | y | main.rs:554:38:554:38 | y | main.rs:558:6:558:6 | y | +| main.rs:563:13:563:13 | x | main.rs:563:13:563:13 | x | main.rs:565:27:565:27 | x | +| main.rs:564:9:564:9 | y | main.rs:564:9:564:9 | y | main.rs:566:6:566:6 | y | +| main.rs:565:22:565:27 | &mut x | main.rs:563:13:563:13 | x | main.rs:569:15:569:15 | x | +| main.rs:565:22:565:27 | &mut x | main.rs:563:13:563:13 | x | main.rs:573:19:573:19 | x | +| main.rs:571:13:571:13 | z | main.rs:571:13:571:13 | z | main.rs:575:14:575:14 | z | +| main.rs:572:9:572:9 | w | main.rs:572:9:572:9 | w | main.rs:576:9:576:9 | w | +| main.rs:572:9:572:9 | w | main.rs:572:9:572:9 | w | main.rs:578:7:578:7 | w | +| main.rs:575:9:575:14 | &mut z | main.rs:571:13:571:13 | z | main.rs:581:15:581:15 | z | +| main.rs:585:13:585:13 | x | main.rs:585:13:585:13 | x | main.rs:587:14:587:14 | x | +| main.rs:586:9:586:9 | y | main.rs:586:9:586:9 | y | main.rs:588:6:588:6 | y | +| main.rs:587:9:587:14 | &mut x | main.rs:585:13:585:13 | x | main.rs:589:15:589:15 | x | +| main.rs:593:9:593:9 | x | main.rs:593:9:593:9 | x | main.rs:600:15:600:15 | x | +| main.rs:596:9:596:11 | cap | main.rs:596:9:596:11 | cap | main.rs:599:5:599:7 | cap | +| main.rs:596:15:598:5 | x | main.rs:593:9:593:9 | x | main.rs:597:19:597:19 | x | +| main.rs:604:13:604:13 | x | main.rs:604:13:604:13 | x | main.rs:611:15:611:15 | x | +| main.rs:607:9:607:16 | closure1 | main.rs:607:9:607:16 | closure1 | main.rs:610:5:610:12 | closure1 | +| main.rs:607:20:609:5 | x | main.rs:604:13:604:13 | x | main.rs:608:19:608:19 | x | +| main.rs:616:13:616:20 | closure2 | main.rs:616:13:616:20 | closure2 | main.rs:619:5:619:12 | closure2 | +| main.rs:619:5:619:14 | y | main.rs:613:13:613:13 | y | main.rs:620:15:620:15 | y | +| main.rs:622:13:622:13 | z | main.rs:622:13:622:13 | z | main.rs:629:15:629:15 | z | +| main.rs:625:13:625:20 | closure3 | main.rs:625:13:625:20 | closure3 | main.rs:628:5:628:12 | closure3 | +| main.rs:625:24:627:5 | z | main.rs:622:13:622:13 | z | main.rs:626:9:626:9 | z | +| main.rs:634:9:634:13 | block | main.rs:634:9:634:13 | block | main.rs:638:5:638:9 | block | +| main.rs:638:5:638:15 | i | main.rs:633:13:633:13 | i | main.rs:639:15:639:15 | i | +| main.rs:642:8:642:8 | b | main.rs:642:8:642:8 | b | main.rs:647:16:647:16 | b | +| main.rs:643:13:643:13 | x | main.rs:643:13:643:13 | x | main.rs:644:15:644:15 | x | +| main.rs:643:13:643:13 | x | main.rs:643:13:643:13 | x | main.rs:645:15:645:15 | x | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:643:13:643:13 | x | main.rs:657:15:657:15 | x | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | main.rs:650:19:650:19 | x | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | main.rs:651:19:651:19 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | main.rs:654:19:654:19 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | main.rs:655:19:655:19 | x | +| main.rs:660:13:660:14 | b1 | main.rs:660:13:660:14 | b1 | main.rs:663:16:663:17 | b1 | +| main.rs:660:23:660:24 | b2 | main.rs:660:23:660:24 | b2 | main.rs:671:16:671:17 | b2 | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:665:19:665:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:667:19:667:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:673:19:673:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:675:19:675:19 | x | +| main.rs:684:20:684:23 | self | main.rs:684:20:684:23 | self | main.rs:685:16:685:19 | self | +| main.rs:688:11:688:14 | self | main.rs:688:11:688:14 | self | main.rs:689:9:689:12 | self | +| main.rs:693:17:693:17 | f | main.rs:693:17:693:17 | f | main.rs:697:9:697:9 | f | +| main.rs:693:17:693:17 | f | main.rs:693:17:693:17 | f | main.rs:698:9:698:9 | f | +| main.rs:693:21:696:9 | self | main.rs:692:23:692:26 | self | main.rs:695:13:695:16 | self | +| main.rs:693:22:693:22 | n | main.rs:693:22:693:22 | n | main.rs:695:25:695:25 | n | +| main.rs:703:13:703:13 | a | main.rs:703:13:703:13 | a | main.rs:704:15:704:15 | a | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | main.rs:705:5:705:5 | a | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | main.rs:706:15:706:15 | a | +| main.rs:707:5:707:5 | a | main.rs:703:13:703:13 | a | main.rs:708:15:708:15 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | main.rs:713:15:713:15 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | main.rs:714:5:714:5 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | main.rs:715:15:715:15 | a | +| main.rs:716:5:716:5 | a | main.rs:712:13:712:13 | a | main.rs:717:15:717:15 | a | +| main.rs:721:9:721:9 | x | main.rs:721:9:721:9 | x | main.rs:722:20:722:20 | x | +| main.rs:721:9:721:9 | x | main.rs:721:9:721:9 | x | main.rs:723:15:723:15 | x | +| main.rs:725:9:725:9 | z | main.rs:725:9:725:9 | z | main.rs:726:20:726:20 | z | +| main.rs:734:17:734:20 | self | main.rs:734:17:734:20 | self | main.rs:735:10:735:13 | self | +| main.rs:740:13:740:13 | a | main.rs:740:13:740:13 | a | main.rs:741:5:741:5 | a | +| main.rs:741:5:741:5 | a | main.rs:740:13:740:13 | a | main.rs:744:15:744:15 | a | +| main.rs:762:9:762:22 | var_from_macro | main.rs:762:9:762:22 | var_from_macro | main.rs:764:15:764:28 | var_from_macro | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | +| main.rs:765:9:765:20 | var_in_macro | main.rs:765:9:765:20 | var_in_macro | main.rs:771:15:771:26 | var_in_macro | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:15:770:28 | var_in_macro | main.rs:770:30:770:41 | var_in_macro | +| main.rs:776:5:776:5 | x | main.rs:775:9:775:9 | x | main.rs:777:15:777:15 | x | +| main.rs:782:13:782:15 | cap | main.rs:782:13:782:15 | cap | main.rs:788:5:788:7 | cap | +| main.rs:782:20:782:20 | b | main.rs:782:20:782:20 | b | main.rs:784:20:784:20 | b | +| main.rs:788:5:788:13 | x | main.rs:781:13:781:13 | x | main.rs:789:15:789:15 | x | +| main.rs:795:13:795:13 | x | main.rs:795:13:795:13 | x | main.rs:797:19:797:19 | x | +| main.rs:796:13:796:13 | y | main.rs:796:13:796:13 | y | main.rs:804:15:804:15 | y | +| main.rs:805:13:805:16 | N0ne | main.rs:805:13:805:16 | N0ne | main.rs:806:17:806:20 | N0ne | +| main.rs:812:13:812:22 | test_alias | main.rs:812:13:812:22 | test_alias | main.rs:815:13:815:22 | test_alias | +| main.rs:814:13:814:16 | test | main.rs:814:13:814:16 | test | main.rs:816:9:816:12 | test | +| main.rs:823:13:823:13 | x | main.rs:823:13:823:13 | x | main.rs:824:15:824:15 | x | +| main.rs:823:13:823:13 | x | main.rs:823:13:823:13 | x | main.rs:829:15:829:15 | x | +| main.rs:825:18:825:18 | x | main.rs:825:18:825:18 | x | main.rs:826:20:826:20 | x | +| main.rs:838:9:838:9 | x | main.rs:838:9:838:9 | x | main.rs:843:19:843:19 | x | +| main.rs:838:9:838:9 | x | main.rs:838:9:838:9 | x | main.rs:845:19:845:19 | x | +| main.rs:840:13:840:13 | x | main.rs:840:13:840:13 | x | main.rs:841:9:841:9 | x | firstRead | main.rs:5:14:5:14 | s | main.rs:5:14:5:14 | s | main.rs:7:20:7:20 | s | | main.rs:10:14:10:14 | i | main.rs:10:14:10:14 | i | main.rs:12:20:12:20 | i | @@ -445,273 +471,287 @@ firstRead | main.rs:100:9:100:9 | x | main.rs:100:9:100:9 | x | main.rs:102:7:102:7 | x | | main.rs:101:14:101:14 | x | main.rs:101:14:101:14 | x | main.rs:109:15:109:15 | x | | main.rs:104:13:104:13 | x | main.rs:104:13:104:13 | x | main.rs:106:19:106:19 | x | -| main.rs:113:9:113:10 | s1 | main.rs:113:9:113:10 | s1 | main.rs:116:11:116:12 | s1 | -| main.rs:115:24:115:25 | s2 | main.rs:115:24:115:25 | s2 | main.rs:117:19:117:20 | s2 | -| main.rs:122:9:122:10 | x6 | main.rs:122:9:122:10 | x6 | main.rs:125:11:125:12 | x6 | -| main.rs:123:9:123:10 | y1 | main.rs:123:9:123:10 | y1 | main.rs:135:15:135:16 | y1 | -| main.rs:127:14:127:15 | y1 | main.rs:127:14:127:15 | y1 | main.rs:130:23:130:24 | y1 | -| main.rs:139:9:139:15 | numbers | main.rs:139:9:139:15 | numbers | main.rs:141:11:141:17 | numbers | -| main.rs:144:13:144:17 | first | main.rs:144:13:144:17 | first | main.rs:150:23:150:27 | first | -| main.rs:146:13:146:17 | third | main.rs:146:13:146:17 | third | main.rs:151:23:151:27 | third | -| main.rs:148:13:148:17 | fifth | main.rs:148:13:148:17 | fifth | main.rs:152:23:152:27 | fifth | -| main.rs:159:13:159:17 | first | main.rs:159:13:159:17 | first | main.rs:163:23:163:27 | first | -| main.rs:161:13:161:16 | last | main.rs:161:13:161:16 | last | main.rs:164:23:164:26 | last | -| main.rs:170:9:170:10 | p2 | main.rs:170:9:170:10 | p2 | main.rs:172:11:172:12 | p2 | -| main.rs:174:16:174:17 | x7 | main.rs:174:16:174:17 | x7 | main.rs:175:24:175:25 | x7 | -| main.rs:184:9:184:11 | msg | main.rs:184:9:184:11 | msg | main.rs:186:11:186:13 | msg | -| main.rs:189:17:189:27 | id_variable | main.rs:189:17:189:27 | id_variable | main.rs:190:24:190:34 | id_variable | -| main.rs:194:26:194:27 | id | main.rs:194:26:194:27 | id | main.rs:197:23:197:24 | id | -| main.rs:208:9:208:14 | either | main.rs:208:9:208:14 | either | main.rs:209:11:209:16 | either | -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | main.rs:211:26:211:27 | a3 | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | main.rs:223:11:223:12 | tv | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:9:224:81 | a4 | main.rs:225:26:225:27 | a4 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:9:228:83 | a5 | main.rs:229:26:229:27 | a5 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | main.rs:233:26:233:27 | a6 | -| main.rs:238:9:238:14 | either | main.rs:238:9:238:14 | either | main.rs:239:11:239:16 | either | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | main.rs:241:16:241:17 | a7 | -| main.rs:248:9:248:14 | either | main.rs:248:9:248:14 | either | main.rs:250:11:250:16 | either | -| main.rs:251:13:251:13 | e | main.rs:251:13:251:13 | e | main.rs:256:15:256:15 | e | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:14:252:51 | a11 | main.rs:254:23:254:25 | a11 | -| main.rs:255:33:255:35 | a12 | main.rs:255:33:255:35 | a12 | main.rs:257:28:257:30 | a12 | -| main.rs:272:9:272:10 | fv | main.rs:272:9:272:10 | fv | main.rs:273:11:273:12 | fv | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:275:26:275:28 | a13 | -| main.rs:281:9:281:9 | x | main.rs:281:9:281:9 | x | main.rs:283:7:283:7 | x | -| main.rs:282:17:282:17 | x | main.rs:282:17:282:17 | x | main.rs:285:5:285:5 | x | -| main.rs:289:13:289:13 | x | main.rs:289:13:289:13 | x | main.rs:291:19:291:19 | x | -| main.rs:297:9:297:9 | x | main.rs:297:9:297:9 | x | main.rs:299:7:299:7 | x | -| main.rs:298:17:298:17 | x | main.rs:298:17:298:17 | x | main.rs:302:12:302:12 | x | -| main.rs:301:14:301:14 | x | main.rs:301:14:301:14 | x | main.rs:304:5:304:5 | x | -| main.rs:308:13:308:13 | x | main.rs:308:13:308:13 | x | main.rs:310:19:310:19 | x | +| main.rs:113:9:113:9 | s | main.rs:113:9:113:9 | s | main.rs:116:11:116:11 | s | +| main.rs:115:24:115:24 | s | main.rs:115:24:115:24 | s | main.rs:117:19:117:19 | s | +| main.rs:123:17:123:17 | x | main.rs:123:17:123:17 | x | main.rs:125:25:125:25 | x | +| main.rs:124:19:124:19 | x | main.rs:124:19:124:19 | x | main.rs:127:19:127:19 | x | +| main.rs:133:9:133:9 | x | main.rs:133:9:133:9 | x | main.rs:135:9:135:9 | x | +| main.rs:134:12:134:12 | x | main.rs:134:12:134:12 | x | main.rs:137:9:137:9 | x | +| main.rs:136:12:136:12 | x | main.rs:136:12:136:12 | x | main.rs:139:9:139:9 | x | +| main.rs:138:12:138:12 | x | main.rs:138:12:138:12 | x | main.rs:141:9:141:9 | x | +| main.rs:140:12:140:12 | x | main.rs:140:12:140:12 | x | main.rs:143:9:143:9 | x | +| main.rs:142:12:142:12 | x | main.rs:142:12:142:12 | x | main.rs:145:9:145:9 | x | +| main.rs:144:12:144:12 | x | main.rs:144:12:144:12 | x | main.rs:147:9:147:9 | x | +| main.rs:146:12:146:12 | x | main.rs:146:12:146:12 | x | main.rs:149:19:149:19 | x | +| main.rs:157:9:157:10 | x6 | main.rs:157:9:157:10 | x6 | main.rs:160:11:160:12 | x6 | +| main.rs:158:9:158:10 | y1 | main.rs:158:9:158:10 | y1 | main.rs:170:15:170:16 | y1 | +| main.rs:162:14:162:15 | y1 | main.rs:162:14:162:15 | y1 | main.rs:165:23:165:24 | y1 | +| main.rs:174:9:174:15 | numbers | main.rs:174:9:174:15 | numbers | main.rs:176:11:176:17 | numbers | +| main.rs:179:13:179:17 | first | main.rs:179:13:179:17 | first | main.rs:185:23:185:27 | first | +| main.rs:181:13:181:17 | third | main.rs:181:13:181:17 | third | main.rs:186:23:186:27 | third | +| main.rs:183:13:183:17 | fifth | main.rs:183:13:183:17 | fifth | main.rs:187:23:187:27 | fifth | +| main.rs:194:13:194:17 | first | main.rs:194:13:194:17 | first | main.rs:198:23:198:27 | first | +| main.rs:196:13:196:16 | last | main.rs:196:13:196:16 | last | main.rs:199:23:199:26 | last | +| main.rs:205:9:205:10 | p2 | main.rs:205:9:205:10 | p2 | main.rs:207:11:207:12 | p2 | +| main.rs:209:16:209:17 | x7 | main.rs:209:16:209:17 | x7 | main.rs:210:24:210:25 | x7 | +| main.rs:219:9:219:11 | msg | main.rs:219:9:219:11 | msg | main.rs:221:11:221:13 | msg | +| main.rs:224:17:224:27 | id_variable | main.rs:224:17:224:27 | id_variable | main.rs:225:24:225:34 | id_variable | +| main.rs:229:26:229:27 | id | main.rs:229:26:229:27 | id | main.rs:232:23:232:24 | id | +| main.rs:243:9:243:14 | either | main.rs:243:9:243:14 | either | main.rs:244:11:244:16 | either | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:9:245:44 | a3 | main.rs:246:26:246:27 | a3 | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | main.rs:258:11:258:12 | tv | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:9:259:81 | a4 | main.rs:260:26:260:27 | a4 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:9:263:83 | a5 | main.rs:264:26:264:27 | a5 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | main.rs:268:26:268:27 | a6 | +| main.rs:273:9:273:14 | either | main.rs:273:9:273:14 | either | main.rs:274:11:274:16 | either | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | main.rs:276:16:276:17 | a7 | +| main.rs:283:9:283:14 | either | main.rs:283:9:283:14 | either | main.rs:285:11:285:16 | either | +| main.rs:286:13:286:13 | e | main.rs:286:13:286:13 | e | main.rs:291:15:291:15 | e | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:14:287:51 | a11 | main.rs:289:23:289:25 | a11 | +| main.rs:290:33:290:35 | a12 | main.rs:290:33:290:35 | a12 | main.rs:292:28:292:30 | a12 | +| main.rs:307:9:307:10 | fv | main.rs:307:9:307:10 | fv | main.rs:308:11:308:12 | fv | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:310:26:310:28 | a13 | | main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | main.rs:318:7:318:7 | x | -| main.rs:317:20:317:20 | x | main.rs:317:20:317:20 | x | main.rs:321:12:321:12 | x | -| main.rs:320:14:320:14 | x | main.rs:320:14:320:14 | x | main.rs:323:5:323:5 | x | -| main.rs:334:9:334:9 | x | main.rs:334:9:334:9 | x | main.rs:335:11:335:11 | x | -| main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | main.rs:338:18:338:18 | x | -| main.rs:337:20:337:20 | x | main.rs:337:20:337:20 | x | main.rs:339:19:339:19 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | main.rs:350:7:350:7 | x | -| main.rs:349:16:349:16 | x | main.rs:349:16:349:16 | x | main.rs:352:19:352:19 | x | -| main.rs:354:20:354:20 | x | main.rs:354:20:354:20 | x | main.rs:357:19:357:19 | x | -| main.rs:364:9:364:9 | x | main.rs:364:9:364:9 | x | main.rs:365:11:365:11 | x | -| main.rs:366:18:366:18 | x | main.rs:366:18:366:18 | x | main.rs:367:20:367:20 | x | -| main.rs:373:9:373:9 | x | main.rs:373:9:373:9 | x | main.rs:374:11:374:11 | x | -| main.rs:375:14:375:14 | y | main.rs:375:14:375:14 | y | main.rs:377:22:377:22 | y | -| main.rs:376:25:376:25 | y | main.rs:376:25:376:25 | y | main.rs:378:26:378:26 | y | -| main.rs:384:5:384:6 | a8 | main.rs:384:5:384:6 | a8 | main.rs:390:15:390:16 | a8 | -| main.rs:386:9:386:10 | b3 | main.rs:386:9:386:10 | b3 | main.rs:391:15:391:16 | b3 | -| main.rs:387:9:387:10 | c1 | main.rs:387:9:387:10 | c1 | main.rs:392:15:392:16 | c1 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:20:395:55 | a9 | main.rs:397:15:397:16 | a9 | -| main.rs:402:13:402:15 | a10 | main.rs:402:13:402:15 | a10 | main.rs:406:15:406:17 | a10 | -| main.rs:403:13:403:14 | b4 | main.rs:403:13:403:14 | b4 | main.rs:407:15:407:16 | b4 | -| main.rs:404:13:404:14 | c2 | main.rs:404:13:404:14 | c2 | main.rs:408:15:408:16 | c2 | -| main.rs:411:9:411:10 | c2 | main.rs:404:13:404:14 | c2 | main.rs:421:15:421:16 | c2 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | main.rs:420:15:420:16 | b4 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | main.rs:419:15:419:17 | a10 | -| main.rs:425:13:425:15 | a10 | main.rs:425:13:425:15 | a10 | main.rs:428:23:428:25 | a10 | -| main.rs:426:13:426:14 | b4 | main.rs:426:13:426:14 | b4 | main.rs:429:23:429:24 | b4 | -| main.rs:438:9:438:23 | example_closure | main.rs:438:9:438:23 | example_closure | main.rs:442:9:442:23 | example_closure | -| main.rs:439:10:439:10 | x | main.rs:439:10:439:10 | x | main.rs:440:9:440:9 | x | -| main.rs:441:9:441:10 | n1 | main.rs:441:9:441:10 | n1 | main.rs:443:15:443:16 | n1 | -| main.rs:446:9:446:26 | immutable_variable | main.rs:446:9:446:26 | immutable_variable | main.rs:450:9:450:26 | immutable_variable | -| main.rs:447:6:447:6 | x | main.rs:447:6:447:6 | x | main.rs:448:9:448:9 | x | -| main.rs:449:9:449:10 | n2 | main.rs:449:9:449:10 | n2 | main.rs:451:15:451:16 | n2 | -| main.rs:456:9:456:9 | f | main.rs:456:9:456:9 | f | main.rs:459:15:459:15 | f | -| main.rs:457:10:457:10 | x | main.rs:457:10:457:10 | x | main.rs:458:9:458:9 | x | -| main.rs:461:10:461:10 | x | main.rs:461:10:461:10 | x | main.rs:463:9:463:9 | x | -| main.rs:470:14:470:14 | x | main.rs:470:14:470:14 | x | main.rs:472:17:472:17 | x | -| main.rs:479:13:479:13 | f | main.rs:479:13:479:13 | f | main.rs:482:19:482:19 | f | -| main.rs:480:14:480:14 | x | main.rs:480:14:480:14 | x | main.rs:481:13:481:13 | x | -| main.rs:487:9:487:9 | v | main.rs:487:9:487:9 | v | main.rs:490:12:490:12 | v | -| main.rs:489:9:489:12 | text | main.rs:489:9:489:12 | text | main.rs:491:19:491:22 | text | -| main.rs:496:13:496:13 | a | main.rs:496:13:496:13 | a | main.rs:497:5:497:5 | a | -| main.rs:497:5:497:5 | a | main.rs:496:13:496:13 | a | main.rs:498:15:498:15 | a | -| main.rs:499:6:499:11 | &mut a | main.rs:496:13:496:13 | a | main.rs:500:15:500:15 | a | -| main.rs:504:13:504:13 | i | main.rs:504:13:504:13 | i | main.rs:506:14:506:14 | i | -| main.rs:505:9:505:13 | ref_i | main.rs:505:9:505:13 | ref_i | main.rs:507:6:507:10 | ref_i | -| main.rs:506:9:506:14 | &mut i | main.rs:504:13:504:13 | i | main.rs:508:15:508:15 | i | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:512:6:512:6 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:519:6:519:6 | x | -| main.rs:518:38:518:38 | y | main.rs:518:38:518:38 | y | main.rs:522:6:522:6 | y | -| main.rs:527:13:527:13 | x | main.rs:527:13:527:13 | x | main.rs:529:27:529:27 | x | -| main.rs:528:9:528:9 | y | main.rs:528:9:528:9 | y | main.rs:530:6:530:6 | y | -| main.rs:529:22:529:27 | &mut x | main.rs:527:13:527:13 | x | main.rs:533:15:533:15 | x | -| main.rs:535:13:535:13 | z | main.rs:535:13:535:13 | z | main.rs:539:14:539:14 | z | -| main.rs:536:9:536:9 | w | main.rs:536:9:536:9 | w | main.rs:540:9:540:9 | w | -| main.rs:539:9:539:14 | &mut z | main.rs:535:13:535:13 | z | main.rs:545:15:545:15 | z | -| main.rs:549:13:549:13 | x | main.rs:549:13:549:13 | x | main.rs:551:14:551:14 | x | -| main.rs:550:9:550:9 | y | main.rs:550:9:550:9 | y | main.rs:552:6:552:6 | y | -| main.rs:551:9:551:14 | &mut x | main.rs:549:13:549:13 | x | main.rs:553:15:553:15 | x | -| main.rs:557:9:557:9 | x | main.rs:557:9:557:9 | x | main.rs:564:15:564:15 | x | -| main.rs:560:9:560:11 | cap | main.rs:560:9:560:11 | cap | main.rs:563:5:563:7 | cap | -| main.rs:560:15:562:5 | x | main.rs:557:9:557:9 | x | main.rs:561:19:561:19 | x | -| main.rs:568:13:568:13 | x | main.rs:568:13:568:13 | x | main.rs:575:15:575:15 | x | -| main.rs:571:9:571:16 | closure1 | main.rs:571:9:571:16 | closure1 | main.rs:574:5:574:12 | closure1 | -| main.rs:571:20:573:5 | x | main.rs:568:13:568:13 | x | main.rs:572:19:572:19 | x | -| main.rs:580:13:580:20 | closure2 | main.rs:580:13:580:20 | closure2 | main.rs:583:5:583:12 | closure2 | -| main.rs:583:5:583:14 | y | main.rs:577:13:577:13 | y | main.rs:584:15:584:15 | y | -| main.rs:586:13:586:13 | z | main.rs:586:13:586:13 | z | main.rs:593:15:593:15 | z | -| main.rs:589:13:589:20 | closure3 | main.rs:589:13:589:20 | closure3 | main.rs:592:5:592:12 | closure3 | -| main.rs:589:24:591:5 | z | main.rs:586:13:586:13 | z | main.rs:590:9:590:9 | z | -| main.rs:598:9:598:13 | block | main.rs:598:9:598:13 | block | main.rs:602:5:602:9 | block | -| main.rs:602:5:602:15 | i | main.rs:597:13:597:13 | i | main.rs:603:15:603:15 | i | -| main.rs:606:8:606:8 | b | main.rs:606:8:606:8 | b | main.rs:611:16:611:16 | b | -| main.rs:607:13:607:13 | x | main.rs:607:13:607:13 | x | main.rs:608:15:608:15 | x | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:607:13:607:13 | x | main.rs:621:15:621:15 | x | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | main.rs:614:19:614:19 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | main.rs:618:19:618:19 | x | -| main.rs:624:13:624:14 | b1 | main.rs:624:13:624:14 | b1 | main.rs:627:16:627:17 | b1 | -| main.rs:624:23:624:24 | b2 | main.rs:624:23:624:24 | b2 | main.rs:635:16:635:17 | b2 | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:629:19:629:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:631:19:631:19 | x | -| main.rs:648:20:648:23 | self | main.rs:648:20:648:23 | self | main.rs:649:16:649:19 | self | -| main.rs:652:11:652:14 | self | main.rs:652:11:652:14 | self | main.rs:653:9:653:12 | self | -| main.rs:657:17:657:17 | f | main.rs:657:17:657:17 | f | main.rs:661:9:661:9 | f | -| main.rs:657:21:660:9 | self | main.rs:656:23:656:26 | self | main.rs:659:13:659:16 | self | -| main.rs:657:22:657:22 | n | main.rs:657:22:657:22 | n | main.rs:659:25:659:25 | n | -| main.rs:667:13:667:13 | a | main.rs:667:13:667:13 | a | main.rs:668:15:668:15 | a | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | main.rs:669:5:669:5 | a | -| main.rs:671:5:671:5 | a | main.rs:667:13:667:13 | a | main.rs:672:15:672:15 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:677:15:677:15 | a | -| main.rs:680:5:680:5 | a | main.rs:676:13:676:13 | a | main.rs:681:15:681:15 | a | -| main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | main.rs:686:20:686:20 | x | -| main.rs:689:9:689:9 | z | main.rs:689:9:689:9 | z | main.rs:690:20:690:20 | z | -| main.rs:698:17:698:20 | self | main.rs:698:17:698:20 | self | main.rs:699:10:699:13 | self | -| main.rs:704:13:704:13 | a | main.rs:704:13:704:13 | a | main.rs:705:5:705:5 | a | -| main.rs:705:5:705:5 | a | main.rs:704:13:704:13 | a | main.rs:708:15:708:15 | a | -| main.rs:726:9:726:22 | var_from_macro | main.rs:726:9:726:22 | var_from_macro | main.rs:728:15:728:28 | var_from_macro | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | -| main.rs:729:9:729:20 | var_in_macro | main.rs:729:9:729:20 | var_in_macro | main.rs:735:15:735:26 | var_in_macro | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | var_in_macro | main.rs:734:30:734:41 | var_in_macro | -| main.rs:740:5:740:5 | x | main.rs:739:9:739:9 | x | main.rs:741:15:741:15 | x | -| main.rs:746:13:746:15 | cap | main.rs:746:13:746:15 | cap | main.rs:752:5:752:7 | cap | -| main.rs:746:20:746:20 | b | main.rs:746:20:746:20 | b | main.rs:748:20:748:20 | b | -| main.rs:752:5:752:13 | x | main.rs:745:13:745:13 | x | main.rs:753:15:753:15 | x | -| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | main.rs:761:19:761:19 | x | -| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y | -| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne | -| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | main.rs:779:13:779:22 | test_alias | -| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test | -| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x | -| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x | +| main.rs:317:17:317:17 | x | main.rs:317:17:317:17 | x | main.rs:320:5:320:5 | x | +| main.rs:324:13:324:13 | x | main.rs:324:13:324:13 | x | main.rs:326:19:326:19 | x | +| main.rs:332:9:332:9 | x | main.rs:332:9:332:9 | x | main.rs:334:7:334:7 | x | +| main.rs:333:17:333:17 | x | main.rs:333:17:333:17 | x | main.rs:337:12:337:12 | x | +| main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | main.rs:339:5:339:5 | x | +| main.rs:343:13:343:13 | x | main.rs:343:13:343:13 | x | main.rs:345:19:345:19 | x | +| main.rs:351:9:351:9 | x | main.rs:351:9:351:9 | x | main.rs:353:7:353:7 | x | +| main.rs:352:20:352:20 | x | main.rs:352:20:352:20 | x | main.rs:356:12:356:12 | x | +| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:358:5:358:5 | x | +| main.rs:369:9:369:9 | x | main.rs:369:9:369:9 | x | main.rs:370:11:370:11 | x | +| main.rs:371:14:371:14 | x | main.rs:371:14:371:14 | x | main.rs:373:18:373:18 | x | +| main.rs:372:20:372:20 | x | main.rs:372:20:372:20 | x | main.rs:374:19:374:19 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | main.rs:385:7:385:7 | x | +| main.rs:384:16:384:16 | x | main.rs:384:16:384:16 | x | main.rs:387:19:387:19 | x | +| main.rs:389:20:389:20 | x | main.rs:389:20:389:20 | x | main.rs:392:19:392:19 | x | +| main.rs:399:9:399:9 | x | main.rs:399:9:399:9 | x | main.rs:400:11:400:11 | x | +| main.rs:401:18:401:18 | x | main.rs:401:18:401:18 | x | main.rs:402:20:402:20 | x | +| main.rs:408:9:408:9 | x | main.rs:408:9:408:9 | x | main.rs:409:11:409:11 | x | +| main.rs:410:14:410:14 | y | main.rs:410:14:410:14 | y | main.rs:411:16:411:16 | y | +| main.rs:412:22:412:22 | y | main.rs:412:22:412:22 | y | main.rs:414:26:414:26 | y | +| main.rs:420:5:420:6 | a8 | main.rs:420:5:420:6 | a8 | main.rs:426:15:426:16 | a8 | +| main.rs:422:9:422:10 | b3 | main.rs:422:9:422:10 | b3 | main.rs:427:15:427:16 | b3 | +| main.rs:423:9:423:10 | c1 | main.rs:423:9:423:10 | c1 | main.rs:428:15:428:16 | c1 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:20:431:55 | a9 | main.rs:433:15:433:16 | a9 | +| main.rs:438:13:438:15 | a10 | main.rs:438:13:438:15 | a10 | main.rs:442:15:442:17 | a10 | +| main.rs:439:13:439:14 | b4 | main.rs:439:13:439:14 | b4 | main.rs:443:15:443:16 | b4 | +| main.rs:440:13:440:14 | c2 | main.rs:440:13:440:14 | c2 | main.rs:444:15:444:16 | c2 | +| main.rs:447:9:447:10 | c2 | main.rs:440:13:440:14 | c2 | main.rs:457:15:457:16 | c2 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | main.rs:456:15:456:16 | b4 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | main.rs:455:15:455:17 | a10 | +| main.rs:461:13:461:15 | a10 | main.rs:461:13:461:15 | a10 | main.rs:464:23:464:25 | a10 | +| main.rs:462:13:462:14 | b4 | main.rs:462:13:462:14 | b4 | main.rs:465:23:465:24 | b4 | +| main.rs:474:9:474:23 | example_closure | main.rs:474:9:474:23 | example_closure | main.rs:478:9:478:23 | example_closure | +| main.rs:475:10:475:10 | x | main.rs:475:10:475:10 | x | main.rs:476:9:476:9 | x | +| main.rs:477:9:477:10 | n1 | main.rs:477:9:477:10 | n1 | main.rs:479:15:479:16 | n1 | +| main.rs:482:9:482:26 | immutable_variable | main.rs:482:9:482:26 | immutable_variable | main.rs:486:9:486:26 | immutable_variable | +| main.rs:483:6:483:6 | x | main.rs:483:6:483:6 | x | main.rs:484:9:484:9 | x | +| main.rs:485:9:485:10 | n2 | main.rs:485:9:485:10 | n2 | main.rs:487:15:487:16 | n2 | +| main.rs:492:9:492:9 | f | main.rs:492:9:492:9 | f | main.rs:495:15:495:15 | f | +| main.rs:493:10:493:10 | x | main.rs:493:10:493:10 | x | main.rs:494:9:494:9 | x | +| main.rs:497:10:497:10 | x | main.rs:497:10:497:10 | x | main.rs:499:9:499:9 | x | +| main.rs:506:14:506:14 | x | main.rs:506:14:506:14 | x | main.rs:508:17:508:17 | x | +| main.rs:515:13:515:13 | f | main.rs:515:13:515:13 | f | main.rs:518:19:518:19 | f | +| main.rs:516:14:516:14 | x | main.rs:516:14:516:14 | x | main.rs:517:13:517:13 | x | +| main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | v | main.rs:526:12:526:12 | v | +| main.rs:525:9:525:12 | text | main.rs:525:9:525:12 | text | main.rs:527:19:527:22 | text | +| main.rs:532:13:532:13 | a | main.rs:532:13:532:13 | a | main.rs:533:5:533:5 | a | +| main.rs:533:5:533:5 | a | main.rs:532:13:532:13 | a | main.rs:534:15:534:15 | a | +| main.rs:535:6:535:11 | &mut a | main.rs:532:13:532:13 | a | main.rs:536:15:536:15 | a | +| main.rs:540:13:540:13 | i | main.rs:540:13:540:13 | i | main.rs:542:14:542:14 | i | +| main.rs:541:9:541:13 | ref_i | main.rs:541:9:541:13 | ref_i | main.rs:543:6:543:10 | ref_i | +| main.rs:542:9:542:14 | &mut i | main.rs:540:13:540:13 | i | main.rs:544:15:544:15 | i | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:548:6:548:6 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:555:6:555:6 | x | +| main.rs:554:38:554:38 | y | main.rs:554:38:554:38 | y | main.rs:558:6:558:6 | y | +| main.rs:563:13:563:13 | x | main.rs:563:13:563:13 | x | main.rs:565:27:565:27 | x | +| main.rs:564:9:564:9 | y | main.rs:564:9:564:9 | y | main.rs:566:6:566:6 | y | +| main.rs:565:22:565:27 | &mut x | main.rs:563:13:563:13 | x | main.rs:569:15:569:15 | x | +| main.rs:571:13:571:13 | z | main.rs:571:13:571:13 | z | main.rs:575:14:575:14 | z | +| main.rs:572:9:572:9 | w | main.rs:572:9:572:9 | w | main.rs:576:9:576:9 | w | +| main.rs:575:9:575:14 | &mut z | main.rs:571:13:571:13 | z | main.rs:581:15:581:15 | z | +| main.rs:585:13:585:13 | x | main.rs:585:13:585:13 | x | main.rs:587:14:587:14 | x | +| main.rs:586:9:586:9 | y | main.rs:586:9:586:9 | y | main.rs:588:6:588:6 | y | +| main.rs:587:9:587:14 | &mut x | main.rs:585:13:585:13 | x | main.rs:589:15:589:15 | x | +| main.rs:593:9:593:9 | x | main.rs:593:9:593:9 | x | main.rs:600:15:600:15 | x | +| main.rs:596:9:596:11 | cap | main.rs:596:9:596:11 | cap | main.rs:599:5:599:7 | cap | +| main.rs:596:15:598:5 | x | main.rs:593:9:593:9 | x | main.rs:597:19:597:19 | x | +| main.rs:604:13:604:13 | x | main.rs:604:13:604:13 | x | main.rs:611:15:611:15 | x | +| main.rs:607:9:607:16 | closure1 | main.rs:607:9:607:16 | closure1 | main.rs:610:5:610:12 | closure1 | +| main.rs:607:20:609:5 | x | main.rs:604:13:604:13 | x | main.rs:608:19:608:19 | x | +| main.rs:616:13:616:20 | closure2 | main.rs:616:13:616:20 | closure2 | main.rs:619:5:619:12 | closure2 | +| main.rs:619:5:619:14 | y | main.rs:613:13:613:13 | y | main.rs:620:15:620:15 | y | +| main.rs:622:13:622:13 | z | main.rs:622:13:622:13 | z | main.rs:629:15:629:15 | z | +| main.rs:625:13:625:20 | closure3 | main.rs:625:13:625:20 | closure3 | main.rs:628:5:628:12 | closure3 | +| main.rs:625:24:627:5 | z | main.rs:622:13:622:13 | z | main.rs:626:9:626:9 | z | +| main.rs:634:9:634:13 | block | main.rs:634:9:634:13 | block | main.rs:638:5:638:9 | block | +| main.rs:638:5:638:15 | i | main.rs:633:13:633:13 | i | main.rs:639:15:639:15 | i | +| main.rs:642:8:642:8 | b | main.rs:642:8:642:8 | b | main.rs:647:16:647:16 | b | +| main.rs:643:13:643:13 | x | main.rs:643:13:643:13 | x | main.rs:644:15:644:15 | x | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:643:13:643:13 | x | main.rs:657:15:657:15 | x | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | main.rs:650:19:650:19 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | main.rs:654:19:654:19 | x | +| main.rs:660:13:660:14 | b1 | main.rs:660:13:660:14 | b1 | main.rs:663:16:663:17 | b1 | +| main.rs:660:23:660:24 | b2 | main.rs:660:23:660:24 | b2 | main.rs:671:16:671:17 | b2 | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:665:19:665:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:667:19:667:19 | x | +| main.rs:684:20:684:23 | self | main.rs:684:20:684:23 | self | main.rs:685:16:685:19 | self | +| main.rs:688:11:688:14 | self | main.rs:688:11:688:14 | self | main.rs:689:9:689:12 | self | +| main.rs:693:17:693:17 | f | main.rs:693:17:693:17 | f | main.rs:697:9:697:9 | f | +| main.rs:693:21:696:9 | self | main.rs:692:23:692:26 | self | main.rs:695:13:695:16 | self | +| main.rs:693:22:693:22 | n | main.rs:693:22:693:22 | n | main.rs:695:25:695:25 | n | +| main.rs:703:13:703:13 | a | main.rs:703:13:703:13 | a | main.rs:704:15:704:15 | a | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | main.rs:705:5:705:5 | a | +| main.rs:707:5:707:5 | a | main.rs:703:13:703:13 | a | main.rs:708:15:708:15 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | main.rs:713:15:713:15 | a | +| main.rs:716:5:716:5 | a | main.rs:712:13:712:13 | a | main.rs:717:15:717:15 | a | +| main.rs:721:9:721:9 | x | main.rs:721:9:721:9 | x | main.rs:722:20:722:20 | x | +| main.rs:725:9:725:9 | z | main.rs:725:9:725:9 | z | main.rs:726:20:726:20 | z | +| main.rs:734:17:734:20 | self | main.rs:734:17:734:20 | self | main.rs:735:10:735:13 | self | +| main.rs:740:13:740:13 | a | main.rs:740:13:740:13 | a | main.rs:741:5:741:5 | a | +| main.rs:741:5:741:5 | a | main.rs:740:13:740:13 | a | main.rs:744:15:744:15 | a | +| main.rs:762:9:762:22 | var_from_macro | main.rs:762:9:762:22 | var_from_macro | main.rs:764:15:764:28 | var_from_macro | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | +| main.rs:765:9:765:20 | var_in_macro | main.rs:765:9:765:20 | var_in_macro | main.rs:771:15:771:26 | var_in_macro | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:15:770:28 | var_in_macro | main.rs:770:30:770:41 | var_in_macro | +| main.rs:776:5:776:5 | x | main.rs:775:9:775:9 | x | main.rs:777:15:777:15 | x | +| main.rs:782:13:782:15 | cap | main.rs:782:13:782:15 | cap | main.rs:788:5:788:7 | cap | +| main.rs:782:20:782:20 | b | main.rs:782:20:782:20 | b | main.rs:784:20:784:20 | b | +| main.rs:788:5:788:13 | x | main.rs:781:13:781:13 | x | main.rs:789:15:789:15 | x | +| main.rs:795:13:795:13 | x | main.rs:795:13:795:13 | x | main.rs:797:19:797:19 | x | +| main.rs:796:13:796:13 | y | main.rs:796:13:796:13 | y | main.rs:804:15:804:15 | y | +| main.rs:805:13:805:16 | N0ne | main.rs:805:13:805:16 | N0ne | main.rs:806:17:806:20 | N0ne | +| main.rs:812:13:812:22 | test_alias | main.rs:812:13:812:22 | test_alias | main.rs:815:13:815:22 | test_alias | +| main.rs:814:13:814:16 | test | main.rs:814:13:814:16 | test | main.rs:816:9:816:12 | test | +| main.rs:823:13:823:13 | x | main.rs:823:13:823:13 | x | main.rs:824:15:824:15 | x | +| main.rs:825:18:825:18 | x | main.rs:825:18:825:18 | x | main.rs:826:20:826:20 | x | +| main.rs:838:9:838:9 | x | main.rs:838:9:838:9 | x | main.rs:843:19:843:19 | x | +| main.rs:838:9:838:9 | x | main.rs:838:9:838:9 | x | main.rs:845:19:845:19 | x | +| main.rs:840:13:840:13 | x | main.rs:840:13:840:13 | x | main.rs:841:9:841:9 | x | adjacentReads | main.rs:27:5:27:6 | x2 | main.rs:25:13:25:14 | x2 | main.rs:28:15:28:16 | x2 | main.rs:29:10:29:11 | x2 | | main.rs:41:9:41:10 | x3 | main.rs:41:9:41:10 | x3 | main.rs:42:15:42:16 | x3 | main.rs:44:9:44:10 | x3 | | main.rs:49:9:49:10 | x4 | main.rs:49:9:49:10 | x4 | main.rs:50:15:50:16 | x4 | main.rs:55:15:55:16 | x4 | | main.rs:100:9:100:9 | x | main.rs:100:9:100:9 | x | main.rs:102:7:102:7 | x | main.rs:105:13:105:13 | x | -| main.rs:113:9:113:10 | s1 | main.rs:113:9:113:10 | s1 | main.rs:116:11:116:12 | s1 | main.rs:116:11:116:12 | s1 | -| main.rs:139:9:139:15 | numbers | main.rs:139:9:139:15 | numbers | main.rs:141:11:141:17 | numbers | main.rs:156:11:156:17 | numbers | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | main.rs:223:11:223:12 | tv | main.rs:227:11:227:12 | tv | -| main.rs:222:9:222:10 | tv | main.rs:222:9:222:10 | tv | main.rs:227:11:227:12 | tv | main.rs:231:11:231:12 | tv | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | main.rs:241:16:241:17 | a7 | main.rs:242:26:242:27 | a7 | -| main.rs:281:9:281:9 | x | main.rs:281:9:281:9 | x | main.rs:283:7:283:7 | x | main.rs:290:13:290:13 | x | -| main.rs:282:17:282:17 | x | main.rs:282:17:282:17 | x | main.rs:285:5:285:5 | x | main.rs:287:19:287:19 | x | -| main.rs:297:9:297:9 | x | main.rs:297:9:297:9 | x | main.rs:299:7:299:7 | x | main.rs:309:13:309:13 | x | -| main.rs:301:14:301:14 | x | main.rs:301:14:301:14 | x | main.rs:304:5:304:5 | x | main.rs:306:19:306:19 | x | -| main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | main.rs:318:7:318:7 | x | main.rs:329:15:329:15 | x | -| main.rs:320:14:320:14 | x | main.rs:320:14:320:14 | x | main.rs:323:5:323:5 | x | main.rs:325:19:325:19 | x | -| main.rs:334:9:334:9 | x | main.rs:334:9:334:9 | x | main.rs:335:11:335:11 | x | main.rs:343:15:343:15 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | main.rs:350:7:350:7 | x | main.rs:355:7:355:7 | x | -| main.rs:348:9:348:9 | x | main.rs:348:9:348:9 | x | main.rs:355:7:355:7 | x | main.rs:359:19:359:19 | x | -| main.rs:402:13:402:15 | a10 | main.rs:402:13:402:15 | a10 | main.rs:406:15:406:17 | a10 | main.rs:415:9:415:11 | a10 | -| main.rs:403:13:403:14 | b4 | main.rs:403:13:403:14 | b4 | main.rs:407:15:407:16 | b4 | main.rs:416:9:416:10 | b4 | -| main.rs:404:13:404:14 | c2 | main.rs:404:13:404:14 | c2 | main.rs:408:15:408:16 | c2 | main.rs:417:9:417:10 | c2 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | main.rs:420:15:420:16 | b4 | main.rs:434:15:434:16 | b4 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | main.rs:419:15:419:17 | a10 | main.rs:433:15:433:17 | a10 | -| main.rs:456:9:456:9 | f | main.rs:456:9:456:9 | f | main.rs:459:15:459:15 | f | main.rs:466:15:466:15 | f | -| main.rs:497:5:497:5 | a | main.rs:496:13:496:13 | a | main.rs:498:15:498:15 | a | main.rs:499:11:499:11 | a | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:512:6:512:6 | x | main.rs:513:10:513:10 | x | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:513:10:513:10 | x | main.rs:514:10:514:10 | x | -| main.rs:511:17:511:17 | x | main.rs:511:17:511:17 | x | main.rs:514:10:514:10 | x | main.rs:515:12:515:12 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:519:6:519:6 | x | main.rs:520:10:520:10 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:520:10:520:10 | x | main.rs:521:10:521:10 | x | -| main.rs:518:22:518:22 | x | main.rs:518:22:518:22 | x | main.rs:521:10:521:10 | x | main.rs:523:9:523:9 | x | -| main.rs:529:22:529:27 | &mut x | main.rs:527:13:527:13 | x | main.rs:533:15:533:15 | x | main.rs:537:19:537:19 | x | -| main.rs:536:9:536:9 | w | main.rs:536:9:536:9 | w | main.rs:540:9:540:9 | w | main.rs:542:7:542:7 | w | -| main.rs:607:13:607:13 | x | main.rs:607:13:607:13 | x | main.rs:608:15:608:15 | x | main.rs:609:15:609:15 | x | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | main.rs:614:19:614:19 | x | main.rs:615:19:615:19 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | main.rs:618:19:618:19 | x | main.rs:619:19:619:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:629:19:629:19 | x | main.rs:637:19:637:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:629:19:629:19 | x | main.rs:639:19:639:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:631:19:631:19 | x | main.rs:637:19:637:19 | x | -| main.rs:625:9:625:9 | x | main.rs:625:9:625:9 | x | main.rs:631:19:631:19 | x | main.rs:639:19:639:19 | x | -| main.rs:657:17:657:17 | f | main.rs:657:17:657:17 | f | main.rs:661:9:661:9 | f | main.rs:662:9:662:9 | f | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | main.rs:669:5:669:5 | a | main.rs:670:15:670:15 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:677:15:677:15 | a | main.rs:678:5:678:5 | a | -| main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:678:5:678:5 | a | main.rs:679:15:679:15 | a | -| main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | main.rs:686:20:686:20 | x | main.rs:687:15:687:15 | x | -| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x | main.rs:793:15:793:15 | x | +| main.rs:113:9:113:9 | s | main.rs:113:9:113:9 | s | main.rs:116:11:116:11 | s | main.rs:116:11:116:11 | s | +| main.rs:174:9:174:15 | numbers | main.rs:174:9:174:15 | numbers | main.rs:176:11:176:17 | numbers | main.rs:191:11:191:17 | numbers | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | main.rs:258:11:258:12 | tv | main.rs:262:11:262:12 | tv | +| main.rs:257:9:257:10 | tv | main.rs:257:9:257:10 | tv | main.rs:262:11:262:12 | tv | main.rs:266:11:266:12 | tv | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | main.rs:276:16:276:17 | a7 | main.rs:277:26:277:27 | a7 | +| main.rs:316:9:316:9 | x | main.rs:316:9:316:9 | x | main.rs:318:7:318:7 | x | main.rs:325:13:325:13 | x | +| main.rs:317:17:317:17 | x | main.rs:317:17:317:17 | x | main.rs:320:5:320:5 | x | main.rs:322:19:322:19 | x | +| main.rs:332:9:332:9 | x | main.rs:332:9:332:9 | x | main.rs:334:7:334:7 | x | main.rs:344:13:344:13 | x | +| main.rs:336:14:336:14 | x | main.rs:336:14:336:14 | x | main.rs:339:5:339:5 | x | main.rs:341:19:341:19 | x | +| main.rs:351:9:351:9 | x | main.rs:351:9:351:9 | x | main.rs:353:7:353:7 | x | main.rs:364:15:364:15 | x | +| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:358:5:358:5 | x | main.rs:360:19:360:19 | x | +| main.rs:369:9:369:9 | x | main.rs:369:9:369:9 | x | main.rs:370:11:370:11 | x | main.rs:378:15:378:15 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | main.rs:385:7:385:7 | x | main.rs:390:7:390:7 | x | +| main.rs:383:9:383:9 | x | main.rs:383:9:383:9 | x | main.rs:390:7:390:7 | x | main.rs:394:19:394:19 | x | +| main.rs:410:14:410:14 | y | main.rs:410:14:410:14 | y | main.rs:411:16:411:16 | y | main.rs:413:22:413:22 | y | +| main.rs:438:13:438:15 | a10 | main.rs:438:13:438:15 | a10 | main.rs:442:15:442:17 | a10 | main.rs:451:9:451:11 | a10 | +| main.rs:439:13:439:14 | b4 | main.rs:439:13:439:14 | b4 | main.rs:443:15:443:16 | b4 | main.rs:452:9:452:10 | b4 | +| main.rs:440:13:440:14 | c2 | main.rs:440:13:440:14 | c2 | main.rs:444:15:444:16 | c2 | main.rs:453:9:453:10 | c2 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | main.rs:456:15:456:16 | b4 | main.rs:470:15:470:16 | b4 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | main.rs:455:15:455:17 | a10 | main.rs:469:15:469:17 | a10 | +| main.rs:492:9:492:9 | f | main.rs:492:9:492:9 | f | main.rs:495:15:495:15 | f | main.rs:502:15:502:15 | f | +| main.rs:533:5:533:5 | a | main.rs:532:13:532:13 | a | main.rs:534:15:534:15 | a | main.rs:535:11:535:11 | a | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:548:6:548:6 | x | main.rs:549:10:549:10 | x | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:549:10:549:10 | x | main.rs:550:10:550:10 | x | +| main.rs:547:17:547:17 | x | main.rs:547:17:547:17 | x | main.rs:550:10:550:10 | x | main.rs:551:12:551:12 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:555:6:555:6 | x | main.rs:556:10:556:10 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:556:10:556:10 | x | main.rs:557:10:557:10 | x | +| main.rs:554:22:554:22 | x | main.rs:554:22:554:22 | x | main.rs:557:10:557:10 | x | main.rs:559:9:559:9 | x | +| main.rs:565:22:565:27 | &mut x | main.rs:563:13:563:13 | x | main.rs:569:15:569:15 | x | main.rs:573:19:573:19 | x | +| main.rs:572:9:572:9 | w | main.rs:572:9:572:9 | w | main.rs:576:9:576:9 | w | main.rs:578:7:578:7 | w | +| main.rs:643:13:643:13 | x | main.rs:643:13:643:13 | x | main.rs:644:15:644:15 | x | main.rs:645:15:645:15 | x | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | main.rs:650:19:650:19 | x | main.rs:651:19:651:19 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | main.rs:654:19:654:19 | x | main.rs:655:19:655:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:665:19:665:19 | x | main.rs:673:19:673:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:665:19:665:19 | x | main.rs:675:19:675:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:667:19:667:19 | x | main.rs:673:19:673:19 | x | +| main.rs:661:9:661:9 | x | main.rs:661:9:661:9 | x | main.rs:667:19:667:19 | x | main.rs:675:19:675:19 | x | +| main.rs:693:17:693:17 | f | main.rs:693:17:693:17 | f | main.rs:697:9:697:9 | f | main.rs:698:9:698:9 | f | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | main.rs:705:5:705:5 | a | main.rs:706:15:706:15 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | main.rs:713:15:713:15 | a | main.rs:714:5:714:5 | a | +| main.rs:712:13:712:13 | a | main.rs:712:13:712:13 | a | main.rs:714:5:714:5 | a | main.rs:715:15:715:15 | a | +| main.rs:721:9:721:9 | x | main.rs:721:9:721:9 | x | main.rs:722:20:722:20 | x | main.rs:723:15:723:15 | x | +| main.rs:823:13:823:13 | x | main.rs:823:13:823:13 | x | main.rs:824:15:824:15 | x | main.rs:829:15:829:15 | x | phi -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | main.rs:210:22:210:23 | a3 | -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | main.rs:210:42:210:43 | a3 | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:9:224:81 | a4 | main.rs:224:28:224:29 | a4 | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:9:224:81 | a4 | main.rs:224:54:224:55 | a4 | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:9:224:81 | a4 | main.rs:224:79:224:80 | a4 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:9:228:83 | a5 | main.rs:228:10:228:57 | [match(true)] SSA phi(a5) | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:9:228:83 | a5 | main.rs:228:81:228:82 | a5 | -| main.rs:228:10:228:57 | [match(true)] SSA phi(a5) | main.rs:228:9:228:83 | a5 | main.rs:228:29:228:30 | a5 | -| main.rs:228:10:228:57 | [match(true)] SSA phi(a5) | main.rs:228:9:228:83 | a5 | main.rs:228:55:228:56 | a5 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | main.rs:232:28:232:29 | a6 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | main.rs:232:35:232:82 | SSA phi(a6) | -| main.rs:232:35:232:82 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | main.rs:232:55:232:56 | a6 | -| main.rs:232:35:232:82 | SSA phi(a6) | main.rs:232:9:232:83 | a6 | main.rs:232:80:232:81 | a6 | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | main.rs:240:22:240:23 | a7 | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:9:240:44 | a7 | main.rs:240:42:240:43 | a7 | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:14:252:51 | a11 | main.rs:252:27:252:29 | a11 | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:14:252:51 | a11 | main.rs:252:48:252:50 | a11 | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:274:27:274:29 | a13 | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:274:35:274:82 | [match(true)] SSA phi(a13) | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:274:106:274:108 | a13 | -| main.rs:274:35:274:82 | [match(true)] SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:274:54:274:56 | a13 | -| main.rs:274:35:274:82 | [match(true)] SSA phi(a13) | main.rs:274:9:274:109 | a13 | main.rs:274:79:274:81 | a13 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:20:395:55 | a9 | main.rs:395:33:395:34 | a9 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:20:395:55 | a9 | main.rs:395:53:395:54 | a9 | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:607:13:607:13 | x | main.rs:613:9:613:9 | x | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:607:13:607:13 | x | main.rs:617:9:617:9 | x | -| main.rs:748:17:750:9 | SSA phi(x) | main.rs:745:13:745:13 | x | main.rs:746:19:751:5 | x | -| main.rs:748:17:750:9 | SSA phi(x) | main.rs:745:13:745:13 | x | main.rs:749:13:749:13 | x | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:9:245:44 | a3 | main.rs:245:22:245:23 | a3 | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:9:245:44 | a3 | main.rs:245:42:245:43 | a3 | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:9:259:81 | a4 | main.rs:259:28:259:29 | a4 | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:9:259:81 | a4 | main.rs:259:54:259:55 | a4 | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:9:259:81 | a4 | main.rs:259:79:259:80 | a4 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:9:263:83 | a5 | main.rs:263:10:263:57 | [match(true)] SSA phi(a5) | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:9:263:83 | a5 | main.rs:263:81:263:82 | a5 | +| main.rs:263:10:263:57 | [match(true)] SSA phi(a5) | main.rs:263:9:263:83 | a5 | main.rs:263:29:263:30 | a5 | +| main.rs:263:10:263:57 | [match(true)] SSA phi(a5) | main.rs:263:9:263:83 | a5 | main.rs:263:55:263:56 | a5 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | main.rs:267:28:267:29 | a6 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | main.rs:267:35:267:82 | SSA phi(a6) | +| main.rs:267:35:267:82 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | main.rs:267:55:267:56 | a6 | +| main.rs:267:35:267:82 | SSA phi(a6) | main.rs:267:9:267:83 | a6 | main.rs:267:80:267:81 | a6 | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | main.rs:275:22:275:23 | a7 | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:9:275:44 | a7 | main.rs:275:42:275:43 | a7 | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:14:287:51 | a11 | main.rs:287:27:287:29 | a11 | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:14:287:51 | a11 | main.rs:287:48:287:50 | a11 | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:309:27:309:29 | a13 | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:309:35:309:82 | [match(true)] SSA phi(a13) | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:309:106:309:108 | a13 | +| main.rs:309:35:309:82 | [match(true)] SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:309:54:309:56 | a13 | +| main.rs:309:35:309:82 | [match(true)] SSA phi(a13) | main.rs:309:9:309:109 | a13 | main.rs:309:79:309:81 | a13 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:20:431:55 | a9 | main.rs:431:33:431:34 | a9 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:20:431:55 | a9 | main.rs:431:53:431:54 | a9 | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:643:13:643:13 | x | main.rs:649:9:649:9 | x | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:643:13:643:13 | x | main.rs:653:9:653:9 | x | +| main.rs:784:17:786:9 | SSA phi(x) | main.rs:781:13:781:13 | x | main.rs:782:19:787:5 | x | +| main.rs:784:17:786:9 | SSA phi(x) | main.rs:781:13:781:13 | x | main.rs:785:13:785:13 | x | phiReadNode -| main.rs:116:11:116:12 | SSA phi read(s1) | main.rs:113:9:113:10 | s1 | -| main.rs:627:13:632:5 | SSA phi read(x) | main.rs:625:9:625:9 | x | +| main.rs:116:11:116:11 | SSA phi read(s) | main.rs:113:9:113:9 | s | +| main.rs:663:13:668:5 | SSA phi read(x) | main.rs:661:9:661:9 | x | phiReadNodeFirstRead -| main.rs:116:11:116:12 | SSA phi read(s1) | main.rs:113:9:113:10 | s1 | main.rs:116:11:116:12 | s1 | -| main.rs:627:13:632:5 | SSA phi read(x) | main.rs:625:9:625:9 | x | main.rs:637:19:637:19 | x | -| main.rs:627:13:632:5 | SSA phi read(x) | main.rs:625:9:625:9 | x | main.rs:639:19:639:19 | x | +| main.rs:116:11:116:11 | SSA phi read(s) | main.rs:113:9:113:9 | s | main.rs:116:11:116:11 | s | +| main.rs:663:13:668:5 | SSA phi read(x) | main.rs:661:9:661:9 | x | main.rs:673:19:673:19 | x | +| main.rs:663:13:668:5 | SSA phi read(x) | main.rs:661:9:661:9 | x | main.rs:675:19:675:19 | x | phiReadInput -| main.rs:116:11:116:12 | SSA phi read(s1) | main.rs:113:9:113:10 | s1 | -| main.rs:116:11:116:12 | SSA phi read(s1) | main.rs:116:11:116:12 | SSA read(s1) | -| main.rs:627:13:632:5 | SSA phi read(x) | main.rs:629:19:629:19 | SSA read(x) | -| main.rs:627:13:632:5 | SSA phi read(x) | main.rs:631:19:631:19 | SSA read(x) | +| main.rs:116:11:116:11 | SSA phi read(s) | main.rs:113:9:113:9 | s | +| main.rs:116:11:116:11 | SSA phi read(s) | main.rs:116:11:116:11 | SSA read(s) | +| main.rs:663:13:668:5 | SSA phi read(x) | main.rs:665:19:665:19 | SSA read(x) | +| main.rs:663:13:668:5 | SSA phi read(x) | main.rs:667:19:667:19 | SSA read(x) | ultimateDef -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:22:210:23 | a3 | -| main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:42:210:43 | a3 | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:28:224:29 | a4 | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:54:224:55 | a4 | -| main.rs:224:9:224:81 | SSA phi(a4) | main.rs:224:79:224:80 | a4 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:29:228:30 | a5 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:55:228:56 | a5 | -| main.rs:228:9:228:83 | SSA phi(a5) | main.rs:228:81:228:82 | a5 | -| main.rs:228:10:228:57 | [match(true)] SSA phi(a5) | main.rs:228:29:228:30 | a5 | -| main.rs:228:10:228:57 | [match(true)] SSA phi(a5) | main.rs:228:55:228:56 | a5 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:28:232:29 | a6 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:55:232:56 | a6 | -| main.rs:232:9:232:83 | SSA phi(a6) | main.rs:232:80:232:81 | a6 | -| main.rs:232:35:232:82 | SSA phi(a6) | main.rs:232:55:232:56 | a6 | -| main.rs:232:35:232:82 | SSA phi(a6) | main.rs:232:80:232:81 | a6 | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:22:240:23 | a7 | -| main.rs:240:9:240:44 | [match(true)] SSA phi(a7) | main.rs:240:42:240:43 | a7 | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:27:252:29 | a11 | -| main.rs:252:14:252:51 | [match(true)] SSA phi(a11) | main.rs:252:48:252:50 | a11 | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:27:274:29 | a13 | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:54:274:56 | a13 | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:79:274:81 | a13 | -| main.rs:274:9:274:109 | SSA phi(a13) | main.rs:274:106:274:108 | a13 | -| main.rs:274:35:274:82 | [match(true)] SSA phi(a13) | main.rs:274:54:274:56 | a13 | -| main.rs:274:35:274:82 | [match(true)] SSA phi(a13) | main.rs:274:79:274:81 | a13 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:33:395:34 | a9 | -| main.rs:395:20:395:55 | SSA phi(a9) | main.rs:395:53:395:54 | a9 | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:613:9:613:9 | x | -| main.rs:611:13:620:5 | SSA phi(x) | main.rs:617:9:617:9 | x | -| main.rs:748:17:750:9 | SSA phi(x) | main.rs:746:19:751:5 | x | -| main.rs:748:17:750:9 | SSA phi(x) | main.rs:749:13:749:13 | x | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:22:245:23 | a3 | +| main.rs:245:9:245:44 | SSA phi(a3) | main.rs:245:42:245:43 | a3 | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:28:259:29 | a4 | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:54:259:55 | a4 | +| main.rs:259:9:259:81 | SSA phi(a4) | main.rs:259:79:259:80 | a4 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:29:263:30 | a5 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:55:263:56 | a5 | +| main.rs:263:9:263:83 | SSA phi(a5) | main.rs:263:81:263:82 | a5 | +| main.rs:263:10:263:57 | [match(true)] SSA phi(a5) | main.rs:263:29:263:30 | a5 | +| main.rs:263:10:263:57 | [match(true)] SSA phi(a5) | main.rs:263:55:263:56 | a5 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:28:267:29 | a6 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:55:267:56 | a6 | +| main.rs:267:9:267:83 | SSA phi(a6) | main.rs:267:80:267:81 | a6 | +| main.rs:267:35:267:82 | SSA phi(a6) | main.rs:267:55:267:56 | a6 | +| main.rs:267:35:267:82 | SSA phi(a6) | main.rs:267:80:267:81 | a6 | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:22:275:23 | a7 | +| main.rs:275:9:275:44 | [match(true)] SSA phi(a7) | main.rs:275:42:275:43 | a7 | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:27:287:29 | a11 | +| main.rs:287:14:287:51 | [match(true)] SSA phi(a11) | main.rs:287:48:287:50 | a11 | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:27:309:29 | a13 | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:54:309:56 | a13 | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:79:309:81 | a13 | +| main.rs:309:9:309:109 | SSA phi(a13) | main.rs:309:106:309:108 | a13 | +| main.rs:309:35:309:82 | [match(true)] SSA phi(a13) | main.rs:309:54:309:56 | a13 | +| main.rs:309:35:309:82 | [match(true)] SSA phi(a13) | main.rs:309:79:309:81 | a13 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:33:431:34 | a9 | +| main.rs:431:20:431:55 | SSA phi(a9) | main.rs:431:53:431:54 | a9 | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:649:9:649:9 | x | +| main.rs:647:13:656:5 | SSA phi(x) | main.rs:653:9:653:9 | x | +| main.rs:784:17:786:9 | SSA phi(x) | main.rs:782:19:787:5 | x | +| main.rs:784:17:786:9 | SSA phi(x) | main.rs:785:13:785:13 | x | assigns | main.rs:20:9:20:10 | x1 | main.rs:20:14:20:16 | "a" | | main.rs:25:13:25:14 | x2 | main.rs:25:18:25:18 | 4 | @@ -727,77 +767,87 @@ assigns | main.rs:91:9:91:10 | s1 | main.rs:91:14:91:41 | Some(...) | | main.rs:100:9:100:9 | x | main.rs:100:13:100:22 | Some(...) | | main.rs:104:13:104:13 | x | main.rs:105:13:105:13 | x | -| main.rs:113:9:113:10 | s1 | main.rs:113:14:113:41 | Some(...) | -| main.rs:122:9:122:10 | x6 | main.rs:122:14:122:20 | Some(...) | -| main.rs:123:9:123:10 | y1 | main.rs:123:14:123:15 | 10 | -| main.rs:139:9:139:15 | numbers | main.rs:139:19:139:35 | TupleExpr | -| main.rs:170:9:170:10 | p2 | main.rs:170:14:170:37 | Point {...} | -| main.rs:184:9:184:11 | msg | main.rs:184:15:184:38 | ...::Hello {...} | -| main.rs:208:9:208:14 | either | main.rs:208:18:208:33 | ...::Left(...) | -| main.rs:222:9:222:10 | tv | main.rs:222:14:222:36 | ...::Second(...) | -| main.rs:238:9:238:14 | either | main.rs:238:18:238:33 | ...::Left(...) | -| main.rs:248:9:248:14 | either | main.rs:248:18:248:33 | ...::Left(...) | -| main.rs:272:9:272:10 | fv | main.rs:272:14:272:35 | ...::Second(...) | -| main.rs:281:9:281:9 | x | main.rs:281:12:281:19 | Some(...) | -| main.rs:289:13:289:13 | x | main.rs:290:13:290:13 | x | -| main.rs:297:9:297:9 | x | main.rs:297:13:297:20 | Some(...) | -| main.rs:308:13:308:13 | x | main.rs:309:13:309:13 | x | -| main.rs:316:9:316:9 | x | main.rs:316:13:316:20 | Some(...) | -| main.rs:334:9:334:9 | x | main.rs:334:13:334:20 | Some(...) | -| main.rs:337:20:337:20 | x | main.rs:338:18:338:18 | x | -| main.rs:348:9:348:9 | x | main.rs:348:13:348:18 | Ok(...) | -| main.rs:364:9:364:9 | x | main.rs:364:13:364:19 | Some(...) | -| main.rs:373:9:373:9 | x | main.rs:373:13:373:20 | Some(...) | -| main.rs:438:9:438:23 | example_closure | main.rs:439:9:440:9 | \|...\| x | -| main.rs:441:9:441:10 | n1 | main.rs:442:9:442:26 | example_closure(...) | -| main.rs:446:9:446:26 | immutable_variable | main.rs:447:5:448:9 | \|...\| x | -| main.rs:449:9:449:10 | n2 | main.rs:450:9:450:29 | immutable_variable(...) | -| main.rs:456:9:456:9 | f | main.rs:457:9:458:9 | \|...\| x | -| main.rs:479:13:479:13 | f | main.rs:480:13:481:13 | \|...\| x | -| main.rs:487:9:487:9 | v | main.rs:487:13:487:41 | &... | -| main.rs:496:13:496:13 | a | main.rs:496:17:496:17 | 0 | -| main.rs:504:13:504:13 | i | main.rs:504:17:504:17 | 1 | -| main.rs:505:9:505:13 | ref_i | main.rs:506:9:506:14 | &mut i | -| main.rs:527:13:527:13 | x | main.rs:527:17:527:17 | 2 | -| main.rs:528:9:528:9 | y | main.rs:529:9:529:28 | mutate_param(...) | -| main.rs:535:13:535:13 | z | main.rs:535:17:535:17 | 4 | -| main.rs:536:9:536:9 | w | main.rs:537:9:537:19 | &mut ... | -| main.rs:549:13:549:13 | x | main.rs:549:17:549:17 | 1 | -| main.rs:550:9:550:9 | y | main.rs:551:9:551:14 | &mut x | -| main.rs:557:9:557:9 | x | main.rs:557:13:557:15 | 100 | -| main.rs:560:9:560:11 | cap | main.rs:560:15:562:5 | \|...\| ... | -| main.rs:568:13:568:13 | x | main.rs:568:17:568:17 | 1 | -| main.rs:571:9:571:16 | closure1 | main.rs:571:20:573:5 | \|...\| ... | -| main.rs:577:13:577:13 | y | main.rs:577:17:577:17 | 2 | -| main.rs:580:13:580:20 | closure2 | main.rs:580:24:582:5 | \|...\| ... | -| main.rs:581:9:581:9 | y | main.rs:581:13:581:13 | 3 | -| main.rs:586:13:586:13 | z | main.rs:586:17:586:17 | 2 | -| main.rs:589:13:589:20 | closure3 | main.rs:589:24:591:5 | \|...\| ... | -| main.rs:597:13:597:13 | i | main.rs:597:22:597:22 | 0 | -| main.rs:598:9:598:13 | block | main.rs:598:17:600:5 | { ... } | -| main.rs:599:9:599:9 | i | main.rs:599:13:599:13 | 1 | -| main.rs:607:13:607:13 | x | main.rs:607:17:607:17 | 1 | -| main.rs:613:9:613:9 | x | main.rs:613:13:613:13 | 2 | -| main.rs:617:9:617:9 | x | main.rs:617:13:617:13 | 3 | -| main.rs:625:9:625:9 | x | main.rs:625:13:625:13 | 1 | -| main.rs:657:17:657:17 | f | main.rs:657:21:660:9 | \|...\| ... | -| main.rs:667:13:667:13 | a | main.rs:667:17:667:35 | MyStruct {...} | -| main.rs:671:5:671:5 | a | main.rs:671:9:671:27 | MyStruct {...} | -| main.rs:676:13:676:13 | a | main.rs:676:17:676:25 | [...] | -| main.rs:680:5:680:5 | a | main.rs:680:9:680:17 | [...] | -| main.rs:685:9:685:9 | x | main.rs:685:13:685:14 | 16 | -| main.rs:689:9:689:9 | z | main.rs:689:13:689:14 | 17 | -| main.rs:704:13:704:13 | a | main.rs:704:17:704:35 | MyStruct {...} | -| main.rs:726:9:726:22 | var_from_macro | main.rs:727:9:727:25 | MacroExpr | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:23:727:24 | 37 | -| main.rs:729:9:729:20 | var_in_macro | main.rs:729:24:729:25 | 33 | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | 0 | -| main.rs:740:5:740:5 | x | main.rs:740:9:740:9 | 1 | -| main.rs:745:13:745:13 | x | main.rs:745:17:745:19 | 100 | -| main.rs:746:13:746:15 | cap | main.rs:746:19:751:5 | \|...\| ... | -| main.rs:749:13:749:13 | x | main.rs:749:17:749:19 | 200 | -| main.rs:759:13:759:13 | x | main.rs:759:17:759:24 | Some(...) | -| main.rs:760:13:760:13 | y | main.rs:761:13:767:9 | match x { ... } | -| main.rs:776:13:776:22 | test_alias | main.rs:777:13:777:16 | test | -| main.rs:778:13:778:16 | test | main.rs:779:13:779:24 | test_alias(...) | -| main.rs:787:13:787:13 | x | main.rs:787:17:787:23 | Some(...) | +| main.rs:113:9:113:9 | s | main.rs:113:13:113:40 | Some(...) | +| main.rs:133:9:133:9 | x | main.rs:133:13:133:13 | 1 | +| main.rs:134:12:134:12 | x | main.rs:135:9:135:13 | ... + ... | +| main.rs:136:12:136:12 | x | main.rs:137:9:137:13 | ... + ... | +| main.rs:138:12:138:12 | x | main.rs:139:9:139:13 | ... + ... | +| main.rs:140:12:140:12 | x | main.rs:141:9:141:13 | ... + ... | +| main.rs:142:12:142:12 | x | main.rs:143:9:143:13 | ... + ... | +| main.rs:144:12:144:12 | x | main.rs:145:9:145:13 | ... + ... | +| main.rs:146:12:146:12 | x | main.rs:147:9:147:13 | ... + ... | +| main.rs:157:9:157:10 | x6 | main.rs:157:14:157:20 | Some(...) | +| main.rs:158:9:158:10 | y1 | main.rs:158:14:158:15 | 10 | +| main.rs:174:9:174:15 | numbers | main.rs:174:19:174:35 | TupleExpr | +| main.rs:205:9:205:10 | p2 | main.rs:205:14:205:37 | Point {...} | +| main.rs:219:9:219:11 | msg | main.rs:219:15:219:38 | ...::Hello {...} | +| main.rs:243:9:243:14 | either | main.rs:243:18:243:33 | ...::Left(...) | +| main.rs:257:9:257:10 | tv | main.rs:257:14:257:36 | ...::Second(...) | +| main.rs:273:9:273:14 | either | main.rs:273:18:273:33 | ...::Left(...) | +| main.rs:283:9:283:14 | either | main.rs:283:18:283:33 | ...::Left(...) | +| main.rs:307:9:307:10 | fv | main.rs:307:14:307:35 | ...::Second(...) | +| main.rs:316:9:316:9 | x | main.rs:316:12:316:19 | Some(...) | +| main.rs:324:13:324:13 | x | main.rs:325:13:325:13 | x | +| main.rs:332:9:332:9 | x | main.rs:332:13:332:20 | Some(...) | +| main.rs:343:13:343:13 | x | main.rs:344:13:344:13 | x | +| main.rs:351:9:351:9 | x | main.rs:351:13:351:20 | Some(...) | +| main.rs:369:9:369:9 | x | main.rs:369:13:369:20 | Some(...) | +| main.rs:372:20:372:20 | x | main.rs:373:18:373:18 | x | +| main.rs:383:9:383:9 | x | main.rs:383:13:383:18 | Ok(...) | +| main.rs:399:9:399:9 | x | main.rs:399:13:399:19 | Some(...) | +| main.rs:408:9:408:9 | x | main.rs:408:13:408:20 | Some(...) | +| main.rs:474:9:474:23 | example_closure | main.rs:475:9:476:9 | \|...\| x | +| main.rs:477:9:477:10 | n1 | main.rs:478:9:478:26 | example_closure(...) | +| main.rs:482:9:482:26 | immutable_variable | main.rs:483:5:484:9 | \|...\| x | +| main.rs:485:9:485:10 | n2 | main.rs:486:9:486:29 | immutable_variable(...) | +| main.rs:492:9:492:9 | f | main.rs:493:9:494:9 | \|...\| x | +| main.rs:515:13:515:13 | f | main.rs:516:13:517:13 | \|...\| x | +| main.rs:523:9:523:9 | v | main.rs:523:13:523:41 | &... | +| main.rs:532:13:532:13 | a | main.rs:532:17:532:17 | 0 | +| main.rs:540:13:540:13 | i | main.rs:540:17:540:17 | 1 | +| main.rs:541:9:541:13 | ref_i | main.rs:542:9:542:14 | &mut i | +| main.rs:563:13:563:13 | x | main.rs:563:17:563:17 | 2 | +| main.rs:564:9:564:9 | y | main.rs:565:9:565:28 | mutate_param(...) | +| main.rs:571:13:571:13 | z | main.rs:571:17:571:17 | 4 | +| main.rs:572:9:572:9 | w | main.rs:573:9:573:19 | &mut ... | +| main.rs:585:13:585:13 | x | main.rs:585:17:585:17 | 1 | +| main.rs:586:9:586:9 | y | main.rs:587:9:587:14 | &mut x | +| main.rs:593:9:593:9 | x | main.rs:593:13:593:15 | 100 | +| main.rs:596:9:596:11 | cap | main.rs:596:15:598:5 | \|...\| ... | +| main.rs:604:13:604:13 | x | main.rs:604:17:604:17 | 1 | +| main.rs:607:9:607:16 | closure1 | main.rs:607:20:609:5 | \|...\| ... | +| main.rs:613:13:613:13 | y | main.rs:613:17:613:17 | 2 | +| main.rs:616:13:616:20 | closure2 | main.rs:616:24:618:5 | \|...\| ... | +| main.rs:617:9:617:9 | y | main.rs:617:13:617:13 | 3 | +| main.rs:622:13:622:13 | z | main.rs:622:17:622:17 | 2 | +| main.rs:625:13:625:20 | closure3 | main.rs:625:24:627:5 | \|...\| ... | +| main.rs:633:13:633:13 | i | main.rs:633:22:633:22 | 0 | +| main.rs:634:9:634:13 | block | main.rs:634:17:636:5 | { ... } | +| main.rs:635:9:635:9 | i | main.rs:635:13:635:13 | 1 | +| main.rs:643:13:643:13 | x | main.rs:643:17:643:17 | 1 | +| main.rs:649:9:649:9 | x | main.rs:649:13:649:13 | 2 | +| main.rs:653:9:653:9 | x | main.rs:653:13:653:13 | 3 | +| main.rs:661:9:661:9 | x | main.rs:661:13:661:13 | 1 | +| main.rs:693:17:693:17 | f | main.rs:693:21:696:9 | \|...\| ... | +| main.rs:703:13:703:13 | a | main.rs:703:17:703:35 | MyStruct {...} | +| main.rs:707:5:707:5 | a | main.rs:707:9:707:27 | MyStruct {...} | +| main.rs:712:13:712:13 | a | main.rs:712:17:712:25 | [...] | +| main.rs:716:5:716:5 | a | main.rs:716:9:716:17 | [...] | +| main.rs:721:9:721:9 | x | main.rs:721:13:721:14 | 16 | +| main.rs:725:9:725:9 | z | main.rs:725:13:725:14 | 17 | +| main.rs:740:13:740:13 | a | main.rs:740:17:740:35 | MyStruct {...} | +| main.rs:762:9:762:22 | var_from_macro | main.rs:763:9:763:25 | MacroExpr | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:23:763:24 | 37 | +| main.rs:765:9:765:20 | var_in_macro | main.rs:765:24:765:25 | 33 | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:15:770:28 | 0 | +| main.rs:776:5:776:5 | x | main.rs:776:9:776:9 | 1 | +| main.rs:781:13:781:13 | x | main.rs:781:17:781:19 | 100 | +| main.rs:782:13:782:15 | cap | main.rs:782:19:787:5 | \|...\| ... | +| main.rs:785:13:785:13 | x | main.rs:785:17:785:19 | 200 | +| main.rs:795:13:795:13 | x | main.rs:795:17:795:24 | Some(...) | +| main.rs:796:13:796:13 | y | main.rs:797:13:803:9 | match x { ... } | +| main.rs:812:13:812:22 | test_alias | main.rs:813:13:813:16 | test | +| main.rs:814:13:814:16 | test | main.rs:815:13:815:24 | test_alias(...) | +| main.rs:823:13:823:13 | x | main.rs:823:17:823:23 | Some(...) | +| main.rs:838:9:838:9 | x | main.rs:838:13:838:13 | 1 | +| main.rs:840:13:840:13 | x | main.rs:840:17:840:17 | 1 | diff --git a/rust/ql/test/library-tests/variables/main.rs b/rust/ql/test/library-tests/variables/main.rs index fe13f89b1775..1435d79aaca8 100644 --- a/rust/ql/test/library-tests/variables/main.rs +++ b/rust/ql/test/library-tests/variables/main.rs @@ -110,11 +110,46 @@ fn let_pattern4() { } fn let_pattern5() { - let s1 = Some(String::from("Hello!")); // s1 + let s = Some(String::from("Hello!")); // s1 - while let Some(ref s2) // s2 - = s1 { // $ read_access=s1 - print_str(s2); // $ read_access=s2 + while let Some(ref s) // s2 + = s { // $ read_access=s1 + print_str(s); // $ read_access=s2 + } +} + +#[rustfmt::skip] +fn let_pattern6() { + if let Some(x) = Some(43) // x1 + && let Ok(x) = // x2 + Ok::<_, ()>(x) // $ read_access=x1 + { + print_i64(x); // $ read_access=x2 + } +} + +#[rustfmt::skip] +fn let_pattern7() { + let x = 1; // x1 + if let x = // x2 + x + 1 // $ read_access=x1 + && let x = // x3 + x + 1 // $ read_access=x2 + && let x = // x4 + x + 1 // $ read_access=x3 + && let x = // x5 + x + 1 // $ read_access=x4 + && let x = // x6 + x + 1 // $ read_access=x5 + && let x = // x7 + x + 1 // $ read_access=x6 + && let x = // x8 + x + 1 // $ read_access=x7 + { + print_i64(x); // $ read_access=x8 + } + else { + print_i64(x); // $ read_access=x1 } } @@ -373,7 +408,8 @@ fn match_pattern16() { let x = Some(32); match x { // $ read_access=x Some(y) // y1 - if let Some(y) = // y2 + if y > 0 && // $ read_access=y1 + let Some(y) = // y2 Some(y) // $ read_access=y1 => print_i64(y), // $ read_access=y2 _ => {}, @@ -798,6 +834,18 @@ mod patterns { } } +fn let_in_block_in_cond() { + let x = 1; // x1 + if { + let x = 1; // x2 + x > 0 // $ read_access=x2 + } { + print_i64(x); // $ read_access=x1 + } else { + print_i64(x); // $ read_access=x1 + } +} + fn main() { immutable_variable(); mutable_variable(); @@ -808,6 +856,8 @@ fn main() { let_pattern2(); let_pattern3(); let_pattern4(); + let_pattern5(); + let_pattern6(); match_pattern1(); match_pattern2(); match_pattern3(); @@ -842,4 +892,5 @@ fn main() { ref_methodcall_receiver(); macro_invocation(); capture_phi(); + let_in_block_in_cond(); } diff --git a/rust/ql/test/library-tests/variables/variables.expected b/rust/ql/test/library-tests/variables/variables.expected index ea360357d970..de94e8263937 100644 --- a/rust/ql/test/library-tests/variables/variables.expected +++ b/rust/ql/test/library-tests/variables/variables.expected @@ -22,134 +22,146 @@ variable | main.rs:100:9:100:9 | x | | main.rs:101:14:101:14 | x | | main.rs:104:13:104:13 | x | -| main.rs:113:9:113:10 | s1 | -| main.rs:115:24:115:25 | s2 | -| main.rs:122:9:122:10 | x6 | -| main.rs:123:9:123:10 | y1 | -| main.rs:127:14:127:15 | y1 | -| main.rs:139:9:139:15 | numbers | -| main.rs:144:13:144:17 | first | -| main.rs:146:13:146:17 | third | -| main.rs:148:13:148:17 | fifth | -| main.rs:159:13:159:17 | first | -| main.rs:161:13:161:16 | last | -| main.rs:170:9:170:10 | p2 | -| main.rs:174:16:174:17 | x7 | -| main.rs:184:9:184:11 | msg | -| main.rs:189:17:189:27 | id_variable | -| main.rs:194:26:194:27 | id | -| main.rs:208:9:208:14 | either | -| main.rs:210:9:210:44 | a3 | -| main.rs:222:9:222:10 | tv | -| main.rs:224:9:224:81 | a4 | -| main.rs:228:9:228:83 | a5 | -| main.rs:232:9:232:83 | a6 | -| main.rs:238:9:238:14 | either | -| main.rs:240:9:240:44 | a7 | -| main.rs:248:9:248:14 | either | -| main.rs:251:13:251:13 | e | -| main.rs:252:14:252:51 | a11 | -| main.rs:255:33:255:35 | a12 | -| main.rs:272:9:272:10 | fv | -| main.rs:274:9:274:109 | a13 | -| main.rs:281:9:281:9 | x | -| main.rs:282:17:282:17 | x | -| main.rs:289:13:289:13 | x | -| main.rs:297:9:297:9 | x | -| main.rs:298:17:298:17 | x | -| main.rs:301:14:301:14 | x | -| main.rs:308:13:308:13 | x | +| main.rs:113:9:113:9 | s | +| main.rs:115:24:115:24 | s | +| main.rs:123:17:123:17 | x | +| main.rs:124:19:124:19 | x | +| main.rs:133:9:133:9 | x | +| main.rs:134:12:134:12 | x | +| main.rs:136:12:136:12 | x | +| main.rs:138:12:138:12 | x | +| main.rs:140:12:140:12 | x | +| main.rs:142:12:142:12 | x | +| main.rs:144:12:144:12 | x | +| main.rs:146:12:146:12 | x | +| main.rs:157:9:157:10 | x6 | +| main.rs:158:9:158:10 | y1 | +| main.rs:162:14:162:15 | y1 | +| main.rs:174:9:174:15 | numbers | +| main.rs:179:13:179:17 | first | +| main.rs:181:13:181:17 | third | +| main.rs:183:13:183:17 | fifth | +| main.rs:194:13:194:17 | first | +| main.rs:196:13:196:16 | last | +| main.rs:205:9:205:10 | p2 | +| main.rs:209:16:209:17 | x7 | +| main.rs:219:9:219:11 | msg | +| main.rs:224:17:224:27 | id_variable | +| main.rs:229:26:229:27 | id | +| main.rs:243:9:243:14 | either | +| main.rs:245:9:245:44 | a3 | +| main.rs:257:9:257:10 | tv | +| main.rs:259:9:259:81 | a4 | +| main.rs:263:9:263:83 | a5 | +| main.rs:267:9:267:83 | a6 | +| main.rs:273:9:273:14 | either | +| main.rs:275:9:275:44 | a7 | +| main.rs:283:9:283:14 | either | +| main.rs:286:13:286:13 | e | +| main.rs:287:14:287:51 | a11 | +| main.rs:290:33:290:35 | a12 | +| main.rs:307:9:307:10 | fv | +| main.rs:309:9:309:109 | a13 | | main.rs:316:9:316:9 | x | -| main.rs:317:20:317:20 | x | -| main.rs:320:14:320:14 | x | -| main.rs:334:9:334:9 | x | +| main.rs:317:17:317:17 | x | +| main.rs:324:13:324:13 | x | +| main.rs:332:9:332:9 | x | +| main.rs:333:17:333:17 | x | | main.rs:336:14:336:14 | x | -| main.rs:337:20:337:20 | x | -| main.rs:348:9:348:9 | x | -| main.rs:349:16:349:16 | x | -| main.rs:354:20:354:20 | x | -| main.rs:364:9:364:9 | x | -| main.rs:366:18:366:18 | x | -| main.rs:373:9:373:9 | x | -| main.rs:375:14:375:14 | y | -| main.rs:376:25:376:25 | y | -| main.rs:384:5:384:6 | a8 | -| main.rs:386:9:386:10 | b3 | -| main.rs:387:9:387:10 | c1 | -| main.rs:395:20:395:55 | a9 | -| main.rs:402:13:402:15 | a10 | -| main.rs:403:13:403:14 | b4 | -| main.rs:404:13:404:14 | c2 | -| main.rs:425:13:425:15 | a10 | -| main.rs:426:13:426:14 | b4 | -| main.rs:438:9:438:23 | example_closure | -| main.rs:439:10:439:10 | x | -| main.rs:441:9:441:10 | n1 | -| main.rs:446:9:446:26 | immutable_variable | -| main.rs:447:6:447:6 | x | -| main.rs:449:9:449:10 | n2 | -| main.rs:456:9:456:9 | f | -| main.rs:457:10:457:10 | x | -| main.rs:461:10:461:10 | x | -| main.rs:470:14:470:14 | x | -| main.rs:479:13:479:13 | f | -| main.rs:480:14:480:14 | x | -| main.rs:487:9:487:9 | v | -| main.rs:489:9:489:12 | text | -| main.rs:496:13:496:13 | a | -| main.rs:504:13:504:13 | i | -| main.rs:505:9:505:13 | ref_i | -| main.rs:511:17:511:17 | x | -| main.rs:518:22:518:22 | x | -| main.rs:518:38:518:38 | y | -| main.rs:527:13:527:13 | x | -| main.rs:528:9:528:9 | y | -| main.rs:535:13:535:13 | z | -| main.rs:536:9:536:9 | w | -| main.rs:549:13:549:13 | x | -| main.rs:550:9:550:9 | y | -| main.rs:557:9:557:9 | x | -| main.rs:560:9:560:11 | cap | -| main.rs:568:13:568:13 | x | -| main.rs:571:9:571:16 | closure1 | -| main.rs:577:13:577:13 | y | -| main.rs:580:13:580:20 | closure2 | -| main.rs:586:13:586:13 | z | -| main.rs:589:13:589:20 | closure3 | -| main.rs:597:13:597:13 | i | -| main.rs:598:9:598:13 | block | -| main.rs:606:8:606:8 | b | -| main.rs:607:13:607:13 | x | -| main.rs:624:13:624:14 | b1 | -| main.rs:624:23:624:24 | b2 | -| main.rs:625:9:625:9 | x | -| main.rs:648:20:648:23 | self | -| main.rs:652:11:652:14 | self | -| main.rs:656:23:656:26 | self | -| main.rs:657:17:657:17 | f | -| main.rs:657:22:657:22 | n | -| main.rs:667:13:667:13 | a | -| main.rs:676:13:676:13 | a | -| main.rs:685:9:685:9 | x | -| main.rs:689:9:689:9 | z | -| main.rs:698:17:698:20 | self | -| main.rs:704:13:704:13 | a | -| main.rs:726:9:726:22 | var_from_macro | -| main.rs:727:9:727:21 | var_in_macro | -| main.rs:729:9:729:20 | var_in_macro | -| main.rs:734:15:734:28 | var_in_macro | -| main.rs:739:9:739:9 | x | -| main.rs:745:13:745:13 | x | -| main.rs:746:13:746:15 | cap | -| main.rs:746:20:746:20 | b | -| main.rs:759:13:759:13 | x | -| main.rs:760:13:760:13 | y | -| main.rs:762:18:762:18 | y | -| main.rs:769:13:769:16 | N0ne | -| main.rs:776:13:776:22 | test_alias | -| main.rs:778:13:778:16 | test | -| main.rs:787:13:787:13 | x | -| main.rs:789:18:789:18 | x | +| main.rs:343:13:343:13 | x | +| main.rs:351:9:351:9 | x | +| main.rs:352:20:352:20 | x | +| main.rs:355:14:355:14 | x | +| main.rs:369:9:369:9 | x | +| main.rs:371:14:371:14 | x | +| main.rs:372:20:372:20 | x | +| main.rs:383:9:383:9 | x | +| main.rs:384:16:384:16 | x | +| main.rs:389:20:389:20 | x | +| main.rs:399:9:399:9 | x | +| main.rs:401:18:401:18 | x | +| main.rs:408:9:408:9 | x | +| main.rs:410:14:410:14 | y | +| main.rs:412:22:412:22 | y | +| main.rs:420:5:420:6 | a8 | +| main.rs:422:9:422:10 | b3 | +| main.rs:423:9:423:10 | c1 | +| main.rs:431:20:431:55 | a9 | +| main.rs:438:13:438:15 | a10 | +| main.rs:439:13:439:14 | b4 | +| main.rs:440:13:440:14 | c2 | +| main.rs:461:13:461:15 | a10 | +| main.rs:462:13:462:14 | b4 | +| main.rs:474:9:474:23 | example_closure | +| main.rs:475:10:475:10 | x | +| main.rs:477:9:477:10 | n1 | +| main.rs:482:9:482:26 | immutable_variable | +| main.rs:483:6:483:6 | x | +| main.rs:485:9:485:10 | n2 | +| main.rs:492:9:492:9 | f | +| main.rs:493:10:493:10 | x | +| main.rs:497:10:497:10 | x | +| main.rs:506:14:506:14 | x | +| main.rs:515:13:515:13 | f | +| main.rs:516:14:516:14 | x | +| main.rs:523:9:523:9 | v | +| main.rs:525:9:525:12 | text | +| main.rs:532:13:532:13 | a | +| main.rs:540:13:540:13 | i | +| main.rs:541:9:541:13 | ref_i | +| main.rs:547:17:547:17 | x | +| main.rs:554:22:554:22 | x | +| main.rs:554:38:554:38 | y | +| main.rs:563:13:563:13 | x | +| main.rs:564:9:564:9 | y | +| main.rs:571:13:571:13 | z | +| main.rs:572:9:572:9 | w | +| main.rs:585:13:585:13 | x | +| main.rs:586:9:586:9 | y | +| main.rs:593:9:593:9 | x | +| main.rs:596:9:596:11 | cap | +| main.rs:604:13:604:13 | x | +| main.rs:607:9:607:16 | closure1 | +| main.rs:613:13:613:13 | y | +| main.rs:616:13:616:20 | closure2 | +| main.rs:622:13:622:13 | z | +| main.rs:625:13:625:20 | closure3 | +| main.rs:633:13:633:13 | i | +| main.rs:634:9:634:13 | block | +| main.rs:642:8:642:8 | b | +| main.rs:643:13:643:13 | x | +| main.rs:660:13:660:14 | b1 | +| main.rs:660:23:660:24 | b2 | +| main.rs:661:9:661:9 | x | +| main.rs:684:20:684:23 | self | +| main.rs:688:11:688:14 | self | +| main.rs:692:23:692:26 | self | +| main.rs:693:17:693:17 | f | +| main.rs:693:22:693:22 | n | +| main.rs:703:13:703:13 | a | +| main.rs:712:13:712:13 | a | +| main.rs:721:9:721:9 | x | +| main.rs:725:9:725:9 | z | +| main.rs:734:17:734:20 | self | +| main.rs:740:13:740:13 | a | +| main.rs:762:9:762:22 | var_from_macro | +| main.rs:763:9:763:21 | var_in_macro | +| main.rs:765:9:765:20 | var_in_macro | +| main.rs:770:15:770:28 | var_in_macro | +| main.rs:775:9:775:9 | x | +| main.rs:781:13:781:13 | x | +| main.rs:782:13:782:15 | cap | +| main.rs:782:20:782:20 | b | +| main.rs:795:13:795:13 | x | +| main.rs:796:13:796:13 | y | +| main.rs:798:18:798:18 | y | +| main.rs:805:13:805:16 | N0ne | +| main.rs:812:13:812:22 | test_alias | +| main.rs:814:13:814:16 | test | +| main.rs:823:13:823:13 | x | +| main.rs:825:18:825:18 | x | +| main.rs:838:9:838:9 | x | +| main.rs:840:13:840:13 | x | variableAccess | main.rs:7:20:7:20 | s | main.rs:5:14:5:14 | s | | main.rs:12:20:12:20 | i | main.rs:10:14:10:14 | i | @@ -183,218 +195,233 @@ variableAccess | main.rs:105:13:105:13 | x | main.rs:100:9:100:9 | x | | main.rs:106:19:106:19 | x | main.rs:104:13:104:13 | x | | main.rs:109:15:109:15 | x | main.rs:101:14:101:14 | x | -| main.rs:116:11:116:12 | s1 | main.rs:113:9:113:10 | s1 | -| main.rs:117:19:117:20 | s2 | main.rs:115:24:115:25 | s2 | -| main.rs:125:11:125:12 | x6 | main.rs:122:9:122:10 | x6 | -| main.rs:130:23:130:24 | y1 | main.rs:127:14:127:15 | y1 | -| main.rs:135:15:135:16 | y1 | main.rs:123:9:123:10 | y1 | -| main.rs:141:11:141:17 | numbers | main.rs:139:9:139:15 | numbers | -| main.rs:150:23:150:27 | first | main.rs:144:13:144:17 | first | -| main.rs:151:23:151:27 | third | main.rs:146:13:146:17 | third | -| main.rs:152:23:152:27 | fifth | main.rs:148:13:148:17 | fifth | -| main.rs:156:11:156:17 | numbers | main.rs:139:9:139:15 | numbers | -| main.rs:163:23:163:27 | first | main.rs:159:13:159:17 | first | -| main.rs:164:23:164:26 | last | main.rs:161:13:161:16 | last | -| main.rs:172:11:172:12 | p2 | main.rs:170:9:170:10 | p2 | -| main.rs:175:24:175:25 | x7 | main.rs:174:16:174:17 | x7 | -| main.rs:186:11:186:13 | msg | main.rs:184:9:184:11 | msg | -| main.rs:190:24:190:34 | id_variable | main.rs:189:17:189:27 | id_variable | -| main.rs:197:23:197:24 | id | main.rs:194:26:194:27 | id | -| main.rs:209:11:209:16 | either | main.rs:208:9:208:14 | either | -| main.rs:211:26:211:27 | a3 | main.rs:210:9:210:44 | a3 | -| main.rs:223:11:223:12 | tv | main.rs:222:9:222:10 | tv | -| main.rs:225:26:225:27 | a4 | main.rs:224:9:224:81 | a4 | -| main.rs:227:11:227:12 | tv | main.rs:222:9:222:10 | tv | -| main.rs:229:26:229:27 | a5 | main.rs:228:9:228:83 | a5 | -| main.rs:231:11:231:12 | tv | main.rs:222:9:222:10 | tv | -| main.rs:233:26:233:27 | a6 | main.rs:232:9:232:83 | a6 | -| main.rs:239:11:239:16 | either | main.rs:238:9:238:14 | either | -| main.rs:241:16:241:17 | a7 | main.rs:240:9:240:44 | a7 | -| main.rs:242:26:242:27 | a7 | main.rs:240:9:240:44 | a7 | -| main.rs:250:11:250:16 | either | main.rs:248:9:248:14 | either | -| main.rs:254:23:254:25 | a11 | main.rs:252:14:252:51 | a11 | -| main.rs:256:15:256:15 | e | main.rs:251:13:251:13 | e | -| main.rs:257:28:257:30 | a12 | main.rs:255:33:255:35 | a12 | -| main.rs:273:11:273:12 | fv | main.rs:272:9:272:10 | fv | -| main.rs:275:26:275:28 | a13 | main.rs:274:9:274:109 | a13 | -| main.rs:283:7:283:7 | x | main.rs:281:9:281:9 | x | -| main.rs:285:5:285:5 | x | main.rs:282:17:282:17 | x | -| main.rs:287:19:287:19 | x | main.rs:282:17:282:17 | x | -| main.rs:290:13:290:13 | x | main.rs:281:9:281:9 | x | -| main.rs:291:19:291:19 | x | main.rs:289:13:289:13 | x | -| main.rs:299:7:299:7 | x | main.rs:297:9:297:9 | x | -| main.rs:302:12:302:12 | x | main.rs:298:17:298:17 | x | -| main.rs:304:5:304:5 | x | main.rs:301:14:301:14 | x | -| main.rs:306:19:306:19 | x | main.rs:301:14:301:14 | x | -| main.rs:309:13:309:13 | x | main.rs:297:9:297:9 | x | -| main.rs:310:19:310:19 | x | main.rs:308:13:308:13 | x | +| main.rs:116:11:116:11 | s | main.rs:113:9:113:9 | s | +| main.rs:117:19:117:19 | s | main.rs:115:24:115:24 | s | +| main.rs:125:25:125:25 | x | main.rs:123:17:123:17 | x | +| main.rs:127:19:127:19 | x | main.rs:124:19:124:19 | x | +| main.rs:135:9:135:9 | x | main.rs:133:9:133:9 | x | +| main.rs:137:9:137:9 | x | main.rs:134:12:134:12 | x | +| main.rs:139:9:139:9 | x | main.rs:136:12:136:12 | x | +| main.rs:141:9:141:9 | x | main.rs:138:12:138:12 | x | +| main.rs:143:9:143:9 | x | main.rs:140:12:140:12 | x | +| main.rs:145:9:145:9 | x | main.rs:142:12:142:12 | x | +| main.rs:147:9:147:9 | x | main.rs:144:12:144:12 | x | +| main.rs:149:19:149:19 | x | main.rs:146:12:146:12 | x | +| main.rs:152:19:152:19 | x | main.rs:133:9:133:9 | x | +| main.rs:160:11:160:12 | x6 | main.rs:157:9:157:10 | x6 | +| main.rs:165:23:165:24 | y1 | main.rs:162:14:162:15 | y1 | +| main.rs:170:15:170:16 | y1 | main.rs:158:9:158:10 | y1 | +| main.rs:176:11:176:17 | numbers | main.rs:174:9:174:15 | numbers | +| main.rs:185:23:185:27 | first | main.rs:179:13:179:17 | first | +| main.rs:186:23:186:27 | third | main.rs:181:13:181:17 | third | +| main.rs:187:23:187:27 | fifth | main.rs:183:13:183:17 | fifth | +| main.rs:191:11:191:17 | numbers | main.rs:174:9:174:15 | numbers | +| main.rs:198:23:198:27 | first | main.rs:194:13:194:17 | first | +| main.rs:199:23:199:26 | last | main.rs:196:13:196:16 | last | +| main.rs:207:11:207:12 | p2 | main.rs:205:9:205:10 | p2 | +| main.rs:210:24:210:25 | x7 | main.rs:209:16:209:17 | x7 | +| main.rs:221:11:221:13 | msg | main.rs:219:9:219:11 | msg | +| main.rs:225:24:225:34 | id_variable | main.rs:224:17:224:27 | id_variable | +| main.rs:232:23:232:24 | id | main.rs:229:26:229:27 | id | +| main.rs:244:11:244:16 | either | main.rs:243:9:243:14 | either | +| main.rs:246:26:246:27 | a3 | main.rs:245:9:245:44 | a3 | +| main.rs:258:11:258:12 | tv | main.rs:257:9:257:10 | tv | +| main.rs:260:26:260:27 | a4 | main.rs:259:9:259:81 | a4 | +| main.rs:262:11:262:12 | tv | main.rs:257:9:257:10 | tv | +| main.rs:264:26:264:27 | a5 | main.rs:263:9:263:83 | a5 | +| main.rs:266:11:266:12 | tv | main.rs:257:9:257:10 | tv | +| main.rs:268:26:268:27 | a6 | main.rs:267:9:267:83 | a6 | +| main.rs:274:11:274:16 | either | main.rs:273:9:273:14 | either | +| main.rs:276:16:276:17 | a7 | main.rs:275:9:275:44 | a7 | +| main.rs:277:26:277:27 | a7 | main.rs:275:9:275:44 | a7 | +| main.rs:285:11:285:16 | either | main.rs:283:9:283:14 | either | +| main.rs:289:23:289:25 | a11 | main.rs:287:14:287:51 | a11 | +| main.rs:291:15:291:15 | e | main.rs:286:13:286:13 | e | +| main.rs:292:28:292:30 | a12 | main.rs:290:33:290:35 | a12 | +| main.rs:308:11:308:12 | fv | main.rs:307:9:307:10 | fv | +| main.rs:310:26:310:28 | a13 | main.rs:309:9:309:109 | a13 | | main.rs:318:7:318:7 | x | main.rs:316:9:316:9 | x | -| main.rs:321:12:321:12 | x | main.rs:317:20:317:20 | x | -| main.rs:323:5:323:5 | x | main.rs:320:14:320:14 | x | -| main.rs:325:19:325:19 | x | main.rs:320:14:320:14 | x | -| main.rs:329:15:329:15 | x | main.rs:316:9:316:9 | x | -| main.rs:335:11:335:11 | x | main.rs:334:9:334:9 | x | -| main.rs:338:18:338:18 | x | main.rs:336:14:336:14 | x | -| main.rs:339:19:339:19 | x | main.rs:337:20:337:20 | x | -| main.rs:343:15:343:15 | x | main.rs:334:9:334:9 | x | -| main.rs:350:7:350:7 | x | main.rs:348:9:348:9 | x | -| main.rs:352:19:352:19 | x | main.rs:349:16:349:16 | x | -| main.rs:355:7:355:7 | x | main.rs:348:9:348:9 | x | -| main.rs:357:19:357:19 | x | main.rs:354:20:354:20 | x | -| main.rs:359:19:359:19 | x | main.rs:348:9:348:9 | x | -| main.rs:365:11:365:11 | x | main.rs:364:9:364:9 | x | -| main.rs:367:20:367:20 | x | main.rs:366:18:366:18 | x | -| main.rs:374:11:374:11 | x | main.rs:373:9:373:9 | x | -| main.rs:377:22:377:22 | y | main.rs:375:14:375:14 | y | -| main.rs:378:26:378:26 | y | main.rs:376:25:376:25 | y | -| main.rs:390:15:390:16 | a8 | main.rs:384:5:384:6 | a8 | -| main.rs:391:15:391:16 | b3 | main.rs:386:9:386:10 | b3 | -| main.rs:392:15:392:16 | c1 | main.rs:387:9:387:10 | c1 | -| main.rs:397:15:397:16 | a9 | main.rs:395:20:395:55 | a9 | -| main.rs:406:15:406:17 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:407:15:407:16 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:408:15:408:16 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:411:9:411:10 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:415:9:415:11 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:416:9:416:10 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:417:9:417:10 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:419:15:419:17 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:420:15:420:16 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:421:15:421:16 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:428:23:428:25 | a10 | main.rs:425:13:425:15 | a10 | -| main.rs:429:23:429:24 | b4 | main.rs:426:13:426:14 | b4 | -| main.rs:433:15:433:17 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:434:15:434:16 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:440:9:440:9 | x | main.rs:439:10:439:10 | x | -| main.rs:442:9:442:23 | example_closure | main.rs:438:9:438:23 | example_closure | -| main.rs:443:15:443:16 | n1 | main.rs:441:9:441:10 | n1 | -| main.rs:448:9:448:9 | x | main.rs:447:6:447:6 | x | -| main.rs:450:9:450:26 | immutable_variable | main.rs:446:9:446:26 | immutable_variable | -| main.rs:451:15:451:16 | n2 | main.rs:449:9:449:10 | n2 | -| main.rs:458:9:458:9 | x | main.rs:457:10:457:10 | x | -| main.rs:459:15:459:15 | f | main.rs:456:9:456:9 | f | -| main.rs:463:9:463:9 | x | main.rs:461:10:461:10 | x | -| main.rs:466:15:466:15 | f | main.rs:456:9:456:9 | f | -| main.rs:472:17:472:17 | x | main.rs:470:14:470:14 | x | -| main.rs:481:13:481:13 | x | main.rs:480:14:480:14 | x | -| main.rs:482:19:482:19 | f | main.rs:479:13:479:13 | f | -| main.rs:490:12:490:12 | v | main.rs:487:9:487:9 | v | -| main.rs:491:19:491:22 | text | main.rs:489:9:489:12 | text | -| main.rs:497:5:497:5 | a | main.rs:496:13:496:13 | a | -| main.rs:498:15:498:15 | a | main.rs:496:13:496:13 | a | -| main.rs:499:11:499:11 | a | main.rs:496:13:496:13 | a | -| main.rs:500:15:500:15 | a | main.rs:496:13:496:13 | a | -| main.rs:506:14:506:14 | i | main.rs:504:13:504:13 | i | -| main.rs:507:6:507:10 | ref_i | main.rs:505:9:505:13 | ref_i | -| main.rs:508:15:508:15 | i | main.rs:504:13:504:13 | i | -| main.rs:512:6:512:6 | x | main.rs:511:17:511:17 | x | -| main.rs:513:10:513:10 | x | main.rs:511:17:511:17 | x | -| main.rs:514:10:514:10 | x | main.rs:511:17:511:17 | x | -| main.rs:515:12:515:12 | x | main.rs:511:17:511:17 | x | -| main.rs:519:6:519:6 | x | main.rs:518:22:518:22 | x | -| main.rs:520:10:520:10 | x | main.rs:518:22:518:22 | x | -| main.rs:521:10:521:10 | x | main.rs:518:22:518:22 | x | -| main.rs:522:6:522:6 | y | main.rs:518:38:518:38 | y | -| main.rs:523:9:523:9 | x | main.rs:518:22:518:22 | x | -| main.rs:529:27:529:27 | x | main.rs:527:13:527:13 | x | -| main.rs:530:6:530:6 | y | main.rs:528:9:528:9 | y | -| main.rs:533:15:533:15 | x | main.rs:527:13:527:13 | x | -| main.rs:537:19:537:19 | x | main.rs:527:13:527:13 | x | -| main.rs:539:14:539:14 | z | main.rs:535:13:535:13 | z | -| main.rs:540:9:540:9 | w | main.rs:536:9:536:9 | w | -| main.rs:542:7:542:7 | w | main.rs:536:9:536:9 | w | -| main.rs:545:15:545:15 | z | main.rs:535:13:535:13 | z | -| main.rs:551:14:551:14 | x | main.rs:549:13:549:13 | x | -| main.rs:552:6:552:6 | y | main.rs:550:9:550:9 | y | -| main.rs:553:15:553:15 | x | main.rs:549:13:549:13 | x | -| main.rs:561:19:561:19 | x | main.rs:557:9:557:9 | x | -| main.rs:563:5:563:7 | cap | main.rs:560:9:560:11 | cap | -| main.rs:564:15:564:15 | x | main.rs:557:9:557:9 | x | -| main.rs:572:19:572:19 | x | main.rs:568:13:568:13 | x | -| main.rs:574:5:574:12 | closure1 | main.rs:571:9:571:16 | closure1 | -| main.rs:575:15:575:15 | x | main.rs:568:13:568:13 | x | -| main.rs:581:9:581:9 | y | main.rs:577:13:577:13 | y | -| main.rs:583:5:583:12 | closure2 | main.rs:580:13:580:20 | closure2 | -| main.rs:584:15:584:15 | y | main.rs:577:13:577:13 | y | -| main.rs:590:9:590:9 | z | main.rs:586:13:586:13 | z | -| main.rs:592:5:592:12 | closure3 | main.rs:589:13:589:20 | closure3 | -| main.rs:593:15:593:15 | z | main.rs:586:13:586:13 | z | -| main.rs:599:9:599:9 | i | main.rs:597:13:597:13 | i | -| main.rs:602:5:602:9 | block | main.rs:598:9:598:13 | block | -| main.rs:603:15:603:15 | i | main.rs:597:13:597:13 | i | -| main.rs:608:15:608:15 | x | main.rs:607:13:607:13 | x | -| main.rs:609:15:609:15 | x | main.rs:607:13:607:13 | x | -| main.rs:611:16:611:16 | b | main.rs:606:8:606:8 | b | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | -| main.rs:614:19:614:19 | x | main.rs:607:13:607:13 | x | -| main.rs:615:19:615:19 | x | main.rs:607:13:607:13 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | -| main.rs:618:19:618:19 | x | main.rs:607:13:607:13 | x | -| main.rs:619:19:619:19 | x | main.rs:607:13:607:13 | x | -| main.rs:621:15:621:15 | x | main.rs:607:13:607:13 | x | -| main.rs:627:16:627:17 | b1 | main.rs:624:13:624:14 | b1 | -| main.rs:629:19:629:19 | x | main.rs:625:9:625:9 | x | -| main.rs:631:19:631:19 | x | main.rs:625:9:625:9 | x | -| main.rs:635:16:635:17 | b2 | main.rs:624:23:624:24 | b2 | -| main.rs:637:19:637:19 | x | main.rs:625:9:625:9 | x | -| main.rs:639:19:639:19 | x | main.rs:625:9:625:9 | x | -| main.rs:649:16:649:19 | self | main.rs:648:20:648:23 | self | -| main.rs:653:9:653:12 | self | main.rs:652:11:652:14 | self | -| main.rs:659:13:659:16 | self | main.rs:656:23:656:26 | self | -| main.rs:659:25:659:25 | n | main.rs:657:22:657:22 | n | -| main.rs:661:9:661:9 | f | main.rs:657:17:657:17 | f | -| main.rs:662:9:662:9 | f | main.rs:657:17:657:17 | f | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | -| main.rs:669:5:669:5 | a | main.rs:667:13:667:13 | a | -| main.rs:670:15:670:15 | a | main.rs:667:13:667:13 | a | -| main.rs:671:5:671:5 | a | main.rs:667:13:667:13 | a | -| main.rs:672:15:672:15 | a | main.rs:667:13:667:13 | a | -| main.rs:677:15:677:15 | a | main.rs:676:13:676:13 | a | -| main.rs:678:5:678:5 | a | main.rs:676:13:676:13 | a | -| main.rs:679:15:679:15 | a | main.rs:676:13:676:13 | a | -| main.rs:680:5:680:5 | a | main.rs:676:13:676:13 | a | -| main.rs:681:15:681:15 | a | main.rs:676:13:676:13 | a | -| main.rs:686:20:686:20 | x | main.rs:685:9:685:9 | x | -| main.rs:687:15:687:15 | x | main.rs:685:9:685:9 | x | -| main.rs:690:20:690:20 | z | main.rs:689:9:689:9 | z | -| main.rs:699:10:699:13 | self | main.rs:698:17:698:20 | self | -| main.rs:705:5:705:5 | a | main.rs:704:13:704:13 | a | -| main.rs:708:15:708:15 | a | main.rs:704:13:704:13 | a | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | -| main.rs:728:15:728:28 | var_from_macro | main.rs:726:9:726:22 | var_from_macro | -| main.rs:734:30:734:41 | var_in_macro | main.rs:734:15:734:28 | var_in_macro | -| main.rs:735:15:735:26 | var_in_macro | main.rs:729:9:729:20 | var_in_macro | -| main.rs:740:5:740:5 | x | main.rs:739:9:739:9 | x | -| main.rs:741:15:741:15 | x | main.rs:739:9:739:9 | x | -| main.rs:748:20:748:20 | b | main.rs:746:20:746:20 | b | -| main.rs:749:13:749:13 | x | main.rs:745:13:745:13 | x | -| main.rs:752:5:752:7 | cap | main.rs:746:13:746:15 | cap | -| main.rs:753:15:753:15 | x | main.rs:745:13:745:13 | x | -| main.rs:761:19:761:19 | x | main.rs:759:13:759:13 | x | -| main.rs:768:15:768:15 | y | main.rs:760:13:760:13 | y | -| main.rs:770:17:770:20 | N0ne | main.rs:769:13:769:16 | N0ne | -| main.rs:779:13:779:22 | test_alias | main.rs:776:13:776:22 | test_alias | -| main.rs:780:9:780:12 | test | main.rs:778:13:778:16 | test | -| main.rs:788:15:788:15 | x | main.rs:787:13:787:13 | x | -| main.rs:790:20:790:20 | x | main.rs:789:18:789:18 | x | -| main.rs:793:15:793:15 | x | main.rs:787:13:787:13 | x | +| main.rs:320:5:320:5 | x | main.rs:317:17:317:17 | x | +| main.rs:322:19:322:19 | x | main.rs:317:17:317:17 | x | +| main.rs:325:13:325:13 | x | main.rs:316:9:316:9 | x | +| main.rs:326:19:326:19 | x | main.rs:324:13:324:13 | x | +| main.rs:334:7:334:7 | x | main.rs:332:9:332:9 | x | +| main.rs:337:12:337:12 | x | main.rs:333:17:333:17 | x | +| main.rs:339:5:339:5 | x | main.rs:336:14:336:14 | x | +| main.rs:341:19:341:19 | x | main.rs:336:14:336:14 | x | +| main.rs:344:13:344:13 | x | main.rs:332:9:332:9 | x | +| main.rs:345:19:345:19 | x | main.rs:343:13:343:13 | x | +| main.rs:353:7:353:7 | x | main.rs:351:9:351:9 | x | +| main.rs:356:12:356:12 | x | main.rs:352:20:352:20 | x | +| main.rs:358:5:358:5 | x | main.rs:355:14:355:14 | x | +| main.rs:360:19:360:19 | x | main.rs:355:14:355:14 | x | +| main.rs:364:15:364:15 | x | main.rs:351:9:351:9 | x | +| main.rs:370:11:370:11 | x | main.rs:369:9:369:9 | x | +| main.rs:373:18:373:18 | x | main.rs:371:14:371:14 | x | +| main.rs:374:19:374:19 | x | main.rs:372:20:372:20 | x | +| main.rs:378:15:378:15 | x | main.rs:369:9:369:9 | x | +| main.rs:385:7:385:7 | x | main.rs:383:9:383:9 | x | +| main.rs:387:19:387:19 | x | main.rs:384:16:384:16 | x | +| main.rs:390:7:390:7 | x | main.rs:383:9:383:9 | x | +| main.rs:392:19:392:19 | x | main.rs:389:20:389:20 | x | +| main.rs:394:19:394:19 | x | main.rs:383:9:383:9 | x | +| main.rs:400:11:400:11 | x | main.rs:399:9:399:9 | x | +| main.rs:402:20:402:20 | x | main.rs:401:18:401:18 | x | +| main.rs:409:11:409:11 | x | main.rs:408:9:408:9 | x | +| main.rs:411:16:411:16 | y | main.rs:410:14:410:14 | y | +| main.rs:413:22:413:22 | y | main.rs:410:14:410:14 | y | +| main.rs:414:26:414:26 | y | main.rs:412:22:412:22 | y | +| main.rs:426:15:426:16 | a8 | main.rs:420:5:420:6 | a8 | +| main.rs:427:15:427:16 | b3 | main.rs:422:9:422:10 | b3 | +| main.rs:428:15:428:16 | c1 | main.rs:423:9:423:10 | c1 | +| main.rs:433:15:433:16 | a9 | main.rs:431:20:431:55 | a9 | +| main.rs:442:15:442:17 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:443:15:443:16 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:444:15:444:16 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:447:9:447:10 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:451:9:451:11 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:452:9:452:10 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:453:9:453:10 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:455:15:455:17 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:456:15:456:16 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:457:15:457:16 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:464:23:464:25 | a10 | main.rs:461:13:461:15 | a10 | +| main.rs:465:23:465:24 | b4 | main.rs:462:13:462:14 | b4 | +| main.rs:469:15:469:17 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:470:15:470:16 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:476:9:476:9 | x | main.rs:475:10:475:10 | x | +| main.rs:478:9:478:23 | example_closure | main.rs:474:9:474:23 | example_closure | +| main.rs:479:15:479:16 | n1 | main.rs:477:9:477:10 | n1 | +| main.rs:484:9:484:9 | x | main.rs:483:6:483:6 | x | +| main.rs:486:9:486:26 | immutable_variable | main.rs:482:9:482:26 | immutable_variable | +| main.rs:487:15:487:16 | n2 | main.rs:485:9:485:10 | n2 | +| main.rs:494:9:494:9 | x | main.rs:493:10:493:10 | x | +| main.rs:495:15:495:15 | f | main.rs:492:9:492:9 | f | +| main.rs:499:9:499:9 | x | main.rs:497:10:497:10 | x | +| main.rs:502:15:502:15 | f | main.rs:492:9:492:9 | f | +| main.rs:508:17:508:17 | x | main.rs:506:14:506:14 | x | +| main.rs:517:13:517:13 | x | main.rs:516:14:516:14 | x | +| main.rs:518:19:518:19 | f | main.rs:515:13:515:13 | f | +| main.rs:526:12:526:12 | v | main.rs:523:9:523:9 | v | +| main.rs:527:19:527:22 | text | main.rs:525:9:525:12 | text | +| main.rs:533:5:533:5 | a | main.rs:532:13:532:13 | a | +| main.rs:534:15:534:15 | a | main.rs:532:13:532:13 | a | +| main.rs:535:11:535:11 | a | main.rs:532:13:532:13 | a | +| main.rs:536:15:536:15 | a | main.rs:532:13:532:13 | a | +| main.rs:542:14:542:14 | i | main.rs:540:13:540:13 | i | +| main.rs:543:6:543:10 | ref_i | main.rs:541:9:541:13 | ref_i | +| main.rs:544:15:544:15 | i | main.rs:540:13:540:13 | i | +| main.rs:548:6:548:6 | x | main.rs:547:17:547:17 | x | +| main.rs:549:10:549:10 | x | main.rs:547:17:547:17 | x | +| main.rs:550:10:550:10 | x | main.rs:547:17:547:17 | x | +| main.rs:551:12:551:12 | x | main.rs:547:17:547:17 | x | +| main.rs:555:6:555:6 | x | main.rs:554:22:554:22 | x | +| main.rs:556:10:556:10 | x | main.rs:554:22:554:22 | x | +| main.rs:557:10:557:10 | x | main.rs:554:22:554:22 | x | +| main.rs:558:6:558:6 | y | main.rs:554:38:554:38 | y | +| main.rs:559:9:559:9 | x | main.rs:554:22:554:22 | x | +| main.rs:565:27:565:27 | x | main.rs:563:13:563:13 | x | +| main.rs:566:6:566:6 | y | main.rs:564:9:564:9 | y | +| main.rs:569:15:569:15 | x | main.rs:563:13:563:13 | x | +| main.rs:573:19:573:19 | x | main.rs:563:13:563:13 | x | +| main.rs:575:14:575:14 | z | main.rs:571:13:571:13 | z | +| main.rs:576:9:576:9 | w | main.rs:572:9:572:9 | w | +| main.rs:578:7:578:7 | w | main.rs:572:9:572:9 | w | +| main.rs:581:15:581:15 | z | main.rs:571:13:571:13 | z | +| main.rs:587:14:587:14 | x | main.rs:585:13:585:13 | x | +| main.rs:588:6:588:6 | y | main.rs:586:9:586:9 | y | +| main.rs:589:15:589:15 | x | main.rs:585:13:585:13 | x | +| main.rs:597:19:597:19 | x | main.rs:593:9:593:9 | x | +| main.rs:599:5:599:7 | cap | main.rs:596:9:596:11 | cap | +| main.rs:600:15:600:15 | x | main.rs:593:9:593:9 | x | +| main.rs:608:19:608:19 | x | main.rs:604:13:604:13 | x | +| main.rs:610:5:610:12 | closure1 | main.rs:607:9:607:16 | closure1 | +| main.rs:611:15:611:15 | x | main.rs:604:13:604:13 | x | +| main.rs:617:9:617:9 | y | main.rs:613:13:613:13 | y | +| main.rs:619:5:619:12 | closure2 | main.rs:616:13:616:20 | closure2 | +| main.rs:620:15:620:15 | y | main.rs:613:13:613:13 | y | +| main.rs:626:9:626:9 | z | main.rs:622:13:622:13 | z | +| main.rs:628:5:628:12 | closure3 | main.rs:625:13:625:20 | closure3 | +| main.rs:629:15:629:15 | z | main.rs:622:13:622:13 | z | +| main.rs:635:9:635:9 | i | main.rs:633:13:633:13 | i | +| main.rs:638:5:638:9 | block | main.rs:634:9:634:13 | block | +| main.rs:639:15:639:15 | i | main.rs:633:13:633:13 | i | +| main.rs:644:15:644:15 | x | main.rs:643:13:643:13 | x | +| main.rs:645:15:645:15 | x | main.rs:643:13:643:13 | x | +| main.rs:647:16:647:16 | b | main.rs:642:8:642:8 | b | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | +| main.rs:650:19:650:19 | x | main.rs:643:13:643:13 | x | +| main.rs:651:19:651:19 | x | main.rs:643:13:643:13 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | +| main.rs:654:19:654:19 | x | main.rs:643:13:643:13 | x | +| main.rs:655:19:655:19 | x | main.rs:643:13:643:13 | x | +| main.rs:657:15:657:15 | x | main.rs:643:13:643:13 | x | +| main.rs:663:16:663:17 | b1 | main.rs:660:13:660:14 | b1 | +| main.rs:665:19:665:19 | x | main.rs:661:9:661:9 | x | +| main.rs:667:19:667:19 | x | main.rs:661:9:661:9 | x | +| main.rs:671:16:671:17 | b2 | main.rs:660:23:660:24 | b2 | +| main.rs:673:19:673:19 | x | main.rs:661:9:661:9 | x | +| main.rs:675:19:675:19 | x | main.rs:661:9:661:9 | x | +| main.rs:685:16:685:19 | self | main.rs:684:20:684:23 | self | +| main.rs:689:9:689:12 | self | main.rs:688:11:688:14 | self | +| main.rs:695:13:695:16 | self | main.rs:692:23:692:26 | self | +| main.rs:695:25:695:25 | n | main.rs:693:22:693:22 | n | +| main.rs:697:9:697:9 | f | main.rs:693:17:693:17 | f | +| main.rs:698:9:698:9 | f | main.rs:693:17:693:17 | f | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | +| main.rs:705:5:705:5 | a | main.rs:703:13:703:13 | a | +| main.rs:706:15:706:15 | a | main.rs:703:13:703:13 | a | +| main.rs:707:5:707:5 | a | main.rs:703:13:703:13 | a | +| main.rs:708:15:708:15 | a | main.rs:703:13:703:13 | a | +| main.rs:713:15:713:15 | a | main.rs:712:13:712:13 | a | +| main.rs:714:5:714:5 | a | main.rs:712:13:712:13 | a | +| main.rs:715:15:715:15 | a | main.rs:712:13:712:13 | a | +| main.rs:716:5:716:5 | a | main.rs:712:13:712:13 | a | +| main.rs:717:15:717:15 | a | main.rs:712:13:712:13 | a | +| main.rs:722:20:722:20 | x | main.rs:721:9:721:9 | x | +| main.rs:723:15:723:15 | x | main.rs:721:9:721:9 | x | +| main.rs:726:20:726:20 | z | main.rs:725:9:725:9 | z | +| main.rs:735:10:735:13 | self | main.rs:734:17:734:20 | self | +| main.rs:741:5:741:5 | a | main.rs:740:13:740:13 | a | +| main.rs:744:15:744:15 | a | main.rs:740:13:740:13 | a | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | +| main.rs:764:15:764:28 | var_from_macro | main.rs:762:9:762:22 | var_from_macro | +| main.rs:770:30:770:41 | var_in_macro | main.rs:770:15:770:28 | var_in_macro | +| main.rs:771:15:771:26 | var_in_macro | main.rs:765:9:765:20 | var_in_macro | +| main.rs:776:5:776:5 | x | main.rs:775:9:775:9 | x | +| main.rs:777:15:777:15 | x | main.rs:775:9:775:9 | x | +| main.rs:784:20:784:20 | b | main.rs:782:20:782:20 | b | +| main.rs:785:13:785:13 | x | main.rs:781:13:781:13 | x | +| main.rs:788:5:788:7 | cap | main.rs:782:13:782:15 | cap | +| main.rs:789:15:789:15 | x | main.rs:781:13:781:13 | x | +| main.rs:797:19:797:19 | x | main.rs:795:13:795:13 | x | +| main.rs:804:15:804:15 | y | main.rs:796:13:796:13 | y | +| main.rs:806:17:806:20 | N0ne | main.rs:805:13:805:16 | N0ne | +| main.rs:815:13:815:22 | test_alias | main.rs:812:13:812:22 | test_alias | +| main.rs:816:9:816:12 | test | main.rs:814:13:814:16 | test | +| main.rs:824:15:824:15 | x | main.rs:823:13:823:13 | x | +| main.rs:826:20:826:20 | x | main.rs:825:18:825:18 | x | +| main.rs:829:15:829:15 | x | main.rs:823:13:823:13 | x | +| main.rs:841:9:841:9 | x | main.rs:840:13:840:13 | x | +| main.rs:843:19:843:19 | x | main.rs:838:9:838:9 | x | +| main.rs:845:19:845:19 | x | main.rs:838:9:838:9 | x | variableWriteAccess | main.rs:27:5:27:6 | x2 | main.rs:25:13:25:14 | x2 | | main.rs:29:5:29:6 | x2 | main.rs:25:13:25:14 | x2 | | main.rs:36:5:36:5 | x | main.rs:34:13:34:13 | x | -| main.rs:411:9:411:10 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:412:9:412:10 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:413:9:413:11 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:581:9:581:9 | y | main.rs:577:13:577:13 | y | -| main.rs:599:9:599:9 | i | main.rs:597:13:597:13 | i | -| main.rs:613:9:613:9 | x | main.rs:607:13:607:13 | x | -| main.rs:617:9:617:9 | x | main.rs:607:13:607:13 | x | -| main.rs:671:5:671:5 | a | main.rs:667:13:667:13 | a | -| main.rs:680:5:680:5 | a | main.rs:676:13:676:13 | a | -| main.rs:740:5:740:5 | x | main.rs:739:9:739:9 | x | -| main.rs:749:13:749:13 | x | main.rs:745:13:745:13 | x | +| main.rs:447:9:447:10 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:448:9:448:10 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:449:9:449:11 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:617:9:617:9 | y | main.rs:613:13:613:13 | y | +| main.rs:635:9:635:9 | i | main.rs:633:13:633:13 | i | +| main.rs:649:9:649:9 | x | main.rs:643:13:643:13 | x | +| main.rs:653:9:653:9 | x | main.rs:643:13:643:13 | x | +| main.rs:707:5:707:5 | a | main.rs:703:13:703:13 | a | +| main.rs:716:5:716:5 | a | main.rs:712:13:712:13 | a | +| main.rs:776:5:776:5 | x | main.rs:775:9:775:9 | x | +| main.rs:785:13:785:13 | x | main.rs:781:13:781:13 | x | variableReadAccess | main.rs:7:20:7:20 | s | main.rs:5:14:5:14 | s | | main.rs:12:20:12:20 | i | main.rs:10:14:10:14 | i | @@ -423,183 +450,198 @@ variableReadAccess | main.rs:105:13:105:13 | x | main.rs:100:9:100:9 | x | | main.rs:106:19:106:19 | x | main.rs:104:13:104:13 | x | | main.rs:109:15:109:15 | x | main.rs:101:14:101:14 | x | -| main.rs:116:11:116:12 | s1 | main.rs:113:9:113:10 | s1 | -| main.rs:117:19:117:20 | s2 | main.rs:115:24:115:25 | s2 | -| main.rs:125:11:125:12 | x6 | main.rs:122:9:122:10 | x6 | -| main.rs:130:23:130:24 | y1 | main.rs:127:14:127:15 | y1 | -| main.rs:135:15:135:16 | y1 | main.rs:123:9:123:10 | y1 | -| main.rs:141:11:141:17 | numbers | main.rs:139:9:139:15 | numbers | -| main.rs:150:23:150:27 | first | main.rs:144:13:144:17 | first | -| main.rs:151:23:151:27 | third | main.rs:146:13:146:17 | third | -| main.rs:152:23:152:27 | fifth | main.rs:148:13:148:17 | fifth | -| main.rs:156:11:156:17 | numbers | main.rs:139:9:139:15 | numbers | -| main.rs:163:23:163:27 | first | main.rs:159:13:159:17 | first | -| main.rs:164:23:164:26 | last | main.rs:161:13:161:16 | last | -| main.rs:172:11:172:12 | p2 | main.rs:170:9:170:10 | p2 | -| main.rs:175:24:175:25 | x7 | main.rs:174:16:174:17 | x7 | -| main.rs:186:11:186:13 | msg | main.rs:184:9:184:11 | msg | -| main.rs:190:24:190:34 | id_variable | main.rs:189:17:189:27 | id_variable | -| main.rs:197:23:197:24 | id | main.rs:194:26:194:27 | id | -| main.rs:209:11:209:16 | either | main.rs:208:9:208:14 | either | -| main.rs:211:26:211:27 | a3 | main.rs:210:9:210:44 | a3 | -| main.rs:223:11:223:12 | tv | main.rs:222:9:222:10 | tv | -| main.rs:225:26:225:27 | a4 | main.rs:224:9:224:81 | a4 | -| main.rs:227:11:227:12 | tv | main.rs:222:9:222:10 | tv | -| main.rs:229:26:229:27 | a5 | main.rs:228:9:228:83 | a5 | -| main.rs:231:11:231:12 | tv | main.rs:222:9:222:10 | tv | -| main.rs:233:26:233:27 | a6 | main.rs:232:9:232:83 | a6 | -| main.rs:239:11:239:16 | either | main.rs:238:9:238:14 | either | -| main.rs:241:16:241:17 | a7 | main.rs:240:9:240:44 | a7 | -| main.rs:242:26:242:27 | a7 | main.rs:240:9:240:44 | a7 | -| main.rs:250:11:250:16 | either | main.rs:248:9:248:14 | either | -| main.rs:254:23:254:25 | a11 | main.rs:252:14:252:51 | a11 | -| main.rs:256:15:256:15 | e | main.rs:251:13:251:13 | e | -| main.rs:257:28:257:30 | a12 | main.rs:255:33:255:35 | a12 | -| main.rs:273:11:273:12 | fv | main.rs:272:9:272:10 | fv | -| main.rs:275:26:275:28 | a13 | main.rs:274:9:274:109 | a13 | -| main.rs:283:7:283:7 | x | main.rs:281:9:281:9 | x | -| main.rs:285:5:285:5 | x | main.rs:282:17:282:17 | x | -| main.rs:287:19:287:19 | x | main.rs:282:17:282:17 | x | -| main.rs:290:13:290:13 | x | main.rs:281:9:281:9 | x | -| main.rs:291:19:291:19 | x | main.rs:289:13:289:13 | x | -| main.rs:299:7:299:7 | x | main.rs:297:9:297:9 | x | -| main.rs:302:12:302:12 | x | main.rs:298:17:298:17 | x | -| main.rs:304:5:304:5 | x | main.rs:301:14:301:14 | x | -| main.rs:306:19:306:19 | x | main.rs:301:14:301:14 | x | -| main.rs:309:13:309:13 | x | main.rs:297:9:297:9 | x | -| main.rs:310:19:310:19 | x | main.rs:308:13:308:13 | x | +| main.rs:116:11:116:11 | s | main.rs:113:9:113:9 | s | +| main.rs:117:19:117:19 | s | main.rs:115:24:115:24 | s | +| main.rs:125:25:125:25 | x | main.rs:123:17:123:17 | x | +| main.rs:127:19:127:19 | x | main.rs:124:19:124:19 | x | +| main.rs:135:9:135:9 | x | main.rs:133:9:133:9 | x | +| main.rs:137:9:137:9 | x | main.rs:134:12:134:12 | x | +| main.rs:139:9:139:9 | x | main.rs:136:12:136:12 | x | +| main.rs:141:9:141:9 | x | main.rs:138:12:138:12 | x | +| main.rs:143:9:143:9 | x | main.rs:140:12:140:12 | x | +| main.rs:145:9:145:9 | x | main.rs:142:12:142:12 | x | +| main.rs:147:9:147:9 | x | main.rs:144:12:144:12 | x | +| main.rs:149:19:149:19 | x | main.rs:146:12:146:12 | x | +| main.rs:152:19:152:19 | x | main.rs:133:9:133:9 | x | +| main.rs:160:11:160:12 | x6 | main.rs:157:9:157:10 | x6 | +| main.rs:165:23:165:24 | y1 | main.rs:162:14:162:15 | y1 | +| main.rs:170:15:170:16 | y1 | main.rs:158:9:158:10 | y1 | +| main.rs:176:11:176:17 | numbers | main.rs:174:9:174:15 | numbers | +| main.rs:185:23:185:27 | first | main.rs:179:13:179:17 | first | +| main.rs:186:23:186:27 | third | main.rs:181:13:181:17 | third | +| main.rs:187:23:187:27 | fifth | main.rs:183:13:183:17 | fifth | +| main.rs:191:11:191:17 | numbers | main.rs:174:9:174:15 | numbers | +| main.rs:198:23:198:27 | first | main.rs:194:13:194:17 | first | +| main.rs:199:23:199:26 | last | main.rs:196:13:196:16 | last | +| main.rs:207:11:207:12 | p2 | main.rs:205:9:205:10 | p2 | +| main.rs:210:24:210:25 | x7 | main.rs:209:16:209:17 | x7 | +| main.rs:221:11:221:13 | msg | main.rs:219:9:219:11 | msg | +| main.rs:225:24:225:34 | id_variable | main.rs:224:17:224:27 | id_variable | +| main.rs:232:23:232:24 | id | main.rs:229:26:229:27 | id | +| main.rs:244:11:244:16 | either | main.rs:243:9:243:14 | either | +| main.rs:246:26:246:27 | a3 | main.rs:245:9:245:44 | a3 | +| main.rs:258:11:258:12 | tv | main.rs:257:9:257:10 | tv | +| main.rs:260:26:260:27 | a4 | main.rs:259:9:259:81 | a4 | +| main.rs:262:11:262:12 | tv | main.rs:257:9:257:10 | tv | +| main.rs:264:26:264:27 | a5 | main.rs:263:9:263:83 | a5 | +| main.rs:266:11:266:12 | tv | main.rs:257:9:257:10 | tv | +| main.rs:268:26:268:27 | a6 | main.rs:267:9:267:83 | a6 | +| main.rs:274:11:274:16 | either | main.rs:273:9:273:14 | either | +| main.rs:276:16:276:17 | a7 | main.rs:275:9:275:44 | a7 | +| main.rs:277:26:277:27 | a7 | main.rs:275:9:275:44 | a7 | +| main.rs:285:11:285:16 | either | main.rs:283:9:283:14 | either | +| main.rs:289:23:289:25 | a11 | main.rs:287:14:287:51 | a11 | +| main.rs:291:15:291:15 | e | main.rs:286:13:286:13 | e | +| main.rs:292:28:292:30 | a12 | main.rs:290:33:290:35 | a12 | +| main.rs:308:11:308:12 | fv | main.rs:307:9:307:10 | fv | +| main.rs:310:26:310:28 | a13 | main.rs:309:9:309:109 | a13 | | main.rs:318:7:318:7 | x | main.rs:316:9:316:9 | x | -| main.rs:321:12:321:12 | x | main.rs:317:20:317:20 | x | -| main.rs:323:5:323:5 | x | main.rs:320:14:320:14 | x | -| main.rs:325:19:325:19 | x | main.rs:320:14:320:14 | x | -| main.rs:329:15:329:15 | x | main.rs:316:9:316:9 | x | -| main.rs:335:11:335:11 | x | main.rs:334:9:334:9 | x | -| main.rs:338:18:338:18 | x | main.rs:336:14:336:14 | x | -| main.rs:339:19:339:19 | x | main.rs:337:20:337:20 | x | -| main.rs:343:15:343:15 | x | main.rs:334:9:334:9 | x | -| main.rs:350:7:350:7 | x | main.rs:348:9:348:9 | x | -| main.rs:352:19:352:19 | x | main.rs:349:16:349:16 | x | -| main.rs:355:7:355:7 | x | main.rs:348:9:348:9 | x | -| main.rs:357:19:357:19 | x | main.rs:354:20:354:20 | x | -| main.rs:359:19:359:19 | x | main.rs:348:9:348:9 | x | -| main.rs:365:11:365:11 | x | main.rs:364:9:364:9 | x | -| main.rs:367:20:367:20 | x | main.rs:366:18:366:18 | x | -| main.rs:374:11:374:11 | x | main.rs:373:9:373:9 | x | -| main.rs:377:22:377:22 | y | main.rs:375:14:375:14 | y | -| main.rs:378:26:378:26 | y | main.rs:376:25:376:25 | y | -| main.rs:390:15:390:16 | a8 | main.rs:384:5:384:6 | a8 | -| main.rs:391:15:391:16 | b3 | main.rs:386:9:386:10 | b3 | -| main.rs:392:15:392:16 | c1 | main.rs:387:9:387:10 | c1 | -| main.rs:397:15:397:16 | a9 | main.rs:395:20:395:55 | a9 | -| main.rs:406:15:406:17 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:407:15:407:16 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:408:15:408:16 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:415:9:415:11 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:416:9:416:10 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:417:9:417:10 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:419:15:419:17 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:420:15:420:16 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:421:15:421:16 | c2 | main.rs:404:13:404:14 | c2 | -| main.rs:428:23:428:25 | a10 | main.rs:425:13:425:15 | a10 | -| main.rs:429:23:429:24 | b4 | main.rs:426:13:426:14 | b4 | -| main.rs:433:15:433:17 | a10 | main.rs:402:13:402:15 | a10 | -| main.rs:434:15:434:16 | b4 | main.rs:403:13:403:14 | b4 | -| main.rs:440:9:440:9 | x | main.rs:439:10:439:10 | x | -| main.rs:442:9:442:23 | example_closure | main.rs:438:9:438:23 | example_closure | -| main.rs:443:15:443:16 | n1 | main.rs:441:9:441:10 | n1 | -| main.rs:448:9:448:9 | x | main.rs:447:6:447:6 | x | -| main.rs:450:9:450:26 | immutable_variable | main.rs:446:9:446:26 | immutable_variable | -| main.rs:451:15:451:16 | n2 | main.rs:449:9:449:10 | n2 | -| main.rs:458:9:458:9 | x | main.rs:457:10:457:10 | x | -| main.rs:459:15:459:15 | f | main.rs:456:9:456:9 | f | -| main.rs:463:9:463:9 | x | main.rs:461:10:461:10 | x | -| main.rs:466:15:466:15 | f | main.rs:456:9:456:9 | f | -| main.rs:472:17:472:17 | x | main.rs:470:14:470:14 | x | -| main.rs:481:13:481:13 | x | main.rs:480:14:480:14 | x | -| main.rs:482:19:482:19 | f | main.rs:479:13:479:13 | f | -| main.rs:490:12:490:12 | v | main.rs:487:9:487:9 | v | -| main.rs:491:19:491:22 | text | main.rs:489:9:489:12 | text | -| main.rs:498:15:498:15 | a | main.rs:496:13:496:13 | a | -| main.rs:500:15:500:15 | a | main.rs:496:13:496:13 | a | -| main.rs:507:6:507:10 | ref_i | main.rs:505:9:505:13 | ref_i | -| main.rs:508:15:508:15 | i | main.rs:504:13:504:13 | i | -| main.rs:512:6:512:6 | x | main.rs:511:17:511:17 | x | -| main.rs:513:10:513:10 | x | main.rs:511:17:511:17 | x | -| main.rs:514:10:514:10 | x | main.rs:511:17:511:17 | x | -| main.rs:515:12:515:12 | x | main.rs:511:17:511:17 | x | -| main.rs:519:6:519:6 | x | main.rs:518:22:518:22 | x | -| main.rs:520:10:520:10 | x | main.rs:518:22:518:22 | x | -| main.rs:521:10:521:10 | x | main.rs:518:22:518:22 | x | -| main.rs:522:6:522:6 | y | main.rs:518:38:518:38 | y | -| main.rs:523:9:523:9 | x | main.rs:518:22:518:22 | x | -| main.rs:530:6:530:6 | y | main.rs:528:9:528:9 | y | -| main.rs:533:15:533:15 | x | main.rs:527:13:527:13 | x | -| main.rs:540:9:540:9 | w | main.rs:536:9:536:9 | w | -| main.rs:542:7:542:7 | w | main.rs:536:9:536:9 | w | -| main.rs:545:15:545:15 | z | main.rs:535:13:535:13 | z | -| main.rs:552:6:552:6 | y | main.rs:550:9:550:9 | y | -| main.rs:553:15:553:15 | x | main.rs:549:13:549:13 | x | -| main.rs:561:19:561:19 | x | main.rs:557:9:557:9 | x | -| main.rs:563:5:563:7 | cap | main.rs:560:9:560:11 | cap | -| main.rs:564:15:564:15 | x | main.rs:557:9:557:9 | x | -| main.rs:572:19:572:19 | x | main.rs:568:13:568:13 | x | -| main.rs:574:5:574:12 | closure1 | main.rs:571:9:571:16 | closure1 | -| main.rs:575:15:575:15 | x | main.rs:568:13:568:13 | x | -| main.rs:583:5:583:12 | closure2 | main.rs:580:13:580:20 | closure2 | -| main.rs:584:15:584:15 | y | main.rs:577:13:577:13 | y | -| main.rs:590:9:590:9 | z | main.rs:586:13:586:13 | z | -| main.rs:592:5:592:12 | closure3 | main.rs:589:13:589:20 | closure3 | -| main.rs:593:15:593:15 | z | main.rs:586:13:586:13 | z | -| main.rs:602:5:602:9 | block | main.rs:598:9:598:13 | block | -| main.rs:603:15:603:15 | i | main.rs:597:13:597:13 | i | -| main.rs:608:15:608:15 | x | main.rs:607:13:607:13 | x | -| main.rs:609:15:609:15 | x | main.rs:607:13:607:13 | x | -| main.rs:611:16:611:16 | b | main.rs:606:8:606:8 | b | -| main.rs:614:19:614:19 | x | main.rs:607:13:607:13 | x | -| main.rs:615:19:615:19 | x | main.rs:607:13:607:13 | x | -| main.rs:618:19:618:19 | x | main.rs:607:13:607:13 | x | -| main.rs:619:19:619:19 | x | main.rs:607:13:607:13 | x | -| main.rs:621:15:621:15 | x | main.rs:607:13:607:13 | x | -| main.rs:627:16:627:17 | b1 | main.rs:624:13:624:14 | b1 | -| main.rs:629:19:629:19 | x | main.rs:625:9:625:9 | x | -| main.rs:631:19:631:19 | x | main.rs:625:9:625:9 | x | -| main.rs:635:16:635:17 | b2 | main.rs:624:23:624:24 | b2 | -| main.rs:637:19:637:19 | x | main.rs:625:9:625:9 | x | -| main.rs:639:19:639:19 | x | main.rs:625:9:625:9 | x | -| main.rs:649:16:649:19 | self | main.rs:648:20:648:23 | self | -| main.rs:653:9:653:12 | self | main.rs:652:11:652:14 | self | -| main.rs:659:13:659:16 | self | main.rs:656:23:656:26 | self | -| main.rs:659:25:659:25 | n | main.rs:657:22:657:22 | n | -| main.rs:661:9:661:9 | f | main.rs:657:17:657:17 | f | -| main.rs:662:9:662:9 | f | main.rs:657:17:657:17 | f | -| main.rs:668:15:668:15 | a | main.rs:667:13:667:13 | a | -| main.rs:669:5:669:5 | a | main.rs:667:13:667:13 | a | -| main.rs:670:15:670:15 | a | main.rs:667:13:667:13 | a | -| main.rs:672:15:672:15 | a | main.rs:667:13:667:13 | a | -| main.rs:677:15:677:15 | a | main.rs:676:13:676:13 | a | -| main.rs:678:5:678:5 | a | main.rs:676:13:676:13 | a | -| main.rs:679:15:679:15 | a | main.rs:676:13:676:13 | a | -| main.rs:681:15:681:15 | a | main.rs:676:13:676:13 | a | -| main.rs:687:15:687:15 | x | main.rs:685:9:685:9 | x | -| main.rs:699:10:699:13 | self | main.rs:698:17:698:20 | self | -| main.rs:705:5:705:5 | a | main.rs:704:13:704:13 | a | -| main.rs:708:15:708:15 | a | main.rs:704:13:704:13 | a | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:9:727:21 | var_in_macro | -| main.rs:728:15:728:28 | var_from_macro | main.rs:726:9:726:22 | var_from_macro | -| main.rs:734:30:734:41 | var_in_macro | main.rs:734:15:734:28 | var_in_macro | -| main.rs:735:15:735:26 | var_in_macro | main.rs:729:9:729:20 | var_in_macro | -| main.rs:741:15:741:15 | x | main.rs:739:9:739:9 | x | -| main.rs:748:20:748:20 | b | main.rs:746:20:746:20 | b | -| main.rs:752:5:752:7 | cap | main.rs:746:13:746:15 | cap | -| main.rs:753:15:753:15 | x | main.rs:745:13:745:13 | x | -| main.rs:761:19:761:19 | x | main.rs:759:13:759:13 | x | -| main.rs:768:15:768:15 | y | main.rs:760:13:760:13 | y | -| main.rs:770:17:770:20 | N0ne | main.rs:769:13:769:16 | N0ne | -| main.rs:779:13:779:22 | test_alias | main.rs:776:13:776:22 | test_alias | -| main.rs:780:9:780:12 | test | main.rs:778:13:778:16 | test | -| main.rs:788:15:788:15 | x | main.rs:787:13:787:13 | x | -| main.rs:790:20:790:20 | x | main.rs:789:18:789:18 | x | -| main.rs:793:15:793:15 | x | main.rs:787:13:787:13 | x | +| main.rs:320:5:320:5 | x | main.rs:317:17:317:17 | x | +| main.rs:322:19:322:19 | x | main.rs:317:17:317:17 | x | +| main.rs:325:13:325:13 | x | main.rs:316:9:316:9 | x | +| main.rs:326:19:326:19 | x | main.rs:324:13:324:13 | x | +| main.rs:334:7:334:7 | x | main.rs:332:9:332:9 | x | +| main.rs:337:12:337:12 | x | main.rs:333:17:333:17 | x | +| main.rs:339:5:339:5 | x | main.rs:336:14:336:14 | x | +| main.rs:341:19:341:19 | x | main.rs:336:14:336:14 | x | +| main.rs:344:13:344:13 | x | main.rs:332:9:332:9 | x | +| main.rs:345:19:345:19 | x | main.rs:343:13:343:13 | x | +| main.rs:353:7:353:7 | x | main.rs:351:9:351:9 | x | +| main.rs:356:12:356:12 | x | main.rs:352:20:352:20 | x | +| main.rs:358:5:358:5 | x | main.rs:355:14:355:14 | x | +| main.rs:360:19:360:19 | x | main.rs:355:14:355:14 | x | +| main.rs:364:15:364:15 | x | main.rs:351:9:351:9 | x | +| main.rs:370:11:370:11 | x | main.rs:369:9:369:9 | x | +| main.rs:373:18:373:18 | x | main.rs:371:14:371:14 | x | +| main.rs:374:19:374:19 | x | main.rs:372:20:372:20 | x | +| main.rs:378:15:378:15 | x | main.rs:369:9:369:9 | x | +| main.rs:385:7:385:7 | x | main.rs:383:9:383:9 | x | +| main.rs:387:19:387:19 | x | main.rs:384:16:384:16 | x | +| main.rs:390:7:390:7 | x | main.rs:383:9:383:9 | x | +| main.rs:392:19:392:19 | x | main.rs:389:20:389:20 | x | +| main.rs:394:19:394:19 | x | main.rs:383:9:383:9 | x | +| main.rs:400:11:400:11 | x | main.rs:399:9:399:9 | x | +| main.rs:402:20:402:20 | x | main.rs:401:18:401:18 | x | +| main.rs:409:11:409:11 | x | main.rs:408:9:408:9 | x | +| main.rs:411:16:411:16 | y | main.rs:410:14:410:14 | y | +| main.rs:413:22:413:22 | y | main.rs:410:14:410:14 | y | +| main.rs:414:26:414:26 | y | main.rs:412:22:412:22 | y | +| main.rs:426:15:426:16 | a8 | main.rs:420:5:420:6 | a8 | +| main.rs:427:15:427:16 | b3 | main.rs:422:9:422:10 | b3 | +| main.rs:428:15:428:16 | c1 | main.rs:423:9:423:10 | c1 | +| main.rs:433:15:433:16 | a9 | main.rs:431:20:431:55 | a9 | +| main.rs:442:15:442:17 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:443:15:443:16 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:444:15:444:16 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:451:9:451:11 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:452:9:452:10 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:453:9:453:10 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:455:15:455:17 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:456:15:456:16 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:457:15:457:16 | c2 | main.rs:440:13:440:14 | c2 | +| main.rs:464:23:464:25 | a10 | main.rs:461:13:461:15 | a10 | +| main.rs:465:23:465:24 | b4 | main.rs:462:13:462:14 | b4 | +| main.rs:469:15:469:17 | a10 | main.rs:438:13:438:15 | a10 | +| main.rs:470:15:470:16 | b4 | main.rs:439:13:439:14 | b4 | +| main.rs:476:9:476:9 | x | main.rs:475:10:475:10 | x | +| main.rs:478:9:478:23 | example_closure | main.rs:474:9:474:23 | example_closure | +| main.rs:479:15:479:16 | n1 | main.rs:477:9:477:10 | n1 | +| main.rs:484:9:484:9 | x | main.rs:483:6:483:6 | x | +| main.rs:486:9:486:26 | immutable_variable | main.rs:482:9:482:26 | immutable_variable | +| main.rs:487:15:487:16 | n2 | main.rs:485:9:485:10 | n2 | +| main.rs:494:9:494:9 | x | main.rs:493:10:493:10 | x | +| main.rs:495:15:495:15 | f | main.rs:492:9:492:9 | f | +| main.rs:499:9:499:9 | x | main.rs:497:10:497:10 | x | +| main.rs:502:15:502:15 | f | main.rs:492:9:492:9 | f | +| main.rs:508:17:508:17 | x | main.rs:506:14:506:14 | x | +| main.rs:517:13:517:13 | x | main.rs:516:14:516:14 | x | +| main.rs:518:19:518:19 | f | main.rs:515:13:515:13 | f | +| main.rs:526:12:526:12 | v | main.rs:523:9:523:9 | v | +| main.rs:527:19:527:22 | text | main.rs:525:9:525:12 | text | +| main.rs:534:15:534:15 | a | main.rs:532:13:532:13 | a | +| main.rs:536:15:536:15 | a | main.rs:532:13:532:13 | a | +| main.rs:543:6:543:10 | ref_i | main.rs:541:9:541:13 | ref_i | +| main.rs:544:15:544:15 | i | main.rs:540:13:540:13 | i | +| main.rs:548:6:548:6 | x | main.rs:547:17:547:17 | x | +| main.rs:549:10:549:10 | x | main.rs:547:17:547:17 | x | +| main.rs:550:10:550:10 | x | main.rs:547:17:547:17 | x | +| main.rs:551:12:551:12 | x | main.rs:547:17:547:17 | x | +| main.rs:555:6:555:6 | x | main.rs:554:22:554:22 | x | +| main.rs:556:10:556:10 | x | main.rs:554:22:554:22 | x | +| main.rs:557:10:557:10 | x | main.rs:554:22:554:22 | x | +| main.rs:558:6:558:6 | y | main.rs:554:38:554:38 | y | +| main.rs:559:9:559:9 | x | main.rs:554:22:554:22 | x | +| main.rs:566:6:566:6 | y | main.rs:564:9:564:9 | y | +| main.rs:569:15:569:15 | x | main.rs:563:13:563:13 | x | +| main.rs:576:9:576:9 | w | main.rs:572:9:572:9 | w | +| main.rs:578:7:578:7 | w | main.rs:572:9:572:9 | w | +| main.rs:581:15:581:15 | z | main.rs:571:13:571:13 | z | +| main.rs:588:6:588:6 | y | main.rs:586:9:586:9 | y | +| main.rs:589:15:589:15 | x | main.rs:585:13:585:13 | x | +| main.rs:597:19:597:19 | x | main.rs:593:9:593:9 | x | +| main.rs:599:5:599:7 | cap | main.rs:596:9:596:11 | cap | +| main.rs:600:15:600:15 | x | main.rs:593:9:593:9 | x | +| main.rs:608:19:608:19 | x | main.rs:604:13:604:13 | x | +| main.rs:610:5:610:12 | closure1 | main.rs:607:9:607:16 | closure1 | +| main.rs:611:15:611:15 | x | main.rs:604:13:604:13 | x | +| main.rs:619:5:619:12 | closure2 | main.rs:616:13:616:20 | closure2 | +| main.rs:620:15:620:15 | y | main.rs:613:13:613:13 | y | +| main.rs:626:9:626:9 | z | main.rs:622:13:622:13 | z | +| main.rs:628:5:628:12 | closure3 | main.rs:625:13:625:20 | closure3 | +| main.rs:629:15:629:15 | z | main.rs:622:13:622:13 | z | +| main.rs:638:5:638:9 | block | main.rs:634:9:634:13 | block | +| main.rs:639:15:639:15 | i | main.rs:633:13:633:13 | i | +| main.rs:644:15:644:15 | x | main.rs:643:13:643:13 | x | +| main.rs:645:15:645:15 | x | main.rs:643:13:643:13 | x | +| main.rs:647:16:647:16 | b | main.rs:642:8:642:8 | b | +| main.rs:650:19:650:19 | x | main.rs:643:13:643:13 | x | +| main.rs:651:19:651:19 | x | main.rs:643:13:643:13 | x | +| main.rs:654:19:654:19 | x | main.rs:643:13:643:13 | x | +| main.rs:655:19:655:19 | x | main.rs:643:13:643:13 | x | +| main.rs:657:15:657:15 | x | main.rs:643:13:643:13 | x | +| main.rs:663:16:663:17 | b1 | main.rs:660:13:660:14 | b1 | +| main.rs:665:19:665:19 | x | main.rs:661:9:661:9 | x | +| main.rs:667:19:667:19 | x | main.rs:661:9:661:9 | x | +| main.rs:671:16:671:17 | b2 | main.rs:660:23:660:24 | b2 | +| main.rs:673:19:673:19 | x | main.rs:661:9:661:9 | x | +| main.rs:675:19:675:19 | x | main.rs:661:9:661:9 | x | +| main.rs:685:16:685:19 | self | main.rs:684:20:684:23 | self | +| main.rs:689:9:689:12 | self | main.rs:688:11:688:14 | self | +| main.rs:695:13:695:16 | self | main.rs:692:23:692:26 | self | +| main.rs:695:25:695:25 | n | main.rs:693:22:693:22 | n | +| main.rs:697:9:697:9 | f | main.rs:693:17:693:17 | f | +| main.rs:698:9:698:9 | f | main.rs:693:17:693:17 | f | +| main.rs:704:15:704:15 | a | main.rs:703:13:703:13 | a | +| main.rs:705:5:705:5 | a | main.rs:703:13:703:13 | a | +| main.rs:706:15:706:15 | a | main.rs:703:13:703:13 | a | +| main.rs:708:15:708:15 | a | main.rs:703:13:703:13 | a | +| main.rs:713:15:713:15 | a | main.rs:712:13:712:13 | a | +| main.rs:714:5:714:5 | a | main.rs:712:13:712:13 | a | +| main.rs:715:15:715:15 | a | main.rs:712:13:712:13 | a | +| main.rs:717:15:717:15 | a | main.rs:712:13:712:13 | a | +| main.rs:723:15:723:15 | x | main.rs:721:9:721:9 | x | +| main.rs:735:10:735:13 | self | main.rs:734:17:734:20 | self | +| main.rs:741:5:741:5 | a | main.rs:740:13:740:13 | a | +| main.rs:744:15:744:15 | a | main.rs:740:13:740:13 | a | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:9:763:21 | var_in_macro | +| main.rs:764:15:764:28 | var_from_macro | main.rs:762:9:762:22 | var_from_macro | +| main.rs:770:30:770:41 | var_in_macro | main.rs:770:15:770:28 | var_in_macro | +| main.rs:771:15:771:26 | var_in_macro | main.rs:765:9:765:20 | var_in_macro | +| main.rs:777:15:777:15 | x | main.rs:775:9:775:9 | x | +| main.rs:784:20:784:20 | b | main.rs:782:20:782:20 | b | +| main.rs:788:5:788:7 | cap | main.rs:782:13:782:15 | cap | +| main.rs:789:15:789:15 | x | main.rs:781:13:781:13 | x | +| main.rs:797:19:797:19 | x | main.rs:795:13:795:13 | x | +| main.rs:804:15:804:15 | y | main.rs:796:13:796:13 | y | +| main.rs:806:17:806:20 | N0ne | main.rs:805:13:805:16 | N0ne | +| main.rs:815:13:815:22 | test_alias | main.rs:812:13:812:22 | test_alias | +| main.rs:816:9:816:12 | test | main.rs:814:13:814:16 | test | +| main.rs:824:15:824:15 | x | main.rs:823:13:823:13 | x | +| main.rs:826:20:826:20 | x | main.rs:825:18:825:18 | x | +| main.rs:829:15:829:15 | x | main.rs:823:13:823:13 | x | +| main.rs:841:9:841:9 | x | main.rs:840:13:840:13 | x | +| main.rs:843:19:843:19 | x | main.rs:838:9:838:9 | x | +| main.rs:845:19:845:19 | x | main.rs:838:9:838:9 | x | variableInitializer | main.rs:20:9:20:10 | x1 | main.rs:20:14:20:16 | "a" | | main.rs:25:13:25:14 | x2 | main.rs:25:18:25:18 | 4 | @@ -612,88 +654,98 @@ variableInitializer | main.rs:91:9:91:10 | s1 | main.rs:91:14:91:41 | Some(...) | | main.rs:100:9:100:9 | x | main.rs:100:13:100:22 | Some(...) | | main.rs:104:13:104:13 | x | main.rs:105:13:105:13 | x | -| main.rs:113:9:113:10 | s1 | main.rs:113:14:113:41 | Some(...) | -| main.rs:122:9:122:10 | x6 | main.rs:122:14:122:20 | Some(...) | -| main.rs:123:9:123:10 | y1 | main.rs:123:14:123:15 | 10 | -| main.rs:139:9:139:15 | numbers | main.rs:139:19:139:35 | TupleExpr | -| main.rs:170:9:170:10 | p2 | main.rs:170:14:170:37 | Point {...} | -| main.rs:184:9:184:11 | msg | main.rs:184:15:184:38 | ...::Hello {...} | -| main.rs:208:9:208:14 | either | main.rs:208:18:208:33 | ...::Left(...) | -| main.rs:222:9:222:10 | tv | main.rs:222:14:222:36 | ...::Second(...) | -| main.rs:238:9:238:14 | either | main.rs:238:18:238:33 | ...::Left(...) | -| main.rs:248:9:248:14 | either | main.rs:248:18:248:33 | ...::Left(...) | -| main.rs:272:9:272:10 | fv | main.rs:272:14:272:35 | ...::Second(...) | -| main.rs:281:9:281:9 | x | main.rs:281:12:281:19 | Some(...) | -| main.rs:289:13:289:13 | x | main.rs:290:13:290:13 | x | -| main.rs:297:9:297:9 | x | main.rs:297:13:297:20 | Some(...) | -| main.rs:308:13:308:13 | x | main.rs:309:13:309:13 | x | -| main.rs:316:9:316:9 | x | main.rs:316:13:316:20 | Some(...) | -| main.rs:334:9:334:9 | x | main.rs:334:13:334:20 | Some(...) | -| main.rs:337:20:337:20 | x | main.rs:338:18:338:18 | x | -| main.rs:348:9:348:9 | x | main.rs:348:13:348:18 | Ok(...) | -| main.rs:364:9:364:9 | x | main.rs:364:13:364:19 | Some(...) | -| main.rs:373:9:373:9 | x | main.rs:373:13:373:20 | Some(...) | -| main.rs:438:9:438:23 | example_closure | main.rs:439:9:440:9 | \|...\| x | -| main.rs:441:9:441:10 | n1 | main.rs:442:9:442:26 | example_closure(...) | -| main.rs:446:9:446:26 | immutable_variable | main.rs:447:5:448:9 | \|...\| x | -| main.rs:449:9:449:10 | n2 | main.rs:450:9:450:29 | immutable_variable(...) | -| main.rs:456:9:456:9 | f | main.rs:457:9:458:9 | \|...\| x | -| main.rs:479:13:479:13 | f | main.rs:480:13:481:13 | \|...\| x | -| main.rs:487:9:487:9 | v | main.rs:487:13:487:41 | &... | -| main.rs:496:13:496:13 | a | main.rs:496:17:496:17 | 0 | -| main.rs:504:13:504:13 | i | main.rs:504:17:504:17 | 1 | -| main.rs:505:9:505:13 | ref_i | main.rs:506:9:506:14 | &mut i | -| main.rs:527:13:527:13 | x | main.rs:527:17:527:17 | 2 | -| main.rs:528:9:528:9 | y | main.rs:529:9:529:28 | mutate_param(...) | -| main.rs:535:13:535:13 | z | main.rs:535:17:535:17 | 4 | -| main.rs:536:9:536:9 | w | main.rs:537:9:537:19 | &mut ... | -| main.rs:549:13:549:13 | x | main.rs:549:17:549:17 | 1 | -| main.rs:550:9:550:9 | y | main.rs:551:9:551:14 | &mut x | -| main.rs:557:9:557:9 | x | main.rs:557:13:557:15 | 100 | -| main.rs:560:9:560:11 | cap | main.rs:560:15:562:5 | \|...\| ... | -| main.rs:568:13:568:13 | x | main.rs:568:17:568:17 | 1 | -| main.rs:571:9:571:16 | closure1 | main.rs:571:20:573:5 | \|...\| ... | -| main.rs:577:13:577:13 | y | main.rs:577:17:577:17 | 2 | -| main.rs:580:13:580:20 | closure2 | main.rs:580:24:582:5 | \|...\| ... | -| main.rs:586:13:586:13 | z | main.rs:586:17:586:17 | 2 | -| main.rs:589:13:589:20 | closure3 | main.rs:589:24:591:5 | \|...\| ... | -| main.rs:597:13:597:13 | i | main.rs:597:22:597:22 | 0 | -| main.rs:598:9:598:13 | block | main.rs:598:17:600:5 | { ... } | -| main.rs:607:13:607:13 | x | main.rs:607:17:607:17 | 1 | -| main.rs:625:9:625:9 | x | main.rs:625:13:625:13 | 1 | -| main.rs:657:17:657:17 | f | main.rs:657:21:660:9 | \|...\| ... | -| main.rs:667:13:667:13 | a | main.rs:667:17:667:35 | MyStruct {...} | -| main.rs:676:13:676:13 | a | main.rs:676:17:676:25 | [...] | -| main.rs:685:9:685:9 | x | main.rs:685:13:685:14 | 16 | -| main.rs:689:9:689:9 | z | main.rs:689:13:689:14 | 17 | -| main.rs:704:13:704:13 | a | main.rs:704:17:704:35 | MyStruct {...} | -| main.rs:726:9:726:22 | var_from_macro | main.rs:727:9:727:25 | MacroExpr | -| main.rs:727:9:727:21 | var_in_macro | main.rs:727:23:727:24 | 37 | -| main.rs:729:9:729:20 | var_in_macro | main.rs:729:24:729:25 | 33 | -| main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | 0 | -| main.rs:745:13:745:13 | x | main.rs:745:17:745:19 | 100 | -| main.rs:746:13:746:15 | cap | main.rs:746:19:751:5 | \|...\| ... | -| main.rs:759:13:759:13 | x | main.rs:759:17:759:24 | Some(...) | -| main.rs:760:13:760:13 | y | main.rs:761:13:767:9 | match x { ... } | -| main.rs:776:13:776:22 | test_alias | main.rs:777:13:777:16 | test | -| main.rs:778:13:778:16 | test | main.rs:779:13:779:24 | test_alias(...) | -| main.rs:787:13:787:13 | x | main.rs:787:17:787:23 | Some(...) | +| main.rs:113:9:113:9 | s | main.rs:113:13:113:40 | Some(...) | +| main.rs:133:9:133:9 | x | main.rs:133:13:133:13 | 1 | +| main.rs:134:12:134:12 | x | main.rs:135:9:135:13 | ... + ... | +| main.rs:136:12:136:12 | x | main.rs:137:9:137:13 | ... + ... | +| main.rs:138:12:138:12 | x | main.rs:139:9:139:13 | ... + ... | +| main.rs:140:12:140:12 | x | main.rs:141:9:141:13 | ... + ... | +| main.rs:142:12:142:12 | x | main.rs:143:9:143:13 | ... + ... | +| main.rs:144:12:144:12 | x | main.rs:145:9:145:13 | ... + ... | +| main.rs:146:12:146:12 | x | main.rs:147:9:147:13 | ... + ... | +| main.rs:157:9:157:10 | x6 | main.rs:157:14:157:20 | Some(...) | +| main.rs:158:9:158:10 | y1 | main.rs:158:14:158:15 | 10 | +| main.rs:174:9:174:15 | numbers | main.rs:174:19:174:35 | TupleExpr | +| main.rs:205:9:205:10 | p2 | main.rs:205:14:205:37 | Point {...} | +| main.rs:219:9:219:11 | msg | main.rs:219:15:219:38 | ...::Hello {...} | +| main.rs:243:9:243:14 | either | main.rs:243:18:243:33 | ...::Left(...) | +| main.rs:257:9:257:10 | tv | main.rs:257:14:257:36 | ...::Second(...) | +| main.rs:273:9:273:14 | either | main.rs:273:18:273:33 | ...::Left(...) | +| main.rs:283:9:283:14 | either | main.rs:283:18:283:33 | ...::Left(...) | +| main.rs:307:9:307:10 | fv | main.rs:307:14:307:35 | ...::Second(...) | +| main.rs:316:9:316:9 | x | main.rs:316:12:316:19 | Some(...) | +| main.rs:324:13:324:13 | x | main.rs:325:13:325:13 | x | +| main.rs:332:9:332:9 | x | main.rs:332:13:332:20 | Some(...) | +| main.rs:343:13:343:13 | x | main.rs:344:13:344:13 | x | +| main.rs:351:9:351:9 | x | main.rs:351:13:351:20 | Some(...) | +| main.rs:369:9:369:9 | x | main.rs:369:13:369:20 | Some(...) | +| main.rs:372:20:372:20 | x | main.rs:373:18:373:18 | x | +| main.rs:383:9:383:9 | x | main.rs:383:13:383:18 | Ok(...) | +| main.rs:399:9:399:9 | x | main.rs:399:13:399:19 | Some(...) | +| main.rs:408:9:408:9 | x | main.rs:408:13:408:20 | Some(...) | +| main.rs:474:9:474:23 | example_closure | main.rs:475:9:476:9 | \|...\| x | +| main.rs:477:9:477:10 | n1 | main.rs:478:9:478:26 | example_closure(...) | +| main.rs:482:9:482:26 | immutable_variable | main.rs:483:5:484:9 | \|...\| x | +| main.rs:485:9:485:10 | n2 | main.rs:486:9:486:29 | immutable_variable(...) | +| main.rs:492:9:492:9 | f | main.rs:493:9:494:9 | \|...\| x | +| main.rs:515:13:515:13 | f | main.rs:516:13:517:13 | \|...\| x | +| main.rs:523:9:523:9 | v | main.rs:523:13:523:41 | &... | +| main.rs:532:13:532:13 | a | main.rs:532:17:532:17 | 0 | +| main.rs:540:13:540:13 | i | main.rs:540:17:540:17 | 1 | +| main.rs:541:9:541:13 | ref_i | main.rs:542:9:542:14 | &mut i | +| main.rs:563:13:563:13 | x | main.rs:563:17:563:17 | 2 | +| main.rs:564:9:564:9 | y | main.rs:565:9:565:28 | mutate_param(...) | +| main.rs:571:13:571:13 | z | main.rs:571:17:571:17 | 4 | +| main.rs:572:9:572:9 | w | main.rs:573:9:573:19 | &mut ... | +| main.rs:585:13:585:13 | x | main.rs:585:17:585:17 | 1 | +| main.rs:586:9:586:9 | y | main.rs:587:9:587:14 | &mut x | +| main.rs:593:9:593:9 | x | main.rs:593:13:593:15 | 100 | +| main.rs:596:9:596:11 | cap | main.rs:596:15:598:5 | \|...\| ... | +| main.rs:604:13:604:13 | x | main.rs:604:17:604:17 | 1 | +| main.rs:607:9:607:16 | closure1 | main.rs:607:20:609:5 | \|...\| ... | +| main.rs:613:13:613:13 | y | main.rs:613:17:613:17 | 2 | +| main.rs:616:13:616:20 | closure2 | main.rs:616:24:618:5 | \|...\| ... | +| main.rs:622:13:622:13 | z | main.rs:622:17:622:17 | 2 | +| main.rs:625:13:625:20 | closure3 | main.rs:625:24:627:5 | \|...\| ... | +| main.rs:633:13:633:13 | i | main.rs:633:22:633:22 | 0 | +| main.rs:634:9:634:13 | block | main.rs:634:17:636:5 | { ... } | +| main.rs:643:13:643:13 | x | main.rs:643:17:643:17 | 1 | +| main.rs:661:9:661:9 | x | main.rs:661:13:661:13 | 1 | +| main.rs:693:17:693:17 | f | main.rs:693:21:696:9 | \|...\| ... | +| main.rs:703:13:703:13 | a | main.rs:703:17:703:35 | MyStruct {...} | +| main.rs:712:13:712:13 | a | main.rs:712:17:712:25 | [...] | +| main.rs:721:9:721:9 | x | main.rs:721:13:721:14 | 16 | +| main.rs:725:9:725:9 | z | main.rs:725:13:725:14 | 17 | +| main.rs:740:13:740:13 | a | main.rs:740:17:740:35 | MyStruct {...} | +| main.rs:762:9:762:22 | var_from_macro | main.rs:763:9:763:25 | MacroExpr | +| main.rs:763:9:763:21 | var_in_macro | main.rs:763:23:763:24 | 37 | +| main.rs:765:9:765:20 | var_in_macro | main.rs:765:24:765:25 | 33 | +| main.rs:770:15:770:28 | var_in_macro | main.rs:770:15:770:28 | 0 | +| main.rs:781:13:781:13 | x | main.rs:781:17:781:19 | 100 | +| main.rs:782:13:782:15 | cap | main.rs:782:19:787:5 | \|...\| ... | +| main.rs:795:13:795:13 | x | main.rs:795:17:795:24 | Some(...) | +| main.rs:796:13:796:13 | y | main.rs:797:13:803:9 | match x { ... } | +| main.rs:812:13:812:22 | test_alias | main.rs:813:13:813:16 | test | +| main.rs:814:13:814:16 | test | main.rs:815:13:815:24 | test_alias(...) | +| main.rs:823:13:823:13 | x | main.rs:823:17:823:23 | Some(...) | +| main.rs:838:9:838:9 | x | main.rs:838:13:838:13 | 1 | +| main.rs:840:13:840:13 | x | main.rs:840:17:840:17 | 1 | capturedVariable -| main.rs:557:9:557:9 | x | -| main.rs:568:13:568:13 | x | -| main.rs:577:13:577:13 | y | -| main.rs:586:13:586:13 | z | -| main.rs:597:13:597:13 | i | -| main.rs:656:23:656:26 | self | -| main.rs:745:13:745:13 | x | +| main.rs:593:9:593:9 | x | +| main.rs:604:13:604:13 | x | +| main.rs:613:13:613:13 | y | +| main.rs:622:13:622:13 | z | +| main.rs:633:13:633:13 | i | +| main.rs:692:23:692:26 | self | +| main.rs:781:13:781:13 | x | capturedAccess -| main.rs:561:19:561:19 | x | -| main.rs:572:19:572:19 | x | -| main.rs:581:9:581:9 | y | -| main.rs:590:9:590:9 | z | -| main.rs:599:9:599:9 | i | -| main.rs:659:13:659:16 | self | -| main.rs:749:13:749:13 | x | +| main.rs:597:19:597:19 | x | +| main.rs:608:19:608:19 | x | +| main.rs:617:9:617:9 | y | +| main.rs:626:9:626:9 | z | +| main.rs:635:9:635:9 | i | +| main.rs:695:13:695:16 | self | +| main.rs:785:13:785:13 | x | nestedFunctionAccess -| main.rs:469:19:469:19 | f | main.rs:470:9:473:9 | fn f | -| main.rs:476:23:476:23 | f | main.rs:470:9:473:9 | fn f | +| main.rs:505:19:505:19 | f | main.rs:506:9:509:9 | fn f | +| main.rs:512:23:512:23 | f | main.rs:506:9:509:9 | fn f | diff --git a/rust/ql/test/library-tests/variables/variables.ql b/rust/ql/test/library-tests/variables/variables.ql index 9997b29c7d0e..934b3c4c4200 100644 --- a/rust/ql/test/library-tests/variables/variables.ql +++ b/rust/ql/test/library-tests/variables/variables.ql @@ -38,18 +38,11 @@ module VariableAccessTest implements TestSig { if v.getPat().isFromMacroExpansion() then inMacro = true else inMacro = false } - private predicate commmentAt(string text, string filepath, int line) { - exists(Comment c | - c.getLocation().hasLocationInfo(filepath, line, _, _, _) and - c.getCommentText().trim() = text - ) - } - private predicate decl(Variable v, string value) { exists(string filepath, int line, boolean inMacro | declAt(v, filepath, line, inMacro) | - commmentAt(value, filepath, line) and inMacro = false + commentAt(value, filepath, line) and inMacro = false or - not (commmentAt(_, filepath, line) and inMacro = false) and + not (commentAt(_, filepath, line) and inMacro = false) and value = v.getText() ) } diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index 6fb45ae05b9a..3a3382020278 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1269,7 +1269,7 @@ class _: @annotate(Impl) class _: """ - An `impl`` block. + An `impl` block. For example: ```rust diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 5d8a7393ea6f..2599cd92c7b3 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -312,7 +312,7 @@ class Impl(Item, ): is_default: predicate is_unsafe: predicate self_ty: optional["TypeRepr"] | child - trait_: optional["TypeRepr"] | child + trait_ty: optional["TypeRepr"] | child visibility: optional["Visibility"] | child where_clause: optional["WhereClause"] | child diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index e2de29754550..787779674f09 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.25 + +No user-facing changes. + ## 0.0.24 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.25.md b/shared/concepts/change-notes/released/0.0.25.md new file mode 100644 index 000000000000..e41a9acfa062 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.25.md @@ -0,0 +1,3 @@ +## 0.0.25 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index b956773a07f5..6d0e80a50c3f 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.24 +lastReleaseVersion: 0.0.25 diff --git a/shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll b/shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll index 4271784577f0..b2bda909e3ba 100644 --- a/shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll +++ b/shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll @@ -76,7 +76,7 @@ module HeuristicNames { string maybePassword() { result = "(?is).*(pass(wd|word|code|.?phrase)(?!.*question)|(auth(entication|ori[sz]ation)?).?key|oauth|" - + "api.?(key|token)|([_-]|\\b)mfa([_-]|\\b)).*" + + "api.?(key|tok)|([_-]|\\b)mfa([_-]|\\b)).*" } /** @@ -104,8 +104,9 @@ module HeuristicNames { // Geographic location - where the user is (or was) "latitude|longitude|nationality|" + // Financial data - such as credit card numbers, salary, bank accounts, and debts - "(credit|debit|bank|visa).?(card|num|no|acc(ou)?nt)|acc(ou)?nt.?(no|num|credit)|routing.?num|" + "(credit|debit|bank|visa).?(card|num|no|acc(ou)?nt)|(card|acc(ou)?nt).?(no|num|credit)|routing.?num|" + "salary|billing|beneficiary|credit.?(rating|score)|([_-]|\\b)(ccn|cvv|iban)([_-]|\\b)|" + + "security.?code|" + // Communications - e-mail addresses, private e-mail messages, SMS text messages, chat logs, etc. // "e(mail|_mail)|" + // this seems too noisy // Health - medical conditions, insurance status, prescription records @@ -145,13 +146,13 @@ module HeuristicNames { * suggesting nouns within the string do not represent the meaning of the whole string (e.g. a URL or a SQL query). * * We also filter out common words like `certain` and `concert`, since otherwise these could - * be matched by the certificate regular expressions. Same for `accountable` (account), or - * `secretarial` (secret). + * be matched by the certificate regular expressions. Same for `accountable` (account), + * `secretarial` (secret), `wildcard` (card), `coauthor` (oauth). */ string notSensitiveRegexp() { result = - "(?is).*([^\\w$.-]|redact|censor|obfuscate|hash|md5|sha|random|((? { Stmt getElse(); } + /** Gets the initializer of `if` statement `ifstmt`, if any. */ + default AstNode getIfInit(IfStmt ifstmt) { none() } + /** * A loop statement. Loop statements are further subclassed into specific * types of loops. @@ -118,14 +121,14 @@ signature module AstSig { /** A traditional C-style `for` loop. */ class ForStmt extends LoopStmt { - /** Gets the initializer expression of the loop at the specified (zero-based) position, if any. */ - Expr getInit(int index); + /** Gets the initializer of the loop at the specified (zero-based) position, if any. */ + AstNode getInit(int index); /** Gets the boolean condition of this `for` loop. */ Expr getCondition(); - /** Gets the update expression of this loop at the specified (zero-based) position, if any. */ - Expr getUpdate(int index); + /** Gets the update of this loop at the specified (zero-based) position, if any. */ + AstNode getUpdate(int index); } /** A for-loop that iterates over the elements of a collection. */ @@ -640,6 +643,7 @@ module Make0 Ast> { Input1::cfgCachedStageRef() and not exists(getChild(n, _)) and not postOrInOrder(n) and + not additionalNode(n, _, _) and not inConditionalContext(n, _) } @@ -1508,6 +1512,13 @@ module Make0 Ast> { or exists(IfStmt ifstmt | n1.isBefore(ifstmt) and + ( + n2.isBefore(getIfInit(ifstmt)) + or + not exists(getIfInit(ifstmt)) and n2.isBefore(ifstmt.getCondition()) + ) + or + n1.isAfter(getIfInit(ifstmt)) and n2.isBefore(ifstmt.getCondition()) or n1.isAfterTrue(ifstmt.getCondition()) and diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index e96e7aa69a28..b3518003b24d 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.34 +version: 2.0.36-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 7ecbeda3b216..b2cf75110ac8 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.7 + +No user-facing changes. + ## 2.1.6 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.1.7.md b/shared/dataflow/change-notes/released/2.1.7.md new file mode 100644 index 000000000000..af7772169fe4 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.1.7.md @@ -0,0 +1,3 @@ +## 2.1.7 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 1c810b60c4a3..cfa57a47251f 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.6 +lastReleaseVersion: 2.1.7 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index e599587f88ae..cdce161af7e3 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.6 +version: 2.1.8-dev groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 964c1bb1d98e..6619a18079c0 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.51.md b/shared/mad/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 60567e24cb42..21a06e7cc4db 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true dependencies: diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll new file mode 100644 index 000000000000..a467568f9832 --- /dev/null +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -0,0 +1,452 @@ +/** + * Provides a library for resolving local names based on syntactic scopes, including + * handling of shadowing sibling declarations. + */ +overlay[local?] +module; + +private import codeql.util.DenseRank +private import codeql.util.Location + +/** Provides the input to `LocalNameBinding`. */ +signature module LocalNameBindingInputSig { + /** + * Reverse references to the cached predicates that reference + * `CachedStage::ref()`. + */ + default predicate cacheRevRef() { none() } + + /** An AST node. */ + class AstNode { + /** Gets a textual representation of this element. */ + string toString(); + + /** Gets the location of this element. */ + Location getLocation(); + } + + /** + * Gets the child of AST node `n` at the specified index. + * + * The order of the children is only relevant for determining nearest preceding + * shadowing sibling declarations. + */ + AstNode getChild(AstNode n, int index); + + /** + * A conditional where any local declarations in the condition are in scope + * in the then-branch but not the else-branch. + * + * Example: + * + * ```rust + * if let Some(x) = opt { + * // x is in scope here + * } else { + * // x is not in scope here + * } + * ``` + * + * If a local declaration inside the condition is a shadowing sibling declaration + * (see below), then it should use the declaration itself as scope, otherwise it + * should use the condition as scope. + */ + class Conditional extends AstNode { + /** Gets the condition of this conditional. */ + AstNode getCondition(); + + /** Gets the then-branch of this conditional. */ + AstNode getThen(); + + /** Gets the else-branch of this conditional. */ + AstNode getElse(); + } + + /** + * A declaration where all local declarations in the left-hand side are in + * scope _after_ the declaration, and where any sibling declarations with + * the same name and syntactic scope preceding it are shadowed. + * + * Example: + * + * ```rust + * fn f() { + * let x = 1; + * // this declaration of `x` shadows the previous one (in the syntactic scope + * // being the body of `f`), but the `x` in the right-hand side still refers + * // to the first declaration + * let x = x + 1; + * // this access of `x` refers to the second declaration + * println!("{}", x); + * } + * ``` + */ + class SiblingShadowingDecl extends AstNode { + /** Gets the left-hand side of this declaration. */ + AstNode getLhs(); + + /** + * Gets the right-hand side of this declaration. + * + * Any local declared in the left-hand side of this declaration is _not_ in scope + * in the right-hand side. + */ + AstNode getRhs(); + + /** + * Gets the else-branch of this declaration, if any. + * + * Any local declared in the left-hand side of this declaration is _not_ in scope + * in the else-branch. + */ + AstNode getElse(); + } + + /** + * Holds if a local declaration named `name` exists at `definingNode` inside + * the syntactic scope `scope`. + * + * Note that declarations with a `definingNode` in the left-hand side of a + * shadowing sibling declaration `decl` should use `scope = decl`. + */ + predicate declInScope(AstNode definingNode, string name, AstNode scope); + + /** + * Holds if a local declaration named `name` is implicitly in scope in the given `scope`. + */ + default predicate implicitDeclInScope(string name, AstNode scope) { none() } + + /** + * Holds if `scope` is a top scope, meaning that names may not be looked up + * in ancestor scopes. + */ + default predicate isTopScope(AstNode scope) { none() } + + /** + * Holds if `n` is a node that may access a local named `name`. + */ + predicate accessCand(AstNode n, string name); + + /** + * Holds if the access candidate `n` should begin its lookup in `scope` instead + * of its immediately enclosing scope. + * + * For example, the `this` variable in an instance field initializer might need + * to be resolved relative to a constructor body. + * + * If `scope` declares a local with the name of `n`, then `scope` is guaranteed + * to be the scope that `n` ultimately resolves to. This can thus be used to take + * full control of scope resolution for specific types of references. + */ + default predicate lookupStartsAt(AstNode n, AstNode scope) { none() } +} + +/** + * Provides logic for resolving local names based on syntactic scopes, including + * handling of shadowing sibling declarations. + */ +module LocalNameBinding Input> { + private import Input + + final private class AstNodeFinal = AstNode; + + private class Scope extends AstNodeFinal { + Scope() { + declInScope(_, _, this) + or + implicitDeclInScope(_, this) + or + isTopScope(this) + } + } + + pragma[nomagic] + private predicate conditionHasChildAt(Conditional conditional, AstNode condition, int index) { + condition = conditional.getCondition() and + ( + exists(getChild(condition, index)) + or + // safeguard against empty conditions + not exists(getChild(condition, _)) and index = 0 + ) + } + + /** + * An adjusted version of `getChild` from the `Input` module where in conditionals like + * `if cond body`, instead of letting `body` be a child of `if`, we make it the last + * child of `cond`. This ensures that shadowing sibling declarations inside `cond` are + * properly handled inside `body`. + * + * Example: + * + * ```rust + * if let Some(x) = opt && let x = x + 1 { + * // the second declaration of `x` is in scope here + * } + * ``` + * + * We also move any `else` branch _before_ the condition to ensure that shadowing sibling + * declarations inside the condition are not in scope. + */ + private AstNode getChildAdj(AstNode parent, int index) { + result = getChild(parent, index) and + not exists(Conditional cond | result = [cond.getElse(), cond.getThen()]) + or + exists(Conditional cond | + parent = cond and + result = cond.getElse() and + index = -1 + or + exists(int last | + result = cond.getThen() and + last = max(int i | conditionHasChildAt(cond, parent, i)) and + index = last + 1 + ) + ) + } + + private module DenseRankInput implements DenseRankInputSig1 { + class C = AstNode; + + class Ranked = AstNode; + + int getRank(C parent, Ranked child) { + child = getChildAdj(parent, result) and + getChildAdj(parent, _) instanceof SiblingShadowingDecl + } + } + + private predicate getRankedChild = DenseRank1::denseRank/2; + + /** + * Holds if `n` is the `i`th child of `parent`, but should instead be considered + * a child of a shadowing sibling declaration `decl` when resolving accesses. + * + * This is the case when `decl` is the nearest shadowing sibling declaration + * preceding `n` amongst all the children of `parent`. + * + * Note that `decl` may itself also have to be nested under another shadowing + * sibling declaration. + */ + private predicate shouldBeShadowingDeclChild( + AstNode parent, SiblingShadowingDecl decl, int i, AstNode n + ) { + n = getRankedChild(parent, i) and + ( + decl = getRankedChild(parent, i - 1) + or + shouldBeShadowingDeclChild(parent, decl, i - 1, + any(AstNode prev | not prev instanceof SiblingShadowingDecl)) + ) + } + + /** + * Gets the AST parent of `n` with respect to determining enclosing scopes. + * + * For example, in + * + * ```rust + * let x = 1; + * let x = x + 1; + * println!("{}", x); + * ``` + * + * we will have (eliding leaf nodes) + * + * ```text + * let x = 1; + * / \ + * x + 1 let x = x + 1 + * | + * println!("{}", x); + * ``` + * + * and in + * + * ```rust + * if let Some(x) = opt && let x = x + 1 { + * println!("{}", x); + * } + * ``` + * + * we will have (again eliding leaf nodes) + * + * ```text + * if ... + * | + * ... && ... + * / \ + * let Some(x) = opt opt + * / \ + * let x = x + 1 x + 1 + * | + * println!("{}", x); + * ``` + */ + private AstNode getParentForScoping(AstNode n) { + not shouldBeShadowingDeclChild(_, _, _, n) and + not exists(SiblingShadowingDecl decl | n = [decl.getRhs(), decl.getElse()]) and + n = getChildAdj(result, _) + or + shouldBeShadowingDeclChild(_, result, _, n) + or + exists(SiblingShadowingDecl decl | + result = getParentForScoping(decl) and + n = [decl.getRhs(), decl.getElse()] + ) + } + + /** Gets the immediately enclosing variable scope of `n`. */ + private Scope getEnclosingScope(AstNode n) { + result = getParentForScoping(n) + or + exists(AstNode mid | + result = getEnclosingScope(mid) and + mid = getParentForScoping(n) and + not mid instanceof Scope + ) + } + + private predicate accessCandInLookupScope(AstNode n, string name, Scope lookup) { + accessCand(n, name) and + ( + lookupStartsAt(n, lookup) + or + not lookupStartsAt(n, _) and + lookup = getEnclosingScope(n) + ) + } + + pragma[nomagic] + private predicate lookupInScope(string name, Scope lookup, Scope scope) { + accessCandInLookupScope(_, name, lookup) and + scope = lookup + or + exists(Scope mid | + lookupInScope(name, lookup, mid) and + not declInScope(_, name, mid) and + not implicitDeclInScope(name, mid) and + not isTopScope(mid) and + scope = getEnclosingScope(mid) + ) + } + + cached + private newtype TLocal = + TExplicitLocal(AstNode definingNode, string name, AstNode scope) { + CachedStage::ref() and + declInScope(definingNode, name, scope) + } or + TImplicitLocal(string name, AstNode scope) { implicitDeclInScope(name, scope) } + + /** A locally declared entity, for example a variable or a parameter. */ + abstract private class LocalImpl extends TLocal { + /** Gets the AST node that defines this local entity, if any. */ + abstract AstNode getDefiningNode(); + + /** Gets the AST node that defines the scope of this local entity. */ + abstract AstNode getScope(); + + /** Gets the name of this local entity. */ + abstract string getName(); + + /** Gets the location of this local entity. */ + abstract Location getLocation(); + + /** Gets an access to this local entity. */ + LocalAccess getAnAccess() { result.getLocal() = this } + + /** Gets a textual representation of this local entity. */ + string toString() { result = this.getName() } + } + + final class Local = LocalImpl; + + /** An explicitly locally declared entity, for example a variable or a parameter. */ + class ExplicitLocal extends LocalImpl, TExplicitLocal { + private AstNode definingNode; + private string name; + private AstNode scope; + + ExplicitLocal() { this = TExplicitLocal(definingNode, name, scope) } + + override AstNode getDefiningNode() { result = definingNode } + + override AstNode getScope() { result = scope } + + override string getName() { result = name } + + override Location getLocation() { result = definingNode.getLocation() } + } + + /** An implicitly locally declared entity, for example a `self` parameter. */ + class ImplicitLocal extends LocalImpl, TImplicitLocal { + private string name; + private AstNode scope; + + ImplicitLocal() { this = TImplicitLocal(name, scope) } + + override AstNode getDefiningNode() { none() } + + override AstNode getScope() { result = scope } + + override string getName() { result = name } + + override Location getLocation() { result = scope.getLocation() } + } + + pragma[nomagic] + private predicate resolveInScope(string name, Scope lookup, Local l) { + exists(Scope scope | lookupInScope(name, lookup, scope) | + l = TExplicitLocal(_, name, scope) or + l = TImplicitLocal(name, scope) + ) + } + + cached + private predicate access(AstNode access, Local l) { + CachedStage::ref() and + exists(Scope lookup, string name | + accessCandInLookupScope(access, name, lookup) and + resolveInScope(name, lookup, l) + ) + } + + /** A local access. */ + final class LocalAccess extends AstNodeFinal { + private Local l; + + LocalAccess() { access(this, l) } + + /** Gets the local entity being accessed. */ + Local getLocal() { result = l } + } + + /** + * The cached stage of this module. + * + * Should not be exposed. + */ + cached + module CachedStage { + /** Reference to the cached stage of this module. */ + cached + predicate ref() { any() } + + /** + * DO NOT USE! + * + * Reverse references to the cached predicates that reference `ref()`. + */ + cached + predicate revRef() { + any() + or + cacheRevRef() + or + (exists(Local l) implies any()) + or + (exists(LocalAccess a) implies any()) + } + } +} diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml new file mode 100644 index 000000000000..1bd12ee05dde --- /dev/null +++ b/shared/namebinding/qlpack.yml @@ -0,0 +1,7 @@ +name: codeql/namebinding +version: 0.0.1-dev +groups: shared +library: true +dependencies: + codeql/util: ${workspace} +warnOnImplicitThis: true diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 7153b9314b18..c8b656e4f351 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.29 + +No user-facing changes. + ## 0.0.28 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.29.md b/shared/quantum/change-notes/released/0.0.29.md new file mode 100644 index 000000000000..4428927c79d5 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.29.md @@ -0,0 +1,3 @@ +## 0.0.29 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index 3462db7d348f..c81f18131208 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.28 +lastReleaseVersion: 0.0.29 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 58005b74255a..c430e4a69be4 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.28 +version: 0.0.30-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index e2a893046c95..a400a91f8c9b 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.51.md b/shared/rangeanalysis/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/rangeanalysis/codeql/rangeanalysis/Bound.qll b/shared/rangeanalysis/codeql/rangeanalysis/Bound.qll new file mode 100644 index 000000000000..5bb1723fd0aa --- /dev/null +++ b/shared/rangeanalysis/codeql/rangeanalysis/Bound.qll @@ -0,0 +1,111 @@ +/** + * Provides classes for representing abstract bounds for use in, for example, range analysis. + */ +overlay[local?] +module; + +private import codeql.util.Location + +signature module BoundDefinitions { + class Type; + + class IntegralType extends Type; + + class ConstantIntegerExpr extends Expr { + int getIntValue(); + } + + class SsaSourceVariable { + Type getType(); + } + + class SsaVariable { + SsaSourceVariable getSourceVariable(); + + string toString(); + + Location getLocation(); + + Expr getAUse(); + } + + class Expr { + string toString(); + + Location getLocation(); + } + + predicate interestingExprBound(Expr e); +} + +/** + * Provides classes for representing abstract bounds for use in, for example, range analysis. + * This is a generic implementation of bounds that relies on language specific modules to provide language-specific definitions of expressions, SSA variables, etc. + */ +overlay[local?] +module Bound Defs> { + private import Defs + + private newtype TBound = + TBoundZero() or + TBoundSsa(SsaVariable v) { v.getSourceVariable().getType() instanceof IntegralType } or + TBoundExpr(Expr e) { + interestingExprBound(e) and + not exists(SsaVariable v | e = v.getAUse()) + } + + /** + * A bound that may be inferred for an expression plus/minus an integer delta. + */ + abstract class Bound extends TBound { + /** Gets a textual representation of this bound. */ + abstract string toString(); + + /** Gets an expression that equals this bound plus `delta`. */ + abstract Expr getExpr(int delta); + + /** Gets an expression that equals this bound. */ + Expr getExpr() { result = this.getExpr(0) } + + /** Gets the location of this bound. */ + abstract Location getLocation(); + } + + /** + * The bound that corresponds to the integer 0. This is used to represent all + * integer bounds as bounds are always accompanied by an added integer delta. + */ + class ZeroBound extends Bound, TBoundZero { + override string toString() { result = "0" } + + override Expr getExpr(int delta) { result.(ConstantIntegerExpr).getIntValue() = delta } + + override Location getLocation() { result.hasLocationInfo("", 0, 0, 0, 0) } + } + + /** + * A bound corresponding to the value of an SSA variable. + */ + class SsaBound extends Bound, TBoundSsa { + /** Gets the SSA variable that equals this bound. */ + SsaVariable getSsa() { this = TBoundSsa(result) } + + override string toString() { result = this.getSsa().toString() } + + override Expr getExpr(int delta) { result = this.getSsa().getAUse() and delta = 0 } + + override Location getLocation() { result = this.getSsa().getLocation() } + } + + /** + * A bound that corresponds to the value of a specific expression that might be + * interesting, but isn't otherwise represented by the value of an SSA variable. + */ + class ExprBound extends Bound, TBoundExpr { + override string toString() { result = this.getExpr().toString() } + + override Expr getExpr(int delta) { this = TBoundExpr(result) and delta = 0 } + + override Location getLocation() { result = this.getExpr().getLocation() } + } +} diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 5a61b8d5eb91..7cecb52325fb 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index bb83dfc0a1ff..c4b7fc6e87f7 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.51.md b/shared/regex/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index a3c25f8f13e0..a1ec511b126a 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index f9145f2c88b7..9cfe68398b27 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.27 + +No user-facing changes. + ## 2.0.26 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.27.md b/shared/ssa/change-notes/released/2.0.27.md new file mode 100644 index 000000000000..639cf77090e5 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.27.md @@ -0,0 +1,3 @@ +## 2.0.27 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 63d57bef4816..a047558f018b 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.26 +lastReleaseVersion: 2.0.27 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 1ddb7e74af22..9c14b9e6469d 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.26 +version: 2.0.28-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 512a5732ccd9..14258018aea5 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.51.md b/shared/threat-models/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 2473e135f4d6..c7326273c652 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.50 +version: 1.0.52-dev library: true groups: shared dataExtensions: diff --git a/shared/tree-sitter-extractor/src/extractor/mod.rs b/shared/tree-sitter-extractor/src/extractor/mod.rs index 00816a00fd04..e8e608c32447 100644 --- a/shared/tree-sitter-extractor/src/extractor/mod.rs +++ b/shared/tree-sitter-extractor/src/extractor/mod.rs @@ -298,6 +298,10 @@ pub fn extract( yeast_runner: Option<&yeast::Runner<'_>>, ) { let path_str = file_paths::normalize_and_transform_path(path, transformer); + let source_root = std::env::current_dir() + .ok() + .and_then(|d| d.canonicalize().ok()); + let diagnostics_path = file_paths::relativize_for_diagnostic(path, source_root.as_deref()); let span = tracing::span!( tracing::Level::TRACE, "extract", @@ -318,7 +322,7 @@ pub fn extract( source, diagnostics_writer, trap_writer, - &path_str, + &diagnostics_path, file_label, language_prefix, schema, @@ -326,7 +330,7 @@ pub fn extract( if let Some(yeast_runner) = yeast_runner { let ast = yeast_runner - .run_from_tree(&tree) + .run_from_tree(&tree, source) .unwrap_or_else(|e| panic!("Desugaring failed for {path_str}: {e}")); traverse_yeast(&ast, &mut visitor); } else { @@ -343,8 +347,9 @@ struct ChildNode { } struct Visitor<'a> { - /// The file path of the source code (as string) - path: &'a str, + /// A path suitable for diagnostic locations: relative to the source root if possible, + /// otherwise a file: URI + diagnostics_path: &'a str, /// The label to use whenever we need to refer to the `@file` entity of this /// source file. file_label: trap::Label, @@ -376,13 +381,13 @@ impl<'a> Visitor<'a> { source: &'a [u8], diagnostics_writer: &'a mut diagnostics::LogWriter, trap_writer: &'a mut trap::Writer, - path: &'a str, + diagnostics_path: &'a str, file_label: trap::Label, language_prefix: &str, schema: &'a NodeTypeMap, ) -> Visitor<'a> { Visitor { - path, + diagnostics_path, file_label, source, diagnostics_writer, @@ -433,7 +438,7 @@ impl<'a> Visitor<'a> { ); mesg.severity(diagnostics::Severity::Warning) .location( - self.path, + self.diagnostics_path, loc.start_line, loc.start_column, loc.end_line, @@ -554,7 +559,7 @@ impl<'a> Visitor<'a> { ) .severity(diagnostics::Severity::Warning) .location( - self.path, + self.diagnostics_path, loc.start_line, loc.start_column, loc.end_line, diff --git a/shared/tree-sitter-extractor/src/file_paths.rs b/shared/tree-sitter-extractor/src/file_paths.rs index bdb9dd035f06..ea3be5a89586 100644 --- a/shared/tree-sitter-extractor/src/file_paths.rs +++ b/shared/tree-sitter-extractor/src/file_paths.rs @@ -3,6 +3,18 @@ use std::{ path::{Path, PathBuf}, }; +/// Given an absolute path, returns a relative path if it's under `source_root`, +/// otherwise the absolute path as-is. This is used for diagnostic locations, which +/// should use relative paths per the CodeQL diagnostic message format spec. +/// Absolute path fallback is handled downstream by the CLI's SARIF generator. +pub fn relativize_for_diagnostic(path: &Path, source_root: Option<&Path>) -> String { + source_root + .and_then(|root| path.strip_prefix(root).ok()) + .and_then(|rel| rel.to_str()) + .map(|s| s.replace('\\', "/")) + .unwrap_or_else(|| path.display().to_string()) +} + /// This represents the minimum supported path transformation that is needed to support extracting /// overlay databases. Specifically, it represents a transformer where one path prefix is replaced /// with a different prefix. @@ -224,3 +236,71 @@ pub fn path_for( } result } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn relativize_under_source_root() { + let path = Path::new("/home/runner/work/repo/src/foo.rb"); + let result = relativize_for_diagnostic(path, Some(Path::new("/home/runner/work/repo"))); + assert_eq!(result, "src/foo.rb"); + } + + #[test] + fn relativize_outside_source_root_returns_absolute() { + let path = Path::new("/other/location/foo.rb"); + let result = relativize_for_diagnostic(path, Some(Path::new("/home/runner/work/repo"))); + assert_eq!(result, "/other/location/foo.rb"); + } + + #[test] + fn relativize_no_source_root_returns_absolute() { + let path = Path::new("/home/runner/work/repo/src/foo.rb"); + let result = relativize_for_diagnostic(path, None); + assert_eq!(result, "/home/runner/work/repo/src/foo.rb"); + } + + #[test] + fn relativize_exact_root_path() { + let path = Path::new("/repo/foo.rb"); + let result = relativize_for_diagnostic(path, Some(Path::new("/repo"))); + assert_eq!(result, "foo.rb"); + } + + #[cfg(windows)] + mod windows { + use super::*; + + #[test] + fn relativize_windows_path_under_source_root() { + let path = Path::new(r"C:\Users\runner\work\repo\src\foo.rb"); + let result = + relativize_for_diagnostic(path, Some(Path::new(r"C:\Users\runner\work\repo"))); + assert_eq!(result, "src/foo.rb"); + } + + #[test] + fn relativize_windows_path_outside_source_root() { + let path = Path::new(r"D:\other\location\foo.rb"); + let result = + relativize_for_diagnostic(path, Some(Path::new(r"C:\Users\runner\work\repo"))); + assert_eq!(result, r"D:\other\location\foo.rb"); + } + + #[test] + fn relativize_windows_path_no_source_root() { + let path = Path::new(r"C:\Users\runner\work\repo\src\foo.rb"); + let result = relativize_for_diagnostic(path, None); + assert_eq!(result, r"C:\Users\runner\work\repo\src\foo.rb"); + } + + #[test] + fn relativize_windows_nested_path() { + let path = Path::new(r"C:\repo\src\lib\utils\foo.rb"); + let result = relativize_for_diagnostic(path, Some(Path::new(r"C:\repo"))); + assert_eq!(result, "src/lib/utils/foo.rb"); + } + } +} diff --git a/shared/tree-sitter-extractor/src/generator/mod.rs b/shared/tree-sitter-extractor/src/generator/mod.rs index d2521c51b3ec..da13322fe60c 100644 --- a/shared/tree-sitter-extractor/src/generator/mod.rs +++ b/shared/tree-sitter-extractor/src/generator/mod.rs @@ -115,8 +115,19 @@ pub fn generate( &node_parent_table_name, )), ql::TopLevel::Class(ql_gen::create_token_class(&token_name, &tokeninfo_name)), - ql::TopLevel::Class(ql_gen::create_reserved_word_class(&reserved_word_name)), ]; + // Only emit the ReservedWord class when there are actually unnamed token + // types in the schema (i.e., @{prefix}_reserved_word exists in the dbscheme). + // When converting from a YEAST YAML schema that has no unnamed tokens, this + // type is absent and referencing it would cause a QL compilation error. + let has_reserved_words = nodes + .values() + .any(|n| n.dbscheme_name == reserved_word_name); + if has_reserved_words { + body.push(ql::TopLevel::Class(ql_gen::create_reserved_word_class( + &reserved_word_name, + ))); + } // Overlay discard predicates body.push(ql::TopLevel::Predicate( @@ -294,7 +305,18 @@ fn convert_nodes( // type. let members: Set<&str> = n_members .iter() - .map(|n| nodes.get(n).unwrap().dbscheme_name.as_str()) + .map(|n| { + nodes + .get(n) + .unwrap_or_else(|| { + panic!( + "union type '{}' references unknown member node type {:?}", + node.dbscheme_name, n + ) + }) + .dbscheme_name + .as_str() + }) .collect(); entries.push(dbscheme::Entry::Union(dbscheme::Union { name: &node.dbscheme_name, diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index c98a035d149e..9e78286a1a49 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.51.md b/shared/tutorial/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index fa05472a305c..bb6eeeb2460a 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: 1.0.50 +version: 1.0.52-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index de43834a84e7..e9334c9da8d5 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.51.md b/shared/typeflow/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index fe6ae27a1d1a..9790bbcaeaed 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index 3bbb96e59a9a..24dc81f3aa2c 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.32 + +No user-facing changes. + ## 0.0.31 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.32.md b/shared/typeinference/change-notes/released/0.0.32.md new file mode 100644 index 000000000000..c390443f09a3 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.32.md @@ -0,0 +1,3 @@ +## 0.0.32 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index 54b504d06ecb..714fcfc18281 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.31 +lastReleaseVersion: 0.0.32 diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index cf82d77b5e1d..24a6392c6be1 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -155,8 +155,8 @@ signature module InputSig1 { class TypeParameter extends Type; /** - * A type abstraction. I.e., a place in the program where type variables are - * introduced. + * A type abstraction. I.e., a place in the program where type variables may + * be introduced. * * Example in C#: * ```csharp @@ -171,7 +171,7 @@ signature module InputSig1 { * ``` */ class TypeAbstraction { - /** Gets a type parameter introduced by this abstraction. */ + /** Gets a type parameter introduced by this abstraction, if any. */ TypeParameter getATypeParameter(); /** Gets a textual representation of this type abstraction. */ @@ -324,56 +324,31 @@ module Make1 Input1> { /** * Provides the input to `Make2`. * - * The `TypeMention` parameter is used to build the base type hierarchy based on - * `getABaseTypeMention` and to construct the constraint satisfaction - * hierarchy based on `conditionSatisfiesConstraint`. - * - * It will usually be based on syntactic occurrences of types in the source - * code. For example, in - * - * ```csharp - * class C : Base, Interface { } - * ``` - * - * a type mention would exist for `Base` and resolve to the following - * types: - * - * `TypePath` | `Type` - * ---------- | ------- - * `""` | ``Base`1`` - * `"0"` | `T` + * The `TypeMention` parameter is used to construct the constraint satisfaction + * hierarchy based on `conditionSatisfiesConstraint`, which is general enough + * to model both class hierarchies and trait implementation hierarchies in Rust. */ signature module InputSig2 { - /** - * Gets a base type mention of `t`, if any. Example: - * - * ```csharp - * class C : Base, Interface { } - * // ^ `t` - * // ^^^^^^^ `result` - * // ^^^^^^^^^ `result` - * ``` - */ - TypeMention getABaseTypeMention(Type t); - /** * Gets a type constraint on the type parameter `tp`, if any. All * instantiations of the type parameter must satisfy the constraint. * * For example, in + * * ```csharp * class GenericClass : IComparable> * // ^ `tp` * where T : IComparable { } * // ^^^^^^^^^^^^^^ `result` * ``` + * * the type parameter `T` has the constraint `IComparable`. */ TypeMention getATypeParameterConstraint(TypeParameter tp); /** * Holds if - * - `abs` is a type abstraction that introduces type variables that are + * - `abs` is a type abstraction that may introduce type variables that are * free in `condition` and `constraint`, * - and for every instantiation of the type parameters from `abs` the * resulting `condition` satisfies the constraint given by `constraint`. @@ -381,6 +356,7 @@ module Make1 Input1> { * through `constraint` should also apply to `condition`. * * Example in C#: + * * ```csharp * class C : IComparable> { } * // ^^^ `abs` @@ -389,6 +365,7 @@ module Make1 Input1> { * ``` * * Example in Rust: + * * ```rust * impl Trait for Type { } * // ^^^ `abs` ^^^^^^^^^^^^^^^ `condition` @@ -397,20 +374,24 @@ module Make1 Input1> { * * To see how `abs` changes the meaning of the type parameters that occur in * `condition`, consider the following examples in Rust: + * * ```rust * impl Trait for T { } * // ^^^ `abs` ^ `condition` * // ^^^^^ `constraint` * ``` + * * Here the meaning is "for all type parameters `T` it is the case that `T` * implements `Trait`". On the other hand, in + * * ```rust * fn foo() { } * // ^ `condition` * // ^^^^^ `constraint` * ``` + * * the meaning is "`T` implements `Trait`" where the constraint is only - * valid for the specific `T`. Note that `condition` and `condition` are + * valid for the specific `T`. Note that `condition` and `constraint` are * identical in the two examples. To encode the difference, `abs` in the * first example should contain `T` whereas in the seconds example `abs` * should be empty. @@ -825,99 +806,6 @@ module Make1 Input1> { predicate multipleConstraintImplementations(Type conditionRoot, Type constraintRoot) { countConstraintImplementations(conditionRoot, constraintRoot) > 1 } - - /** - * Holds if `baseMention` is a (transitive) base type mention of `sub`, - * and `t` is mentioned (implicitly) at `path` inside `baseMention`. For - * example, in - * - * ```csharp - * class C { } - * - * class Base { } - * - * class Mid : Base> { } - * - * class Sub : Mid> { } // Sub extends Base> - * ``` - * - * - ``C`1`` is mentioned at `T2` for immediate base type mention `Base>` - * of `Mid`, - * - `T3` is mentioned at `T2.T1` for immediate base type mention `Base>` - * of `Mid`, - * - ``C`1`` is mentioned at `T3` for immediate base type mention `Mid>` - * of `Sub`, - * - `T4` is mentioned at `T3.T1` for immediate base type mention `Mid>` - * of `Sub`, - * - ``C`1`` is mentioned at `T2` and implicitly at `T2.T1` for transitive base type - * mention `Base>` of `Sub`, and - * - `T4` is mentioned implicitly at `T2.T1.T1` for transitive base type mention - * `Base>` of `Sub`. - */ - pragma[nomagic] - predicate baseTypeMentionHasTypeAt(Type sub, TypeMention baseMention, TypePath path, Type t) { - exists(TypeMention immediateBaseMention | - pragma[only_bind_into](immediateBaseMention) = - getABaseTypeMention(pragma[only_bind_into](sub)) - | - // immediate base class - baseMention = immediateBaseMention and - t = immediateBaseMention.getTypeAt(path) - or - // transitive base class - exists(Type immediateBase | immediateBase = getTypeMentionRoot(immediateBaseMention) | - baseTypeMentionHasNonTypeParameterAt(immediateBase, baseMention, path, t) - or - exists(TypePath path0, TypePath prefix, TypePath suffix, TypeParameter tp | - /* - * Example: - * - * - `prefix = "T2.T1"`, - * - `path0 = "T3"`, - * - `suffix = ""`, - * - `path = "T2.T1"` - * - * ```csharp - * class C { } - * ^ `t` - * - * class Base { } - * - * class Mid : Base> { } - * // ^^^ `immediateBase` - * // ^^ `tp` - * // ^^^^^^^^^^^ `baseMention` - * - * class Sub : Mid> { } - * // ^^^ `sub` - * // ^^^^^^^^^^ `immediateBaseMention` - * ``` - */ - - baseTypeMentionHasTypeParameterAt(immediateBase, baseMention, prefix, tp) and - t = immediateBaseMention.getTypeAt(path0) and - path0.isCons(tp, suffix) and - path = prefix.append(suffix) - ) - ) - ) - } - - overlay[caller?] - pragma[inline] - predicate baseTypeMentionHasNonTypeParameterAt( - Type sub, TypeMention baseMention, TypePath path, Type t - ) { - not t = sub.getATypeParameter() and baseTypeMentionHasTypeAt(sub, baseMention, path, t) - } - - overlay[caller?] - pragma[inline] - predicate baseTypeMentionHasTypeParameterAt( - Type sub, TypeMention baseMention, TypePath path, TypeParameter tp - ) { - tp = sub.getATypeParameter() and baseTypeMentionHasTypeAt(sub, baseMention, path, tp) - } } private import BaseTypes @@ -1503,76 +1391,135 @@ module Make1 Input1> { private module AccessBaseType { /** - * Holds if inferring types at `a` in environment `e` might depend on the type at - * `path` of `apos` having `base` as a transitive base type. + * Holds if the type of `target` at `apos` and `pathToTp` is type parameter `tp`, + * and an argument with root type `argRootType` may be able to be matched against + * `tp` via the `conditionSatisfiesConstraint` hierarchy. */ - private predicate relevantAccess( - Access a, AccessEnvironment e, AccessPosition apos, Type base + pragma[nomagic] + private predicate argRootTypeSatisfiesTargetTypeCand( + Type argRootType, Declaration target, AccessPosition apos, TypeParameter tp, + TypePath pathToTp ) { - exists(Declaration target, DeclarationPosition dpos | - target = a.getTarget(e) and + exists( + DeclarationPosition dpos, TypeMention condition, TypeMention constraint, + Type constraintRootType + | accessDeclarationPositionMatch(apos, dpos) and - declarationBaseType(target, dpos, base, _, _) + tp = target.getDeclaredType(dpos, pathToTp) and + conditionSatisfiesConstraintTypeAt(_, condition, constraint, TypePath::nil(), + constraintRootType) and + constraintRootType = target.getDeclaredType(dpos, TypePath::nil()) and + argRootType = condition.getTypeAt(TypePath::nil()) ) } + private newtype TRelevantTarget = + MkRelevantTarget(Declaration target, AccessPosition apos) { + argRootTypeSatisfiesTargetTypeCand(_, target, apos, _, _) + } + + private class RelevantTarget extends MkRelevantTarget { + Declaration target; + AccessPosition apos; + + RelevantTarget() { this = MkRelevantTarget(target, apos) } + + Type getTypeAt(TypePath path) { + exists(DeclarationPosition dpos | + accessDeclarationPositionMatch(apos, dpos) and + result = target.getDeclaredType(dpos, path) + ) + } + + string toString() { result = target.toString() + ", " + apos.toString() } + + Location getLocation() { result = target.getLocation() } + } + pragma[nomagic] - private Type inferTypeAt( - Access a, AccessEnvironment e, AccessPosition apos, TypeParameter tp, TypePath suffix + private predicate argRootTypeSatisfiesTargetTypeCand( + Type argRootType, Access a, AccessEnvironment e, Declaration target, AccessPosition apos, + TypeParameter tp, TypePath pathToTp ) { - relevantAccess(a, e, apos, _) and - exists(TypePath path0 | - result = a.getInferredType(e, apos, path0) and - path0.isCons(tp, suffix) - ) + target = a.getTarget(e) and + argRootTypeSatisfiesTargetTypeCand(argRootType, target, apos, tp, pathToTp) and + not exists(getTypeArgument(a, target, tp, _)) } + private newtype TRelevantAccess = + MkRelevantAccess(Access a, AccessPosition apos, AccessEnvironment e) { + argRootTypeSatisfiesTargetTypeCand(a.getInferredType(e, apos, TypePath::nil()), a, e, _, + apos, _, _) + } + + private class RelevantAccess extends MkRelevantAccess { + Access a; + AccessPosition apos; + AccessEnvironment e; + + RelevantAccess() { this = MkRelevantAccess(a, apos, e) } + + RelevantTarget getTarget() { result = MkRelevantTarget(a.getTarget(e), apos) } + + pragma[nomagic] + Type getTypeAt(TypePath path) { result = a.getInferredType(e, apos, path) } + + string toString() { result = a.toString() + ", " + apos.toString() } + + Location getLocation() { result = a.getLocation() } + } + + private module SatisfiesParameterConstraintInput implements + SatisfiesConstraintInputSig + { + predicate relevantConstraint(RelevantAccess at, RelevantTarget constraint) { + constraint = at.getTarget() + } + } + + private module SatisfiesParameterConstraint = + SatisfiesConstraint; + /** - * Holds if `baseMention` is a (transitive) base type mention of the - * type of `a` at position `apos` at path `pathToSub` in environment - * `e`, and `t` is mentioned (implicitly) at `path` inside `base`. + * Holds if the (transitive) base type `t` at `path` of `a` in environment `e` + * for some `AccessPosition` matches the type parameter `tp`, which is used in + * the declared types of `target`. * * For example, in * * ```csharp * class C { } * - * class Base { } + * class Base { + * // ^^ `tp` + * public C Method() { ... } + * // ^^^^^^ `target` + * } * * class Mid : Base> { } * * class Sub : Mid> { } * - * new Sub().ToString(); - * // ^^^^^^^^^^^^^^ node at `apos` - * // ^^^^^^^^^^^^^^^^^^^^^^^^^ `a` + * new Sub().Method(); // Note: `Sub` is a subtype of `Base>>` + * // ^^^^^^^^^^^^^^^^^^^^^^^ `a` * ``` * - * where the method call is an access, `new Sub()` is at the access - * position which is the receiver of a method call, and `pathToSub` is - * `""` we have: + * we have that type parameter `T2` of `Base` is matched as follows: * - * `baseMention` | `path` | `t` - * ------------- | ------------ | --- - * `Mid>` | `"T3"` | ``C`1`` - * `Mid>` | `"T3.T1"` | `int` - * `Base>` | `"T2"` | ``C`1`` - * `Base>` | `"T2.T1"` | ``C`1`` - * `Base>` | `"T2.T1.T1"` | `int` + * `path` | `t` + * --------- | ------- + * `""` | ``C`1`` + * `"T1"` | ``C`1`` + * `"T1.T1"` | `int` */ - predicate hasBaseTypeMention( - Access a, AccessEnvironment e, AccessPosition apos, TypeMention baseMention, - TypePath path, Type t + pragma[nomagic] + predicate baseTypeMatch( + Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { - relevantAccess(a, e, apos, getTypeMentionRoot(baseMention)) and - exists(Type sub | sub = a.getInferredType(e, apos, TypePath::nil()) | - baseTypeMentionHasNonTypeParameterAt(sub, baseMention, path, t) - or - exists(TypePath prefix, TypePath suffix, TypeParameter tp | - baseTypeMentionHasTypeParameterAt(sub, baseMention, prefix, tp) and - t = inferTypeAt(a, e, apos, tp, suffix) and - path = prefix.append(suffix) - ) + exists(AccessPosition apos, TypePath pathToTp | + argRootTypeSatisfiesTargetTypeCand(_, a, e, target, apos, tp, pathToTp) and + SatisfiesParameterConstraint::satisfiesConstraint(MkRelevantAccess(a, apos, e), + MkRelevantTarget(target, apos), pathToTp.appendInverse(path), t) ) } } @@ -1683,77 +1630,6 @@ module Make1 Input1> { } } - /** - * Holds if the type of `a` at `apos` in environment `e` has the base type `base`, - * and when viewed as an element of that type has the type `t` at `path`. - */ - pragma[nomagic] - private predicate accessBaseType( - Access a, AccessEnvironment e, AccessPosition apos, Type base, TypePath path, Type t - ) { - exists(TypeMention tm | - AccessBaseType::hasBaseTypeMention(a, e, apos, tm, path, t) and - base = getTypeMentionRoot(tm) - ) - } - - /** - * Holds if the declared type at `decl` for `dpos` at the `path` is `tp` - * and `path` starts with a type parameter of `base`. - */ - pragma[nomagic] - private predicate declarationBaseType( - Declaration decl, DeclarationPosition dpos, Type base, TypePath path, TypeParameter tp - ) { - tp = decl.getDeclaredType(dpos, path) and - base.getATypeParameter() = path.getHead() - } - - /** - * Holds if the (transitive) base type `t` at `path` of `a` in environment `e` - * for some `AccessPosition` matches the type parameter `tp`, which is used in - * the declared types of `target`. - * - * For example, in - * - * ```csharp - * class C { } - * - * class Base { - * // ^^ `tp` - * public C Method() { ... } - * // ^^^^^^ `target` - * } - * - * class Mid : Base> { } - * - * class Sub : Mid> { } - * - * new Sub().Method(); // Note: `Sub` is a subtype of `Base>>` - * // ^^^^^^^^^^^^^^^^^^^^^^^ `a` - * ``` - * - * we have that type parameter `T2` of `Base` is matched as follows: - * - * `path` | `t` - * --------- | ------- - * `""` | ``C`1`` - * `"T1"` | ``C`1`` - * `"T1.T1"` | `int` - */ - pragma[nomagic] - private predicate baseTypeMatch( - Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp - ) { - not exists(getTypeArgument(a, target, tp, _)) and - target = a.getTarget(e) and - exists(AccessPosition apos, DeclarationPosition dpos, Type base, TypePath pathToTypeParam | - accessBaseType(a, e, apos, base, pathToTypeParam.appendInverse(path), t) and - declarationBaseType(target, dpos, base, pathToTypeParam, tp) and - accessDeclarationPositionMatch(apos, dpos) - ) - } - /** * Holds if for `a` and corresponding `target` in environment `e`, the type parameter * `tp` is matched by a type argument at the access with type `t` and type path @@ -1838,8 +1714,8 @@ module Make1 Input1> { // We can infer the type of `tp` from one of the access positions directTypeMatch(a, e, target, path, t, tp) or - // We can infer the type of `tp` by going up the type hiearchy - baseTypeMatch(a, e, target, path, t, tp) + // We can infer the type of `tp` by going up the type hierarchy + AccessBaseType::baseTypeMatch(a, e, target, path, t, tp) or // We can infer the type of `tp` by a type constraint typeConstraintBaseTypeMatch(a, e, target, path, t, tp) diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index dfefd717254b..ab43c330dcc2 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.31 +version: 0.0.33-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 313862d5bc72..e9b5492b0d82 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.35 + +No user-facing changes. + ## 2.0.34 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.35.md b/shared/typetracking/change-notes/released/2.0.35.md new file mode 100644 index 000000000000..526e1fc9f4ce --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.35.md @@ -0,0 +1,3 @@ +## 2.0.35 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 339a3ce7c57a..27eb8ef8ecea 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.34 +lastReleaseVersion: 2.0.35 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 905cc886823a..de6ff4c16c99 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.34 +version: 2.0.36-dev groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 5838cd3c5355..dbafbea9b98d 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.51.md b/shared/typos/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 65791cd6efdf..0b6aee6fd1c4 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 24a4f7d09a29..df741ed9d730 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.38 + +No user-facing changes. + ## 2.0.37 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.38.md b/shared/util/change-notes/released/2.0.38.md new file mode 100644 index 000000000000..0fab2ede165d --- /dev/null +++ b/shared/util/change-notes/released/2.0.38.md @@ -0,0 +1,3 @@ +## 2.0.38 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 108259a74002..4ec9eb0980cf 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.37 +lastReleaseVersion: 2.0.38 diff --git a/shared/util/codeql/util/DenseRank.qll b/shared/util/codeql/util/DenseRank.qll index 89ab865e9595..6521bcec21ba 100644 --- a/shared/util/codeql/util/DenseRank.qll +++ b/shared/util/codeql/util/DenseRank.qll @@ -55,13 +55,33 @@ signature module DenseRankInputSig { module DenseRank { private import Input + private int getARank() { result = getRank(_) } + + pragma[noinline] + private int getARankGap() { result = getARank() and not result - 1 = getARank() } + + pragma[noinline] + private predicate isDenseFrom(int i) { i = unique( | | getARankGap()) } + + pragma[noinline] + private int getRankNeedsDenseRank(Ranked r) { result = getRank(r) and not isDenseFrom(_) } + private int rankRank(Ranked r, int rnk) { - rnk = getRank(r) and - rnk = rank[result](int rnk0 | rnk0 = getRank(_) | rnk0) + rnk = getRankNeedsDenseRank(r) and + rnk = rank[result](int rnk0 | rnk0 = getRankNeedsDenseRank(_) | rnk0) } /** Gets the `Ranked` value for which the dense rank is `rnk`. */ - Ranked denseRank(int rnk) { rnk = rankRank(result, getRank(result)) } + pragma[nomagic] + Ranked denseRank(int rnk) { + rnk = rankRank(result, getRankNeedsDenseRank(result)) + or + exists(int i, int offset | + isDenseFrom(i) and + offset = i - 1 and + rnk = getRank(result) - offset + ) + } } /** Provides the input to `DenseRank1`. */ @@ -82,16 +102,38 @@ signature module DenseRankInputSig1 { module DenseRank1 { private import Input + private int getARank(C c) { result = getRank(c, _) } + + pragma[noinline] + private int getARankGap(C c) { result = getARank(c) and not result - 1 = getARank(c) } + + pragma[noinline] + private predicate isDenseFrom(C c, int i) { i = unique( | | getARankGap(c)) } + + pragma[noinline] + private int getRankNeedsDenseRank(C c, Ranked r) { + result = getRank(c, r) and not isDenseFrom(c, _) + } + private int rankRank(C c, Ranked r, int rnk) { - rnk = getRank(c, r) and - rnk = rank[result](int rnk0 | rnk0 = getRank(c, _) | rnk0) + rnk = getRankNeedsDenseRank(c, r) and + rnk = rank[result](int rnk0 | rnk0 = getRankNeedsDenseRank(c, _) | rnk0) } /** * Gets the `Ranked` value for which the dense rank in the context provided by * `c` is `rnk`. */ - Ranked denseRank(C c, int rnk) { rnk = rankRank(c, result, getRank(c, result)) } + pragma[nomagic] + Ranked denseRank(C c, int rnk) { + rnk = rankRank(c, result, getRankNeedsDenseRank(c, result)) + or + exists(int i, int offset | + isDenseFrom(c, i) and + offset = i - 1 and + rnk = getRank(c, result) - offset + ) + } } /** Provides the input to `DenseRank2`. */ @@ -116,16 +158,38 @@ signature module DenseRankInputSig2 { module DenseRank2 { private import Input + private int getARank(C1 c1, C2 c2) { result = getRank(c1, c2, _) } + + pragma[noinline] + private int getARankGap(C1 c1, C2 c2) { + result = getARank(c1, c2) and not result - 1 = getARank(c1, c2) + } + + pragma[noinline] + private predicate isDenseFrom(C1 c1, C2 c2, int i) { i = unique( | | getARankGap(c1, c2)) } + + pragma[noinline] + private int getRankNeedsDenseRank(C1 c1, C2 c2, Ranked r) { + result = getRank(c1, c2, r) and not isDenseFrom(c1, c2, _) + } + private int rankRank(C1 c1, C2 c2, Ranked r, int rnk) { - rnk = getRank(c1, c2, r) and - rnk = rank[result](int rnk0 | rnk0 = getRank(c1, c2, _) | rnk0) + rnk = getRankNeedsDenseRank(c1, c2, r) and + rnk = rank[result](int rnk0 | rnk0 = getRankNeedsDenseRank(c1, c2, _) | rnk0) } /** * Gets the `Ranked` value for which the dense rank in the context provided by * `c1` and `c2` is `rnk`. */ + pragma[nomagic] Ranked denseRank(C1 c1, C2 c2, int rnk) { - rnk = rankRank(c1, c2, result, getRank(c1, c2, result)) + rnk = rankRank(c1, c2, result, getRankNeedsDenseRank(c1, c2, result)) + or + exists(int i, int offset | + isDenseFrom(c1, c2, i) and + offset = i - 1 and + rnk = getRank(c1, c2, result) - offset + ) } } diff --git a/shared/util/codeql/util/test/InlineExpectationsTest.qll b/shared/util/codeql/util/test/InlineExpectationsTest.qll index e2ea9b87e74c..e785adda4566 100644 --- a/shared/util/codeql/util/test/InlineExpectationsTest.qll +++ b/shared/util/codeql/util/test/InlineExpectationsTest.qll @@ -597,7 +597,7 @@ private string mainResultSet() { result = ["#select", "problems"] } * foo(); // $ Alert[rust/unreachable-code] * ``` * - * In the example above, the `$ Alert[rust/unused-value]` commment is only taken + * In the example above, the `$ Alert[rust/unused-value]` comment is only taken * into account in the test for the query with ID `rust/unused-value`, and vice * versa for the `$ Alert[rust/unreachable-code]` comment. * diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index d7dd7255df0c..2914785b1464 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.37 +version: 2.0.39-dev groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 96dfbcadf568..685a8032d640 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.51.md b/shared/xml/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 8de2d725b225..0476610fda8e 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index e006acbeb214..4f57ee07cfa7 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.51 + +No user-facing changes. + ## 1.0.50 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.51.md b/shared/yaml/change-notes/released/1.0.51.md new file mode 100644 index 000000000000..b96d48b88228 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.51.md @@ -0,0 +1,3 @@ +## 1.0.51 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 856137cc5db6..232dbe38ec8e 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.50 +lastReleaseVersion: 1.0.51 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 6c817def5005..ae27690a3f91 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.50 +version: 1.0.52-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/yeast-macros/src/parse.rs b/shared/yeast-macros/src/parse.rs index 70bd46d5b6f6..eb3b161b295a 100644 --- a/shared/yeast-macros/src/parse.rs +++ b/shared/yeast-macros/src/parse.rs @@ -113,8 +113,24 @@ fn parse_query_node_inner(tokens: &mut Tokens) -> Result { /// appear in any order; bare patterns are accumulated and emitted as a /// single `("child", ...)` entry. fn parse_query_fields(tokens: &mut Tokens) -> Result> { - let mut fields = Vec::new(); + // Accumulate per-field elems in declaration order; multiple uses of the + // same field name extend the same list (so e.g. `cond: (foo) cond: (bar)` + // matches a `cond` field whose first child is `foo` and second is `bar`). + let mut field_order: Vec = Vec::new(); + let mut field_elems: std::collections::HashMap> = + std::collections::HashMap::new(); let mut bare_children: Vec = Vec::new(); + let push_field_elem = |order: &mut Vec, + map: &mut std::collections::HashMap>, + name: String, + elem: TokenStream| { + if !map.contains_key(&name) { + order.push(name.clone()); + map.insert(name, vec![elem]); + } else { + map.get_mut(&name).unwrap().push(elem); + } + }; while tokens.peek().is_some() { if peek_is_field(tokens) { let field_name = expect_ident(tokens, "expected field name")?; @@ -122,10 +138,40 @@ fn parse_query_fields(tokens: &mut Tokens) -> Result> { expect_punct(tokens, ':', "expected `:` after field name")?; - let child = parse_query_node(tokens)?; - fields.push(quote! { - (#field_str, vec![yeast::query::QueryListElem::SingleNode(#child)]) - }); + // Parse the field's pattern. To support repetition like + // `field: (kind)* @cap`, parse the atom first, then check for + // a quantifier, and lastly handle a trailing `@capture`. + let atom = parse_query_atom(tokens)?; + if peek_is_repetition(tokens) { + let rep = expect_repetition(tokens)?; + let elem = quote! { + yeast::query::QueryListElem::Repeated { + children: vec![yeast::query::QueryListElem::SingleNode(#atom)], + rep: #rep, + } + }; + let elem = maybe_wrap_list_capture(tokens, elem)?; + push_field_elem(&mut field_order, &mut field_elems, field_str, elem); + } else { + let child = if peek_is_at(tokens) { + tokens.next(); + let capture_name = + expect_ident(tokens, "expected capture name after @")?; + let name_str = capture_name.to_string(); + quote! { + yeast::query::QueryNode::Capture { + capture: #name_str, + node: Box::new(#atom), + } + } + } else { + atom + }; + let elem = quote! { + yeast::query::QueryListElem::SingleNode(#child) + }; + push_field_elem(&mut field_order, &mut field_elems, field_str, elem); + } } else { // Bare patterns — accumulate into the implicit `child` field. // We don't break here, so we can interleave with named fields. @@ -137,6 +183,13 @@ fn parse_query_fields(tokens: &mut Tokens) -> Result> { bare_children.extend(elems); } } + let mut fields: Vec = Vec::new(); + for name in field_order { + let elems = field_elems.remove(&name).unwrap(); + fields.push(quote! { + (#name, vec![#(#elems),*]) + }); + } if !bare_children.is_empty() { fields.push(quote! { ("child", vec![#(#bare_children),*]) @@ -299,7 +352,7 @@ fn parse_direct_node(tokens: &mut Tokens, ctx: &Ident) -> Result { Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Brace => { let group = expect_group(tokens, Delimiter::Brace)?; let expr = group.stream(); - Ok(quote! { #expr }) + Ok(quote! { ::std::convert::Into::::into(#expr) }) } Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Parenthesis => { let group = expect_group(tokens, Delimiter::Parenthesis)?; @@ -329,12 +382,17 @@ fn parse_direct_node_inner(tokens: &mut Tokens, ctx: &Ident) -> Result Result Result = #expr; }); - field_args.push(quote! { (#field_str, #temp) }); + stmts.push(quote! { + let #temp: Vec = (#expr).into_iter() + .map(::std::convert::Into::::into) + .collect(); + }); + // An empty splice means the field is absent — skip it + // entirely rather than emitting an empty named field. + field_args.push(quote! { + if !#temp.is_empty() { __fields.push((#field_str, #temp)); } + }); continue; } } } let value = parse_direct_node(tokens, ctx)?; - stmts.push(quote! { let #temp = #value; }); - field_args.push(quote! { (#field_str, vec![#temp]) }); + stmts.push(quote! { let #temp: usize = #value; }); + field_args.push(quote! { __fields.push((#field_str, vec![#temp])); }); } // After all named fields, no other tokens are allowed. @@ -399,7 +465,9 @@ fn parse_direct_node_inner(tokens: &mut Tokens, ctx: &Ident) -> Result)> = Vec::new(); + #(#field_args)* + #ctx.node(#kind_str, __fields) } }) } @@ -413,6 +481,11 @@ fn parse_direct_list(tokens: &mut Tokens, ctx: &Ident) -> Result Result::into) + ); + }); } else { let expr = group.stream(); - items.push(quote! { __nodes.push(#expr); }); + items.push(quote! { + __nodes.push(::std::convert::Into::::into(#expr)); + }); } continue; } @@ -580,13 +659,24 @@ pub fn parse_rule_top(input: TokenStream) -> Result { let name_str = &cap.name; match cap.multiplicity { CaptureMultiplicity::Repeated => { - quote! { let #name: Vec = __captures.get_all(#name_str); } + quote! { + let #name: Vec = __captures.get_all(#name_str) + .into_iter() + .map(yeast::NodeRef) + .collect(); + } } CaptureMultiplicity::Optional => { - quote! { let #name: Option = __captures.get_opt(#name_str); } + quote! { + let #name: Option = + __captures.get_opt(#name_str).map(yeast::NodeRef); + } } CaptureMultiplicity::Single => { - quote! { let #name: usize = __captures.get_var(#name_str).unwrap(); } + quote! { + let #name: yeast::NodeRef = + yeast::NodeRef(__captures.get_var(#name_str).unwrap()); + } } } }) @@ -613,19 +703,26 @@ pub fn parse_rule_top(input: TokenStream) -> Result { CaptureMultiplicity::Repeated => quote! { let __field_id = #ctx_ident.ast.field_id_for_name(#name_str) .unwrap_or_else(|| panic!("field '{}' not found", #name_str)); - __fields.insert(__field_id, #name); + __fields.insert( + __field_id, + #name.into_iter() + .map(::std::convert::Into::::into) + .collect(), + ); }, CaptureMultiplicity::Optional => quote! { let __field_id = #ctx_ident.ast.field_id_for_name(#name_str) .unwrap_or_else(|| panic!("field '{}' not found", #name_str)); if let Some(__id) = #name { - __fields.entry(__field_id).or_insert_with(Vec::new).push(__id); + __fields.entry(__field_id).or_insert_with(Vec::new) + .push(::std::convert::Into::::into(__id)); } }, CaptureMultiplicity::Single => quote! { let __field_id = #ctx_ident.ast.field_id_for_name(#name_str) .unwrap_or_else(|| panic!("field '{}' not found", #name_str)); - __fields.entry(__field_id).or_insert_with(Vec::new).push(#name); + __fields.entry(__field_id).or_insert_with(Vec::new) + .push(::std::convert::Into::::into(#name)); }, } }) diff --git a/shared/yeast/doc/yeast.md b/shared/yeast/doc/yeast.md index 893cdea24dde..823bf1c19425 100644 --- a/shared/yeast/doc/yeast.md +++ b/shared/yeast/doc/yeast.md @@ -349,8 +349,8 @@ to enable rewriting: ```rust let desugar = yeast::DesugaringConfig::new() - .add_phase("cleanup", cleanup_rules()) - .add_phase("desugar", desugar_rules()) + .add_phase("cleanup", yeast::PhaseKind::Repeating, cleanup_rules()) + .add_phase("translate", yeast::PhaseKind::OneShot, translate_rules()) .with_output_node_types_yaml(include_str!("output-node-types.yml")); let lang = simple::LanguageSpec { @@ -365,6 +365,15 @@ let lang = simple::LanguageSpec { A single-phase config is just `.add_phase(...)` called once. Phase names appear in error messages so you can tell which phase failed. +There are two kinds of phases: +- **Repeating**: + Each node is re-processed until none of the rules in the phase matches. + When a node no longer matches any rules, its children are recursively processed. In practice this is used to desugar or simplify an AST, while staying mostly within the same schema. +- **One-shot**: + Each node is processed by the first matching rule, and the engine panics if no rule matches. + Rules are then recursively applied to every captured node. + In practice this is used when translating from one AST schema to another, where an exhaustive match is required. + The same YAML node-types is used for both the runtime yeast `Schema` (so rules can refer to output-only kinds and fields) and TRAP validation (it is converted to JSON internally). diff --git a/shared/yeast/src/captures.rs b/shared/yeast/src/captures.rs index a92c5096e94e..404d402a5016 100644 --- a/shared/yeast/src/captures.rs +++ b/shared/yeast/src/captures.rs @@ -61,6 +61,25 @@ impl Captures { } } } + + /// Apply a fallible function to every captured id (across all keys), + /// replacing each id with the results. A function returning an empty + /// vector removes the capture; returning multiple ids splices them + /// into the capture's value list (suitable for `*`/`+` captures). + /// Stops and returns the error on the first failure. + pub fn try_map_all_captures( + &mut self, + mut f: impl FnMut(Id) -> Result, E>, + ) -> Result<(), E> { + for ids in self.captures.values_mut() { + let mut new_ids = Vec::with_capacity(ids.len()); + for &id in ids.iter() { + new_ids.extend(f(id)?); + } + *ids = new_ids; + } + Ok(()) + } pub fn map_captures_to(&mut self, from: &str, to: &'static str, f: &mut impl FnMut(Id) -> Id) { if let Some(from_ids) = self.captures.get(from) { let new_values = from_ids.iter().copied().map(f).collect(); diff --git a/shared/yeast/src/dump.rs b/shared/yeast/src/dump.rs index 99ba019cc3ea..d046c192053d 100644 --- a/shared/yeast/src/dump.rs +++ b/shared/yeast/src/dump.rs @@ -1,6 +1,6 @@ use std::fmt::Write; -use crate::{Ast, Node, NodeContent, CHILD_FIELD}; +use crate::{schema::Schema, Ast, Node, NodeContent, CHILD_FIELD}; /// Options for controlling AST dump output. pub struct DumpOptions { @@ -45,16 +45,143 @@ pub fn dump_ast_with_options( options: &DumpOptions, ) -> String { let mut out = String::new(); - dump_node(ast, root, source, options, 0, &mut out); + dump_node(ast, root, source, options, 0, None, &mut out); out } +/// Dump an AST and annotate type mismatches against a schema inline. +/// +/// Any node that does not match the expected type set for its parent field is +/// rendered with a trailing `" <-- ERROR: ..."` annotation on the same line. +pub fn dump_ast_with_type_errors( + ast: &Ast, + root: usize, + source: &str, + schema: &Schema, +) -> String { + dump_ast_with_type_errors_and_options(ast, root, source, schema, &DumpOptions::default()) +} + +/// Dump an AST and annotate type mismatches against a schema inline. +/// +/// Any node that does not match the expected type set for its parent field is +/// rendered with a trailing `" <-- ERROR: ..."` annotation on the same line. +pub fn dump_ast_with_type_errors_and_options( + ast: &Ast, + root: usize, + source: &str, + schema: &Schema, + options: &DumpOptions, +) -> String { + let mut out = String::new(); + dump_node(ast, root, source, options, 0, Some((schema, None, None)), &mut out); + out +} + +fn format_node_types(node_types: &[crate::schema::NodeType]) -> String { + node_types + .iter() + .map(|t| { + if t.named { + t.kind.clone() + } else { + format!("\"{}\"", t.kind) + } + }) + .collect::>() + .join(" | ") +} + +const EMPTY_NODE_TYPES: &[crate::schema::NodeType] = &[]; + +/// Generate a type-checking error message for a node if it doesn't match expected types. +/// +/// # Arguments +/// - `schema`: The AST schema to validate against. +/// - `node`: The node being checked. +/// - `expected`: The set of allowed types for this node, or `None` if type-checking is disabled. +/// - `parent_field`: Optional tuple of (parent_kind, field_name) for context in error messages. +/// +/// # Returns +/// `Some(error_message)` if the node violates the schema (e.g., wrong kind, missing field declaration). +/// `None` if the node matches the expected types or if type-checking is disabled. +fn type_error_for_node( + schema: &Schema, + node: &Node, + expected: Option<&[crate::schema::NodeType]>, + parent_field: Option<(&str, &str)>, +) -> Option { + if schema.id_for_node_kind(node.kind_name()).is_none() + && schema.id_for_unnamed_node_kind(node.kind_name()).is_none() + { + return Some(format!("node kind '{}' not in schema", node.kind_name())); + } + + let expected = expected?; + if expected.is_empty() { + if let Some((kind, field)) = parent_field { + return Some(format!("the node '{kind}' has no field '{field}'")); + } + return Some("field not declared in schema for this parent node".to_string()); + } + if schema.node_matches_types(node.kind_name(), node.is_named(), expected) { + None + } else { + let actual = if node.is_named() { + node.kind_name().to_string() + } else { + format!("\"{}\"", node.kind_name()) + }; + + if let Some((kind, field)) = parent_field { + Some(format!( + "The field {}.{} should contain {}, but got {}", + kind, + field, + format_node_types(expected), + actual + )) + } else { + Some(format!( + "expected {}, got {}", + format_node_types(expected), + actual + )) + } + } +} + +/// Look up the allowed types for a field in the schema. +/// +/// # Arguments +/// - `schema`: The AST schema to query. +/// - `parent_kind`: The node kind of the parent that contains this field. +/// - `field_id`: The field ID within that parent node. +/// +/// # Returns +/// `Some(&[NodeType])` if the field is declared in the schema and has type constraints. +/// `None` if the field is not declared or has no constraints (undeclared field). +fn expected_for_field<'a>( + schema: &'a Schema, + parent_kind: &str, + field_id: u16, +) -> Option<&'a [crate::schema::NodeType]> { + schema + .field_types(parent_kind, field_id) + .map(|v| v.as_slice()) +} + fn dump_node( ast: &Ast, id: usize, source: &str, options: &DumpOptions, indent: usize, + type_check: Option<( + &Schema, + Option<&[crate::schema::NodeType]>, + Option<(&str, &str)>, + )>, out: &mut String, ) { let node = match ast.get_node(id) { @@ -90,6 +217,12 @@ fn dump_node( } } + if let Some((schema, expected, parent_field)) = type_check { + if let Some(err) = type_error_for_node(schema, node, expected, parent_field) { + write!(out, " <-- ERROR: {err}").unwrap(); + } + } + writeln!(out).unwrap(); // Named fields first @@ -98,31 +231,78 @@ fn dump_node( continue; // Handle unnamed children last } let field_name = ast.field_name_for_id(field_id).unwrap_or("?"); + let child_type_check = type_check.map(|(schema, _, _)| { + let expected = expected_for_field(schema, node.kind_name(), field_id) + .or(Some(EMPTY_NODE_TYPES)); + let parent_field = Some((node.kind_name(), field_name)); + (schema, expected, parent_field) + }); + if children.len() == 1 { write!(out, "{prefix} {field_name}:").unwrap(); // Inline single child let child = ast.get_node(children[0]); if child.is_some_and(is_leaf) { write!(out, " ").unwrap(); - dump_node_inline(ast, children[0], source, options, out); + dump_node_inline(ast, children[0], source, options, child_type_check, out); } else { writeln!(out).unwrap(); - dump_node(ast, children[0], source, options, indent + 2, out); + dump_node( + ast, + children[0], + source, + options, + indent + 2, + child_type_check, + out, + ); } } else { writeln!(out, "{prefix} {field_name}:").unwrap(); for &child_id in children { - dump_node(ast, child_id, source, options, indent + 2, out); + dump_node( + ast, + child_id, + source, + options, + indent + 2, + child_type_check, + out, + ); + } + } + } + + // Check for required fields that are absent + if let Some((schema, _, _)) = type_check { + for (field_id, field_name) in schema.required_fields_for_kind(node.kind_name()) { + if !node.fields.contains_key(&field_id) { + let name = field_name.unwrap_or("child"); + writeln!(out, "{prefix} <-- ERROR: missing required field '{name}'").unwrap(); } } } // Unnamed children — skip unnamed tokens (keywords, punctuation) if let Some(children) = node.fields.get(&CHILD_FIELD) { + let child_type_check = type_check.map(|(schema, _, _)| { + let expected = expected_for_field(schema, node.kind_name(), CHILD_FIELD) + .or(Some(EMPTY_NODE_TYPES)); + let parent_field = Some((node.kind_name(), "children")); + (schema, expected, parent_field) + }); for &child_id in children { if let Some(child) = ast.get_node(child_id) { if child.is_named() { - dump_node(ast, child_id, source, options, indent + 1, out); + dump_node( + ast, + child_id, + source, + options, + indent + 1, + child_type_check, + out, + ); } } } @@ -130,7 +310,18 @@ fn dump_node( } /// Dump a leaf node inline (no newline prefix, caller provides context). -fn dump_node_inline(ast: &Ast, id: usize, source: &str, options: &DumpOptions, out: &mut String) { +fn dump_node_inline( + ast: &Ast, + id: usize, + source: &str, + options: &DumpOptions, + type_check: Option<( + &Schema, + Option<&[crate::schema::NodeType]>, + Option<(&str, &str)>, + )>, + out: &mut String, +) { let node = match ast.get_node(id) { Some(n) => n, None => return, @@ -159,6 +350,12 @@ fn dump_node_inline(ast: &Ast, id: usize, source: &str, options: &DumpOptions, o } } + if let Some((schema, expected, parent_field)) = type_check { + if let Some(err) = type_error_for_node(schema, node, expected, parent_field) { + write!(out, " <-- ERROR: {err}").unwrap(); + } + } + writeln!(out).unwrap(); } diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index 281f44a98b26..0717d27e4b8b 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -23,12 +23,73 @@ pub use cursor::Cursor; use query::QueryNode; /// Node ids are indexes into the arena -type Id = usize; +pub type Id = usize; /// Field and Kind ids are provided by tree-sitter type FieldId = u16; type KindId = u16; +/// A typed reference to a node in an [`Ast`] arena. Wraps an [`Id`] but +/// deliberately does not implement [`std::fmt::Display`]: rendering a node +/// requires the [`Ast`] it lives in (to resolve [`NodeContent::Range`] back +/// to source text). Use [`YeastDisplay::yeast_to_string`] to format it. +#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)] +pub struct NodeRef(pub Id); + +impl NodeRef { + pub fn id(self) -> Id { + self.0 + } +} + +impl From for Id { + fn from(value: NodeRef) -> Self { + value.0 + } +} + +/// Like [`std::fmt::Display`], but the formatting routine is given access to +/// the [`Ast`] so that node references can resolve to their source text. +/// +/// All standard primitive and string types implement [`YeastDisplay`] via +/// the [`impl_yeast_display_via_display`] macro below. Coherence prevents a +/// blanket `impl`, so additional types must be added explicitly. +pub trait YeastDisplay { + fn yeast_to_string(&self, ast: &Ast) -> String; +} + +impl YeastDisplay for NodeRef { + fn yeast_to_string(&self, ast: &Ast) -> String { + ast.source_text(self.0) + } +} + +macro_rules! impl_yeast_display_via_display { + ($($t:ty),* $(,)?) => { + $( + impl YeastDisplay for $t { + fn yeast_to_string(&self, _ast: &Ast) -> String { + ::std::string::ToString::to_string(self) + } + } + )* + }; +} + +impl_yeast_display_via_display! { + i8, i16, i32, i64, i128, isize, + u8, u16, u32, u64, u128, usize, + f32, f64, + bool, char, + str, String, +} + +impl YeastDisplay for &T { + fn yeast_to_string(&self, ast: &Ast) -> String { + (**self).yeast_to_string(ast) + } +} + pub const CHILD_FIELD: u16 = u16::MAX; #[derive(Debug)] @@ -160,6 +221,9 @@ pub struct Ast { root: Id, nodes: Vec, schema: schema::Schema, + /// Original source bytes the tree was parsed from. Used to resolve + /// `NodeContent::Range` to text for synthesized literal nodes. + source: Vec, } impl std::fmt::Debug for Ast { @@ -182,21 +246,93 @@ impl Ast { schema: schema::Schema, tree: &tree_sitter::Tree, language: &tree_sitter::Language, + ) -> Self { + Self::from_tree_with_schema_and_source(schema, tree, language, Vec::new()) + } + + pub fn from_tree_with_schema_and_source( + schema: schema::Schema, + tree: &tree_sitter::Tree, + language: &tree_sitter::Language, + source: Vec, ) -> Self { let mut visitor = visitor::Visitor::new(language.clone()); visitor.visit(tree); - visitor.build_with_schema(schema) + let mut ast = visitor.build_with_schema(schema); + ast.source = source; + ast + } + + /// Returns the source text for `id`, resolving `NodeContent::Range` + /// against the stored source bytes when available. + pub fn source_text(&self, id: Id) -> String { + let Some(node) = self.get_node(id) else { return String::new(); }; + let read_range = |range: &tree_sitter::Range| { + let start = range.start_byte; + let end = range.end_byte; + if end <= self.source.len() && start <= end { + String::from_utf8_lossy(&self.source[start..end]).into_owned() + } else { + String::new() + } + }; + match &node.content { + NodeContent::Range(range) => read_range(range), + NodeContent::String(s) => s.to_string(), + NodeContent::DynamicString(s) if !s.is_empty() => s.clone(), + // Synthesized nodes (from rule transforms) carry an empty + // `DynamicString`; resolve them against the inherited source + // range so `#{capture}` after a translation still yields the + // original source text. + NodeContent::DynamicString(_) => match node.source_range { + Some(range) => read_range(&range), + None => String::new(), + }, + } } pub fn walk(&self) -> AstCursor { AstCursor::new(self) } + /// Return all nodes currently allocated in the AST arena. + /// + /// This includes nodes that are no longer reachable from `get_root()` + /// after desugaring rewrites. Use `reachable_node_ids()` for output-level + /// validation/traversal semantics. pub fn nodes(&self) -> &[Node] { &self.nodes } + /// Return node ids reachable from `get_root()` by following child edges. + /// + /// This reflects the effective AST after desugaring and excludes orphaned + /// arena nodes left behind by rewrite operations. + pub fn reachable_node_ids(&self) -> Vec { + let mut reachable = Vec::new(); + let mut stack = vec![self.root]; + let mut seen = vec![false; self.nodes.len()]; + + while let Some(id) = stack.pop() { + if id >= self.nodes.len() || seen[id] { + continue; + } + seen[id] = true; + reachable.push(id); + + if let Some(node) = self.get_node(id) { + for children in node.fields.values() { + for &child in children { + stack.push(child); + } + } + } + } + + reachable + } + pub fn get_root(&self) -> Id { self.root } @@ -427,6 +563,15 @@ impl Node { NodeContent::DynamicString(s) => Some(s.to_string()), } } + + /// Read the child ids stored under a given field, or an empty slice if + /// no such field is present on this node. + pub fn field_children(&self, field_id: FieldId) -> &[Id] { + self.fields + .get(&field_id) + .map(|v| v.as_slice()) + .unwrap_or(&[]) + } } /// The contents of a node is either a range in the original source file, @@ -493,18 +638,39 @@ impl Rule { node: Id, fresh: &tree_builder::FreshScope, ) -> Result>, String> { + match self.try_match(ast, node)? { + Some(captures) => Ok(Some(self.run_transform(ast, captures, node, fresh))), + None => Ok(None), + } + } + + /// Attempt to match this rule's query against `node`, returning the + /// resulting captures on success. Does not invoke the transform. + fn try_match(&self, ast: &Ast, node: Id) -> Result, String> { let mut captures = Captures::new(); if self.query.do_match(ast, node, &mut captures)? { - fresh.next_scope(); - let source_range = ast.get_node(node).and_then(|n| match n.content { - NodeContent::Range(r) => Some(r), - _ => n.source_range, - }); - Ok(Some((self.transform)(ast, captures, fresh, source_range))) + Ok(Some(captures)) } else { Ok(None) } } + + /// Run this rule's transform with the given captures, using `node`'s + /// source range as the source range of the produced nodes. + fn run_transform( + &self, + ast: &mut Ast, + captures: Captures, + node: Id, + fresh: &tree_builder::FreshScope, + ) -> Vec { + fresh.next_scope(); + let source_range = ast.get_node(node).and_then(|n| match n.content { + NodeContent::Range(r) => Some(r), + _ => n.source_range, + }); + (self.transform)(ast, captures, fresh, source_range) + } } const MAX_REWRITE_DEPTH: usize = 100; @@ -539,17 +705,17 @@ impl<'a> RuleIndex<'a> { } } -fn apply_rules( +fn apply_repeating_rules( rules: &[Rule], ast: &mut Ast, id: Id, fresh: &tree_builder::FreshScope, ) -> Result, String> { let index = RuleIndex::new(rules); - apply_rules_inner(&index, ast, id, fresh, 0, None) + apply_repeating_rules_inner(&index, ast, id, fresh, 0, None) } -fn apply_rules_inner( +fn apply_repeating_rules_inner( index: &RuleIndex, ast: &mut Ast, id: Id, @@ -578,7 +744,7 @@ fn apply_rules_inner( let next_skip = if rule.repeated { None } else { Some(rule_ptr) }; let mut results = Vec::new(); for node in result_node { - results.extend(apply_rules_inner( + results.extend(apply_repeating_rules_inner( index, ast, node, @@ -603,7 +769,7 @@ fn apply_rules_inner( for children in fields.values_mut() { let mut new_children: Option> = None; for (i, &child_id) in children.iter().enumerate() { - let result = apply_rules_inner(index, ast, child_id, fresh, rewrite_depth, None)?; + let result = apply_repeating_rules_inner(index, ast, child_id, fresh, rewrite_depth, None)?; let unchanged = result.len() == 1 && result[0] == child_id; match (&mut new_children, unchanged) { (None, true) => {} // unchanged so far, no allocation needed @@ -628,6 +794,84 @@ fn apply_rules_inner( Ok(vec![id]) } +/// Apply rules using `OneShot` semantics: the first matching rule fires on +/// each visited node, recursion proceeds only through captured nodes (not +/// through the input node's children directly), and an error is returned if +/// no rule matches a visited node. +fn apply_one_shot_rules( + rules: &[Rule], + ast: &mut Ast, + id: Id, + fresh: &tree_builder::FreshScope, +) -> Result, String> { + let index = RuleIndex::new(rules); + apply_one_shot_rules_inner(&index, ast, id, fresh, 0) +} + +fn apply_one_shot_rules_inner( + index: &RuleIndex, + ast: &mut Ast, + id: Id, + fresh: &tree_builder::FreshScope, + rewrite_depth: usize, +) -> Result, String> { + + if rewrite_depth > MAX_REWRITE_DEPTH { + return Err(format!( + "Desugaring exceeded maximum rewrite depth ({MAX_REWRITE_DEPTH}). \ + This likely indicates a non-terminating rule cycle." + )); + } + + let node_kind = ast.get_node(id).map(|n| n.kind()).unwrap_or(""); + + // Don't rewrite unnamed nodes (punctuation, keywords, etc.); leave them + // as-is. Rules target named nodes only. + if let Some(node) = ast.get_node(id) { + if !node.is_named() { + return Ok(vec![id]); + } + } + + for rule in index.rules_for_kind(node_kind) { + if let Some(mut captures) = rule.try_match(ast, id)? { + // Recursively translate every captured node before invoking the + // transform. The transform's output uses output-schema kinds, so + // we must translate captured input-schema nodes to their + // output-schema equivalents first. + captures.try_map_all_captures(|captured_id| { + // Avoid infinite recursion when a capture refers to the root + // node of the matched tree (e.g. an `@_` capture on the + // pattern root): re-analyzing it would match the same rule + // again indefinitely. + if captured_id == id { + return Ok(vec![captured_id]); + } + apply_one_shot_rules_inner(index, ast, captured_id, fresh, rewrite_depth + 1) + })?; + return Ok(rule.run_transform(ast, captures, id, fresh)); + } + } + + Err(format!( + "OneShot: no rule matched node of kind '{node_kind}'" + )) +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum PhaseKind { + /// A node is re-processed until none of the rules in the phase matches, + /// albeit a single rule cannot be applied twice in a row unless that rule is also marked as repeating. + /// When a node no longer matches any rules, its children are recursively processed (top down). + Repeating, + + /// A node is processed by the first matching rule, and the engine panics if no rule matches. + /// Rules are then recursively applied to every captured node. + /// In practice this is used when translating from one AST schema to another, where every node must be rewritten, + /// and it would be a type error to match the rule patterns (based on the input schema) against the output nodes (which conform to the output schema). + OneShot, +} + /// One phase of a desugaring pass: a named bundle of rules that runs to /// completion (a full traversal applying its rules) before the next phase /// starts. Rules within a phase compete for matches as usual; rules in @@ -637,13 +881,15 @@ pub struct Phase { /// Name used in error messages. pub name: String, pub rules: Vec, + pub kind: PhaseKind, } impl Phase { - pub fn new(name: impl Into, rules: Vec) -> Self { + pub fn new(name: impl Into, kind: PhaseKind, rules: Vec) -> Self { Self { name: name.into(), rules, + kind, } } } @@ -661,8 +907,8 @@ impl Phase { /// /// ```ignore /// let config = yeast::DesugaringConfig::new() -/// .add_phase("cleanup", cleanup_rules) -/// .add_phase("desugar", desugar_rules) +/// .add_phase("cleanup", PhaseKind::Repeating, cleanup_rules) +/// .add_phase("desugar", PhaseKind::Repeating, desugar_rules) /// .with_output_node_types_yaml(yaml); /// ``` #[derive(Default)] @@ -682,9 +928,14 @@ impl DesugaringConfig { Self::default() } - /// Append a new phase with the given name and rules. - pub fn add_phase(mut self, name: impl Into, rules: Vec) -> Self { - self.phases.push(Phase::new(name, rules)); + /// Append a new phase with the given name, kind, and rules. + pub fn add_phase( + mut self, + name: impl Into, + kind: PhaseKind, + rules: Vec, + ) -> Self { + self.phases.push(Phase::new(name, kind, rules)); self } @@ -747,8 +998,17 @@ impl<'a> Runner<'a> { }) } - pub fn run_from_tree(&self, tree: &tree_sitter::Tree) -> Result { - let mut ast = Ast::from_tree_with_schema(self.schema.clone(), tree, &self.language); + pub fn run_from_tree( + &self, + tree: &tree_sitter::Tree, + source: &[u8], + ) -> Result { + let mut ast = Ast::from_tree_with_schema_and_source( + self.schema.clone(), + tree, + &self.language, + source.to_vec(), + ); self.run_phases(&mut ast)?; Ok(ast) } @@ -761,7 +1021,12 @@ impl<'a> Runner<'a> { let tree = parser .parse(input, None) .ok_or_else(|| "Failed to parse input".to_string())?; - let mut ast = Ast::from_tree_with_schema(self.schema.clone(), &tree, &self.language); + let mut ast = Ast::from_tree_with_schema_and_source( + self.schema.clone(), + &tree, + &self.language, + input.as_bytes().to_vec(), + ); self.run_phases(&mut ast)?; Ok(ast) } @@ -773,8 +1038,11 @@ impl<'a> Runner<'a> { let fresh = tree_builder::FreshScope::new(); let mut root = ast.get_root(); for phase in self.phases { - let res = apply_rules(&phase.rules, ast, root, &fresh) - .map_err(|e| format!("Phase `{}`: {e}", phase.name))?; + let res = match phase.kind { + PhaseKind::Repeating => apply_repeating_rules(&phase.rules, ast, root, &fresh), + PhaseKind::OneShot => apply_one_shot_rules(&phase.rules, ast, root, &fresh), + } + .map_err(|e| format!("Phase `{}`: {e}", phase.name))?; if res.len() != 1 { return Err(format!( "Phase `{}`: expected exactly one result node, got {}", diff --git a/shared/yeast/src/node_types_yaml.rs b/shared/yeast/src/node_types_yaml.rs index d321ba8a2cf0..797f14cba720 100644 --- a/shared/yeast/src/node_types_yaml.rs +++ b/shared/yeast/src/node_types_yaml.rs @@ -23,6 +23,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::fmt::Write; +use crate::CHILD_FIELD; use serde::Deserialize; use serde_json::json; @@ -100,32 +101,38 @@ fn parse_field_name(raw: &str) -> FieldSpec { /// Resolve a TypeRef to a (type, named) pair, given the sets of known named /// and unnamed types. -fn resolve_type_ref( +fn resolve_type_ref_pair( type_ref: &TypeRef, named_types: &BTreeSet, unnamed_types: &BTreeSet, -) -> serde_json::Value { +) -> (String, bool) { match type_ref { - TypeRef::Explicit { unnamed } => { - json!({"type": unnamed, "named": false}) - } + TypeRef::Explicit { unnamed } => (unnamed.clone(), false), TypeRef::Name(name) => { let is_named = named_types.contains(name); let is_unnamed = unnamed_types.contains(name); - if is_named && is_unnamed { - // Ambiguous: default to named - json!({"type": name, "named": true}) + (name.clone(), true) } else if is_unnamed { - json!({"type": name, "named": false}) + (name.clone(), false) } else { - // Named, or unknown (assume named) - json!({"type": name, "named": true}) + (name.clone(), true) } } } } +/// Resolve a TypeRef to a {type, named} JSON record, given the sets of known named +/// and unnamed types. +fn resolve_type_ref( + type_ref: &TypeRef, + named_types: &BTreeSet, + unnamed_types: &BTreeSet, +) -> serde_json::Value { + let (kind, named) = resolve_type_ref_pair(type_ref, named_types, unnamed_types); + json!({"type": kind, "named": named}) +} + /// Convert YAML string to node-types JSON string. pub fn convert(yaml_input: &str) -> Result { let yaml: YamlNodeTypes = @@ -233,14 +240,12 @@ pub fn convert(yaml_input: &str) -> Result { serde_json::to_string_pretty(&output).map_err(|e| format!("Failed to serialize JSON: {e}")) } -/// Build a Schema from a YAML node-types string. -/// Registers all node kinds and field names found in the YAML. -pub fn schema_from_yaml(yaml_input: &str) -> Result { - let yaml: YamlNodeTypes = - serde_yaml::from_str(yaml_input).map_err(|e| format!("Failed to parse YAML: {e}"))?; - - let mut schema = crate::schema::Schema::new(); - +/// Apply YAML node-type definitions to a mutable Schema. +/// Registers all types, fields, and allowed types from the YAML into the schema. +fn apply_yaml_to_schema( + yaml: &YamlNodeTypes, + schema: &mut crate::schema::Schema, +) { // Register all supertypes as node kinds for name in yaml.supertypes.keys() { schema.register_kind(name); @@ -264,6 +269,70 @@ pub fn schema_from_yaml(yaml_input: &str) -> Result = yaml.unnamed.iter().cloned().collect(); + + for (supertype, members) in &yaml.supertypes { + let node_types = members + .iter() + .map(|m| { + let (kind, named) = resolve_type_ref_pair(m, &named_types, &unnamed_types); + crate::schema::NodeType { kind, named } + }) + .collect(); + schema.set_supertype_members(supertype, node_types); + } + + // Register allowed field child types for type checking. + for (parent_kind, fields_opt) in &yaml.named { + let Some(fields) = fields_opt else { + continue; + }; + + for (raw_field_name, type_refs) in fields { + let spec = parse_field_name(raw_field_name); + let field_id = match &spec.name { + Some(name) => schema.register_field(name), + None => CHILD_FIELD, + }; + + let mut node_types = type_refs + .clone() + .into_vec() + .into_iter() + .map(|type_ref| { + let (kind, named) = resolve_type_ref_pair(&type_ref, &named_types, &unnamed_types); + crate::schema::NodeType { kind, named } + }) + .collect::>(); + node_types.sort_by(|a, b| a.kind.cmp(&b.kind).then(a.named.cmp(&b.named))); + node_types.dedup_by(|a, b| a.kind == b.kind && a.named == b.named); + schema.set_field_types(parent_kind, field_id, node_types); + schema.set_field_cardinality( + parent_kind, + field_id, + crate::schema::FieldCardinality { + multiple: spec.multiple, + required: spec.required, + }, + ); + } + } +} + +pub fn schema_from_yaml(yaml_input: &str) -> Result { + let yaml: YamlNodeTypes = + serde_yaml::from_str(yaml_input).map_err(|e| format!("Failed to parse YAML: {e}"))?; + + let mut schema = crate::schema::Schema::new(); + apply_yaml_to_schema(&yaml, &mut schema); + Ok(schema) } @@ -278,29 +347,7 @@ pub fn schema_from_yaml_with_language( serde_yaml::from_str(yaml_input).map_err(|e| format!("Failed to parse YAML: {e}"))?; let mut schema = crate::schema::Schema::from_language(language); - - // Register supertypes - for name in yaml.supertypes.keys() { - schema.register_kind(name); - } - - // Register named node kinds and their fields - for (name, fields_opt) in &yaml.named { - schema.register_kind(name); - if let Some(fields) = fields_opt { - for raw_field_name in fields.keys() { - let spec = parse_field_name(raw_field_name); - if let Some(field_name) = &spec.name { - schema.register_field(field_name); - } - } - } - } - - // Register unnamed tokens - for name in &yaml.unnamed { - schema.register_unnamed_kind(name); - } + apply_yaml_to_schema(&yaml, &mut schema); Ok(schema) } diff --git a/shared/yeast/src/query.rs b/shared/yeast/src/query.rs index 01e5e22ad730..bcf0f7facab1 100644 --- a/shared/yeast/src/query.rs +++ b/shared/yeast/src/query.rs @@ -178,11 +178,15 @@ impl QueryListElem { let Some(child) = remaining_children.next() else { return Ok(false); }; - if skip_unnamed { - let node = ast.get_node(child).unwrap(); - if !node.is_named() { - continue; - } + let node = ast.get_node(child).unwrap(); + // Skip tree-sitter `extras` (e.g. comments) during + // positional matching: they are conceptually invisible + // between siblings, mirroring tree-sitter query semantics. + if node.is_extra() { + continue; + } + if skip_unnamed && !node.is_named() { + continue; } let snapshot = matches.clone(); if sub_query.do_match(ast, child, matches)? { diff --git a/shared/yeast/src/schema.rs b/shared/yeast/src/schema.rs index 12554d9c8692..bbd425f15a2c 100644 --- a/shared/yeast/src/schema.rs +++ b/shared/yeast/src/schema.rs @@ -1,7 +1,22 @@ -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use crate::{FieldId, KindId, CHILD_FIELD}; +#[derive(Clone, Debug)] +pub struct NodeType { + pub kind: String, + pub named: bool, +} + +/// Multiplicity/optionality of a field declaration. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct FieldCardinality { + /// Whether the field may hold more than one child. + pub multiple: bool, + /// Whether at least one child must be present. + pub required: bool, +} + /// A schema defining node kinds and field names for the output AST. /// Built from a node-types.yml file, independent of any tree-sitter grammar. /// @@ -25,6 +40,9 @@ pub struct Schema { unnamed_kind_ids: BTreeMap, kind_names: BTreeMap, next_kind_id: KindId, + field_types: BTreeMap<(String, FieldId), Vec>, + field_cardinalities: BTreeMap<(String, FieldId), FieldCardinality>, + supertypes: BTreeMap>, } impl Default for Schema { @@ -43,6 +61,9 @@ impl Schema { unnamed_kind_ids: BTreeMap::new(), kind_names: BTreeMap::new(), next_kind_id: 1, // 0 is reserved + field_types: BTreeMap::new(), + field_cardinalities: BTreeMap::new(), + supertypes: BTreeMap::new(), } } @@ -166,4 +187,104 @@ impl Schema { pub fn node_kind_for_id(&self, id: KindId) -> Option<&'static str> { self.kind_names.get(&id).copied() } + + pub fn set_field_types( + &mut self, + parent_kind: &str, + field_id: FieldId, + node_types: Vec, + ) { + self.field_types + .insert((parent_kind.to_string(), field_id), node_types); + } + + pub fn field_types( + &self, + parent_kind: &str, + field_id: FieldId, + ) -> Option<&Vec> { + self.field_types + .get(&(parent_kind.to_string(), field_id)) + } + + pub fn set_field_cardinality( + &mut self, + parent_kind: &str, + field_id: FieldId, + cardinality: FieldCardinality, + ) { + self.field_cardinalities + .insert((parent_kind.to_string(), field_id), cardinality); + } + + /// Returns the declared cardinality for a field, if known. + pub fn field_cardinality( + &self, + parent_kind: &str, + field_id: FieldId, + ) -> Option { + self.field_cardinalities + .get(&(parent_kind.to_string(), field_id)) + .copied() + } + + /// Returns an iterator over all `(field_id, field_name)` pairs that are + /// declared as required (`required: true`) for the given `parent_kind`. + pub fn required_fields_for_kind<'a>( + &'a self, + parent_kind: &'a str, + ) -> impl Iterator)> + 'a { + self.field_cardinalities + .iter() + .filter(move |((kind, _), card)| kind == parent_kind && card.required) + .map(move |((_, field_id), _)| { + let name = self.field_name_for_id(*field_id); + (*field_id, name) + }) + } + + pub fn set_supertype_members(&mut self, supertype: &str, node_types: Vec) { + self.supertypes.insert(supertype.to_string(), node_types); + } + + fn allows_node( + &self, + node_type: &NodeType, + node_kind: &str, + node_named: bool, + active: &mut BTreeSet, + ) -> bool { + if node_type.kind == node_kind && node_type.named == node_named { + return true; + } + + if !node_type.named { + return false; + } + + let Some(members) = self.supertypes.get(&node_type.kind) else { + return false; + }; + + if !active.insert(node_type.kind.clone()) { + return false; + } + + let matched = members + .iter() + .any(|member| self.allows_node(member, node_kind, node_named, active)); + active.remove(&node_type.kind); + matched + } + + pub fn node_matches_types( + &self, + node_kind: &str, + node_named: bool, + node_types: &[NodeType], + ) -> bool { + node_types.iter().any(|node_type| { + self.allows_node(node_type, node_kind, node_named, &mut BTreeSet::new()) + }) + } } diff --git a/shared/yeast/src/visitor.rs b/shared/yeast/src/visitor.rs index 1b9c5eab3627..4bd2606c958b 100644 --- a/shared/yeast/src/visitor.rs +++ b/shared/yeast/src/visitor.rs @@ -52,6 +52,7 @@ impl Visitor { root: 0, schema, nodes: self.nodes.into_iter().map(|n| n.inner).collect(), + source: Vec::new(), } } diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs index ed4202493a46..7645f3776f87 100644 --- a/shared/yeast/tests/test.rs +++ b/shared/yeast/tests/test.rs @@ -1,6 +1,6 @@ #![cfg(test)] -use yeast::dump::dump_ast; +use yeast::dump::{dump_ast, dump_ast_with_type_errors}; use yeast::*; const OUTPUT_SCHEMA_YAML: &str = include_str!("node-types.yml"); @@ -15,7 +15,7 @@ fn parse_and_dump(input: &str) -> String { /// Helper: parse Ruby source with a custom output schema and a single /// phase of rules, return dump. fn run_and_dump(input: &str, rules: Vec) -> String { - run_phased_and_dump(input, vec![Phase::new("test", rules)]) + run_phased_and_dump(input, vec![Phase::new("test", PhaseKind::Repeating, rules)]) } /// Helper: parse Ruby source with a custom output schema and multiple @@ -35,13 +35,42 @@ fn run_and_get_error(input: &str, rules: Vec) -> String { let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); let schema = yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); - let phases = vec![Phase::new("test", rules)]; + let phases = vec![Phase::new("test", PhaseKind::Repeating, rules)]; let runner = Runner::with_schema(lang, &schema, &phases); runner .run(input) .expect_err("expected runner to return an error") } +/// Helper: parse Ruby source with no rules and dump with schema type errors. +fn parse_and_dump_typed(input: &str, schema_yaml: &str) -> String { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run(input).unwrap(); + let schema = yeast::node_types_yaml::schema_from_yaml(schema_yaml).unwrap(); + dump_ast_with_type_errors(&ast, ast.get_root(), input, &schema) +} + +/// Helper: parse Ruby source with no rules and dump with schema type errors, +/// building schema with language IDs so field checks align with parser fields. +fn parse_and_dump_typed_with_language(input: &str, schema_yaml: &str) -> String { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let runner = Runner::new(lang.clone(), &[]); + let ast = runner.run(input).unwrap(); + let schema = yeast::node_types_yaml::schema_from_yaml_with_language(schema_yaml, &lang) + .unwrap(); + dump_ast_with_type_errors(&ast, ast.get_root(), input, &schema) +} + +/// Helper: parse Ruby source with custom rules and dump with schema type errors. +fn run_and_dump_typed(input: &str, rules: Vec, schema_yaml: &str) -> String { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = yeast::node_types_yaml::schema_from_yaml(schema_yaml).unwrap(); + let phases = vec![Phase::new("test", PhaseKind::Repeating, rules)]; + let runner = Runner::with_schema(lang, &schema, &phases); + let ast = runner.run(input).unwrap(); + dump_ast_with_type_errors(&ast, ast.get_root(), input, &schema) +} + /// Assert that a dump equals the expected string, treating the expected /// string as an indented multiline literal: leading/trailing blank lines /// are stripped, and the common leading indentation is removed from every @@ -125,6 +154,85 @@ fn test_parse_for_loop() { ); } +#[test] +fn test_dump_highlights_type_errors_inline() { + let schema_yaml = r#" +named: + program: + $children*: assignment + assignment: + left: identifier + right: identifier + identifier: +"#; + + let dump = parse_and_dump_typed("x = 1", schema_yaml); + assert!(dump.contains("integer \"1\" <-- ERROR:")); +} + +#[test] +fn test_dump_reports_preserved_unknown_kind_after_transformation() { + let schema_yaml = r#" +named: + program: + $children*: assignment + assignment: + left: identifier + right: identifier + identifier: +"#; + + // This rewrite runs and preserves the RHS node kind via capture. + // With schema above, preserving `integer` should be reported inline. + let rules = vec![yeast::rule!( + (assignment left: (_) @left right: (_) @right) + => + (assignment + left: {left} + right: {right} + ) + )]; + + let dump = run_and_dump_typed("x = 1", rules, schema_yaml); + assert!(dump.contains("integer \"1\" <-- ERROR:")); + assert!(dump.contains("node kind 'integer' not in schema")); +} + +#[test] +fn test_dump_reports_undeclared_field_on_node() { + let schema_yaml = r#" +named: + program: + $children*: assignment + assignment: + left: identifier + identifier: +"#; + + let dump = parse_and_dump_typed_with_language("x = y", schema_yaml); + assert!(dump.contains("right: identifier \"y\" <-- ERROR:")); + assert!(dump.contains("the node 'assignment' has no field 'right'")); +} + +#[test] +fn test_dump_reports_disallowed_kind_in_field_type() { + let schema_yaml = r#" +named: + program: + $children*: assignment + assignment: + left: identifier + right: identifier + identifier: + integer: +"#; + + let dump = parse_and_dump_typed_with_language("x = 1", schema_yaml); + assert!(dump.contains("right: integer \"1\" <-- ERROR:")); + assert!(dump.contains("should contain")); + assert!(dump.contains("but got integer")); +} + // ---- Query tests ---- #[test] @@ -166,6 +274,70 @@ fn test_query_no_match() { assert!(!matched); } +#[test] +fn test_query_skips_extras_in_positional_match() { + // Regression test: positional wildcards `(_)` must not bind to + // tree-sitter `extras` (e.g. comments) during forward-scan; extras + // are conceptually invisible between siblings, matching tree-sitter + // query semantics. Without this, a later rule that translates a + // captured comment to nothing (a common idiom, e.g. + // `(comment) => ()` in Swift) leaves the capture's match-list empty + // and causes the transform to fail with "Variable X has 0 matches". + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("[1, # comment\n2]").unwrap(); + + // Navigate to the `array` node: program -> array. + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + let array_id = cursor.node_id(); + assert_eq!(ast.get_node(array_id).unwrap().kind(), "array"); + + // Two positional wildcards should bind to the two integers, skipping + // the comment that sits between them. + let query = yeast::query!((array (_) @a (_) @b)); + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, array_id, &mut captures).unwrap(); + assert!(matched); + assert_eq!( + ast.get_node(captures.get_var("a").unwrap()) + .unwrap() + .kind(), + "integer" + ); + assert_eq!( + ast.get_node(captures.get_var("b").unwrap()) + .unwrap() + .kind(), + "integer" + ); +} + +#[test] +fn test_reachable_nodes_excludes_orphaned_rewrite_nodes() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang) + .unwrap(); + let phases = vec![Phase::new( + "test", + PhaseKind::Repeating, + vec![yeast::rule!((integer) => (identifier "replaced"))], + )]; + let runner = Runner::with_schema(lang, &schema, &phases); + + let input = "x = 1"; + let ast = runner.run(input).unwrap(); + let reachable_ids = ast.reachable_node_ids(); + + assert!( + ast.nodes().len() > reachable_ids.len(), + "expected rewrite to leave orphaned arena nodes" + ); + + let dump = dump_ast(&ast, ast.get_root(), input); + assert!(dump.contains("identifier \"replaced\"")); + assert!(!dump.contains("integer \"1\"")); +} + #[test] fn test_query_repeated_capture() { let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); @@ -653,8 +825,8 @@ fn test_phased_desugaring() { let dump = run_phased_and_dump( "x = 1", vec![ - Phase::new("cleanup", cleanup), - Phase::new("desugar", desugar), + Phase::new("cleanup", PhaseKind::Repeating, cleanup), + Phase::new("desugar", PhaseKind::Repeating, desugar), ], ); assert_dump_eq( @@ -675,7 +847,11 @@ fn test_phase_error_includes_phase_name() { let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); let schema = yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); - let phases = vec![Phase::new("buggy", vec![swap_assignment_rule().repeated()])]; + let phases = vec![Phase::new( + "buggy", + PhaseKind::Repeating, + vec![swap_assignment_rule().repeated()], + )]; let runner = Runner::with_schema(lang, &schema, &phases); let err = runner .run("x = 1") @@ -690,6 +866,168 @@ fn test_phase_error_includes_phase_name() { ); } +/// Helper: an exhaustive set of OneShot rules covering every node reachable +/// (via captures) when translating `"x = 1"`. +fn one_shot_xeq1_rules() -> Vec { + vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {..stmts}) + ), + yeast::rule!( + (assignment left: (_) @left right: (_) @right) + => + (first_node left: {left} right: {right}) + ), + yeast::rule!((identifier) => (identifier "ID")), + yeast::rule!((integer) => (integer "INT")), + ] +} + +#[test] +fn test_one_shot_phase() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let phases = vec![Phase::new( + "translate", + PhaseKind::OneShot, + one_shot_xeq1_rules(), + )]; + let runner = Runner::with_schema(lang, &schema, &phases); + + let input = "x = 1"; + let ast = runner.run(input).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + assert_dump_eq( + &dump, + r#" + program + stmt: + first_node + left: identifier "ID" + right: integer "INT" + "#, + ); +} + +#[test] +fn test_one_shot_phase_errors_when_no_rule_matches() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + // Drop the `integer` rule so the recursion has no rule for `integer`. + let mut rules = one_shot_xeq1_rules(); + rules.pop(); + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner = Runner::with_schema(lang, &schema, &phases); + + let err = runner + .run("x = 1") + .expect_err("expected OneShot to error on unmatched node"); + assert!( + err.contains("Phase `translate`"), + "error should name the phase, got: {err}" + ); + assert!( + err.contains("no rule matched") && err.contains("integer"), + "error should describe the unmatched node kind, got: {err}" + ); +} + +/// OneShot recursion must apply rules to *captured* nodes, even if the rule +/// returns a captured child verbatim. A buggy implementation that only +/// recurses into the children of the rule's output (rather than into the +/// captures) would leave the returned capture untransformed. +#[test] +fn test_one_shot_recurses_into_returned_capture() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let rules = vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {..stmts}) + ), + // Returns the captured `left` verbatim, discarding `right`. + yeast::rule!( + (assignment left: (_) @left right: (_) @right) + => + {left} + ), + yeast::rule!((identifier) => (identifier "ID")), + yeast::rule!((integer) => (integer "INT")), + ]; + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner = Runner::with_schema(lang, &schema, &phases); + + let input = "x = 1"; + let ast = runner.run(input).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + // `left` is an `identifier`; OneShot must apply the identifier rule to + // it before the assignment transform returns it verbatim. + assert_dump_eq( + &dump, + r#" + program + stmt: identifier "ID" + "#, + ); +} + +/// OneShot recursion must NOT descend into the children of the rule's output. +/// A rule may legitimately wrap a captured node in fresh output-schema nodes +/// that have no matching rule of their own (since rule patterns target the +/// input schema). Recursing into the output would erroneously try to find +/// rules for those wrapper kinds and fail. +#[test] +fn test_one_shot_does_not_recurse_into_wrapper_output() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let rules = vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {..stmts}) + ), + // Wraps `left` in nested `first_node`/`second_node` output kinds. + // Neither wrapper kind has a matching rule, so a buggy implementation + // that recurses into the wrapper's children would error. + yeast::rule!( + (assignment left: (_) @left right: (_) @right) + => + (first_node + left: (second_node left: {left} right: {right}) + right: {left} + ) + ), + yeast::rule!((identifier) => (identifier "ID")), + yeast::rule!((integer) => (integer "INT")), + ]; + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner = Runner::with_schema(lang, &schema, &phases); + + let input = "x = 1"; + let ast = runner.run(input).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + assert_dump_eq( + &dump, + r#" + program + stmt: + first_node + left: + second_node + left: identifier "ID" + right: integer "INT" + right: identifier "ID" + "#, + ); +} + // ---- Cursor tests ---- #[test] @@ -760,3 +1098,54 @@ fn test_desugar_for_with_multiple_assignment() { "#, ); } + +/// Regression test: `#{capture}` in a template must render the *source text* +/// of the captured node, not its arena `Id`. Previously, captures were bound +/// as `usize`, so `#{cap}` printed the integer id (e.g. `"3"`) via `Display`. +/// Captures are now bound as `NodeRef`, which has no `Display` impl and +/// resolves to the captured node's source text via `YeastDisplay`. +#[test] +fn test_hash_brace_renders_capture_source_text() { + let rule = rule!( + (call + method: (identifier) @name + receiver: (identifier) @recv + ) + => + (call + method: (identifier #{name}) + receiver: (identifier #{recv}) + arguments: (argument_list) + ) + ); + let dump = run_and_dump("foo.bar()", vec![rule]); + assert_dump_eq( + &dump, + r#" + program + call + arguments: argument_list "foo.bar()" + method: identifier "bar" + receiver: identifier "foo" + "#, + ); +} + +/// Regression test: non-`NodeRef` values in `#{expr}` still render via their +/// `Display` impl (covered by `YeastDisplay`'s blanket impls for primitives). +#[test] +fn test_hash_brace_renders_integer_expression() { + let rule = rule!( + (identifier) @_ + => + (identifier #{1 + 2}) + ); + let dump = run_and_dump("foo", vec![rule]); + assert_dump_eq( + &dump, + r#" + program + identifier "3" + "#, + ); +} diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index 01461fd5bfeb..1eb5afb48e74 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 6.7.0 + +### Major Analysis Improvements + +* Upgraded to allow analysis of Swift 6.3.2. + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `swift/cleartext-logging`) may find more correct results and fewer false positive results after these changes. + ## 6.6.0 ### New Features diff --git a/swift/ql/lib/change-notes/released/6.7.0.md b/swift/ql/lib/change-notes/released/6.7.0.md new file mode 100644 index 000000000000..8d7bf41cc1df --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.7.0.md @@ -0,0 +1,9 @@ +## 6.7.0 + +### Major Analysis Improvements + +* Upgraded to allow analysis of Swift 6.3.2. + +### Minor Analysis Improvements + +* The sensitive data heuristics used to identify code that handles passwords and private data have been improved. Most of the changes permit more variations of established patterns, thereby finding more sensitive data. Queries that use the sensitive data library (for example `swift/cleartext-logging`) may find more correct results and fewer false positive results after these changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 4d7f31f2d8e2..55a13d309e55 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.6.0 +lastReleaseVersion: 6.7.0 diff --git a/swift/ql/lib/codeql/swift/security/WeakPasswordHashingExtensions.qll b/swift/ql/lib/codeql/swift/security/WeakPasswordHashingExtensions.qll index 76ae9c21dab3..1700c5dc60e8 100644 --- a/swift/ql/lib/codeql/swift/security/WeakPasswordHashingExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/WeakPasswordHashingExtensions.qll @@ -54,12 +54,15 @@ private class WeakSensitiveDataHashingSinks extends SinkModelCsv { // CryptoKit // (SHA-256, SHA-384 and SHA-512 are all variants of the SHA-2 algorithm) ";SHA256;true;hash(data:);;;Argument[0];weak-password-hash-input-SHA256", + ";SHA256;true;hash(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA256", ";SHA256;true;update(data:);;;Argument[0];weak-password-hash-input-SHA256", ";SHA256;true;update(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA256", ";SHA384;true;hash(data:);;;Argument[0];weak-password-hash-input-SHA384", + ";SHA384;true;hash(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA384", ";SHA384;true;update(data:);;;Argument[0];weak-password-hash-input-SHA384", ";SHA384;true;update(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA384", ";SHA512;true;hash(data:);;;Argument[0];weak-password-hash-input-SHA512", + ";SHA512;true;hash(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA512", ";SHA512;true;update(data:);;;Argument[0];weak-password-hash-input-SHA512", ";SHA512;true;update(bufferPointer:);;;Argument[0];weak-password-hash-input-SHA512", // CryptoSwift @@ -111,6 +114,36 @@ private class DefaultWeakPasswordHashingSink extends WeakPasswordHashingSink { override string getAlgorithm() { result = algorithm } } +/** + * A sink for weak password hashing through a call with a metatype qualifier. + */ +private class WeakPasswordHashingMetatypeSink extends WeakPasswordHashingSink { + string algorithm; + + WeakPasswordHashingMetatypeSink() { + exists(CallExpr ce, Type t | + // call target + ce.getStaticTarget().getName() = + ["hash(data:)", "hash(bufferPointer:)", "update(data:)", "update(bufferPointer:)"] and + // argument + ce.getAnArgument().getExpr() = this.asExpr() and + // qualifier + t = ce.getQualifier().getType() and + algorithm = ["SHA256", "SHA384", "SHA512"] and + ( + t.getFullName() = algorithm + or + exists(TypeDecl td | + td.getInterfaceType() = t and + td.getFullName() = algorithm + ) + ) + ) + } + + override string getAlgorithm() { result = algorithm } +} + /** * A barrier for weak password hashing, when it occurs inside of * certain cryptographic algorithms as part of their design. diff --git a/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll b/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll index 5f0cc9d756a0..02cb82a22c89 100755 --- a/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/WeakSensitiveDataHashingExtensions.qll @@ -40,9 +40,11 @@ private class WeakSensitiveDataHashingSinks extends SinkModelCsv { [ // CryptoKit ";Insecure.MD5;true;hash(data:);;;Argument[0];weak-hash-input-MD5", + ";Insecure.MD5;true;hash(bufferPointer:);;;Argument[0];weak-hash-input-MD5", ";Insecure.MD5;true;update(data:);;;Argument[0];weak-hash-input-MD5", ";Insecure.MD5;true;update(bufferPointer:);;;Argument[0];weak-hash-input-MD5", ";Insecure.SHA1;true;hash(data:);;;Argument[0];weak-hash-input-SHA1", + ";Insecure.SHA1;true;hash(bufferPointer:);;;Argument[0];weak-hash-input-SHA1", ";Insecure.SHA1;true;update(data:);;;Argument[0];weak-hash-input-SHA1", ";Insecure.SHA1;true;update(bufferPointer:);;;Argument[0];weak-hash-input-SHA1", // CryptoSwift @@ -69,10 +71,40 @@ private class WeakSensitiveDataHashingSinks extends SinkModelCsv { /** * A sink defined in a CSV model. */ -private class DefaultWeakSenitiveDataHashingSink extends WeakSensitiveDataHashingSink { +private class DefaultWeakSensitiveDataHashingSink extends WeakSensitiveDataHashingSink { string algorithm; - DefaultWeakSenitiveDataHashingSink() { sinkNode(this, "weak-hash-input-" + algorithm) } + DefaultWeakSensitiveDataHashingSink() { sinkNode(this, "weak-hash-input-" + algorithm) } + + override string getAlgorithm() { result = algorithm } +} + +/** + * A sink for weak sensitive data hashing through a call with a metatype qualifier. + */ +private class WeakSensitiveDataHashingMetatypeSink extends WeakSensitiveDataHashingSink { + string algorithm; + + WeakSensitiveDataHashingMetatypeSink() { + exists(CallExpr ce, Type t | + // call target + ce.getStaticTarget().getName() = + ["hash(data:)", "hash(bufferPointer:)", "update(data:)", "update(bufferPointer:)"] and + // argument + ce.getAnArgument().getExpr() = this.asExpr() and + // qualifier + t = ce.getQualifier().getType() and + algorithm = ["MD5", "SHA1"] and + ( + t.getFullName() = "Insecure." + algorithm + or + exists(TypeDecl td | + td.getInterfaceType() = t and + td.getFullName() = "Insecure." + algorithm + ) + ) + ) + } override string getAlgorithm() { result = algorithm } } diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index e1d436bb7f6a..960d679e6d91 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.6.0 +version: 6.7.1-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 4bd8088718a6..4e3b53c37b32 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.4 + +No user-facing changes. + ## 1.3.3 No user-facing changes. diff --git a/swift/ql/src/change-notes/2026-05-26-hashing-sinks.md b/swift/ql/src/change-notes/2026-05-26-hashing-sinks.md new file mode 100644 index 000000000000..92a2c1c3a064 --- /dev/null +++ b/swift/ql/src/change-notes/2026-05-26-hashing-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed an issue where common usage patterns for `CryptoKit` weren't being recognized as hashing sinks for the `swift/weak-sensitive-data-hashing` and `swift/weak-password-hashing` queries. These queries may find additional results after this change. diff --git a/swift/ql/src/change-notes/released/1.3.4.md b/swift/ql/src/change-notes/released/1.3.4.md new file mode 100644 index 000000000000..5073aca7222c --- /dev/null +++ b/swift/ql/src/change-notes/released/1.3.4.md @@ -0,0 +1,3 @@ +## 1.3.4 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index eb1f7dabc842..8263ddf2c8b8 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.3 +lastReleaseVersion: 1.3.4 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index e3e90856f70a..578456c089aa 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.3 +version: 1.3.5-dev groups: - swift - queries diff --git a/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected b/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected index c772466344ae..7665b72b11a6 100644 --- a/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected +++ b/swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected @@ -64,6 +64,7 @@ nodes | testSend.swift:78:27:78:30 | .CarePlanID | semmle.label | .CarePlanID | | testSend.swift:79:27:79:30 | .BankCardNo | semmle.label | .BankCardNo | | testSend.swift:80:27:80:30 | .MyCreditRating | semmle.label | .MyCreditRating | +| testSend.swift:81:27:81:30 | .OneTimeCode | semmle.label | .OneTimeCode | | testSend.swift:86:7:86:7 | self | semmle.label | self | | testSend.swift:94:27:94:30 | .password | semmle.label | .password | | testSend.swift:94:27:94:39 | .value | semmle.label | .value | @@ -118,6 +119,7 @@ subpaths | testSend.swift:78:27:78:30 | .CarePlanID | testSend.swift:78:27:78:30 | .CarePlanID | testSend.swift:78:27:78:30 | .CarePlanID | This operation transmits '.CarePlanID', which may contain unencrypted sensitive data from $@. | testSend.swift:78:27:78:30 | .CarePlanID | .CarePlanID | | testSend.swift:79:27:79:30 | .BankCardNo | testSend.swift:79:27:79:30 | .BankCardNo | testSend.swift:79:27:79:30 | .BankCardNo | This operation transmits '.BankCardNo', which may contain unencrypted sensitive data from $@. | testSend.swift:79:27:79:30 | .BankCardNo | .BankCardNo | | testSend.swift:80:27:80:30 | .MyCreditRating | testSend.swift:80:27:80:30 | .MyCreditRating | testSend.swift:80:27:80:30 | .MyCreditRating | This operation transmits '.MyCreditRating', which may contain unencrypted sensitive data from $@. | testSend.swift:80:27:80:30 | .MyCreditRating | .MyCreditRating | +| testSend.swift:81:27:81:30 | .OneTimeCode | testSend.swift:81:27:81:30 | .OneTimeCode | testSend.swift:81:27:81:30 | .OneTimeCode | This operation transmits '.OneTimeCode', which may contain unencrypted sensitive data from $@. | testSend.swift:81:27:81:30 | .OneTimeCode | .OneTimeCode | | testSend.swift:94:27:94:39 | .value | testSend.swift:94:27:94:30 | .password | testSend.swift:94:27:94:39 | .value | This operation transmits '.value', which may contain unencrypted sensitive data from $@. | testSend.swift:94:27:94:30 | .password | .password | | testURL.swift:39:18:39:50 | ... .+(_:_:) ... | testURL.swift:39:50:39:50 | passwd | testURL.swift:39:18:39:50 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:39:50:39:50 | passwd | passwd | | testURL.swift:41:18:41:51 | ... .+(_:_:) ... | testURL.swift:41:51:41:51 | account_no | testURL.swift:41:18:41:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:41:51:41:51 | account_no | account_no | diff --git a/swift/ql/test/query-tests/Security/CWE-311/SensitiveExprs.expected b/swift/ql/test/query-tests/Security/CWE-311/SensitiveExprs.expected index c4ff7f42b2e1..62fc29a9a582 100644 --- a/swift/ql/test/query-tests/Security/CWE-311/SensitiveExprs.expected +++ b/swift/ql/test/query-tests/Security/CWE-311/SensitiveExprs.expected @@ -170,6 +170,7 @@ | testSend.swift:78:27:78:30 | .CarePlanID | label:CarePlanID, type:private information | | testSend.swift:79:27:79:30 | .BankCardNo | label:BankCardNo, type:private information | | testSend.swift:80:27:80:30 | .MyCreditRating | label:MyCreditRating, type:private information | +| testSend.swift:81:27:81:30 | .OneTimeCode | label:OneTimeCode, type:credential | | testSend.swift:94:27:94:30 | .password | label:password, type:password | | testURL.swift:39:50:39:50 | passwd | label:passwd, type:password | | testURL.swift:41:51:41:51 | account_no | label:account_no, type:private information | diff --git a/swift/ql/test/query-tests/Security/CWE-311/testSend.swift b/swift/ql/test/query-tests/Security/CWE-311/testSend.swift index 8acb83e51c19..bea4dfa16b63 100644 --- a/swift/ql/test/query-tests/Security/CWE-311/testSend.swift +++ b/swift/ql/test/query-tests/Security/CWE-311/testSend.swift @@ -78,7 +78,7 @@ func test2(password : String, license_key: String, ms: MyStruct, connection : NW connection.send(content: ms.CarePlanID, completion: .idempotent) // BAD connection.send(content: ms.BankCardNo, completion: .idempotent) // BAD connection.send(content: ms.MyCreditRating, completion: .idempotent) // BAD - connection.send(content: ms.OneTimeCode, completion: .idempotent) // BAD [NOT DETECTED] + connection.send(content: ms.OneTimeCode, completion: .idempotent) // BAD } struct MyOuter { diff --git a/swift/ql/test/query-tests/Security/CWE-328/WeakPasswordHashing.expected b/swift/ql/test/query-tests/Security/CWE-328/WeakPasswordHashing.expected index 46f3d211ccd7..273f26164fd7 100644 --- a/swift/ql/test/query-tests/Security/CWE-328/WeakPasswordHashing.expected +++ b/swift/ql/test/query-tests/Security/CWE-328/WeakPasswordHashing.expected @@ -1,26 +1,33 @@ edges -| testCryptoKit.swift:193:38:193:38 | passwordString | testCryptoKit.swift:193:38:193:53 | .utf8 | provenance | | -| testCryptoKit.swift:193:38:193:53 | .utf8 | testCryptoKit.swift:193:33:193:57 | call to Data.init(_:) | provenance | | +| testCryptoKit.swift:224:38:224:38 | passwordString | testCryptoKit.swift:224:38:224:53 | .utf8 | provenance | | +| testCryptoKit.swift:224:38:224:53 | .utf8 | testCryptoKit.swift:224:33:224:57 | call to Data.init(_:) | provenance | | nodes -| testCryptoKit.swift:65:47:65:47 | passwd | semmle.label | passwd | -| testCryptoKit.swift:71:44:71:44 | passwd | semmle.label | passwd | -| testCryptoKit.swift:77:37:77:37 | passwd | semmle.label | passwd | -| testCryptoKit.swift:83:37:83:37 | passwd | semmle.label | passwd | -| testCryptoKit.swift:89:37:89:37 | passwd | semmle.label | passwd | -| testCryptoKit.swift:98:23:98:23 | passwd | semmle.label | passwd | -| testCryptoKit.swift:107:23:107:23 | passwd | semmle.label | passwd | -| testCryptoKit.swift:116:23:116:23 | passwd | semmle.label | passwd | -| testCryptoKit.swift:125:23:125:23 | passwd | semmle.label | passwd | -| testCryptoKit.swift:134:23:134:23 | passwd | semmle.label | passwd | -| testCryptoKit.swift:143:32:143:32 | passwd | semmle.label | passwd | -| testCryptoKit.swift:152:32:152:32 | passwd | semmle.label | passwd | -| testCryptoKit.swift:161:32:161:32 | passwd | semmle.label | passwd | -| testCryptoKit.swift:170:32:170:32 | passwd | semmle.label | passwd | -| testCryptoKit.swift:179:32:179:32 | passwd | semmle.label | passwd | -| testCryptoKit.swift:189:49:189:49 | passwordData | semmle.label | passwordData | -| testCryptoKit.swift:193:33:193:57 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | -| testCryptoKit.swift:193:38:193:38 | passwordString | semmle.label | passwordString | -| testCryptoKit.swift:193:38:193:53 | .utf8 | semmle.label | .utf8 | +| testCryptoKit.swift:84:47:84:47 | passwd | semmle.label | passwd | +| testCryptoKit.swift:85:52:85:52 | passwd | semmle.label | passwd | +| testCryptoKit.swift:91:36:91:36 | passwd | semmle.label | passwd | +| testCryptoKit.swift:92:45:92:45 | passwd | semmle.label | passwd | +| testCryptoKit.swift:98:44:98:44 | passwd | semmle.label | passwd | +| testCryptoKit.swift:99:53:99:53 | passwd | semmle.label | passwd | +| testCryptoKit.swift:105:37:105:37 | passwd | semmle.label | passwd | +| testCryptoKit.swift:106:46:106:46 | passwd | semmle.label | passwd | +| testCryptoKit.swift:112:37:112:37 | passwd | semmle.label | passwd | +| testCryptoKit.swift:113:46:113:46 | passwd | semmle.label | passwd | +| testCryptoKit.swift:119:37:119:37 | passwd | semmle.label | passwd | +| testCryptoKit.swift:120:46:120:46 | passwd | semmle.label | passwd | +| testCryptoKit.swift:129:23:129:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:138:23:138:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:147:23:147:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:156:23:156:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:165:23:165:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:174:32:174:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:183:32:183:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:192:32:192:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:201:32:201:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:210:32:210:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:220:49:220:49 | passwordData | semmle.label | passwordData | +| testCryptoKit.swift:224:33:224:57 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:224:38:224:38 | passwordString | semmle.label | passwordString | +| testCryptoKit.swift:224:38:224:53 | .utf8 | semmle.label | .utf8 | | testCryptoSwift.swift:154:30:154:30 | passwdArray | semmle.label | passwdArray | | testCryptoSwift.swift:157:31:157:31 | passwdArray | semmle.label | passwdArray | | testCryptoSwift.swift:160:47:160:47 | passwdArray | semmle.label | passwdArray | @@ -47,23 +54,30 @@ nodes | testCryptoSwift.swift:231:9:231:9 | passwd | semmle.label | passwd | subpaths #select -| testCryptoKit.swift:65:47:65:47 | passwd | testCryptoKit.swift:65:47:65:47 | passwd | testCryptoKit.swift:65:47:65:47 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:65:47:65:47 | passwd | password (passwd) | -| testCryptoKit.swift:71:44:71:44 | passwd | testCryptoKit.swift:71:44:71:44 | passwd | testCryptoKit.swift:71:44:71:44 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:71:44:71:44 | passwd | password (passwd) | -| testCryptoKit.swift:77:37:77:37 | passwd | testCryptoKit.swift:77:37:77:37 | passwd | testCryptoKit.swift:77:37:77:37 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:77:37:77:37 | passwd | password (passwd) | -| testCryptoKit.swift:83:37:83:37 | passwd | testCryptoKit.swift:83:37:83:37 | passwd | testCryptoKit.swift:83:37:83:37 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:83:37:83:37 | passwd | password (passwd) | -| testCryptoKit.swift:89:37:89:37 | passwd | testCryptoKit.swift:89:37:89:37 | passwd | testCryptoKit.swift:89:37:89:37 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:89:37:89:37 | passwd | password (passwd) | -| testCryptoKit.swift:98:23:98:23 | passwd | testCryptoKit.swift:98:23:98:23 | passwd | testCryptoKit.swift:98:23:98:23 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:98:23:98:23 | passwd | password (passwd) | -| testCryptoKit.swift:107:23:107:23 | passwd | testCryptoKit.swift:107:23:107:23 | passwd | testCryptoKit.swift:107:23:107:23 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:107:23:107:23 | passwd | password (passwd) | -| testCryptoKit.swift:116:23:116:23 | passwd | testCryptoKit.swift:116:23:116:23 | passwd | testCryptoKit.swift:116:23:116:23 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:116:23:116:23 | passwd | password (passwd) | -| testCryptoKit.swift:125:23:125:23 | passwd | testCryptoKit.swift:125:23:125:23 | passwd | testCryptoKit.swift:125:23:125:23 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:125:23:125:23 | passwd | password (passwd) | -| testCryptoKit.swift:134:23:134:23 | passwd | testCryptoKit.swift:134:23:134:23 | passwd | testCryptoKit.swift:134:23:134:23 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:134:23:134:23 | passwd | password (passwd) | -| testCryptoKit.swift:143:32:143:32 | passwd | testCryptoKit.swift:143:32:143:32 | passwd | testCryptoKit.swift:143:32:143:32 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:143:32:143:32 | passwd | password (passwd) | -| testCryptoKit.swift:152:32:152:32 | passwd | testCryptoKit.swift:152:32:152:32 | passwd | testCryptoKit.swift:152:32:152:32 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:152:32:152:32 | passwd | password (passwd) | -| testCryptoKit.swift:161:32:161:32 | passwd | testCryptoKit.swift:161:32:161:32 | passwd | testCryptoKit.swift:161:32:161:32 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:161:32:161:32 | passwd | password (passwd) | -| testCryptoKit.swift:170:32:170:32 | passwd | testCryptoKit.swift:170:32:170:32 | passwd | testCryptoKit.swift:170:32:170:32 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:170:32:170:32 | passwd | password (passwd) | -| testCryptoKit.swift:179:32:179:32 | passwd | testCryptoKit.swift:179:32:179:32 | passwd | testCryptoKit.swift:179:32:179:32 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:179:32:179:32 | passwd | password (passwd) | -| testCryptoKit.swift:189:49:189:49 | passwordData | testCryptoKit.swift:189:49:189:49 | passwordData | testCryptoKit.swift:189:49:189:49 | passwordData | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:189:49:189:49 | passwordData | password (passwordData) | -| testCryptoKit.swift:193:33:193:57 | call to Data.init(_:) | testCryptoKit.swift:193:38:193:38 | passwordString | testCryptoKit.swift:193:33:193:57 | call to Data.init(_:) | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:193:38:193:38 | passwordString | password (passwordString) | +| testCryptoKit.swift:84:47:84:47 | passwd | testCryptoKit.swift:84:47:84:47 | passwd | testCryptoKit.swift:84:47:84:47 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:84:47:84:47 | passwd | password (passwd) | +| testCryptoKit.swift:85:52:85:52 | passwd | testCryptoKit.swift:85:52:85:52 | passwd | testCryptoKit.swift:85:52:85:52 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:85:52:85:52 | passwd | password (passwd) | +| testCryptoKit.swift:91:36:91:36 | passwd | testCryptoKit.swift:91:36:91:36 | passwd | testCryptoKit.swift:91:36:91:36 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:91:36:91:36 | passwd | password (passwd) | +| testCryptoKit.swift:92:45:92:45 | passwd | testCryptoKit.swift:92:45:92:45 | passwd | testCryptoKit.swift:92:45:92:45 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:92:45:92:45 | passwd | password (passwd) | +| testCryptoKit.swift:98:44:98:44 | passwd | testCryptoKit.swift:98:44:98:44 | passwd | testCryptoKit.swift:98:44:98:44 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:98:44:98:44 | passwd | password (passwd) | +| testCryptoKit.swift:99:53:99:53 | passwd | testCryptoKit.swift:99:53:99:53 | passwd | testCryptoKit.swift:99:53:99:53 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:99:53:99:53 | passwd | password (passwd) | +| testCryptoKit.swift:105:37:105:37 | passwd | testCryptoKit.swift:105:37:105:37 | passwd | testCryptoKit.swift:105:37:105:37 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:105:37:105:37 | passwd | password (passwd) | +| testCryptoKit.swift:106:46:106:46 | passwd | testCryptoKit.swift:106:46:106:46 | passwd | testCryptoKit.swift:106:46:106:46 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:106:46:106:46 | passwd | password (passwd) | +| testCryptoKit.swift:112:37:112:37 | passwd | testCryptoKit.swift:112:37:112:37 | passwd | testCryptoKit.swift:112:37:112:37 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:112:37:112:37 | passwd | password (passwd) | +| testCryptoKit.swift:113:46:113:46 | passwd | testCryptoKit.swift:113:46:113:46 | passwd | testCryptoKit.swift:113:46:113:46 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:113:46:113:46 | passwd | password (passwd) | +| testCryptoKit.swift:119:37:119:37 | passwd | testCryptoKit.swift:119:37:119:37 | passwd | testCryptoKit.swift:119:37:119:37 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:119:37:119:37 | passwd | password (passwd) | +| testCryptoKit.swift:120:46:120:46 | passwd | testCryptoKit.swift:120:46:120:46 | passwd | testCryptoKit.swift:120:46:120:46 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:120:46:120:46 | passwd | password (passwd) | +| testCryptoKit.swift:129:23:129:23 | passwd | testCryptoKit.swift:129:23:129:23 | passwd | testCryptoKit.swift:129:23:129:23 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:129:23:129:23 | passwd | password (passwd) | +| testCryptoKit.swift:138:23:138:23 | passwd | testCryptoKit.swift:138:23:138:23 | passwd | testCryptoKit.swift:138:23:138:23 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:138:23:138:23 | passwd | password (passwd) | +| testCryptoKit.swift:147:23:147:23 | passwd | testCryptoKit.swift:147:23:147:23 | passwd | testCryptoKit.swift:147:23:147:23 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:147:23:147:23 | passwd | password (passwd) | +| testCryptoKit.swift:156:23:156:23 | passwd | testCryptoKit.swift:156:23:156:23 | passwd | testCryptoKit.swift:156:23:156:23 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:156:23:156:23 | passwd | password (passwd) | +| testCryptoKit.swift:165:23:165:23 | passwd | testCryptoKit.swift:165:23:165:23 | passwd | testCryptoKit.swift:165:23:165:23 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:165:23:165:23 | passwd | password (passwd) | +| testCryptoKit.swift:174:32:174:32 | passwd | testCryptoKit.swift:174:32:174:32 | passwd | testCryptoKit.swift:174:32:174:32 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:174:32:174:32 | passwd | password (passwd) | +| testCryptoKit.swift:183:32:183:32 | passwd | testCryptoKit.swift:183:32:183:32 | passwd | testCryptoKit.swift:183:32:183:32 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:183:32:183:32 | passwd | password (passwd) | +| testCryptoKit.swift:192:32:192:32 | passwd | testCryptoKit.swift:192:32:192:32 | passwd | testCryptoKit.swift:192:32:192:32 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:192:32:192:32 | passwd | password (passwd) | +| testCryptoKit.swift:201:32:201:32 | passwd | testCryptoKit.swift:201:32:201:32 | passwd | testCryptoKit.swift:201:32:201:32 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:201:32:201:32 | passwd | password (passwd) | +| testCryptoKit.swift:210:32:210:32 | passwd | testCryptoKit.swift:210:32:210:32 | passwd | testCryptoKit.swift:210:32:210:32 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:210:32:210:32 | passwd | password (passwd) | +| testCryptoKit.swift:220:49:220:49 | passwordData | testCryptoKit.swift:220:49:220:49 | passwordData | testCryptoKit.swift:220:49:220:49 | passwordData | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:220:49:220:49 | passwordData | password (passwordData) | +| testCryptoKit.swift:224:33:224:57 | call to Data.init(_:) | testCryptoKit.swift:224:38:224:38 | passwordString | testCryptoKit.swift:224:33:224:57 | call to Data.init(_:) | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:224:38:224:38 | passwordString | password (passwordString) | | testCryptoSwift.swift:154:30:154:30 | passwdArray | testCryptoSwift.swift:154:30:154:30 | passwdArray | testCryptoSwift.swift:154:30:154:30 | passwdArray | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:154:30:154:30 | passwdArray | password (passwdArray) | | testCryptoSwift.swift:157:31:157:31 | passwdArray | testCryptoSwift.swift:157:31:157:31 | passwdArray | testCryptoSwift.swift:157:31:157:31 | passwdArray | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:157:31:157:31 | passwdArray | password (passwdArray) | | testCryptoSwift.swift:160:47:160:47 | passwdArray | testCryptoSwift.swift:160:47:160:47 | passwdArray | testCryptoSwift.swift:160:47:160:47 | passwdArray | Insecure hashing algorithm (SHA2) depends on $@. | testCryptoSwift.swift:160:47:160:47 | passwdArray | password (passwdArray) | diff --git a/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected b/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected index 2cd31692f8d6..ebb8154b0f8e 100644 --- a/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected +++ b/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected @@ -1,23 +1,69 @@ edges +| testCryptoKit.swift:230:18:230:38 | call to Data.init(_:) | testCryptoKit.swift:231:44:231:44 | value1 | provenance | | +| testCryptoKit.swift:230:23:230:23 | cardNumber | testCryptoKit.swift:230:23:230:34 | .utf8 | provenance | | +| testCryptoKit.swift:230:23:230:34 | .utf8 | testCryptoKit.swift:230:18:230:38 | call to Data.init(_:) | provenance | | +| testCryptoKit.swift:233:18:233:38 | call to Data.init(_:) | testCryptoKit.swift:235:39:235:39 | value2 | provenance | | +| testCryptoKit.swift:233:23:233:23 | cardNumber | testCryptoKit.swift:233:23:233:34 | .utf8 | provenance | | +| testCryptoKit.swift:233:23:233:34 | .utf8 | testCryptoKit.swift:233:18:233:38 | call to Data.init(_:) | provenance | | +| testCryptoKit.swift:237:18:237:38 | call to Data.init(_:) | testCryptoKit.swift:238:51:238:51 | value3 | provenance | | +| testCryptoKit.swift:237:23:237:23 | cardNumber | testCryptoKit.swift:237:23:237:34 | .utf8 | provenance | | +| testCryptoKit.swift:237:23:237:34 | .utf8 | testCryptoKit.swift:237:18:237:38 | call to Data.init(_:) | provenance | | +| testCryptoKit.swift:240:18:240:38 | call to Data.init(_:) | testCryptoKit.swift:241:26:241:26 | value4 | provenance | | +| testCryptoKit.swift:240:23:240:23 | cardNumber | testCryptoKit.swift:240:23:240:34 | .utf8 | provenance | | +| testCryptoKit.swift:240:23:240:34 | .utf8 | testCryptoKit.swift:240:18:240:38 | call to Data.init(_:) | provenance | | +| testCryptoKit.swift:241:26:241:26 | value4 | testCryptoKit.swift:250:20:250:27 | value | provenance | | +| testCryptoKit.swift:243:18:243:38 | call to Data.init(_:) | testCryptoKit.swift:244:53:244:53 | value5 | provenance | | +| testCryptoKit.swift:243:23:243:23 | cardNumber | testCryptoKit.swift:243:23:243:34 | .utf8 | provenance | | +| testCryptoKit.swift:243:23:243:34 | .utf8 | testCryptoKit.swift:243:18:243:38 | call to Data.init(_:) | provenance | | +| testCryptoKit.swift:244:53:244:53 | value5 | testCryptoKit.swift:254:47:254:54 | value | provenance | | +| testCryptoKit.swift:250:20:250:27 | value | testCryptoKit.swift:251:43:251:43 | value | provenance | | +| testCryptoKit.swift:254:47:254:54 | value | testCryptoKit.swift:255:37:255:37 | value | provenance | | nodes -| testCryptoKit.swift:66:43:66:43 | cert | semmle.label | cert | -| testCryptoKit.swift:68:43:68:43 | account_no | semmle.label | account_no | -| testCryptoKit.swift:69:43:69:43 | credit_card_no | semmle.label | credit_card_no | -| testCryptoKit.swift:72:44:72:44 | cert | semmle.label | cert | -| testCryptoKit.swift:74:44:74:44 | account_no | semmle.label | account_no | -| testCryptoKit.swift:75:44:75:44 | credit_card_no | semmle.label | credit_card_no | -| testCryptoKit.swift:99:23:99:23 | cert | semmle.label | cert | -| testCryptoKit.swift:101:23:101:23 | account_no | semmle.label | account_no | -| testCryptoKit.swift:102:23:102:23 | credit_card_no | semmle.label | credit_card_no | -| testCryptoKit.swift:108:23:108:23 | cert | semmle.label | cert | -| testCryptoKit.swift:110:23:110:23 | account_no | semmle.label | account_no | -| testCryptoKit.swift:111:23:111:23 | credit_card_no | semmle.label | credit_card_no | -| testCryptoKit.swift:144:32:144:32 | cert | semmle.label | cert | -| testCryptoKit.swift:146:32:146:32 | account_no | semmle.label | account_no | -| testCryptoKit.swift:147:32:147:32 | credit_card_no | semmle.label | credit_card_no | -| testCryptoKit.swift:153:32:153:32 | cert | semmle.label | cert | -| testCryptoKit.swift:155:32:155:32 | account_no | semmle.label | account_no | -| testCryptoKit.swift:156:32:156:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:86:43:86:43 | cert | semmle.label | cert | +| testCryptoKit.swift:88:43:88:43 | account_no | semmle.label | account_no | +| testCryptoKit.swift:89:43:89:43 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:93:36:93:36 | cert | semmle.label | cert | +| testCryptoKit.swift:95:36:95:36 | account_no | semmle.label | account_no | +| testCryptoKit.swift:96:36:96:36 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:100:44:100:44 | cert | semmle.label | cert | +| testCryptoKit.swift:102:44:102:44 | account_no | semmle.label | account_no | +| testCryptoKit.swift:103:44:103:44 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:130:23:130:23 | cert | semmle.label | cert | +| testCryptoKit.swift:132:23:132:23 | account_no | semmle.label | account_no | +| testCryptoKit.swift:133:23:133:23 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:139:23:139:23 | cert | semmle.label | cert | +| testCryptoKit.swift:141:23:141:23 | account_no | semmle.label | account_no | +| testCryptoKit.swift:142:23:142:23 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:175:32:175:32 | cert | semmle.label | cert | +| testCryptoKit.swift:177:32:177:32 | account_no | semmle.label | account_no | +| testCryptoKit.swift:178:32:178:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:184:32:184:32 | cert | semmle.label | cert | +| testCryptoKit.swift:186:32:186:32 | account_no | semmle.label | account_no | +| testCryptoKit.swift:187:32:187:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:230:18:230:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:230:23:230:23 | cardNumber | semmle.label | cardNumber | +| testCryptoKit.swift:230:23:230:34 | .utf8 | semmle.label | .utf8 | +| testCryptoKit.swift:231:44:231:44 | value1 | semmle.label | value1 | +| testCryptoKit.swift:233:18:233:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:233:23:233:23 | cardNumber | semmle.label | cardNumber | +| testCryptoKit.swift:233:23:233:34 | .utf8 | semmle.label | .utf8 | +| testCryptoKit.swift:235:39:235:39 | value2 | semmle.label | value2 | +| testCryptoKit.swift:237:18:237:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:237:23:237:23 | cardNumber | semmle.label | cardNumber | +| testCryptoKit.swift:237:23:237:34 | .utf8 | semmle.label | .utf8 | +| testCryptoKit.swift:238:51:238:51 | value3 | semmle.label | value3 | +| testCryptoKit.swift:240:18:240:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:240:23:240:23 | cardNumber | semmle.label | cardNumber | +| testCryptoKit.swift:240:23:240:34 | .utf8 | semmle.label | .utf8 | +| testCryptoKit.swift:241:26:241:26 | value4 | semmle.label | value4 | +| testCryptoKit.swift:243:18:243:38 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:243:23:243:23 | cardNumber | semmle.label | cardNumber | +| testCryptoKit.swift:243:23:243:34 | .utf8 | semmle.label | .utf8 | +| testCryptoKit.swift:244:53:244:53 | value5 | semmle.label | value5 | +| testCryptoKit.swift:250:20:250:27 | value | semmle.label | value | +| testCryptoKit.swift:251:43:251:43 | value | semmle.label | value | +| testCryptoKit.swift:254:47:254:54 | value | semmle.label | value | +| testCryptoKit.swift:255:37:255:37 | value | semmle.label | value | | testCryptoSwift.swift:153:30:153:30 | phoneNumberArray | semmle.label | phoneNumberArray | | testCryptoSwift.swift:156:31:156:31 | phoneNumberArray | semmle.label | phoneNumberArray | | testCryptoSwift.swift:166:20:166:20 | phoneNumberArray | semmle.label | phoneNumberArray | @@ -30,24 +76,32 @@ nodes | testCryptoSwift.swift:221:9:221:9 | creditCardNumber | semmle.label | creditCardNumber | subpaths #select -| testCryptoKit.swift:66:43:66:43 | cert | testCryptoKit.swift:66:43:66:43 | cert | testCryptoKit.swift:66:43:66:43 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:66:43:66:43 | cert | sensitive data (credential cert) | -| testCryptoKit.swift:68:43:68:43 | account_no | testCryptoKit.swift:68:43:68:43 | account_no | testCryptoKit.swift:68:43:68:43 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:68:43:68:43 | account_no | sensitive data (private information account_no) | -| testCryptoKit.swift:69:43:69:43 | credit_card_no | testCryptoKit.swift:69:43:69:43 | credit_card_no | testCryptoKit.swift:69:43:69:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:69:43:69:43 | credit_card_no | sensitive data (private information credit_card_no) | -| testCryptoKit.swift:72:44:72:44 | cert | testCryptoKit.swift:72:44:72:44 | cert | testCryptoKit.swift:72:44:72:44 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:72:44:72:44 | cert | sensitive data (credential cert) | -| testCryptoKit.swift:74:44:74:44 | account_no | testCryptoKit.swift:74:44:74:44 | account_no | testCryptoKit.swift:74:44:74:44 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:74:44:74:44 | account_no | sensitive data (private information account_no) | -| testCryptoKit.swift:75:44:75:44 | credit_card_no | testCryptoKit.swift:75:44:75:44 | credit_card_no | testCryptoKit.swift:75:44:75:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:75:44:75:44 | credit_card_no | sensitive data (private information credit_card_no) | -| testCryptoKit.swift:99:23:99:23 | cert | testCryptoKit.swift:99:23:99:23 | cert | testCryptoKit.swift:99:23:99:23 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:99:23:99:23 | cert | sensitive data (credential cert) | -| testCryptoKit.swift:101:23:101:23 | account_no | testCryptoKit.swift:101:23:101:23 | account_no | testCryptoKit.swift:101:23:101:23 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:101:23:101:23 | account_no | sensitive data (private information account_no) | -| testCryptoKit.swift:102:23:102:23 | credit_card_no | testCryptoKit.swift:102:23:102:23 | credit_card_no | testCryptoKit.swift:102:23:102:23 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:102:23:102:23 | credit_card_no | sensitive data (private information credit_card_no) | -| testCryptoKit.swift:108:23:108:23 | cert | testCryptoKit.swift:108:23:108:23 | cert | testCryptoKit.swift:108:23:108:23 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:108:23:108:23 | cert | sensitive data (credential cert) | -| testCryptoKit.swift:110:23:110:23 | account_no | testCryptoKit.swift:110:23:110:23 | account_no | testCryptoKit.swift:110:23:110:23 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:110:23:110:23 | account_no | sensitive data (private information account_no) | -| testCryptoKit.swift:111:23:111:23 | credit_card_no | testCryptoKit.swift:111:23:111:23 | credit_card_no | testCryptoKit.swift:111:23:111:23 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:111:23:111:23 | credit_card_no | sensitive data (private information credit_card_no) | -| testCryptoKit.swift:144:32:144:32 | cert | testCryptoKit.swift:144:32:144:32 | cert | testCryptoKit.swift:144:32:144:32 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:144:32:144:32 | cert | sensitive data (credential cert) | -| testCryptoKit.swift:146:32:146:32 | account_no | testCryptoKit.swift:146:32:146:32 | account_no | testCryptoKit.swift:146:32:146:32 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:146:32:146:32 | account_no | sensitive data (private information account_no) | -| testCryptoKit.swift:147:32:147:32 | credit_card_no | testCryptoKit.swift:147:32:147:32 | credit_card_no | testCryptoKit.swift:147:32:147:32 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:147:32:147:32 | credit_card_no | sensitive data (private information credit_card_no) | -| testCryptoKit.swift:153:32:153:32 | cert | testCryptoKit.swift:153:32:153:32 | cert | testCryptoKit.swift:153:32:153:32 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:153:32:153:32 | cert | sensitive data (credential cert) | -| testCryptoKit.swift:155:32:155:32 | account_no | testCryptoKit.swift:155:32:155:32 | account_no | testCryptoKit.swift:155:32:155:32 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:155:32:155:32 | account_no | sensitive data (private information account_no) | -| testCryptoKit.swift:156:32:156:32 | credit_card_no | testCryptoKit.swift:156:32:156:32 | credit_card_no | testCryptoKit.swift:156:32:156:32 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:156:32:156:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:86:43:86:43 | cert | testCryptoKit.swift:86:43:86:43 | cert | testCryptoKit.swift:86:43:86:43 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:86:43:86:43 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:88:43:88:43 | account_no | testCryptoKit.swift:88:43:88:43 | account_no | testCryptoKit.swift:88:43:88:43 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:88:43:88:43 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:89:43:89:43 | credit_card_no | testCryptoKit.swift:89:43:89:43 | credit_card_no | testCryptoKit.swift:89:43:89:43 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:89:43:89:43 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:93:36:93:36 | cert | testCryptoKit.swift:93:36:93:36 | cert | testCryptoKit.swift:93:36:93:36 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:93:36:93:36 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:95:36:95:36 | account_no | testCryptoKit.swift:95:36:95:36 | account_no | testCryptoKit.swift:95:36:95:36 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:95:36:95:36 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:96:36:96:36 | credit_card_no | testCryptoKit.swift:96:36:96:36 | credit_card_no | testCryptoKit.swift:96:36:96:36 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:96:36:96:36 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:100:44:100:44 | cert | testCryptoKit.swift:100:44:100:44 | cert | testCryptoKit.swift:100:44:100:44 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:100:44:100:44 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:102:44:102:44 | account_no | testCryptoKit.swift:102:44:102:44 | account_no | testCryptoKit.swift:102:44:102:44 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:102:44:102:44 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:103:44:103:44 | credit_card_no | testCryptoKit.swift:103:44:103:44 | credit_card_no | testCryptoKit.swift:103:44:103:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:103:44:103:44 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:130:23:130:23 | cert | testCryptoKit.swift:130:23:130:23 | cert | testCryptoKit.swift:130:23:130:23 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:130:23:130:23 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:132:23:132:23 | account_no | testCryptoKit.swift:132:23:132:23 | account_no | testCryptoKit.swift:132:23:132:23 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:132:23:132:23 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:133:23:133:23 | credit_card_no | testCryptoKit.swift:133:23:133:23 | credit_card_no | testCryptoKit.swift:133:23:133:23 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:133:23:133:23 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:139:23:139:23 | cert | testCryptoKit.swift:139:23:139:23 | cert | testCryptoKit.swift:139:23:139:23 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:139:23:139:23 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:141:23:141:23 | account_no | testCryptoKit.swift:141:23:141:23 | account_no | testCryptoKit.swift:141:23:141:23 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:141:23:141:23 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:142:23:142:23 | credit_card_no | testCryptoKit.swift:142:23:142:23 | credit_card_no | testCryptoKit.swift:142:23:142:23 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:142:23:142:23 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:175:32:175:32 | cert | testCryptoKit.swift:175:32:175:32 | cert | testCryptoKit.swift:175:32:175:32 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:175:32:175:32 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:177:32:177:32 | account_no | testCryptoKit.swift:177:32:177:32 | account_no | testCryptoKit.swift:177:32:177:32 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:177:32:177:32 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:178:32:178:32 | credit_card_no | testCryptoKit.swift:178:32:178:32 | credit_card_no | testCryptoKit.swift:178:32:178:32 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:178:32:178:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:184:32:184:32 | cert | testCryptoKit.swift:184:32:184:32 | cert | testCryptoKit.swift:184:32:184:32 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:184:32:184:32 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:186:32:186:32 | account_no | testCryptoKit.swift:186:32:186:32 | account_no | testCryptoKit.swift:186:32:186:32 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:186:32:186:32 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:187:32:187:32 | credit_card_no | testCryptoKit.swift:187:32:187:32 | credit_card_no | testCryptoKit.swift:187:32:187:32 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:187:32:187:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:231:44:231:44 | value1 | testCryptoKit.swift:230:23:230:23 | cardNumber | testCryptoKit.swift:231:44:231:44 | value1 | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:230:23:230:23 | cardNumber | sensitive data (private information cardNumber) | +| testCryptoKit.swift:235:39:235:39 | value2 | testCryptoKit.swift:233:23:233:23 | cardNumber | testCryptoKit.swift:235:39:235:39 | value2 | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:233:23:233:23 | cardNumber | sensitive data (private information cardNumber) | +| testCryptoKit.swift:238:51:238:51 | value3 | testCryptoKit.swift:237:23:237:23 | cardNumber | testCryptoKit.swift:238:51:238:51 | value3 | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:237:23:237:23 | cardNumber | sensitive data (private information cardNumber) | +| testCryptoKit.swift:251:43:251:43 | value | testCryptoKit.swift:240:23:240:23 | cardNumber | testCryptoKit.swift:251:43:251:43 | value | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:240:23:240:23 | cardNumber | sensitive data (private information cardNumber) | +| testCryptoKit.swift:255:37:255:37 | value | testCryptoKit.swift:243:23:243:23 | cardNumber | testCryptoKit.swift:255:37:255:37 | value | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:243:23:243:23 | cardNumber | sensitive data (private information cardNumber) | | testCryptoSwift.swift:153:30:153:30 | phoneNumberArray | testCryptoSwift.swift:153:30:153:30 | phoneNumberArray | testCryptoSwift.swift:153:30:153:30 | phoneNumberArray | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:153:30:153:30 | phoneNumberArray | sensitive data (private information phoneNumberArray) | | testCryptoSwift.swift:156:31:156:31 | phoneNumberArray | testCryptoSwift.swift:156:31:156:31 | phoneNumberArray | testCryptoSwift.swift:156:31:156:31 | phoneNumberArray | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoSwift.swift:156:31:156:31 | phoneNumberArray | sensitive data (private information phoneNumberArray) | | testCryptoSwift.swift:166:20:166:20 | phoneNumberArray | testCryptoSwift.swift:166:20:166:20 | phoneNumberArray | testCryptoSwift.swift:166:20:166:20 | phoneNumberArray | Insecure hashing algorithm (MD5) depends on $@. | testCryptoSwift.swift:166:20:166:20 | phoneNumberArray | sensitive data (private information phoneNumberArray) | diff --git a/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift b/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift index dd37c6238c0b..6869805e65aa 100644 --- a/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift +++ b/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift @@ -7,55 +7,74 @@ class Data init(_ elements: S) {} } -struct SHA256 { - static func hash(data: D) -> [UInt8] { - return [] - } +public protocol HashFunction { + associatedtype Digest - func update(data: D) {} - func update(bufferPointer: UnsafeRawBufferPointer) {} - func finalize() -> [UInt8] { return [] } + init() + mutating func update(bufferPointer: UnsafeRawBufferPointer) + func finalize() -> Digest } -struct SHA384 { - static func hash(data: D) -> [UInt8] { - return [] +extension HashFunction { + @inlinable + public static func hash(bufferPointer: UnsafeRawBufferPointer) -> Digest { + var hasher = Self() + hasher.update(bufferPointer: bufferPointer) + return hasher.finalize() } - func update(data: D) {} - func update(bufferPointer: UnsafeRawBufferPointer) {} - func finalize() -> [UInt8] { return [] } -} + @inlinable + public static func hash(data: D) -> Self.Digest { + var hasher = Self() + hasher.update(data: data) + return hasher.finalize() + } -struct SHA512 { - static func hash(data: D) -> [UInt8] { - return [] + @inlinable + public mutating func update(data: D) { + // ... } +} + +public struct SHA256: HashFunction { + public typealias Digest = [UInt8] + + public init() {} + public mutating func update(bufferPointer: UnsafeRawBufferPointer) {} + public func finalize() -> Digest { return [] } +} - func update(data: D) {} - func update(bufferPointer: UnsafeRawBufferPointer) {} - func finalize() -> [UInt8] { return [] } +public struct SHA384: HashFunction { + public typealias Digest = [UInt8] + + public init() {} + public mutating func update(bufferPointer: UnsafeRawBufferPointer) {} + public func finalize() -> Digest { return [] } } +public struct SHA512: HashFunction { + public typealias Digest = [UInt8] + + public init() {} + public mutating func update(bufferPointer: UnsafeRawBufferPointer) {} + public func finalize() -> Digest { return [] } +} enum Insecure { - struct MD5 { - static func hash(data: D) -> [UInt8] { - return [] - } - - func update(data: D) {} - func update(bufferPointer: UnsafeRawBufferPointer) {} - func finalize() -> [UInt8] { return [] } + public struct MD5: HashFunction { + public typealias Digest = [UInt8] + + public init() {} + public mutating func update(bufferPointer: UnsafeRawBufferPointer) {} + public func finalize() -> Digest { return [] } } - struct SHA1 { - static func hash(data: D) -> [UInt8] { - return [] - } - - func update(data: D) {} - func update(bufferPointer: UnsafeRawBufferPointer) {} - func finalize() -> [UInt8] { return [] } + + public struct SHA1: HashFunction { + public typealias Digest = [UInt8] + + public init() {} + public mutating func update(bufferPointer: UnsafeRawBufferPointer) {} + public func finalize() -> Digest { return [] } } } @@ -63,30 +82,42 @@ enum Insecure { func testHashMethods(passwd : UnsafeRawBufferPointer, cert: String, encrypted_passwd : String, account_no : String, credit_card_no : String) { var hash = Crypto.Insecure.MD5.hash(data: passwd) // BAD + hash = Crypto.Insecure.MD5.hash(bufferPointer: passwd) // BAD hash = Crypto.Insecure.MD5.hash(data: cert) // BAD hash = Crypto.Insecure.MD5.hash(data: encrypted_passwd) // GOOD (not sensitive) hash = Crypto.Insecure.MD5.hash(data: account_no) // BAD hash = Crypto.Insecure.MD5.hash(data: credit_card_no) // BAD + hash = Insecure.MD5.hash(data: passwd) // BAD + hash = Insecure.MD5.hash(bufferPointer: passwd) // BAD + hash = Insecure.MD5.hash(data: cert) // BAD + hash = Insecure.MD5.hash(data: encrypted_passwd) // GOOD (not sensitive) + hash = Insecure.MD5.hash(data: account_no) // BAD + hash = Insecure.MD5.hash(data: credit_card_no) // BAD + hash = Crypto.Insecure.SHA1.hash(data: passwd) // BAD + hash = Crypto.Insecure.SHA1.hash(bufferPointer: passwd) // BAD hash = Crypto.Insecure.SHA1.hash(data: cert) // BAD hash = Crypto.Insecure.SHA1.hash(data: encrypted_passwd) // GOOD (not sensitive) hash = Crypto.Insecure.SHA1.hash(data: account_no) // BAD hash = Crypto.Insecure.SHA1.hash(data: credit_card_no) // BAD hash = Crypto.SHA256.hash(data: passwd) // BAD, not a computationally expensive hash + hash = Crypto.SHA256.hash(bufferPointer: passwd) // BAD, not a computationally expensive hash hash = Crypto.SHA256.hash(data: cert) // GOOD, computationally expensive hash not required hash = Crypto.SHA256.hash(data: encrypted_passwd) // GOOD, not sensitive hash = Crypto.SHA256.hash(data: account_no) // GOOD, computationally expensive hash not required hash = Crypto.SHA256.hash(data: credit_card_no) // GOOD, computationally expensive hash not required hash = Crypto.SHA384.hash(data: passwd) // BAD, not a computationally expensive hash + hash = Crypto.SHA384.hash(bufferPointer: passwd) // BAD, not a computationally expensive hash hash = Crypto.SHA384.hash(data: cert) // GOOD, computationally expensive hash not required hash = Crypto.SHA384.hash(data: encrypted_passwd) // GOOD, not sensitive hash = Crypto.SHA384.hash(data: account_no) // GOOD, computationally expensive hash not required hash = Crypto.SHA384.hash(data: credit_card_no) // GOOD, computationally expensive hash not required hash = Crypto.SHA512.hash(data: passwd) // BAD, not a computationally expensive hash + hash = Crypto.SHA512.hash(bufferPointer: passwd) // BAD, not a computationally expensive hash hash = Crypto.SHA512.hash(data: cert) // GOOD, computationally expensive hash not required hash = Crypto.SHA512.hash(data: encrypted_passwd) // GOOD, not sensitive hash = Crypto.SHA512.hash(data: account_no) // GOOD, computationally expensive hash not required @@ -183,7 +214,7 @@ func testSHA512UpdateWithUnsafeRawBufferPointer(passwd : UnsafeRawBufferPointer, hash.update(bufferPointer: credit_card_no) // GOOD } -func tesBadExample(passwordString: String) { +func testBadExample(passwordString: String) { // this is the "bad" example from the .qhelp let passwordData = Data(passwordString.utf8) let passwordHash = Crypto.SHA512.hash(data: passwordData) // BAD, not a computationally expensive hash @@ -194,3 +225,36 @@ func tesBadExample(passwordString: String) { // ... } } + +func testWithFlowAndMetatypes(cardNumber: String) { + let value1 = Data(cardNumber.utf8); + let _digest1 = Insecure.MD5.hash(data: value1); // BAD + + let value2 = Data(cardNumber.utf8); + let hasher2 = Insecure.MD5.self; // metatype + let _digest2 = hasher2.hash(data: value2); // BAD + + let value3 = Data(cardNumber.utf8); + let _digest3 = (Insecure.MD5.self).hash(data: value3); // BAD + + let value4 = Data(cardNumber.utf8); + testReceiver1(value: value4); + + let value5 = Data(cardNumber.utf8); + testReceiver2(hasher: Insecure.MD5.self, value: value5); + + let value6 = Data(cardNumber.utf8); + testReceiver3(hasher: Insecure.MD5.self, value: value6); +} + +func testReceiver1(value: Data) { + let _digest = Insecure.MD5.hash(data: value); // BAD +} + +func testReceiver2(hasher: Insecure.MD5.Type, value: Data) { + let _digest = hasher.hash(data: value); // BAD +} + +func testReceiver3(hasher: H.Type, value: Data) { + let _digest = hasher.hash(data: value); // BAD [NOT DETECTED] +} diff --git a/swift/third_party/resources/resource-dir-linux.zip b/swift/third_party/resources/resource-dir-linux.zip index 8692eb89fd4c..da93aefcc706 100644 --- a/swift/third_party/resources/resource-dir-linux.zip +++ b/swift/third_party/resources/resource-dir-linux.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:25718237e4b0d725f62baceb8e9eb6b1090433c3a64c15b54205bbd3b1241a78 -size 408416862 +oid sha256:bd132a4fb44688913eff72f94110e2745048ceda3354ba199d8338750881e0e5 +size 408312701 diff --git a/swift/third_party/resources/resource-dir-macos.zip b/swift/third_party/resources/resource-dir-macos.zip index 51c367e2b136..11ac3ddf0d7d 100644 --- a/swift/third_party/resources/resource-dir-macos.zip +++ b/swift/third_party/resources/resource-dir-macos.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97c427650a83bd1d70846ef24965cbe2451c3e9b3bb86530f0cb704936ffa07a -size 548168307 +oid sha256:fd4eaa3a688849279e990da69768da796f6a130ca6e01572d022142ff09e4868 +size 548155566 diff --git a/swift/third_party/resources/swift-prebuilt-linux.tar.zst b/swift/third_party/resources/swift-prebuilt-linux.tar.zst index 769117fefeaf..2adf23cda687 100644 --- a/swift/third_party/resources/swift-prebuilt-linux.tar.zst +++ b/swift/third_party/resources/swift-prebuilt-linux.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b313be2bee2c0afbedbe710435b7e0836e1a06f6a8b57d300c9843ebd1f469e3 -size 143494508 +oid sha256:e00f464ad0b793c8e14df844aecbeec5cdd587e8f34a85915593a470dba1beda +size 143508114 diff --git a/swift/third_party/resources/swift-prebuilt-macos.tar.zst b/swift/third_party/resources/swift-prebuilt-macos.tar.zst index a48c2ce04661..f63c93f1caa9 100644 --- a/swift/third_party/resources/swift-prebuilt-macos.tar.zst +++ b/swift/third_party/resources/swift-prebuilt-macos.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4aea62dad0e67b8bb6ac5536a3fff1730f48a15f516b5b6d48b6c42f16508687 -size 125103802 +oid sha256:212229f7f0545aab03e3034f55d13a665bc568633a5defc72a662c83a06e90cc +size 125133134 diff --git a/unified/AGENTS.md b/unified/AGENTS.md index 488a94f44bd4..aa5007a56561 100644 --- a/unified/AGENTS.md +++ b/unified/AGENTS.md @@ -20,10 +20,15 @@ grammar source), run `scripts/regenerate-grammar.sh` to: it shows the impact of a grammar tweak on the named node kinds, fields, and child types in a form much easier to read than the raw JSON. -## Testing -- If you changed the extractor code, always rebuild it before running tests. +## Extractor Testing +- To run extractor tests, run `cargo test` in the `extractor` directory. -- To run all tests, run `codeql test run --search-path extractor-pack ql/test` +- Do not edit the printed ASTs in `extractor/test/corpus` directly. To regenerate the ASTs, run `scripts/update-corpus.sh`. + +## CodeQL Testing +- If you changed the extractor code, always rebuild it before running CodeQL tests. + +- To run all CodeQL tests, run `codeql test run --search-path extractor-pack ql/test` - Do not edit `.expected` files manually. To update the expected output, pass `--learn` to the `codeql test run` command. diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml new file mode 100644 index 000000000000..22a5e8b19fb8 --- /dev/null +++ b/unified/extractor/ast_types.yml @@ -0,0 +1,144 @@ +supertypes: + expr: + - name_expr + - int_literal + - string_literal + - binary_expr + - unary_expr + - call_expr + - member_access_expr + - lambda_expr + - unsupported_node + stmt: + - empty_stmt + - block_stmt + - expr_stmt + - if_stmt + - variable_declaration_stmt + - guard_if_stmt + - unsupported_node + condition: + - expr_condition + - let_pattern_condition + - sequence_condition + - unsupported_node + pattern: + - var_pattern + - apply_pattern + - tuple_pattern + - ignore_pattern + - unsupported_node +named: + # Top-level is the root node, currently containing a list of expressions + top_level: + body*: [expr, stmt] + + # An identifier used in the context of an expression + name_expr: + identifier: identifier + + # An integer literal + int_literal: + + # A string literal + string_literal: + + # Application of a binary operator, such as `a + b` + binary_expr: + left: expr + operator: operator + right: expr + + # Application of a unary operator, such as `!x` + unary_expr: + operand: expr + operator: operator + + # A function or method call, such as `f(x)` or `obj.m(x)`. Method calls + # are represented as a call whose `function` is a `member_access_expr`. + call_expr: + function: expr + argument*: expr + + # Member access, such as `obj.member`. + member_access_expr: + target: expr + member: identifier + + lambda_expr: + parameter*: parameter + body: [expr, stmt] + + # A parameter + parameter: + pattern: pattern + + empty_stmt: + + block_stmt: + body*: stmt + + expr_stmt: + expr: expr + + if_stmt: + condition: condition + then?: stmt + else?: stmt + + variable_declaration_stmt: + variable_declarator+: variable_declarator + + # A variable declaration, or assignment to a pattern. + # The initializer is optional (but typically only possible in combination with a simple variable pattern). + variable_declarator: + pattern: pattern + value?: expr + + # Evaluate 'condition', and if false, execute 'else' which must break from the enclosing block scope (return, break, etc). + # Any variables bound by 'condition' will be in scope for the remainder of the enclosing block scope + # (which differs from how if_stmt works). + guard_if_stmt: + condition: condition + else: stmt + + # Evaluates the given condition and interprets it as a boolean (by language conventions) + expr_condition: + expr: expr + + # A series of statements that are executed before evaluating the trailing condition. + # Useful for languages where a conditional clause may be preceded by side-effecting + # syntactic elements (e.g. binding clauses) that don't themselves form a condition. + sequence_condition: + stmt*: stmt + condition: condition + + # Evaluate 'expr' and match its result against 'pattern', and return true if it matches. + # Variables bound by the pattern will be in scope within the 'true' branch controlled by this condition. + let_pattern_condition: + pattern: pattern + value: expr + + # A pattern matching anything, binding its value to the given variable + var_pattern: + identifier: identifier + + # A pattern matching anything, binding no variables, usually using the syntax "_" + ignore_pattern: + + # A pattern such as `Some(x)` where `Some` is the constructor and `x` is an argument + apply_pattern: + constructor: expr + argument*: pattern + + # A tuple pattern such as `(a, b)` in `let (a, b) = pair`. + tuple_pattern: + element*: pattern + + # An simple unqualified identifier token + identifier: + + # A node that we don't yet translate + unsupported_node: + + operator: diff --git a/unified/extractor/src/extractor.rs b/unified/extractor/src/extractor.rs index eb6f06eb259b..7601fa8addbe 100644 --- a/unified/extractor/src/extractor.rs +++ b/unified/extractor/src/extractor.rs @@ -3,9 +3,7 @@ use std::path::PathBuf; use codeql_extractor::extractor::simple; use codeql_extractor::trap; - -#[path = "languages/swift/swift.rs"] -mod swift; +use crate::languages; #[derive(Args)] pub struct Options { @@ -25,11 +23,17 @@ pub struct Options { pub fn run(options: Options) -> std::io::Result<()> { codeql_extractor::extractor::set_tracing_level("unified"); + // The generated dbscheme/QL library uses the unified_* relation namespace. + // Keep per-language specs for parser/rules/file globs, but normalize the + // extraction table prefix so emitted TRAP relations match the dbscheme. + let mut languages = languages::all_language_specs(); + for lang in &mut languages { + lang.prefix = "unified"; + } + let extractor = simple::Extractor { prefix: "unified".to_string(), - languages: vec![ - swift::language_spec(), - ], + languages, trap_dir: options.output_dir, trap_compression: trap::Compression::from_env("CODEQL_EXTRACTOR_UNIFIED_OPTION_TRAP_COMPRESSION"), source_archive_dir: options.source_archive_dir, diff --git a/unified/extractor/src/generator.rs b/unified/extractor/src/generator.rs index ce1f37144a4e..cbf971a8ff25 100644 --- a/unified/extractor/src/generator.rs +++ b/unified/extractor/src/generator.rs @@ -3,6 +3,8 @@ use std::path::PathBuf; use codeql_extractor::generator::{generate, language::Language}; +use crate::languages; + #[derive(Args)] pub struct Options { /// Path of the generated dbscheme file @@ -17,10 +19,16 @@ pub struct Options { pub fn run(options: Options) -> std::io::Result<()> { codeql_extractor::extractor::set_tracing_level("unified"); + // The QL-visible schema is the unified output AST, not the per-language + // input grammars. Pass it via `desugar.output_node_types_yaml` so the + // generator converts the YAML to JSON node-types. + let desugar = yeast::DesugaringConfig::new() + .with_output_node_types_yaml(languages::OUTPUT_AST_SCHEMA); + let languages = vec![Language { - name: "Swift".to_owned(), - node_types: tree_sitter_swift::NODE_TYPES, - desugar: None, + name: "Unified".to_owned(), + node_types: "", // unused: generator picks up output_node_types_yaml above + desugar: Some(desugar), }]; generate(languages, options.dbscheme, options.library, "run unified/scripts/create-extractor-pack.sh") diff --git a/unified/extractor/src/languages/mod.rs b/unified/extractor/src/languages/mod.rs new file mode 100644 index 000000000000..20ad599edfb6 --- /dev/null +++ b/unified/extractor/src/languages/mod.rs @@ -0,0 +1,11 @@ +use codeql_extractor::extractor::simple; + +#[path = "swift/swift.rs"] +mod swift; + +/// Shared YEAST output AST schema for all languages. +pub(crate) const OUTPUT_AST_SCHEMA: &str = include_str!("../../ast_types.yml"); + +pub fn all_language_specs() -> Vec { + vec![swift::language_spec(OUTPUT_AST_SCHEMA)] +} diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index c3843a5979c5..595f56a0b39a 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1,18 +1,358 @@ use codeql_extractor::extractor::simple; -use yeast::{rule, DesugaringConfig}; +use yeast::{build::BuildCtx, rule, DesugaringConfig, PhaseKind}; -fn desugaring_rules() -> Vec { +/// Names of output AST kinds that belong to the `expr` supertype. Kept in +/// sync with `ast_types.yml`. `unsupported_node` is intentionally omitted +/// because it is also a member of the `stmt` supertype. +const EXPR_KINDS: &[&str] = &[ + "name_expr", + "int_literal", + "string_literal", + "binary_expr", + "unary_expr", + "call_expr", + "member_access_expr", + "lambda_expr", +]; + +/// If `id` is an `expr`, wrap it in `expr_stmt` so it can sit in a `stmt` +/// position; otherwise return it unchanged. +fn wrap_expr_in_stmt(ctx: &mut BuildCtx, id: usize) -> usize { + let kind = ctx.ast.get_node(id).map(|n| n.kind()).unwrap_or(""); + if EXPR_KINDS.contains(&kind) { + yeast::tree!(ctx, (expr_stmt expr: {id})) + } else { + id + } +} + +fn translation_rules() -> Vec { vec![ rule!( - (additive_expression) + (source_file (_)* @children) + => + (top_level + body: {..children} + ) + ), + // ---- Binary expressions ---- + // Swift's parser produces a different node kind for each operator + // family, but the field shape (`lhs` / `op` / `rhs`) is uniform, so + // each maps onto `binary_expr`. + rule!( + (additive_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (multiplicative_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (comparison_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (equality_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (conjunction_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (disjunction_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (nil_coalescing_expression + lhs: (_) @left + op: _ @operator + rhs: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + rule!( + (range_expression + start: (_) @left + op: _ @operator + end: (_) @right) + => + (binary_expr + left: {left} + operator: (operator #{operator}) + right: {right}) + ), + // ---- Unary expressions ---- + rule!( + (prefix_expression + operation: _ @operator + target: (_) @operand) + => + (unary_expr + operand: {operand} + operator: (operator #{operator})) + ), + // ---- Identifiers / name expressions ---- + rule!( + (simple_identifier) @name + => + (name_expr + identifier: (identifier #{name})) + ), + // ---- Literals ---- + rule!( + (integer_literal) @lit + => + (int_literal #{lit}) + ), + // String literals: render the *raw* source text, including the + // surrounding quotes. Interpolations (e.g. `"hi \(x)"`) are not + // yet broken out into structured pieces \u2014 they show up as part + // of the literal's source text. + rule!( + (line_string_literal) @lit + => + (string_literal #{lit}) + ), // ---- Lambdas / closures ---- + // Map a `lambda_literal` whose body is a single statement to + // `lambda_expr`. Multi-statement bodies fall through to + // `unsupported_node` because `lambda_expr.body` is single-valued + // in the current `ast_types.yml`. Parameters from explicit-typed + // closures (`{ (x: Int) -> Int in ... }`) are not yet captured. + rule!( + (lambda_literal + (statements (_) @body)) + => + (lambda_expr + body: {body}) + ), + // ---- Block / statement wrapping ---- + // A `(statements ...)` node corresponds to a brace-delimited block. + // Each child is mapped through translation; bare expression results + // get wrapped in `expr_stmt` so they fit the `body*: stmt` field. + rule!( + (statements (_)* @stmts) + => + (block_stmt body: {..stmts.iter().copied().map(|n| + wrap_expr_in_stmt(&mut __yeast_ctx, n.into()) + ).collect::>()}) + ), + // ---- Calls and member access ---- + // Member access, e.g. `obj.member`. The Swift parser wraps the + // member name as `(navigation_suffix suffix: (simple_identifier))`. + rule!( + (navigation_expression + target: (_) @target + suffix: (navigation_suffix + suffix: (simple_identifier) @member)) + => + (member_access_expr + target: {target} + member: (identifier #{member})) + ), + // Function / method call. The callee is the first child of + // `call_expression`; the second is a `call_suffix` whose + // `value_arguments` (if present) hold the parenthesized args. A + // trailing closure (`call_suffix` with a `lambda_literal` child) + // is appended as a final argument. + rule!( + (call_expression + (_) @callee + (call_suffix + (value_arguments + (value_argument value: (_) @args)*)? + (lambda_literal)? @trailing)) + => + (call_expr + function: {callee} + argument: {..args} + argument: {..trailing} + ) + ), + // ---- Guard statement ---- + // `guard let x = e else { ... }` — currently only handles the + // let-binding form. The Swift parser models the `let` keyword as a + // `value_binding_pattern` child of `condition`, followed by an + // unnamed `=` and the source expression. + rule!( + (guard_statement + bound_identifier: (simple_identifier) @id + condition: (value_binding_pattern) + condition: (_) @value + (else) + (statements) @else_branch) + => + (guard_if_stmt + condition: (let_pattern_condition + pattern: (var_pattern identifier: (identifier #{id})) + value: {value}) + else: {else_branch}) + ), + // ---- If statement ---- + // if-let binding (with optional else branch). The Swift parser puts + // the bound name in `bound_identifier`, the `let` keyword as a + // `value_binding_pattern` child of `condition`, and the source + // expression as a separate child of `condition`. + rule!( + (if_statement + bound_identifier: (simple_identifier) @id + condition: (value_binding_pattern) + condition: (_) @value + (statements) @then + (else) + (_) @else_branch) + => + (if_stmt + condition: (let_pattern_condition + pattern: (var_pattern identifier: (identifier #{id})) + value: {value}) + then: {then} + else: {else_branch}) + ), + rule!( + (if_statement + bound_identifier: (simple_identifier) @id + condition: (value_binding_pattern) + condition: (_) @value + (statements) @then) + => + (if_stmt + condition: (let_pattern_condition + pattern: (var_pattern identifier: (identifier #{id})) + value: {value}) + then: {then}) + ), + // With explicit else branch (block or chained if). + rule!( + (if_statement + condition: (_) @cond + (statements) @then + (else) + (_) @else_branch) + => + (if_stmt + condition: (expr_condition expr: {cond}) + then: {then} + else: {else_branch}) + ), + // Without else branch. + rule!( + (if_statement + condition: (_) @cond + (statements) @then) + => + (if_stmt + condition: (expr_condition expr: {cond}) + then: {then}) + ), // ---- Patterns ---- + // The Swift parser uses a `pattern` node with a `bound_identifier` + // field for simple bindings such as `let x = ...`. + rule!( + (pattern bound_identifier: (simple_identifier) @id) + => + (var_pattern + identifier: (identifier #{id})) + ), + // Inside tuple patterns, the inner `pattern` node holds a bare + // `simple_identifier` (with no `bound_identifier` field). + rule!( + (pattern (simple_identifier) @id) + => + (var_pattern + identifier: (identifier #{id})) + ), + // Tuple destructuring pattern, e.g. `let (a, b) = pair`. The parser + // emits a `pattern` node whose unnamed children are themselves + // `pattern` nodes. + rule!( + (pattern (pattern)+ @parts) + => + (tuple_pattern element: {..parts}) + ), + // ---- Variable declarations ---- + // Handles single (`let x = e`), multiple (`let x = 1, y = 2`), + // and uninitialized (`var x: T`) bindings. + rule!( + (property_declaration + name: (_)* @pats + value: (_)* @vals) + => + (variable_declaration_stmt + variable_declarator: {..pats.iter().enumerate().map(|(i, &pat)| { + match vals.get(i).copied() { + Some(val) => yeast::tree!( + (variable_declarator + pattern: {pat} + value: {val})), + None => yeast::tree!( + (variable_declarator + pattern: {pat})), + } + })}) + ), + // ---- Fallbacks ---- + rule!( + (_) + => + (unsupported_node) + ), + rule!( + _ @node => - (simple_identifier "blah") + {node} ), ] } -pub fn language_spec() -> simple::LanguageSpec { - let desugar = DesugaringConfig::new().add_phase("desugar", desugaring_rules()); +pub fn language_spec(desugared_ast_schema: &'static str) -> simple::LanguageSpec { + let desugar = DesugaringConfig::new() + .add_phase("translate", PhaseKind::OneShot, translation_rules()) + .with_output_node_types_yaml(desugared_ast_schema); simple::LanguageSpec { prefix: "swift", ts_language: tree_sitter_swift::LANGUAGE.into(), diff --git a/unified/extractor/src/main.rs b/unified/extractor/src/main.rs index e6721d4e2243..5a3407c37a29 100644 --- a/unified/extractor/src/main.rs +++ b/unified/extractor/src/main.rs @@ -3,6 +3,7 @@ use clap::Parser; mod autobuilder; mod extractor; mod generator; +mod languages; #[derive(Parser)] #[command(author, version, about)] diff --git a/unified/extractor/tests/corpus/swift/closures.txt b/unified/extractor/tests/corpus/swift/closures.txt new file mode 100644 index 000000000000..0afea480a19f --- /dev/null +++ b/unified/extractor/tests/corpus/swift/closures.txt @@ -0,0 +1,238 @@ +=== +Closure with explicit parameters +=== + +let f = { (x: Int) -> Int in x * 2 } + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "f" + value: + lambda_literal + statement: + multiplicative_expression + lhs: simple_identifier "x" + op: * + rhs: integer_literal "2" + type: + lambda_function_type + params: + lambda_function_type_parameters + parameter: + lambda_parameter + name: simple_identifier "x" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + +--- + +top_level + body: + +=== +Closure with shorthand parameters +=== + +let f = { $0 + $1 } + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "f" + value: + lambda_literal + statement: + additive_expression + lhs: simple_identifier "$0" + op: + + rhs: simple_identifier "$1" + +--- + +top_level + body: + +=== +Trailing closure +=== + +xs.map { $0 * 2 } + +--- + +source_file + statement: + call_expression + function: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "map" + target: simple_identifier "xs" + suffix: + call_suffix + lambda: + lambda_literal + statement: + multiplicative_expression + lhs: simple_identifier "$0" + op: * + rhs: integer_literal "2" + +--- + +top_level + body: + +=== +Closure with capture list +=== + +let f = { [weak self] in self?.doThing() } + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "f" + value: + lambda_literal + captures: + capture_list + item: + capture_list_item + name: simple_identifier "self" + ownership: + ownership_modifier + statement: + call_expression + function: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "doThing" + target: + optional_chain_marker + expr: + self_expression + suffix: + call_suffix + arguments: + value_arguments + +--- + +top_level + body: + +=== +Multi-statement closure +=== + +let f = { (x: Int) -> Int in + let y = x + 1 + return y * 2 +} + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "f" + value: + lambda_literal + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "y" + value: + additive_expression + lhs: simple_identifier "x" + op: + + rhs: integer_literal "1" + control_transfer_statement + kind: return + result: + multiplicative_expression + lhs: simple_identifier "y" + op: * + rhs: integer_literal "2" + type: + lambda_function_type + params: + lambda_function_type_parameters + parameter: + lambda_parameter + name: simple_identifier "x" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/collections.txt b/unified/extractor/tests/corpus/swift/collections.txt new file mode 100644 index 000000000000..afafc1e69ef2 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/collections.txt @@ -0,0 +1,311 @@ +=== +Array literal +=== + +let xs = [1, 2, 3] + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "xs" + value: + array_literal + element: + integer_literal "1" + integer_literal "2" + integer_literal "3" + +--- + +top_level + body: + +=== +Empty array literal with type +=== + +let xs: [Int] = [] + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "xs" + type: + type_annotation + type: + type + name: + array_type + element: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + value: + array_literal + +--- + +top_level + body: + +=== +Dictionary literal +=== + +let d = ["a": 1, "b": 2] + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "d" + value: + dictionary_literal + element: + dictionary_literal_item + key: + line_string_literal + text: line_str_text "a" + value: integer_literal "1" + dictionary_literal_item + key: + line_string_literal + text: line_str_text "b" + value: integer_literal "2" + +--- + +top_level + body: + +=== +Set literal +=== + +let s: Set = [1, 2, 3] + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "s" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + arguments: + type_arguments + argument: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + name: type_identifier "Set" + value: + array_literal + element: + integer_literal "1" + integer_literal "2" + integer_literal "3" + +--- + +top_level + body: + +=== +Tuple literal +=== + +let t = (1, "two", 3.0) + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "t" + value: + tuple_expression + element: + tuple_expression_item + value: integer_literal "1" + tuple_expression_item + value: + line_string_literal + text: line_str_text "two" + tuple_expression_item + value: real_literal "3.0" + +--- + +top_level + body: + +=== +Subscript access +=== + +// TODO: tree-sitter-swift parses `xs[0]` as a call_expression (same shape +// as `xs(0)`), so the mapping currently produces a call_expr. Update the +// parser / add a separate subscript_expr node and remap when fixed. +let first = xs[0] + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "first" + value: + call_expression + function: simple_identifier "xs" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "0" + comment "// TODO: tree-sitter-swift parses `xs[0]` as a call_expression (same shape" + comment "// as `xs(0)`), so the mapping currently produces a call_expr. Update the" + comment "// parser / add a separate subscript_expr node and remap when fixed." + +--- + +top_level + body: + unsupported_node "// TODO: tree-sitter-swift parses `xs[0]` as a call_expression (same shape" + unsupported_node "// as `xs(0)`), so the mapping currently produces a call_expr. Update the" + unsupported_node "// parser / add a separate subscript_expr node and remap when fixed." + +=== +Dictionary subscript +=== + +// TODO: same parser issue as the array subscript case above — +// `d["key"]` is parsed as `call_expression(d, ("key"))`. +let v = d["key"] + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "v" + value: + call_expression + function: simple_identifier "d" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: + line_string_literal + text: line_str_text "key" + comment "// TODO: same parser issue as the array subscript case above —" + comment "// `d[\"key\"]` is parsed as `call_expression(d, (\"key\"))`." + +--- + +top_level + body: + unsupported_node "// TODO: same parser issue as the array subscript case above —" + unsupported_node "// `d[\"key\"]` is parsed as `call_expression(d, (\"key\"))`." + +=== +Tuple member access +=== + +let n = t.0 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "n" + value: + navigation_expression + suffix: + navigation_suffix + suffix: integer_literal "0" + target: simple_identifier "t" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/control-flow.txt b/unified/extractor/tests/corpus/swift/control-flow.txt new file mode 100644 index 000000000000..600e1126cbff --- /dev/null +++ b/unified/extractor/tests/corpus/swift/control-flow.txt @@ -0,0 +1,447 @@ +=== +If statement +=== + +if x > 0 { + print(x) +} + +--- + +source_file + statement: + if_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "x" + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + +--- + +top_level + body: + +=== +If-else +=== + +if x > 0 { + print(x) +} else { + print(-x) +} + +--- + +source_file + statement: + if_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "x" + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + else_branch: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: + prefix_expression + operation: - + target: simple_identifier "x" + +--- + +top_level + body: + +=== +If-else-if chain +=== + +if x > 0 { + print(1) +} else if x < 0 { + print(2) +} else { + print(3) +} + +--- + +source_file + statement: + if_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "1" + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + else_branch: + if_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "2" + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: < + rhs: integer_literal "0" + else_branch: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "3" + +--- + +top_level + body: + +=== +If-let optional binding +=== + +if let value = optional { + print(value) +} + +--- + +source_file + statement: + if_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "value" + condition: + if_condition + kind: + if_let_binding + pattern: + pattern + binding: + value_binding_pattern + mutability: let + bound_identifier: simple_identifier "value" + value: simple_identifier "optional" + +--- + +top_level + body: + +=== +Guard let +=== + +guard let value = optional else { return } + +--- + +source_file + statement: + guard_statement + body: + block + statement: + control_transfer_statement + kind: return + condition: + if_condition + kind: + if_let_binding + pattern: + pattern + binding: + value_binding_pattern + mutability: let + bound_identifier: simple_identifier "value" + value: simple_identifier "optional" + +--- + +top_level + body: + +=== +Ternary expression +=== + +let y = x > 0 ? 1 : -1 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "y" + value: + ternary_expression + condition: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + if_false: + prefix_expression + operation: - + target: integer_literal "1" + if_true: integer_literal "1" + +--- + +top_level + body: + +=== +Switch statement +=== + +switch x { +case 1: + print("one") +case 2, 3: + print("two or three") +default: + print("other") +} + +--- + +source_file + statement: + switch_statement + entry: + switch_entry + pattern: + switch_pattern + pattern: + pattern + kind: integer_literal "1" + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: + line_string_literal + text: line_str_text "one" + switch_entry + pattern: + switch_pattern + pattern: + pattern + kind: integer_literal "2" + switch_pattern + pattern: + pattern + kind: integer_literal "3" + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: + line_string_literal + text: line_str_text "two or three" + switch_entry + default: default_keyword "default" + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: + line_string_literal + text: line_str_text "other" + expr: simple_identifier "x" + +--- + +top_level + body: + +=== +Switch with binding pattern +=== + +switch shape { +case .circle(let r): + print(r) +case .square(let s): + print(s) +} + +--- + +source_file + statement: + switch_statement + entry: + switch_entry + pattern: + switch_pattern + pattern: + pattern + kind: + case_pattern + arguments: + tuple_pattern + item: + tuple_pattern_item + pattern: + pattern + kind: + binding_pattern + binding: + value_binding_pattern + mutability: let + pattern: + pattern + bound_identifier: simple_identifier "r" + name: simple_identifier "circle" + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "r" + switch_entry + pattern: + switch_pattern + pattern: + pattern + kind: + case_pattern + arguments: + tuple_pattern + item: + tuple_pattern_item + pattern: + pattern + kind: + binding_pattern + binding: + value_binding_pattern + mutability: let + pattern: + pattern + bound_identifier: simple_identifier "s" + name: simple_identifier "square" + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "s" + expr: simple_identifier "shape" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/desugar.txt b/unified/extractor/tests/corpus/swift/desugar.txt new file mode 100644 index 000000000000..9f9ffeb070a8 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/desugar.txt @@ -0,0 +1,39 @@ +=== +Additive expression is desugared +=== + +1 + 2 + +--- + +source_file + statement: + additive_expression + lhs: integer_literal "1" + op: + + rhs: integer_literal "2" + +--- + +top_level + body: + +=== +Another additive expression is desugared +=== + +foo + bar + +--- + +source_file + statement: + additive_expression + lhs: simple_identifier "foo" + op: + + rhs: simple_identifier "bar" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/functions.txt b/unified/extractor/tests/corpus/swift/functions.txt new file mode 100644 index 000000000000..0a8210a4cf76 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/functions.txt @@ -0,0 +1,389 @@ +=== +Function with no parameters +=== + +func greet() { + print("hello") +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: + line_string_literal + text: line_str_text "hello" + name: simple_identifier "greet" + +--- + +top_level + body: + +=== +Function with parameters and return type +=== + +func add(_ a: Int, _ b: Int) -> Int { + return a + b +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + control_transfer_statement + kind: return + result: + additive_expression + lhs: simple_identifier "a" + op: + + rhs: simple_identifier "b" + name: simple_identifier "add" + parameter: + function_parameter + parameter: + parameter + external_name: simple_identifier "_" + name: simple_identifier "a" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + function_parameter + parameter: + parameter + external_name: simple_identifier "_" + name: simple_identifier "b" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + +--- + +top_level + body: + +=== +Function with named parameters +=== + +func greet(person name: String) { + print(name) +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "name" + name: simple_identifier "greet" + parameter: + function_parameter + parameter: + parameter + external_name: simple_identifier "person" + name: simple_identifier "name" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "String" + +--- + +top_level + body: + +=== +Function with default parameter value +=== + +func greet(name: String = "world") { + print(name) +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "name" + name: simple_identifier "greet" + parameter: + function_parameter + default_value: + line_string_literal + text: line_str_text "world" + parameter: + parameter + name: simple_identifier "name" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "String" + +--- + +top_level + body: + +=== +Variadic function +=== + +func sum(_ values: Int...) -> Int { + return values.reduce(0, +) +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + control_transfer_statement + kind: return + result: + call_expression + function: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "reduce" + target: simple_identifier "values" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "0" + value_argument + value: + referenceable_operator + operator: + + name: simple_identifier "sum" + parameter: + function_parameter + parameter: + parameter + external_name: simple_identifier "_" + name: simple_identifier "values" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + +--- + +top_level + body: + +=== +Function call +=== + +foo(1, 2) + +--- + +source_file + statement: + call_expression + function: simple_identifier "foo" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "1" + value_argument + value: integer_literal "2" + +--- + +top_level + body: + +=== +Function call with labelled arguments +=== + +greet(person: "Bob") + +--- + +source_file + statement: + call_expression + function: simple_identifier "greet" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + name: + value_argument_label + name: simple_identifier "person" + value: + line_string_literal + text: line_str_text "Bob" + +--- + +top_level + body: + +=== +Method call +=== + +list.append(1) + +--- + +source_file + statement: + call_expression + function: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "append" + target: simple_identifier "list" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: integer_literal "1" + +--- + +top_level + body: + +=== +Generic function +=== + +func identity(_ x: T) -> T { + return x +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + control_transfer_statement + kind: return + result: simple_identifier "x" + name: simple_identifier "identity" + parameter: + function_parameter + parameter: + parameter + external_name: simple_identifier "_" + name: simple_identifier "x" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "T" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "T" + type_parameters: + type_parameters + parameter: + type_parameter + name: type_identifier "T" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/literals.txt b/unified/extractor/tests/corpus/swift/literals.txt new file mode 100644 index 000000000000..5044831a869b --- /dev/null +++ b/unified/extractor/tests/corpus/swift/literals.txt @@ -0,0 +1,124 @@ +=== +Integer literal +=== + +42 + +--- + +source_file + statement: integer_literal "42" + +--- + +top_level + body: + +=== +Negative integer literal +=== + +-7 + +--- + +source_file + statement: + prefix_expression + operation: - + target: integer_literal "7" + +--- + +top_level + body: + +=== +Floating-point literal +=== + +3.14 + +--- + +source_file + statement: real_literal "3.14" + +--- + +top_level + body: + +=== +Boolean literals +=== + +true +false + +--- + +source_file + statement: + boolean_literal + boolean_literal + +--- + +top_level + body: + +=== +Nil literal +=== + +nil + +--- + +source_file + statement: nil + +--- + +top_level + body: + +=== +String literal +=== + +"hello" + +--- + +source_file + statement: + line_string_literal + text: line_str_text "hello" + +--- + +top_level + body: + +=== +String with interpolation +=== + +"hello \(name)" + +--- + +source_file + statement: + line_string_literal + interpolation: + interpolated_expression + value: simple_identifier "name" + text: line_str_text "hello " + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/loops.txt b/unified/extractor/tests/corpus/swift/loops.txt new file mode 100644 index 000000000000..8b9f3410d35d --- /dev/null +++ b/unified/extractor/tests/corpus/swift/loops.txt @@ -0,0 +1,254 @@ +=== +For-in over array literal +=== + +for x in [1, 2, 3] { + print(x) +} + +--- + +source_file + statement: + for_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "x" + collection: + array_literal + element: + integer_literal "1" + integer_literal "2" + integer_literal "3" + item: + pattern + bound_identifier: simple_identifier "x" + +--- + +top_level + body: + +=== +For-in over range +=== + +for i in 0..<10 { + print(i) +} + +--- + +source_file + statement: + for_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "i" + collection: + range_expression + end: integer_literal "10" + op: ..< + start: integer_literal "0" + item: + pattern + bound_identifier: simple_identifier "i" + +--- + +top_level + body: + +=== +For-in with where clause +=== + +for x in xs where x > 0 { + print(x) +} + +--- + +source_file + statement: + for_statement + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "x" + collection: simple_identifier "xs" + item: + pattern + bound_identifier: simple_identifier "x" + where: + where_clause + expr: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + keyword: where_keyword "where" + +--- + +top_level + body: + +=== +While loop +=== + +while x > 0 { + x -= 1 +} + +--- + +source_file + statement: + while_statement + body: + block + statement: + assignment + operator: -= + result: integer_literal "1" + target: + directly_assignable_expression + expr: simple_identifier "x" + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + +--- + +top_level + body: + +=== +Repeat-while loop +=== + +repeat { + x -= 1 +} while x > 0 + +--- + +source_file + statement: + repeat_while_statement + body: + block + statement: + assignment + operator: -= + result: integer_literal "1" + target: + directly_assignable_expression + expr: simple_identifier "x" + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "0" + +--- + +top_level + body: + +=== +Break and continue +=== + +for x in xs { + if x < 0 { continue } + if x > 100 { break } + print(x) +} + +--- + +source_file + statement: + for_statement + body: + block + statement: + if_statement + body: + block + statement: + control_transfer_statement + kind: continue + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: < + rhs: integer_literal "0" + if_statement + body: + block + statement: + control_transfer_statement + kind: break + condition: + if_condition + kind: + comparison_expression + lhs: simple_identifier "x" + op: > + rhs: integer_literal "100" + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "x" + collection: simple_identifier "xs" + item: + pattern + bound_identifier: simple_identifier "x" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/operators.txt b/unified/extractor/tests/corpus/swift/operators.txt new file mode 100644 index 000000000000..f1a4a5fcdb26 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/operators.txt @@ -0,0 +1,250 @@ +=== +Addition +=== + +a + b + +--- + +source_file + statement: + additive_expression + lhs: simple_identifier "a" + op: + + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Subtraction +=== + +a - b + +--- + +source_file + statement: + additive_expression + lhs: simple_identifier "a" + op: - + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Multiplication +=== + +a * b + +--- + +source_file + statement: + multiplicative_expression + lhs: simple_identifier "a" + op: * + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Division +=== + +a / b + +--- + +source_file + statement: + multiplicative_expression + lhs: simple_identifier "a" + op: / + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Operator precedence: addition and multiplication +=== + +a + b * c + +--- + +source_file + statement: + additive_expression + lhs: simple_identifier "a" + op: + + rhs: + multiplicative_expression + lhs: simple_identifier "b" + op: * + rhs: simple_identifier "c" + +--- + +top_level + body: + +=== +Parenthesised expression +=== + +(a + b) * c + +--- + +source_file + statement: + multiplicative_expression + lhs: + tuple_expression + element: + tuple_expression_item + value: + additive_expression + lhs: simple_identifier "a" + op: + + rhs: simple_identifier "b" + op: * + rhs: simple_identifier "c" + +--- + +top_level + body: + +=== +Comparison +=== + +a < b + +--- + +source_file + statement: + comparison_expression + lhs: simple_identifier "a" + op: < + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Equality +=== + +a == b + +--- + +source_file + statement: + equality_expression + lhs: simple_identifier "a" + op: == + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Logical and +=== + +a && b + +--- + +source_file + statement: + conjunction_expression + lhs: simple_identifier "a" + op: && + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Logical or +=== + +a || b + +--- + +source_file + statement: + disjunction_expression + lhs: simple_identifier "a" + op: || + rhs: simple_identifier "b" + +--- + +top_level + body: + +=== +Logical not +=== + +!a + +--- + +source_file + statement: + prefix_expression + operation: bang "!" + target: simple_identifier "a" + +--- + +top_level + body: + +=== +Range operator +=== + +1...10 + +--- + +source_file + statement: + range_expression + end: integer_literal "10" + op: ... + start: integer_literal "1" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors.txt b/unified/extractor/tests/corpus/swift/optionals-and-errors.txt new file mode 100644 index 000000000000..572e9181a681 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors.txt @@ -0,0 +1,290 @@ +=== +Optional type annotation +=== + +let x: Int? = nil + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + type: + type_annotation + type: + type + name: + optional_type + wrapped: + user_type + part: + simple_user_type + name: type_identifier "Int" + value: nil + +--- + +top_level + body: + +=== +Optional chaining +=== + +let n = obj?.foo?.bar + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "n" + value: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "bar" + target: + optional_chain_marker + expr: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "foo" + target: + optional_chain_marker + expr: simple_identifier "obj" + +--- + +top_level + body: + +=== +Force unwrap +=== + +let n = opt! + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "n" + value: + postfix_expression + operation: bang "!" + target: simple_identifier "opt" + +--- + +top_level + body: + +=== +Nil-coalescing +=== + +let n = opt ?? 0 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "n" + value: + nil_coalescing_expression + if_nil: integer_literal "0" + value: simple_identifier "opt" + +--- + +top_level + body: + +=== +Throwing function +=== + +func read() throws -> String { + return "" +} + +--- + +source_file + statement: + function_declaration + body: + block + statement: + control_transfer_statement + kind: return + result: + line_string_literal + name: simple_identifier "read" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "String" + throws: throws "throws" + +--- + +top_level + body: + +=== +Do-catch +=== + +do { + try foo() +} catch { + print(error) +} + +--- + +source_file + statement: + do_statement + body: + block + statement: + try_expression + expr: + call_expression + function: simple_identifier "foo" + suffix: + call_suffix + arguments: + value_arguments + operator: + try_operator + catch: + catch_block + body: + block + statement: + call_expression + function: simple_identifier "print" + suffix: + call_suffix + arguments: + value_arguments + argument: + value_argument + value: simple_identifier "error" + keyword: catch_keyword "catch" + +--- + +top_level + body: + +=== +Try? expression +=== + +let result = try? foo() + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "result" + value: + try_expression + expr: + call_expression + function: simple_identifier "foo" + suffix: + call_suffix + arguments: + value_arguments + operator: + try_operator + +--- + +top_level + body: + +=== +Try! expression +=== + +let result = try! foo() + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "result" + value: + try_expression + expr: + call_expression + function: simple_identifier "foo" + suffix: + call_suffix + arguments: + value_arguments + operator: + try_operator + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/types.txt b/unified/extractor/tests/corpus/swift/types.txt new file mode 100644 index 000000000000..0bebaa1238f3 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types.txt @@ -0,0 +1,641 @@ +=== +Empty class +=== + +class Foo {} + +--- + +source_file + statement: + class_declaration + body: + class_body + declaration_kind: class + name: type_identifier "Foo" + +--- + +top_level + body: + +=== +Class with stored properties +=== + +class Point { + var x: Int + var y: Int +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "y" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + declaration_kind: class + name: type_identifier "Point" + +--- + +top_level + body: + +=== +Class with initializer +=== + +class Point { + var x: Int + init(x: Int) { + self.x = x + } +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + init_declaration + body: + block + statement: + assignment + operator: = + result: simple_identifier "x" + target: + directly_assignable_expression + expr: + navigation_expression + suffix: + navigation_suffix + suffix: simple_identifier "x" + target: + self_expression + parameter: + function_parameter + parameter: + parameter + name: simple_identifier "x" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + declaration_kind: class + name: type_identifier "Point" + +--- + +top_level + body: + +=== +Class with method +=== + +class Counter { + var n = 0 + func bump() { + n += 1 + } +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "n" + value: integer_literal "0" + function_declaration + body: + block + statement: + assignment + operator: += + result: integer_literal "1" + target: + directly_assignable_expression + expr: simple_identifier "n" + name: simple_identifier "bump" + declaration_kind: class + name: type_identifier "Counter" + +--- + +top_level + body: + +=== +Class inheritance +=== + +class Dog: Animal {} + +--- + +source_file + statement: + class_declaration + body: + class_body + declaration_kind: class + inherits: + inheritance_specifier + inherits_from: + user_type + part: + simple_user_type + name: type_identifier "Animal" + name: type_identifier "Dog" + +--- + +top_level + body: + +=== +Struct +=== + +struct Point { + let x: Int + let y: Int +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "y" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + declaration_kind: struct + name: type_identifier "Point" + +--- + +top_level + body: + +=== +Enum with cases +=== + +enum Direction { + case north + case south + case east + case west +} + +--- + +source_file + statement: + class_declaration + body: + enum_class_body + member: + enum_entry + case: + enum_case_entry + name: simple_identifier "north" + enum_entry + case: + enum_case_entry + name: simple_identifier "south" + enum_entry + case: + enum_case_entry + name: simple_identifier "east" + enum_entry + case: + enum_case_entry + name: simple_identifier "west" + declaration_kind: enum + name: type_identifier "Direction" + +--- + +top_level + body: + +=== +Enum with associated values +=== + +enum Shape { + case circle(radius: Double) + case square(side: Double) +} + +--- + +source_file + statement: + class_declaration + body: + enum_class_body + member: + enum_entry + case: + enum_case_entry + data_contents: + enum_type_parameters + parameter: + enum_type_parameter + name: simple_identifier "radius" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Double" + name: simple_identifier "circle" + enum_entry + case: + enum_case_entry + data_contents: + enum_type_parameters + parameter: + enum_type_parameter + name: simple_identifier "side" + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Double" + name: simple_identifier "square" + declaration_kind: enum + name: type_identifier "Shape" + +--- + +top_level + body: + +=== +Protocol declaration +=== + +protocol Drawable { + func draw() +} + +--- + +source_file + statement: + protocol_declaration + body: + protocol_body + member: + protocol_function_declaration + name: simple_identifier "draw" + name: type_identifier "Drawable" + +--- + +top_level + body: + +=== +Extension +=== + +extension Int { + func squared() -> Int { return self * self } +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + function_declaration + body: + block + statement: + control_transfer_statement + kind: return + result: + multiplicative_expression + lhs: + self_expression + op: * + rhs: + self_expression + name: simple_identifier "squared" + return_type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + declaration_kind: extension + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + +--- + +top_level + body: + +=== +Computed property +=== + +class Rect { + var w: Double + var h: Double + var area: Double { + return w * h + } +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "w" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Double" + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "h" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Double" + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + computed_value: + computed_property + statement: + control_transfer_statement + kind: return + result: + multiplicative_expression + lhs: simple_identifier "w" + op: * + rhs: simple_identifier "h" + name: + pattern + bound_identifier: simple_identifier "area" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Double" + declaration_kind: class + name: type_identifier "Rect" + +--- + +top_level + body: + +=== +Property with getter and setter +=== + +class Box { + private var _v = 0 + var v: Int { + get { return _v } + set { _v = newValue } + } +} + +--- + +source_file + statement: + class_declaration + body: + class_body + member: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "_v" + value: integer_literal "0" + modifiers: + modifiers + modifier: + visibility_modifier + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + computed_value: + computed_property + accessor: + computed_getter + body: + block + statement: + control_transfer_statement + kind: return + result: simple_identifier "_v" + specifier: + getter_specifier + computed_setter + body: + block + statement: + assignment + operator: = + result: simple_identifier "newValue" + target: + directly_assignable_expression + expr: simple_identifier "_v" + specifier: + setter_specifier + name: + pattern + bound_identifier: simple_identifier "v" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + declaration_kind: class + name: type_identifier "Box" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus/swift/variables.txt b/unified/extractor/tests/corpus/swift/variables.txt new file mode 100644 index 000000000000..1911ddd02b1e --- /dev/null +++ b/unified/extractor/tests/corpus/swift/variables.txt @@ -0,0 +1,231 @@ +=== +Let binding +=== + +let x = 1 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + value: integer_literal "1" + +--- + +top_level + body: + +=== +Var binding +=== + +var x = 1 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + value: integer_literal "1" + +--- + +top_level + body: + +=== +Let with type annotation +=== + +let x: Int = 1 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + value: integer_literal "1" + +--- + +top_level + body: + +=== +Var without initialiser +=== + +var x: Int + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: var + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + type: + type_annotation + type: + type + name: + user_type + part: + simple_user_type + name: type_identifier "Int" + +--- + +top_level + body: + +=== +Tuple destructuring binding +=== + +let (a, b) = pair + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + kind: + tuple_pattern + item: + tuple_pattern_item + pattern: + pattern + kind: simple_identifier "a" + tuple_pattern_item + pattern: + pattern + kind: simple_identifier "b" + value: simple_identifier "pair" + +--- + +top_level + body: + +=== +Multiple bindings on one line +=== + +let x = 1, y = 2 + +--- + +source_file + statement: + property_declaration + binding: + value_binding_pattern + mutability: let + declarator: + property_binding + name: + pattern + bound_identifier: simple_identifier "x" + value: integer_literal "1" + property_binding + name: + pattern + bound_identifier: simple_identifier "y" + value: integer_literal "2" + +--- + +top_level + body: + +=== +Assignment +=== + +x = 1 + +--- + +source_file + statement: + assignment + operator: = + result: integer_literal "1" + target: + directly_assignable_expression + expr: simple_identifier "x" + +--- + +top_level + body: + +=== +Compound assignment +=== + +x += 1 + +--- + +source_file + statement: + assignment + operator: += + result: integer_literal "1" + target: + directly_assignable_expression + expr: simple_identifier "x" + +--- + +top_level + body: diff --git a/unified/extractor/tests/corpus_tests.rs b/unified/extractor/tests/corpus_tests.rs new file mode 100644 index 000000000000..0f1057a8e5b9 --- /dev/null +++ b/unified/extractor/tests/corpus_tests.rs @@ -0,0 +1,293 @@ +use std::fs; +use std::path::Path; + +use codeql_extractor::extractor::simple; +use yeast::{dump::dump_ast, dump::dump_ast_with_type_errors, Runner}; + +#[path = "../src/languages/mod.rs"] +mod languages; + +#[derive(Debug)] +struct CorpusCase { + name: String, + input: String, + raw: String, + expected: String, +} + +fn update_mode_enabled() -> bool { + std::env::var("UNIFIED_UPDATE_CORPUS") + .map(|v| matches!(v.to_ascii_lowercase().as_str(), "1" | "true" | "yes" | "on")) + .unwrap_or(false) +} + +fn is_header_rule(line: &str) -> bool { + let trimmed = line.trim(); + trimmed.len() >= 3 && trimmed.chars().all(|c| c == '=') +} + +fn is_next_case_header(lines: &[&str], i: usize) -> bool { + is_header_rule(lines[i]) + && i + 2 < lines.len() + && !lines[i + 1].trim().is_empty() + && is_header_rule(lines[i + 2]) +} + +fn parse_corpus(content: &str) -> Vec { + let lines: Vec<&str> = content.lines().collect(); + let mut i = 0; + let mut cases = Vec::new(); + + while i < lines.len() { + while i < lines.len() && lines[i].trim().is_empty() { + i += 1; + } + if i >= lines.len() { + break; + } + + assert!( + is_header_rule(lines[i]), + "Expected header delimiter at line {}", + i + 1 + ); + i += 1; + + assert!(i < lines.len(), "Missing test name at line {}", i + 1); + let name = lines[i].trim().to_string(); + i += 1; + + assert!( + i < lines.len() && is_header_rule(lines[i]), + "Missing closing header delimiter for case {name}" + ); + i += 1; + + let input_start = i; + while i < lines.len() && lines[i].trim() != "---" { + if is_next_case_header(&lines, i) { + break; + } + i += 1; + } + let input = lines[input_start..i].join("\n").trim_end().to_string(); + let raw; + let expected; + if i >= lines.len() || lines[i].trim() != "---" { + // No `---` separator before next case (or EOF). Treat the + // remaining sections as empty. + raw = String::new(); + expected = String::new(); + } else { + i += 1; + + // Raw tree-sitter parse section. New-format files have a second + // `---` separator between the raw tree and the mapped AST. Legacy + // files (with only one separator) have no raw section — in that + // case `raw` stays empty and update mode will populate it. + let raw_start = i; + let mut next_sep = i; + while next_sep < lines.len() && lines[next_sep].trim() != "---" { + if is_next_case_header(&lines, next_sep) { + break; + } + next_sep += 1; + } + raw = if next_sep < lines.len() && lines[next_sep].trim() == "---" { + let raw_text = lines[raw_start..next_sep].join("\n").trim().to_string(); + i = next_sep + 1; + raw_text + } else { + String::new() + }; + + let expected_start = i; + while i < lines.len() { + if is_next_case_header(&lines, i) { + break; + } + i += 1; + } + expected = lines[expected_start..i].join("\n").trim().to_string(); + } + + cases.push(CorpusCase { + name, + input, + raw, + expected, + }); + } + + cases +} + +fn render_corpus(cases: &[CorpusCase]) -> String { + let mut out = String::new(); + + for (idx, case) in cases.iter().enumerate() { + if idx > 0 { + // Blank line between cases. + out.push('\n'); + } + out.push_str("===\n"); + out.push_str(case.name.trim()); + out.push_str("\n===\n\n"); + out.push_str(case.input.trim()); + out.push_str("\n\n---\n\n"); + out.push_str(case.raw.trim()); + out.push_str("\n\n---\n\n"); + out.push_str(case.expected.trim()); + // Single trailing newline per case; the inter-case blank line is + // added by the prefix above, and the file ends with exactly one `\n`. + out.push('\n'); + } + + out +} + +fn run_desugaring( + lang: &simple::LanguageSpec, + input: &str, +) -> Result { + let runner = match lang.desugar.as_ref() { + Some(config) => Runner::from_config(lang.ts_language.clone(), config) + .map_err(|e| format!("Failed to create yeast runner: {e}"))?, + None => Runner::new(lang.ts_language.clone(), &[]), + }; + + runner + .run(input) + .map_err(|e| format!("Failed to parse input: {e}")) +} + +/// Produce the raw tree-sitter parse tree dump for `input`, with no +/// desugaring rules applied. Uses a `Runner` with an empty phase list and +/// the input grammar's own schema. +fn dump_raw_parse( + lang: &simple::LanguageSpec, + input: &str, +) -> Result { + let runner = Runner::new(lang.ts_language.clone(), &[]); + let ast = runner + .run(input) + .map_err(|e| format!("Failed to parse input: {e}"))?; + Ok(dump_ast(&ast, ast.get_root(), input)) +} + +#[test] +fn test_corpus() { + let update_mode = update_mode_enabled(); + let all_languages = languages::all_language_specs(); + let corpus_dir = Path::new("tests/corpus"); + + for lang in all_languages { + let output_schema = yeast::node_types_yaml::schema_from_yaml_with_language( + languages::OUTPUT_AST_SCHEMA, + &lang.ts_language, + ) + .expect("Failed to parse OUTPUT_AST_SCHEMA YAML"); + + let lang_corpus_dir = corpus_dir.join(&lang.prefix); + if !lang_corpus_dir.exists() { + continue; + } + + let mut corpus_files: Vec<_> = fs::read_dir(&lang_corpus_dir) + .unwrap_or_else(|e| { + panic!( + "Failed to read corpus directory {}: {e}", + lang_corpus_dir.display() + ) + }) + .map(|entry| entry.expect("Failed to read corpus entry").path()) + .filter(|path| path.extension().is_some_and(|ext| ext == "txt")) + .collect(); + corpus_files.sort(); + + for corpus_path in corpus_files { + let content = fs::read_to_string(&corpus_path) + .unwrap_or_else(|e| panic!("Failed to read {}: {e}", corpus_path.display())); + let mut cases = parse_corpus(&content); + let mut failures = Vec::new(); + assert!( + !cases.is_empty(), + "No corpus cases found in {}", + corpus_path.display() + ); + + for case in &mut cases { + match dump_raw_parse(&lang, &case.input) { + Err(e) => { + failures.push(format!( + "Raw parse failed for {} in {}: {}", + case.name, + corpus_path.display(), + e + )); + } + Ok(actual_raw) => { + if update_mode { + case.raw = actual_raw.trim().to_string(); + } else if case.raw.trim() != actual_raw.trim() { + failures.push(format!( + "Raw parse mismatch in {}: \"{}\"\nEXPECTED:\n\n{}\n\nACTUAL:\n\n{}", + corpus_path.display(), + case.name, + case.raw.trim(), + actual_raw.trim() + )); + } + } + } + + match run_desugaring(&lang, &case.input) { + Err(e) => { + failures.push(format!( + "Desugaring failed for {} in {}: {}", + case.name, + corpus_path.display(), + e + )); + } + Ok(actual) => { + let actual_dump = dump_ast_with_type_errors( + &actual, + actual.get_root(), + &case.input, + &output_schema, + ); + if update_mode { + case.expected = actual_dump.trim().to_string(); + } else if case.expected.trim() != actual_dump.trim() { + failures.push(format!( + "Test failed in {}: \"{}\"\nEXPECTED:\n\n{}\n\nACTUAL:\n\n{}", + corpus_path.display(), + case.name, + case.expected.trim(), + actual_dump.trim() + )); + } + } + } + } + + assert!( + failures.is_empty(), + "{}", + failures.join("\n\n") + "\n\n" + ); + + if update_mode { + let updated = render_corpus(&cases); + let write_result = fs::write(&corpus_path, updated); + assert!( + write_result.is_ok(), + "Failed to update corpus file {}: {}", + corpus_path.display(), + write_result.err().map_or_else(String::new, |e| e.to_string()) + ); + } + } + } +} diff --git a/unified/extractor/tree-sitter-swift/grammar.js b/unified/extractor/tree-sitter-swift/grammar.js index 5dbfd7fdbbf2..1e63a7eaabb8 100644 --- a/unified/extractor/tree-sitter-swift/grammar.js +++ b/unified/extractor/tree-sitter-swift/grammar.js @@ -97,7 +97,7 @@ module.exports = grammar({ [$.attribute], [$._attribute_argument], // Is `foo { ... }` a constructor invocation or function invocation? - [$._simple_user_type, $.expression], + [$.simple_user_type, $.expression], // To support nested types A.B not being interpreted as `(navigation_expression ... (type_identifier)) (navigation_suffix)` [$.user_type], // How to tell the difference between Foo.bar(with:and:), and Foo.bar(with: smth, and: other)? You need GLR @@ -105,8 +105,8 @@ module.exports = grammar({ // { (foo, bar) ... [$.expression, $.lambda_parameter], [$._primary_expression, $.lambda_parameter], - // (start: start, end: end) - [$._tuple_type_item_identifier, $.tuple_expression], + // (foo) where foo could be a binding pattern or a tuple expression item. + [$._binding_pattern_with_expr, $.tuple_expression_item], // After a `{` in a function or switch context, it's ambigous whether we're starting a set of local statements or // applying some modifiers to a capture or pattern. [$.modifiers], @@ -116,7 +116,7 @@ module.exports = grammar({ [$.referenceable_operator, $._prefix_unary_operator], // `{ [self, b, c] ...` could be a capture list or an array literal depending on what else happens. [$.capture_list_item, $.expression], - [$.capture_list_item, $.expression, $._simple_user_type], + [$.capture_list_item, $.expression, $.simple_user_type], [$._primary_expression, $.capture_list_item], // a ? b : c () could be calling c(), or it could be calling a function that's produced by the result of // `(a ? b : c)`. We have a small hack to force it to be the former of these by intentionally introducing a @@ -146,7 +146,7 @@ module.exports = grammar({ [$._bodyless_function_declaration, $.property_modifier], [$.init_declaration, $.property_modifier], // Patterns, man - [$._navigable_type_expression, $._case_pattern], + [$._navigable_type_expression, $.case_pattern], [$._no_expr_pattern_already_bound, $._binding_pattern_no_expr], // On encountering a closure starting with `{ @Foo ...`, we don't yet know if that attribute applies to the closure @@ -194,7 +194,7 @@ module.exports = grammar({ // `/*`, and decrement it whenever we see `*/`. A standard grammar would only be able to exit the comment at the // first `*/` (like C does). Similarly, when you start a string with `##"`, you're required to include the same // number of `#` symbols to end it. - $.multiline_comment, + $._multiline_comment, $.raw_str_part, $.raw_str_continuing_indicator, $.raw_str_end_part, @@ -255,11 +255,11 @@ module.exports = grammar({ //////////////////////////////// source_file: ($) => seq( - optional($.shebang_line), + optional(field("shebang", $.shebang_line)), optional( seq( - $._top_level_statement, - repeat(seq($._semi, $._top_level_statement)), + field("statement", $._top_level_statement), + repeat(seq($._semi, field("statement", $._top_level_statement))), optional($._semi) ) ) @@ -270,6 +270,11 @@ module.exports = grammar({ // Lexical Structure - https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html //////////////////////////////// comment: ($) => token(prec(PRECS.comment, seq("//", /.*/))), + // Named wrapper for the unnamed `_multiline_comment` external token, so + // that multi-line comments still appear in the AST (e.g. as extras between + // top-level statements) without being extracted as class body members when + // used only to separate those members. + multiline_comment: ($) => $._multiline_comment, // Identifiers simple_identifier: ($) => choice( @@ -291,7 +296,7 @@ module.exports = grammar({ "package", $._parameter_ownership_modifier ), - identifier: ($) => sep1($.simple_identifier, $._dot), + identifier: ($) => sep1(field("part", $.simple_identifier), $._dot), // Literals _basic_literal: ($) => choice( @@ -355,13 +360,13 @@ module.exports = grammar({ seq( field("text", $.raw_str_part), field("interpolation", $.raw_str_interpolation), - optional($.raw_str_continuing_indicator) + field("continuing", optional($.raw_str_continuing_indicator)) ) ), field("text", $.raw_str_end_part) ), raw_str_interpolation: ($) => - seq($.raw_str_interpolation_start, $._interpolation_contents, ")"), + seq(field("start", $.raw_str_interpolation_start), $._interpolation_contents, ")"), raw_str_interpolation_start: ($) => /\\#*\(/, _multi_line_string_content: ($) => choice($.multi_line_str_text, $.str_escaped_char, '"'), @@ -410,7 +415,7 @@ module.exports = grammar({ _possibly_implicitly_unwrapped_type: ($) => choice($.type, $.implicitly_unwrapped_type), implicitly_unwrapped_type: ($) => - seq($.type, token.immediate("!")), + seq(field("name", $.type), token.immediate("!")), type: ($) => prec.right( PRECS.ty, @@ -436,13 +441,13 @@ module.exports = grammar({ ) ), // The grammar just calls this whole thing a `type-identifier` but that's a bit confusing. - user_type: ($) => sep1($._simple_user_type, $._dot), - _simple_user_type: ($) => + user_type: ($) => sep1(field("part", $.simple_user_type), $._dot), + simple_user_type: ($) => prec.right( PRECS.ty, seq( - alias($.simple_identifier, $.type_identifier), - optional($.type_arguments) + field("name", alias($.simple_identifier, $.type_identifier)), + field("arguments", optional($.type_arguments)) ) ), tuple_type: ($) => @@ -452,14 +457,14 @@ module.exports = grammar({ optional(sep1Opt(field("element", $.tuple_type_item), ",")), ")" ), - alias($._parenthesized_type, $.tuple_type_item) + field("element", alias($.parenthesized_type, $.tuple_type_item)) ), tuple_type_item: ($) => prec( PRECS.expr, seq( optional($._tuple_type_item_identifier), - optional($.parameter_modifiers), + field("modifiers", optional($.parameter_modifiers)), field("type", $.type) ) ), @@ -467,7 +472,7 @@ module.exports = grammar({ prec( PRECS.expr, seq( - optional($.wildcard_pattern), + optional(field("external_name", $.wildcard_pattern)), field("name", $.simple_identifier), ":" ) @@ -475,8 +480,8 @@ module.exports = grammar({ function_type: ($) => seq( field("params", choice($.tuple_type, $.unannotated_type)), - optional($._async_keyword), - optional(choice($.throws_clause, $.throws)), + field("async", optional($._async_keyword)), + field("throws", optional(choice($.throws_clause, $.throws))), $._arrow_operator, field("return_type", $.type) ), @@ -493,18 +498,18 @@ module.exports = grammar({ repeat1(alias($._immediate_quest, "?")) ) ), - metatype: ($) => seq($.unannotated_type, ".", choice("Type", "Protocol")), + metatype: ($) => seq(field("name", $.unannotated_type), ".", choice("Type", "Protocol")), _quest: ($) => "?", _immediate_quest: ($) => token.immediate("?"), - opaque_type: ($) => prec.right(seq("some", $.unannotated_type)), - existential_type: ($) => prec.right(seq("any", $.unannotated_type)), - type_parameter_pack: ($) => prec.left(seq("each", $.unannotated_type)), - type_pack_expansion: ($) => prec.left(seq("repeat", $.unannotated_type)), + opaque_type: ($) => prec.right(seq("some", field("name", $.unannotated_type))), + existential_type: ($) => prec.right(seq("any", field("name", $.unannotated_type))), + type_parameter_pack: ($) => prec.left(seq("each", field("name", $.unannotated_type))), + type_pack_expansion: ($) => prec.left(seq("repeat", field("name", $.unannotated_type))), protocol_composition_type: ($) => prec.left( seq( - $.unannotated_type, - repeat1(seq("&", prec.right($.unannotated_type))) + field("type", $.unannotated_type), + repeat1(seq("&", prec.right(field("type", $.unannotated_type)))) ) ), suppressed_constraint: ($) => @@ -535,7 +540,7 @@ module.exports = grammar({ ) ), optional_chain_marker: ($) => - seq($.expression, alias($._immediate_quest, "?")), + seq(field("expr", $.expression), alias($._immediate_quest, "?")), // Unary expressions _unary_expression: ($) => choice( @@ -568,13 +573,13 @@ module.exports = grammar({ "constructed_type", choice($.array_type, $.dictionary_type, $.user_type) ), - $.constructor_suffix + field("suffix", $.constructor_suffix) ) ), - _parenthesized_type: ($) => + parenthesized_type: ($) => seq( "(", - choice($.opaque_type, $.existential_type, $.dictionary_type), + field("type", choice($.opaque_type, $.existential_type, $.dictionary_type)), ")" ), navigation_expression: ($) => @@ -586,7 +591,7 @@ module.exports = grammar({ choice( $._navigable_type_expression, $.expression, - $._parenthesized_type + $.parenthesized_type ) ), field("suffix", $.navigation_suffix) @@ -626,7 +631,7 @@ module.exports = grammar({ as_expression: ($) => prec.left( PRECS.as, - seq(field("expr", $.expression), $.as_operator, field("type", $.type)) + seq(field("expr", $.expression), field("operator", $.as_operator), field("type", $.type)) ), selector_expression: ($) => seq( @@ -634,7 +639,7 @@ module.exports = grammar({ "selector", "(", optional(choice("getter:", "setter:")), - $.expression, + field("expr", $.expression), ")" ), // Binary expressions @@ -760,49 +765,49 @@ module.exports = grammar({ prec( PRECS.call_suffix, choice( - $.value_arguments, + field("arguments", $.value_arguments), prec.dynamic(-1, $._fn_call_lambda_arguments), // Prefer to treat `foo() { }` as one call not two - seq($.value_arguments, $._fn_call_lambda_arguments) + seq(field("arguments", $.value_arguments), $._fn_call_lambda_arguments) ) ), constructor_suffix: ($) => prec( PRECS.call_suffix, choice( - alias($._constructor_value_arguments, $.value_arguments), + field("arguments", alias($._constructor_value_arguments, $.value_arguments)), prec.dynamic(-1, $._fn_call_lambda_arguments), // As above seq( - alias($._constructor_value_arguments, $.value_arguments), + field("arguments", alias($._constructor_value_arguments, $.value_arguments)), $._fn_call_lambda_arguments ) ) ), _constructor_value_arguments: ($) => - seq("(", optional(sep1Opt($.value_argument, ",")), ")"), + seq("(", optional(sep1Opt(field("argument", $.value_argument), ",")), ")"), _fn_call_lambda_arguments: ($) => - sep1($.lambda_literal, seq(field("name", $.simple_identifier), ":")), - type_arguments: ($) => prec.left(seq("<", sep1Opt($.type, ","), ">")), + sep1(field("lambda", $.lambda_literal), seq(field("name", $.simple_identifier), ":")), + type_arguments: ($) => prec.left(seq("<", sep1Opt(field("argument", $.type), ","), ">")), value_arguments: ($) => seq( choice( - seq("(", optional(sep1Opt($.value_argument, ",")), ")"), - seq("[", optional(sep1Opt($.value_argument, ",")), "]") + seq("(", optional(sep1Opt(field("argument", $.value_argument), ",")), ")"), + seq("[", optional(sep1Opt(field("argument", $.value_argument), ",")), "]") ) ), value_argument_label: ($) => prec.left( - choice( + field("name", choice( $.simple_identifier, // We don't rely on $._contextual_simple_identifier here because // these don't usually fall into that category. alias("if", $.simple_identifier), alias("switch", $.simple_identifier) - ) + )) ), value_argument: ($) => prec.left( seq( - optional($.type_modifiers), + field("type_modifiers", optional($.type_modifiers)), choice( repeat1( seq(field("reference_specifier", $.value_argument_label), ":") @@ -818,7 +823,7 @@ module.exports = grammar({ prec.right( PRECS["try"], seq( - $.try_operator, + field("operator", $.try_operator), field( "expr", choice( @@ -877,15 +882,15 @@ module.exports = grammar({ ), expr_hack_at_ternary_binary_call: ($) => seq( - $.expression, - alias($.expr_hack_at_ternary_binary_call_suffix, $.call_suffix) + field("function", $.expression), + field("suffix", alias($.expr_hack_at_ternary_binary_call_suffix, $.call_suffix)) ), expr_hack_at_ternary_binary_call_suffix: ($) => - prec(PRECS.call_suffix, $.value_arguments), + prec(PRECS.call_suffix, field("arguments", $.value_arguments)), call_expression: ($) => prec( PRECS.call, - prec.dynamic(DYNAMIC_PRECS.call, seq($.expression, $.call_suffix)) + prec.dynamic(DYNAMIC_PRECS.call, seq(field("function", $.expression), field("suffix", $.call_suffix))) ), macro_invocation: ($) => prec( @@ -894,9 +899,9 @@ module.exports = grammar({ DYNAMIC_PRECS.call, seq( $._hash_symbol, - $.simple_identifier, - optional($.type_parameters), - $.call_suffix + field("name", $.simple_identifier), + field("type_parameters", optional($.type_parameters)), + field("suffix", $.call_suffix) ) ) ), @@ -926,26 +931,25 @@ module.exports = grammar({ PRECS.tuple, seq( "(", - sep1Opt( - seq( - optional(seq(field("name", $.simple_identifier), ":")), - field("value", $.expression) - ), - "," - ), + sep1Opt(field("element", $.tuple_expression_item), ","), ")" ) ), + tuple_expression_item: ($) => + seq( + optional(seq(field("name", $.simple_identifier), ":")), + field("value", $.expression) + ), array_literal: ($) => seq("[", optional(sep1Opt(field("element", $.expression), ",")), "]"), dictionary_literal: ($) => seq( "[", - choice(":", sep1Opt($._dictionary_literal_item, ",")), + choice(":", sep1Opt(field("element", $.dictionary_literal_item), ",")), optional(","), "]" ), - _dictionary_literal_item: ($) => + dictionary_literal_item: ($) => seq(field("key", $.expression), ":", field("value", $.expression)), special_literal: ($) => seq( @@ -963,36 +967,38 @@ module.exports = grammar({ playground_literal: ($) => seq( $._hash_symbol, - choice("colorLiteral", "fileLiteral", "imageLiteral"), + field("kind", choice("colorLiteral", "fileLiteral", "imageLiteral")), "(", - sep1Opt(seq($.simple_identifier, ":", $.expression), ","), + sep1Opt(field("argument", $.playground_literal_argument), ","), ")" ), + playground_literal_argument: ($) => + seq(field("name", $.simple_identifier), ":", field("value", $.expression)), lambda_literal: ($) => prec.left( PRECS.lambda, seq( choice("{", "^{"), optional($._lambda_type_declaration), - optional($.statements), + optional($._statements), "}" ) ), _lambda_type_declaration: ($) => seq( - repeat($.attribute), + repeat(field("attribute", $.attribute)), prec(PRECS.expr, optional(field("captures", $.capture_list))), optional(field("type", $.lambda_function_type)), "in" ), - capture_list: ($) => seq("[", sep1Opt($.capture_list_item, ","), "]"), + capture_list: ($) => seq("[", sep1Opt(field("item", $.capture_list_item), ","), "]"), capture_list_item: ($) => choice( field("name", $.self_expression), prec( PRECS.expr, seq( - optional($.ownership_modifier), + field("ownership", optional($.ownership_modifier)), field("name", $.simple_identifier), optional(seq($._equal_sign, field("value", $.expression))) ) @@ -1003,11 +1009,11 @@ module.exports = grammar({ PRECS.expr, seq( choice( - $.lambda_function_type_parameters, - seq("(", optional($.lambda_function_type_parameters), ")") + field("params", $.lambda_function_type_parameters), + seq("(", field("params", optional($.lambda_function_type_parameters)), ")") ), - optional($._async_keyword), - optional(choice($.throws_clause, $.throws)), + field("async", optional($._async_keyword)), + field("throws", optional(choice($.throws_clause, $.throws))), optional( seq( $._arrow_operator, @@ -1016,11 +1022,11 @@ module.exports = grammar({ ) ) ), - lambda_function_type_parameters: ($) => sep1Opt($.lambda_parameter, ","), + lambda_function_type_parameters: ($) => sep1Opt(field("parameter", $.lambda_parameter), ","), lambda_parameter: ($) => seq( choice( - $.self_expression, + field("name", $.self_expression), prec(PRECS.expr, field("name", $.simple_identifier)), prec( PRECS.expr, @@ -1028,7 +1034,7 @@ module.exports = grammar({ optional(field("external_name", $.simple_identifier)), field("name", $.simple_identifier), ":", - optional($.parameter_modifiers), + field("modifiers", optional($.parameter_modifiers)), field("type", $._possibly_implicitly_unwrapped_type) ) ) @@ -1036,24 +1042,24 @@ module.exports = grammar({ ), self_expression: ($) => "self", super_expression: ($) => seq("super"), - _else_options: ($) => choice($._block, $.if_statement), + _else_options: ($) => choice(field("else_branch", $.block), field("else_branch", $.if_statement)), if_statement: ($) => prec.right( PRECS["if"], seq( "if", sep1(field("condition", $.if_condition), ","), - $._block, - optional(seq($["else"], $._else_options)) + field("body", $.block), + optional(seq(alias($["else"], "else"), $._else_options)) ) ), if_condition: ($) => - choice($.if_let_binding, $.expression, $.availability_condition), + field("kind", choice($.if_let_binding, $.expression, $.availability_condition)), if_let_binding: ($) => seq( $._direct_or_indirect_binding, - optional(seq($._equal_sign, $.expression)), - optional($.where_clause) + optional(seq($._equal_sign, field("value", $.expression))), + field("where", optional($.where_clause)) ), guard_statement: ($) => prec.right( @@ -1061,8 +1067,8 @@ module.exports = grammar({ seq( "guard", sep1(field("condition", $.if_condition), ","), - $["else"], - $._block + alias($["else"], "else"), + field("body", $.block) ) ), switch_statement: ($) => @@ -1072,65 +1078,63 @@ module.exports = grammar({ "switch", field("expr", $.expression), "{", - repeat($.switch_entry), + repeat(field("entry", $.switch_entry)), "}" ) ), switch_entry: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), choice( seq( "case", - seq( - $.switch_pattern, - optional(seq($.where_keyword, $.expression)) - ), - repeat(seq(",", $.switch_pattern)) + field("pattern", $.switch_pattern), + field("where", optional($.where_clause)), + repeat(seq(",", field("pattern", $.switch_pattern))) ), - $.default_keyword + field("default", $.default_keyword) ), ":", - $.statements, + $._statements, optional("fallthrough") ), - switch_pattern: ($) => alias($._binding_pattern_with_expr, $.pattern), + switch_pattern: ($) => field("pattern", alias($._binding_pattern_with_expr, $.pattern)), do_statement: ($) => - prec.right(PRECS["do"], seq("do", $._block, repeat($.catch_block))), + prec.right(PRECS["do"], seq("do", field("body", $.block), repeat(field("catch", $.catch_block)))), catch_block: ($) => seq( - $.catch_keyword, + field("keyword", $.catch_keyword), field("error", optional(alias($._binding_pattern_no_expr, $.pattern))), - optional($.where_clause), - $._block + field("where", optional($.where_clause)), + field("body", $.block) ), - where_clause: ($) => prec.left(seq($.where_keyword, $.expression)), + where_clause: ($) => prec.left(seq(field("keyword", $.where_keyword), field("expr", $.expression))), key_path_expression: ($) => prec.right( PRECS.keypath, seq( "\\", - optional( - choice($._simple_user_type, $.array_type, $.dictionary_type) - ), - repeat(seq(".", $._key_path_component)) + field("type", optional( + choice($.simple_user_type, $.array_type, $.dictionary_type) + )), + repeat(seq(".", field("component", $.key_path_component))) ) ), key_path_string_expression: ($) => - prec.left(seq($._hash_symbol, "keyPath", "(", $.expression, ")")), - _key_path_component: ($) => + prec.left(seq($._hash_symbol, "keyPath", "(", field("expr", $.expression), ")")), + key_path_component: ($) => prec.left( choice( - seq($.simple_identifier, repeat($._key_path_postfixes)), - repeat1($._key_path_postfixes) + seq(field("name", $.simple_identifier), repeat(field("postfix", $.key_path_postfix))), + repeat1(field("postfix", $.key_path_postfix)) ) ), - _key_path_postfixes: ($) => + key_path_postfix: ($) => choice( "?", - $.bang, + field("force_unwrap", $.bang), "self", - seq("[", optional(sep1($.value_argument, ",")), "]") + seq("[", optional(sep1(field("argument", $.value_argument), ",")), "]") ), try_operator: ($) => prec.right( @@ -1173,17 +1177,17 @@ module.exports = grammar({ ), _bitwise_binary_operator: ($) => choice("&", "|", "^", "<<", ">>"), _postfix_unary_operator: ($) => choice("++", "--", $.bang), - directly_assignable_expression: ($) => $.expression, + directly_assignable_expression: ($) => field("expr", $.expression), //////////////////////////////// // Statements - https://docs.swift.org/swift-book/ReferenceManual/Statements.html //////////////////////////////// - statements: ($) => + _statements: ($) => prec.left( // Left precedence is required in switch statements seq( - $._local_statement, - repeat(seq($._semi, $._local_statement)), + field("statement", $._local_statement), + repeat(seq($._semi, field("statement", $._local_statement))), optional($._semi) ) ), @@ -1201,7 +1205,7 @@ module.exports = grammar({ $._labeled_statement, $._throw_statement ), - _block: ($) => prec(PRECS.block, seq("{", optional($.statements), "}")), + block: ($) => prec(PRECS.block, seq("{", optional($._statements), "}")), _labeled_statement: ($) => seq( optional($.statement_label), @@ -1221,14 +1225,14 @@ module.exports = grammar({ PRECS.loop, seq( "for", - optional($.try_operator), + field("try", optional($.try_operator)), optional($._await_operator), field("item", alias($._binding_pattern_no_expr, $.pattern)), - optional($.type_annotation), + field("type", optional($.type_annotation)), "in", field("collection", $._for_statement_collection), - optional($.where_clause), - $._block + field("where", optional($.where_clause)), + field("body", $.block) ) ), _for_statement_collection: ($) => @@ -1237,7 +1241,7 @@ module.exports = grammar({ // // To fix that, we simply undo the special casing by defining our own `await_expression`. choice($.expression, alias($.for_statement_await, $.await_expression)), - for_statement_await: ($) => seq($._await_operator, $.expression), + for_statement_await: ($) => seq($._await_operator, field("expr", $.expression)), while_statement: ($) => prec( @@ -1245,9 +1249,7 @@ module.exports = grammar({ seq( "while", sep1(field("condition", $.if_condition), ","), - "{", - optional($.statements), - "}" + field("body", $.block) ) ), repeat_while_statement: ($) => @@ -1255,9 +1257,7 @@ module.exports = grammar({ PRECS.loop, seq( "repeat", - "{", - optional($.statements), - "}", + field("body", $.block), // Make sure we make it to the `while` before assuming this is a parameter pack. repeat($._implicit_semi), "while", @@ -1266,11 +1266,14 @@ module.exports = grammar({ ), control_transfer_statement: ($) => choice( - prec.right(PRECS.control_transfer, $._throw_statement), + prec.right( + PRECS.control_transfer, + seq(field("kind", $.throw_keyword), field("result", $.expression)) + ), prec.right( PRECS.control_transfer, seq( - $._optionally_valueful_control_keyword, + field("kind", $._optionally_valueful_control_keyword), field("result", optional($.expression)) ) ) @@ -1289,9 +1292,9 @@ module.exports = grammar({ ) ), value_parameter_pack: ($) => - prec.left(PRECS.parameter_pack, seq("each", $.expression)), + prec.left(PRECS.parameter_pack, seq("each", field("expr", $.expression))), value_pack_expansion: ($) => - prec.left(PRECS.parameter_pack, seq("repeat", $.expression)), + prec.left(PRECS.parameter_pack, seq("repeat", field("expr", $.expression))), availability_condition: ($) => seq( $._hash_symbol, @@ -1301,7 +1304,7 @@ module.exports = grammar({ ")" ), _availability_argument: ($) => - choice(seq($.identifier, sep1($.integer_literal, ".")), "*"), + choice(seq(field("platform", $.identifier), sep1(field("version", $.integer_literal), ".")), "*"), //////////////////////////////// // Declarations - https://docs.swift.org/swift-book/ReferenceManual/Declarations.html //////////////////////////////// @@ -1343,30 +1346,30 @@ module.exports = grammar({ ), _local_property_declaration: ($) => seq( - optional($._locally_permitted_modifiers), + field("modifiers", optional($._locally_permitted_modifiers)), $._modifierless_property_declaration ), _local_typealias_declaration: ($) => seq( - optional($._locally_permitted_modifiers), + field("modifiers", optional($._locally_permitted_modifiers)), $._modifierless_typealias_declaration ), _local_function_declaration: ($) => seq( - optional($._locally_permitted_modifiers), + field("modifiers", optional($._locally_permitted_modifiers)), $._modifierless_function_declaration ), _local_class_declaration: ($) => seq( - optional($._locally_permitted_modifiers), + field("modifiers", optional($._locally_permitted_modifiers)), $._modifierless_class_declaration ), import_declaration: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), "import", optional($._import_kind), - $.identifier + field("name", $.identifier) ), _import_kind: ($) => choice( @@ -1382,35 +1385,35 @@ module.exports = grammar({ protocol_property_declaration: ($) => prec.right( seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), field("name", alias($._binding_kind_and_pattern, $.pattern)), - optional($.type_annotation), - optional($.type_constraints), - $.protocol_property_requirements + field("type", optional($.type_annotation)), + field("type_constraints", optional($.type_constraints)), + field("requirements", $.protocol_property_requirements) ) ), protocol_property_requirements: ($) => - seq("{", repeat(choice($.getter_specifier, $.setter_specifier)), "}"), + seq("{", repeat(field("accessor", choice($.getter_specifier, $.setter_specifier))), "}"), property_declaration: ($) => - seq(optional($.modifiers), $._modifierless_property_declaration), + seq(field("modifiers", optional($.modifiers)), $._modifierless_property_declaration), _modifierless_property_declaration: ($) => prec.right( seq( $._possibly_async_binding_pattern_kind, - sep1($._single_modifierless_property_declaration, ",") + sep1(field("declarator", $.property_binding), ",") ) ), - _single_modifierless_property_declaration: ($) => + property_binding: ($) => prec.left( seq( field("name", alias($._no_expr_pattern_already_bound, $.pattern)), - optional($.type_annotation), - optional($.type_constraints), + field("type", optional($.type_annotation)), + field("type_constraints", optional($.type_constraints)), optional( choice( $._expression_with_willset_didset, $._expression_without_willset_didset, - $.willset_didset_block, + field("observers", $.willset_didset_block), field("computed_value", $.computed_property) ) ) @@ -1422,54 +1425,54 @@ module.exports = grammar({ seq( $._equal_sign, field("value", $.expression), - $.willset_didset_block + field("observers", $.willset_didset_block) ) ), _expression_without_willset_didset: ($) => seq($._equal_sign, field("value", $.expression)), willset_didset_block: ($) => choice( - seq("{", $.willset_clause, optional($.didset_clause), "}"), - seq("{", $.didset_clause, optional($.willset_clause), "}") + seq("{", field("willset", $.willset_clause), field("didset", optional($.didset_clause)), "}"), + seq("{", field("didset", $.didset_clause), field("willset", optional($.willset_clause)), "}") ), willset_clause: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), "willSet", - optional(seq("(", $.simple_identifier, ")")), - $._block + optional(seq("(", field("parameter", $.simple_identifier), ")")), + field("body", $.block) ), didset_clause: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), "didSet", - optional(seq("(", $.simple_identifier, ")")), - $._block + optional(seq("(", field("parameter", $.simple_identifier), ")")), + field("body", $.block) ), typealias_declaration: ($) => - seq(optional($.modifiers), $._modifierless_typealias_declaration), + seq(field("modifiers", optional($.modifiers)), $._modifierless_typealias_declaration), _modifierless_typealias_declaration: ($) => seq( "typealias", field("name", alias($.simple_identifier, $.type_identifier)), - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), $._equal_sign, field("value", $.type) ), function_declaration: ($) => prec.right( - seq($._bodyless_function_declaration, field("body", $.function_body)) + seq($._bodyless_function_declaration, field("body", $.block)) ), _modifierless_function_declaration: ($) => prec.right( seq( $._modifierless_function_declaration_no_body, - field("body", $.function_body) + field("body", $.block) ) ), _bodyless_function_declaration: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), optional("class"), // XXX: This should be possible in non-last position, but that creates parsing ambiguity $._modifierless_function_declaration_no_body ), @@ -1477,34 +1480,33 @@ module.exports = grammar({ prec.right( seq( $._non_constructor_function_decl, - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), $._function_value_parameters, - optional($._async_keyword), - optional(choice($.throws_clause, $.throws)), + field("async", optional($._async_keyword)), + field("throws", optional(choice($.throws_clause, $.throws))), optional( seq( $._arrow_operator, field("return_type", $._possibly_implicitly_unwrapped_type) ) ), - optional($.type_constraints) + field("type_constraints", optional($.type_constraints)) ) ), - function_body: ($) => $._block, macro_declaration: ($) => seq( $._macro_head, - $.simple_identifier, - optional($.type_parameters), + field("name", $.simple_identifier), + field("type_parameters", optional($.type_parameters)), $._macro_signature, optional(field("definition", $.macro_definition)), - optional($.type_constraints) + field("type_constraints", optional($.type_constraints)) ), - _macro_head: ($) => seq(optional($.modifiers), "macro"), + _macro_head: ($) => seq(field("modifiers", optional($.modifiers)), "macro"), _macro_signature: ($) => seq( $._function_value_parameters, - optional(seq($._arrow_operator, $.unannotated_type)) + optional(seq($._arrow_operator, field("return_type", $.unannotated_type))) ), macro_definition: ($) => seq( @@ -1513,36 +1515,36 @@ module.exports = grammar({ ), external_macro_definition: ($) => - seq($._hash_symbol, "externalMacro", $.value_arguments), + seq($._hash_symbol, "externalMacro", field("arguments", $.value_arguments)), class_declaration: ($) => - seq(optional($.modifiers), $._modifierless_class_declaration), + seq(field("modifiers", optional($.modifiers)), $._modifierless_class_declaration), _modifierless_class_declaration: ($) => prec.right( choice( seq( field("declaration_kind", choice("class", "struct", "actor")), field("name", alias($.simple_identifier, $.type_identifier)), - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), optional(seq(":", $._inheritance_specifiers)), - optional($.type_constraints), + field("type_constraints", optional($.type_constraints)), field("body", $.class_body) ), seq( field("declaration_kind", "extension"), field("name", $.unannotated_type), - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), optional(seq(":", $._inheritance_specifiers)), - optional($.type_constraints), + field("type_constraints", optional($.type_constraints)), field("body", $.class_body) ), seq( optional("indirect"), field("declaration_kind", "enum"), field("name", alias($.simple_identifier, $.type_identifier)), - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), optional(seq(":", $._inheritance_specifiers)), - optional($.type_constraints), + field("type_constraints", optional($.type_constraints)), field("body", $.enum_class_body) ) ) @@ -1550,6 +1552,8 @@ module.exports = grammar({ class_body: ($) => seq("{", optional($._class_member_declarations), "}"), _inheritance_specifiers: ($) => prec.left(sep1($._annotated_inheritance_specifier, choice(",", "&"))), + _annotated_inheritance_specifier: ($) => + seq(repeat(field("attribute", $.attribute)), field("inherits", $.inheritance_specifier)), inheritance_specifier: ($) => prec.left( field( @@ -1557,20 +1561,18 @@ module.exports = grammar({ choice($.user_type, $.function_type, $.suppressed_constraint) ) ), - _annotated_inheritance_specifier: ($) => - seq(repeat($.attribute), $.inheritance_specifier), type_parameters: ($) => seq( "<", - sep1Opt($.type_parameter, ","), - optional($.type_constraints), + sep1Opt(field("parameter", $.type_parameter), ","), + field("constraints", optional($.type_constraints)), ">" ), type_parameter: ($) => seq( - optional($.type_parameter_modifiers), - $._type_parameter_possibly_packed, - optional(seq(":", $.type)) + field("modifiers", optional($.type_parameter_modifiers)), + field("name", $._type_parameter_possibly_packed), + optional(seq(":", field("type", $.type))) ), _type_parameter_possibly_packed: ($) => choice( @@ -1579,19 +1581,19 @@ module.exports = grammar({ ), type_constraints: ($) => - prec.right(seq($.where_keyword, sep1Opt($.type_constraint, ","))), + prec.right(seq(field("keyword", $.where_keyword), sep1Opt(field("constraint", $.type_constraint), ","))), type_constraint: ($) => - choice($.inheritance_constraint, $.equality_constraint), + field("constraint", choice($.inheritance_constraint, $.equality_constraint)), inheritance_constraint: ($) => seq( - repeat($.attribute), + repeat(field("attribute", $.attribute)), field("constrained_type", $._constrained_type), ":", field("inherits_from", $._possibly_implicitly_unwrapped_type) ), equality_constraint: ($) => seq( - repeat($.attribute), + repeat(field("attribute", $.attribute)), field("constrained_type", $._constrained_type), choice($._equal_sign, $._eq_eq), field("must_equal", $.type) @@ -1599,23 +1601,23 @@ module.exports = grammar({ _constrained_type: ($) => choice($.identifier, $.nested_type_identifier), nested_type_identifier: ($) => seq( - $.unannotated_type, - optional(seq(".", sep1($.simple_identifier, "."))) + field("base", $.unannotated_type), + optional(seq(".", sep1(field("member", $.simple_identifier), "."))) ), - _class_member_separator: ($) => choice($._semi, $.multiline_comment), + _class_member_separator: ($) => choice($._semi, $._multiline_comment), _class_member_declarations: ($) => seq( - sep1($.type_level_declaration, $._class_member_separator), + sep1(field("member", $.type_level_declaration), $._class_member_separator), optional($._class_member_separator) ), _function_value_parameters: ($) => repeat1( - seq("(", optional(sep1Opt($._function_value_parameter, ",")), ")") + seq("(", optional(sep1Opt(field("parameter", $.function_parameter), ",")), ")") ), - _function_value_parameter: ($) => + function_parameter: ($) => seq( - optional($.attribute), - $.parameter, + field("attribute", optional($.attribute)), + field("parameter", $.parameter), optional(seq($._equal_sign, field("default_value", $.expression))) ), parameter: ($) => @@ -1623,7 +1625,7 @@ module.exports = grammar({ optional(field("external_name", $.simple_identifier)), field("name", $.simple_identifier), ":", - optional($.parameter_modifiers), + field("modifiers", optional($.parameter_modifiers)), field("type", $._possibly_implicitly_unwrapped_type), optional($._three_dot_operator) ), @@ -1633,7 +1635,7 @@ module.exports = grammar({ field("name", choice($.simple_identifier, $.referenceable_operator)) ), referenceable_operator: ($) => - choice( + field("operator", choice( $.custom_operator, $._comparison_operator, $._additive_operator, @@ -1649,7 +1651,7 @@ module.exports = grammar({ "<<", ">>", "&" - ), + )), // Hide the fact that certain symbols come from the custom scanner by aliasing them to their // string variants. This keeps us from having to see them in the syntax tree (which would be // noisy) but allows callers to refer to them as nodes by their text form like with any @@ -1673,21 +1675,20 @@ module.exports = grammar({ throws_clause: ($) => seq($._throws_keyword, "(", field("type", $.unannotated_type), ")"), enum_class_body: ($) => - seq("{", repeat(choice($.enum_entry, $.type_level_declaration)), "}"), + seq("{", repeat(field("member", choice($.enum_entry, $.type_level_declaration))), "}"), enum_entry: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), optional("indirect"), "case", - sep1( - seq( - field("name", $.simple_identifier), - optional($._enum_entry_suffix) - ), - "," - ), + sep1(field("case", $.enum_case_entry), ","), optional(";") ), + enum_case_entry: ($) => + seq( + field("name", $.simple_identifier), + optional($._enum_entry_suffix) + ), _enum_entry_suffix: ($) => choice( field("data_contents", $.enum_type_parameters), @@ -1696,36 +1697,33 @@ module.exports = grammar({ enum_type_parameters: ($) => seq( "(", + optional(sep1(field("parameter", $.enum_type_parameter), ",")), + ")" + ), + enum_type_parameter: ($) => + seq( optional( - sep1( - seq( - optional( - seq(optional($.wildcard_pattern), $.simple_identifier, ":") - ), - $.type, - optional(seq($._equal_sign, $.expression)) - ), - "," - ) + seq(optional(field("external_name", $.wildcard_pattern)), field("name", $.simple_identifier), ":") ), - ")" + field("type", $.type), + optional(seq($._equal_sign, field("default_value", $.expression))) ), protocol_declaration: ($) => prec.right( seq( - optional($.modifiers), - field("declaration_kind", "protocol"), + field("modifiers", optional($.modifiers)), + "protocol", field("name", alias($.simple_identifier, $.type_identifier)), - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), optional(seq(":", $._inheritance_specifiers)), - optional($.type_constraints), + field("type_constraints", optional($.type_constraints)), field("body", $.protocol_body) ) ), protocol_body: ($) => seq("{", optional($._protocol_member_declarations), "}"), _protocol_member_declarations: ($) => - seq(sep1($.protocol_member_declaration, $._semi), optional($._semi)), + seq(sep1(field("member", $.protocol_member_declaration), $._semi), optional($._semi)), protocol_member_declaration: ($) => choice( $.protocol_function_declaration, @@ -1739,33 +1737,33 @@ module.exports = grammar({ protocol_function_declaration: ($) => seq( $._bodyless_function_declaration, - optional(field("body", $.function_body)) + optional(field("body", $.block)) ), init_declaration: ($) => prec.right( seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), optional("class"), - field("name", "init"), - optional(choice($._quest, $.bang)), - optional($.type_parameters), + "init", + optional(choice($._quest, field("bang", $.bang))), + field("type_parameters", optional($.type_parameters)), $._function_value_parameters, - optional($._async_keyword), - optional(choice($.throws_clause, $.throws)), - optional($.type_constraints), - optional(field("body", $.function_body)) + field("async", optional($._async_keyword)), + field("throws", optional(choice($.throws_clause, $.throws))), + field("type_constraints", optional($.type_constraints)), + optional(field("body", $.block)) ) ), deinit_declaration: ($) => prec.right( - seq(optional($.modifiers), "deinit", field("body", $.function_body)) + seq(field("modifiers", optional($.modifiers)), "deinit", field("body", $.block)) ), subscript_declaration: ($) => prec.right( seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), "subscript", - optional($.type_parameters), + field("type_parameters", optional($.type_parameters)), $._function_value_parameters, optional( seq( @@ -1773,71 +1771,71 @@ module.exports = grammar({ field("return_type", $._possibly_implicitly_unwrapped_type) ) ), - optional($.type_constraints), - $.computed_property + field("type_constraints", optional($.type_constraints)), + field("body", $.computed_property) ) ), computed_property: ($) => seq( "{", choice( - optional($.statements), + optional($._statements), repeat( - choice($.computed_getter, $.computed_setter, $.computed_modify) + field("accessor", choice($.computed_getter, $.computed_setter, $.computed_modify)) ) ), "}" ), computed_getter: ($) => - seq(repeat($.attribute), $.getter_specifier, optional($._block)), + seq(repeat(field("attribute", $.attribute)), field("specifier", $.getter_specifier), optional(field("body", $.block))), computed_modify: ($) => - seq(repeat($.attribute), $.modify_specifier, optional($._block)), + seq(repeat(field("attribute", $.attribute)), field("specifier", $.modify_specifier), optional(field("body", $.block))), computed_setter: ($) => seq( - repeat($.attribute), - $.setter_specifier, - optional(seq("(", $.simple_identifier, ")")), - optional($._block) + repeat(field("attribute", $.attribute)), + field("specifier", $.setter_specifier), + optional(seq("(", field("parameter", $.simple_identifier), ")")), + optional(field("body", $.block)) ), getter_specifier: ($) => - seq(optional($.mutation_modifier), "get", optional($._getter_effects)), - setter_specifier: ($) => seq(optional($.mutation_modifier), "set"), - modify_specifier: ($) => seq(optional($.mutation_modifier), "_modify"), + seq(field("mutation", optional($.mutation_modifier)), "get", optional($._getter_effects)), + setter_specifier: ($) => seq(field("mutation", optional($.mutation_modifier)), "set"), + modify_specifier: ($) => seq(field("mutation", optional($.mutation_modifier)), "_modify"), _getter_effects: ($) => - repeat1(choice($._async_keyword, $.throws_clause, $.throws)), + repeat1(field("effect", choice(alias($._async_keyword, $.async_keyword), $.throws_clause, $.throws))), operator_declaration: ($) => seq( - choice("prefix", "infix", "postfix"), + field("kind", choice("prefix", "infix", "postfix")), "operator", - $.referenceable_operator, - optional(seq(":", $.simple_identifier)), - optional($.deprecated_operator_declaration_body) + field("name", $.referenceable_operator), + optional(seq(":", field("precedence_group", $.simple_identifier))), + field("body", optional($.deprecated_operator_declaration_body)) ), // The Swift compiler no longer accepts these, but some very old code still uses it. deprecated_operator_declaration_body: ($) => - seq("{", repeat(choice($.simple_identifier, $._basic_literal)), "}"), + seq("{", repeat(field("entry", choice($.simple_identifier, $._basic_literal))), "}"), precedence_group_declaration: ($) => seq( "precedencegroup", - $.simple_identifier, + field("name", $.simple_identifier), "{", - optional($.precedence_group_attributes), + field("attributes", optional($.precedence_group_attributes)), "}" ), - precedence_group_attributes: ($) => repeat1($.precedence_group_attribute), + precedence_group_attributes: ($) => repeat1(field("attribute", $.precedence_group_attribute)), precedence_group_attribute: ($) => seq( - $.simple_identifier, + field("name", $.simple_identifier), ":", - choice($.simple_identifier, $.boolean_literal) + field("value", choice($.simple_identifier, $.boolean_literal)) ), associatedtype_declaration: ($) => seq( - optional($.modifiers), + field("modifiers", optional($.modifiers)), "associatedtype", field("name", alias($.simple_identifier, $.type_identifier)), optional(seq(":", field("must_inherit", $.type))), - optional($.type_constraints), + field("type_constraints", optional($.type_constraints)), optional(seq($._equal_sign, field("default_value", $.type))) ), //////////////////////////////// @@ -1846,20 +1844,20 @@ module.exports = grammar({ attribute: ($) => seq( "@", - $.user_type, + field("name", $.user_type), // attribute arguments are a mess of special cases, maybe this is good enough? optional(seq("(", sep1Opt($._attribute_argument, ","), ")")) ), _attribute_argument: ($) => choice( // labeled function parameters, used in custom property wrappers - seq($.simple_identifier, ":", $.expression), + seq(field("argument_name", $.simple_identifier), ":", field("argument", $.expression)), // Unlabeled function parameters, simple identifiers, or `*` - $.expression, + field("argument", $.expression), // References to param names (used in `@objc(foo:bar:)`) - repeat1(seq($.simple_identifier, ":")), + repeat1(seq(field("param_ref", $.simple_identifier), ":")), // Version restrictions (iOS 3.4.5, Swift 5.0.0) - seq(repeat1($.simple_identifier), sep1($.integer_literal, ".")) + seq(repeat1(field("platform", $.simple_identifier)), sep1(field("version", $.integer_literal), ".")) ), //////////////////////////////// // Patterns - https://docs.swift.org/swift-book/ReferenceManual/Patterns.html @@ -1867,83 +1865,84 @@ module.exports = grammar({ _universally_allowed_pattern: ($) => choice( $.wildcard_pattern, - $._tuple_pattern, - $._type_casting_pattern, - $._case_pattern + $.tuple_pattern, + $.type_casting_pattern, + $.case_pattern ), _bound_identifier: ($) => field("bound_identifier", $.simple_identifier), _binding_pattern_no_expr: ($) => seq( - choice( + field("kind", choice( $._universally_allowed_pattern, - $._binding_pattern, + $.binding_pattern, $._bound_identifier - ), + )), optional($._quest) ), _no_expr_pattern_already_bound: ($) => seq( - choice($._universally_allowed_pattern, $._bound_identifier), + field("kind", choice($._universally_allowed_pattern, $._bound_identifier)), optional($._quest) ), _binding_pattern_with_expr: ($) => seq( - choice( + field("kind", choice( $._universally_allowed_pattern, - $._binding_pattern, + $.binding_pattern, $.expression - ), + )), optional($._quest) ), _non_binding_pattern_with_expr: ($) => seq( - choice($._universally_allowed_pattern, $.expression), + field("kind", choice($._universally_allowed_pattern, $.expression)), optional($._quest) ), _direct_or_indirect_binding: ($) => seq( choice( - $._binding_kind_and_pattern, - seq("case", $._binding_pattern_no_expr) + field("pattern", alias($._binding_kind_and_pattern, $.pattern)), + seq("case", field("pattern", alias($._binding_pattern_no_expr, $.pattern))) ), - optional($.type_annotation) + field("type", optional($.type_annotation)) ), value_binding_pattern: ($) => field("mutability", choice("var", "let")), _possibly_async_binding_pattern_kind: ($) => - seq(optional($._async_modifier), $.value_binding_pattern), + seq(optional($._async_modifier), field("binding", $.value_binding_pattern)), _binding_kind_and_pattern: ($) => seq( $._possibly_async_binding_pattern_kind, $._no_expr_pattern_already_bound ), wildcard_pattern: ($) => "_", - _tuple_pattern_item: ($) => + tuple_pattern_item: ($) => choice( seq( - $.simple_identifier, - seq(":", alias($._binding_pattern_with_expr, $.pattern)) + field("name", $.simple_identifier), + ":", + field("pattern", alias($._binding_pattern_with_expr, $.pattern)) ), - alias($._binding_pattern_with_expr, $.pattern) + field("pattern", alias($._binding_pattern_with_expr, $.pattern)) ), - _tuple_pattern: ($) => seq("(", sep1Opt($._tuple_pattern_item, ","), ")"), - _case_pattern: ($) => + tuple_pattern: ($) => seq("(", sep1Opt(field("item", $.tuple_pattern_item), ","), ")"), + case_pattern: ($) => seq( optional("case"), - optional($.user_type), // XXX this should just be _type but that creates ambiguity + optional(field("type", $.user_type)), // XXX this should just be _type but that creates ambiguity $._dot, - $.simple_identifier, - optional($._tuple_pattern) + field("name", $.simple_identifier), + optional(field("arguments", $.tuple_pattern)) ), - _type_casting_pattern: ($) => + type_casting_pattern: ($) => choice( - seq("is", $.type), - seq(alias($._binding_pattern_no_expr, $.pattern), $._as, $.type) + seq("is", field("type", $.type)), + seq(field("pattern", alias($._binding_pattern_no_expr, $.pattern)), $._as, field("type", $.type)) ), - _binding_pattern: ($) => + binding_pattern: ($) => seq( - seq(optional("case"), $.value_binding_pattern), - $._no_expr_pattern_already_bound + seq(optional("case"), field("binding", $.value_binding_pattern)), + field("pattern", alias($._no_expr_pattern_already_bound, $.pattern)) ), // ========== @@ -1952,12 +1951,12 @@ module.exports = grammar({ modifiers: ($) => repeat1( prec.left( - choice($._non_local_scope_modifier, $._locally_permitted_modifiers) + field("modifier", choice($._non_local_scope_modifier, $._locally_permitted_modifiers)) ) ), _locally_permitted_modifiers: ($) => repeat1(choice($.attribute, $._locally_permitted_modifier)), - parameter_modifiers: ($) => repeat1($.parameter_modifier), + parameter_modifiers: ($) => repeat1(field("modifier", $.parameter_modifier)), _modifier: ($) => choice($._non_local_scope_modifier, $._locally_permitted_modifier), _non_local_scope_modifier: ($) => @@ -1976,7 +1975,7 @@ module.exports = grammar({ $.property_behavior_modifier ), property_behavior_modifier: ($) => "lazy", - type_modifiers: ($) => repeat1($.attribute), + type_modifiers: ($) => repeat1(field("attribute", $.attribute)), member_modifier: ($) => choice("override", "convenience", "required", "nonisolated"), visibility_modifier: ($) => @@ -1991,7 +1990,7 @@ module.exports = grammar({ ), optional(seq("(", "set", ")")) ), - type_parameter_modifiers: ($) => repeat1($.attribute), + type_parameter_modifiers: ($) => repeat1(field("attribute", $.attribute)), function_modifier: ($) => choice("infix", "postfix", "prefix"), mutation_modifier: ($) => choice("mutating", "nonmutating"), property_modifier: ($) => @@ -2024,46 +2023,46 @@ module.exports = grammar({ prec.right( PRECS.comment, choice( - seq(alias($._directive_if, "#if"), $._compilation_condition), - seq(alias($._directive_elseif, "#elseif"), $._compilation_condition), + seq(alias($._directive_if, "#if"), field("condition", $.compilation_condition)), + seq(alias($._directive_elseif, "#elseif"), field("condition", $.compilation_condition)), seq(alias($._directive_else, "#else")), seq(alias($._directive_endif, "#endif")) ) ), - _compilation_condition: ($) => + compilation_condition: ($) => prec.right( choice( - seq("os", "(", $.simple_identifier, ")"), - seq("arch", "(", $.simple_identifier, ")"), + seq("os", "(", field("name", $.simple_identifier), ")"), + seq("arch", "(", field("name", $.simple_identifier), ")"), seq( "swift", "(", $._comparison_operator, - sep1($.integer_literal, "."), + sep1(field("version", $.integer_literal), "."), ")" ), seq( "compiler", "(", $._comparison_operator, - sep1($.integer_literal, "."), + sep1(field("version", $.integer_literal), "."), ")" ), - seq("canImport", "(", sep1($.simple_identifier, "."), ")"), - seq("targetEnvironment", "(", $.simple_identifier, ")"), - $.boolean_literal, - $.simple_identifier, - seq("(", $._compilation_condition, ")"), - seq("!", $._compilation_condition), + seq("canImport", "(", sep1(field("name", $.simple_identifier), "."), ")"), + seq("targetEnvironment", "(", field("name", $.simple_identifier), ")"), + field("value", $.boolean_literal), + field("name", $.simple_identifier), + seq("(", field("inner", $.compilation_condition), ")"), + seq("!", field("operand", $.compilation_condition)), seq( - $._compilation_condition, + field("lhs", $.compilation_condition), $._conjunction_operator, - $._compilation_condition + field("rhs", $.compilation_condition) ), seq( - $._compilation_condition, + field("lhs", $.compilation_condition), $._disjunction_operator, - $._compilation_condition + field("rhs", $.compilation_condition) ) ) ), diff --git a/unified/extractor/tree-sitter-swift/node-types.yml b/unified/extractor/tree-sitter-swift/node-types.yml index c4bf650944b2..8e1a4209d74b 100644 --- a/unified/extractor/tree-sitter-swift/node-types.yml +++ b/unified/extractor/tree-sitter-swift/node-types.yml @@ -119,8 +119,8 @@ named: array_type: element: type as_expression: - $children: as_operator expr: expression + operator: as_operator type: type as_operator: assignment: @@ -128,114 +128,166 @@ named: result: expression target: directly_assignable_expression associatedtype_declaration: - $children*: [modifiers, type_constraints] default_value?: type + modifiers?: modifiers must_inherit?: type name: type_identifier + type_constraints?: type_constraints + async_keyword: attribute: - $children+: [expression, user_type] + argument*: expression + argument_name*: simple_identifier + name: user_type + param_ref*: simple_identifier + platform*: simple_identifier + version*: integer_literal availability_condition: - $children*: [identifier, integer_literal] + platform*: identifier + version*: integer_literal await_expression: - $children?: expression - expr?: expression + expr: expression bang: bin_literal: + binding_pattern: + binding: value_binding_pattern + pattern: pattern bitwise_operation: lhs: expression op: ["&", "<<", ">>", "^", "|"] rhs: expression + block: + statement*: [control_transfer_statement, do_statement, expression, for_statement, guard_statement, local_declaration, repeat_while_statement, statement_label, while_statement] boolean_literal: call_expression: - $children+: [call_suffix, expression] + function: expression + suffix: call_suffix call_suffix: - $children+: [lambda_literal, value_arguments] + arguments?: value_arguments + lambda*: lambda_literal name*: simple_identifier capture_list: - $children+: capture_list_item + item+: capture_list_item capture_list_item: - $children?: ownership_modifier name: [self_expression, simple_identifier] + ownership?: ownership_modifier value?: expression + case_pattern: + arguments?: tuple_pattern + name: simple_identifier + type?: user_type catch_block: - $children+: [catch_keyword, statements, where_clause] + body: block error?: pattern + keyword: catch_keyword + where?: where_clause catch_keyword: check_expression: op: "is" target: expression type: type class_body: - $children*: [multiline_comment, type_level_declaration] + member*: type_level_declaration class_declaration: - $children*: [attribute, inheritance_modifier, inheritance_specifier, modifiers, ownership_modifier, property_behavior_modifier, type_constraints, type_parameters] + attribute*: attribute body: [class_body, enum_class_body] declaration_kind: ["actor", "class", "enum", "extension", "struct"] + inherits*: inheritance_specifier + modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier] name: [type_identifier, unannotated_type] + type_constraints?: type_constraints + type_parameters?: type_parameters comment: comparison_expression: lhs: expression op: ["<", "<=", ">", ">="] rhs: expression + compilation_condition: + inner?: compilation_condition + lhs?: compilation_condition + name*: simple_identifier + operand?: compilation_condition + rhs?: compilation_condition + value?: boolean_literal + version*: integer_literal computed_getter: - $children+: [attribute, getter_specifier, statements] + attribute*: attribute + body?: block + specifier: getter_specifier computed_modify: - $children+: [attribute, modify_specifier, statements] + attribute*: attribute + body?: block + specifier: modify_specifier computed_property: - $children*: [computed_getter, computed_modify, computed_setter, statements] + accessor*: [computed_getter, computed_modify, computed_setter] + statement*: [control_transfer_statement, do_statement, expression, for_statement, guard_statement, local_declaration, repeat_while_statement, statement_label, while_statement] computed_setter: - $children+: [attribute, setter_specifier, simple_identifier, statements] + attribute*: attribute + body?: block + parameter?: simple_identifier + specifier: setter_specifier conjunction_expression: lhs: expression op: "&&" rhs: expression constructor_expression: - $children: constructor_suffix constructed_type: [array_type, dictionary_type, user_type] + suffix: constructor_suffix constructor_suffix: - $children+: [lambda_literal, value_arguments] + arguments?: value_arguments + lambda*: lambda_literal name*: simple_identifier control_transfer_statement: - $children*: [expression, throw_keyword] + kind: ["break", "continue", "return", throw_keyword, "yield"] result?: expression custom_operator: default_keyword: deinit_declaration: - $children?: modifiers - body: function_body + body: block + modifiers?: modifiers deprecated_operator_declaration_body: - $children*: [bin_literal, boolean_literal, hex_literal, integer_literal, line_string_literal, multi_line_string_literal, oct_literal, raw_string_literal, real_literal, regex_literal, simple_identifier] + entry*: [bin_literal, boolean_literal, hex_literal, integer_literal, line_string_literal, multi_line_string_literal, "nil", oct_literal, raw_string_literal, real_literal, regex_literal, simple_identifier] diagnostic: dictionary_literal: - key*: expression - value*: expression + element*: dictionary_literal_item + dictionary_literal_item: + key: expression + value: expression dictionary_type: key: type value: type didset_clause: - $children*: [modifiers, simple_identifier, statements] + body: block + modifiers?: modifiers + parameter?: simple_identifier directive: - $children*: [boolean_literal, integer_literal, simple_identifier] + condition?: compilation_condition directly_assignable_expression: - $children: expression + expr: expression disjunction_expression: lhs: expression op: "||" rhs: expression do_statement: - $children*: [catch_block, statements] - else: + body: block + catch*: catch_block + enum_case_entry: + data_contents?: enum_type_parameters + name: simple_identifier + raw_value?: expression enum_class_body: - $children*: [enum_entry, type_level_declaration] + member*: [enum_entry, type_level_declaration] enum_entry: - $children?: modifiers - data_contents*: enum_type_parameters - name+: simple_identifier - raw_value*: expression + case+: enum_case_entry + modifiers?: modifiers + enum_type_parameter: + default_value?: expression + external_name?: wildcard_pattern + name?: simple_identifier + type: type enum_type_parameters: - $children*: [expression, type, wildcard_pattern] + parameter*: enum_type_parameter equality_constraint: - $children*: attribute + attribute*: attribute constrained_type: [identifier, nested_type_identifier] must_equal: type equality_expression: @@ -243,106 +295,141 @@ named: op: ["!=", "!==", "==", "==="] rhs: expression existential_type: - $children: unannotated_type + name: unannotated_type external_macro_definition: - $children: value_arguments + arguments: value_arguments for_statement: - $children*: [statements, try_operator, type_annotation, where_clause] + body: block collection: expression item: pattern + try?: try_operator + type?: type_annotation + where?: where_clause fully_open_range: - function_body: - $children?: statements function_declaration: - $children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, parameter, property_behavior_modifier, throws, throws_clause, type_constraints, type_parameters] - body: function_body - default_value*: expression + async?: "async" + body: block + modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier] name: [referenceable_operator, simple_identifier] + parameter*: function_parameter return_type?: [implicitly_unwrapped_type, type] + throws?: [throws, throws_clause] + type_constraints?: type_constraints + type_parameters?: type_parameters function_modifier: + function_parameter: + attribute?: attribute + default_value?: expression + parameter: parameter function_type: - $children?: [throws, throws_clause] + async?: "async" params: unannotated_type return_type: type + throws?: [throws, throws_clause] getter_specifier: - $children*: [mutation_modifier, throws, throws_clause] + effect*: [async_keyword, throws, throws_clause] + mutation?: mutation_modifier guard_statement: - $children+: [else, statements] + body: block condition+: if_condition hex_literal: identifier: - $children+: simple_identifier + part+: simple_identifier if_condition: - $children: [availability_condition, expression, if_let_binding] + kind: [availability_condition, expression, if_let_binding] if_let_binding: - $children*: [expression, pattern, type, type_annotation, user_type, value_binding_pattern, where_clause, wildcard_pattern] - bound_identifier?: simple_identifier + pattern: pattern + type?: type_annotation + value?: expression + where?: where_clause if_statement: - $children*: [else, if_statement, statements] + body: block condition+: if_condition + else_branch?: [block, if_statement] implicitly_unwrapped_type: - $children: type + name: type import_declaration: - $children+: [identifier, modifiers] + modifiers?: modifiers + name: identifier infix_expression: lhs: expression op: custom_operator rhs: expression inheritance_constraint: - $children*: attribute + attribute*: attribute constrained_type: [identifier, nested_type_identifier] inherits_from: [implicitly_unwrapped_type, type] inheritance_modifier: inheritance_specifier: inherits_from: [function_type, suppressed_constraint, user_type] init_declaration: - $children*: [attribute, bang, modifiers, parameter, throws, throws_clause, type_constraints, type_parameters] - body?: function_body - default_value*: expression - name: "init" + async?: "async" + bang?: bang + body?: block + modifiers?: modifiers + parameter*: function_parameter + throws?: [throws, throws_clause] + type_constraints?: type_constraints + type_parameters?: type_parameters integer_literal: interpolated_expression: - $children?: type_modifiers name?: value_argument_label reference_specifier*: value_argument_label + type_modifiers?: type_modifiers value?: expression + key_path_component: + name?: simple_identifier + postfix*: key_path_postfix key_path_expression: - $children*: [array_type, bang, dictionary_type, simple_identifier, type_arguments, type_identifier, value_argument] + component*: key_path_component + type?: [array_type, dictionary_type, simple_user_type] + key_path_postfix: + argument*: value_argument + force_unwrap?: bang key_path_string_expression: - $children: expression + expr: expression lambda_function_type: - $children*: [lambda_function_type_parameters, throws, throws_clause] + async?: "async" + params?: lambda_function_type_parameters return_type?: [implicitly_unwrapped_type, type] + throws?: [throws, throws_clause] lambda_function_type_parameters: - $children+: lambda_parameter + parameter+: lambda_parameter lambda_literal: - $children*: [attribute, statements] + attribute*: attribute captures?: capture_list + statement*: [control_transfer_statement, do_statement, expression, for_statement, guard_statement, local_declaration, repeat_while_statement, statement_label, while_statement] type?: lambda_function_type lambda_parameter: - $children?: [parameter_modifiers, self_expression] external_name?: simple_identifier - name?: simple_identifier + modifiers?: parameter_modifiers + name: [self_expression, simple_identifier] type?: [implicitly_unwrapped_type, type] line_str_text: line_string_literal: interpolation*: interpolated_expression text*: [line_str_text, str_escaped_char] macro_declaration: - $children+: [attribute, modifiers, parameter, simple_identifier, type_constraints, type_parameters, unannotated_type] - default_value*: expression definition?: macro_definition + modifiers?: modifiers + name: simple_identifier + parameter*: function_parameter + return_type?: unannotated_type + type_constraints?: type_constraints + type_parameters?: type_parameters macro_definition: body: [expression, external_macro_definition] macro_invocation: - $children+: [call_suffix, simple_identifier, type_parameters] + name: simple_identifier + suffix: call_suffix + type_parameters?: type_parameters member_modifier: metatype: - $children: unannotated_type + name: unannotated_type modifiers: - $children+: [attribute, function_modifier, inheritance_modifier, member_modifier, mutation_modifier, ownership_modifier, parameter_modifier, property_behavior_modifier, property_modifier, visibility_modifier] + modifier+: [attribute, function_modifier, inheritance_modifier, member_modifier, mutation_modifier, ownership_modifier, parameter_modifier, property_behavior_modifier, property_modifier, visibility_modifier] modify_specifier: - $children?: mutation_modifier + mutation?: mutation_modifier multi_line_str_text: multi_line_string_literal: interpolation*: interpolated_expression @@ -355,80 +442,109 @@ named: mutation_modifier: navigation_expression: suffix: navigation_suffix - target+: ["(", ")", array_type, dictionary_type, existential_type, expression, opaque_type, user_type] + target: [array_type, dictionary_type, expression, parenthesized_type, user_type] navigation_suffix: suffix: [integer_literal, simple_identifier] nested_type_identifier: - $children+: [simple_identifier, unannotated_type] + base: unannotated_type + member*: simple_identifier nil_coalescing_expression: if_nil: expression value: expression oct_literal: opaque_type: - $children: unannotated_type + name: unannotated_type open_end_range_expression: start: expression open_start_range_expression: end: expression operator_declaration: - $children+: [deprecated_operator_declaration_body, referenceable_operator, simple_identifier] + body?: deprecated_operator_declaration_body + kind: ["infix", "postfix", "prefix"] + name: referenceable_operator + precedence_group?: simple_identifier optional_chain_marker: - $children: expression + expr: expression optional_type: wrapped: [array_type, dictionary_type, tuple_type, user_type] ownership_modifier: parameter: - $children?: parameter_modifiers external_name?: simple_identifier + modifiers?: parameter_modifiers name: simple_identifier type: [implicitly_unwrapped_type, type] parameter_modifier: parameter_modifiers: - $children+: parameter_modifier + modifier+: parameter_modifier + parenthesized_type: + type: [dictionary_type, existential_type, opaque_type] pattern: - $children*: [expression, pattern, type, user_type, value_binding_pattern, wildcard_pattern] + binding?: value_binding_pattern bound_identifier?: simple_identifier + kind: [binding_pattern, case_pattern, expression, tuple_pattern, type_casting_pattern, wildcard_pattern] playground_literal: - $children+: expression + argument+: playground_literal_argument + kind: ["colorLiteral", "fileLiteral", "imageLiteral"] + playground_literal_argument: + name: simple_identifier + value: expression postfix_expression: operation: ["++", "--", bang] target: expression precedence_group_attribute: - $children+: [boolean_literal, simple_identifier] + name: simple_identifier + value: [boolean_literal, simple_identifier] precedence_group_attributes: - $children+: precedence_group_attribute + attribute+: precedence_group_attribute precedence_group_declaration: - $children+: [precedence_group_attributes, simple_identifier] + attributes?: precedence_group_attributes + name: simple_identifier prefix_expression: operation: ["&", "+", "++", "-", "--", ".", bang, custom_operator, "~"] target: expression property_behavior_modifier: + property_binding: + computed_value?: computed_property + name: pattern + observers?: willset_didset_block + type?: type_annotation + type_constraints?: type_constraints + value?: expression property_declaration: - $children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier, type_annotation, type_constraints, value_binding_pattern, willset_didset_block] - computed_value*: computed_property - name+: pattern - value*: expression + binding: value_binding_pattern + declarator+: property_binding + modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier] property_modifier: protocol_body: - $children*: protocol_member_declaration + member*: protocol_member_declaration protocol_composition_type: - $children+: unannotated_type + type+: unannotated_type protocol_declaration: - $children*: [attribute, inheritance_specifier, modifiers, type_constraints, type_parameters] + attribute*: attribute body: protocol_body - declaration_kind: "protocol" + inherits*: inheritance_specifier + modifiers?: modifiers name: type_identifier + type_constraints?: type_constraints + type_parameters?: type_parameters protocol_function_declaration: - $children*: [attribute, modifiers, parameter, throws, throws_clause, type_constraints, type_parameters] - body?: function_body - default_value*: expression + async?: "async" + body?: block + modifiers?: modifiers name: [referenceable_operator, simple_identifier] + parameter*: function_parameter return_type?: [implicitly_unwrapped_type, type] + throws?: [throws, throws_clause] + type_constraints?: type_constraints + type_parameters?: type_parameters protocol_property_declaration: - $children+: [modifiers, protocol_property_requirements, type_annotation, type_constraints] + modifiers?: modifiers name: pattern + requirements: protocol_property_requirements + type?: type_annotation + type_constraints?: type_constraints protocol_property_requirements: - $children*: [getter_specifier, setter_specifier] + accessor*: [getter_specifier, setter_specifier] range_expression: end: expression op: ["...", "..<"] @@ -436,48 +552,57 @@ named: raw_str_continuing_indicator: raw_str_end_part: raw_str_interpolation: - $children: raw_str_interpolation_start interpolation+: interpolated_expression + start: raw_str_interpolation_start raw_str_interpolation_start: raw_str_part: raw_string_literal: - $children*: raw_str_continuing_indicator + continuing*: raw_str_continuing_indicator interpolation*: raw_str_interpolation text+: [raw_str_end_part, raw_str_part] real_literal: referenceable_operator: - $children?: [bang, custom_operator] + operator: ["!=", "!==", "%", "%=", "&", "*", "*=", "+", "++", "+=", "-", "--", "-=", "/", "/=", "<", "<<", "<=", "=", "==", "===", ">", ">=", ">>", "^", bang, custom_operator, "|", "~"] regex_literal: repeat_while_statement: - $children?: statements + body: block condition+: if_condition selector_expression: - $children: expression + expr: expression self_expression: setter_specifier: - $children?: mutation_modifier + mutation?: mutation_modifier shebang_line: simple_identifier: + simple_user_type: + arguments?: type_arguments + name: type_identifier source_file: - $children*: [do_statement, expression, for_statement, global_declaration, guard_statement, repeat_while_statement, shebang_line, statement_label, throw_keyword, while_statement] + shebang?: shebang_line + statement*: [do_statement, expression, for_statement, global_declaration, guard_statement, repeat_while_statement, statement_label, throw_keyword, while_statement] special_literal: statement_label: - statements: - $children+: [control_transfer_statement, do_statement, expression, for_statement, guard_statement, local_declaration, repeat_while_statement, statement_label, while_statement] str_escaped_char: subscript_declaration: - $children+: [attribute, computed_property, modifiers, parameter, type_constraints, type_parameters] - default_value*: expression + body: computed_property + modifiers?: modifiers + parameter*: function_parameter return_type?: [implicitly_unwrapped_type, type] + type_constraints?: type_constraints + type_parameters?: type_parameters super_expression: suppressed_constraint: suppressed: type_identifier switch_entry: - $children+: [default_keyword, expression, modifiers, statements, switch_pattern, where_keyword] + default?: default_keyword + modifiers?: modifiers + pattern*: switch_pattern + statement+: [control_transfer_statement, do_statement, expression, for_statement, guard_statement, local_declaration, repeat_while_statement, statement_label, while_statement] + where?: where_clause switch_pattern: - $children: pattern + pattern: pattern switch_statement: - $children*: switch_entry + entry*: switch_entry expr: expression ternary_expression: condition: expression @@ -488,76 +613,95 @@ named: throws_clause: type: unannotated_type try_expression: - $children: try_operator expr: expression + operator: try_operator try_operator: tuple_expression: - name*: simple_identifier - value+: expression + element+: tuple_expression_item + tuple_expression_item: + name?: simple_identifier + value: expression + tuple_pattern: + item+: tuple_pattern_item + tuple_pattern_item: + name?: simple_identifier + pattern: pattern tuple_type: - $children?: tuple_type_item element*: tuple_type_item tuple_type_item: - $children*: [dictionary_type, existential_type, opaque_type, parameter_modifiers, wildcard_pattern] + external_name?: wildcard_pattern + modifiers?: parameter_modifiers name?: simple_identifier - type?: type + type: [dictionary_type, existential_type, opaque_type, type] type: modifiers?: type_modifiers name: unannotated_type type_annotation: type: [implicitly_unwrapped_type, type] type_arguments: - $children+: type + argument+: type + type_casting_pattern: + pattern?: pattern + type: type type_constraint: - $children: [equality_constraint, inheritance_constraint] + constraint: [equality_constraint, inheritance_constraint] type_constraints: - $children+: [type_constraint, where_keyword] + constraint+: type_constraint + keyword: where_keyword type_identifier: type_modifiers: - $children+: attribute + attribute+: attribute type_pack_expansion: - $children: unannotated_type + name: unannotated_type type_parameter: - $children+: [type, type_identifier, type_parameter_modifiers, type_parameter_pack] + modifiers?: type_parameter_modifiers + name: [type_identifier, type_parameter_pack] + type?: type type_parameter_modifiers: - $children+: attribute + attribute+: attribute type_parameter_pack: - $children: unannotated_type + name: unannotated_type type_parameters: - $children+: [type_constraints, type_parameter] + constraints?: type_constraints + parameter+: type_parameter typealias_declaration: - $children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier, type_parameters] + modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier] name: type_identifier + type_parameters?: type_parameters value: type user_type: - $children+: [type_arguments, type_identifier] + part+: simple_user_type value_argument: - $children?: type_modifiers name?: value_argument_label reference_specifier*: value_argument_label + type_modifiers?: type_modifiers value?: expression value_argument_label: - $children: simple_identifier + name: simple_identifier value_arguments: - $children*: value_argument + argument*: value_argument value_binding_pattern: mutability: ["let", "var"] value_pack_expansion: - $children: expression + expr: expression value_parameter_pack: - $children: expression + expr: expression visibility_modifier: where_clause: - $children+: [expression, where_keyword] + expr: expression + keyword: where_keyword where_keyword: while_statement: - $children?: statements + body: block condition+: if_condition wildcard_pattern: willset_clause: - $children*: [modifiers, simple_identifier, statements] + body: block + modifiers?: modifiers + parameter?: simple_identifier willset_didset_block: - $children+: [didset_clause, willset_clause] + didset?: didset_clause + willset?: willset_clause unnamed: - "?" @@ -645,6 +789,7 @@ unnamed: - "dsohandle" - "dynamic" - "each" + - "else" - "enum" - "extension" - "externalMacro" diff --git a/unified/ql/lib/codeql/unified/Ast.qll b/unified/ql/lib/codeql/unified/Ast.qll index 5b9491fdb9fe..d9060c26f0f2 100644 --- a/unified/ql/lib/codeql/unified/Ast.qll +++ b/unified/ql/lib/codeql/unified/Ast.qll @@ -1,5 +1,5 @@ /** - * CodeQL library for Swift + * CodeQL library for Unified * Automatically generated from the tree-sitter grammar; do not edit */ @@ -24,20 +24,20 @@ private predicate discardLocation(@location_default loc) { } overlay[local] -module Swift { +module Unified { /** The base class for all AST nodes */ - class AstNode extends @swift_ast_node { + class AstNode extends @unified_ast_node { /** Gets a string representation of this element. */ string toString() { result = this.getAPrimaryQlClass() } /** Gets the location of this element. */ - final L::Location getLocation() { swift_ast_node_location(this, result) } + final L::Location getLocation() { unified_ast_node_location(this, result) } /** Gets the parent of this element. */ - final AstNode getParent() { swift_ast_node_parent(this, result, _) } + final AstNode getParent() { unified_ast_node_parent(this, result, _) } /** Gets the index of this node among the children of its parent. */ - final int getParentIndex() { swift_ast_node_parent(this, _, result) } + final int getParentIndex() { unified_ast_node_parent(this, _, result) } /** Gets a field or child node of this node. */ AstNode getAFieldOrChild() { none() } @@ -50,9 +50,9 @@ module Swift { } /** A token. */ - class Token extends @swift_token, AstNode { + class Token extends @unified_token, AstNode { /** Gets the value of this token. */ - final string getValue() { swift_tokeninfo(this, _, result) } + final string getValue() { unified_tokeninfo(this, _, result) } /** Gets a string representation of this element. */ final override string toString() { result = this.getValue() } @@ -61,2766 +61,386 @@ module Swift { override string getAPrimaryQlClass() { result = "Token" } } - /** A reserved word. */ - class ReservedWord extends @swift_reserved_word, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ReservedWord" } - } - /** Gets the file containing the given `node`. */ - private @file getNodeFile(@swift_ast_node node) { - exists(@location_default loc | swift_ast_node_location(node, loc) | + private @file getNodeFile(@unified_ast_node node) { + exists(@location_default loc | unified_ast_node_location(node, loc) | locations_default(loc, result, _, _, _, _) ) } /** Holds if `node` is in the `file` and is part of the overlay base database. */ - private predicate discardableAstNode(@file file, @swift_ast_node node) { + private predicate discardableAstNode(@file file, @unified_ast_node node) { not isOverlay() and file = getNodeFile(node) } /** Holds if `node` should be discarded, because it is part of the overlay base and is in a file that was also extracted as part of the overlay database. */ overlay[discard_entity] - private predicate discardAstNode(@swift_ast_node node) { + private predicate discardAstNode(@unified_ast_node node) { exists(@file file, string path | files(file, path) | discardableAstNode(file, node) and overlayChangedFiles(path) ) } - /** A class representing `additive_expression` nodes. */ - class AdditiveExpression extends @swift_additive_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AdditiveExpression" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_additive_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_additive_expression_def(this, _, value, _) | - result = "+" and value = 0 - or - result = "-" and value = 1 - ) - } - - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_additive_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_additive_expression_def(this, result, _, _) or - swift_additive_expression_def(this, _, _, result) - } - } - - /** A class representing `array_literal` nodes. */ - class ArrayLiteral extends @swift_array_literal, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ArrayLiteral" } - - /** Gets the node corresponding to the field `element`. */ - final Expression getElement(int i) { swift_array_literal_element(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_array_literal_element(this, _, result) } - } - - /** A class representing `array_type` nodes. */ - class ArrayType extends @swift_array_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ArrayType" } - - /** Gets the node corresponding to the field `element`. */ - final Type getElement() { swift_array_type_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_array_type_def(this, result) } - } - - /** A class representing `as_expression` nodes. */ - class AsExpression extends @swift_as_expression, AstNode { + /** A class representing `apply_pattern` nodes. */ + class ApplyPattern extends @unified_apply_pattern, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AsExpression" } - - /** Gets the node corresponding to the field `expr`. */ - final Expression getExpr() { swift_as_expression_def(this, result, _, _) } + final override string getAPrimaryQlClass() { result = "ApplyPattern" } - /** Gets the node corresponding to the field `type`. */ - final Type getType() { swift_as_expression_def(this, _, result, _) } + /** Gets the node corresponding to the field `argument`. */ + final Pattern getArgument(int i) { unified_apply_pattern_argument(this, i, result) } - /** Gets the child of this node. */ - final AsOperator getChild() { swift_as_expression_def(this, _, _, result) } + /** Gets the node corresponding to the field `constructor`. */ + final Expr getConstructor() { unified_apply_pattern_def(this, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_as_expression_def(this, result, _, _) or - swift_as_expression_def(this, _, result, _) or - swift_as_expression_def(this, _, _, result) + unified_apply_pattern_argument(this, _, result) or unified_apply_pattern_def(this, result) } } - /** A class representing `as_operator` tokens. */ - class AsOperator extends @swift_token_as_operator, Token { + /** A class representing `binary_expr` nodes. */ + class BinaryExpr extends @unified_binary_expr, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AsOperator" } - } + final override string getAPrimaryQlClass() { result = "BinaryExpr" } - /** A class representing `assignment` nodes. */ - class Assignment extends @swift_assignment, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Assignment" } + /** Gets the node corresponding to the field `left`. */ + final Expr getLeft() { unified_binary_expr_def(this, result, _, _) } /** Gets the node corresponding to the field `operator`. */ - final string getOperator() { - exists(int value | swift_assignment_def(this, value, _, _) | - result = "%=" and value = 0 - or - result = "*=" and value = 1 - or - result = "+=" and value = 2 - or - result = "-=" and value = 3 - or - result = "/=" and value = 4 - or - result = "=" and value = 5 - ) - } - - /** Gets the node corresponding to the field `result`. */ - final Expression getResult() { swift_assignment_def(this, _, result, _) } + final Operator getOperator() { unified_binary_expr_def(this, _, result, _) } - /** Gets the node corresponding to the field `target`. */ - final DirectlyAssignableExpression getTarget() { swift_assignment_def(this, _, _, result) } + /** Gets the node corresponding to the field `right`. */ + final Expr getRight() { unified_binary_expr_def(this, _, _, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_assignment_def(this, _, result, _) or swift_assignment_def(this, _, _, result) + unified_binary_expr_def(this, result, _, _) or + unified_binary_expr_def(this, _, result, _) or + unified_binary_expr_def(this, _, _, result) } } - /** A class representing `associatedtype_declaration` nodes. */ - class AssociatedtypeDeclaration extends @swift_associatedtype_declaration, AstNode { + /** A class representing `block_stmt` nodes. */ + class BlockStmt extends @unified_block_stmt, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AssociatedtypeDeclaration" } - - /** Gets the node corresponding to the field `default_value`. */ - final Type getDefaultValue() { swift_associatedtype_declaration_default_value(this, result) } - - /** Gets the node corresponding to the field `must_inherit`. */ - final Type getMustInherit() { swift_associatedtype_declaration_must_inherit(this, result) } - - /** Gets the node corresponding to the field `name`. */ - final TypeIdentifier getName() { swift_associatedtype_declaration_def(this, result) } + final override string getAPrimaryQlClass() { result = "BlockStmt" } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_associatedtype_declaration_child(this, i, result) } + /** Gets the node corresponding to the field `body`. */ + final Stmt getBody(int i) { unified_block_stmt_body(this, i, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_associatedtype_declaration_default_value(this, result) or - swift_associatedtype_declaration_must_inherit(this, result) or - swift_associatedtype_declaration_def(this, result) or - swift_associatedtype_declaration_child(this, _, result) - } + final override AstNode getAFieldOrChild() { unified_block_stmt_body(this, _, result) } } - /** A class representing `attribute` nodes. */ - class Attribute extends @swift_attribute, AstNode { + /** A class representing `call_expr` nodes. */ + class CallExpr extends @unified_call_expr, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Attribute" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_attribute_child(this, i, result) } + final override string getAPrimaryQlClass() { result = "CallExpr" } - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_attribute_child(this, _, result) } - } - - /** A class representing `availability_condition` nodes. */ - class AvailabilityCondition extends @swift_availability_condition, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AvailabilityCondition" } + /** Gets the node corresponding to the field `argument`. */ + final Expr getArgument(int i) { unified_call_expr_argument(this, i, result) } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_availability_condition_child(this, i, result) } + /** Gets the node corresponding to the field `function`. */ + final Expr getFunction() { unified_call_expr_def(this, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_availability_condition_child(this, _, result) + unified_call_expr_argument(this, _, result) or unified_call_expr_def(this, result) } } - /** A class representing `await_expression` nodes. */ - class AwaitExpression extends @swift_await_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AwaitExpression" } - - /** Gets the node corresponding to the field `expr`. */ - final Expression getExpr() { swift_await_expression_expr(this, result) } - - /** Gets the child of this node. */ - final Expression getChild() { swift_await_expression_child(this, result) } + class Condition extends @unified_condition, AstNode { } - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_await_expression_expr(this, result) or swift_await_expression_child(this, result) - } - } - - /** A class representing `bang` tokens. */ - class Bang extends @swift_token_bang, Token { + /** A class representing `empty_stmt` tokens. */ + class EmptyStmt extends @unified_token_empty_stmt, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Bang" } + final override string getAPrimaryQlClass() { result = "EmptyStmt" } } - /** A class representing `bin_literal` tokens. */ - class BinLiteral extends @swift_token_bin_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "BinLiteral" } - } + class Expr extends @unified_expr, AstNode { } - /** A class representing `bitwise_operation` nodes. */ - class BitwiseOperation extends @swift_bitwise_operation, AstNode { + /** A class representing `expr_condition` nodes. */ + class ExprCondition extends @unified_expr_condition, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "BitwiseOperation" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_bitwise_operation_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_bitwise_operation_def(this, _, value, _) | - result = "&" and value = 0 - or - result = "<<" and value = 1 - or - result = ">>" and value = 2 - or - result = "^" and value = 3 - or - result = "|" and value = 4 - ) - } + final override string getAPrimaryQlClass() { result = "ExprCondition" } - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_bitwise_operation_def(this, _, _, result) } + /** Gets the node corresponding to the field `expr`. */ + final Expr getExpr() { unified_expr_condition_def(this, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_bitwise_operation_def(this, result, _, _) or - swift_bitwise_operation_def(this, _, _, result) - } - } - - /** A class representing `boolean_literal` tokens. */ - class BooleanLiteral extends @swift_token_boolean_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "BooleanLiteral" } + final override AstNode getAFieldOrChild() { unified_expr_condition_def(this, result) } } - /** A class representing `call_expression` nodes. */ - class CallExpression extends @swift_call_expression, AstNode { + /** A class representing `expr_stmt` nodes. */ + class ExprStmt extends @unified_expr_stmt, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CallExpression" } + final override string getAPrimaryQlClass() { result = "ExprStmt" } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_call_expression_child(this, i, result) } + /** Gets the node corresponding to the field `expr`. */ + final Expr getExpr() { unified_expr_stmt_def(this, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_call_expression_child(this, _, result) } + final override AstNode getAFieldOrChild() { unified_expr_stmt_def(this, result) } } - /** A class representing `call_suffix` nodes. */ - class CallSuffix extends @swift_call_suffix, AstNode { + /** A class representing `guard_if_stmt` nodes. */ + class GuardIfStmt extends @unified_guard_if_stmt, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CallSuffix" } + final override string getAPrimaryQlClass() { result = "GuardIfStmt" } - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName(int i) { swift_call_suffix_name(this, i, result) } + /** Gets the node corresponding to the field `condition`. */ + final Condition getCondition() { unified_guard_if_stmt_def(this, result, _) } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_call_suffix_child(this, i, result) } + /** Gets the node corresponding to the field `else`. */ + final Stmt getElse() { unified_guard_if_stmt_def(this, _, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_call_suffix_name(this, _, result) or swift_call_suffix_child(this, _, result) + unified_guard_if_stmt_def(this, result, _) or unified_guard_if_stmt_def(this, _, result) } } - /** A class representing `capture_list` nodes. */ - class CaptureList extends @swift_capture_list, AstNode { + /** A class representing `identifier` tokens. */ + class Identifier extends @unified_token_identifier, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CaptureList" } - - /** Gets the `i`th child of this node. */ - final CaptureListItem getChild(int i) { swift_capture_list_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_capture_list_child(this, _, result) } + final override string getAPrimaryQlClass() { result = "Identifier" } } - /** A class representing `capture_list_item` nodes. */ - class CaptureListItem extends @swift_capture_list_item, AstNode { + /** A class representing `if_stmt` nodes. */ + class IfStmt extends @unified_if_stmt, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CaptureListItem" } - - /** Gets the node corresponding to the field `name`. */ - final AstNode getName() { swift_capture_list_item_def(this, result) } - - /** Gets the node corresponding to the field `value`. */ - final Expression getValue() { swift_capture_list_item_value(this, result) } - - /** Gets the child of this node. */ - final OwnershipModifier getChild() { swift_capture_list_item_child(this, result) } + final override string getAPrimaryQlClass() { result = "IfStmt" } - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_capture_list_item_def(this, result) or - swift_capture_list_item_value(this, result) or - swift_capture_list_item_child(this, result) - } - } - - /** A class representing `catch_block` nodes. */ - class CatchBlock extends @swift_catch_block, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CatchBlock" } + /** Gets the node corresponding to the field `condition`. */ + final Condition getCondition() { unified_if_stmt_def(this, result) } - /** Gets the node corresponding to the field `error`. */ - final Pattern getError() { swift_catch_block_error(this, result) } + /** Gets the node corresponding to the field `else`. */ + final Stmt getElse() { unified_if_stmt_else(this, result) } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_catch_block_child(this, i, result) } + /** Gets the node corresponding to the field `then`. */ + final Stmt getThen() { unified_if_stmt_then(this, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_catch_block_error(this, result) or swift_catch_block_child(this, _, result) + unified_if_stmt_def(this, result) or + unified_if_stmt_else(this, result) or + unified_if_stmt_then(this, result) } } - /** A class representing `catch_keyword` tokens. */ - class CatchKeyword extends @swift_token_catch_keyword, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CatchKeyword" } - } - - /** A class representing `check_expression` nodes. */ - class CheckExpression extends @swift_check_expression, AstNode { + /** A class representing `ignore_pattern` tokens. */ + class IgnorePattern extends @unified_token_ignore_pattern, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CheckExpression" } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_check_expression_def(this, value, _, _) | - (result = "is" and value = 0) - ) - } - - /** Gets the node corresponding to the field `target`. */ - final Expression getTarget() { swift_check_expression_def(this, _, result, _) } - - /** Gets the node corresponding to the field `type`. */ - final Type getType() { swift_check_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_check_expression_def(this, _, result, _) or - swift_check_expression_def(this, _, _, result) - } + final override string getAPrimaryQlClass() { result = "IgnorePattern" } } - /** A class representing `class_body` nodes. */ - class ClassBody extends @swift_class_body, AstNode { + /** A class representing `int_literal` tokens. */ + class IntLiteral extends @unified_token_int_literal, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ClassBody" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_class_body_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_class_body_child(this, _, result) } + final override string getAPrimaryQlClass() { result = "IntLiteral" } } - /** A class representing `class_declaration` nodes. */ - class ClassDeclaration extends @swift_class_declaration, AstNode { + /** A class representing `lambda_expr` nodes. */ + class LambdaExpr extends @unified_lambda_expr, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ClassDeclaration" } + final override string getAPrimaryQlClass() { result = "LambdaExpr" } /** Gets the node corresponding to the field `body`. */ - final AstNode getBody() { swift_class_declaration_def(this, result, _, _) } - - /** Gets the node corresponding to the field `declaration_kind`. */ - final string getDeclarationKind() { - exists(int value | swift_class_declaration_def(this, _, value, _) | - result = "actor" and value = 0 - or - result = "class" and value = 1 - or - result = "enum" and value = 2 - or - result = "extension" and value = 3 - or - result = "struct" and value = 4 - ) - } - - /** Gets the node corresponding to the field `name`. */ - final AstNode getName() { swift_class_declaration_def(this, _, _, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_class_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_class_declaration_def(this, result, _, _) or - swift_class_declaration_def(this, _, _, result) or - swift_class_declaration_child(this, _, result) - } - } - - /** A class representing `comment` tokens. */ - class Comment extends @swift_token_comment, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Comment" } - } - - /** A class representing `comparison_expression` nodes. */ - class ComparisonExpression extends @swift_comparison_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ComparisonExpression" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_comparison_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_comparison_expression_def(this, _, value, _) | - result = "<" and value = 0 - or - result = "<=" and value = 1 - or - result = ">" and value = 2 - or - result = ">=" and value = 3 - ) - } - - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_comparison_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_comparison_expression_def(this, result, _, _) or - swift_comparison_expression_def(this, _, _, result) - } - } - - /** A class representing `computed_getter` nodes. */ - class ComputedGetter extends @swift_computed_getter, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ComputedGetter" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_computed_getter_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_computed_getter_child(this, _, result) } - } - - /** A class representing `computed_modify` nodes. */ - class ComputedModify extends @swift_computed_modify, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ComputedModify" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_computed_modify_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_computed_modify_child(this, _, result) } - } - - /** A class representing `computed_property` nodes. */ - class ComputedProperty extends @swift_computed_property, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ComputedProperty" } + final AstNode getBody() { unified_lambda_expr_def(this, result) } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_computed_property_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_computed_property_child(this, _, result) } - } - - /** A class representing `computed_setter` nodes. */ - class ComputedSetter extends @swift_computed_setter, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ComputedSetter" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_computed_setter_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_computed_setter_child(this, _, result) } - } - - /** A class representing `conjunction_expression` nodes. */ - class ConjunctionExpression extends @swift_conjunction_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ConjunctionExpression" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_conjunction_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_conjunction_expression_def(this, _, value, _) | - (result = "&&" and value = 0) - ) - } - - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_conjunction_expression_def(this, _, _, result) } + /** Gets the node corresponding to the field `parameter`. */ + final Parameter getParameter(int i) { unified_lambda_expr_parameter(this, i, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_conjunction_expression_def(this, result, _, _) or - swift_conjunction_expression_def(this, _, _, result) + unified_lambda_expr_def(this, result) or unified_lambda_expr_parameter(this, _, result) } } - /** A class representing `constructor_expression` nodes. */ - class ConstructorExpression extends @swift_constructor_expression, AstNode { + /** A class representing `let_pattern_condition` nodes. */ + class LetPatternCondition extends @unified_let_pattern_condition, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ConstructorExpression" } + final override string getAPrimaryQlClass() { result = "LetPatternCondition" } - /** Gets the node corresponding to the field `constructed_type`. */ - final AstNode getConstructedType() { swift_constructor_expression_def(this, result, _) } + /** Gets the node corresponding to the field `pattern`. */ + final Pattern getPattern() { unified_let_pattern_condition_def(this, result, _) } - /** Gets the child of this node. */ - final ConstructorSuffix getChild() { swift_constructor_expression_def(this, _, result) } + /** Gets the node corresponding to the field `value`. */ + final Expr getValue() { unified_let_pattern_condition_def(this, _, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_constructor_expression_def(this, result, _) or - swift_constructor_expression_def(this, _, result) + unified_let_pattern_condition_def(this, result, _) or + unified_let_pattern_condition_def(this, _, result) } } - /** A class representing `constructor_suffix` nodes. */ - class ConstructorSuffix extends @swift_constructor_suffix, AstNode { + /** A class representing `member_access_expr` nodes. */ + class MemberAccessExpr extends @unified_member_access_expr, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ConstructorSuffix" } + final override string getAPrimaryQlClass() { result = "MemberAccessExpr" } - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName(int i) { swift_constructor_suffix_name(this, i, result) } + /** Gets the node corresponding to the field `member`. */ + final Identifier getMember() { unified_member_access_expr_def(this, result, _) } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_constructor_suffix_child(this, i, result) } + /** Gets the node corresponding to the field `target`. */ + final Expr getTarget() { unified_member_access_expr_def(this, _, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_constructor_suffix_name(this, _, result) or - swift_constructor_suffix_child(this, _, result) + unified_member_access_expr_def(this, result, _) or + unified_member_access_expr_def(this, _, result) } } - /** A class representing `control_transfer_statement` nodes. */ - class ControlTransferStatement extends @swift_control_transfer_statement, AstNode { + /** A class representing `name_expr` nodes. */ + class NameExpr extends @unified_name_expr, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ControlTransferStatement" } - - /** Gets the node corresponding to the field `result`. */ - final Expression getResult() { swift_control_transfer_statement_result(this, result) } + final override string getAPrimaryQlClass() { result = "NameExpr" } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_control_transfer_statement_child(this, i, result) } + /** Gets the node corresponding to the field `identifier`. */ + final Identifier getIdentifier() { unified_name_expr_def(this, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_control_transfer_statement_result(this, result) or - swift_control_transfer_statement_child(this, _, result) - } - } - - /** A class representing `custom_operator` tokens. */ - class CustomOperator extends @swift_token_custom_operator, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CustomOperator" } - } - - /** A class representing `default_keyword` tokens. */ - class DefaultKeyword extends @swift_token_default_keyword, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DefaultKeyword" } + final override AstNode getAFieldOrChild() { unified_name_expr_def(this, result) } } - /** A class representing `deinit_declaration` nodes. */ - class DeinitDeclaration extends @swift_deinit_declaration, AstNode { + /** A class representing `operator` tokens. */ + class Operator extends @unified_token_operator, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DeinitDeclaration" } - - /** Gets the node corresponding to the field `body`. */ - final FunctionBody getBody() { swift_deinit_declaration_def(this, result) } - - /** Gets the child of this node. */ - final Modifiers getChild() { swift_deinit_declaration_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_deinit_declaration_def(this, result) or swift_deinit_declaration_child(this, result) - } + final override string getAPrimaryQlClass() { result = "Operator" } } - /** A class representing `deprecated_operator_declaration_body` nodes. */ - class DeprecatedOperatorDeclarationBody extends @swift_deprecated_operator_declaration_body, - AstNode - { + /** A class representing `parameter` nodes. */ + class Parameter extends @unified_parameter, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DeprecatedOperatorDeclarationBody" } + final override string getAPrimaryQlClass() { result = "Parameter" } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { - swift_deprecated_operator_declaration_body_child(this, i, result) - } + /** Gets the node corresponding to the field `pattern`. */ + final Pattern getPattern() { unified_parameter_def(this, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_deprecated_operator_declaration_body_child(this, _, result) - } + final override AstNode getAFieldOrChild() { unified_parameter_def(this, result) } } - /** A class representing `diagnostic` tokens. */ - class Diagnostic extends @swift_token_diagnostic, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Diagnostic" } - } + class Pattern extends @unified_pattern, AstNode { } - /** A class representing `dictionary_literal` nodes. */ - class DictionaryLiteral extends @swift_dictionary_literal, AstNode { + /** A class representing `sequence_condition` nodes. */ + class SequenceCondition extends @unified_sequence_condition, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DictionaryLiteral" } + final override string getAPrimaryQlClass() { result = "SequenceCondition" } - /** Gets the node corresponding to the field `key`. */ - final Expression getKey(int i) { swift_dictionary_literal_key(this, i, result) } + /** Gets the node corresponding to the field `condition`. */ + final Condition getCondition() { unified_sequence_condition_def(this, result) } - /** Gets the node corresponding to the field `value`. */ - final Expression getValue(int i) { swift_dictionary_literal_value(this, i, result) } + /** Gets the node corresponding to the field `stmt`. */ + final Stmt getStmt(int i) { unified_sequence_condition_stmt(this, i, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_dictionary_literal_key(this, _, result) or - swift_dictionary_literal_value(this, _, result) + unified_sequence_condition_def(this, result) or + unified_sequence_condition_stmt(this, _, result) } } - /** A class representing `dictionary_type` nodes. */ - class DictionaryType extends @swift_dictionary_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DictionaryType" } - - /** Gets the node corresponding to the field `key`. */ - final Type getKey() { swift_dictionary_type_def(this, result, _) } - - /** Gets the node corresponding to the field `value`. */ - final Type getValue() { swift_dictionary_type_def(this, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_dictionary_type_def(this, result, _) or swift_dictionary_type_def(this, _, result) - } - } + class Stmt extends @unified_stmt, AstNode { } - /** A class representing `didset_clause` nodes. */ - class DidsetClause extends @swift_didset_clause, AstNode { + /** A class representing `string_literal` tokens. */ + class StringLiteral extends @unified_token_string_literal, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DidsetClause" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_didset_clause_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_didset_clause_child(this, _, result) } + final override string getAPrimaryQlClass() { result = "StringLiteral" } } - /** A class representing `directive` nodes. */ - class Directive extends @swift_directive, AstNode { + /** A class representing `top_level` nodes. */ + class TopLevel extends @unified_top_level, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Directive" } + final override string getAPrimaryQlClass() { result = "TopLevel" } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_directive_child(this, i, result) } + /** Gets the node corresponding to the field `body`. */ + final AstNode getBody(int i) { unified_top_level_body(this, i, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_directive_child(this, _, result) } + final override AstNode getAFieldOrChild() { unified_top_level_body(this, _, result) } } - /** A class representing `directly_assignable_expression` nodes. */ - class DirectlyAssignableExpression extends @swift_directly_assignable_expression, AstNode { + /** A class representing `tuple_pattern` nodes. */ + class TuplePattern extends @unified_tuple_pattern, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DirectlyAssignableExpression" } + final override string getAPrimaryQlClass() { result = "TuplePattern" } - /** Gets the child of this node. */ - final Expression getChild() { swift_directly_assignable_expression_def(this, result) } + /** Gets the node corresponding to the field `element`. */ + final Pattern getElement(int i) { unified_tuple_pattern_element(this, i, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_directly_assignable_expression_def(this, result) - } + final override AstNode getAFieldOrChild() { unified_tuple_pattern_element(this, _, result) } } - /** A class representing `disjunction_expression` nodes. */ - class DisjunctionExpression extends @swift_disjunction_expression, AstNode { + /** A class representing `unary_expr` nodes. */ + class UnaryExpr extends @unified_unary_expr, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DisjunctionExpression" } + final override string getAPrimaryQlClass() { result = "UnaryExpr" } - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_disjunction_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_disjunction_expression_def(this, _, value, _) | - (result = "||" and value = 0) - ) - } + /** Gets the node corresponding to the field `operand`. */ + final Expr getOperand() { unified_unary_expr_def(this, result, _) } - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_disjunction_expression_def(this, _, _, result) } + /** Gets the node corresponding to the field `operator`. */ + final Operator getOperator() { unified_unary_expr_def(this, _, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_disjunction_expression_def(this, result, _, _) or - swift_disjunction_expression_def(this, _, _, result) + unified_unary_expr_def(this, result, _) or unified_unary_expr_def(this, _, result) } } - /** A class representing `do_statement` nodes. */ - class DoStatement extends @swift_do_statement, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "DoStatement" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_do_statement_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_do_statement_child(this, _, result) } - } - - /** A class representing `else` tokens. */ - class Else extends @swift_token_else, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Else" } - } - - /** A class representing `enum_class_body` nodes. */ - class EnumClassBody extends @swift_enum_class_body, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "EnumClassBody" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_enum_class_body_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_enum_class_body_child(this, _, result) } - } - - /** A class representing `enum_entry` nodes. */ - class EnumEntry extends @swift_enum_entry, AstNode { + /** A class representing `unsupported_node` tokens. */ + class UnsupportedNode extends @unified_token_unsupported_node, Token { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "EnumEntry" } - - /** Gets the node corresponding to the field `data_contents`. */ - final EnumTypeParameters getDataContents(int i) { - swift_enum_entry_data_contents(this, i, result) - } - - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName(int i) { swift_enum_entry_name(this, i, result) } - - /** Gets the node corresponding to the field `raw_value`. */ - final Expression getRawValue(int i) { swift_enum_entry_raw_value(this, i, result) } - - /** Gets the child of this node. */ - final Modifiers getChild() { swift_enum_entry_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_enum_entry_data_contents(this, _, result) or - swift_enum_entry_name(this, _, result) or - swift_enum_entry_raw_value(this, _, result) or - swift_enum_entry_child(this, result) - } + final override string getAPrimaryQlClass() { result = "UnsupportedNode" } } - /** A class representing `enum_type_parameters` nodes. */ - class EnumTypeParameters extends @swift_enum_type_parameters, AstNode { + /** A class representing `var_pattern` nodes. */ + class VarPattern extends @unified_var_pattern, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "EnumTypeParameters" } + final override string getAPrimaryQlClass() { result = "VarPattern" } - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_enum_type_parameters_child(this, i, result) } + /** Gets the node corresponding to the field `identifier`. */ + final Identifier getIdentifier() { unified_var_pattern_def(this, result) } /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_enum_type_parameters_child(this, _, result) } + final override AstNode getAFieldOrChild() { unified_var_pattern_def(this, result) } } - /** A class representing `equality_constraint` nodes. */ - class EqualityConstraint extends @swift_equality_constraint, AstNode { + /** A class representing `variable_declaration_stmt` nodes. */ + class VariableDeclarationStmt extends @unified_variable_declaration_stmt, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "EqualityConstraint" } - - /** Gets the node corresponding to the field `constrained_type`. */ - final AstNode getConstrainedType() { swift_equality_constraint_def(this, result, _) } - - /** Gets the node corresponding to the field `must_equal`. */ - final Type getMustEqual() { swift_equality_constraint_def(this, _, result) } - - /** Gets the `i`th child of this node. */ - final Attribute getChild(int i) { swift_equality_constraint_child(this, i, result) } + final override string getAPrimaryQlClass() { result = "VariableDeclarationStmt" } - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_equality_constraint_def(this, result, _) or - swift_equality_constraint_def(this, _, result) or - swift_equality_constraint_child(this, _, result) - } - } - - /** A class representing `equality_expression` nodes. */ - class EqualityExpression extends @swift_equality_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "EqualityExpression" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_equality_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_equality_expression_def(this, _, value, _) | - result = "!=" and value = 0 - or - result = "!==" and value = 1 - or - result = "==" and value = 2 - or - result = "===" and value = 3 - ) + /** Gets the node corresponding to the field `variable_declarator`. */ + final VariableDeclarator getVariableDeclarator(int i) { + unified_variable_declaration_stmt_variable_declarator(this, i, result) } - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_equality_expression_def(this, _, _, result) } - /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_equality_expression_def(this, result, _, _) or - swift_equality_expression_def(this, _, _, result) + unified_variable_declaration_stmt_variable_declarator(this, _, result) } } - /** A class representing `existential_type` nodes. */ - class ExistentialType extends @swift_existential_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ExistentialType" } - - /** Gets the child of this node. */ - final UnannotatedType getChild() { swift_existential_type_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_existential_type_def(this, result) } - } - - class Expression extends @swift_expression, AstNode { } - - /** A class representing `external_macro_definition` nodes. */ - class ExternalMacroDefinition extends @swift_external_macro_definition, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ExternalMacroDefinition" } - - /** Gets the child of this node. */ - final ValueArguments getChild() { swift_external_macro_definition_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_external_macro_definition_def(this, result) } - } - - /** A class representing `for_statement` nodes. */ - class ForStatement extends @swift_for_statement, AstNode { + /** A class representing `variable_declarator` nodes. */ + class VariableDeclarator extends @unified_variable_declarator, AstNode { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ForStatement" } + final override string getAPrimaryQlClass() { result = "VariableDeclarator" } - /** Gets the node corresponding to the field `collection`. */ - final Expression getCollection() { swift_for_statement_def(this, result, _) } + /** Gets the node corresponding to the field `pattern`. */ + final Pattern getPattern() { unified_variable_declarator_def(this, result) } - /** Gets the node corresponding to the field `item`. */ - final Pattern getItem() { swift_for_statement_def(this, _, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_for_statement_child(this, i, result) } + /** Gets the node corresponding to the field `value`. */ + final Expr getValue() { unified_variable_declarator_value(this, result) } /** Gets a field or child node of this node. */ final override AstNode getAFieldOrChild() { - swift_for_statement_def(this, result, _) or - swift_for_statement_def(this, _, result) or - swift_for_statement_child(this, _, result) - } - } - - /** A class representing `fully_open_range` tokens. */ - class FullyOpenRange extends @swift_token_fully_open_range, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "FullyOpenRange" } - } - - /** A class representing `function_body` nodes. */ - class FunctionBody extends @swift_function_body, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "FunctionBody" } - - /** Gets the child of this node. */ - final Statements getChild() { swift_function_body_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_function_body_child(this, result) } - } - - /** A class representing `function_declaration` nodes. */ - class FunctionDeclaration extends @swift_function_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "FunctionDeclaration" } - - /** Gets the node corresponding to the field `body`. */ - final FunctionBody getBody() { swift_function_declaration_def(this, result, _) } - - /** Gets the node corresponding to the field `default_value`. */ - final Expression getDefaultValue(int i) { - swift_function_declaration_default_value(this, i, result) + unified_variable_declarator_def(this, result) or + unified_variable_declarator_value(this, result) } - - /** Gets the node corresponding to the field `name`. */ - final AstNode getName() { swift_function_declaration_def(this, _, result) } - - /** Gets the node corresponding to the field `return_type`. */ - final AstNode getReturnType() { swift_function_declaration_return_type(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_function_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_function_declaration_def(this, result, _) or - swift_function_declaration_default_value(this, _, result) or - swift_function_declaration_def(this, _, result) or - swift_function_declaration_return_type(this, result) or - swift_function_declaration_child(this, _, result) - } - } - - /** A class representing `function_modifier` tokens. */ - class FunctionModifier extends @swift_token_function_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "FunctionModifier" } - } - - /** A class representing `function_type` nodes. */ - class FunctionType extends @swift_function_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "FunctionType" } - - /** Gets the node corresponding to the field `params`. */ - final UnannotatedType getParams() { swift_function_type_def(this, result, _) } - - /** Gets the node corresponding to the field `return_type`. */ - final Type getReturnType() { swift_function_type_def(this, _, result) } - - /** Gets the child of this node. */ - final AstNode getChild() { swift_function_type_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_function_type_def(this, result, _) or - swift_function_type_def(this, _, result) or - swift_function_type_child(this, result) - } - } - - /** A class representing `getter_specifier` nodes. */ - class GetterSpecifier extends @swift_getter_specifier, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "GetterSpecifier" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_getter_specifier_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_getter_specifier_child(this, _, result) } - } - - class GlobalDeclaration extends @swift_global_declaration, AstNode { } - - /** A class representing `guard_statement` nodes. */ - class GuardStatement extends @swift_guard_statement, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "GuardStatement" } - - /** Gets the node corresponding to the field `condition`. */ - final IfCondition getCondition(int i) { swift_guard_statement_condition(this, i, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_guard_statement_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_guard_statement_condition(this, _, result) or - swift_guard_statement_child(this, _, result) - } - } - - /** A class representing `hex_literal` tokens. */ - class HexLiteral extends @swift_token_hex_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "HexLiteral" } - } - - /** A class representing `identifier` nodes. */ - class Identifier extends @swift_identifier, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Identifier" } - - /** Gets the `i`th child of this node. */ - final SimpleIdentifier getChild(int i) { swift_identifier_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_identifier_child(this, _, result) } - } - - /** A class representing `if_condition` nodes. */ - class IfCondition extends @swift_if_condition, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "IfCondition" } - - /** Gets the child of this node. */ - final AstNode getChild() { swift_if_condition_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_if_condition_def(this, result) } - } - - /** A class representing `if_let_binding` nodes. */ - class IfLetBinding extends @swift_if_let_binding, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "IfLetBinding" } - - /** Gets the node corresponding to the field `bound_identifier`. */ - final SimpleIdentifier getBoundIdentifier() { - swift_if_let_binding_bound_identifier(this, result) - } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_if_let_binding_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_if_let_binding_bound_identifier(this, result) or - swift_if_let_binding_child(this, _, result) - } - } - - /** A class representing `if_statement` nodes. */ - class IfStatement extends @swift_if_statement, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "IfStatement" } - - /** Gets the node corresponding to the field `condition`. */ - final IfCondition getCondition(int i) { swift_if_statement_condition(this, i, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_if_statement_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_if_statement_condition(this, _, result) or swift_if_statement_child(this, _, result) - } - } - - /** A class representing `implicitly_unwrapped_type` nodes. */ - class ImplicitlyUnwrappedType extends @swift_implicitly_unwrapped_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ImplicitlyUnwrappedType" } - - /** Gets the child of this node. */ - final Type getChild() { swift_implicitly_unwrapped_type_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_implicitly_unwrapped_type_def(this, result) } - } - - /** A class representing `import_declaration` nodes. */ - class ImportDeclaration extends @swift_import_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ImportDeclaration" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_import_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_import_declaration_child(this, _, result) } - } - - /** A class representing `infix_expression` nodes. */ - class InfixExpression extends @swift_infix_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "InfixExpression" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_infix_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final CustomOperator getOp() { swift_infix_expression_def(this, _, result, _) } - - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_infix_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_infix_expression_def(this, result, _, _) or - swift_infix_expression_def(this, _, result, _) or - swift_infix_expression_def(this, _, _, result) - } - } - - /** A class representing `inheritance_constraint` nodes. */ - class InheritanceConstraint extends @swift_inheritance_constraint, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "InheritanceConstraint" } - - /** Gets the node corresponding to the field `constrained_type`. */ - final AstNode getConstrainedType() { swift_inheritance_constraint_def(this, result, _) } - - /** Gets the node corresponding to the field `inherits_from`. */ - final AstNode getInheritsFrom() { swift_inheritance_constraint_def(this, _, result) } - - /** Gets the `i`th child of this node. */ - final Attribute getChild(int i) { swift_inheritance_constraint_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_inheritance_constraint_def(this, result, _) or - swift_inheritance_constraint_def(this, _, result) or - swift_inheritance_constraint_child(this, _, result) - } - } - - /** A class representing `inheritance_modifier` tokens. */ - class InheritanceModifier extends @swift_token_inheritance_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "InheritanceModifier" } - } - - /** A class representing `inheritance_specifier` nodes. */ - class InheritanceSpecifier extends @swift_inheritance_specifier, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "InheritanceSpecifier" } - - /** Gets the node corresponding to the field `inherits_from`. */ - final AstNode getInheritsFrom() { swift_inheritance_specifier_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_inheritance_specifier_def(this, result) } - } - - /** A class representing `init_declaration` nodes. */ - class InitDeclaration extends @swift_init_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "InitDeclaration" } - - /** Gets the node corresponding to the field `body`. */ - final FunctionBody getBody() { swift_init_declaration_body(this, result) } - - /** Gets the node corresponding to the field `default_value`. */ - final Expression getDefaultValue(int i) { - swift_init_declaration_default_value(this, i, result) - } - - /** Gets the node corresponding to the field `name`. */ - final string getName() { - exists(int value | swift_init_declaration_def(this, value) | (result = "init" and value = 0)) - } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_init_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_init_declaration_body(this, result) or - swift_init_declaration_default_value(this, _, result) or - swift_init_declaration_child(this, _, result) - } - } - - /** A class representing `integer_literal` tokens. */ - class IntegerLiteral extends @swift_token_integer_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "IntegerLiteral" } - } - - /** A class representing `interpolated_expression` nodes. */ - class InterpolatedExpression extends @swift_interpolated_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "InterpolatedExpression" } - - /** Gets the node corresponding to the field `name`. */ - final ValueArgumentLabel getName() { swift_interpolated_expression_name(this, result) } - - /** Gets the node corresponding to the field `reference_specifier`. */ - final ValueArgumentLabel getReferenceSpecifier(int i) { - swift_interpolated_expression_reference_specifier(this, i, result) - } - - /** Gets the node corresponding to the field `value`. */ - final Expression getValue() { swift_interpolated_expression_value(this, result) } - - /** Gets the child of this node. */ - final TypeModifiers getChild() { swift_interpolated_expression_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_interpolated_expression_name(this, result) or - swift_interpolated_expression_reference_specifier(this, _, result) or - swift_interpolated_expression_value(this, result) or - swift_interpolated_expression_child(this, result) - } - } - - /** A class representing `key_path_expression` nodes. */ - class KeyPathExpression extends @swift_key_path_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "KeyPathExpression" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_key_path_expression_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_key_path_expression_child(this, _, result) } - } - - /** A class representing `key_path_string_expression` nodes. */ - class KeyPathStringExpression extends @swift_key_path_string_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "KeyPathStringExpression" } - - /** Gets the child of this node. */ - final Expression getChild() { swift_key_path_string_expression_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_key_path_string_expression_def(this, result) } - } - - /** A class representing `lambda_function_type` nodes. */ - class LambdaFunctionType extends @swift_lambda_function_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "LambdaFunctionType" } - - /** Gets the node corresponding to the field `return_type`. */ - final AstNode getReturnType() { swift_lambda_function_type_return_type(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_lambda_function_type_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_lambda_function_type_return_type(this, result) or - swift_lambda_function_type_child(this, _, result) - } - } - - /** A class representing `lambda_function_type_parameters` nodes. */ - class LambdaFunctionTypeParameters extends @swift_lambda_function_type_parameters, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "LambdaFunctionTypeParameters" } - - /** Gets the `i`th child of this node. */ - final LambdaParameter getChild(int i) { - swift_lambda_function_type_parameters_child(this, i, result) - } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_lambda_function_type_parameters_child(this, _, result) - } - } - - /** A class representing `lambda_literal` nodes. */ - class LambdaLiteral extends @swift_lambda_literal, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "LambdaLiteral" } - - /** Gets the node corresponding to the field `captures`. */ - final CaptureList getCaptures() { swift_lambda_literal_captures(this, result) } - - /** Gets the node corresponding to the field `type`. */ - final LambdaFunctionType getType() { swift_lambda_literal_type(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_lambda_literal_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_lambda_literal_captures(this, result) or - swift_lambda_literal_type(this, result) or - swift_lambda_literal_child(this, _, result) - } - } - - /** A class representing `lambda_parameter` nodes. */ - class LambdaParameter extends @swift_lambda_parameter, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "LambdaParameter" } - - /** Gets the node corresponding to the field `external_name`. */ - final SimpleIdentifier getExternalName() { swift_lambda_parameter_external_name(this, result) } - - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName() { swift_lambda_parameter_name(this, result) } - - /** Gets the node corresponding to the field `type`. */ - final AstNode getType() { swift_lambda_parameter_type(this, result) } - - /** Gets the child of this node. */ - final AstNode getChild() { swift_lambda_parameter_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_lambda_parameter_external_name(this, result) or - swift_lambda_parameter_name(this, result) or - swift_lambda_parameter_type(this, result) or - swift_lambda_parameter_child(this, result) - } - } - - /** A class representing `line_str_text` tokens. */ - class LineStrText extends @swift_token_line_str_text, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "LineStrText" } - } - - /** A class representing `line_string_literal` nodes. */ - class LineStringLiteral extends @swift_line_string_literal, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "LineStringLiteral" } - - /** Gets the node corresponding to the field `interpolation`. */ - final InterpolatedExpression getInterpolation(int i) { - swift_line_string_literal_interpolation(this, i, result) - } - - /** Gets the node corresponding to the field `text`. */ - final AstNode getText(int i) { swift_line_string_literal_text(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_line_string_literal_interpolation(this, _, result) or - swift_line_string_literal_text(this, _, result) - } - } - - class LocalDeclaration extends @swift_local_declaration, AstNode { } - - /** A class representing `macro_declaration` nodes. */ - class MacroDeclaration extends @swift_macro_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MacroDeclaration" } - - /** Gets the node corresponding to the field `default_value`. */ - final Expression getDefaultValue(int i) { - swift_macro_declaration_default_value(this, i, result) - } - - /** Gets the node corresponding to the field `definition`. */ - final MacroDefinition getDefinition() { swift_macro_declaration_definition(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_macro_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_macro_declaration_default_value(this, _, result) or - swift_macro_declaration_definition(this, result) or - swift_macro_declaration_child(this, _, result) - } - } - - /** A class representing `macro_definition` nodes. */ - class MacroDefinition extends @swift_macro_definition, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MacroDefinition" } - - /** Gets the node corresponding to the field `body`. */ - final AstNode getBody() { swift_macro_definition_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_macro_definition_def(this, result) } - } - - /** A class representing `macro_invocation` nodes. */ - class MacroInvocation extends @swift_macro_invocation, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MacroInvocation" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_macro_invocation_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_macro_invocation_child(this, _, result) } - } - - /** A class representing `member_modifier` tokens. */ - class MemberModifier extends @swift_token_member_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MemberModifier" } - } - - /** A class representing `metatype` nodes. */ - class Metatype extends @swift_metatype, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Metatype" } - - /** Gets the child of this node. */ - final UnannotatedType getChild() { swift_metatype_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_metatype_def(this, result) } - } - - /** A class representing `modifiers` nodes. */ - class Modifiers extends @swift_modifiers, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Modifiers" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_modifiers_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_modifiers_child(this, _, result) } - } - - /** A class representing `modify_specifier` nodes. */ - class ModifySpecifier extends @swift_modify_specifier, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ModifySpecifier" } - - /** Gets the child of this node. */ - final MutationModifier getChild() { swift_modify_specifier_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_modify_specifier_child(this, result) } - } - - /** A class representing `multi_line_str_text` tokens. */ - class MultiLineStrText extends @swift_token_multi_line_str_text, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MultiLineStrText" } - } - - /** A class representing `multi_line_string_literal` nodes. */ - class MultiLineStringLiteral extends @swift_multi_line_string_literal, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MultiLineStringLiteral" } - - /** Gets the node corresponding to the field `interpolation`. */ - final InterpolatedExpression getInterpolation(int i) { - swift_multi_line_string_literal_interpolation(this, i, result) - } - - /** Gets the node corresponding to the field `text`. */ - final AstNode getText(int i) { swift_multi_line_string_literal_text(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_multi_line_string_literal_interpolation(this, _, result) or - swift_multi_line_string_literal_text(this, _, result) - } - } - - /** A class representing `multiline_comment` tokens. */ - class MultilineComment extends @swift_token_multiline_comment, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MultilineComment" } - } - - /** A class representing `multiplicative_expression` nodes. */ - class MultiplicativeExpression extends @swift_multiplicative_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MultiplicativeExpression" } - - /** Gets the node corresponding to the field `lhs`. */ - final Expression getLhs() { swift_multiplicative_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_multiplicative_expression_def(this, _, value, _) | - result = "%" and value = 0 - or - result = "*" and value = 1 - or - result = "/" and value = 2 - ) - } - - /** Gets the node corresponding to the field `rhs`. */ - final Expression getRhs() { swift_multiplicative_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_multiplicative_expression_def(this, result, _, _) or - swift_multiplicative_expression_def(this, _, _, result) - } - } - - /** A class representing `mutation_modifier` tokens. */ - class MutationModifier extends @swift_token_mutation_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "MutationModifier" } - } - - /** A class representing `navigation_expression` nodes. */ - class NavigationExpression extends @swift_navigation_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NavigationExpression" } - - /** Gets the node corresponding to the field `suffix`. */ - final NavigationSuffix getSuffix() { swift_navigation_expression_def(this, result) } - - /** Gets the node corresponding to the field `target`. */ - final AstNode getTarget(int i) { swift_navigation_expression_target(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_navigation_expression_def(this, result) or - swift_navigation_expression_target(this, _, result) - } - } - - /** A class representing `navigation_suffix` nodes. */ - class NavigationSuffix extends @swift_navigation_suffix, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NavigationSuffix" } - - /** Gets the node corresponding to the field `suffix`. */ - final AstNode getSuffix() { swift_navigation_suffix_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_navigation_suffix_def(this, result) } - } - - /** A class representing `nested_type_identifier` nodes. */ - class NestedTypeIdentifier extends @swift_nested_type_identifier, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NestedTypeIdentifier" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_nested_type_identifier_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_nested_type_identifier_child(this, _, result) - } - } - - /** A class representing `nil_coalescing_expression` nodes. */ - class NilCoalescingExpression extends @swift_nil_coalescing_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NilCoalescingExpression" } - - /** Gets the node corresponding to the field `if_nil`. */ - final Expression getIfNil() { swift_nil_coalescing_expression_def(this, result, _) } - - /** Gets the node corresponding to the field `value`. */ - final Expression getValue() { swift_nil_coalescing_expression_def(this, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_nil_coalescing_expression_def(this, result, _) or - swift_nil_coalescing_expression_def(this, _, result) - } - } - - /** A class representing `oct_literal` tokens. */ - class OctLiteral extends @swift_token_oct_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OctLiteral" } - } - - /** A class representing `opaque_type` nodes. */ - class OpaqueType extends @swift_opaque_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OpaqueType" } - - /** Gets the child of this node. */ - final UnannotatedType getChild() { swift_opaque_type_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_opaque_type_def(this, result) } - } - - /** A class representing `open_end_range_expression` nodes. */ - class OpenEndRangeExpression extends @swift_open_end_range_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OpenEndRangeExpression" } - - /** Gets the node corresponding to the field `start`. */ - final Expression getStart() { swift_open_end_range_expression_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_open_end_range_expression_def(this, result) } - } - - /** A class representing `open_start_range_expression` nodes. */ - class OpenStartRangeExpression extends @swift_open_start_range_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OpenStartRangeExpression" } - - /** Gets the node corresponding to the field `end`. */ - final Expression getEnd() { swift_open_start_range_expression_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_open_start_range_expression_def(this, result) - } - } - - /** A class representing `operator_declaration` nodes. */ - class OperatorDeclaration extends @swift_operator_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OperatorDeclaration" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_operator_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_operator_declaration_child(this, _, result) } - } - - /** A class representing `optional_chain_marker` nodes. */ - class OptionalChainMarker extends @swift_optional_chain_marker, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OptionalChainMarker" } - - /** Gets the child of this node. */ - final Expression getChild() { swift_optional_chain_marker_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_optional_chain_marker_def(this, result) } - } - - /** A class representing `optional_type` nodes. */ - class OptionalType extends @swift_optional_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OptionalType" } - - /** Gets the node corresponding to the field `wrapped`. */ - final AstNode getWrapped() { swift_optional_type_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_optional_type_def(this, result) } - } - - /** A class representing `ownership_modifier` tokens. */ - class OwnershipModifier extends @swift_token_ownership_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "OwnershipModifier" } - } - - /** A class representing `parameter` nodes. */ - class Parameter extends @swift_parameter, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Parameter" } - - /** Gets the node corresponding to the field `external_name`. */ - final SimpleIdentifier getExternalName() { swift_parameter_external_name(this, result) } - - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName() { swift_parameter_def(this, result, _) } - - /** Gets the node corresponding to the field `type`. */ - final AstNode getType() { swift_parameter_def(this, _, result) } - - /** Gets the child of this node. */ - final ParameterModifiers getChild() { swift_parameter_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_parameter_external_name(this, result) or - swift_parameter_def(this, result, _) or - swift_parameter_def(this, _, result) or - swift_parameter_child(this, result) - } - } - - /** A class representing `parameter_modifier` tokens. */ - class ParameterModifier extends @swift_token_parameter_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ParameterModifier" } - } - - /** A class representing `parameter_modifiers` nodes. */ - class ParameterModifiers extends @swift_parameter_modifiers, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ParameterModifiers" } - - /** Gets the `i`th child of this node. */ - final ParameterModifier getChild(int i) { swift_parameter_modifiers_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_parameter_modifiers_child(this, _, result) } - } - - /** A class representing `pattern` nodes. */ - class Pattern extends @swift_pattern, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Pattern" } - - /** Gets the node corresponding to the field `bound_identifier`. */ - final SimpleIdentifier getBoundIdentifier() { swift_pattern_bound_identifier(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_pattern_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_pattern_bound_identifier(this, result) or swift_pattern_child(this, _, result) - } - } - - /** A class representing `playground_literal` nodes. */ - class PlaygroundLiteral extends @swift_playground_literal, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PlaygroundLiteral" } - - /** Gets the `i`th child of this node. */ - final Expression getChild(int i) { swift_playground_literal_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_playground_literal_child(this, _, result) } - } - - /** A class representing `postfix_expression` nodes. */ - class PostfixExpression extends @swift_postfix_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PostfixExpression" } - - /** Gets the node corresponding to the field `operation`. */ - final AstNode getOperation() { swift_postfix_expression_def(this, result, _) } - - /** Gets the node corresponding to the field `target`. */ - final Expression getTarget() { swift_postfix_expression_def(this, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_postfix_expression_def(this, result, _) or swift_postfix_expression_def(this, _, result) - } - } - - /** A class representing `precedence_group_attribute` nodes. */ - class PrecedenceGroupAttribute extends @swift_precedence_group_attribute, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PrecedenceGroupAttribute" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_precedence_group_attribute_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_precedence_group_attribute_child(this, _, result) - } - } - - /** A class representing `precedence_group_attributes` nodes. */ - class PrecedenceGroupAttributes extends @swift_precedence_group_attributes, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PrecedenceGroupAttributes" } - - /** Gets the `i`th child of this node. */ - final PrecedenceGroupAttribute getChild(int i) { - swift_precedence_group_attributes_child(this, i, result) - } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_precedence_group_attributes_child(this, _, result) - } - } - - /** A class representing `precedence_group_declaration` nodes. */ - class PrecedenceGroupDeclaration extends @swift_precedence_group_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PrecedenceGroupDeclaration" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_precedence_group_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_precedence_group_declaration_child(this, _, result) - } - } - - /** A class representing `prefix_expression` nodes. */ - class PrefixExpression extends @swift_prefix_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PrefixExpression" } - - /** Gets the node corresponding to the field `operation`. */ - final AstNode getOperation() { swift_prefix_expression_def(this, result, _) } - - /** Gets the node corresponding to the field `target`. */ - final Expression getTarget() { swift_prefix_expression_def(this, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_prefix_expression_def(this, result, _) or swift_prefix_expression_def(this, _, result) - } - } - - /** A class representing `property_behavior_modifier` tokens. */ - class PropertyBehaviorModifier extends @swift_token_property_behavior_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PropertyBehaviorModifier" } - } - - /** A class representing `property_declaration` nodes. */ - class PropertyDeclaration extends @swift_property_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PropertyDeclaration" } - - /** Gets the node corresponding to the field `computed_value`. */ - final ComputedProperty getComputedValue(int i) { - swift_property_declaration_computed_value(this, i, result) - } - - /** Gets the node corresponding to the field `name`. */ - final Pattern getName(int i) { swift_property_declaration_name(this, i, result) } - - /** Gets the node corresponding to the field `value`. */ - final Expression getValue(int i) { swift_property_declaration_value(this, i, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_property_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_property_declaration_computed_value(this, _, result) or - swift_property_declaration_name(this, _, result) or - swift_property_declaration_value(this, _, result) or - swift_property_declaration_child(this, _, result) - } - } - - /** A class representing `property_modifier` tokens. */ - class PropertyModifier extends @swift_token_property_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PropertyModifier" } - } - - /** A class representing `protocol_body` nodes. */ - class ProtocolBody extends @swift_protocol_body, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ProtocolBody" } - - /** Gets the `i`th child of this node. */ - final ProtocolMemberDeclaration getChild(int i) { swift_protocol_body_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_protocol_body_child(this, _, result) } - } - - /** A class representing `protocol_composition_type` nodes. */ - class ProtocolCompositionType extends @swift_protocol_composition_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ProtocolCompositionType" } - - /** Gets the `i`th child of this node. */ - final UnannotatedType getChild(int i) { swift_protocol_composition_type_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_protocol_composition_type_child(this, _, result) - } - } - - /** A class representing `protocol_declaration` nodes. */ - class ProtocolDeclaration extends @swift_protocol_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ProtocolDeclaration" } - - /** Gets the node corresponding to the field `body`. */ - final ProtocolBody getBody() { swift_protocol_declaration_def(this, result, _, _) } - - /** Gets the node corresponding to the field `declaration_kind`. */ - final string getDeclarationKind() { - exists(int value | swift_protocol_declaration_def(this, _, value, _) | - (result = "protocol" and value = 0) - ) - } - - /** Gets the node corresponding to the field `name`. */ - final TypeIdentifier getName() { swift_protocol_declaration_def(this, _, _, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_protocol_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_protocol_declaration_def(this, result, _, _) or - swift_protocol_declaration_def(this, _, _, result) or - swift_protocol_declaration_child(this, _, result) - } - } - - /** A class representing `protocol_function_declaration` nodes. */ - class ProtocolFunctionDeclaration extends @swift_protocol_function_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ProtocolFunctionDeclaration" } - - /** Gets the node corresponding to the field `body`. */ - final FunctionBody getBody() { swift_protocol_function_declaration_body(this, result) } - - /** Gets the node corresponding to the field `default_value`. */ - final Expression getDefaultValue(int i) { - swift_protocol_function_declaration_default_value(this, i, result) - } - - /** Gets the node corresponding to the field `name`. */ - final AstNode getName() { swift_protocol_function_declaration_def(this, result) } - - /** Gets the node corresponding to the field `return_type`. */ - final AstNode getReturnType() { swift_protocol_function_declaration_return_type(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_protocol_function_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_protocol_function_declaration_body(this, result) or - swift_protocol_function_declaration_default_value(this, _, result) or - swift_protocol_function_declaration_def(this, result) or - swift_protocol_function_declaration_return_type(this, result) or - swift_protocol_function_declaration_child(this, _, result) - } - } - - class ProtocolMemberDeclaration extends @swift_protocol_member_declaration, AstNode { } - - /** A class representing `protocol_property_declaration` nodes. */ - class ProtocolPropertyDeclaration extends @swift_protocol_property_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ProtocolPropertyDeclaration" } - - /** Gets the node corresponding to the field `name`. */ - final Pattern getName() { swift_protocol_property_declaration_def(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_protocol_property_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_protocol_property_declaration_def(this, result) or - swift_protocol_property_declaration_child(this, _, result) - } - } - - /** A class representing `protocol_property_requirements` nodes. */ - class ProtocolPropertyRequirements extends @swift_protocol_property_requirements, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ProtocolPropertyRequirements" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_protocol_property_requirements_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_protocol_property_requirements_child(this, _, result) - } - } - - /** A class representing `range_expression` nodes. */ - class RangeExpression extends @swift_range_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RangeExpression" } - - /** Gets the node corresponding to the field `end`. */ - final Expression getEnd() { swift_range_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `op`. */ - final string getOp() { - exists(int value | swift_range_expression_def(this, _, value, _) | - result = "..." and value = 0 - or - result = "..<" and value = 1 - ) - } - - /** Gets the node corresponding to the field `start`. */ - final Expression getStart() { swift_range_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_range_expression_def(this, result, _, _) or - swift_range_expression_def(this, _, _, result) - } - } - - /** A class representing `raw_str_continuing_indicator` tokens. */ - class RawStrContinuingIndicator extends @swift_token_raw_str_continuing_indicator, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RawStrContinuingIndicator" } - } - - /** A class representing `raw_str_end_part` tokens. */ - class RawStrEndPart extends @swift_token_raw_str_end_part, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RawStrEndPart" } - } - - /** A class representing `raw_str_interpolation` nodes. */ - class RawStrInterpolation extends @swift_raw_str_interpolation, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RawStrInterpolation" } - - /** Gets the node corresponding to the field `interpolation`. */ - final InterpolatedExpression getInterpolation(int i) { - swift_raw_str_interpolation_interpolation(this, i, result) - } - - /** Gets the child of this node. */ - final RawStrInterpolationStart getChild() { swift_raw_str_interpolation_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_raw_str_interpolation_interpolation(this, _, result) or - swift_raw_str_interpolation_def(this, result) - } - } - - /** A class representing `raw_str_interpolation_start` tokens. */ - class RawStrInterpolationStart extends @swift_token_raw_str_interpolation_start, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RawStrInterpolationStart" } - } - - /** A class representing `raw_str_part` tokens. */ - class RawStrPart extends @swift_token_raw_str_part, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RawStrPart" } - } - - /** A class representing `raw_string_literal` nodes. */ - class RawStringLiteral extends @swift_raw_string_literal, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RawStringLiteral" } - - /** Gets the node corresponding to the field `interpolation`. */ - final RawStrInterpolation getInterpolation(int i) { - swift_raw_string_literal_interpolation(this, i, result) - } - - /** Gets the node corresponding to the field `text`. */ - final AstNode getText(int i) { swift_raw_string_literal_text(this, i, result) } - - /** Gets the `i`th child of this node. */ - final RawStrContinuingIndicator getChild(int i) { - swift_raw_string_literal_child(this, i, result) - } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_raw_string_literal_interpolation(this, _, result) or - swift_raw_string_literal_text(this, _, result) or - swift_raw_string_literal_child(this, _, result) - } - } - - /** A class representing `real_literal` tokens. */ - class RealLiteral extends @swift_token_real_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RealLiteral" } - } - - /** A class representing `referenceable_operator` nodes. */ - class ReferenceableOperator extends @swift_referenceable_operator, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ReferenceableOperator" } - - /** Gets the child of this node. */ - final AstNode getChild() { swift_referenceable_operator_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_referenceable_operator_child(this, result) } - } - - /** A class representing `regex_literal` tokens. */ - class RegexLiteral extends @swift_token_regex_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RegexLiteral" } - } - - /** A class representing `repeat_while_statement` nodes. */ - class RepeatWhileStatement extends @swift_repeat_while_statement, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "RepeatWhileStatement" } - - /** Gets the node corresponding to the field `condition`. */ - final IfCondition getCondition(int i) { - swift_repeat_while_statement_condition(this, i, result) - } - - /** Gets the child of this node. */ - final Statements getChild() { swift_repeat_while_statement_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_repeat_while_statement_condition(this, _, result) or - swift_repeat_while_statement_child(this, result) - } - } - - /** A class representing `selector_expression` nodes. */ - class SelectorExpression extends @swift_selector_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SelectorExpression" } - - /** Gets the child of this node. */ - final Expression getChild() { swift_selector_expression_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_selector_expression_def(this, result) } - } - - /** A class representing `self_expression` tokens. */ - class SelfExpression extends @swift_token_self_expression, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SelfExpression" } - } - - /** A class representing `setter_specifier` nodes. */ - class SetterSpecifier extends @swift_setter_specifier, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SetterSpecifier" } - - /** Gets the child of this node. */ - final MutationModifier getChild() { swift_setter_specifier_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_setter_specifier_child(this, result) } - } - - /** A class representing `shebang_line` tokens. */ - class ShebangLine extends @swift_token_shebang_line, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ShebangLine" } - } - - /** A class representing `simple_identifier` tokens. */ - class SimpleIdentifier extends @swift_token_simple_identifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SimpleIdentifier" } - } - - /** A class representing `source_file` nodes. */ - class SourceFile extends @swift_source_file, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SourceFile" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_source_file_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_source_file_child(this, _, result) } - } - - /** A class representing `special_literal` tokens. */ - class SpecialLiteral extends @swift_token_special_literal, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SpecialLiteral" } - } - - /** A class representing `statement_label` tokens. */ - class StatementLabel extends @swift_token_statement_label, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "StatementLabel" } - } - - /** A class representing `statements` nodes. */ - class Statements extends @swift_statements, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Statements" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_statements_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_statements_child(this, _, result) } - } - - /** A class representing `str_escaped_char` tokens. */ - class StrEscapedChar extends @swift_token_str_escaped_char, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "StrEscapedChar" } - } - - /** A class representing `subscript_declaration` nodes. */ - class SubscriptDeclaration extends @swift_subscript_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SubscriptDeclaration" } - - /** Gets the node corresponding to the field `default_value`. */ - final Expression getDefaultValue(int i) { - swift_subscript_declaration_default_value(this, i, result) - } - - /** Gets the node corresponding to the field `return_type`. */ - final AstNode getReturnType() { swift_subscript_declaration_return_type(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_subscript_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_subscript_declaration_default_value(this, _, result) or - swift_subscript_declaration_return_type(this, result) or - swift_subscript_declaration_child(this, _, result) - } - } - - /** A class representing `super_expression` tokens. */ - class SuperExpression extends @swift_token_super_expression, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SuperExpression" } - } - - /** A class representing `suppressed_constraint` nodes. */ - class SuppressedConstraint extends @swift_suppressed_constraint, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SuppressedConstraint" } - - /** Gets the node corresponding to the field `suppressed`. */ - final TypeIdentifier getSuppressed() { swift_suppressed_constraint_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_suppressed_constraint_def(this, result) } - } - - /** A class representing `switch_entry` nodes. */ - class SwitchEntry extends @swift_switch_entry, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SwitchEntry" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_switch_entry_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_switch_entry_child(this, _, result) } - } - - /** A class representing `switch_pattern` nodes. */ - class SwitchPattern extends @swift_switch_pattern, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SwitchPattern" } - - /** Gets the child of this node. */ - final Pattern getChild() { swift_switch_pattern_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_switch_pattern_def(this, result) } - } - - /** A class representing `switch_statement` nodes. */ - class SwitchStatement extends @swift_switch_statement, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "SwitchStatement" } - - /** Gets the node corresponding to the field `expr`. */ - final Expression getExpr() { swift_switch_statement_def(this, result) } - - /** Gets the `i`th child of this node. */ - final SwitchEntry getChild(int i) { swift_switch_statement_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_switch_statement_def(this, result) or swift_switch_statement_child(this, _, result) - } - } - - /** A class representing `ternary_expression` nodes. */ - class TernaryExpression extends @swift_ternary_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TernaryExpression" } - - /** Gets the node corresponding to the field `condition`. */ - final Expression getCondition() { swift_ternary_expression_def(this, result, _, _) } - - /** Gets the node corresponding to the field `if_false`. */ - final Expression getIfFalse() { swift_ternary_expression_def(this, _, result, _) } - - /** Gets the node corresponding to the field `if_true`. */ - final Expression getIfTrue() { swift_ternary_expression_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_ternary_expression_def(this, result, _, _) or - swift_ternary_expression_def(this, _, result, _) or - swift_ternary_expression_def(this, _, _, result) - } - } - - /** A class representing `throw_keyword` tokens. */ - class ThrowKeyword extends @swift_token_throw_keyword, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ThrowKeyword" } - } - - /** A class representing `throws` tokens. */ - class Throws extends @swift_token_throws, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Throws" } - } - - /** A class representing `throws_clause` nodes. */ - class ThrowsClause extends @swift_throws_clause, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ThrowsClause" } - - /** Gets the node corresponding to the field `type`. */ - final UnannotatedType getType() { swift_throws_clause_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_throws_clause_def(this, result) } - } - - /** A class representing `try_expression` nodes. */ - class TryExpression extends @swift_try_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TryExpression" } - - /** Gets the node corresponding to the field `expr`. */ - final Expression getExpr() { swift_try_expression_def(this, result, _) } - - /** Gets the child of this node. */ - final TryOperator getChild() { swift_try_expression_def(this, _, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_try_expression_def(this, result, _) or swift_try_expression_def(this, _, result) - } - } - - /** A class representing `try_operator` tokens. */ - class TryOperator extends @swift_token_try_operator, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TryOperator" } - } - - /** A class representing `tuple_expression` nodes. */ - class TupleExpression extends @swift_tuple_expression, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TupleExpression" } - - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName(int i) { swift_tuple_expression_name(this, i, result) } - - /** Gets the node corresponding to the field `value`. */ - final Expression getValue(int i) { swift_tuple_expression_value(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_tuple_expression_name(this, _, result) or swift_tuple_expression_value(this, _, result) - } - } - - /** A class representing `tuple_type` nodes. */ - class TupleType extends @swift_tuple_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TupleType" } - - /** Gets the node corresponding to the field `element`. */ - final TupleTypeItem getElement(int i) { swift_tuple_type_element(this, i, result) } - - /** Gets the child of this node. */ - final TupleTypeItem getChild() { swift_tuple_type_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_tuple_type_element(this, _, result) or swift_tuple_type_child(this, result) - } - } - - /** A class representing `tuple_type_item` nodes. */ - class TupleTypeItem extends @swift_tuple_type_item, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TupleTypeItem" } - - /** Gets the node corresponding to the field `name`. */ - final SimpleIdentifier getName() { swift_tuple_type_item_name(this, result) } - - /** Gets the node corresponding to the field `type`. */ - final Type getType() { swift_tuple_type_item_type(this, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_tuple_type_item_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_tuple_type_item_name(this, result) or - swift_tuple_type_item_type(this, result) or - swift_tuple_type_item_child(this, _, result) - } - } - - /** A class representing `type` nodes. */ - class Type extends @swift_type__, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "Type" } - - /** Gets the node corresponding to the field `modifiers`. */ - final TypeModifiers getModifiers() { swift_type_modifiers(this, result) } - - /** Gets the node corresponding to the field `name`. */ - final UnannotatedType getName() { swift_type_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_type_modifiers(this, result) or swift_type_def(this, result) - } - } - - /** A class representing `type_annotation` nodes. */ - class TypeAnnotation extends @swift_type_annotation, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeAnnotation" } - - /** Gets the node corresponding to the field `type`. */ - final AstNode getType() { swift_type_annotation_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_annotation_def(this, result) } - } - - /** A class representing `type_arguments` nodes. */ - class TypeArguments extends @swift_type_arguments, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeArguments" } - - /** Gets the `i`th child of this node. */ - final Type getChild(int i) { swift_type_arguments_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_arguments_child(this, _, result) } - } - - /** A class representing `type_constraint` nodes. */ - class TypeConstraint extends @swift_type_constraint, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeConstraint" } - - /** Gets the child of this node. */ - final AstNode getChild() { swift_type_constraint_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_constraint_def(this, result) } - } - - /** A class representing `type_constraints` nodes. */ - class TypeConstraints extends @swift_type_constraints, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeConstraints" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_type_constraints_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_constraints_child(this, _, result) } - } - - /** A class representing `type_identifier` tokens. */ - class TypeIdentifier extends @swift_token_type_identifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeIdentifier" } - } - - class TypeLevelDeclaration extends @swift_type_level_declaration, AstNode { } - - /** A class representing `type_modifiers` nodes. */ - class TypeModifiers extends @swift_type_modifiers, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeModifiers" } - - /** Gets the `i`th child of this node. */ - final Attribute getChild(int i) { swift_type_modifiers_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_modifiers_child(this, _, result) } - } - - /** A class representing `type_pack_expansion` nodes. */ - class TypePackExpansion extends @swift_type_pack_expansion, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypePackExpansion" } - - /** Gets the child of this node. */ - final UnannotatedType getChild() { swift_type_pack_expansion_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_pack_expansion_def(this, result) } - } - - /** A class representing `type_parameter` nodes. */ - class TypeParameter extends @swift_type_parameter, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeParameter" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_type_parameter_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_parameter_child(this, _, result) } - } - - /** A class representing `type_parameter_modifiers` nodes. */ - class TypeParameterModifiers extends @swift_type_parameter_modifiers, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeParameterModifiers" } - - /** Gets the `i`th child of this node. */ - final Attribute getChild(int i) { swift_type_parameter_modifiers_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_type_parameter_modifiers_child(this, _, result) - } - } - - /** A class representing `type_parameter_pack` nodes. */ - class TypeParameterPack extends @swift_type_parameter_pack, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeParameterPack" } - - /** Gets the child of this node. */ - final UnannotatedType getChild() { swift_type_parameter_pack_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_parameter_pack_def(this, result) } - } - - /** A class representing `type_parameters` nodes. */ - class TypeParameters extends @swift_type_parameters, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeParameters" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_type_parameters_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_type_parameters_child(this, _, result) } - } - - /** A class representing `typealias_declaration` nodes. */ - class TypealiasDeclaration extends @swift_typealias_declaration, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypealiasDeclaration" } - - /** Gets the node corresponding to the field `name`. */ - final TypeIdentifier getName() { swift_typealias_declaration_def(this, result, _) } - - /** Gets the node corresponding to the field `value`. */ - final Type getValue() { swift_typealias_declaration_def(this, _, result) } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_typealias_declaration_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_typealias_declaration_def(this, result, _) or - swift_typealias_declaration_def(this, _, result) or - swift_typealias_declaration_child(this, _, result) - } - } - - class UnannotatedType extends @swift_unannotated_type, AstNode { } - - /** A class representing `user_type` nodes. */ - class UserType extends @swift_user_type, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "UserType" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_user_type_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_user_type_child(this, _, result) } - } - - /** A class representing `value_argument` nodes. */ - class ValueArgument extends @swift_value_argument, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ValueArgument" } - - /** Gets the node corresponding to the field `name`. */ - final ValueArgumentLabel getName() { swift_value_argument_name(this, result) } - - /** Gets the node corresponding to the field `reference_specifier`. */ - final ValueArgumentLabel getReferenceSpecifier(int i) { - swift_value_argument_reference_specifier(this, i, result) - } - - /** Gets the node corresponding to the field `value`. */ - final Expression getValue() { swift_value_argument_value(this, result) } - - /** Gets the child of this node. */ - final TypeModifiers getChild() { swift_value_argument_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_value_argument_name(this, result) or - swift_value_argument_reference_specifier(this, _, result) or - swift_value_argument_value(this, result) or - swift_value_argument_child(this, result) - } - } - - /** A class representing `value_argument_label` nodes. */ - class ValueArgumentLabel extends @swift_value_argument_label, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ValueArgumentLabel" } - - /** Gets the child of this node. */ - final SimpleIdentifier getChild() { swift_value_argument_label_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_value_argument_label_def(this, result) } - } - - /** A class representing `value_arguments` nodes. */ - class ValueArguments extends @swift_value_arguments, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ValueArguments" } - - /** Gets the `i`th child of this node. */ - final ValueArgument getChild(int i) { swift_value_arguments_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_value_arguments_child(this, _, result) } - } - - /** A class representing `value_binding_pattern` nodes. */ - class ValueBindingPattern extends @swift_value_binding_pattern, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ValueBindingPattern" } - - /** Gets the node corresponding to the field `mutability`. */ - final string getMutability() { - exists(int value | swift_value_binding_pattern_def(this, value) | - result = "let" and value = 0 - or - result = "var" and value = 1 - ) - } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { none() } - } - - /** A class representing `value_pack_expansion` nodes. */ - class ValuePackExpansion extends @swift_value_pack_expansion, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ValuePackExpansion" } - - /** Gets the child of this node. */ - final Expression getChild() { swift_value_pack_expansion_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_value_pack_expansion_def(this, result) } - } - - /** A class representing `value_parameter_pack` nodes. */ - class ValueParameterPack extends @swift_value_parameter_pack, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ValueParameterPack" } - - /** Gets the child of this node. */ - final Expression getChild() { swift_value_parameter_pack_def(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_value_parameter_pack_def(this, result) } - } - - /** A class representing `visibility_modifier` tokens. */ - class VisibilityModifier extends @swift_token_visibility_modifier, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "VisibilityModifier" } - } - - /** A class representing `where_clause` nodes. */ - class WhereClause extends @swift_where_clause, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "WhereClause" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_where_clause_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_where_clause_child(this, _, result) } - } - - /** A class representing `where_keyword` tokens. */ - class WhereKeyword extends @swift_token_where_keyword, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "WhereKeyword" } - } - - /** A class representing `while_statement` nodes. */ - class WhileStatement extends @swift_while_statement, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "WhileStatement" } - - /** Gets the node corresponding to the field `condition`. */ - final IfCondition getCondition(int i) { swift_while_statement_condition(this, i, result) } - - /** Gets the child of this node. */ - final Statements getChild() { swift_while_statement_child(this, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { - swift_while_statement_condition(this, _, result) or swift_while_statement_child(this, result) - } - } - - /** A class representing `wildcard_pattern` tokens. */ - class WildcardPattern extends @swift_token_wildcard_pattern, Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "WildcardPattern" } - } - - /** A class representing `willset_clause` nodes. */ - class WillsetClause extends @swift_willset_clause, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "WillsetClause" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_willset_clause_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_willset_clause_child(this, _, result) } - } - - /** A class representing `willset_didset_block` nodes. */ - class WillsetDidsetBlock extends @swift_willset_didset_block, AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "WillsetDidsetBlock" } - - /** Gets the `i`th child of this node. */ - final AstNode getChild(int i) { swift_willset_didset_block_child(this, i, result) } - - /** Gets a field or child node of this node. */ - final override AstNode getAFieldOrChild() { swift_willset_didset_block_child(this, _, result) } } } diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index b50bc56eaa2a..28718d794236 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -1,4 +1,4 @@ -// CodeQL database schema for Swift +// CodeQL database schema for Unified // Automatically generated from the tree-sitter grammar; do not edit // To regenerate, run unified/scripts/create-extractor-pack.sh @@ -131,2003 +131,220 @@ overlayChangedFiles( string path: string ref ); -/*- Swift dbscheme -*/ -case @swift_additive_expression.op of - 0 = @swift_additive_expression_plus -| 1 = @swift_additive_expression_minus -; - - -swift_additive_expression_def( - unique int id: @swift_additive_expression, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -#keyset[swift_array_literal, index] -swift_array_literal_element( - int swift_array_literal: @swift_array_literal ref, - int index: int ref, - unique int element: @swift_expression ref -); - -swift_array_literal_def( - unique int id: @swift_array_literal -); - -swift_array_type_def( - unique int id: @swift_array_type, - int element: @swift_type__ ref -); - -swift_as_expression_def( - unique int id: @swift_as_expression, - int expr: @swift_expression ref, - int type__: @swift_type__ ref, - int child: @swift_token_as_operator ref -); - -case @swift_assignment.operator of - 0 = @swift_assignment_percentequal -| 1 = @swift_assignment_starequal -| 2 = @swift_assignment_plusequal -| 3 = @swift_assignment_minusequal -| 4 = @swift_assignment_slashequal -| 5 = @swift_assignment_equal -; - - -swift_assignment_def( - unique int id: @swift_assignment, - int operator: int ref, - int result: @swift_expression ref, - int target: @swift_directly_assignable_expression ref -); - -swift_associatedtype_declaration_default_value( - unique int swift_associatedtype_declaration: @swift_associatedtype_declaration ref, - unique int default_value: @swift_type__ ref -); - -swift_associatedtype_declaration_must_inherit( - unique int swift_associatedtype_declaration: @swift_associatedtype_declaration ref, - unique int must_inherit: @swift_type__ ref -); - -@swift_associatedtype_declaration_child_type = @swift_modifiers | @swift_type_constraints - -#keyset[swift_associatedtype_declaration, index] -swift_associatedtype_declaration_child( - int swift_associatedtype_declaration: @swift_associatedtype_declaration ref, - int index: int ref, - unique int child: @swift_associatedtype_declaration_child_type ref -); - -swift_associatedtype_declaration_def( - unique int id: @swift_associatedtype_declaration, - int name: @swift_token_type_identifier ref -); - -@swift_attribute_child_type = @swift_expression | @swift_user_type - -#keyset[swift_attribute, index] -swift_attribute_child( - int swift_attribute: @swift_attribute ref, - int index: int ref, - unique int child: @swift_attribute_child_type ref -); - -swift_attribute_def( - unique int id: @swift_attribute -); - -@swift_availability_condition_child_type = @swift_identifier | @swift_token_integer_literal - -#keyset[swift_availability_condition, index] -swift_availability_condition_child( - int swift_availability_condition: @swift_availability_condition ref, - int index: int ref, - unique int child: @swift_availability_condition_child_type ref -); - -swift_availability_condition_def( - unique int id: @swift_availability_condition -); - -swift_await_expression_expr( - unique int swift_await_expression: @swift_await_expression ref, - unique int expr: @swift_expression ref -); - -swift_await_expression_child( - unique int swift_await_expression: @swift_await_expression ref, - unique int child: @swift_expression ref -); - -swift_await_expression_def( - unique int id: @swift_await_expression -); - -case @swift_bitwise_operation.op of - 0 = @swift_bitwise_operation_ampersand -| 1 = @swift_bitwise_operation_langlelangle -| 2 = @swift_bitwise_operation_ranglerangle -| 3 = @swift_bitwise_operation_caret -| 4 = @swift_bitwise_operation_pipe -; - - -swift_bitwise_operation_def( - unique int id: @swift_bitwise_operation, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -@swift_call_expression_child_type = @swift_call_suffix | @swift_expression - -#keyset[swift_call_expression, index] -swift_call_expression_child( - int swift_call_expression: @swift_call_expression ref, - int index: int ref, - unique int child: @swift_call_expression_child_type ref -); - -swift_call_expression_def( - unique int id: @swift_call_expression -); - -#keyset[swift_call_suffix, index] -swift_call_suffix_name( - int swift_call_suffix: @swift_call_suffix ref, - int index: int ref, - unique int name: @swift_token_simple_identifier ref -); - -@swift_call_suffix_child_type = @swift_lambda_literal | @swift_value_arguments - -#keyset[swift_call_suffix, index] -swift_call_suffix_child( - int swift_call_suffix: @swift_call_suffix ref, - int index: int ref, - unique int child: @swift_call_suffix_child_type ref -); - -swift_call_suffix_def( - unique int id: @swift_call_suffix -); - -#keyset[swift_capture_list, index] -swift_capture_list_child( - int swift_capture_list: @swift_capture_list ref, - int index: int ref, - unique int child: @swift_capture_list_item ref -); - -swift_capture_list_def( - unique int id: @swift_capture_list -); - -@swift_capture_list_item_name_type = @swift_token_self_expression | @swift_token_simple_identifier - -swift_capture_list_item_value( - unique int swift_capture_list_item: @swift_capture_list_item ref, - unique int value: @swift_expression ref -); - -swift_capture_list_item_child( - unique int swift_capture_list_item: @swift_capture_list_item ref, - unique int child: @swift_token_ownership_modifier ref -); - -swift_capture_list_item_def( - unique int id: @swift_capture_list_item, - int name: @swift_capture_list_item_name_type ref -); - -swift_catch_block_error( - unique int swift_catch_block: @swift_catch_block ref, - unique int error: @swift_pattern ref -); - -@swift_catch_block_child_type = @swift_statements | @swift_token_catch_keyword | @swift_where_clause - -#keyset[swift_catch_block, index] -swift_catch_block_child( - int swift_catch_block: @swift_catch_block ref, - int index: int ref, - unique int child: @swift_catch_block_child_type ref -); - -swift_catch_block_def( - unique int id: @swift_catch_block -); - -case @swift_check_expression.op of - 0 = @swift_check_expression_is -; - - -swift_check_expression_def( - unique int id: @swift_check_expression, - int op: int ref, - int target: @swift_expression ref, - int type__: @swift_type__ ref -); - -@swift_class_body_child_type = @swift_token_multiline_comment | @swift_type_level_declaration - -#keyset[swift_class_body, index] -swift_class_body_child( - int swift_class_body: @swift_class_body ref, - int index: int ref, - unique int child: @swift_class_body_child_type ref -); - -swift_class_body_def( - unique int id: @swift_class_body -); - -@swift_class_declaration_body_type = @swift_class_body | @swift_enum_class_body - -case @swift_class_declaration.declaration_kind of - 0 = @swift_class_declaration_actor -| 1 = @swift_class_declaration_class -| 2 = @swift_class_declaration_enum -| 3 = @swift_class_declaration_extension -| 4 = @swift_class_declaration_struct -; - - -@swift_class_declaration_name_type = @swift_token_type_identifier | @swift_unannotated_type - -@swift_class_declaration_child_type = @swift_attribute | @swift_inheritance_specifier | @swift_modifiers | @swift_token_inheritance_modifier | @swift_token_ownership_modifier | @swift_token_property_behavior_modifier | @swift_type_constraints | @swift_type_parameters - -#keyset[swift_class_declaration, index] -swift_class_declaration_child( - int swift_class_declaration: @swift_class_declaration ref, - int index: int ref, - unique int child: @swift_class_declaration_child_type ref -); - -swift_class_declaration_def( - unique int id: @swift_class_declaration, - int body: @swift_class_declaration_body_type ref, - int declaration_kind: int ref, - int name: @swift_class_declaration_name_type ref -); - -case @swift_comparison_expression.op of - 0 = @swift_comparison_expression_langle -| 1 = @swift_comparison_expression_langleequal -| 2 = @swift_comparison_expression_rangle -| 3 = @swift_comparison_expression_rangleequal -; - - -swift_comparison_expression_def( - unique int id: @swift_comparison_expression, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -@swift_computed_getter_child_type = @swift_attribute | @swift_getter_specifier | @swift_statements - -#keyset[swift_computed_getter, index] -swift_computed_getter_child( - int swift_computed_getter: @swift_computed_getter ref, - int index: int ref, - unique int child: @swift_computed_getter_child_type ref -); - -swift_computed_getter_def( - unique int id: @swift_computed_getter -); - -@swift_computed_modify_child_type = @swift_attribute | @swift_modify_specifier | @swift_statements - -#keyset[swift_computed_modify, index] -swift_computed_modify_child( - int swift_computed_modify: @swift_computed_modify ref, - int index: int ref, - unique int child: @swift_computed_modify_child_type ref -); - -swift_computed_modify_def( - unique int id: @swift_computed_modify -); - -@swift_computed_property_child_type = @swift_computed_getter | @swift_computed_modify | @swift_computed_setter | @swift_statements - -#keyset[swift_computed_property, index] -swift_computed_property_child( - int swift_computed_property: @swift_computed_property ref, - int index: int ref, - unique int child: @swift_computed_property_child_type ref -); - -swift_computed_property_def( - unique int id: @swift_computed_property -); - -@swift_computed_setter_child_type = @swift_attribute | @swift_setter_specifier | @swift_statements | @swift_token_simple_identifier - -#keyset[swift_computed_setter, index] -swift_computed_setter_child( - int swift_computed_setter: @swift_computed_setter ref, - int index: int ref, - unique int child: @swift_computed_setter_child_type ref -); - -swift_computed_setter_def( - unique int id: @swift_computed_setter -); - -case @swift_conjunction_expression.op of - 0 = @swift_conjunction_expression_ampersandampersand -; - - -swift_conjunction_expression_def( - unique int id: @swift_conjunction_expression, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -@swift_constructor_expression_constructed_type_type = @swift_array_type | @swift_dictionary_type | @swift_user_type - -swift_constructor_expression_def( - unique int id: @swift_constructor_expression, - int constructed_type: @swift_constructor_expression_constructed_type_type ref, - int child: @swift_constructor_suffix ref -); - -#keyset[swift_constructor_suffix, index] -swift_constructor_suffix_name( - int swift_constructor_suffix: @swift_constructor_suffix ref, - int index: int ref, - unique int name: @swift_token_simple_identifier ref -); - -@swift_constructor_suffix_child_type = @swift_lambda_literal | @swift_value_arguments - -#keyset[swift_constructor_suffix, index] -swift_constructor_suffix_child( - int swift_constructor_suffix: @swift_constructor_suffix ref, - int index: int ref, - unique int child: @swift_constructor_suffix_child_type ref -); - -swift_constructor_suffix_def( - unique int id: @swift_constructor_suffix -); - -swift_control_transfer_statement_result( - unique int swift_control_transfer_statement: @swift_control_transfer_statement ref, - unique int result: @swift_expression ref -); - -@swift_control_transfer_statement_child_type = @swift_expression | @swift_token_throw_keyword - -#keyset[swift_control_transfer_statement, index] -swift_control_transfer_statement_child( - int swift_control_transfer_statement: @swift_control_transfer_statement ref, - int index: int ref, - unique int child: @swift_control_transfer_statement_child_type ref -); - -swift_control_transfer_statement_def( - unique int id: @swift_control_transfer_statement -); - -swift_deinit_declaration_child( - unique int swift_deinit_declaration: @swift_deinit_declaration ref, - unique int child: @swift_modifiers ref -); - -swift_deinit_declaration_def( - unique int id: @swift_deinit_declaration, - int body: @swift_function_body ref -); - -@swift_deprecated_operator_declaration_body_child_type = @swift_line_string_literal | @swift_multi_line_string_literal | @swift_raw_string_literal | @swift_token_bin_literal | @swift_token_boolean_literal | @swift_token_hex_literal | @swift_token_integer_literal | @swift_token_oct_literal | @swift_token_real_literal | @swift_token_regex_literal | @swift_token_simple_identifier - -#keyset[swift_deprecated_operator_declaration_body, index] -swift_deprecated_operator_declaration_body_child( - int swift_deprecated_operator_declaration_body: @swift_deprecated_operator_declaration_body ref, - int index: int ref, - unique int child: @swift_deprecated_operator_declaration_body_child_type ref -); - -swift_deprecated_operator_declaration_body_def( - unique int id: @swift_deprecated_operator_declaration_body -); - -#keyset[swift_dictionary_literal, index] -swift_dictionary_literal_key( - int swift_dictionary_literal: @swift_dictionary_literal ref, - int index: int ref, - unique int key__: @swift_expression ref -); - -#keyset[swift_dictionary_literal, index] -swift_dictionary_literal_value( - int swift_dictionary_literal: @swift_dictionary_literal ref, - int index: int ref, - unique int value: @swift_expression ref -); - -swift_dictionary_literal_def( - unique int id: @swift_dictionary_literal -); - -swift_dictionary_type_def( - unique int id: @swift_dictionary_type, - int key__: @swift_type__ ref, - int value: @swift_type__ ref -); - -@swift_didset_clause_child_type = @swift_modifiers | @swift_statements | @swift_token_simple_identifier - -#keyset[swift_didset_clause, index] -swift_didset_clause_child( - int swift_didset_clause: @swift_didset_clause ref, - int index: int ref, - unique int child: @swift_didset_clause_child_type ref -); - -swift_didset_clause_def( - unique int id: @swift_didset_clause -); - -@swift_directive_child_type = @swift_token_boolean_literal | @swift_token_integer_literal | @swift_token_simple_identifier - -#keyset[swift_directive, index] -swift_directive_child( - int swift_directive: @swift_directive ref, - int index: int ref, - unique int child: @swift_directive_child_type ref -); - -swift_directive_def( - unique int id: @swift_directive -); - -swift_directly_assignable_expression_def( - unique int id: @swift_directly_assignable_expression, - int child: @swift_expression ref -); - -case @swift_disjunction_expression.op of - 0 = @swift_disjunction_expression_pipepipe -; - - -swift_disjunction_expression_def( - unique int id: @swift_disjunction_expression, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -@swift_do_statement_child_type = @swift_catch_block | @swift_statements - -#keyset[swift_do_statement, index] -swift_do_statement_child( - int swift_do_statement: @swift_do_statement ref, - int index: int ref, - unique int child: @swift_do_statement_child_type ref -); - -swift_do_statement_def( - unique int id: @swift_do_statement -); - -@swift_enum_class_body_child_type = @swift_enum_entry | @swift_type_level_declaration - -#keyset[swift_enum_class_body, index] -swift_enum_class_body_child( - int swift_enum_class_body: @swift_enum_class_body ref, - int index: int ref, - unique int child: @swift_enum_class_body_child_type ref -); - -swift_enum_class_body_def( - unique int id: @swift_enum_class_body -); - -#keyset[swift_enum_entry, index] -swift_enum_entry_data_contents( - int swift_enum_entry: @swift_enum_entry ref, - int index: int ref, - unique int data_contents: @swift_enum_type_parameters ref -); - -#keyset[swift_enum_entry, index] -swift_enum_entry_name( - int swift_enum_entry: @swift_enum_entry ref, - int index: int ref, - unique int name: @swift_token_simple_identifier ref -); - -#keyset[swift_enum_entry, index] -swift_enum_entry_raw_value( - int swift_enum_entry: @swift_enum_entry ref, - int index: int ref, - unique int raw_value: @swift_expression ref -); - -swift_enum_entry_child( - unique int swift_enum_entry: @swift_enum_entry ref, - unique int child: @swift_modifiers ref -); - -swift_enum_entry_def( - unique int id: @swift_enum_entry -); - -@swift_enum_type_parameters_child_type = @swift_expression | @swift_token_wildcard_pattern | @swift_type__ - -#keyset[swift_enum_type_parameters, index] -swift_enum_type_parameters_child( - int swift_enum_type_parameters: @swift_enum_type_parameters ref, - int index: int ref, - unique int child: @swift_enum_type_parameters_child_type ref -); - -swift_enum_type_parameters_def( - unique int id: @swift_enum_type_parameters -); - -@swift_equality_constraint_constrained_type_type = @swift_identifier | @swift_nested_type_identifier - -#keyset[swift_equality_constraint, index] -swift_equality_constraint_child( - int swift_equality_constraint: @swift_equality_constraint ref, - int index: int ref, - unique int child: @swift_attribute ref -); - -swift_equality_constraint_def( - unique int id: @swift_equality_constraint, - int constrained_type: @swift_equality_constraint_constrained_type_type ref, - int must_equal: @swift_type__ ref -); - -case @swift_equality_expression.op of - 0 = @swift_equality_expression_bangequal -| 1 = @swift_equality_expression_bangequalequal -| 2 = @swift_equality_expression_equalequal -| 3 = @swift_equality_expression_equalequalequal -; - - -swift_equality_expression_def( - unique int id: @swift_equality_expression, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -swift_existential_type_def( - unique int id: @swift_existential_type, - int child: @swift_unannotated_type ref -); - -@swift_expression = @swift_additive_expression | @swift_array_literal | @swift_as_expression | @swift_assignment | @swift_await_expression | @swift_bitwise_operation | @swift_call_expression | @swift_check_expression | @swift_comparison_expression | @swift_conjunction_expression | @swift_constructor_expression | @swift_dictionary_literal | @swift_directive | @swift_disjunction_expression | @swift_equality_expression | @swift_if_statement | @swift_infix_expression | @swift_key_path_expression | @swift_key_path_string_expression | @swift_lambda_literal | @swift_line_string_literal | @swift_macro_invocation | @swift_multi_line_string_literal | @swift_multiplicative_expression | @swift_navigation_expression | @swift_nil_coalescing_expression | @swift_open_end_range_expression | @swift_open_start_range_expression | @swift_optional_chain_marker | @swift_playground_literal | @swift_postfix_expression | @swift_prefix_expression | @swift_range_expression | @swift_raw_string_literal | @swift_referenceable_operator | @swift_reserved_word | @swift_selector_expression | @swift_switch_statement | @swift_ternary_expression | @swift_token_bin_literal | @swift_token_boolean_literal | @swift_token_diagnostic | @swift_token_fully_open_range | @swift_token_hex_literal | @swift_token_integer_literal | @swift_token_oct_literal | @swift_token_real_literal | @swift_token_regex_literal | @swift_token_self_expression | @swift_token_simple_identifier | @swift_token_special_literal | @swift_token_super_expression | @swift_try_expression | @swift_tuple_expression | @swift_value_pack_expansion | @swift_value_parameter_pack - -swift_external_macro_definition_def( - unique int id: @swift_external_macro_definition, - int child: @swift_value_arguments ref -); - -@swift_for_statement_child_type = @swift_statements | @swift_token_try_operator | @swift_type_annotation | @swift_where_clause - -#keyset[swift_for_statement, index] -swift_for_statement_child( - int swift_for_statement: @swift_for_statement ref, - int index: int ref, - unique int child: @swift_for_statement_child_type ref -); - -swift_for_statement_def( - unique int id: @swift_for_statement, - int collection: @swift_expression ref, - int item: @swift_pattern ref -); - -swift_function_body_child( - unique int swift_function_body: @swift_function_body ref, - unique int child: @swift_statements ref -); - -swift_function_body_def( - unique int id: @swift_function_body -); - -#keyset[swift_function_declaration, index] -swift_function_declaration_default_value( - int swift_function_declaration: @swift_function_declaration ref, - int index: int ref, - unique int default_value: @swift_expression ref -); - -@swift_function_declaration_name_type = @swift_referenceable_operator | @swift_token_simple_identifier - -@swift_function_declaration_return_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_function_declaration_return_type( - unique int swift_function_declaration: @swift_function_declaration ref, - unique int return_type: @swift_function_declaration_return_type_type ref -); - -@swift_function_declaration_child_type = @swift_attribute | @swift_modifiers | @swift_parameter | @swift_throws_clause | @swift_token_inheritance_modifier | @swift_token_ownership_modifier | @swift_token_property_behavior_modifier | @swift_token_throws | @swift_type_constraints | @swift_type_parameters - -#keyset[swift_function_declaration, index] -swift_function_declaration_child( - int swift_function_declaration: @swift_function_declaration ref, - int index: int ref, - unique int child: @swift_function_declaration_child_type ref -); - -swift_function_declaration_def( - unique int id: @swift_function_declaration, - int body: @swift_function_body ref, - int name: @swift_function_declaration_name_type ref -); - -@swift_function_type_child_type = @swift_throws_clause | @swift_token_throws - -swift_function_type_child( - unique int swift_function_type: @swift_function_type ref, - unique int child: @swift_function_type_child_type ref -); - -swift_function_type_def( - unique int id: @swift_function_type, - int params: @swift_unannotated_type ref, - int return_type: @swift_type__ ref -); - -@swift_getter_specifier_child_type = @swift_throws_clause | @swift_token_mutation_modifier | @swift_token_throws - -#keyset[swift_getter_specifier, index] -swift_getter_specifier_child( - int swift_getter_specifier: @swift_getter_specifier ref, - int index: int ref, - unique int child: @swift_getter_specifier_child_type ref -); - -swift_getter_specifier_def( - unique int id: @swift_getter_specifier -); - -@swift_global_declaration = @swift_associatedtype_declaration | @swift_class_declaration | @swift_function_declaration | @swift_import_declaration | @swift_init_declaration | @swift_macro_declaration | @swift_operator_declaration | @swift_precedence_group_declaration | @swift_property_declaration | @swift_protocol_declaration | @swift_typealias_declaration - -#keyset[swift_guard_statement, index] -swift_guard_statement_condition( - int swift_guard_statement: @swift_guard_statement ref, - int index: int ref, - unique int condition: @swift_if_condition ref -); - -@swift_guard_statement_child_type = @swift_statements | @swift_token_else - -#keyset[swift_guard_statement, index] -swift_guard_statement_child( - int swift_guard_statement: @swift_guard_statement ref, - int index: int ref, - unique int child: @swift_guard_statement_child_type ref -); - -swift_guard_statement_def( - unique int id: @swift_guard_statement -); - -#keyset[swift_identifier, index] -swift_identifier_child( - int swift_identifier: @swift_identifier ref, - int index: int ref, - unique int child: @swift_token_simple_identifier ref -); - -swift_identifier_def( - unique int id: @swift_identifier -); - -@swift_if_condition_child_type = @swift_availability_condition | @swift_expression | @swift_if_let_binding - -swift_if_condition_def( - unique int id: @swift_if_condition, - int child: @swift_if_condition_child_type ref -); - -swift_if_let_binding_bound_identifier( - unique int swift_if_let_binding: @swift_if_let_binding ref, - unique int bound_identifier: @swift_token_simple_identifier ref -); - -@swift_if_let_binding_child_type = @swift_expression | @swift_pattern | @swift_token_wildcard_pattern | @swift_type__ | @swift_type_annotation | @swift_user_type | @swift_value_binding_pattern | @swift_where_clause - -#keyset[swift_if_let_binding, index] -swift_if_let_binding_child( - int swift_if_let_binding: @swift_if_let_binding ref, - int index: int ref, - unique int child: @swift_if_let_binding_child_type ref -); - -swift_if_let_binding_def( - unique int id: @swift_if_let_binding -); - -#keyset[swift_if_statement, index] -swift_if_statement_condition( - int swift_if_statement: @swift_if_statement ref, - int index: int ref, - unique int condition: @swift_if_condition ref -); - -@swift_if_statement_child_type = @swift_if_statement | @swift_statements | @swift_token_else - -#keyset[swift_if_statement, index] -swift_if_statement_child( - int swift_if_statement: @swift_if_statement ref, - int index: int ref, - unique int child: @swift_if_statement_child_type ref -); - -swift_if_statement_def( - unique int id: @swift_if_statement -); - -swift_implicitly_unwrapped_type_def( - unique int id: @swift_implicitly_unwrapped_type, - int child: @swift_type__ ref -); - -@swift_import_declaration_child_type = @swift_identifier | @swift_modifiers - -#keyset[swift_import_declaration, index] -swift_import_declaration_child( - int swift_import_declaration: @swift_import_declaration ref, - int index: int ref, - unique int child: @swift_import_declaration_child_type ref -); - -swift_import_declaration_def( - unique int id: @swift_import_declaration -); - -swift_infix_expression_def( - unique int id: @swift_infix_expression, - int lhs: @swift_expression ref, - int op: @swift_token_custom_operator ref, - int rhs: @swift_expression ref -); - -@swift_inheritance_constraint_constrained_type_type = @swift_identifier | @swift_nested_type_identifier - -@swift_inheritance_constraint_inherits_from_type = @swift_implicitly_unwrapped_type | @swift_type__ - -#keyset[swift_inheritance_constraint, index] -swift_inheritance_constraint_child( - int swift_inheritance_constraint: @swift_inheritance_constraint ref, - int index: int ref, - unique int child: @swift_attribute ref -); - -swift_inheritance_constraint_def( - unique int id: @swift_inheritance_constraint, - int constrained_type: @swift_inheritance_constraint_constrained_type_type ref, - int inherits_from: @swift_inheritance_constraint_inherits_from_type ref -); - -@swift_inheritance_specifier_inherits_from_type = @swift_function_type | @swift_suppressed_constraint | @swift_user_type - -swift_inheritance_specifier_def( - unique int id: @swift_inheritance_specifier, - int inherits_from: @swift_inheritance_specifier_inherits_from_type ref -); - -swift_init_declaration_body( - unique int swift_init_declaration: @swift_init_declaration ref, - unique int body: @swift_function_body ref -); - -#keyset[swift_init_declaration, index] -swift_init_declaration_default_value( - int swift_init_declaration: @swift_init_declaration ref, - int index: int ref, - unique int default_value: @swift_expression ref -); - -case @swift_init_declaration.name of - 0 = @swift_init_declaration_init -; - - -@swift_init_declaration_child_type = @swift_attribute | @swift_modifiers | @swift_parameter | @swift_throws_clause | @swift_token_bang | @swift_token_throws | @swift_type_constraints | @swift_type_parameters - -#keyset[swift_init_declaration, index] -swift_init_declaration_child( - int swift_init_declaration: @swift_init_declaration ref, - int index: int ref, - unique int child: @swift_init_declaration_child_type ref -); - -swift_init_declaration_def( - unique int id: @swift_init_declaration, - int name: int ref -); - -swift_interpolated_expression_name( - unique int swift_interpolated_expression: @swift_interpolated_expression ref, - unique int name: @swift_value_argument_label ref -); - -#keyset[swift_interpolated_expression, index] -swift_interpolated_expression_reference_specifier( - int swift_interpolated_expression: @swift_interpolated_expression ref, - int index: int ref, - unique int reference_specifier: @swift_value_argument_label ref -); - -swift_interpolated_expression_value( - unique int swift_interpolated_expression: @swift_interpolated_expression ref, - unique int value: @swift_expression ref -); - -swift_interpolated_expression_child( - unique int swift_interpolated_expression: @swift_interpolated_expression ref, - unique int child: @swift_type_modifiers ref -); - -swift_interpolated_expression_def( - unique int id: @swift_interpolated_expression -); - -@swift_key_path_expression_child_type = @swift_array_type | @swift_dictionary_type | @swift_token_bang | @swift_token_simple_identifier | @swift_token_type_identifier | @swift_type_arguments | @swift_value_argument - -#keyset[swift_key_path_expression, index] -swift_key_path_expression_child( - int swift_key_path_expression: @swift_key_path_expression ref, - int index: int ref, - unique int child: @swift_key_path_expression_child_type ref -); - -swift_key_path_expression_def( - unique int id: @swift_key_path_expression -); - -swift_key_path_string_expression_def( - unique int id: @swift_key_path_string_expression, - int child: @swift_expression ref -); - -@swift_lambda_function_type_return_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_lambda_function_type_return_type( - unique int swift_lambda_function_type: @swift_lambda_function_type ref, - unique int return_type: @swift_lambda_function_type_return_type_type ref -); - -@swift_lambda_function_type_child_type = @swift_lambda_function_type_parameters | @swift_throws_clause | @swift_token_throws - -#keyset[swift_lambda_function_type, index] -swift_lambda_function_type_child( - int swift_lambda_function_type: @swift_lambda_function_type ref, - int index: int ref, - unique int child: @swift_lambda_function_type_child_type ref -); - -swift_lambda_function_type_def( - unique int id: @swift_lambda_function_type -); - -#keyset[swift_lambda_function_type_parameters, index] -swift_lambda_function_type_parameters_child( - int swift_lambda_function_type_parameters: @swift_lambda_function_type_parameters ref, - int index: int ref, - unique int child: @swift_lambda_parameter ref -); - -swift_lambda_function_type_parameters_def( - unique int id: @swift_lambda_function_type_parameters -); - -swift_lambda_literal_captures( - unique int swift_lambda_literal: @swift_lambda_literal ref, - unique int captures: @swift_capture_list ref -); - -swift_lambda_literal_type( - unique int swift_lambda_literal: @swift_lambda_literal ref, - unique int type__: @swift_lambda_function_type ref -); - -@swift_lambda_literal_child_type = @swift_attribute | @swift_statements - -#keyset[swift_lambda_literal, index] -swift_lambda_literal_child( - int swift_lambda_literal: @swift_lambda_literal ref, - int index: int ref, - unique int child: @swift_lambda_literal_child_type ref -); - -swift_lambda_literal_def( - unique int id: @swift_lambda_literal -); - -swift_lambda_parameter_external_name( - unique int swift_lambda_parameter: @swift_lambda_parameter ref, - unique int external_name: @swift_token_simple_identifier ref -); - -swift_lambda_parameter_name( - unique int swift_lambda_parameter: @swift_lambda_parameter ref, - unique int name: @swift_token_simple_identifier ref -); - -@swift_lambda_parameter_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_lambda_parameter_type( - unique int swift_lambda_parameter: @swift_lambda_parameter ref, - unique int type__: @swift_lambda_parameter_type_type ref -); - -@swift_lambda_parameter_child_type = @swift_parameter_modifiers | @swift_token_self_expression - -swift_lambda_parameter_child( - unique int swift_lambda_parameter: @swift_lambda_parameter ref, - unique int child: @swift_lambda_parameter_child_type ref -); - -swift_lambda_parameter_def( - unique int id: @swift_lambda_parameter -); - -#keyset[swift_line_string_literal, index] -swift_line_string_literal_interpolation( - int swift_line_string_literal: @swift_line_string_literal ref, - int index: int ref, - unique int interpolation: @swift_interpolated_expression ref -); - -@swift_line_string_literal_text_type = @swift_token_line_str_text | @swift_token_str_escaped_char - -#keyset[swift_line_string_literal, index] -swift_line_string_literal_text( - int swift_line_string_literal: @swift_line_string_literal ref, - int index: int ref, - unique int text: @swift_line_string_literal_text_type ref -); - -swift_line_string_literal_def( - unique int id: @swift_line_string_literal -); - -@swift_local_declaration = @swift_class_declaration | @swift_function_declaration | @swift_property_declaration | @swift_typealias_declaration - -#keyset[swift_macro_declaration, index] -swift_macro_declaration_default_value( - int swift_macro_declaration: @swift_macro_declaration ref, - int index: int ref, - unique int default_value: @swift_expression ref -); - -swift_macro_declaration_definition( - unique int swift_macro_declaration: @swift_macro_declaration ref, - unique int definition: @swift_macro_definition ref -); - -@swift_macro_declaration_child_type = @swift_attribute | @swift_modifiers | @swift_parameter | @swift_token_simple_identifier | @swift_type_constraints | @swift_type_parameters | @swift_unannotated_type - -#keyset[swift_macro_declaration, index] -swift_macro_declaration_child( - int swift_macro_declaration: @swift_macro_declaration ref, - int index: int ref, - unique int child: @swift_macro_declaration_child_type ref -); - -swift_macro_declaration_def( - unique int id: @swift_macro_declaration -); - -@swift_macro_definition_body_type = @swift_expression | @swift_external_macro_definition - -swift_macro_definition_def( - unique int id: @swift_macro_definition, - int body: @swift_macro_definition_body_type ref -); - -@swift_macro_invocation_child_type = @swift_call_suffix | @swift_token_simple_identifier | @swift_type_parameters - -#keyset[swift_macro_invocation, index] -swift_macro_invocation_child( - int swift_macro_invocation: @swift_macro_invocation ref, - int index: int ref, - unique int child: @swift_macro_invocation_child_type ref -); - -swift_macro_invocation_def( - unique int id: @swift_macro_invocation -); - -swift_metatype_def( - unique int id: @swift_metatype, - int child: @swift_unannotated_type ref -); - -@swift_modifiers_child_type = @swift_attribute | @swift_token_function_modifier | @swift_token_inheritance_modifier | @swift_token_member_modifier | @swift_token_mutation_modifier | @swift_token_ownership_modifier | @swift_token_parameter_modifier | @swift_token_property_behavior_modifier | @swift_token_property_modifier | @swift_token_visibility_modifier - -#keyset[swift_modifiers, index] -swift_modifiers_child( - int swift_modifiers: @swift_modifiers ref, - int index: int ref, - unique int child: @swift_modifiers_child_type ref -); - -swift_modifiers_def( - unique int id: @swift_modifiers -); - -swift_modify_specifier_child( - unique int swift_modify_specifier: @swift_modify_specifier ref, - unique int child: @swift_token_mutation_modifier ref -); - -swift_modify_specifier_def( - unique int id: @swift_modify_specifier -); - -#keyset[swift_multi_line_string_literal, index] -swift_multi_line_string_literal_interpolation( - int swift_multi_line_string_literal: @swift_multi_line_string_literal ref, - int index: int ref, - unique int interpolation: @swift_interpolated_expression ref -); - -@swift_multi_line_string_literal_text_type = @swift_reserved_word | @swift_token_multi_line_str_text | @swift_token_str_escaped_char - -#keyset[swift_multi_line_string_literal, index] -swift_multi_line_string_literal_text( - int swift_multi_line_string_literal: @swift_multi_line_string_literal ref, - int index: int ref, - unique int text: @swift_multi_line_string_literal_text_type ref -); - -swift_multi_line_string_literal_def( - unique int id: @swift_multi_line_string_literal -); - -case @swift_multiplicative_expression.op of - 0 = @swift_multiplicative_expression_percent -| 1 = @swift_multiplicative_expression_star -| 2 = @swift_multiplicative_expression_slash -; - - -swift_multiplicative_expression_def( - unique int id: @swift_multiplicative_expression, - int lhs: @swift_expression ref, - int op: int ref, - int rhs: @swift_expression ref -); - -@swift_navigation_expression_target_type = @swift_array_type | @swift_dictionary_type | @swift_existential_type | @swift_expression | @swift_opaque_type | @swift_reserved_word | @swift_user_type - -#keyset[swift_navigation_expression, index] -swift_navigation_expression_target( - int swift_navigation_expression: @swift_navigation_expression ref, - int index: int ref, - unique int target: @swift_navigation_expression_target_type ref -); - -swift_navigation_expression_def( - unique int id: @swift_navigation_expression, - int suffix: @swift_navigation_suffix ref -); - -@swift_navigation_suffix_suffix_type = @swift_token_integer_literal | @swift_token_simple_identifier - -swift_navigation_suffix_def( - unique int id: @swift_navigation_suffix, - int suffix: @swift_navigation_suffix_suffix_type ref -); - -@swift_nested_type_identifier_child_type = @swift_token_simple_identifier | @swift_unannotated_type - -#keyset[swift_nested_type_identifier, index] -swift_nested_type_identifier_child( - int swift_nested_type_identifier: @swift_nested_type_identifier ref, - int index: int ref, - unique int child: @swift_nested_type_identifier_child_type ref -); - -swift_nested_type_identifier_def( - unique int id: @swift_nested_type_identifier -); - -swift_nil_coalescing_expression_def( - unique int id: @swift_nil_coalescing_expression, - int if_nil: @swift_expression ref, - int value: @swift_expression ref -); - -swift_opaque_type_def( - unique int id: @swift_opaque_type, - int child: @swift_unannotated_type ref -); - -swift_open_end_range_expression_def( - unique int id: @swift_open_end_range_expression, - int start: @swift_expression ref -); - -swift_open_start_range_expression_def( - unique int id: @swift_open_start_range_expression, - int end: @swift_expression ref -); - -@swift_operator_declaration_child_type = @swift_deprecated_operator_declaration_body | @swift_referenceable_operator | @swift_token_simple_identifier - -#keyset[swift_operator_declaration, index] -swift_operator_declaration_child( - int swift_operator_declaration: @swift_operator_declaration ref, - int index: int ref, - unique int child: @swift_operator_declaration_child_type ref -); - -swift_operator_declaration_def( - unique int id: @swift_operator_declaration -); - -swift_optional_chain_marker_def( - unique int id: @swift_optional_chain_marker, - int child: @swift_expression ref -); - -@swift_optional_type_wrapped_type = @swift_array_type | @swift_dictionary_type | @swift_tuple_type | @swift_user_type - -swift_optional_type_def( - unique int id: @swift_optional_type, - int wrapped: @swift_optional_type_wrapped_type ref -); - -swift_parameter_external_name( - unique int swift_parameter: @swift_parameter ref, - unique int external_name: @swift_token_simple_identifier ref -); - -@swift_parameter_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_parameter_child( - unique int swift_parameter: @swift_parameter ref, - unique int child: @swift_parameter_modifiers ref -); - -swift_parameter_def( - unique int id: @swift_parameter, - int name: @swift_token_simple_identifier ref, - int type__: @swift_parameter_type_type ref -); - -#keyset[swift_parameter_modifiers, index] -swift_parameter_modifiers_child( - int swift_parameter_modifiers: @swift_parameter_modifiers ref, - int index: int ref, - unique int child: @swift_token_parameter_modifier ref -); - -swift_parameter_modifiers_def( - unique int id: @swift_parameter_modifiers -); - -swift_pattern_bound_identifier( - unique int swift_pattern: @swift_pattern ref, - unique int bound_identifier: @swift_token_simple_identifier ref -); - -@swift_pattern_child_type = @swift_expression | @swift_pattern | @swift_token_wildcard_pattern | @swift_type__ | @swift_user_type | @swift_value_binding_pattern - -#keyset[swift_pattern, index] -swift_pattern_child( - int swift_pattern: @swift_pattern ref, - int index: int ref, - unique int child: @swift_pattern_child_type ref -); - -swift_pattern_def( - unique int id: @swift_pattern -); - -#keyset[swift_playground_literal, index] -swift_playground_literal_child( - int swift_playground_literal: @swift_playground_literal ref, - int index: int ref, - unique int child: @swift_expression ref -); - -swift_playground_literal_def( - unique int id: @swift_playground_literal -); - -@swift_postfix_expression_operation_type = @swift_reserved_word | @swift_token_bang - -swift_postfix_expression_def( - unique int id: @swift_postfix_expression, - int operation: @swift_postfix_expression_operation_type ref, - int target: @swift_expression ref -); - -@swift_precedence_group_attribute_child_type = @swift_token_boolean_literal | @swift_token_simple_identifier - -#keyset[swift_precedence_group_attribute, index] -swift_precedence_group_attribute_child( - int swift_precedence_group_attribute: @swift_precedence_group_attribute ref, - int index: int ref, - unique int child: @swift_precedence_group_attribute_child_type ref -); - -swift_precedence_group_attribute_def( - unique int id: @swift_precedence_group_attribute -); - -#keyset[swift_precedence_group_attributes, index] -swift_precedence_group_attributes_child( - int swift_precedence_group_attributes: @swift_precedence_group_attributes ref, - int index: int ref, - unique int child: @swift_precedence_group_attribute ref -); - -swift_precedence_group_attributes_def( - unique int id: @swift_precedence_group_attributes -); - -@swift_precedence_group_declaration_child_type = @swift_precedence_group_attributes | @swift_token_simple_identifier - -#keyset[swift_precedence_group_declaration, index] -swift_precedence_group_declaration_child( - int swift_precedence_group_declaration: @swift_precedence_group_declaration ref, - int index: int ref, - unique int child: @swift_precedence_group_declaration_child_type ref -); - -swift_precedence_group_declaration_def( - unique int id: @swift_precedence_group_declaration -); - -@swift_prefix_expression_operation_type = @swift_reserved_word | @swift_token_bang | @swift_token_custom_operator - -swift_prefix_expression_def( - unique int id: @swift_prefix_expression, - int operation: @swift_prefix_expression_operation_type ref, - int target: @swift_expression ref -); - -#keyset[swift_property_declaration, index] -swift_property_declaration_computed_value( - int swift_property_declaration: @swift_property_declaration ref, - int index: int ref, - unique int computed_value: @swift_computed_property ref -); - -#keyset[swift_property_declaration, index] -swift_property_declaration_name( - int swift_property_declaration: @swift_property_declaration ref, - int index: int ref, - unique int name: @swift_pattern ref -); - -#keyset[swift_property_declaration, index] -swift_property_declaration_value( - int swift_property_declaration: @swift_property_declaration ref, - int index: int ref, - unique int value: @swift_expression ref -); - -@swift_property_declaration_child_type = @swift_attribute | @swift_modifiers | @swift_token_inheritance_modifier | @swift_token_ownership_modifier | @swift_token_property_behavior_modifier | @swift_type_annotation | @swift_type_constraints | @swift_value_binding_pattern | @swift_willset_didset_block - -#keyset[swift_property_declaration, index] -swift_property_declaration_child( - int swift_property_declaration: @swift_property_declaration ref, - int index: int ref, - unique int child: @swift_property_declaration_child_type ref -); - -swift_property_declaration_def( - unique int id: @swift_property_declaration -); - -#keyset[swift_protocol_body, index] -swift_protocol_body_child( - int swift_protocol_body: @swift_protocol_body ref, - int index: int ref, - unique int child: @swift_protocol_member_declaration ref -); - -swift_protocol_body_def( - unique int id: @swift_protocol_body -); - -#keyset[swift_protocol_composition_type, index] -swift_protocol_composition_type_child( - int swift_protocol_composition_type: @swift_protocol_composition_type ref, - int index: int ref, - unique int child: @swift_unannotated_type ref -); - -swift_protocol_composition_type_def( - unique int id: @swift_protocol_composition_type -); - -case @swift_protocol_declaration.declaration_kind of - 0 = @swift_protocol_declaration_protocol -; - - -@swift_protocol_declaration_child_type = @swift_attribute | @swift_inheritance_specifier | @swift_modifiers | @swift_type_constraints | @swift_type_parameters - -#keyset[swift_protocol_declaration, index] -swift_protocol_declaration_child( - int swift_protocol_declaration: @swift_protocol_declaration ref, - int index: int ref, - unique int child: @swift_protocol_declaration_child_type ref -); - -swift_protocol_declaration_def( - unique int id: @swift_protocol_declaration, - int body: @swift_protocol_body ref, - int declaration_kind: int ref, - int name: @swift_token_type_identifier ref -); - -swift_protocol_function_declaration_body( - unique int swift_protocol_function_declaration: @swift_protocol_function_declaration ref, - unique int body: @swift_function_body ref -); - -#keyset[swift_protocol_function_declaration, index] -swift_protocol_function_declaration_default_value( - int swift_protocol_function_declaration: @swift_protocol_function_declaration ref, - int index: int ref, - unique int default_value: @swift_expression ref -); - -@swift_protocol_function_declaration_name_type = @swift_referenceable_operator | @swift_token_simple_identifier - -@swift_protocol_function_declaration_return_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_protocol_function_declaration_return_type( - unique int swift_protocol_function_declaration: @swift_protocol_function_declaration ref, - unique int return_type: @swift_protocol_function_declaration_return_type_type ref -); - -@swift_protocol_function_declaration_child_type = @swift_attribute | @swift_modifiers | @swift_parameter | @swift_throws_clause | @swift_token_throws | @swift_type_constraints | @swift_type_parameters - -#keyset[swift_protocol_function_declaration, index] -swift_protocol_function_declaration_child( - int swift_protocol_function_declaration: @swift_protocol_function_declaration ref, - int index: int ref, - unique int child: @swift_protocol_function_declaration_child_type ref -); - -swift_protocol_function_declaration_def( - unique int id: @swift_protocol_function_declaration, - int name: @swift_protocol_function_declaration_name_type ref -); - -@swift_protocol_member_declaration = @swift_associatedtype_declaration | @swift_deinit_declaration | @swift_init_declaration | @swift_protocol_function_declaration | @swift_protocol_property_declaration | @swift_subscript_declaration | @swift_typealias_declaration - -@swift_protocol_property_declaration_child_type = @swift_modifiers | @swift_protocol_property_requirements | @swift_type_annotation | @swift_type_constraints - -#keyset[swift_protocol_property_declaration, index] -swift_protocol_property_declaration_child( - int swift_protocol_property_declaration: @swift_protocol_property_declaration ref, - int index: int ref, - unique int child: @swift_protocol_property_declaration_child_type ref -); - -swift_protocol_property_declaration_def( - unique int id: @swift_protocol_property_declaration, - int name: @swift_pattern ref -); - -@swift_protocol_property_requirements_child_type = @swift_getter_specifier | @swift_setter_specifier - -#keyset[swift_protocol_property_requirements, index] -swift_protocol_property_requirements_child( - int swift_protocol_property_requirements: @swift_protocol_property_requirements ref, - int index: int ref, - unique int child: @swift_protocol_property_requirements_child_type ref -); - -swift_protocol_property_requirements_def( - unique int id: @swift_protocol_property_requirements -); - -case @swift_range_expression.op of - 0 = @swift_range_expression_dotdotdot -| 1 = @swift_range_expression_dotdotlangle -; - - -swift_range_expression_def( - unique int id: @swift_range_expression, - int end: @swift_expression ref, - int op: int ref, - int start: @swift_expression ref -); - -#keyset[swift_raw_str_interpolation, index] -swift_raw_str_interpolation_interpolation( - int swift_raw_str_interpolation: @swift_raw_str_interpolation ref, - int index: int ref, - unique int interpolation: @swift_interpolated_expression ref -); - -swift_raw_str_interpolation_def( - unique int id: @swift_raw_str_interpolation, - int child: @swift_token_raw_str_interpolation_start ref -); - -#keyset[swift_raw_string_literal, index] -swift_raw_string_literal_interpolation( - int swift_raw_string_literal: @swift_raw_string_literal ref, - int index: int ref, - unique int interpolation: @swift_raw_str_interpolation ref -); - -@swift_raw_string_literal_text_type = @swift_token_raw_str_end_part | @swift_token_raw_str_part - -#keyset[swift_raw_string_literal, index] -swift_raw_string_literal_text( - int swift_raw_string_literal: @swift_raw_string_literal ref, - int index: int ref, - unique int text: @swift_raw_string_literal_text_type ref -); - -#keyset[swift_raw_string_literal, index] -swift_raw_string_literal_child( - int swift_raw_string_literal: @swift_raw_string_literal ref, - int index: int ref, - unique int child: @swift_token_raw_str_continuing_indicator ref -); - -swift_raw_string_literal_def( - unique int id: @swift_raw_string_literal -); - -@swift_referenceable_operator_child_type = @swift_token_bang | @swift_token_custom_operator - -swift_referenceable_operator_child( - unique int swift_referenceable_operator: @swift_referenceable_operator ref, - unique int child: @swift_referenceable_operator_child_type ref -); - -swift_referenceable_operator_def( - unique int id: @swift_referenceable_operator -); - -#keyset[swift_repeat_while_statement, index] -swift_repeat_while_statement_condition( - int swift_repeat_while_statement: @swift_repeat_while_statement ref, - int index: int ref, - unique int condition: @swift_if_condition ref -); - -swift_repeat_while_statement_child( - unique int swift_repeat_while_statement: @swift_repeat_while_statement ref, - unique int child: @swift_statements ref -); - -swift_repeat_while_statement_def( - unique int id: @swift_repeat_while_statement -); - -swift_selector_expression_def( - unique int id: @swift_selector_expression, - int child: @swift_expression ref -); - -swift_setter_specifier_child( - unique int swift_setter_specifier: @swift_setter_specifier ref, - unique int child: @swift_token_mutation_modifier ref -); - -swift_setter_specifier_def( - unique int id: @swift_setter_specifier -); - -@swift_source_file_child_type = @swift_do_statement | @swift_expression | @swift_for_statement | @swift_global_declaration | @swift_guard_statement | @swift_repeat_while_statement | @swift_token_shebang_line | @swift_token_statement_label | @swift_token_throw_keyword | @swift_while_statement - -#keyset[swift_source_file, index] -swift_source_file_child( - int swift_source_file: @swift_source_file ref, - int index: int ref, - unique int child: @swift_source_file_child_type ref -); - -swift_source_file_def( - unique int id: @swift_source_file -); - -@swift_statements_child_type = @swift_control_transfer_statement | @swift_do_statement | @swift_expression | @swift_for_statement | @swift_guard_statement | @swift_local_declaration | @swift_repeat_while_statement | @swift_token_statement_label | @swift_while_statement - -#keyset[swift_statements, index] -swift_statements_child( - int swift_statements: @swift_statements ref, - int index: int ref, - unique int child: @swift_statements_child_type ref -); - -swift_statements_def( - unique int id: @swift_statements -); - -#keyset[swift_subscript_declaration, index] -swift_subscript_declaration_default_value( - int swift_subscript_declaration: @swift_subscript_declaration ref, - int index: int ref, - unique int default_value: @swift_expression ref -); - -@swift_subscript_declaration_return_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_subscript_declaration_return_type( - unique int swift_subscript_declaration: @swift_subscript_declaration ref, - unique int return_type: @swift_subscript_declaration_return_type_type ref -); - -@swift_subscript_declaration_child_type = @swift_attribute | @swift_computed_property | @swift_modifiers | @swift_parameter | @swift_type_constraints | @swift_type_parameters - -#keyset[swift_subscript_declaration, index] -swift_subscript_declaration_child( - int swift_subscript_declaration: @swift_subscript_declaration ref, - int index: int ref, - unique int child: @swift_subscript_declaration_child_type ref -); - -swift_subscript_declaration_def( - unique int id: @swift_subscript_declaration -); - -swift_suppressed_constraint_def( - unique int id: @swift_suppressed_constraint, - int suppressed: @swift_token_type_identifier ref -); - -@swift_switch_entry_child_type = @swift_expression | @swift_modifiers | @swift_statements | @swift_switch_pattern | @swift_token_default_keyword | @swift_token_where_keyword - -#keyset[swift_switch_entry, index] -swift_switch_entry_child( - int swift_switch_entry: @swift_switch_entry ref, - int index: int ref, - unique int child: @swift_switch_entry_child_type ref -); - -swift_switch_entry_def( - unique int id: @swift_switch_entry -); - -swift_switch_pattern_def( - unique int id: @swift_switch_pattern, - int child: @swift_pattern ref -); - -#keyset[swift_switch_statement, index] -swift_switch_statement_child( - int swift_switch_statement: @swift_switch_statement ref, - int index: int ref, - unique int child: @swift_switch_entry ref -); - -swift_switch_statement_def( - unique int id: @swift_switch_statement, - int expr: @swift_expression ref -); - -swift_ternary_expression_def( - unique int id: @swift_ternary_expression, - int condition: @swift_expression ref, - int if_false: @swift_expression ref, - int if_true: @swift_expression ref -); - -swift_throws_clause_def( - unique int id: @swift_throws_clause, - int type__: @swift_unannotated_type ref -); - -swift_try_expression_def( - unique int id: @swift_try_expression, - int expr: @swift_expression ref, - int child: @swift_token_try_operator ref -); - -#keyset[swift_tuple_expression, index] -swift_tuple_expression_name( - int swift_tuple_expression: @swift_tuple_expression ref, - int index: int ref, - unique int name: @swift_token_simple_identifier ref -); - -#keyset[swift_tuple_expression, index] -swift_tuple_expression_value( - int swift_tuple_expression: @swift_tuple_expression ref, - int index: int ref, - unique int value: @swift_expression ref -); - -swift_tuple_expression_def( - unique int id: @swift_tuple_expression -); - -#keyset[swift_tuple_type, index] -swift_tuple_type_element( - int swift_tuple_type: @swift_tuple_type ref, - int index: int ref, - unique int element: @swift_tuple_type_item ref -); - -swift_tuple_type_child( - unique int swift_tuple_type: @swift_tuple_type ref, - unique int child: @swift_tuple_type_item ref -); - -swift_tuple_type_def( - unique int id: @swift_tuple_type -); - -swift_tuple_type_item_name( - unique int swift_tuple_type_item: @swift_tuple_type_item ref, - unique int name: @swift_token_simple_identifier ref -); - -swift_tuple_type_item_type( - unique int swift_tuple_type_item: @swift_tuple_type_item ref, - unique int type__: @swift_type__ ref -); - -@swift_tuple_type_item_child_type = @swift_dictionary_type | @swift_existential_type | @swift_opaque_type | @swift_parameter_modifiers | @swift_token_wildcard_pattern - -#keyset[swift_tuple_type_item, index] -swift_tuple_type_item_child( - int swift_tuple_type_item: @swift_tuple_type_item ref, +/*- Unified dbscheme -*/ +#keyset[unified_apply_pattern, index] +unified_apply_pattern_argument( + int unified_apply_pattern: @unified_apply_pattern ref, int index: int ref, - unique int child: @swift_tuple_type_item_child_type ref -); - -swift_tuple_type_item_def( - unique int id: @swift_tuple_type_item + unique int argument: @unified_pattern ref ); -swift_type_modifiers( - unique int swift_type__: @swift_type__ ref, - unique int modifiers: @swift_type_modifiers ref +unified_apply_pattern_def( + unique int id: @unified_apply_pattern, + int constructor: @unified_expr ref ); -swift_type_def( - unique int id: @swift_type__, - int name: @swift_unannotated_type ref +unified_binary_expr_def( + unique int id: @unified_binary_expr, + int left: @unified_expr ref, + int operator: @unified_token_operator ref, + int right: @unified_expr ref ); -@swift_type_annotation_type_type = @swift_implicitly_unwrapped_type | @swift_type__ - -swift_type_annotation_def( - unique int id: @swift_type_annotation, - int type__: @swift_type_annotation_type_type ref -); - -#keyset[swift_type_arguments, index] -swift_type_arguments_child( - int swift_type_arguments: @swift_type_arguments ref, +#keyset[unified_block_stmt, index] +unified_block_stmt_body( + int unified_block_stmt: @unified_block_stmt ref, int index: int ref, - unique int child: @swift_type__ ref -); - -swift_type_arguments_def( - unique int id: @swift_type_arguments + unique int body: @unified_stmt ref ); -@swift_type_constraint_child_type = @swift_equality_constraint | @swift_inheritance_constraint - -swift_type_constraint_def( - unique int id: @swift_type_constraint, - int child: @swift_type_constraint_child_type ref +unified_block_stmt_def( + unique int id: @unified_block_stmt ); -@swift_type_constraints_child_type = @swift_token_where_keyword | @swift_type_constraint - -#keyset[swift_type_constraints, index] -swift_type_constraints_child( - int swift_type_constraints: @swift_type_constraints ref, +#keyset[unified_call_expr, index] +unified_call_expr_argument( + int unified_call_expr: @unified_call_expr ref, int index: int ref, - unique int child: @swift_type_constraints_child_type ref + unique int argument: @unified_expr ref ); -swift_type_constraints_def( - unique int id: @swift_type_constraints +unified_call_expr_def( + unique int id: @unified_call_expr, + int function: @unified_expr ref ); -@swift_type_level_declaration = @swift_associatedtype_declaration | @swift_class_declaration | @swift_deinit_declaration | @swift_function_declaration | @swift_import_declaration | @swift_init_declaration | @swift_operator_declaration | @swift_precedence_group_declaration | @swift_property_declaration | @swift_protocol_declaration | @swift_subscript_declaration | @swift_typealias_declaration - -#keyset[swift_type_modifiers, index] -swift_type_modifiers_child( - int swift_type_modifiers: @swift_type_modifiers ref, - int index: int ref, - unique int child: @swift_attribute ref -); +@unified_condition = @unified_expr_condition | @unified_let_pattern_condition | @unified_sequence_condition | @unified_token_unsupported_node -swift_type_modifiers_def( - unique int id: @swift_type_modifiers -); +@unified_expr = @unified_binary_expr | @unified_call_expr | @unified_lambda_expr | @unified_member_access_expr | @unified_name_expr | @unified_token_int_literal | @unified_token_string_literal | @unified_token_unsupported_node | @unified_unary_expr -swift_type_pack_expansion_def( - unique int id: @swift_type_pack_expansion, - int child: @swift_unannotated_type ref +unified_expr_condition_def( + unique int id: @unified_expr_condition, + int expr: @unified_expr ref ); -@swift_type_parameter_child_type = @swift_token_type_identifier | @swift_type__ | @swift_type_parameter_modifiers | @swift_type_parameter_pack - -#keyset[swift_type_parameter, index] -swift_type_parameter_child( - int swift_type_parameter: @swift_type_parameter ref, - int index: int ref, - unique int child: @swift_type_parameter_child_type ref +unified_expr_stmt_def( + unique int id: @unified_expr_stmt, + int expr: @unified_expr ref ); -swift_type_parameter_def( - unique int id: @swift_type_parameter +unified_guard_if_stmt_def( + unique int id: @unified_guard_if_stmt, + int condition: @unified_condition ref, + int else: @unified_stmt ref ); -#keyset[swift_type_parameter_modifiers, index] -swift_type_parameter_modifiers_child( - int swift_type_parameter_modifiers: @swift_type_parameter_modifiers ref, - int index: int ref, - unique int child: @swift_attribute ref +unified_if_stmt_else( + unique int unified_if_stmt: @unified_if_stmt ref, + unique int else: @unified_stmt ref ); -swift_type_parameter_modifiers_def( - unique int id: @swift_type_parameter_modifiers +unified_if_stmt_then( + unique int unified_if_stmt: @unified_if_stmt ref, + unique int then: @unified_stmt ref ); -swift_type_parameter_pack_def( - unique int id: @swift_type_parameter_pack, - int child: @swift_unannotated_type ref +unified_if_stmt_def( + unique int id: @unified_if_stmt, + int condition: @unified_condition ref ); -@swift_type_parameters_child_type = @swift_type_constraints | @swift_type_parameter +@unified_lambda_expr_body_type = @unified_expr | @unified_stmt -#keyset[swift_type_parameters, index] -swift_type_parameters_child( - int swift_type_parameters: @swift_type_parameters ref, +#keyset[unified_lambda_expr, index] +unified_lambda_expr_parameter( + int unified_lambda_expr: @unified_lambda_expr ref, int index: int ref, - unique int child: @swift_type_parameters_child_type ref + unique int parameter: @unified_parameter ref ); -swift_type_parameters_def( - unique int id: @swift_type_parameters +unified_lambda_expr_def( + unique int id: @unified_lambda_expr, + int body: @unified_lambda_expr_body_type ref ); -@swift_typealias_declaration_child_type = @swift_attribute | @swift_modifiers | @swift_token_inheritance_modifier | @swift_token_ownership_modifier | @swift_token_property_behavior_modifier | @swift_type_parameters - -#keyset[swift_typealias_declaration, index] -swift_typealias_declaration_child( - int swift_typealias_declaration: @swift_typealias_declaration ref, - int index: int ref, - unique int child: @swift_typealias_declaration_child_type ref +unified_let_pattern_condition_def( + unique int id: @unified_let_pattern_condition, + int pattern: @unified_pattern ref, + int value: @unified_expr ref ); -swift_typealias_declaration_def( - unique int id: @swift_typealias_declaration, - int name: @swift_token_type_identifier ref, - int value: @swift_type__ ref +unified_member_access_expr_def( + unique int id: @unified_member_access_expr, + int member: @unified_token_identifier ref, + int target: @unified_expr ref ); -@swift_unannotated_type = @swift_array_type | @swift_dictionary_type | @swift_existential_type | @swift_function_type | @swift_metatype | @swift_opaque_type | @swift_optional_type | @swift_protocol_composition_type | @swift_suppressed_constraint | @swift_tuple_type | @swift_type_pack_expansion | @swift_type_parameter_pack | @swift_user_type - -@swift_user_type_child_type = @swift_token_type_identifier | @swift_type_arguments - -#keyset[swift_user_type, index] -swift_user_type_child( - int swift_user_type: @swift_user_type ref, - int index: int ref, - unique int child: @swift_user_type_child_type ref +unified_name_expr_def( + unique int id: @unified_name_expr, + int identifier: @unified_token_identifier ref ); -swift_user_type_def( - unique int id: @swift_user_type +unified_parameter_def( + unique int id: @unified_parameter, + int pattern: @unified_pattern ref ); -swift_value_argument_name( - unique int swift_value_argument: @swift_value_argument ref, - unique int name: @swift_value_argument_label ref -); +@unified_pattern = @unified_apply_pattern | @unified_token_ignore_pattern | @unified_token_unsupported_node | @unified_tuple_pattern | @unified_var_pattern -#keyset[swift_value_argument, index] -swift_value_argument_reference_specifier( - int swift_value_argument: @swift_value_argument ref, +#keyset[unified_sequence_condition, index] +unified_sequence_condition_stmt( + int unified_sequence_condition: @unified_sequence_condition ref, int index: int ref, - unique int reference_specifier: @swift_value_argument_label ref + unique int stmt: @unified_stmt ref ); -swift_value_argument_value( - unique int swift_value_argument: @swift_value_argument ref, - unique int value: @swift_expression ref +unified_sequence_condition_def( + unique int id: @unified_sequence_condition, + int condition: @unified_condition ref ); -swift_value_argument_child( - unique int swift_value_argument: @swift_value_argument ref, - unique int child: @swift_type_modifiers ref -); - -swift_value_argument_def( - unique int id: @swift_value_argument -); +@unified_stmt = @unified_block_stmt | @unified_expr_stmt | @unified_guard_if_stmt | @unified_if_stmt | @unified_token_empty_stmt | @unified_token_unsupported_node | @unified_variable_declaration_stmt -swift_value_argument_label_def( - unique int id: @swift_value_argument_label, - int child: @swift_token_simple_identifier ref -); +@unified_top_level_body_type = @unified_expr | @unified_stmt -#keyset[swift_value_arguments, index] -swift_value_arguments_child( - int swift_value_arguments: @swift_value_arguments ref, +#keyset[unified_top_level, index] +unified_top_level_body( + int unified_top_level: @unified_top_level ref, int index: int ref, - unique int child: @swift_value_argument ref + unique int body: @unified_top_level_body_type ref ); -swift_value_arguments_def( - unique int id: @swift_value_arguments +unified_top_level_def( + unique int id: @unified_top_level ); -case @swift_value_binding_pattern.mutability of - 0 = @swift_value_binding_pattern_let -| 1 = @swift_value_binding_pattern_var -; - - -swift_value_binding_pattern_def( - unique int id: @swift_value_binding_pattern, - int mutability: int ref -); - -swift_value_pack_expansion_def( - unique int id: @swift_value_pack_expansion, - int child: @swift_expression ref -); - -swift_value_parameter_pack_def( - unique int id: @swift_value_parameter_pack, - int child: @swift_expression ref -); - -@swift_where_clause_child_type = @swift_expression | @swift_token_where_keyword - -#keyset[swift_where_clause, index] -swift_where_clause_child( - int swift_where_clause: @swift_where_clause ref, +#keyset[unified_tuple_pattern, index] +unified_tuple_pattern_element( + int unified_tuple_pattern: @unified_tuple_pattern ref, int index: int ref, - unique int child: @swift_where_clause_child_type ref -); - -swift_where_clause_def( - unique int id: @swift_where_clause + unique int element: @unified_pattern ref ); -#keyset[swift_while_statement, index] -swift_while_statement_condition( - int swift_while_statement: @swift_while_statement ref, - int index: int ref, - unique int condition: @swift_if_condition ref +unified_tuple_pattern_def( + unique int id: @unified_tuple_pattern ); -swift_while_statement_child( - unique int swift_while_statement: @swift_while_statement ref, - unique int child: @swift_statements ref +unified_unary_expr_def( + unique int id: @unified_unary_expr, + int operand: @unified_expr ref, + int operator: @unified_token_operator ref ); -swift_while_statement_def( - unique int id: @swift_while_statement +unified_var_pattern_def( + unique int id: @unified_var_pattern, + int identifier: @unified_token_identifier ref ); -@swift_willset_clause_child_type = @swift_modifiers | @swift_statements | @swift_token_simple_identifier - -#keyset[swift_willset_clause, index] -swift_willset_clause_child( - int swift_willset_clause: @swift_willset_clause ref, +#keyset[unified_variable_declaration_stmt, index] +unified_variable_declaration_stmt_variable_declarator( + int unified_variable_declaration_stmt: @unified_variable_declaration_stmt ref, int index: int ref, - unique int child: @swift_willset_clause_child_type ref + unique int variable_declarator: @unified_variable_declarator ref ); -swift_willset_clause_def( - unique int id: @swift_willset_clause +unified_variable_declaration_stmt_def( + unique int id: @unified_variable_declaration_stmt ); -@swift_willset_didset_block_child_type = @swift_didset_clause | @swift_willset_clause - -#keyset[swift_willset_didset_block, index] -swift_willset_didset_block_child( - int swift_willset_didset_block: @swift_willset_didset_block ref, - int index: int ref, - unique int child: @swift_willset_didset_block_child_type ref +unified_variable_declarator_value( + unique int unified_variable_declarator: @unified_variable_declarator ref, + unique int value: @unified_expr ref ); -swift_willset_didset_block_def( - unique int id: @swift_willset_didset_block +unified_variable_declarator_def( + unique int id: @unified_variable_declarator, + int pattern: @unified_pattern ref ); -swift_tokeninfo( - unique int id: @swift_token, +unified_tokeninfo( + unique int id: @unified_token, int kind: int ref, string value: string ref ); -case @swift_token.kind of - 0 = @swift_reserved_word -| 1 = @swift_token_as_operator -| 2 = @swift_token_bang -| 3 = @swift_token_bin_literal -| 4 = @swift_token_boolean_literal -| 5 = @swift_token_catch_keyword -| 6 = @swift_token_comment -| 7 = @swift_token_custom_operator -| 8 = @swift_token_default_keyword -| 9 = @swift_token_diagnostic -| 10 = @swift_token_else -| 11 = @swift_token_fully_open_range -| 12 = @swift_token_function_modifier -| 13 = @swift_token_hex_literal -| 14 = @swift_token_inheritance_modifier -| 15 = @swift_token_integer_literal -| 16 = @swift_token_line_str_text -| 17 = @swift_token_member_modifier -| 18 = @swift_token_multi_line_str_text -| 19 = @swift_token_multiline_comment -| 20 = @swift_token_mutation_modifier -| 21 = @swift_token_oct_literal -| 22 = @swift_token_ownership_modifier -| 23 = @swift_token_parameter_modifier -| 24 = @swift_token_property_behavior_modifier -| 25 = @swift_token_property_modifier -| 26 = @swift_token_raw_str_continuing_indicator -| 27 = @swift_token_raw_str_end_part -| 28 = @swift_token_raw_str_interpolation_start -| 29 = @swift_token_raw_str_part -| 30 = @swift_token_real_literal -| 31 = @swift_token_regex_literal -| 32 = @swift_token_self_expression -| 33 = @swift_token_shebang_line -| 34 = @swift_token_simple_identifier -| 35 = @swift_token_special_literal -| 36 = @swift_token_statement_label -| 37 = @swift_token_str_escaped_char -| 38 = @swift_token_super_expression -| 39 = @swift_token_throw_keyword -| 40 = @swift_token_throws -| 41 = @swift_token_try_operator -| 42 = @swift_token_type_identifier -| 43 = @swift_token_visibility_modifier -| 44 = @swift_token_where_keyword -| 45 = @swift_token_wildcard_pattern +case @unified_token.kind of + 1 = @unified_token_empty_stmt +| 2 = @unified_token_identifier +| 3 = @unified_token_ignore_pattern +| 4 = @unified_token_int_literal +| 5 = @unified_token_operator +| 6 = @unified_token_string_literal +| 7 = @unified_token_unsupported_node ; -@swift_ast_node = @swift_additive_expression | @swift_array_literal | @swift_array_type | @swift_as_expression | @swift_assignment | @swift_associatedtype_declaration | @swift_attribute | @swift_availability_condition | @swift_await_expression | @swift_bitwise_operation | @swift_call_expression | @swift_call_suffix | @swift_capture_list | @swift_capture_list_item | @swift_catch_block | @swift_check_expression | @swift_class_body | @swift_class_declaration | @swift_comparison_expression | @swift_computed_getter | @swift_computed_modify | @swift_computed_property | @swift_computed_setter | @swift_conjunction_expression | @swift_constructor_expression | @swift_constructor_suffix | @swift_control_transfer_statement | @swift_deinit_declaration | @swift_deprecated_operator_declaration_body | @swift_dictionary_literal | @swift_dictionary_type | @swift_didset_clause | @swift_directive | @swift_directly_assignable_expression | @swift_disjunction_expression | @swift_do_statement | @swift_enum_class_body | @swift_enum_entry | @swift_enum_type_parameters | @swift_equality_constraint | @swift_equality_expression | @swift_existential_type | @swift_external_macro_definition | @swift_for_statement | @swift_function_body | @swift_function_declaration | @swift_function_type | @swift_getter_specifier | @swift_guard_statement | @swift_identifier | @swift_if_condition | @swift_if_let_binding | @swift_if_statement | @swift_implicitly_unwrapped_type | @swift_import_declaration | @swift_infix_expression | @swift_inheritance_constraint | @swift_inheritance_specifier | @swift_init_declaration | @swift_interpolated_expression | @swift_key_path_expression | @swift_key_path_string_expression | @swift_lambda_function_type | @swift_lambda_function_type_parameters | @swift_lambda_literal | @swift_lambda_parameter | @swift_line_string_literal | @swift_macro_declaration | @swift_macro_definition | @swift_macro_invocation | @swift_metatype | @swift_modifiers | @swift_modify_specifier | @swift_multi_line_string_literal | @swift_multiplicative_expression | @swift_navigation_expression | @swift_navigation_suffix | @swift_nested_type_identifier | @swift_nil_coalescing_expression | @swift_opaque_type | @swift_open_end_range_expression | @swift_open_start_range_expression | @swift_operator_declaration | @swift_optional_chain_marker | @swift_optional_type | @swift_parameter | @swift_parameter_modifiers | @swift_pattern | @swift_playground_literal | @swift_postfix_expression | @swift_precedence_group_attribute | @swift_precedence_group_attributes | @swift_precedence_group_declaration | @swift_prefix_expression | @swift_property_declaration | @swift_protocol_body | @swift_protocol_composition_type | @swift_protocol_declaration | @swift_protocol_function_declaration | @swift_protocol_property_declaration | @swift_protocol_property_requirements | @swift_range_expression | @swift_raw_str_interpolation | @swift_raw_string_literal | @swift_referenceable_operator | @swift_repeat_while_statement | @swift_selector_expression | @swift_setter_specifier | @swift_source_file | @swift_statements | @swift_subscript_declaration | @swift_suppressed_constraint | @swift_switch_entry | @swift_switch_pattern | @swift_switch_statement | @swift_ternary_expression | @swift_throws_clause | @swift_token | @swift_try_expression | @swift_tuple_expression | @swift_tuple_type | @swift_tuple_type_item | @swift_type__ | @swift_type_annotation | @swift_type_arguments | @swift_type_constraint | @swift_type_constraints | @swift_type_modifiers | @swift_type_pack_expansion | @swift_type_parameter | @swift_type_parameter_modifiers | @swift_type_parameter_pack | @swift_type_parameters | @swift_typealias_declaration | @swift_user_type | @swift_value_argument | @swift_value_argument_label | @swift_value_arguments | @swift_value_binding_pattern | @swift_value_pack_expansion | @swift_value_parameter_pack | @swift_where_clause | @swift_while_statement | @swift_willset_clause | @swift_willset_didset_block +@unified_ast_node = @unified_apply_pattern | @unified_binary_expr | @unified_block_stmt | @unified_call_expr | @unified_expr_condition | @unified_expr_stmt | @unified_guard_if_stmt | @unified_if_stmt | @unified_lambda_expr | @unified_let_pattern_condition | @unified_member_access_expr | @unified_name_expr | @unified_parameter | @unified_sequence_condition | @unified_token | @unified_top_level | @unified_tuple_pattern | @unified_unary_expr | @unified_var_pattern | @unified_variable_declaration_stmt | @unified_variable_declarator -swift_ast_node_location( - unique int node: @swift_ast_node ref, +unified_ast_node_location( + unique int node: @unified_ast_node ref, int loc: @location_default ref ); #keyset[parent, parent_index] -swift_ast_node_parent( - unique int node: @swift_ast_node ref, - int parent: @swift_ast_node ref, +unified_ast_node_parent( + unique int node: @unified_ast_node ref, + int parent: @unified_ast_node ref, int parent_index: int ref ); diff --git a/unified/ql/test/library-tests/BasicTest/name_expr.swift b/unified/ql/test/library-tests/BasicTest/name_expr.swift new file mode 100644 index 000000000000..613f3a62861a --- /dev/null +++ b/unified/ql/test/library-tests/BasicTest/name_expr.swift @@ -0,0 +1 @@ +var x = y + 2; diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 62b8146bf040..5298ec6f982f 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -1,101 +1,9 @@ -identifier -| test.swift:1:8:1:17 | Foundation | Foundation | -| test.swift:5:9:5:13 | items | items | -| test.swift:7:19:7:21 | add | add | -| test.swift:7:23:7:23 | _ | _ | -| test.swift:7:25:7:28 | item | item | -| test.swift:8:9:8:13 | items | items | -| test.swift:8:15:8:20 | append | append | -| test.swift:8:22:8:25 | item | item | -| test.swift:11:10:11:17 | contains | contains | -| test.swift:11:19:11:19 | _ | _ | -| test.swift:11:21:11:24 | item | item | -| test.swift:12:16:12:20 | items | items | -| test.swift:12:22:12:29 | contains | contains | -| test.swift:12:31:12:34 | item | item | -| test.swift:19:9:19:13 | count | count | -| test.swift:20:10:20:13 | item | item | -| test.swift:20:15:20:16 | at | at | -| test.swift:20:18:20:22 | index | index | -| test.swift:24:6:24:10 | merge | merge | -| test.swift:24:27:24:27 | _ | _ | -| test.swift:24:29:24:33 | first | first | -| test.swift:24:39:24:39 | _ | _ | -| test.swift:24:41:24:46 | second | second | -| test.swift:24:73:24:73 | T | T | -| test.swift:24:75:24:81 | Element | Element | -| test.swift:25:9:25:14 | result | result | -| test.swift:25:18:25:22 | Array | Array | -| test.swift:25:24:25:28 | first | first | -| test.swift:26:9:26:12 | item | item | -| test.swift:26:17:26:22 | second | second | -| test.swift:27:13:27:18 | result | result | -| test.swift:27:20:27:27 | contains | contains | -| test.swift:27:29:27:32 | item | item | -| test.swift:28:13:28:18 | result | result | -| test.swift:28:20:28:25 | append | append | -| test.swift:28:27:28:30 | item | item | -| test.swift:31:12:31:17 | result | result | -| test.swift:37:17:37:20 | data | data | -| test.swift:39:9:39:13 | count | count | -| test.swift:40:16:40:19 | data | data | -| test.swift:40:21:40:25 | count | count | -| test.swift:43:9:43:15 | isEmpty | isEmpty | -| test.swift:44:9:44:12 | data | data | -| test.swift:44:14:44:20 | isEmpty | isEmpty | -| test.swift:47:10:47:13 | item | item | -| test.swift:47:15:47:16 | at | at | -| test.swift:47:18:47:22 | index | index | -| test.swift:48:15:48:19 | index | index | -| test.swift:48:29:48:33 | index | index | -| test.swift:48:37:48:40 | data | data | -| test.swift:48:42:48:46 | count | count | -| test.swift:49:16:49:19 | data | data | -| test.swift:49:21:49:25 | index | index | -| test.swift:52:10:52:12 | add | add | -| test.swift:52:14:52:14 | _ | _ | -| test.swift:52:16:52:19 | item | item | -| test.swift:53:9:53:12 | data | data | -| test.swift:53:14:53:19 | append | append | -| test.swift:53:21:53:24 | item | item | -| test.swift:59:10:59:16 | success | success | -| test.swift:60:10:60:16 | failure | failure | -| test.swift:62:10:62:12 | map | map | -| test.swift:62:17:62:17 | _ | _ | -| test.swift:62:19:62:27 | transform | transform | -| test.swift:64:15:64:21 | success | success | -| test.swift:64:27:64:31 | value | value | -| test.swift:65:21:65:27 | success | success | -| test.swift:65:29:65:37 | transform | transform | -| test.swift:65:39:65:43 | value | value | -| test.swift:66:15:66:21 | failure | failure | -| test.swift:66:27:66:31 | error | error | -| test.swift:67:21:67:27 | failure | failure | -| test.swift:67:29:67:33 | error | error | -| test.swift:73:23:73:29 | Element | Element | -| test.swift:74:10:74:17 | isSorted | isSorted | -| test.swift:75:13:75:13 | i | i | -| test.swift:75:23:75:31 | blah | blah | -| test.swift:76:21:76:21 | i | i | -| test.swift:76:31:76:35 | blah | blah | -| test.swift:85:6:85:12 | combine | combine | -| test.swift:85:17:85:17 | _ | _ | -| test.swift:85:19:85:24 | values | values | -| test.swift:85:32:85:40 | transform | transform | -| test.swift:86:12:86:17 | values | values | -| test.swift:86:19:86:25 | isEmpty | isEmpty | -| test.swift:87:12:87:17 | values | values | -| test.swift:87:19:87:27 | dropFirst | dropFirst | -| test.swift:87:31:87:36 | reduce | reduce | -| test.swift:87:38:87:43 | values | values | -| test.swift:87:49:87:57 | transform | transform | -func -| test.swift:7:5:9:5 | FunctionDeclaration | -| test.swift:11:5:13:5 | FunctionDeclaration | -| test.swift:24:1:32:1 | FunctionDeclaration | -| test.swift:47:5:50:5 | FunctionDeclaration | -| test.swift:52:5:54:5 | FunctionDeclaration | -| test.swift:62:5:69:5 | FunctionDeclaration | -| test.swift:74:5:81:5 | FunctionDeclaration | -| test.swift:85:1:88:1 | FunctionDeclaration | -add +nameExpr +unsupported +| test.swift:3:1:3:38 | | | +| test.swift:16:1:16:32 | | | +| test.swift:23:1:23:37 | | | +| test.swift:34:1:34:49 | | | +| test.swift:57:1:57:30 | | | +| test.swift:72:1:72:37 | | | +| test.swift:84:1:84:24 | | | diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index 3a5ee2f1c157..ca422d039781 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -1,9 +1,5 @@ -import codeql.unified.Ast +import codeql.unified.Ast::Unified -query predicate identifier(Swift::SimpleIdentifier node, string name) { name = node.getValue() } +query predicate nameExpr(NameExpr node, string value) { value = node.getIdentifier().getValue() } -query predicate func(Swift::FunctionDeclaration node) { any() } - -query predicate add(Swift::AdditiveExpression node, Swift::AstNode lhs, Swift::AstNode rhs) { - lhs = node.getLhs(0) and rhs = node.getRhs(0) -} +query predicate unsupported(UnsupportedNode node, string value) { value = node.getValue() } diff --git a/unified/scripts/update-corpus.sh b/unified/scripts/update-corpus.sh new file mode 100755 index 000000000000..2f3ebade8cb3 --- /dev/null +++ b/unified/scripts/update-corpus.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +cd "$(dirname "$0")/.." + +cd extractor +UNIFIED_UPDATE_CORPUS=1 cargo test