diff --git a/.github/workflows/mad_modelDiff.yml b/.github/workflows/mad_modelDiff.yml index 3b96d903e232..45a31f406664 100644 --- a/.github/workflows/mad_modelDiff.yml +++ b/.github/workflows/mad_modelDiff.yml @@ -70,7 +70,7 @@ jobs: SHORTNAME=`basename $DATABASE` python misc/scripts/models-as-data/generate_mad.py --language java --with-summaries --with-sinks $DATABASE $SHORTNAME/$QL_VARIANT mkdir -p $MODELS/$SHORTNAME - mv java/ql/lib/ext/generated/$SHORTNAME/$QL_VARIANT $MODELS/$SHORTNAME + mv java/ql/lib/ext/generated/modelgenerator/$SHORTNAME/$QL_VARIANT $MODELS/$SHORTNAME cd .. } diff --git a/.github/workflows/python-tooling.yml b/.github/workflows/python-tooling.yml index bab1277dd03d..a3ad9900ea47 100644 --- a/.github/workflows/python-tooling.yml +++ b/.github/workflows/python-tooling.yml @@ -5,7 +5,7 @@ on: paths: - "misc/bazel/**" - "misc/codegen/**" - - "misc/scripts/models-as-data/bulk_generate_mad.py" + - "misc/scripts/models-as-data/*.py" - "*.bazel*" - .github/workflows/codegen.yml - .pre-commit-config.yaml diff --git a/Cargo.lock b/Cargo.lock index b6456c841063..4fab55a6444f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,6 +140,26 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.9.4", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "log 0.4.28", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.1", + "shlex", + "syn", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -240,9 +260,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.37" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -250,6 +270,15 @@ dependencies = [ "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.3" @@ -328,7 +357,7 @@ dependencies = [ "chalk-derive 0.103.0", "chalk-ir 0.103.0", "ena", - "indexmap 2.11.4", + "indexmap 2.14.0", "itertools 0.12.1", "petgraph", "rustc-hash 1.1.0", @@ -349,6 +378,17 @@ dependencies = [ "windows-link 0.2.0", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "4.5.48" @@ -416,6 +456,7 @@ dependencies = [ "tree-sitter", "tree-sitter-json", "tree-sitter-ql", + "yeast", "zstd", ] @@ -437,6 +478,25 @@ dependencies = [ "tree-sitter-ruby", ] +[[package]] +name = "codeql-extractor-unified" +version = "0.1.0" +dependencies = [ + "clap", + "codeql-extractor", + "encoding", + "lazy_static", + "rayon", + "regex", + "serde_json", + "tracing", + "tracing-subscriber", + "tree-sitter", + "tree-sitter-embedded-template", + "tree-sitter-swift", + "yeast", +] + [[package]] name = "codeql-rust" version = "0.1.0" @@ -485,6 +545,15 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -738,6 +807,12 @@ dependencies = [ "typeid", ] +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + [[package]] name = "figment" version = "0.10.19" @@ -754,9 +829,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixedbitset" @@ -786,6 +861,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -870,9 +951,26 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "hashlink" version = "0.10.0" @@ -1059,16 +1157,25 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "serde", "serde_core", ] +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + [[package]] name = "inlinable_string" version = "0.1.15" @@ -1198,6 +1305,16 @@ version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.0", +] + [[package]] name = "line-index" version = "0.1.2" @@ -1263,6 +1380,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1309,6 +1432,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "notify" version = "8.2.0" @@ -1436,6 +1569,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pear" version = "0.2.9" @@ -1491,7 +1630,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.4", + "indexmap 2.14.0", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_shared", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", ] [[package]] @@ -1536,6 +1704,25 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.11+spec-1.1.0", +] + [[package]] name = "proc-macro2" version = "1.0.101" @@ -1667,7 +1854,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e876bb2c3e52a8d4e6684526a2d4e81f9d028b939ee4dc5dc775fe10deb44d59" dependencies = [ "dashmap", - "indexmap 2.11.4", + "indexmap 2.14.0", "la-arena", "ra_ap_cfg", "ra_ap_intern", @@ -1709,7 +1896,7 @@ checksum = "ebffdc134eccabc17209d7760cfff7fd12ed18ab6e21188c5e084b97aa38504c" dependencies = [ "arrayvec", "either", - "indexmap 2.11.4", + "indexmap 2.14.0", "itertools 0.14.0", "ra_ap_base_db", "ra_ap_cfg", @@ -1739,7 +1926,7 @@ dependencies = [ "drop_bomb", "either", "fst", - "indexmap 2.11.4", + "indexmap 2.14.0", "itertools 0.14.0", "la-arena", "ra-ap-rustc_abi", @@ -1808,7 +1995,7 @@ dependencies = [ "cov-mark", "either", "ena", - "indexmap 2.11.4", + "indexmap 2.14.0", "itertools 0.14.0", "la-arena", "oorandom", @@ -1846,7 +2033,7 @@ dependencies = [ "crossbeam-channel", "either", "fst", - "indexmap 2.11.4", + "indexmap 2.14.0", "itertools 0.14.0", "line-index", "memchr", @@ -1948,7 +2135,7 @@ version = "0.0.301" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45db9e2df587d56f0738afa89fb2c100ff7c1e9cbe49e07f6a8b62342832211b" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "ra_ap_intern", "ra_ap_paths", "ra_ap_span", @@ -2107,7 +2294,7 @@ checksum = "6c174d6b9b7a7f54687df7e00c3e75ed6f082a7943a9afb1d54f33c0c12773de" dependencies = [ "crossbeam-channel", "fst", - "indexmap 2.11.4", + "indexmap 2.14.0", "nohash-hasher", "ra_ap_paths", "ra_ap_stdx", @@ -2239,6 +2426,15 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +[[package]] +name = "relative-path" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0" +dependencies = [ + "serde", +] + [[package]] name = "rowan" version = "0.15.15" @@ -2252,6 +2448,57 @@ dependencies = [ "text-size", ] +[[package]] +name = "rquickjs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a135375fbac5ba723bb6a48f432a72f81539cedde422f0121a86c7c4e96d8e0d" +dependencies = [ + "rquickjs-core", + "rquickjs-macro", +] + +[[package]] +name = "rquickjs-core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bccb7121a123865c8ace4dea42e7ed84d78b90cbaf4ca32c59849d8d210c9672" +dependencies = [ + "hashbrown 0.16.1", + "phf", + "relative-path", + "rquickjs-sys", +] + +[[package]] +name = "rquickjs-macro" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f93602cc3112c7f30bf5f29e722784232138692c7df4c52ebbac7e035d900d" +dependencies = [ + "convert_case", + "fnv", + "ident_case", + "indexmap 2.14.0", + "phf_generator", + "phf_shared", + "proc-macro-crate", + "proc-macro2", + "quote", + "rquickjs-core", + "syn", +] + +[[package]] +name = "rquickjs-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1b6528590d4d65dc86b5159eae2d0219709546644c66408b2441696d1d725" +dependencies = [ + "bindgen", + "cc", +] + [[package]] name = "rust-extractor-macros" version = "0.1.0" @@ -2317,7 +2564,7 @@ dependencies = [ "crossbeam-utils", "hashbrown 0.15.5", "hashlink", - "indexmap 2.11.4", + "indexmap 2.14.0", "intrusive-collections", "papaya", "parking_lot", @@ -2406,11 +2653,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -2470,7 +2718,7 @@ version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "itoa", "memchr", "ryu", @@ -2506,7 +2754,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -2534,7 +2782,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "itoa", "ryu", "serde", @@ -2556,6 +2804,18 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "smallbitvec" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b0e903ee191d8f7a8fbf0d712c3a1699d19e04ceba5ad1eb673053c7d938a09" + [[package]] name = "smallvec" version = "1.15.1" @@ -2632,18 +2892,18 @@ checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2708,7 +2968,7 @@ dependencies = [ "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", - "toml_edit", + "toml_edit 0.22.27", ] [[package]] @@ -2717,13 +2977,13 @@ version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "serde_core", "serde_spanned 1.0.2", "toml_datetime 0.7.2", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.13", ] [[package]] @@ -2744,27 +3004,48 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.13", +] + +[[package]] +name = "toml_edit" +version = "0.25.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.2", ] [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.2", ] [[package]] @@ -2779,6 +3060,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + [[package]] name = "tracing" version = "0.1.41" @@ -2853,9 +3140,9 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.25.9" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd2a058a86cfece0bf96f7cce1021efef9c8ed0e892ab74639173e5ed7a34fa" +checksum = "887bd495d0582c5e3e0d8ece2233666169fa56a9644d172fc22ad179ab2d0538" dependencies = [ "cc", "regex", @@ -2875,6 +3162,30 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-generate" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fb2e1bdb1d5f9d23cd5fa68cf98b3bedbd223c92a2edd60bbcf30bcf7180a5" +dependencies = [ + "bitflags 2.9.4", + "dunce", + "indexmap 2.14.0", + "indoc", + "log 0.4.28", + "pathdiff", + "regex", + "regex-syntax", + "rquickjs", + "rustc-hash 2.1.1", + "semver", + "serde", + "serde_json", + "smallbitvec", + "thiserror", + "topological-sort", +] + [[package]] name = "tree-sitter-json" version = "0.24.8" @@ -2891,6 +3202,16 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4013970217383f67b18aef68f6fb2e8d409bc5755227092d32efb0422ba24b8" +[[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.1" @@ -2911,6 +3232,15 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-swift" +version = "0.7.2" +dependencies = [ + "cc", + "tree-sitter-generate", + "tree-sitter-language", +] + [[package]] name = "triomphe" version = "0.1.14" @@ -2960,6 +3290,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -3349,6 +3685,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.45.1" @@ -3367,6 +3712,29 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[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.0" diff --git a/Cargo.toml b/Cargo.toml index 58a755340b9c..62eb2e7e920c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,11 @@ resolver = "2" members = [ "shared/tree-sitter-extractor", + "shared/yeast", + "shared/yeast-macros", "ruby/extractor", + "unified/extractor", + "unified/extractor/tree-sitter-swift", "rust/extractor", "rust/extractor/macros", "rust/ast-generator", diff --git a/MODULE.bazel b/MODULE.bazel index 16b4a4691f8a..fd923a32e62b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -102,6 +102,7 @@ use_repo( tree_sitter_extractors_deps, "vendor_ts__anyhow-1.0.100", "vendor_ts__argfile-0.2.1", + "vendor_ts__cc-1.2.61", "vendor_ts__chalk-ir-0.104.0", "vendor_ts__chrono-0.4.42", "vendor_ts__clap-4.5.48", @@ -141,14 +142,18 @@ use_repo( "vendor_ts__serde-1.0.228", "vendor_ts__serde_json-1.0.145", "vendor_ts__serde_with-3.14.1", + "vendor_ts__serde_yaml-0.9.34-deprecated", "vendor_ts__syn-2.0.106", "vendor_ts__toml-0.9.7", "vendor_ts__tracing-0.1.41", "vendor_ts__tracing-flame-0.2.0", "vendor_ts__tracing-subscriber-0.3.20", - "vendor_ts__tree-sitter-0.25.9", + "vendor_ts__tree-sitter-0.26.8", "vendor_ts__tree-sitter-embedded-template-0.25.0", + "vendor_ts__tree-sitter-generate-0.26.8", "vendor_ts__tree-sitter-json-0.24.8", + "vendor_ts__tree-sitter-language-0.1.5", + "vendor_ts__tree-sitter-python-0.23.6", "vendor_ts__tree-sitter-ql-0.23.1", "vendor_ts__tree-sitter-ruby-0.23.1", "vendor_ts__triomphe-0.1.14", 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/change-notes/2026-04-15-poisonable-steps-additions-alterations.md b/actions/ql/lib/change-notes/2026-04-15-poisonable-steps-additions-alterations.md new file mode 100644 index 000000000000..4a28280a3c88 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-04-15-poisonable-steps-additions-alterations.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Altered 2 patterns in the `poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and `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: `actions/untrusted-checkout/high`, `actions/untrusted-checkout/critical`, `actions/untrusted-checkout-toctou/high`, `actions/untrusted-checkout-toctou/critical`, `actions/cache-poisoning/poisonable-step`, `actions/cache-poisoning/direct-cache` and `actions/artifact-poisoning/path-traversal`. \ No newline at end of file diff --git a/actions/ql/lib/change-notes/2026-05-12-improved-alphanumeric-regex.md b/actions/ql/lib/change-notes/2026-05-12-improved-alphanumeric-regex.md new file mode 100644 index 000000000000..df3aaf3613fa --- /dev/null +++ b/actions/ql/lib/change-notes/2026-05-12-improved-alphanumeric-regex.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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. \ No newline at end of file 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/ext/config/poisonable_steps.yml b/actions/ql/lib/ext/config/poisonable_steps.yml index 3c1aec70a240..17b1408fa7c3 100644 --- a/actions/ql/lib/ext/config/poisonable_steps.yml +++ b/actions/ql/lib/ext/config/poisonable_steps.yml @@ -70,7 +70,7 @@ extensions: - ["(source|sh|bash|zsh|fish)\\s+([^\\s]+)\\b", 2] - ["(node)\\s+([^\\s]+)(\\.js|\\.ts)\\b", 2] - ["(python[\\d\\.]*)\\s+([^\\s]+)\\.py\\b", 2] + - ["(python[\\d\\.]*)\\s+-m\\s+([A-Za-z_][\\w\\.]*)\\b", 2] # eg: pythonX -m anything(dir or file) - ["(ruby)\\s+([^\\s]+)\\.rb\\b", 2] - - ["(go)\\s+(generate|run)\\s+([^\\s]+)\\.go\\b", 3] + - ["(go)\\s+(generate|run)(?:\\s+-[^\\s]+)*\\s+([^\\s]+)", 3] - ["(dotnet)\\s+([^\\s]+)\\.csproj\\b", 2] - diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index a20f2e7a5075..cf1232c01fb4 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.35 +version: 0.4.36-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index c8512e5a1c0c..530b8e48e0f5 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -1,5 +1,5 @@ /** - * @name Unpinned tag for a non-immutable Action in workflow + * @name Unpinned tag for a non-immutable Action in workflow or composite action * @description Using a tag for a non-immutable Action that is not pinned to a commit can lead to executing an untrusted Action through a supply chain attack. * @kind problem * @security-severity 5.0 @@ -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) { @@ -31,15 +33,26 @@ private predicate isPinnedContainer(string version) { bindingset[nwo] private predicate isContainerImage(string nwo) { nwo.regexpMatch("^docker://.+") } -from UsesStep uses, string nwo, string version, Workflow workflow, string name +private predicate getStepContainerName(UsesStep uses, string name) { + exists(Workflow workflow | + uses.getEnclosingWorkflow() = workflow and + ( + workflow.getName() = name + or + not exists(workflow.getName()) and workflow.getLocation().getFile().getBaseName() = name + ) + ) + or + exists(CompositeAction action | + uses.getEnclosingCompositeAction() = action and + name = action.getLocation().getFile().getBaseName() + ) +} + +from UsesStep uses, string nwo, string version, string name where uses.getCallee() = nwo and - uses.getEnclosingWorkflow() = workflow and - ( - workflow.getName() = name - or - not exists(workflow.getName()) and workflow.getLocation().getFile().getBaseName() = name - ) and + getStepContainerName(uses, name) and uses.getVersion() = version and not isTrustedOwner(nwo) and not (if isContainerImage(nwo) then isPinnedContainer(version) else isPinnedCommit(version)) and diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md index 6060354b134a..a6dd437c1baf 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md @@ -1,6 +1,35 @@ ## Overview -GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job. +GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. Under certain conditions described below, attackers can take over a repository by opening malicious PRs from forks. The attacks can result in malicious code execution causing unauthorized changes to the repository or exfiltration of repository secrets and a compromise of connected systems. + +## Workflow Security Model + +In GitHub Actions, there is a distinction between unprivileged and privileged workflows. For example, a workflow with a `pull_request` trigger is unprivileged while a workflow with `pull_request_target` is privileged. + +This is relevant especially for PRs from forks. Normal PRs can only be submitted by people who have write access to a repository, while PRs from forks can be submitted by anyone. + +On a PR from a fork, an unprivileged `pull_request` workflow has only limited capabilities but a privileged `pull_request_target` workflow is much more dangerous. A privileged workflow: + + * Runs in the context of the base repository + * Has access to organization and repository secrets (e.g., API keys, deployment tokens) + * Has a read/write `GITHUB_TOKEN` by default + * Can access private resources + +Certain triggers automatically grant a workflow elevated privileges: + + * `pull_request_target` as described above + * `workflow_run`: Triggered when another workflow completes. + * `issue_comment`: Triggered when a comment is made on an issue or PR. + +## Attack Details + + * A repository has a privileged workflow + * 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 + +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. ## Recommendation @@ -133,3 +162,5 @@ jobs: ## References - 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). +- Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/). diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md index 6060354b134a..a6dd437c1baf 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md @@ -1,6 +1,35 @@ ## Overview -GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job. +GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. Under certain conditions described below, attackers can take over a repository by opening malicious PRs from forks. The attacks can result in malicious code execution causing unauthorized changes to the repository or exfiltration of repository secrets and a compromise of connected systems. + +## Workflow Security Model + +In GitHub Actions, there is a distinction between unprivileged and privileged workflows. For example, a workflow with a `pull_request` trigger is unprivileged while a workflow with `pull_request_target` is privileged. + +This is relevant especially for PRs from forks. Normal PRs can only be submitted by people who have write access to a repository, while PRs from forks can be submitted by anyone. + +On a PR from a fork, an unprivileged `pull_request` workflow has only limited capabilities but a privileged `pull_request_target` workflow is much more dangerous. A privileged workflow: + + * Runs in the context of the base repository + * Has access to organization and repository secrets (e.g., API keys, deployment tokens) + * Has a read/write `GITHUB_TOKEN` by default + * Can access private resources + +Certain triggers automatically grant a workflow elevated privileges: + + * `pull_request_target` as described above + * `workflow_run`: Triggered when another workflow completes. + * `issue_comment`: Triggered when a comment is made on an issue or PR. + +## Attack Details + + * A repository has a privileged workflow + * 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 + +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. ## Recommendation @@ -133,3 +162,5 @@ jobs: ## References - 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). +- 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 98b9aee33f77..5c2d4b3d56c8 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 trusted context + * @name Checkout of untrusted code in privileged context without privileged context use * @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/Security/CWE-829/UntrustedCheckoutMedium.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md index 6060354b134a..a6dd437c1baf 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md @@ -1,6 +1,35 @@ ## Overview -GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job. +GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. Under certain conditions described below, attackers can take over a repository by opening malicious PRs from forks. The attacks can result in malicious code execution causing unauthorized changes to the repository or exfiltration of repository secrets and a compromise of connected systems. + +## Workflow Security Model + +In GitHub Actions, there is a distinction between unprivileged and privileged workflows. For example, a workflow with a `pull_request` trigger is unprivileged while a workflow with `pull_request_target` is privileged. + +This is relevant especially for PRs from forks. Normal PRs can only be submitted by people who have write access to a repository, while PRs from forks can be submitted by anyone. + +On a PR from a fork, an unprivileged `pull_request` workflow has only limited capabilities but a privileged `pull_request_target` workflow is much more dangerous. A privileged workflow: + + * Runs in the context of the base repository + * Has access to organization and repository secrets (e.g., API keys, deployment tokens) + * Has a read/write `GITHUB_TOKEN` by default + * Can access private resources + +Certain triggers automatically grant a workflow elevated privileges: + + * `pull_request_target` as described above + * `workflow_run`: Triggered when another workflow completes. + * `issue_comment`: Triggered when a comment is made on an issue or PR. + +## Attack Details + + * A repository has a privileged workflow + * 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 + +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. ## Recommendation @@ -133,3 +162,5 @@ jobs: ## References - 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). +- Living Off the Pipeline: [LOTP](https://boostsecurityio.github.io/lotp/). diff --git a/actions/ql/src/change-notes/2026-04-15-untrusted-checkout-improvements-helpfile.md b/actions/ql/src/change-notes/2026-04-15-untrusted-checkout-improvements-helpfile.md new file mode 100644 index 000000000000..2555bc03d3d1 --- /dev/null +++ b/actions/ql/src/change-notes/2026-04-15-untrusted-checkout-improvements-helpfile.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur. \ No newline at end of file diff --git a/actions/ql/src/change-notes/2026-04-15-untrusted-checkout-improvements-metadata.md b/actions/ql/src/change-notes/2026-04-15-untrusted-checkout-improvements-metadata.md new file mode 100644 index 000000000000..78f97da0f17c --- /dev/null +++ b/actions/ql/src/change-notes/2026-04-15-untrusted-checkout-improvements-metadata.md @@ -0,0 +1,4 @@ +--- +category: queryMetadata +--- +* Adjusted the name of `actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context. \ No newline at end of file diff --git a/actions/ql/src/change-notes/2026-04-20-unpinned-tag-composite-actions.md b/actions/ql/src/change-notes/2026-04-20-unpinned-tag-composite-actions.md new file mode 100644 index 000000000000..7e00965a17cf --- /dev/null +++ b/actions/ql/src/change-notes/2026-04-20-unpinned-tag-composite-actions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `actions/unpinned-tag` query now analyzes composite action metadata (`action.yml`/`action.yaml` files) in addition to workflow files, providing more comprehensive detection of unpinned action references across the entire Actions ecosystem. \ No newline at end of file diff --git a/actions/ql/src/change-notes/2026-05-12-sha256-pinned-actions.md b/actions/ql/src/change-notes/2026-05-12-sha256-pinned-actions.md new file mode 100644 index 000000000000..521a5878c371 --- /dev/null +++ b/actions/ql/src/change-notes/2026-05-12-sha256-pinned-actions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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. diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index bcc7fe06a3b4..2c9811c780ad 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.27 +version: 0.6.28-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/actions/unpinned-tag/action.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/actions/unpinned-tag/action.yml new file mode 100644 index 000000000000..782505cc698d --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/actions/unpinned-tag/action.yml @@ -0,0 +1,6 @@ +name: Composite unpinned tag test +runs: + using: "composite" + steps: + - uses: foo/bar@v2 + - uses: foo/bar@25b062c917b0c75f8b47d8469aff6c94ffd89abb 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 ed35f1546171..14cff70c3804 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected @@ -1,3 +1,4 @@ +| .github/actions/unpinned-tag/action.yml:5:13:5:22 | foo/bar@v2 | Unpinned 3rd party Action 'action.yml' step $@ uses 'foo/bar' with ref 'v2', not a pinned commit hash | .github/actions/unpinned-tag/action.yml:5:7:6:4 | Uses Step | Uses Step | | .github/workflows/actor_trusted_checkout.yml:19:13:19:36 | completely/fakeaction@v2 | Unpinned 3rd party Action 'actor_trusted_checkout.yml' step $@ uses 'completely/fakeaction' with ref 'v2', not a pinned commit hash | .github/workflows/actor_trusted_checkout.yml:19:7:23:4 | Uses Step | Uses Step | | .github/workflows/actor_trusted_checkout.yml:23:13:23:37 | fakerepo/comment-on-pr@v1 | Unpinned 3rd party Action 'actor_trusted_checkout.yml' step $@ uses 'fakerepo/comment-on-pr' with ref 'v1', not a pinned commit hash | .github/workflows/actor_trusted_checkout.yml:23:7:26:21 | Uses Step | Uses Step | | .github/workflows/artifactpoisoning21.yml:13:15:13:49 | dawidd6/action-download-artifact@v2 | Unpinned 3rd party Action 'Pull Request Open' step $@ uses 'dawidd6/action-download-artifact' with ref 'v2', not a pinned commit hash | .github/workflows/artifactpoisoning21.yml:13:9:18:6 | Uses Step | Uses Step | @@ -33,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 39e54b2bbaed..4a72406535e6 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected @@ -8,6 +8,7 @@ edges | .github/actions/download-artifact/action.yaml:25:7:29:4 | Run Step | .github/actions/download-artifact/action.yaml:29:7:32:18 | Run Step | | .github/actions/download-artifact/action.yaml:29:7:32:18 | Run Step | .github/workflows/artifactpoisoning91.yml:19:9:25:6 | Run Step: metadata | | .github/actions/download-artifact/action.yaml:29:7:32:18 | Run Step | .github/workflows/resolve-args.yml:22:9:36:13 | Run Step: resolve-step | +| .github/actions/unpinned-tag/action.yml:5:7:6:4 | Uses Step | .github/actions/unpinned-tag/action.yml:6:7:6:61 | Uses Step | | .github/workflows/actor_trusted_checkout.yml:9:7:14:4 | Uses Step | .github/workflows/actor_trusted_checkout.yml:14:7:15:4 | Uses Step | | .github/workflows/actor_trusted_checkout.yml:14:7:15:4 | Uses Step | .github/workflows/actor_trusted_checkout.yml:15:7:19:4 | Run Step | | .github/workflows/actor_trusted_checkout.yml:15:7:19:4 | Run Step | .github/workflows/actor_trusted_checkout.yml:19:7:23:4 | Uses Step | @@ -311,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 | 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/ql/lib/change-notes/2026-05-15-hasSocketInput-for-fscanf.md b/cpp/ql/lib/change-notes/2026-05-15-hasSocketInput-for-fscanf.md new file mode 100644 index 000000000000..842d52dd8bfd --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-05-15-hasSocketInput-for-fscanf.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `RemoteFlowSourceFunction` model for `fscanf` (and variants) now implements `hasSocketInput` to reflect that these functions may read from a socket. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2026-05-16-alias-template.md b/cpp/ql/lib/change-notes/2026-05-16-alias-template.md new file mode 100644 index 000000000000..2777da94abf3 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-05-16-alias-template.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added `AliasTemplateType` and `AliasTemplateInstantiationType` classes, representing C++ alias templates and their instantiations. diff --git a/cpp/ql/lib/change-notes/2026-05-18-alias-type.md b/cpp/ql/lib/change-notes/2026-05-18-alias-type.md new file mode 100644 index 000000000000..b744dd2fa95b --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-05-18-alias-type.md @@ -0,0 +1,4 @@ +--- +category: deprecated +--- +* The `UsingAliasTypedefType` class has been deprecated. Use `TypeAliasType` instead. diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index e3b9f7c33634..88d4dafaebb1 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 10.1.0 +version: 10.1.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp 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/TypedefType.qll b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll index 1e330842d09b..08d02eadb4d2 100644 --- a/cpp/ql/lib/semmle/code/cpp/TypedefType.qll +++ b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll @@ -64,23 +64,102 @@ 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) } +} + +/** + * 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/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 fbef5a8fcac5..f1b3edbe3370 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Scanf.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Scanf.qll @@ -87,6 +87,10 @@ private class FscanfModel extends ScanfFunctionModel, RemoteFlowSourceFunction i output.isParameterDeref(any(int i | i >= this.getArgsStartPosition())) and description = "value read by " + this.getName() } + + override predicate hasSocketInput(FunctionInput input) { + input.isParameterDeref(super.getInputParameterIndex()) + } } /** diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index 770002bb0232..837c4e02326a 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -960,6 +960,22 @@ variable_template_argument_value( 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 diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index ab81be3fa7cc..f33a1a43f8b3 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -2,7 +2,7 @@ @compilation - 12591 + 12549 @externalDataElement @@ -10,15 +10,19 @@ @file - 64946 + 64730 @folder - 12339 + 12298 @diagnostic - 357 + 356 + + + @location_default + 46452145 @trap @@ -34,23 +38,19 @@ @pch - 248 - - - @location_default - 46837435 + 246 @macro_expansion - 40309769 + 40321988 @other_macro_reference - 300641 + 300732 @normal_function - 2734631 + 2702108 @unknown_function @@ -58,51 +58,51 @@ @constructor - 694343 + 687785 @destructor - 85993 + 85025 @conversion_function - 10329 + 10212 @operator - 650865 + 643042 @user_defined_literal - 995 + 984 @deduction_guide - 5849 + 5783 @fun_decl - 4193416 + 4144463 @var_decl - 9367984 + 9432031 @type_decl - 1629528 + 1610929 @namespace_decl - 408755 + 408652 @using_declaration - 266845 + 265914 @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 + 724660 @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 + 673469 @reference - 964973 + 957919 @gnu_vector - 673 + 670 @routinereference - 372 + 368 @rvalue_reference - 290338 + 287560 @block @@ -406,7 +406,7 @@ @decltype - 101757 + 101817 @typeof @@ -414,7 +414,7 @@ @underlying_type - 622 + 615 @bases @@ -458,7 +458,7 @@ @remove_cv - 2059 + 2095 @remove_cvref @@ -486,27 +486,27 @@ @remove_reference - 5705 + 5688 @struct - 976600 + 1036608 @union - 20907 + 20794 @enum - 41605 + 41618 @template_parameter - 864421 + 862599 @alias - 1755750 + 1757438 @unknown_usertype @@ -514,55 +514,55 @@ @class - 324188 + 321398 @template_template_parameter - 6090 + 6070 @proxy_class - 48241 + 50199 @scoped_enum - 11573 + 11443 @template_struct - 211176 + 210473 @template_class - 29245 + 28916 @template_union - 1368 + 1353 @mangledname - 6349611 + 6357829 @type_mention - 5913261 + 5915053 @concept_template - 3603 + 3592 @routinetype - 600586 + 594947 @ptrtomember - 9677 + 9645 @specifier - 7715 + 7628 @gnuattribute @@ -570,11 +570,11 @@ @stdattribute - 351940 + 347976 @declspec - 330396 + 330496 @msattribute @@ -582,19 +582,19 @@ @alignas - 2160 + 2161 @attribute_arg_token - 16585 + 16428 @attribute_arg_constant_expr - 71626 + 71325 @attribute_arg_expr - 1587 + 1582 @attribute_arg_empty @@ -610,35 +610,35 @@ @derivation - 473794 + 491380 @frienddecl - 767534 + 760573 @comment - 11208578 + 11082335 @namespace - 8615 + 8586 @specialnamequalifyingelement - 124 + 123 @namequalifier - 3042471 + 3051466 @value - 13541565 + 13547188 @initialiser - 2245206 + 2245055 @address_of @@ -646,131 +646,131 @@ @indirect - 402174 + 401821 @array_to_pointer - 1953951 + 1954545 @parexpr - 4915712 + 4917201 @arithnegexpr - 586594 + 586772 @unaryplusexpr - 4060 + 4110 @complementexpr - 38188 + 38199 @notexpr - 355800 + 355911 @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 + 15757 @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 + 11102 @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 + 260811 @vastartexpr - 4963 + 4962 @vaargexpr @@ -850,79 +850,79 @@ @vaendexpr - 2940 + 2941 @vacopyexpr - 135 + 134 @varaccess - 8255503 + 8258005 @runtime_sizeof - 401408 + 401643 @runtime_alignof - 49552 + 50291 @expr_stmt - 147518 + 147604 @routineexpr - 5725988 + 5708297 @type_operand - 1405528 + 1405954 @offsetofexpr - 148427 + 148514 @typescompexpr - 702016 + 702229 @literal - 7991777 + 8053163 @aggregateliteral - 1397523 + 1397524 @c_style_cast - 6027720 + 6029389 @temp_init - 980525 + 974915 @errorexpr - 45186 + 44841 @reference_to - 1880002 + 1870180 @ref_indirect - 2094099 + 2077068 @vacuous_destructor_call - 7784 + 7711 @assume - 4137 + 4136 @conjugation @@ -974,35 +974,35 @@ @thisaccess - 1553582 + 1553192 @new_expr - 45896 + 45504 @delete_expr - 11406 + 11298 @throw_expr - 23817 + 23683 @condition_decl - 407669 + 406396 @braced_init_list - 2126 + 2091 @type_id - 47589 + 47139 @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 + 111043 @ctorvirtualinit - 3993 + 3956 @ctorfieldinit - 205713 + 203396 @ctordelegatinginit - 3609 + 3568 @dtordirectdestruct - 39195 + 38824 @dtorvirtualdestruct - 3960 + 3922 @dtorfielddestruct - 39567 + 39193 @static_cast - 347211 + 347361 @reinterpret_cast - 39962 + 39952 @const_cast - 24302 + 24072 @dynamic_cast - 788 + 786 @lambdaexpr - 18997 + 18992 @param_ref - 162057 + 163595 @noopexpr @@ -1162,7 +1162,7 @@ @istriviallyconstructibleexpr - 3733 + 3691 @isdestructibleexpr @@ -1174,19 +1174,19 @@ @istriviallydestructibleexpr - 995 + 984 @istriviallyassignableexpr - 3733 + 3691 @isnothrowassignableexpr - 5102 + 5044 @istrivialexpr - 3328 + 3309 @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 + 9253 @noexceptexpr - 28017 + 30280 @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 + 841809 @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 + 156741 @stmt_label - 77727 + 77468 @stmt_return - 1238112 + 1233357 @stmt_block - 1724482 + 1700014 @stmt_end_test_while - 232290 + 232426 @stmt_for - 84398 + 84423 @stmt_switch_case - 833592 + 830946 @stmt_switch - 410607 + 409304 @stmt_asm - 63827 + 63865 @stmt_decl - 769985 + 769791 @stmt_empty - 428111 + 426753 @stmt_continue - 28094 + 28103 @stmt_break - 137498 + 137464 @stmt_try_block - 26379 + 26275 @stmt_microsoft_try @@ -1642,19 +1642,19 @@ @stmt_assigned_goto - 12423 + 12426 @stmt_range_based_for - 6311 + 6156 @stmt_handler - 43224 + 43026 @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 + 316207 @ppd_define - 2743342 + 2712444 @ppd_undef - 100181 + 99052 @ppd_pragma - 405204 + 400640 @ppd_include_next - 169 + 167 @ppd_line - 18770 + 18779 @ppd_error - 124 + 123 @ppd_objc_import @@ -1750,7 +1750,7 @@ @link_target - 816 + 817 @xmldtd @@ -1780,11 +1780,11 @@ compilations - 12591 + 12549 id - 12591 + 12549 cwd @@ -1802,7 +1802,7 @@ 1 2 - 12591 + 12549 @@ -1828,19 +1828,19 @@ compilation_args - 1008084 + 1004725 id - 12591 + 12549 num - 1462 + 1457 arg - 29149 + 29052 @@ -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 + 13304 2 3 - 12633 + 12591 3 103 - 2188 + 2180 104 1198 - 978 + 975 @@ -2199,17 +2199,17 @@ 1 2 - 19303 + 19238 2 3 - 8689 + 8660 3 62 - 1157 + 1153 @@ -2219,19 +2219,19 @@ compilation_expanded_args - 1008084 + 1004725 id - 12591 + 12549 num - 1462 + 1457 arg - 29149 + 29052 @@ -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 + 13304 2 3 - 12633 + 12591 3 103 - 2188 + 2180 104 1198 - 978 + 975 @@ -2590,17 +2590,17 @@ 1 2 - 19303 + 19238 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 + 19828 @@ -2985,7 +2985,7 @@ 4 5 - 2722 + 2723 @@ -3001,22 +3001,22 @@ 3 4 - 381 + 435 4 5 - 980 + 926 - 5 + 6 9 217 9 10 - 163 + 108 10 @@ -3025,23 +3025,23 @@ 11 - 15 + 13 217 - 17 - 20 + 14 + 17 217 - 20 - 26 + 19 + 23 217 - 44 - 132 - 163 + 25 + 122 + 217 @@ -3093,7 +3093,7 @@ 4 5 - 4520 + 4521 @@ -3109,47 +3109,42 @@ 3 4 - 871 + 1361 4 5 - 1579 + 1089 5 6 - 163 + 108 6 7 - 326 + 653 7 - 8 - 435 - - - 8 9 - 163 + 381 9 - 11 + 12 381 - 11 - 30 + 13 + 41 381 - 40 - 95 - 217 + 46 + 96 + 163 @@ -3197,17 +3192,17 @@ 4 5 - 108 + 54 - 177 - 178 + 5 + 6 54 - 183 - 184 - 54 + 202 + 203 + 108 @@ -3223,22 +3218,22 @@ 1 2 - 10020 + 14108 2 3 - 3975 + 4140 3 - 4 - 1906 + 42 + 1525 - 4 - 47 - 1089 + 42 + 43 + 54 @@ -3254,27 +3249,22 @@ 1 2 - 9639 + 13673 2 3 - 3757 + 3486 3 4 - 1579 + 1416 4 - 5 - 1143 - - - 5 - 72 - 871 + 63 + 1252 @@ -3290,12 +3280,12 @@ 1 2 - 13941 + 17159 2 3 - 3049 + 2669 @@ -3305,15 +3295,15 @@ diagnostic_for - 504 + 503 diagnostic - 357 + 356 compilation - 189 + 188 file_number @@ -3335,12 +3325,12 @@ 1 2 - 210 + 209 2 3 - 147 + 146 @@ -3356,7 +3346,7 @@ 1 2 - 357 + 356 @@ -3372,7 +3362,7 @@ 1 2 - 357 + 356 @@ -3388,17 +3378,17 @@ 2 3 - 105 + 104 3 4 - 63 + 62 5 6 - 21 + 20 @@ -3414,7 +3404,7 @@ 1 2 - 189 + 188 @@ -3430,17 +3420,17 @@ 2 3 - 105 + 104 3 4 - 63 + 62 5 6 - 21 + 20 @@ -3504,7 +3494,7 @@ 1 2 - 21 + 20 4 @@ -3535,7 +3525,7 @@ 2 3 - 21 + 20 8 @@ -3545,7 +3535,7 @@ 18 19 - 21 + 20 @@ -3571,19 +3561,19 @@ compilation_finished - 12591 + 12549 id - 12591 + 12549 cpu_seconds - 9593 + 9184 elapsed_seconds - 210 + 209 @@ -3597,7 +3587,7 @@ 1 2 - 12591 + 12549 @@ -3613,7 +3603,7 @@ 1 2 - 12591 + 12549 @@ -3629,17 +3619,17 @@ 1 2 - 8289 + 7664 2 3 - 967 + 1006 3 - 33 - 336 + 35 + 513 @@ -3655,12 +3645,12 @@ 1 2 - 9004 + 8555 2 3 - 589 + 629 @@ -3676,71 +3666,71 @@ 1 2 - 31 + 52 2 3 - 31 + 20 - 5 - 6 + 7 + 8 10 - 7 - 8 - 21 + 8 + 9 + 20 - 10 - 11 - 21 + 9 + 10 + 10 - 13 - 14 + 10 + 11 10 - 14 - 15 + 11 + 12 10 - 16 - 17 + 20 + 21 10 - 32 - 33 + 35 + 36 10 - 69 - 70 + 43 + 44 10 - 182 - 183 + 135 + 136 10 - 216 - 217 + 279 + 280 10 - 288 - 289 + 298 + 299 10 - 319 - 320 + 325 + 326 10 @@ -3757,22 +3747,22 @@ 1 2 - 31 + 52 2 3 - 31 + 20 - 5 - 6 + 7 + 8 10 - 7 - 8 - 21 + 8 + 9 + 20 9 @@ -3785,28 +3775,28 @@ 10 - 13 - 14 + 11 + 12 10 - 14 - 15 + 20 + 21 10 - 16 - 17 + 34 + 35 10 - 32 - 33 + 42 + 43 10 - 67 - 68 + 131 + 132 10 @@ -3815,18 +3805,13 @@ 10 - 170 - 171 - 10 - - - 206 - 207 + 238 + 239 10 - 240 - 241 + 246 + 247 10 @@ -4053,42 +4038,42 @@ sourceLocationPrefix - 124 + 123 prefix - 124 + 123 locations_default - 46837435 + 46452145 id - 46837435 + 46452145 file - 40819 + 40359 beginLine - 7483212 + 7398928 beginColumn - 21902 + 21656 endLine - 7484208 + 7399913 endColumn - 53263 + 52910 @@ -4102,7 +4087,7 @@ 1 2 - 46837435 + 46452145 @@ -4118,7 +4103,7 @@ 1 2 - 46837435 + 46452145 @@ -4134,7 +4119,7 @@ 1 2 - 46837435 + 46452145 @@ -4150,7 +4135,7 @@ 1 2 - 46837435 + 46452145 @@ -4166,7 +4151,7 @@ 1 2 - 46837435 + 46452145 @@ -4182,72 +4167,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 +4248,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 +4324,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 +4400,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 +4476,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 +4552,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 +4593,27 @@ 1 2 - 5008056 + 4951650 2 3 - 1216857 + 1203151 3 6 - 638669 + 631107 6 56 - 562133 + 556171 56 329 - 57495 + 56847 @@ -4644,27 +4629,27 @@ 1 2 - 5629552 + 5566146 2 3 - 483109 + 477667 3 7 - 577316 + 570322 7 25 - 564996 + 558263 25 94 - 228238 + 226529 @@ -4680,12 +4665,12 @@ 1 2 - 7018148 + 6938241 2 85 - 465064 + 460687 @@ -4701,32 +4686,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 +4727,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 +4803,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 +4879,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 +4955,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 +5031,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 +5107,32 @@ 1 2 - 4943591 + 4887912 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 +5148,27 @@ 1 2 - 5005069 + 4948697 2 3 - 1220466 + 1206720 3 6 - 631078 + 623601 6 51 - 562009 + 556048 51 329 - 65584 + 64845 @@ -5199,12 +5184,12 @@ 1 2 - 7035322 + 6955098 2 15 - 448885 + 444814 @@ -5220,27 +5205,27 @@ 1 2 - 5628183 + 5564792 2 3 - 481615 + 476191 3 7 - 581547 + 574382 7 25 - 568356 + 561093 25 89 - 224505 + 223453 @@ -5256,32 +5241,32 @@ 1 2 - 5012785 + 4956326 2 3 - 746317 + 737911 3 4 - 533759 + 527747 4 12 - 586774 + 579304 12 72 - 561636 + 555679 72 - 250 - 42934 + 252 + 42943 @@ -5297,52 +5282,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 +5343,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 +5404,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 +5465,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 +5526,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 +5581,15 @@ files - 64946 + 64730 id - 64946 + 64730 name - 64946 + 64730 @@ -5618,7 +5603,7 @@ 1 2 - 64946 + 64730 @@ -5634,7 +5619,7 @@ 1 2 - 64946 + 64730 @@ -5644,15 +5629,15 @@ folders - 12339 + 12298 id - 12339 + 12298 name - 12339 + 12298 @@ -5666,7 +5651,7 @@ 1 2 - 12339 + 12298 @@ -5682,7 +5667,7 @@ 1 2 - 12339 + 12298 @@ -5692,15 +5677,15 @@ containerparent - 77264 + 77007 parent - 12339 + 12298 child - 77264 + 77007 @@ -5714,37 +5699,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 +5750,7 @@ 1 2 - 77264 + 77007 @@ -5775,23 +5760,23 @@ numlines - 805928 + 796112 element_id - 804808 + 795005 num_lines - 39325 + 38882 num_code - 33974 + 33591 num_comment - 18293 + 18087 @@ -5805,12 +5790,12 @@ 1 2 - 803688 + 793898 2 3 - 1120 + 1107 @@ -5826,12 +5811,12 @@ 1 2 - 803688 + 793898 2 3 - 1120 + 1107 @@ -5847,12 +5832,12 @@ 1 2 - 804559 + 794759 2 3 - 248 + 246 @@ -5868,27 +5853,27 @@ 1 2 - 26631 + 26332 2 3 - 3733 + 3691 3 5 - 3360 + 3322 5 35 - 2986 + 2953 39 - 1983 - 2613 + 1981 + 2583 @@ -5904,27 +5889,27 @@ 1 2 - 27129 + 26824 2 3 - 4106 + 4060 3 4 - 2488 + 2460 4 7 - 3484 + 3445 7 12 - 2115 + 2091 @@ -5940,27 +5925,27 @@ 1 2 - 26756 + 26455 2 3 - 4106 + 4060 3 4 - 2364 + 2337 4 6 - 3235 + 3199 6 10 - 2862 + 2830 @@ -5976,32 +5961,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 +6002,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 +6043,27 @@ 1 2 - 21902 + 21656 2 3 - 4231 + 4183 3 5 - 2862 + 2830 5 8 - 3111 + 3076 8 12 - 1866 + 1845 @@ -6094,32 +6079,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 +6120,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 +6161,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 +6196,15 @@ diagnostics - 357 + 356 id - 357 + 356 severity - 21 + 20 error_tag @@ -6227,7 +6212,7 @@ error_message - 147 + 146 full_error_message @@ -6249,7 +6234,7 @@ 1 2 - 357 + 356 @@ -6265,7 +6250,7 @@ 1 2 - 357 + 356 @@ -6281,7 +6266,7 @@ 1 2 - 357 + 356 @@ -6297,7 +6282,7 @@ 1 2 - 357 + 356 @@ -6313,7 +6298,7 @@ 1 2 - 357 + 356 @@ -6434,7 +6419,7 @@ 1 2 - 42 + 41 3 @@ -6559,7 +6544,7 @@ 1 2 - 105 + 104 2 @@ -6585,7 +6570,7 @@ 1 2 - 147 + 146 @@ -6601,7 +6586,7 @@ 1 2 - 147 + 146 @@ -6659,7 +6644,7 @@ 1 2 - 168 + 167 18 @@ -6744,7 +6729,7 @@ 1 2 - 168 + 167 18 @@ -6823,15 +6808,15 @@ extractor_version - 124 + 123 codeql_version - 124 + 123 frontend_version - 124 + 123 @@ -6845,7 +6830,7 @@ 1 2 - 124 + 123 @@ -6861,7 +6846,7 @@ 1 2 - 124 + 123 @@ -7159,7 +7144,7 @@ pch_uses - 4121 + 4120 pch @@ -7167,11 +7152,11 @@ compilation - 4121 + 4120 id - 4121 + 4120 @@ -7367,7 +7352,7 @@ 1 2 - 4121 + 4120 @@ -7383,7 +7368,7 @@ 1 2 - 4121 + 4120 @@ -7399,7 +7384,7 @@ 1 2 - 4121 + 4120 @@ -7415,7 +7400,7 @@ 1 2 - 4121 + 4120 @@ -7425,19 +7410,19 @@ pch_creations - 248 + 246 pch - 248 + 246 compilation - 248 + 246 from - 248 + 246 @@ -7451,7 +7436,7 @@ 1 2 - 248 + 246 @@ -7467,7 +7452,7 @@ 1 2 - 248 + 246 @@ -7483,7 +7468,7 @@ 1 2 - 248 + 246 @@ -7499,7 +7484,7 @@ 1 2 - 248 + 246 @@ -7515,7 +7500,7 @@ 1 2 - 248 + 246 @@ -7531,7 +7516,7 @@ 1 2 - 248 + 246 @@ -7541,23 +7526,23 @@ fileannotations - 4183417 + 4169478 id - 5743 + 5724 kind - 21 + 20 name - 58477 + 58282 value - 39353 + 39221 @@ -7576,7 +7561,7 @@ 2 3 - 5543 + 5525 @@ -7592,57 +7577,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 +7648,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 +7787,62 @@ 1 2 - 10982 + 10945 2 3 - 4344 + 4330 3 5 - 5038 + 5022 5 7 - 4081 + 4067 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 +7858,7 @@ 1 2 - 58477 + 58282 @@ -7889,57 +7874,57 @@ 1 2 - 11539 + 11501 2 3 - 7658 + 7632 3 4 - 4081 + 4067 4 6 - 4049 + 4036 6 8 - 3408 + 3396 8 11 - 4723 + 4707 11 17 - 5375 + 5357 17 23 - 4681 + 4665 23 41 - 4660 + 4644 41 95 - 4449 + 4434 95 1726 - 3850 + 3837 @@ -7955,72 +7940,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 +8021,7 @@ 1 2 - 39342 + 39211 2 @@ -8057,67 +8042,67 @@ 1 2 - 3387 + 3375 2 4 - 1904 + 1897 4 5 - 3040 + 3029 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 + 3050 92 113 - 2976 + 2967 113 145 - 3019 + 3009 145 @@ -8132,15 +8117,15 @@ inmacroexpansion - 150011437 + 150057036 id - 24673503 + 24680986 inv - 3705721 + 3706846 @@ -8154,37 +8139,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 +8185,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 +8245,15 @@ affectedbymacroexpansion - 48740838 + 48755655 id - 7045464 + 7047601 inv - 3803511 + 3804666 @@ -8282,37 +8267,37 @@ 1 2 - 3847105 + 3848270 2 3 - 766383 + 766616 3 4 - 361878 + 361989 4 5 - 772815 + 773050 5 12 - 535215 + 535378 12 50 - 556324 + 556493 50 9900 - 205740 + 205803 @@ -8328,67 +8313,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 +8383,19 @@ macroinvocations - 40391183 + 40403427 id - 40391183 + 40403427 macro_id - 182706 + 182761 location - 5926766 + 5928563 kind @@ -8428,7 +8413,7 @@ 1 2 - 40391183 + 40403427 @@ -8444,7 +8429,7 @@ 1 2 - 40391183 + 40403427 @@ -8460,7 +8445,7 @@ 1 2 - 40391183 + 40403427 @@ -8476,47 +8461,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 +8517,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 +8568,12 @@ 1 2 - 178186 + 178240 2 3 - 4520 + 4521 @@ -8604,17 +8589,17 @@ 1 2 - 5262706 + 5264301 2 4 - 429618 + 429748 4 72214 - 234441 + 234512 @@ -8630,12 +8615,12 @@ 1 2 - 5904602 + 5906392 2 37 - 22164 + 22171 @@ -8651,7 +8636,7 @@ 1 2 - 5926766 + 5928563 @@ -8724,15 +8709,15 @@ macroparent - 33686920 + 33697132 id - 33686920 + 33697132 parent_id - 15942726 + 15947558 @@ -8746,7 +8731,7 @@ 1 2 - 33686920 + 33697132 @@ -8762,27 +8747,27 @@ 1 2 - 7816185 + 7818554 2 3 - 1595835 + 1596319 3 4 - 4707507 + 4708934 4 5 - 1297133 + 1297526 5 205 - 526063 + 526223 @@ -8792,15 +8777,15 @@ macrolocationbind - 6023015 + 6005316 id - 4209042 + 4196688 location - 2272308 + 2266152 @@ -8814,27 +8799,27 @@ 1 2 - 3285657 + 3275887 2 3 - 489010 + 487611 3 4 - 8601 + 8638 4 5 - 412624 + 411570 5 17 - 13149 + 12979 @@ -8850,27 +8835,27 @@ 1 2 - 1332170 + 1328971 2 3 - 481395 + 479784 3 4 - 7786 + 7805 4 5 - 426910 + 425598 5 522 - 24046 + 23992 @@ -8880,19 +8865,19 @@ macro_argument_unexpanded - 82169670 + 81889986 invocation - 26181901 + 26089169 argument_index - 694 + 691 text - 341869 + 340730 @@ -8906,22 +8891,22 @@ 1 2 - 9643301 + 9606074 2 3 - 9733558 + 9700727 3 4 - 4982534 + 4965932 4 67 - 1822507 + 1816434 @@ -8937,22 +8922,22 @@ 1 2 - 9825192 + 9787359 2 3 - 9751073 + 9718183 3 4 - 4826468 + 4810386 4 67 - 1779167 + 1773238 @@ -8968,7 +8953,7 @@ 46457 46458 - 610 + 608 46659 @@ -8977,7 +8962,7 @@ 646904 - 2488917 + 2488393 31 @@ -8994,7 +8979,7 @@ 2 3 - 610 + 608 13 @@ -9020,57 +9005,57 @@ 1 2 - 39542 + 39410 2 3 - 62074 + 61868 3 4 - 20933 + 20853 4 5 - 34440 + 34451 5 6 - 39090 + 38959 6 9 - 30748 + 30530 9 15 - 28875 + 28779 15 26 - 25772 + 25686 26 57 - 27024 + 26934 57 517 - 25909 + 25822 518 - 486643 - 7458 + 486640 + 7433 @@ -9086,17 +9071,17 @@ 1 2 - 242188 + 241381 2 3 - 89509 + 89211 3 9 - 10172 + 10138 @@ -9106,19 +9091,19 @@ macro_argument_expanded - 82169670 + 81889986 invocation - 26181901 + 26089169 argument_index - 694 + 691 text - 207053 + 206363 @@ -9132,22 +9117,22 @@ 1 2 - 9643301 + 9606074 2 3 - 9733558 + 9700727 3 4 - 4982534 + 4965932 4 67 - 1822507 + 1816434 @@ -9163,22 +9148,22 @@ 1 2 - 12591079 + 12543862 2 3 - 8396184 + 8367978 3 4 - 4208285 + 4194263 4 9 - 986351 + 983064 @@ -9194,7 +9179,7 @@ 46457 46458 - 610 + 608 46659 @@ -9203,7 +9188,7 @@ 646904 - 2488917 + 2488393 31 @@ -9220,7 +9205,7 @@ 1 2 - 599 + 597 2 @@ -9230,7 +9215,7 @@ 950 16173 - 42 + 41 @@ -9246,57 +9231,57 @@ 1 2 - 21743 + 21671 2 3 - 26750 + 26661 3 4 - 43297 + 43143 4 5 - 15842 + 15915 5 6 - 3250 + 3239 6 7 - 18324 + 18148 7 10 - 18882 + 18819 10 19 - 18251 + 18190 19 51 - 15694 + 15642 51 251 - 15547 + 15495 251 - 1169648 - 9467 + 1169172 + 9435 @@ -9312,17 +9297,17 @@ 1 2 - 104625 + 104277 2 3 - 88552 + 88257 3 66 - 13875 + 13828 @@ -9332,19 +9317,19 @@ functions - 4043207 + 3995453 id - 4043207 + 3995453 name - 1689263 + 1670237 kind - 871 + 861 @@ -9358,7 +9343,7 @@ 1 2 - 4043207 + 3995453 @@ -9374,7 +9359,7 @@ 1 2 - 4043207 + 3995453 @@ -9390,17 +9375,17 @@ 1 2 - 1441362 + 1425128 2 4 - 140377 + 138796 4 3162 - 107523 + 106312 @@ -9416,12 +9401,12 @@ 1 2 - 1686401 + 1667407 2 3 - 2862 + 2830 @@ -9437,37 +9422,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 +9468,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 +9508,26 @@ builtin_functions - 30800 + 30698 id - 30800 + 30698 function_entry_point - 1134663 + 1123577 id - 1130940 + 1120257 entry_point - 1134663 + 1123577 @@ -9556,12 +9541,12 @@ 1 2 - 1127758 + 1117475 2 17 - 3181 + 2782 @@ -9577,7 +9562,7 @@ 1 2 - 1134663 + 1123577 @@ -9587,15 +9572,15 @@ function_return_type - 4060505 + 4012557 id - 4043207 + 3995453 return_type - 617762 + 610312 @@ -9609,12 +9594,12 @@ 1 2 - 4025908 + 3978349 2 3 - 17298 + 17103 @@ -9630,27 +9615,27 @@ 1 2 - 309005 + 305402 2 3 - 213180 + 210533 3 5 - 48037 + 47496 5 365 - 46419 + 45773 432 - 9958 - 1120 + 9957 + 1107 @@ -9930,59 +9915,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 +9981,7 @@ 1 2 - 5849 + 5783 @@ -10012,32 +9997,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 +10032,15 @@ member_function_this_type - 672519 + 664083 id - 672519 + 664083 this_type - 175596 + 173496 @@ -10069,7 +10054,7 @@ 1 2 - 672519 + 664083 @@ -10085,37 +10070,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 +10110,27 @@ fun_decls - 4199390 + 4150369 id - 4193416 + 4144463 function - 4018690 + 3971090 type_id - 609797 + 602560 name - 1687770 + 1668761 location - 2806438 + 2774828 @@ -10159,7 +10144,7 @@ 1 2 - 4193416 + 4144463 @@ -10175,12 +10160,12 @@ 1 2 - 4187442 + 4138556 2 3 - 5973 + 5906 @@ -10196,7 +10181,7 @@ 1 2 - 4193416 + 4144463 @@ -10212,7 +10197,7 @@ 1 2 - 4193416 + 4144463 @@ -10228,12 +10213,12 @@ 1 2 - 3858525 + 3812113 2 5 - 160165 + 158976 @@ -10249,12 +10234,12 @@ 1 2 - 4000396 + 3953002 2 3 - 18293 + 18087 @@ -10270,7 +10255,7 @@ 1 2 - 4018690 + 3971090 @@ -10286,12 +10271,12 @@ 1 2 - 3878437 + 3832293 2 4 - 140253 + 138796 @@ -10307,27 +10292,27 @@ 1 2 - 294445 + 291128 2 3 - 220024 + 217177 3 5 - 48286 + 47865 5 - 364 - 45797 + 365 + 45281 - 364 - 10294 - 1244 + 463 + 10298 + 1107 @@ -10343,27 +10328,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 +10364,22 @@ 1 2 - 490327 + 484558 2 3 - 52766 + 52048 3 7 - 50028 + 49464 7 2238 - 16676 + 16488 @@ -10410,22 +10395,22 @@ 1 2 - 453863 + 448505 2 3 - 69317 + 68414 3 6 - 55877 + 55248 6 4756 - 30738 + 30392 @@ -10441,22 +10426,22 @@ 1 2 - 1328363 + 1313155 2 3 - 193392 + 191460 3 11 - 129550 + 127968 11 3169 - 36463 + 36175 @@ -10472,17 +10457,17 @@ 1 2 - 1440864 + 1424636 2 4 - 140875 + 139289 4 3162 - 106030 + 104835 @@ -10498,12 +10483,12 @@ 1 2 - 1598167 + 1580167 2 1596 - 89602 + 88593 @@ -10519,17 +10504,17 @@ 1 2 - 1363955 + 1348593 2 3 - 207828 + 205488 3 1592 - 115985 + 114679 @@ -10545,17 +10530,17 @@ 1 2 - 2413305 + 2387477 2 3 - 252008 + 247939 3 211 - 141124 + 139412 @@ -10571,17 +10556,17 @@ 1 2 - 2431972 + 2405934 2 3 - 233838 + 229974 3 211 - 140626 + 138919 @@ -10597,12 +10582,12 @@ 1 2 - 2692318 + 2662241 2 211 - 114119 + 112587 @@ -10618,12 +10603,12 @@ 1 2 - 2767361 + 2736192 2 8 - 39076 + 38636 @@ -10633,22 +10618,22 @@ fun_def - 1418837 + 1400518 id - 1418837 + 1400518 fun_specialized - 7911 + 7909 id - 7911 + 7909 @@ -10666,15 +10651,15 @@ fun_decl_specifiers - 4269578 + 4221244 id - 1744270 + 1724378 name - 1368 + 1353 @@ -10688,22 +10673,22 @@ 1 2 - 362269 + 357943 2 3 - 261590 + 258644 3 4 - 1097511 + 1085149 4 5 - 22898 + 22640 @@ -10719,57 +10704,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 +10885,26 @@ fun_decl_empty_throws - 421590 + 421484 fun_decl - 421590 + 421484 fun_decl_noexcept - 140906 + 139575 fun_decl - 140906 + 139575 constant - 140466 + 139139 @@ -10933,7 +10918,7 @@ 1 2 - 140906 + 139575 @@ -10949,12 +10934,12 @@ 1 2 - 140026 + 138703 2 3 - 440 + 435 @@ -10964,22 +10949,22 @@ fun_decl_empty_noexcept - 1160855 + 1147165 fun_decl - 1160855 + 1147165 fun_decl_typedef_type - 2755 + 2756 fun_decl - 2755 + 2756 typedeftype_id @@ -10997,7 +10982,7 @@ 1 2 - 2755 + 2756 @@ -11073,11 +11058,11 @@ fun_requires - 29022 + 28932 id - 10081 + 10050 kind @@ -11085,7 +11070,7 @@ constraint - 28786 + 28696 @@ -11099,7 +11084,7 @@ 1 2 - 10017 + 9986 2 @@ -11120,27 +11105,27 @@ 1 2 - 7250 + 7227 2 3 - 493 + 491 3 6 - 858 + 855 6 13 - 321 + 320 13 14 - 1136 + 1133 19 @@ -11203,7 +11188,7 @@ 1 2 - 28550 + 28461 2 @@ -11224,7 +11209,7 @@ 1 2 - 28786 + 28696 @@ -11234,19 +11219,19 @@ param_decl_bind - 7294672 + 7209190 id - 7294672 + 7209190 index - 7964 + 7874 fun_decl - 3524008 + 3482963 @@ -11260,7 +11245,7 @@ 1 2 - 7294672 + 7209190 @@ -11276,7 +11261,7 @@ 1 2 - 7294672 + 7209190 @@ -11292,32 +11277,32 @@ 2 3 - 3982 + 3937 6 7 - 1991 + 1968 16 20 - 622 + 615 25 147 - 622 + 615 343 - 16218 - 622 + 16207 + 615 - 28317 - 28318 - 124 + 28306 + 28307 + 123 @@ -11333,32 +11318,32 @@ 2 3 - 3982 + 3937 6 7 - 1991 + 1968 16 20 - 622 + 615 25 147 - 622 + 615 343 - 16218 - 622 + 16207 + 615 - 28317 - 28318 - 124 + 28306 + 28307 + 123 @@ -11374,27 +11359,27 @@ 1 2 - 1505826 + 1488866 2 3 - 973933 + 961980 3 4 - 600712 + 593823 4 5 - 290089 + 286576 5 65 - 153444 + 151716 @@ -11410,27 +11395,27 @@ 1 2 - 1505826 + 1488866 2 3 - 973933 + 961980 3 4 - 600712 + 593823 4 5 - 290089 + 286576 5 65 - 153444 + 151716 @@ -11440,27 +11425,27 @@ var_decls - 9374456 + 9438429 id - 9367984 + 9432031 variable - 9027369 + 9094637 type_id - 1452936 + 1436079 name - 850481 + 840902 location - 6259510 + 6190362 @@ -11474,7 +11459,7 @@ 1 2 - 9367984 + 9432031 @@ -11490,12 +11475,12 @@ 1 2 - 9361513 + 9425632 2 3 - 6471 + 6398 @@ -11511,7 +11496,7 @@ 1 2 - 9367984 + 9432031 @@ -11527,7 +11512,7 @@ 1 2 - 9367984 + 9432031 @@ -11543,12 +11528,12 @@ 1 2 - 8704176 + 8774469 2 5 - 323192 + 320167 @@ -11564,12 +11549,12 @@ 1 2 - 8974354 + 9042219 2 3 - 53015 + 52417 @@ -11585,12 +11570,12 @@ 1 2 - 8922210 + 8990662 2 4 - 105158 + 103974 @@ -11606,12 +11591,12 @@ 1 2 - 8783076 + 8852726 2 4 - 244292 + 241910 @@ -11627,27 +11612,27 @@ 1 2 - 847867 + 839056 2 3 - 283244 + 279685 3 5 - 127186 + 125138 5 11 - 112874 + 111357 11 - 2949 - 81762 + 2963 + 80841 @@ -11663,27 +11648,27 @@ 1 2 - 868526 + 859482 2 3 - 268435 + 265042 3 5 - 122581 + 120585 5 11 - 112501 + 110988 11 - 2872 - 80891 + 2886 + 79980 @@ -11699,22 +11684,22 @@ 1 2 - 1116800 + 1104222 2 3 - 192148 + 189861 3 7 - 114990 + 113326 7 1038 - 28996 + 28669 @@ -11730,27 +11715,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 +11751,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 +11792,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 +11833,22 @@ 1 2 - 653105 + 644273 2 3 - 110510 + 111111 3 11 - 65335 + 64230 11 3463 - 21529 + 21287 @@ -11879,27 +11864,27 @@ 1 2 - 492442 + 485911 2 3 - 182939 + 181371 3 4 - 51521 + 51433 4 8 - 64837 + 64107 8 22619 - 58739 + 58078 @@ -11915,17 +11900,17 @@ 1 2 - 5758605 + 5693376 2 20 - 470788 + 468316 20 - 2941 - 30116 + 2943 + 28669 @@ -11941,12 +11926,12 @@ 1 2 - 5839247 + 5773110 2 2935 - 420262 + 417251 @@ -11962,12 +11947,12 @@ 1 2 - 5961705 + 5895911 2 2555 - 297805 + 294451 @@ -11983,12 +11968,12 @@ 1 2 - 6247189 + 6178181 2 5 - 12320 + 12181 @@ -11998,37 +11983,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 +12027,7 @@ 1 2 - 488709 + 482712 @@ -12058,22 +12043,22 @@ 16 17 - 124 + 123 77 78 - 124 + 123 653 654 - 124 + 123 - 3181 - 3182 - 124 + 3177 + 3178 + 123 @@ -12083,18 +12068,18 @@ is_structured_binding - 943 + 940 id - 943 + 940 var_requires - 386 + 384 id @@ -12102,7 +12087,7 @@ constraint - 386 + 384 @@ -12142,7 +12127,7 @@ 1 2 - 386 + 384 @@ -12152,19 +12137,19 @@ type_decls - 1629528 + 1610929 id - 1629528 + 1610929 type_id - 1610612 + 1592225 location - 1543659 + 1526272 @@ -12178,7 +12163,7 @@ 1 2 - 1629528 + 1610929 @@ -12194,7 +12179,7 @@ 1 2 - 1629528 + 1610929 @@ -12210,12 +12195,12 @@ 1 2 - 1594309 + 1576106 2 10 - 16302 + 16119 @@ -12231,12 +12216,12 @@ 1 2 - 1594434 + 1576229 2 10 - 16178 + 15996 @@ -12252,12 +12237,12 @@ 1 2 - 1521631 + 1504493 2 64 - 22027 + 21779 @@ -12273,12 +12258,12 @@ 1 2 - 1521756 + 1504616 2 64 - 21902 + 21656 @@ -12288,37 +12273,37 @@ type_def - 1092906 + 1080351 id - 1092906 + 1080351 type_decl_top - 676476 + 676681 type_decl - 676476 + 676681 type_requires - 7657 + 7633 id - 2037 + 2031 constraint - 7636 + 7612 @@ -12332,17 +12317,17 @@ 1 2 - 1008 + 1005 2 5 - 107 + 106 5 6 - 600 + 598 6 @@ -12352,7 +12337,7 @@ 13 14 - 150 + 149 @@ -12368,7 +12353,7 @@ 1 2 - 7614 + 7591 2 @@ -12383,23 +12368,23 @@ namespace_decls - 408755 + 408652 id - 408755 + 408652 namespace_id - 1838 + 1837 location - 408755 + 408652 bodylocation - 408755 + 408652 @@ -12413,7 +12398,7 @@ 1 2 - 408755 + 408652 @@ -12429,7 +12414,7 @@ 1 2 - 408755 + 408652 @@ -12445,7 +12430,7 @@ 1 2 - 408755 + 408652 @@ -12659,7 +12644,7 @@ 1 2 - 408755 + 408652 @@ -12675,7 +12660,7 @@ 1 2 - 408755 + 408652 @@ -12691,7 +12676,7 @@ 1 2 - 408755 + 408652 @@ -12707,7 +12692,7 @@ 1 2 - 408755 + 408652 @@ -12723,7 +12708,7 @@ 1 2 - 408755 + 408652 @@ -12739,7 +12724,7 @@ 1 2 - 408755 + 408652 @@ -12749,23 +12734,23 @@ usings - 270979 + 270034 id - 270979 + 270034 element_id - 58813 + 58576 location - 26740 + 26651 kind - 21 + 20 @@ -12779,7 +12764,7 @@ 1 2 - 270979 + 270034 @@ -12795,7 +12780,7 @@ 1 2 - 270979 + 270034 @@ -12811,7 +12796,7 @@ 1 2 - 270979 + 270034 @@ -12827,17 +12812,17 @@ 1 2 - 51113 + 50901 2 5 - 5364 + 5347 5 134 - 2335 + 2327 @@ -12853,17 +12838,17 @@ 1 2 - 51113 + 50901 2 5 - 5364 + 5347 5 134 - 2335 + 2327 @@ -12879,7 +12864,7 @@ 1 2 - 58813 + 58576 @@ -12895,22 +12880,22 @@ 1 2 - 21091 + 21021 2 4 - 2293 + 2275 4 132 - 1935 + 1939 145 - 367 - 1420 + 366 + 1415 @@ -12926,22 +12911,22 @@ 1 2 - 21091 + 21021 2 4 - 2293 + 2275 4 132 - 1935 + 1939 145 - 367 - 1420 + 366 + 1415 @@ -12957,7 +12942,7 @@ 1 2 - 26740 + 26651 @@ -12976,8 +12961,8 @@ 10 - 25367 - 25368 + 25363 + 25364 10 @@ -12997,8 +12982,8 @@ 10 - 5377 - 5378 + 5373 + 5374 10 @@ -13030,15 +13015,15 @@ using_container - 577799 + 575831 parent - 21806 + 21734 child - 270979 + 270034 @@ -13052,42 +13037,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 +13088,27 @@ 1 2 - 96210 + 95847 2 3 - 119794 + 119395 3 4 - 20018 + 19951 4 5 - 26603 + 26514 5 65 - 8352 + 8324 @@ -13133,27 +13118,27 @@ static_asserts - 172739 + 172696 id - 172739 + 172696 condition - 172739 + 172696 message - 38650 + 38640 location - 22584 + 22578 enclosing - 6810 + 6808 @@ -13167,7 +13152,7 @@ 1 2 - 172739 + 172696 @@ -13183,7 +13168,7 @@ 1 2 - 172739 + 172696 @@ -13199,7 +13184,7 @@ 1 2 - 172739 + 172696 @@ -13215,7 +13200,7 @@ 1 2 - 172739 + 172696 @@ -13231,7 +13216,7 @@ 1 2 - 172739 + 172696 @@ -13247,7 +13232,7 @@ 1 2 - 172739 + 172696 @@ -13263,7 +13248,7 @@ 1 2 - 172739 + 172696 @@ -13279,7 +13264,7 @@ 1 2 - 172739 + 172696 @@ -13295,7 +13280,7 @@ 1 2 - 28414 + 28407 2 @@ -13305,17 +13290,17 @@ 3 4 - 3619 + 3618 4 12 - 2081 + 2080 12 17 - 3125 + 3124 17 @@ -13336,7 +13321,7 @@ 1 2 - 28414 + 28407 2 @@ -13346,17 +13331,17 @@ 3 4 - 3619 + 3618 4 12 - 2081 + 2080 12 17 - 3125 + 3124 17 @@ -13377,12 +13362,12 @@ 1 2 - 35816 + 35807 2 33 - 2834 + 2833 @@ -13398,7 +13383,7 @@ 1 2 - 30220 + 30212 2 @@ -13408,7 +13393,7 @@ 3 4 - 3384 + 3383 4 @@ -13434,17 +13419,17 @@ 1 2 - 4267 + 4266 2 3 - 3716 + 3715 3 4 - 1741 + 1740 4 @@ -13454,7 +13439,7 @@ 5 6 - 4720 + 4719 6 @@ -13474,12 +13459,12 @@ 17 18 - 4380 + 4379 19 52 - 502 + 501 @@ -13495,17 +13480,17 @@ 1 2 - 4267 + 4266 2 3 - 3716 + 3715 3 4 - 1741 + 1740 4 @@ -13515,7 +13500,7 @@ 5 6 - 4720 + 4719 6 @@ -13535,12 +13520,12 @@ 17 18 - 4380 + 4379 19 52 - 502 + 501 @@ -13556,17 +13541,17 @@ 1 2 - 6939 + 6937 2 3 - 7652 + 7650 3 4 - 7757 + 7755 4 @@ -13587,12 +13572,12 @@ 1 2 - 5052 + 5051 2 3 - 8073 + 8071 3 @@ -13602,7 +13587,7 @@ 4 5 - 4745 + 4744 5 @@ -13633,7 +13618,7 @@ 1 2 - 5708 + 5707 2 @@ -13664,7 +13649,7 @@ 1 2 - 5708 + 5707 2 @@ -13695,7 +13680,7 @@ 1 2 - 5862 + 5861 2 @@ -13721,7 +13706,7 @@ 1 2 - 5846 + 5845 2 @@ -13741,23 +13726,23 @@ params - 7052247 + 6969126 id - 7011801 + 6929135 function - 3400306 + 3360408 index - 7964 + 7874 type_id - 1217355 + 1203274 @@ -13771,7 +13756,7 @@ 1 2 - 7011801 + 6929135 @@ -13787,7 +13772,7 @@ 1 2 - 7011801 + 6929135 @@ -13803,12 +13788,12 @@ 1 2 - 6971355 + 6889145 2 3 - 40445 + 39990 @@ -13824,27 +13809,27 @@ 1 2 - 1470856 + 1454044 2 3 - 924776 + 913499 3 4 - 578187 + 571429 4 5 - 280506 + 277101 5 65 - 145978 + 144333 @@ -13860,27 +13845,27 @@ 1 2 - 1470856 + 1454044 2 3 - 924776 + 913499 3 4 - 578187 + 571429 4 5 - 280506 + 277101 5 65 - 145978 + 144333 @@ -13896,22 +13881,22 @@ 1 2 - 1778617 + 1757600 2 3 - 1029313 + 1017228 3 4 - 437436 + 432386 4 11 - 154938 + 153193 @@ -13927,32 +13912,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 +13953,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 +13994,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 +14035,27 @@ 1 2 - 735615 + 728068 2 3 - 239687 + 236496 3 5 - 93087 + 91669 5 13 - 93709 + 92408 13 2574 - 55255 + 54632 @@ -14086,27 +14071,27 @@ 1 2 - 817502 + 809278 2 3 - 179081 + 175833 3 6 - 106154 + 104958 6 27 - 91967 + 90808 27 2562 - 22649 + 22394 @@ -14122,17 +14107,17 @@ 1 2 - 992725 + 981544 2 3 - 166387 + 164267 3 65 - 58241 + 57462 @@ -14142,15 +14127,15 @@ overrides - 159143 + 159103 new - 150374 + 150336 old - 17798 + 17794 @@ -14164,12 +14149,12 @@ 1 2 - 141612 + 141576 2 4 - 8761 + 8759 @@ -14185,12 +14170,12 @@ 1 2 - 9684 + 9682 2 3 - 2405 + 2404 3 @@ -14205,12 +14190,12 @@ 6 17 - 1336 + 1335 17 230 - 1247 + 1246 @@ -14220,19 +14205,19 @@ membervariables - 1505217 + 1505673 id - 1502766 + 1503222 type_id - 457991 + 458130 name - 644237 + 644432 @@ -14246,12 +14231,12 @@ 1 2 - 1500425 + 1500880 2 4 - 2341 + 2342 @@ -14267,7 +14252,7 @@ 1 2 - 1502766 + 1503222 @@ -14283,22 +14268,22 @@ 1 2 - 339817 + 339920 2 3 - 72592 + 72614 3 10 - 35397 + 35408 10 4445 - 10183 + 10186 @@ -14314,17 +14299,17 @@ 1 2 - 357407 + 357515 2 3 - 64750 + 64770 3 57 - 34362 + 34373 60 @@ -14345,22 +14330,22 @@ 1 2 - 423356 + 423484 2 3 - 122584 + 122621 3 5 - 58106 + 58124 5 664 - 40189 + 40202 @@ -14376,17 +14361,17 @@ 1 2 - 526390 + 526550 2 3 - 73300 + 73322 3 668 - 44546 + 44560 @@ -14396,19 +14381,19 @@ globalvariables - 492567 + 662484 id - 492567 + 662484 type_id - 10329 + 10212 name - 112252 + 110988 @@ -14422,7 +14407,7 @@ 1 2 - 492567 + 662484 @@ -14438,7 +14423,7 @@ 1 2 - 492567 + 662484 @@ -14454,32 +14439,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 +14480,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 +14521,22 @@ 1 2 - 94954 + 92900 2 - 7 - 8835 + 8 + 9351 - 7 - 604 - 8462 + 8 + 139 + 8367 + + + 181 + 1156 + 369 @@ -14562,17 +14552,17 @@ 1 2 - 96696 + 94130 2 3 - 15307 + 16611 3 4 - 248 + 246 @@ -14582,19 +14572,19 @@ localvariables - 724688 + 724660 id - 724688 + 724660 type_id - 53301 + 53317 name - 101408 + 101453 @@ -14608,7 +14598,7 @@ 1 2 - 724688 + 724660 @@ -14624,7 +14614,7 @@ 1 2 - 724688 + 724660 @@ -14640,37 +14630,37 @@ 1 2 - 28793 + 28825 2 3 - 7806 + 7801 3 4 - 4020 + 4034 4 6 - 4060 + 4058 6 12 - 4128 + 4106 12 - 162 - 4000 + 163 + 4002 - 162 + 164 19347 - 491 + 487 @@ -14686,22 +14676,22 @@ 1 2 - 38252 + 38261 2 3 - 6704 + 6707 3 5 - 4468 + 4470 5 3509 - 3877 + 3878 @@ -14717,32 +14707,32 @@ 1 2 - 62401 + 62429 2 3 - 16003 + 16010 3 4 - 6516 + 6527 4 8 - 8129 + 8141 8 - 134 - 7606 + 137 + 7617 - 134 - 7549 - 750 + 137 + 7546 + 727 @@ -14758,17 +14748,17 @@ 1 2 - 84398 + 84435 2 3 - 8393 + 8396 3 15 - 7666 + 7669 15 @@ -14783,15 +14773,15 @@ autoderivation - 228611 + 224437 var - 228611 + 224437 derivation_type - 622 + 615 @@ -14805,7 +14795,7 @@ 1 2 - 228611 + 224437 @@ -14821,27 +14811,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 +14841,15 @@ orphaned_variables - 44035 + 43619 var - 44035 + 43619 function - 40786 + 40400 @@ -14873,7 +14863,7 @@ 1 2 - 44035 + 43619 @@ -14889,12 +14879,12 @@ 1 2 - 39939 + 39562 2 47 - 846 + 838 @@ -14904,19 +14894,19 @@ enumconstants - 348040 + 348146 id - 348040 + 348146 parent - 41605 + 41618 index - 13941 + 13945 type_id @@ -14924,11 +14914,11 @@ name - 347659 + 347764 location - 320648 + 320745 @@ -14942,7 +14932,7 @@ 1 2 - 348040 + 348146 @@ -14958,7 +14948,7 @@ 1 2 - 348040 + 348146 @@ -14974,7 +14964,7 @@ 1 2 - 348040 + 348146 @@ -14990,7 +14980,7 @@ 1 2 - 348040 + 348146 @@ -15006,7 +14996,7 @@ 1 2 - 348040 + 348146 @@ -15022,57 +15012,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 +15078,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 +15144,7 @@ 1 2 - 41605 + 41618 @@ -15170,57 +15160,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 +15226,27 @@ 1 2 - 2123 + 2124 2 3 - 6044 + 6046 3 4 - 8767 + 8770 4 5 - 5500 + 5501 5 6 - 4574 + 4575 6 @@ -15266,12 +15256,12 @@ 7 8 - 1851 + 1852 8 11 - 3812 + 3813 11 @@ -15281,7 +15271,7 @@ 17 165 - 3158 + 3159 256 @@ -15302,12 +15292,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15358,12 +15348,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15414,7 +15404,7 @@ 1 2 - 13941 + 13945 @@ -15430,12 +15420,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15486,12 +15476,12 @@ 1 2 - 2777 + 2778 2 3 - 2232 + 2233 3 @@ -15622,7 +15612,7 @@ 1 2 - 347278 + 347383 2 @@ -15643,7 +15633,7 @@ 1 2 - 347278 + 347383 2 @@ -15664,7 +15654,7 @@ 1 2 - 347659 + 347764 @@ -15680,7 +15670,7 @@ 1 2 - 347659 + 347764 @@ -15696,7 +15686,7 @@ 1 2 - 347278 + 347383 2 @@ -15717,12 +15707,12 @@ 1 2 - 319613 + 319710 2 205 - 1034 + 1035 @@ -15738,7 +15728,7 @@ 1 2 - 320648 + 320745 @@ -15754,12 +15744,12 @@ 1 2 - 319613 + 319710 2 205 - 1034 + 1035 @@ -15775,7 +15765,7 @@ 1 2 - 320648 + 320745 @@ -15791,12 +15781,12 @@ 1 2 - 319613 + 319710 2 205 - 1034 + 1035 @@ -15806,31 +15796,31 @@ builtintypes - 7218 + 7136 id - 7218 + 7136 name - 7218 + 7136 kind - 7218 + 7136 size - 871 + 861 sign - 373 + 369 alignment - 622 + 615 @@ -15844,7 +15834,7 @@ 1 2 - 7218 + 7136 @@ -15860,7 +15850,7 @@ 1 2 - 7218 + 7136 @@ -15876,7 +15866,7 @@ 1 2 - 7218 + 7136 @@ -15892,7 +15882,7 @@ 1 2 - 7218 + 7136 @@ -15908,7 +15898,7 @@ 1 2 - 7218 + 7136 @@ -15924,7 +15914,7 @@ 1 2 - 7218 + 7136 @@ -15940,7 +15930,7 @@ 1 2 - 7218 + 7136 @@ -15956,7 +15946,7 @@ 1 2 - 7218 + 7136 @@ -15972,7 +15962,7 @@ 1 2 - 7218 + 7136 @@ -15988,7 +15978,7 @@ 1 2 - 7218 + 7136 @@ -16004,7 +15994,7 @@ 1 2 - 7218 + 7136 @@ -16020,7 +16010,7 @@ 1 2 - 7218 + 7136 @@ -16036,7 +16026,7 @@ 1 2 - 7218 + 7136 @@ -16052,7 +16042,7 @@ 1 2 - 7218 + 7136 @@ -16068,7 +16058,7 @@ 1 2 - 7218 + 7136 @@ -16084,32 +16074,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 +16115,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 +16156,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 +16197,12 @@ 1 2 - 248 + 246 3 4 - 622 + 615 @@ -16228,12 +16218,12 @@ 1 2 - 497 + 492 2 3 - 373 + 369 @@ -16249,17 +16239,17 @@ 6 7 - 124 + 123 12 13 - 124 + 123 40 41 - 124 + 123 @@ -16275,17 +16265,17 @@ 6 7 - 124 + 123 12 13 - 124 + 123 40 41 - 124 + 123 @@ -16301,17 +16291,17 @@ 6 7 - 124 + 123 12 13 - 124 + 123 40 41 - 124 + 123 @@ -16327,12 +16317,12 @@ 5 6 - 248 + 246 7 8 - 124 + 123 @@ -16348,7 +16338,7 @@ 5 6 - 373 + 369 @@ -16364,27 +16354,27 @@ 7 8 - 124 + 123 10 11 - 124 + 123 12 13 - 124 + 123 13 14 - 124 + 123 16 17 - 124 + 123 @@ -16400,27 +16390,27 @@ 7 8 - 124 + 123 10 11 - 124 + 123 12 13 - 124 + 123 13 14 - 124 + 123 16 17 - 124 + 123 @@ -16436,27 +16426,27 @@ 7 8 - 124 + 123 10 11 - 124 + 123 12 13 - 124 + 123 13 14 - 124 + 123 16 17 - 124 + 123 @@ -16472,7 +16462,7 @@ 2 3 - 622 + 615 @@ -16488,7 +16478,7 @@ 3 4 - 622 + 615 @@ -16498,23 +16488,23 @@ derivedtypes - 3023725 + 2998651 id - 3023725 + 2998651 name - 1457167 + 1444200 kind - 746 + 738 type_id - 1942143 + 1926175 @@ -16528,7 +16518,7 @@ 1 2 - 3023725 + 2998651 @@ -16544,7 +16534,7 @@ 1 2 - 3023725 + 2998651 @@ -16560,7 +16550,7 @@ 1 2 - 3023725 + 2998651 @@ -16576,17 +16566,17 @@ 1 2 - 1340932 + 1326444 2 - 28 - 109639 + 22 + 108527 - 29 - 4302 - 6595 + 22 + 4289 + 9228 @@ -16602,7 +16592,7 @@ 1 2 - 1457167 + 1444200 @@ -16618,17 +16608,17 @@ 1 2 - 1341056 + 1326567 2 - 28 - 109514 + 22 + 108404 - 29 - 4302 - 6595 + 22 + 4289 + 9228 @@ -16642,34 +16632,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 +16675,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 +16714,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 +16757,22 @@ 1 2 - 1314424 + 1303435 2 3 - 374963 + 372462 3 4 - 122955 + 121324 4 137 - 129799 + 128953 @@ -16798,22 +16788,22 @@ 1 2 - 1315918 + 1304911 2 3 - 374963 + 372462 3 4 - 121461 + 119847 4 137 - 129799 + 128953 @@ -16829,22 +16819,22 @@ 1 2 - 1316291 + 1305280 2 3 - 375585 + 373077 3 4 - 123204 + 121570 4 6 - 127061 + 126246 @@ -16854,19 +16844,19 @@ pointerishsize - 2242064 + 2223333 id - 2242064 + 2223333 size - 248 + 246 alignment - 248 + 246 @@ -16880,7 +16870,7 @@ 1 2 - 2242064 + 2223333 @@ -16896,7 +16886,7 @@ 1 2 - 2242064 + 2223333 @@ -16912,12 +16902,12 @@ 3 4 - 124 + 123 - 18013 - 18014 - 124 + 18066 + 18067 + 123 @@ -16933,7 +16923,7 @@ 1 2 - 248 + 246 @@ -16949,12 +16939,12 @@ 3 4 - 124 + 123 - 18013 - 18014 - 124 + 18066 + 18067 + 123 @@ -16970,7 +16960,7 @@ 1 2 - 248 + 246 @@ -16980,23 +16970,23 @@ arraysizes - 80393 + 79488 id - 80393 + 79488 num_elements - 17796 + 17595 bytesize - 20160 + 19933 alignment - 622 + 615 @@ -17010,7 +17000,7 @@ 1 2 - 80393 + 79488 @@ -17026,7 +17016,7 @@ 1 2 - 80393 + 79488 @@ -17042,7 +17032,7 @@ 1 2 - 80393 + 79488 @@ -17058,37 +17048,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 +17094,22 @@ 1 2 - 11698 + 11566 2 3 - 3982 + 3937 3 5 - 995 + 984 5 11 - 1120 + 1107 @@ -17135,22 +17125,22 @@ 1 2 - 11698 + 11566 2 3 - 3982 + 3937 3 4 - 746 + 738 4 6 - 1368 + 1353 @@ -17166,37 +17156,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 +17202,22 @@ 1 2 - 14560 + 14396 2 3 - 3609 + 3568 3 6 - 1866 + 1845 6 7 - 124 + 123 @@ -17243,22 +17233,22 @@ 1 2 - 14809 + 14642 2 3 - 3360 + 3322 3 5 - 1617 + 1599 5 6 - 373 + 369 @@ -17274,27 +17264,27 @@ 10 11 - 124 + 123 86 87 - 124 + 123 91 92 - 124 + 123 121 122 - 124 + 123 338 339 - 124 + 123 @@ -17310,22 +17300,22 @@ 4 5 - 124 + 123 16 17 - 248 + 246 48 49 - 124 + 123 139 140 - 124 + 123 @@ -17341,27 +17331,27 @@ 4 5 - 124 + 123 19 20 - 124 + 123 20 21 - 124 + 123 48 49 - 124 + 123 140 141 - 124 + 123 @@ -17419,15 +17409,15 @@ typedefbase - 1755750 + 1757438 id - 1755750 + 1757438 type_id - 834219 + 835004 @@ -17441,7 +17431,7 @@ 1 2 - 1755750 + 1757438 @@ -17457,22 +17447,22 @@ 1 2 - 659334 + 660513 2 3 - 80757 + 80561 3 6 - 63915 + 63744 6 4525 - 30211 + 30184 @@ -17482,15 +17472,15 @@ decltypes - 814571 + 814818 id - 27567 + 27575 expr - 814571 + 814818 kind @@ -17498,7 +17488,7 @@ base_type - 3341 + 3342 parentheses_would_change_meaning @@ -17516,17 +17506,17 @@ 1 2 - 9738 + 9741 2 3 - 3649 + 3650 4 5 - 3627 + 3628 6 @@ -17536,12 +17526,12 @@ 23 24 - 3253 + 3254 29 30 - 3143 + 3144 32 @@ -17551,7 +17541,7 @@ 171 172 - 3077 + 3078 173 @@ -17572,7 +17562,7 @@ 1 2 - 27567 + 27575 @@ -17588,7 +17578,7 @@ 1 2 - 27567 + 27575 @@ -17604,7 +17594,7 @@ 1 2 - 27567 + 27575 @@ -17620,7 +17610,7 @@ 1 2 - 814571 + 814818 @@ -17636,7 +17626,7 @@ 1 2 - 814571 + 814818 @@ -17652,7 +17642,7 @@ 1 2 - 814571 + 814818 @@ -17668,7 +17658,7 @@ 1 2 - 814571 + 814818 @@ -17840,7 +17830,7 @@ 1 2 - 3341 + 3342 @@ -17856,7 +17846,7 @@ 1 2 - 3341 + 3342 @@ -17930,15 +17920,15 @@ type_operators - 7936 + 7954 id - 7936 + 7954 arg_type - 7164 + 7184 kind @@ -17946,7 +17936,7 @@ base_type - 5233 + 5217 @@ -17960,7 +17950,7 @@ 1 2 - 7936 + 7954 @@ -17976,7 +17966,7 @@ 1 2 - 7936 + 7954 @@ -17992,7 +17982,7 @@ 1 2 - 7936 + 7954 @@ -18008,12 +17998,12 @@ 1 2 - 6392 + 6415 2 3 - 772 + 769 @@ -18029,12 +18019,12 @@ 1 2 - 6392 + 6415 2 3 - 772 + 769 @@ -18050,7 +18040,7 @@ 1 2 - 7143 + 7163 2 @@ -18079,8 +18069,8 @@ 21 - 96 - 97 + 98 + 99 21 @@ -18110,8 +18100,8 @@ 21 - 96 - 97 + 98 + 99 21 @@ -18141,8 +18131,8 @@ 21 - 72 - 73 + 74 + 75 21 @@ -18164,22 +18154,22 @@ 1 2 - 3625 + 3571 2 3 - 900 + 940 3 4 - 343 + 342 4 6 - 364 + 363 @@ -18195,17 +18185,17 @@ 1 2 - 3775 + 3720 2 3 - 986 + 1026 3 4 - 450 + 449 4 @@ -18226,12 +18216,12 @@ 1 2 - 4075 + 4020 2 3 - 1136 + 1176 3 @@ -18246,19 +18236,19 @@ usertypes - 4137521 + 4198876 id - 4137521 + 4198876 name - 915335 + 949190 kind - 126 + 125 @@ -18272,7 +18262,7 @@ 1 2 - 4137521 + 4198876 @@ -18288,7 +18278,7 @@ 1 2 - 4137521 + 4198876 @@ -18304,22 +18294,22 @@ 1 2 - 652055 + 680968 2 3 - 158085 + 161123 3 8 - 70343 + 71345 8 - 32667 - 34850 + 33450 + 35751 @@ -18335,12 +18325,12 @@ 1 2 - 863800 + 897376 2 10 - 51534 + 51813 @@ -18384,8 +18374,8 @@ 10 - 4586 - 4587 + 4788 + 4789 10 @@ -18394,23 +18384,23 @@ 10 - 21491 - 21492 + 21602 + 21603 10 - 82174 - 82175 + 82275 + 82276 10 - 92838 - 92839 + 98872 + 98873 10 - 166906 - 166907 + 167625 + 167626 10 @@ -18450,8 +18440,8 @@ 10 - 771 - 772 + 783 + 784 10 @@ -18460,8 +18450,8 @@ 10 - 3066 - 3067 + 3068 + 3069 10 @@ -18475,13 +18465,13 @@ 10 - 12187 - 12188 + 12272 + 12273 10 - 57664 - 57665 + 61131 + 61132 10 @@ -18492,19 +18482,19 @@ usertypesize - 1359600 + 1420199 id - 1359600 + 1420199 size - 1472 + 1467 alignment - 84 + 83 @@ -18518,7 +18508,7 @@ 1 2 - 1359600 + 1420199 @@ -18534,7 +18524,7 @@ 1 2 - 1359600 + 1420199 @@ -18550,12 +18540,12 @@ 1 2 - 462 + 461 2 3 - 189 + 188 3 @@ -18594,7 +18584,7 @@ 1839 - 99841 + 106053 52 @@ -18611,7 +18601,7 @@ 1 2 - 1199 + 1195 2 @@ -18670,8 +18660,8 @@ 10 - 115036 - 115037 + 121248 + 121249 10 @@ -18688,7 +18678,7 @@ 1 2 - 21 + 20 3 @@ -18728,26 +18718,26 @@ usertype_final - 11449 + 11320 id - 11449 + 11320 usertype_uuid - 47930 + 47918 id - 47930 + 47918 uuid - 47387 + 47375 @@ -18761,7 +18751,7 @@ 1 2 - 47930 + 47918 @@ -18777,7 +18767,7 @@ 1 2 - 46845 + 46833 2 @@ -18792,15 +18782,15 @@ usertype_alias_kind - 1755750 + 1757438 id - 1755750 + 1757438 alias_kind - 21 + 20 @@ -18814,7 +18804,7 @@ 1 2 - 1755750 + 1757438 @@ -18828,13 +18818,13 @@ 12 - 36914 - 36915 + 36955 + 36956 10 - 129992 - 129993 + 130670 + 130671 10 @@ -18845,26 +18835,26 @@ nontype_template_parameters - 761293 + 753465 id - 761293 + 753465 type_template_type_constraint - 27070 + 26986 id - 13342 + 13300 constraint - 25933 + 25852 @@ -18878,27 +18868,27 @@ 1 2 - 10189 + 10157 2 3 - 900 + 898 3 5 - 1029 + 1026 5 14 - 1115 + 1111 14 17 - 107 + 106 @@ -18914,12 +18904,12 @@ 1 2 - 24796 + 24719 2 3 - 1136 + 1133 @@ -18929,19 +18919,19 @@ mangled_name - 7910444 + 8194180 id - 7910444 + 8194180 mangled_name - 6349611 + 6357829 is_complete - 248 + 246 @@ -18955,7 +18945,7 @@ 1 2 - 7910444 + 8194180 @@ -18971,7 +18961,7 @@ 1 2 - 7910444 + 8194180 @@ -18987,12 +18977,12 @@ 1 2 - 6016213 + 6002593 2 1120 - 333397 + 355236 @@ -19008,7 +18998,7 @@ 1 2 - 6349611 + 6357829 @@ -19024,12 +19014,12 @@ 6 7 - 124 + 123 - 63558 - 63559 - 124 + 66588 + 66589 + 123 @@ -19045,12 +19035,12 @@ 6 7 - 124 + 123 - 51016 - 51017 - 124 + 51664 + 51665 + 123 @@ -19060,59 +19050,59 @@ is_pod_class - 590973 + 607922 id - 590973 + 607922 is_standard_layout_class - 1120536 + 1181932 id - 1120536 + 1181932 is_complete - 1341507 + 1402166 id - 1341507 + 1402166 is_class_template - 231184 + 230414 id - 231184 + 230414 class_instantiation - 1122188 + 1182540 to - 1119158 + 1179520 from - 71521 + 71723 @@ -19126,12 +19116,12 @@ 1 2 - 1117033 + 1177402 2 8 - 2124 + 2117 @@ -19147,47 +19137,47 @@ 1 2 - 20386 + 20329 2 3 - 12833 + 12769 3 4 - 7111 + 7108 4 5 - 4639 + 4655 5 7 - 6059 + 6175 7 10 - 5680 + 5682 10 17 - 5890 + 5850 17 - 51 - 5364 + 52 + 5409 - 51 - 4223 - 3555 + 52 + 4358 + 3742 @@ -19197,19 +19187,19 @@ class_template_argument - 2887364 + 2998534 type_id - 1362199 + 1422055 index - 1178 + 1174 arg_type - 818756 + 844136 @@ -19223,27 +19213,27 @@ 1 2 - 577725 + 599054 2 3 - 408636 + 433884 3 4 - 249940 + 263356 4 - 7 - 102679 + 8 + 107663 - 7 + 8 113 - 23216 + 18095 @@ -19259,22 +19249,22 @@ 1 2 - 606159 + 627907 2 3 - 422574 + 448038 3 4 - 250771 + 263419 4 113 - 82692 + 82690 @@ -19295,7 +19285,7 @@ 4 5 - 746 + 744 5 @@ -19314,13 +19304,13 @@ 643 - 7128 + 7143 94 - 11968 - 129492 - 42 + 11996 + 135625 + 41 @@ -19341,12 +19331,12 @@ 4 5 - 746 + 744 5 16 - 105 + 104 16 @@ -19360,12 +19350,12 @@ 196 - 3263 + 3290 94 - 10412 - 44535 + 11128 + 46222 31 @@ -19382,27 +19372,27 @@ 1 2 - 511558 + 523955 2 3 - 166890 + 174574 3 5 - 74919 + 77678 5 - 46 - 61412 + 44 + 63440 - 46 - 12620 - 3976 + 44 + 13909 + 4487 @@ -19418,17 +19408,17 @@ 1 2 - 720873 + 737060 2 3 - 79589 + 87806 3 22 - 18293 + 19270 @@ -19438,19 +19428,19 @@ class_template_argument_value - 506795 + 508345 type_id - 204505 + 208910 index - 304 + 301 arg_value - 506660 + 508211 @@ -19464,17 +19454,17 @@ 1 2 - 154817 + 159691 2 3 - 43087 + 42680 3 8 - 6600 + 6537 @@ -19490,22 +19480,22 @@ 1 2 - 146998 + 151947 2 3 - 40210 + 39830 3 - 45 - 15434 + 52 + 15892 - 45 + 54 154 - 1861 + 1240 @@ -19549,18 +19539,18 @@ 33 - 981 - 982 + 982 + 983 33 - 2472 - 2473 + 2571 + 2572 33 - 3753 - 3754 + 3842 + 3843 33 @@ -19605,18 +19595,18 @@ 33 - 2433 - 2434 + 2434 + 2435 33 - 4802 - 4803 + 4901 + 4902 33 - 6051 - 6052 + 6140 + 6141 33 @@ -19633,12 +19623,12 @@ 1 2 - 506524 + 508077 2 3 - 135 + 134 @@ -19654,7 +19644,7 @@ 1 2 - 506660 + 508211 @@ -19664,15 +19654,15 @@ is_proxy_class_for - 48241 + 50199 id - 48241 + 50199 templ_param_id - 45580 + 46896 @@ -19686,7 +19676,7 @@ 1 2 - 48241 + 50199 @@ -19702,12 +19692,12 @@ 1 2 - 44865 + 46141 2 - 79 - 715 + 82 + 754 @@ -19717,19 +19707,19 @@ type_mentions - 5913261 + 5915053 id - 5913261 + 5915053 type_id - 278007 + 278092 location - 5856951 + 5858727 kind @@ -19747,7 +19737,7 @@ 1 2 - 5913261 + 5915053 @@ -19763,7 +19753,7 @@ 1 2 - 5913261 + 5915053 @@ -19779,7 +19769,7 @@ 1 2 - 5913261 + 5915053 @@ -19795,42 +19785,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 +19836,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 +19887,7 @@ 1 2 - 278007 + 278092 @@ -19913,12 +19903,12 @@ 1 2 - 5811261 + 5813023 2 4 - 45690 + 45704 @@ -19934,12 +19924,12 @@ 1 2 - 5811261 + 5813023 2 4 - 45690 + 45704 @@ -19955,7 +19945,7 @@ 1 2 - 5856951 + 5858727 @@ -20013,26 +20003,26 @@ is_function_template - 1328114 + 1312417 id - 1328114 + 1312417 function_instantiation - 967592 + 958487 to - 967592 + 958487 from - 181523 + 179842 @@ -20046,7 +20036,7 @@ 1 2 - 967592 + 958487 @@ -20062,27 +20052,27 @@ 1 2 - 109834 + 108830 2 3 - 42546 + 42144 3 9 - 14351 + 14215 9 104 - 13640 + 13511 119 1532 - 1150 + 1139 @@ -20092,19 +20082,19 @@ function_template_argument - 2468721 + 2445838 function_id - 1443892 + 1430522 index - 473 + 469 arg_type - 296062 + 293265 @@ -20118,22 +20108,22 @@ 1 2 - 777946 + 770766 2 3 - 410500 + 406656 3 4 - 170691 + 169146 4 15 - 84753 + 83953 @@ -20149,22 +20139,22 @@ 1 2 - 796968 + 789608 2 3 - 408604 + 404778 3 4 - 168525 + 167001 4 9 - 69793 + 69133 @@ -20180,7 +20170,7 @@ 1 2 - 169 + 167 7 @@ -20213,18 +20203,18 @@ 33 - 7547 - 7548 + 7549 + 7550 33 - 19675 - 19676 + 19678 + 19679 33 - 42659 - 42660 + 42667 + 42668 33 @@ -20241,7 +20231,7 @@ 1 2 - 169 + 167 4 @@ -20279,8 +20269,8 @@ 33 - 2754 - 2755 + 2755 + 2756 33 @@ -20302,37 +20292,37 @@ 1 2 - 173636 + 171996 2 3 - 26163 + 25883 3 4 - 19868 + 19513 4 6 - 22508 + 22429 6 11 - 23083 + 22932 11 76 - 23219 + 22999 79 2452 - 7581 + 7510 @@ -20348,17 +20338,17 @@ 1 2 - 255140 + 252697 2 3 - 31918 + 31650 3 15 - 9003 + 8918 @@ -20368,19 +20358,19 @@ function_template_argument_value - 449830 + 445548 function_id - 195502 + 193655 index - 473 + 469 arg_value - 447156 + 442899 @@ -20394,17 +20384,17 @@ 1 2 - 150417 + 148996 2 3 - 42613 + 42211 3 8 - 2470 + 2447 @@ -20420,22 +20410,22 @@ 1 2 - 143546 + 142190 2 3 - 36453 + 36109 3 54 - 14757 + 14618 54 113 - 744 + 737 @@ -20451,7 +20441,7 @@ 1 2 - 169 + 167 2 @@ -20512,7 +20502,7 @@ 1 2 - 169 + 167 2 @@ -20545,8 +20535,8 @@ 33 - 3295 - 3296 + 3294 + 3295 33 @@ -20573,12 +20563,12 @@ 1 2 - 444482 + 440251 2 3 - 2673 + 2648 @@ -20594,7 +20584,7 @@ 1 2 - 447156 + 442899 @@ -20604,26 +20594,26 @@ is_variable_template - 58490 + 57832 id - 58490 + 57832 variable_instantiation - 427356 + 598007 to - 427356 + 598007 from - 35343 + 36175 @@ -20637,7 +20627,7 @@ 1 2 - 427356 + 598007 @@ -20653,47 +20643,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 +20693,19 @@ variable_template_argument - 772451 + 1129692 variable_id - 405577 + 576474 index - 1991 + 1968 arg_type - 255741 + 464378 @@ -20729,22 +20719,22 @@ 1 2 - 161534 + 189615 2 3 - 189535 + 289652 3 4 - 36338 + 77519 4 17 - 18169 + 19687 @@ -20760,22 +20750,22 @@ 1 2 - 176343 + 207333 2 3 - 179828 + 276855 3 4 - 33601 + 75427 4 17 - 15804 + 16857 @@ -20789,44 +20779,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 +20832,548 @@ 1 2 - 871 + 861 2 3 - 373 + 369 5 6 - 124 + 123 - 28 - 29 - 124 + 35 + 36 + 123 - 54 - 55 - 124 + 63 + 64 + 123 + + + 362 + 363 + 123 + + + 1465 + 1466 + 123 + + + 2164 + 2165 + 123 + + + + + + + arg_type + variable_id + + + 12 + + + 1 + 2 + 360650 + + + 2 + 3 + 57832 + + + 3 + 16 + 35437 + + + 16 + 224 + 10458 + + + + + + + arg_type + index + + + 12 + + + 1 + 2 + 430909 + + + 2 + 7 + 33468 + + + + + + + + + variable_template_argument_value + 19810 + + + variable_id + 14765 + + + index + 492 + + + arg_value + 19810 + + + + + variable_id + index + + + 12 + + + 1 + 2 + 13289 + + + 2 + 3 + 1476 + + + + + + + variable_id + arg_value + + + 12 + + + 1 + 2 + 10458 + + + 2 + 3 + 3937 + + + 4 + 5 + 369 + + + + + + + index + variable_id + + + 12 + + + 17 + 18 + 123 + + + 27 + 28 + 123 + + + 43 + 44 + 123 + + + 45 + 46 + 123 + + + + + + + index + arg_value + + + 12 + + + 22 + 23 + 123 + + + 29 + 30 + 123 + + + 52 + 53 + 123 + + + 58 + 59 + 123 + + + + + + + arg_value + variable_id + + + 12 + + + 1 + 2 + 19810 + + + + + + + arg_value + index + + + 12 + + + 1 + 2 + 19810 + + + + + + + + + is_alias_template + 107388 + + + id + 107388 + + + + + + alias_instantiation + 459629 + + + to + 459629 + + + from + 92200 + + + + + to + from + + + 12 + + + 1 + 2 + 459629 + + + + + + + from + to + + + 12 + + + 1 + 2 + 16529 + + + 2 + 3 + 16797 + + + 3 + 4 + 20015 + + + 4 + 5 + 12472 - 161 - 162 - 124 + 5 + 7 + 6705 + + + 7 + 8 + 4794 + + + 8 + 10 + 7811 - 747 - 748 - 124 + 10 + 143 + 6940 - 1327 - 1328 - 124 + 163 + 795 + 134 + + + + + + + + + alias_template_argument + 993020 + + + variable_id + 566951 + + + index + 301 + + + arg_type + 127706 + + + + + variable_id + index + + + 12 + + + 1 + 2 + 276166 + + + 2 + 3 + 182323 + + + 3 + 4 + 86903 + + + 4 + 10 + 21558 + + + + + + + variable_id + arg_type + + + 12 + + + 1 + 2 + 277407 + + + 2 + 3 + 181116 + + + 3 + 4 + 88345 + + + 4 + 10 + 20083 + + + + + + + index + variable_id + + + 12 + + + 6 + 7 + 33 + + + 8 + 9 + 33 + + + 10 + 11 + 33 + + + 42 + 43 + 33 + + + 91 + 92 + 33 + + + 643 + 644 + 33 + + + 3235 + 3236 + 33 + + + 8673 + 8674 + 33 + + + 16910 + 16911 + 33 + + + + + + + index + arg_type + + + 12 + + + 5 + 6 + 33 + + + 6 + 7 + 33 + + + 7 + 8 + 33 + + + 18 + 19 + 33 + + + 45 + 46 + 33 + + + 61 + 62 + 33 + + + 568 + 569 + 33 + + + 1513 + 1514 + 33 + + + 2209 + 2210 + 33 @@ -20893,22 +21389,32 @@ 1 2 - 173481 + 78152 2 3 - 46294 + 20284 3 + 4 + 5431 + + + 4 6 - 21529 + 10460 6 - 206 - 14436 + 76 + 10829 + + + 84 + 4474 + 2548 @@ -20924,17 +21430,17 @@ 1 2 - 227491 + 108797 2 3 - 24640 + 17300 3 - 7 - 3609 + 9 + 1609 @@ -20943,20 +21449,20 @@ - variable_template_argument_value - 19911 + alias_template_argument_value + 173170 variable_id - 14809 + 160597 index - 497 + 134 arg_value - 19911 + 173170 @@ -20970,12 +21476,12 @@ 1 2 - 13315 + 159356 2 3 - 1493 + 1240 @@ -20991,17 +21497,12 @@ 1 2 - 10453 + 158686 2 - 3 - 3982 - - - 4 - 5 - 373 + 42 + 1911 @@ -21015,24 +21516,24 @@ 12 - 17 - 18 - 124 + 34 + 35 + 33 - 27 - 28 - 124 + 49 + 50 + 33 - 41 - 42 - 124 + 199 + 200 + 33 - 46 - 47 - 124 + 4545 + 4546 + 33 @@ -21046,24 +21547,24 @@ 12 - 22 - 23 - 124 + 38 + 39 + 33 - 29 - 30 - 124 + 49 + 50 + 33 - 50 - 51 - 124 + 249 + 250 + 33 - 59 - 60 - 124 + 4829 + 4830 + 33 @@ -21079,7 +21580,7 @@ 1 2 - 19911 + 173170 @@ -21095,7 +21596,7 @@ 1 2 - 19911 + 173170 @@ -21105,15 +21606,15 @@ template_template_instantiation - 6346 + 6029 to - 4977 + 4675 from - 1120 + 1107 @@ -21127,12 +21628,12 @@ 1 2 - 3609 + 3322 2 3 - 1368 + 1353 @@ -21148,22 +21649,22 @@ 1 2 - 746 + 738 2 3 - 124 + 123 - 16 - 17 - 124 + 14 + 15 + 123 27 28 - 124 + 123 @@ -21173,19 +21674,19 @@ template_template_argument - 9635 + 9603 type_id - 6090 + 6070 index - 105 + 104 arg_type - 9046 + 9016 @@ -21199,22 +21700,22 @@ 1 2 - 4996 + 4980 2 3 - 420 + 419 3 8 - 504 + 503 8 11 - 168 + 167 @@ -21230,17 +21731,17 @@ 1 2 - 5017 + 5001 2 4 - 557 + 555 4 10 - 462 + 461 10 @@ -21383,7 +21884,7 @@ 1 2 - 9015 + 8985 3 @@ -21404,12 +21905,12 @@ 1 2 - 9025 + 8995 2 11 - 21 + 20 @@ -21419,19 +21920,19 @@ template_template_argument_value - 746 + 1107 type_id - 124 + 123 index - 124 + 123 arg_value - 746 + 1107 @@ -21445,7 +21946,7 @@ 1 2 - 124 + 123 @@ -21459,9 +21960,9 @@ 12 - 6 - 7 - 124 + 9 + 10 + 123 @@ -21477,7 +21978,7 @@ 1 2 - 124 + 123 @@ -21491,9 +21992,9 @@ 12 - 6 - 7 - 124 + 9 + 10 + 123 @@ -21509,7 +22010,7 @@ 1 2 - 746 + 1107 @@ -21525,7 +22026,7 @@ 1 2 - 746 + 1107 @@ -21535,19 +22036,19 @@ concept_templates - 3603 + 3592 concept_id - 3603 + 3592 name - 3603 + 3592 location - 3603 + 3592 @@ -21561,7 +22062,7 @@ 1 2 - 3603 + 3592 @@ -21577,7 +22078,7 @@ 1 2 - 3603 + 3592 @@ -21593,7 +22094,7 @@ 1 2 - 3603 + 3592 @@ -21609,7 +22110,7 @@ 1 2 - 3603 + 3592 @@ -21625,7 +22126,7 @@ 1 2 - 3603 + 3592 @@ -21641,7 +22142,7 @@ 1 2 - 3603 + 3592 @@ -21651,15 +22152,15 @@ concept_instantiation - 90157 + 90089 to - 90157 + 90089 from - 3432 + 3421 @@ -21673,7 +22174,7 @@ 1 2 - 90157 + 90089 @@ -21694,12 +22195,12 @@ 2 3 - 107 + 106 3 4 - 364 + 363 4 @@ -21709,57 +22210,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 +22270,22 @@ is_type_constraint - 36787 + 36672 concept_id - 36787 + 36672 concept_template_argument - 112701 + 112670 concept_id - 76149 + 76125 index @@ -21792,7 +22293,7 @@ arg_type - 21364 + 21490 @@ -21806,17 +22307,17 @@ 1 2 - 46333 + 46316 2 3 - 24603 + 24612 3 7 - 5212 + 5196 @@ -21832,17 +22333,17 @@ 1 2 - 49937 + 49909 2 3 - 22308 + 22324 3 7 - 3904 + 3891 @@ -21876,13 +22377,13 @@ 21 - 1390 - 1391 + 1394 + 1395 21 - 3550 - 3551 + 3560 + 3561 21 @@ -21917,13 +22418,13 @@ 21 - 359 - 360 + 360 + 361 21 - 640 - 641 + 649 + 650 21 @@ -21940,42 +22441,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 +22492,12 @@ 1 2 - 17975 + 18090 2 3 - 3260 + 3271 3 @@ -22011,7 +22512,7 @@ concept_template_argument_value - 105 + 104 concept_id @@ -22019,11 +22520,11 @@ index - 15 + 14 arg_value - 105 + 104 @@ -22053,7 +22554,7 @@ 1 2 - 60 + 59 2 @@ -22116,7 +22617,7 @@ 1 2 - 105 + 104 @@ -22132,7 +22633,7 @@ 1 2 - 105 + 104 @@ -22142,15 +22643,15 @@ routinetypes - 600586 + 594947 id - 600586 + 594947 return_type - 282015 + 279385 @@ -22164,7 +22665,7 @@ 1 2 - 600586 + 594947 @@ -22180,17 +22681,17 @@ 1 2 - 232564 + 230401 2 3 - 34998 + 34667 3 4677 - 14452 + 14316 @@ -22200,11 +22701,11 @@ routinetypeargs - 1178524 + 1178881 routine - 416004 + 416130 index @@ -22212,7 +22713,7 @@ type_id - 112074 + 112108 @@ -22226,32 +22727,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 +22768,27 @@ 1 2 - 88929 + 88956 2 3 - 138704 + 138746 3 4 - 114633 + 114668 4 5 - 40734 + 40746 5 10 - 32892 + 32902 10 @@ -22485,47 +22986,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 +23042,22 @@ 1 2 - 79399 + 79423 2 3 - 17535 + 17540 3 5 - 9475 + 9478 5 17 - 5663 + 5665 @@ -22566,19 +23067,19 @@ ptrtomembers - 9677 + 9645 id - 9677 + 9645 type_id - 7942 + 7915 class_id - 4849 + 4833 @@ -22592,7 +23093,7 @@ 1 2 - 9677 + 9645 @@ -22608,7 +23109,7 @@ 1 2 - 9677 + 9645 @@ -22624,12 +23125,12 @@ 1 2 - 7731 + 7705 2 84 - 210 + 209 @@ -22645,12 +23146,12 @@ 1 2 - 7731 + 7705 2 84 - 210 + 209 @@ -22666,22 +23167,22 @@ 1 2 - 3892 + 3879 2 3 - 515 + 513 8 9 - 399 + 398 10 65 - 42 + 41 @@ -22697,22 +23198,22 @@ 1 2 - 3892 + 3879 2 3 - 515 + 513 8 9 - 399 + 398 10 65 - 42 + 41 @@ -22722,15 +23223,15 @@ specifiers - 7715 + 7628 id - 7715 + 7628 str - 7715 + 7628 @@ -22744,7 +23245,7 @@ 1 2 - 7715 + 7628 @@ -22760,7 +23261,7 @@ 1 2 - 7715 + 7628 @@ -22770,15 +23271,15 @@ typespecifiers - 852347 + 849756 type_id - 844880 + 844650 spec_id - 1617 + 94 @@ -22792,12 +23293,12 @@ 1 2 - 837413 + 839544 2 3 - 7466 + 5105 @@ -22811,69 +23312,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 +23364,15 @@ funspecifiers - 9694786 + 9579810 func_id - 4002636 + 3954724 spec_id - 2364 + 2337 @@ -22905,27 +23386,27 @@ 1 2 - 1526111 + 1507569 2 3 - 506132 + 499939 3 4 - 1034042 + 1021657 4 5 - 691186 + 683402 5 8 - 245163 + 242156 @@ -22941,97 +23422,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 +23522,15 @@ varspecifiers - 3078855 + 3216567 var_id - 2314866 + 2461674 spec_id - 1120 + 1107 @@ -23063,17 +23544,17 @@ 1 2 - 1654293 + 1809034 2 3 - 557653 + 550880 3 5 - 102918 + 101759 @@ -23089,47 +23570,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 +23620,15 @@ explicit_specifier_exprs - 41192 + 40728 func_id - 41192 + 40728 constant - 41192 + 40728 @@ -23161,7 +23642,7 @@ 1 2 - 41192 + 40728 @@ -23177,7 +23658,7 @@ 1 2 - 41192 + 40728 @@ -23187,27 +23668,27 @@ attributes - 652234 + 644888 id - 652234 + 644888 kind - 373 + 369 name - 2115 + 2091 name_space - 248 + 246 location - 646136 + 638859 @@ -23221,7 +23702,7 @@ 1 2 - 652234 + 644888 @@ -23237,7 +23718,7 @@ 1 2 - 652234 + 644888 @@ -23253,7 +23734,7 @@ 1 2 - 652234 + 644888 @@ -23269,7 +23750,7 @@ 1 2 - 652234 + 644888 @@ -23285,17 +23766,17 @@ 7 8 - 124 + 123 2406 2407 - 124 + 123 2828 2829 - 124 + 123 @@ -23311,17 +23792,17 @@ 1 2 - 124 + 123 6 7 - 124 + 123 12 13 - 124 + 123 @@ -23337,12 +23818,12 @@ 1 2 - 248 + 246 2 3 - 124 + 123 @@ -23358,17 +23839,17 @@ 4 5 - 124 + 123 2360 2361 - 124 + 123 2828 2829 - 124 + 123 @@ -23384,72 +23865,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 +23946,12 @@ 1 2 - 1866 + 1845 2 3 - 248 + 246 @@ -23486,7 +23967,7 @@ 1 2 - 2115 + 2091 @@ -23502,77 +23983,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 +24069,12 @@ 11 12 - 124 + 123 5230 5231 - 124 + 123 @@ -23609,12 +24090,12 @@ 1 2 - 124 + 123 3 4 - 124 + 123 @@ -23630,12 +24111,12 @@ 2 3 - 124 + 123 15 16 - 124 + 123 @@ -23651,12 +24132,12 @@ 11 12 - 124 + 123 5181 5182 - 124 + 123 @@ -23672,12 +24153,12 @@ 1 2 - 640287 + 633075 2 5 - 5849 + 5783 @@ -23693,7 +24174,7 @@ 1 2 - 646136 + 638859 @@ -23709,12 +24190,12 @@ 1 2 - 641034 + 633814 2 3 - 5102 + 5044 @@ -23730,7 +24211,7 @@ 1 2 - 646136 + 638859 @@ -23740,11 +24221,11 @@ attribute_args - 82085 + 82133 id - 82085 + 82133 kind @@ -23752,7 +24233,7 @@ attribute - 70847 + 70889 index @@ -23760,7 +24241,7 @@ location - 56854 + 56887 @@ -23774,7 +24255,7 @@ 1 2 - 82085 + 82133 @@ -23790,7 +24271,7 @@ 1 2 - 82085 + 82133 @@ -23806,7 +24287,7 @@ 1 2 - 82085 + 82133 @@ -23822,7 +24303,7 @@ 1 2 - 82085 + 82133 @@ -23942,12 +24423,12 @@ 1 2 - 65410 + 65448 2 7 - 5316 + 5319 7 @@ -23968,12 +24449,12 @@ 1 2 - 69340 + 69380 2 3 - 1507 + 1508 @@ -23989,12 +24470,12 @@ 1 2 - 67821 + 67860 2 8 - 3026 + 3028 @@ -24010,12 +24491,12 @@ 1 2 - 68350 + 68390 2 6 - 2497 + 2498 @@ -24195,17 +24676,17 @@ 1 2 - 41266 + 41291 2 3 - 11789 + 11796 3 25 - 3797 + 3799 @@ -24221,12 +24702,12 @@ 1 2 - 47377 + 47405 2 3 - 9476 + 9482 @@ -24242,17 +24723,17 @@ 1 2 - 42613 + 42638 2 3 - 12227 + 12234 3 11 - 2013 + 2015 @@ -24268,7 +24749,7 @@ 1 2 - 56606 + 56639 2 @@ -24283,15 +24764,15 @@ attribute_arg_value - 16585 + 16428 arg - 16585 + 16428 value - 507 + 502 @@ -24305,7 +24786,7 @@ 1 2 - 16585 + 16428 @@ -24321,7 +24802,7 @@ 1 2 - 203 + 201 5 @@ -24439,15 +24920,15 @@ attribute_arg_constant - 71626 + 71325 arg - 71626 + 71325 constant - 71626 + 71325 @@ -24461,7 +24942,7 @@ 1 2 - 71626 + 71325 @@ -24477,7 +24958,7 @@ 1 2 - 71626 + 71325 @@ -24487,15 +24968,15 @@ attribute_arg_expr - 1587 + 1582 arg - 1587 + 1582 expr - 1587 + 1582 @@ -24509,7 +24990,7 @@ 1 2 - 1587 + 1582 @@ -24525,7 +25006,7 @@ 1 2 - 1587 + 1582 @@ -24588,15 +25069,15 @@ typeattributes - 96074 + 94992 type_id - 94331 + 93269 spec_id - 32356 + 31992 @@ -24610,12 +25091,12 @@ 1 2 - 92589 + 91546 2 3 - 1742 + 1722 @@ -24631,17 +25112,17 @@ 1 2 - 27876 + 27562 2 9 - 2488 + 2460 11 58 - 1991 + 1968 @@ -24651,15 +25132,15 @@ funcattributes - 841520 + 830073 func_id - 797092 + 786146 spec_id - 615273 + 608343 @@ -24673,12 +25154,12 @@ 1 2 - 757144 + 746648 2 7 - 39947 + 39498 @@ -24694,12 +25175,12 @@ 1 2 - 570347 + 563923 2 213 - 44925 + 44419 @@ -24772,15 +25253,15 @@ namespaceattributes - 5957 + 5900 namespace_id - 135 + 134 spec_id - 5957 + 5900 @@ -24820,7 +25301,7 @@ 1 2 - 5957 + 5900 @@ -24830,15 +25311,15 @@ stmtattributes - 2230 + 2223 stmt_id - 2230 + 2223 spec_id - 579 + 577 @@ -24852,7 +25333,7 @@ 1 2 - 2230 + 2223 @@ -24873,7 +25354,7 @@ 2 3 - 150 + 149 3 @@ -24883,7 +25364,7 @@ 9 10 - 107 + 106 13 @@ -24898,15 +25379,15 @@ unspecifiedtype - 7228466 + 7381948 type_id - 7228466 + 7381948 unspecified_type_id - 3955719 + 4143724 @@ -24920,7 +25401,7 @@ 1 2 - 7228466 + 7381948 @@ -24936,22 +25417,22 @@ 1 2 - 2475280 + 2676022 2 3 - 1114436 + 1106067 3 - 7 - 304027 + 8 + 312292 - 7 + 8 892 - 61975 + 49341 @@ -24961,19 +25442,19 @@ member - 4182340 + 4133758 parent - 541973 + 535991 index - 29618 + 29285 child - 4177735 + 4129205 @@ -24987,57 +25468,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 +25534,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 +25600,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 +25666,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 +25732,7 @@ 1 2 - 4177735 + 4129205 @@ -25267,12 +25748,12 @@ 1 2 - 4173131 + 4124652 2 3 - 4604 + 4552 @@ -25282,15 +25763,15 @@ enclosingfunction - 114977 + 114593 child - 114977 + 114593 parent - 69091 + 68861 @@ -25304,7 +25785,7 @@ 1 2 - 114977 + 114593 @@ -25320,22 +25801,22 @@ 1 2 - 37470 + 37345 2 3 - 24478 + 24397 3 5 - 6059 + 6038 5 45 - 1083 + 1079 @@ -25345,27 +25826,27 @@ derivations - 473794 + 491380 derivation - 473794 + 491380 sub - 452200 + 469990 index - 236 + 234 super - 234020 + 238951 location - 35167 + 34835 @@ -25379,7 +25860,7 @@ 1 2 - 473794 + 491380 @@ -25395,7 +25876,7 @@ 1 2 - 473794 + 491380 @@ -25411,7 +25892,7 @@ 1 2 - 473794 + 491380 @@ -25427,7 +25908,7 @@ 1 2 - 473794 + 491380 @@ -25443,12 +25924,12 @@ 1 2 - 435784 + 453729 2 9 - 16415 + 16260 @@ -25464,12 +25945,12 @@ 1 2 - 435784 + 453729 2 8 - 16415 + 16260 @@ -25485,12 +25966,12 @@ 1 2 - 435784 + 453729 2 9 - 16415 + 16260 @@ -25506,12 +25987,12 @@ 1 2 - 435784 + 453729 2 8 - 16415 + 16260 @@ -25527,7 +26008,7 @@ 25 26 - 101 + 100 26 @@ -25545,8 +26026,8 @@ 33 - 13360 - 13361 + 14018 + 14019 33 @@ -25563,7 +26044,7 @@ 25 26 - 135 + 134 52 @@ -25576,8 +26057,8 @@ 33 - 13360 - 13361 + 14018 + 14019 33 @@ -25617,8 +26098,8 @@ 33 - 6510 - 6511 + 6723 + 6724 33 @@ -25635,7 +26116,7 @@ 1 2 - 135 + 134 7 @@ -25666,12 +26147,12 @@ 1 2 - 224272 + 229194 2 - 1655 - 9748 + 1758 + 9756 @@ -25687,12 +26168,12 @@ 1 2 - 224272 + 229194 2 - 1655 - 9748 + 1758 + 9756 @@ -25708,12 +26189,12 @@ 1 2 - 233580 + 238515 2 4 - 440 + 435 @@ -25729,12 +26210,12 @@ 1 2 - 228706 + 233586 2 81 - 5314 + 5364 @@ -25750,27 +26231,27 @@ 1 2 - 26333 + 25849 2 5 - 3113 + 3185 5 22 - 2741 + 2782 22 - 383 - 2673 + 371 + 2615 - 388 - 928 - 304 + 379 + 985 + 402 @@ -25786,27 +26267,27 @@ 1 2 - 26333 + 25849 2 5 - 3113 + 3185 5 22 - 2741 + 2782 22 - 383 - 2673 + 371 + 2615 - 388 - 928 - 304 + 379 + 985 + 402 @@ -25822,7 +26303,7 @@ 1 2 - 35167 + 34835 @@ -25838,22 +26319,22 @@ 1 2 - 28533 + 28163 2 4 - 2606 + 2548 4 - 26 - 2809 + 24 + 2615 - 26 - 928 - 1218 + 24 + 933 + 1508 @@ -25863,15 +26344,15 @@ derspecifiers - 475554 + 493124 der_id - 473354 + 490944 spec_id - 135 + 134 @@ -25885,12 +26366,12 @@ 1 2 - 471154 + 488765 2 3 - 2200 + 2179 @@ -25919,8 +26400,8 @@ 33 - 12789 - 12790 + 13447 + 13448 33 @@ -25931,15 +26412,15 @@ direct_base_offsets - 447055 + 464893 der_id - 447055 + 464893 offset - 507 + 502 @@ -25953,7 +26434,7 @@ 1 2 - 447055 + 464893 @@ -25969,17 +26450,17 @@ 1 2 - 101 + 100 2 3 - 135 + 134 3 4 - 101 + 100 4 @@ -26002,8 +26483,8 @@ 33 - 13058 - 13059 + 13716 + 13717 33 @@ -26014,19 +26495,19 @@ virtual_base_offsets - 5787 + 5733 sub - 5787 + 5733 super - 101 + 100 offset - 338 + 335 @@ -26040,7 +26521,7 @@ 1 2 - 5787 + 5733 @@ -26056,7 +26537,7 @@ 1 2 - 5787 + 5733 @@ -26114,7 +26595,7 @@ 2 3 - 304 + 301 153 @@ -26140,7 +26621,7 @@ 2 3 - 304 + 301 @@ -26150,23 +26631,23 @@ frienddecls - 767534 + 760573 id - 767534 + 760573 type_id - 54340 + 53845 decl_id - 100695 + 99677 location - 6056 + 6001 @@ -26180,7 +26661,7 @@ 1 2 - 767534 + 760573 @@ -26196,7 +26677,7 @@ 1 2 - 767534 + 760573 @@ -26212,7 +26693,7 @@ 1 2 - 767534 + 760573 @@ -26228,42 +26709,42 @@ 1 2 - 5582 + 5532 2 3 - 25004 + 24743 3 8 - 4770 + 4760 8 17 - 4737 + 4693 17 27 - 4466 + 4425 27 45 - 4297 + 4258 45 81 - 4737 + 4693 102 121 - 744 + 737 @@ -26279,42 +26760,42 @@ 1 2 - 5582 + 5532 2 3 - 25004 + 24743 3 8 - 4770 + 4760 8 17 - 4737 + 4693 17 27 - 4466 + 4425 27 45 - 4297 + 4258 45 81 - 4737 + 4693 102 121 - 744 + 737 @@ -26330,12 +26811,12 @@ 1 2 - 52987 + 52504 2 13 - 1353 + 1341 @@ -26351,32 +26832,32 @@ 1 2 - 67502 + 66652 2 3 - 8120 + 8180 3 9 - 9203 + 9119 9 24 - 7613 + 7543 24 - 136 - 7646 + 127 + 7476 - 136 + 135 191 - 609 + 704 @@ -26392,32 +26873,32 @@ 1 2 - 67502 + 66652 2 3 - 8120 + 8180 3 9 - 9203 + 9119 9 24 - 7613 + 7543 24 - 136 - 7646 + 127 + 7476 - 136 + 135 191 - 609 + 704 @@ -26433,12 +26914,12 @@ 1 2 - 99477 + 98470 2 6 - 1218 + 1206 @@ -26454,12 +26935,12 @@ 1 2 - 5684 + 5632 2 - 22495 - 372 + 22496 + 368 @@ -26475,12 +26956,12 @@ 1 2 - 5921 + 5867 2 1509 - 135 + 134 @@ -26496,12 +26977,12 @@ 1 2 - 5718 + 5666 2 - 2844 - 338 + 2841 + 335 @@ -26511,19 +26992,19 @@ comments - 11208578 + 11082335 id - 11208578 + 11082335 contents - 4294966 + 4246592 location - 11208578 + 11082335 @@ -26537,7 +27018,7 @@ 1 2 - 11208578 + 11082335 @@ -26553,7 +27034,7 @@ 1 2 - 11208578 + 11082335 @@ -26569,17 +27050,17 @@ 1 2 - 3920500 + 3876344 2 6 - 322819 + 319183 6 34447 - 51646 + 51064 @@ -26595,17 +27076,17 @@ 1 2 - 3920500 + 3876344 2 6 - 322819 + 319183 6 34447 - 51646 + 51064 @@ -26621,7 +27102,7 @@ 1 2 - 11208578 + 11082335 @@ -26637,7 +27118,7 @@ 1 2 - 11208578 + 11082335 @@ -26647,15 +27128,15 @@ commentbinding - 3905318 + 3861332 id - 3342686 + 3305037 element - 3740175 + 3698049 @@ -26669,12 +27150,12 @@ 1 2 - 3281209 + 3244252 2 1706 - 61477 + 60785 @@ -26690,12 +27171,12 @@ 1 2 - 3575031 + 3534766 2 3 - 165143 + 163283 @@ -26705,15 +27186,15 @@ exprconv - 9634075 + 9637003 converted - 9633970 + 9636898 conversion - 9634075 + 9637003 @@ -26727,7 +27208,7 @@ 1 2 - 9633864 + 9636792 2 @@ -26748,7 +27229,7 @@ 1 2 - 9634075 + 9637003 @@ -26758,30 +27239,30 @@ compgenerated - 9923218 + 9885829 id - 9923218 + 9885829 synthetic_destructor_call - 1666585 + 1661380 element - 1241154 + 1237278 i - 386 + 384 destructor_call - 1666585 + 1661380 @@ -26795,17 +27276,17 @@ 1 2 - 826149 + 823569 2 3 - 408226 + 406951 3 19 - 6778 + 6757 @@ -26821,17 +27302,17 @@ 1 2 - 826149 + 823569 2 3 - 408226 + 406951 3 19 - 6778 + 6757 @@ -26979,7 +27460,7 @@ 1 2 - 1666585 + 1661380 @@ -26995,7 +27476,7 @@ 1 2 - 1666585 + 1661380 @@ -27005,15 +27486,15 @@ namespaces - 8615 + 8586 id - 8615 + 8586 name - 4554 + 4539 @@ -27027,7 +27508,7 @@ 1 2 - 8615 + 8586 @@ -27043,17 +27524,17 @@ 1 2 - 3723 + 3711 2 3 - 525 + 524 3 149 - 305 + 304 @@ -27063,26 +27544,26 @@ namespace_inline - 497 + 492 id - 497 + 492 namespacembrs - 2110397 + 2483823 parentid - 3982 + 3937 memberid - 2110397 + 2483823 @@ -27096,67 +27577,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 +27653,7 @@ 1 2 - 2110397 + 2483823 @@ -27182,19 +27663,19 @@ exprparents - 19456298 + 19462196 expr_id - 19456298 + 19462196 child_index - 20037 + 20043 parent_id - 12941382 + 12945305 @@ -27208,7 +27689,7 @@ 1 2 - 19456298 + 19462196 @@ -27224,7 +27705,7 @@ 1 2 - 19456298 + 19462196 @@ -27240,12 +27721,12 @@ 1 2 - 3855 + 3856 2 3 - 1519 + 1520 3 @@ -27255,7 +27736,7 @@ 4 5 - 8977 + 8980 5 @@ -27270,7 +27751,7 @@ 11 53 - 1519 + 1520 56 @@ -27291,12 +27772,12 @@ 1 2 - 3855 + 3856 2 3 - 1519 + 1520 3 @@ -27306,7 +27787,7 @@ 4 5 - 8977 + 8980 5 @@ -27321,7 +27802,7 @@ 11 53 - 1519 + 1520 56 @@ -27342,17 +27823,17 @@ 1 2 - 7395566 + 7397807 2 3 - 5083216 + 5084757 3 712 - 462599 + 462739 @@ -27368,17 +27849,17 @@ 1 2 - 7395566 + 7397807 2 3 - 5083216 + 5084757 3 712 - 462599 + 462739 @@ -27388,22 +27869,22 @@ expr_isload - 6897613 + 6919046 expr_id - 6897613 + 6919046 conversionkinds - 6051176 + 6052845 expr_id - 6051176 + 6052845 kind @@ -27421,7 +27902,7 @@ 1 2 - 6051176 + 6052845 @@ -27445,28 +27926,28 @@ 1 - 7371 - 7372 + 7370 + 7371 1 - 40984 - 40985 + 40990 + 40991 1 - 71408 - 71409 + 71404 + 71405 1 - 93454 - 93455 + 93465 + 93466 1 - 5832066 - 5832067 + 5833723 + 5833724 1 @@ -27477,11 +27958,11 @@ iscall - 5790597 + 5772683 caller - 5790597 + 5772683 kind @@ -27499,7 +27980,7 @@ 1 2 - 5790597 + 5772683 @@ -27518,13 +27999,13 @@ 21 - 1409 - 1410 + 1484 + 1485 21 - 268311 - 268312 + 268244 + 268245 21 @@ -27535,15 +28016,15 @@ numtemplatearguments - 640909 + 730405 expr_id - 640909 + 730405 num - 995 + 984 @@ -27557,7 +28038,7 @@ 1 2 - 640909 + 730405 @@ -27573,37 +28054,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 +28099,15 @@ specialnamequalifyingelements - 124 + 123 id - 124 + 123 name - 124 + 123 @@ -27635,7 +28121,7 @@ 1 2 - 124 + 123 @@ -27651,7 +28137,7 @@ 1 2 - 124 + 123 @@ -27661,23 +28147,23 @@ namequalifiers - 3042471 + 3051466 id - 3042471 + 3051466 qualifiableelement - 3042471 + 3051466 qualifyingelement - 47727 + 54656 location - 554584 + 558946 @@ -27691,7 +28177,7 @@ 1 2 - 3042471 + 3051466 @@ -27707,7 +28193,7 @@ 1 2 - 3042471 + 3051466 @@ -27723,7 +28209,7 @@ 1 2 - 3042471 + 3051466 @@ -27739,7 +28225,7 @@ 1 2 - 3042471 + 3051466 @@ -27755,7 +28241,7 @@ 1 2 - 3042471 + 3051466 @@ -27771,7 +28257,7 @@ 1 2 - 3042471 + 3051466 @@ -27787,27 +28273,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 +28309,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 +28345,22 @@ 1 2 - 34664 + 41441 2 3 - 7336 + 7420 3 - 6 - 3582 + 7 + 4148 - 6 - 20057 - 2145 + 7 + 20059 + 1646 @@ -27890,22 +28376,22 @@ 1 2 - 79410 + 83267 2 6 - 41013 + 42275 6 7 - 397780 + 396709 7 192 - 36380 + 36694 @@ -27921,22 +28407,22 @@ 1 2 - 79410 + 83267 2 6 - 41013 + 42275 6 7 - 397780 + 396709 7 192 - 36380 + 36694 @@ -27952,22 +28438,22 @@ 1 2 - 114953 + 119491 2 4 - 13320 + 14070 4 5 - 414040 + 412918 5 - 33 - 12269 + 60 + 12466 @@ -27977,15 +28463,15 @@ varbind - 8255503 + 8258005 expr - 8255503 + 8258005 var - 1050487 + 1050805 @@ -27999,7 +28485,7 @@ 1 2 - 8255503 + 8258005 @@ -28015,52 +28501,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 +28556,15 @@ funbind - 5805870 + 5787737 expr - 5803403 + 5785278 fun - 275275 + 274929 @@ -28092,12 +28578,12 @@ 1 2 - 5800937 + 5782819 2 3 - 2466 + 2459 @@ -28113,27 +28599,27 @@ 1 2 - 181064 + 180670 2 3 - 38310 + 38212 3 4 - 16903 + 16743 4 8 - 22930 + 23308 8 37798 - 16066 + 15994 @@ -28143,19 +28629,19 @@ expr_allocator - 44949 + 44755 expr - 44949 + 44755 func - 101 + 64 form - 33 + 21 @@ -28169,7 +28655,7 @@ 1 2 - 44949 + 44755 @@ -28185,7 +28671,7 @@ 1 2 - 44949 + 44755 @@ -28199,19 +28685,19 @@ 12 - 1 - 2 - 33 + 2 + 3 + 21 - 591 - 592 - 33 + 369 + 370 + 21 - 736 - 737 - 33 + 1722 + 1723 + 21 @@ -28227,7 +28713,7 @@ 1 2 - 101 + 64 @@ -28241,9 +28727,9 @@ 12 - 1328 - 1329 - 33 + 2093 + 2094 + 21 @@ -28259,7 +28745,7 @@ 3 4 - 33 + 21 @@ -28269,15 +28755,15 @@ expr_deallocator - 53478 + 52973 expr - 53478 + 52973 func - 101 + 100 form @@ -28295,7 +28781,7 @@ 1 2 - 53478 + 52973 @@ -28311,7 +28797,7 @@ 1 2 - 53478 + 52973 @@ -28353,7 +28839,7 @@ 1 2 - 101 + 100 @@ -28416,15 +28902,15 @@ expr_cond_guard - 897972 + 898245 cond - 897972 + 898245 guard - 897972 + 898245 @@ -28438,7 +28924,7 @@ 1 2 - 897972 + 898245 @@ -28454,7 +28940,7 @@ 1 2 - 897972 + 898245 @@ -28464,15 +28950,15 @@ expr_cond_true - 897968 + 898241 cond - 897968 + 898241 true - 897968 + 898241 @@ -28486,7 +28972,7 @@ 1 2 - 897968 + 898241 @@ -28502,7 +28988,7 @@ 1 2 - 897968 + 898241 @@ -28512,15 +28998,15 @@ expr_cond_false - 897972 + 898245 cond - 897972 + 898245 false - 897972 + 898245 @@ -28534,7 +29020,7 @@ 1 2 - 897972 + 898245 @@ -28550,7 +29036,7 @@ 1 2 - 897972 + 898245 @@ -28560,15 +29046,15 @@ values - 13541565 + 13547188 id - 13541565 + 13547188 str - 113909 + 113976 @@ -28582,7 +29068,7 @@ 1 2 - 13541565 + 13547188 @@ -28598,12 +29084,12 @@ 1 2 - 77855 + 77901 2 3 - 15207 + 15222 3 @@ -28613,12 +29099,12 @@ 6 52 - 8579 + 8584 52 - 682255 - 3429 + 682207 + 3431 @@ -28628,15 +29114,15 @@ valuetext - 6637657 + 6648792 id - 6637657 + 6648792 text - 1095316 + 1095328 @@ -28650,7 +29136,7 @@ 1 2 - 6637657 + 6648792 @@ -28666,22 +29152,22 @@ 1 2 - 833959 + 833960 2 3 - 146911 + 146908 3 7 - 86574 + 86573 7 - 593719 - 27872 + 593781 + 27887 @@ -28691,15 +29177,15 @@ valuebind - 13649715 + 13655401 val - 13541565 + 13547188 expr - 13649715 + 13655401 @@ -28713,12 +29199,12 @@ 1 2 - 13451407 + 13456978 2 6 - 90157 + 90210 @@ -28734,7 +29220,7 @@ 1 2 - 13649715 + 13655401 @@ -28744,15 +29230,15 @@ fieldoffsets - 1502766 + 1503222 id - 1502766 + 1503222 byteoffset - 31367 + 31377 bitoffset @@ -28770,7 +29256,7 @@ 1 2 - 1502766 + 1503222 @@ -28786,7 +29272,7 @@ 1 2 - 1502766 + 1503222 @@ -28802,22 +29288,22 @@ 1 2 - 17698 + 17704 2 3 - 2450 + 2451 3 5 - 2668 + 2669 5 12 - 2613 + 2614 12 @@ -28848,12 +29334,12 @@ 1 2 - 30333 + 30342 2 9 - 1034 + 1035 @@ -28950,19 +29436,19 @@ bitfield - 30240 + 29900 id - 30240 + 29900 bits - 3484 + 3445 declared_bits - 3484 + 3445 @@ -28976,7 +29462,7 @@ 1 2 - 30240 + 29900 @@ -28992,7 +29478,7 @@ 1 2 - 30240 + 29900 @@ -29008,42 +29494,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 +29545,7 @@ 1 2 - 3484 + 3445 @@ -29075,42 +29561,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 +29612,7 @@ 1 2 - 3484 + 3445 @@ -29136,23 +29622,23 @@ initialisers - 2245206 + 2245055 init - 2245206 + 2245055 var - 979091 + 979258 expr - 2245206 + 2245055 location - 515984 + 515871 @@ -29166,7 +29652,7 @@ 1 2 - 2245206 + 2245055 @@ -29182,7 +29668,7 @@ 1 2 - 2245206 + 2245055 @@ -29198,7 +29684,7 @@ 1 2 - 2245206 + 2245055 @@ -29214,17 +29700,17 @@ 1 2 - 869052 + 869246 2 15 - 37306 + 37296 16 25 - 72733 + 72715 @@ -29240,17 +29726,17 @@ 1 2 - 869052 + 869246 2 15 - 37306 + 37296 16 25 - 72733 + 72715 @@ -29266,7 +29752,7 @@ 1 2 - 979083 + 979250 2 @@ -29287,7 +29773,7 @@ 1 2 - 2245206 + 2245055 @@ -29303,7 +29789,7 @@ 1 2 - 2245206 + 2245055 @@ -29319,7 +29805,7 @@ 1 2 - 2245206 + 2245055 @@ -29335,22 +29821,22 @@ 1 2 - 414456 + 414351 2 3 - 33500 + 33491 3 13 - 41937 + 41935 13 111939 - 26090 + 26092 @@ -29366,17 +29852,17 @@ 1 2 - 443688 + 443577 2 3 - 34407 + 34398 3 12248 - 37889 + 37895 @@ -29392,22 +29878,22 @@ 1 2 - 414456 + 414351 2 3 - 33500 + 33491 3 13 - 41937 + 41935 13 111939 - 26090 + 26092 @@ -29417,26 +29903,26 @@ braced_initialisers - 67650 + 67172 init - 67650 + 67172 expr_ancestor - 1672548 + 1667324 exp - 1672548 + 1667324 ancestor - 837089 + 834475 @@ -29450,7 +29936,7 @@ 1 2 - 1672548 + 1667324 @@ -29466,17 +29952,17 @@ 1 2 - 17031 + 16978 2 3 - 810018 + 807488 3 19 - 10038 + 10007 @@ -29486,19 +29972,19 @@ exprs - 25213265 + 25220908 id - 25213265 + 25220908 kind - 1450 + 1451 location - 10586812 + 10590021 @@ -29512,7 +29998,7 @@ 1 2 - 25213265 + 25220908 @@ -29528,7 +30014,7 @@ 1 2 - 25213265 + 25220908 @@ -29706,22 +30192,22 @@ 1 2 - 8904645 + 8907344 2 3 - 820704 + 820953 3 16 - 797292 + 797534 16 71733 - 64169 + 64188 @@ -29737,17 +30223,17 @@ 1 2 - 9044064 + 9046805 2 3 - 774363 + 774598 3 32 - 768384 + 768617 @@ -29757,15 +30243,15 @@ expr_reuse - 844446 + 841809 reuse - 844446 + 841809 original - 844446 + 841809 value_category @@ -29783,7 +30269,7 @@ 1 2 - 844446 + 841809 @@ -29799,7 +30285,7 @@ 1 2 - 844446 + 841809 @@ -29815,7 +30301,7 @@ 1 2 - 844446 + 841809 @@ -29831,7 +30317,7 @@ 1 2 - 844446 + 841809 @@ -29883,15 +30369,15 @@ expr_types - 25213265 + 25220908 id - 25213265 + 25220908 typeid - 214227 + 214292 value_category @@ -29909,7 +30395,7 @@ 1 2 - 25213265 + 25220908 @@ -29925,7 +30411,7 @@ 1 2 - 25213265 + 25220908 @@ -29941,52 +30427,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 +30488,12 @@ 1 2 - 185935 + 185991 2 3 - 28292 + 28301 @@ -30070,15 +30556,15 @@ new_allocated_type - 45896 + 45504 expr - 45896 + 45504 type_id - 27213 + 38362 @@ -30092,7 +30578,7 @@ 1 2 - 45896 + 45504 @@ -30108,17 +30594,12 @@ 1 2 - 11440 + 36886 2 - 3 - 14385 - - - 3 19 - 1387 + 1475 @@ -30128,15 +30609,15 @@ new_array_allocated_type - 6632 + 6630 expr - 6632 + 6630 type_id - 2834 + 2833 @@ -30150,7 +30631,7 @@ 1 2 - 6632 + 6630 @@ -30171,7 +30652,7 @@ 2 3 - 2502 + 2501 3 @@ -30191,11 +30672,11 @@ param_ref_to_this - 24951 + 24978 expr - 24951 + 24978 @@ -31538,15 +32019,15 @@ condition_decl_bind - 407669 + 406396 expr - 407669 + 406396 decl - 407669 + 406396 @@ -31560,7 +32041,7 @@ 1 2 - 407669 + 406396 @@ -31576,7 +32057,7 @@ 1 2 - 407669 + 406396 @@ -31586,15 +32067,15 @@ typeid_bind - 47589 + 47139 expr - 47589 + 47139 type_id - 15840 + 15690 @@ -31608,7 +32089,7 @@ 1 2 - 47589 + 47139 @@ -31624,17 +32105,17 @@ 1 2 - 2944 + 2916 2 3 - 12489 + 12371 3 328 - 406 + 402 @@ -31644,15 +32125,15 @@ uuidof_bind - 26787 + 26780 expr - 26787 + 26780 type_id - 26536 + 26529 @@ -31666,7 +32147,7 @@ 1 2 - 26787 + 26780 @@ -31682,7 +32163,7 @@ 1 2 - 26325 + 26318 2 @@ -31697,15 +32178,15 @@ sizeof_bind - 241830 + 241971 expr - 241830 + 241971 type_id - 11145 + 11151 @@ -31719,7 +32200,7 @@ 1 2 - 241830 + 241971 @@ -31735,27 +32216,27 @@ 1 2 - 3855 + 3857 2 3 - 2750 + 2751 3 4 - 1018 + 1019 4 5 - 1104 + 1105 5 6 - 281 + 282 6 @@ -31765,7 +32246,7 @@ 7 42 - 851 + 852 42 @@ -31828,11 +32309,11 @@ lambdas - 18997 + 18992 expr - 18997 + 18992 default_capture @@ -31858,7 +32339,7 @@ 1 2 - 18997 + 18992 @@ -31874,7 +32355,7 @@ 1 2 - 18997 + 18992 @@ -31890,7 +32371,7 @@ 1 2 - 18997 + 18992 @@ -32074,15 +32555,15 @@ lambda_capture - 31864 + 31856 id - 31864 + 31856 lambda - 15442 + 15438 index @@ -32090,7 +32571,7 @@ field - 31864 + 31856 captured_by_reference @@ -32102,7 +32583,7 @@ location - 17887 + 17883 @@ -32116,7 +32597,7 @@ 1 2 - 31864 + 31856 @@ -32132,7 +32613,7 @@ 1 2 - 31864 + 31856 @@ -32148,7 +32629,7 @@ 1 2 - 31864 + 31856 @@ -32164,7 +32645,7 @@ 1 2 - 31864 + 31856 @@ -32180,7 +32661,7 @@ 1 2 - 31864 + 31856 @@ -32196,7 +32677,7 @@ 1 2 - 31864 + 31856 @@ -32212,12 +32693,12 @@ 1 2 - 8186 + 8184 2 3 - 3530 + 3529 3 @@ -32227,7 +32708,7 @@ 4 6 - 1255 + 1254 6 @@ -32248,12 +32729,12 @@ 1 2 - 8186 + 8184 2 3 - 3530 + 3529 3 @@ -32263,7 +32744,7 @@ 4 6 - 1255 + 1254 6 @@ -32284,12 +32765,12 @@ 1 2 - 8186 + 8184 2 3 - 3530 + 3529 3 @@ -32299,7 +32780,7 @@ 4 6 - 1255 + 1254 6 @@ -32320,7 +32801,7 @@ 1 2 - 14203 + 14199 2 @@ -32341,7 +32822,7 @@ 1 2 - 15320 + 15316 2 @@ -32362,12 +32843,12 @@ 1 2 - 8777 + 8775 2 3 - 3684 + 3683 3 @@ -32824,7 +33305,7 @@ 1 2 - 31864 + 31856 @@ -32840,7 +33321,7 @@ 1 2 - 31864 + 31856 @@ -32856,7 +33337,7 @@ 1 2 - 31864 + 31856 @@ -32872,7 +33353,7 @@ 1 2 - 31864 + 31856 @@ -32888,7 +33369,7 @@ 1 2 - 31864 + 31856 @@ -32904,7 +33385,7 @@ 1 2 - 31864 + 31856 @@ -33162,12 +33643,12 @@ 1 2 - 15644 + 15640 2 6 - 1433 + 1432 6 @@ -33188,7 +33669,7 @@ 1 2 - 16219 + 16215 2 @@ -33214,7 +33695,7 @@ 1 2 - 17199 + 17195 2 @@ -33235,12 +33716,12 @@ 1 2 - 15644 + 15640 2 6 - 1433 + 1432 6 @@ -33261,7 +33742,7 @@ 1 2 - 17863 + 17859 2 @@ -33282,7 +33763,7 @@ 1 2 - 17887 + 17883 @@ -33292,11 +33773,11 @@ fold - 1244 + 1261 expr - 1244 + 1261 operator @@ -33318,7 +33799,7 @@ 1 2 - 1244 + 1261 @@ -33334,7 +33815,7 @@ 1 2 - 1244 + 1261 @@ -33358,8 +33839,8 @@ 21 - 54 - 55 + 55 + 56 21 @@ -33390,8 +33871,8 @@ 12 - 58 - 59 + 59 + 60 21 @@ -33418,11 +33899,11 @@ stmts - 6349367 + 6347771 id - 6349367 + 6347771 kind @@ -33430,7 +33911,7 @@ location - 2676092 + 2675420 @@ -33444,7 +33925,7 @@ 1 2 - 6349367 + 6347771 @@ -33460,7 +33941,7 @@ 1 2 - 6349367 + 6347771 @@ -33698,22 +34179,22 @@ 1 2 - 2218046 + 2217489 2 3 - 181655 + 181609 3 10 - 201535 + 201484 10 1789 - 74855 + 74836 @@ -33729,12 +34210,12 @@ 1 2 - 2593391 + 2592739 2 10 - 82701 + 82680 @@ -33899,15 +34380,15 @@ if_then - 990319 + 990619 if_stmt - 990319 + 990619 then_id - 990319 + 990619 @@ -33921,7 +34402,7 @@ 1 2 - 990319 + 990619 @@ -33937,7 +34418,7 @@ 1 2 - 990319 + 990619 @@ -33947,15 +34428,15 @@ if_else - 435769 + 434387 if_stmt - 435769 + 434387 else_id - 435769 + 434387 @@ -33969,7 +34450,7 @@ 1 2 - 435769 + 434387 @@ -33985,7 +34466,7 @@ 1 2 - 435769 + 434387 @@ -34043,15 +34524,15 @@ constexpr_if_then - 105781 + 103482 constexpr_if_stmt - 105781 + 103482 then_id - 105781 + 103482 @@ -34065,7 +34546,7 @@ 1 2 - 105781 + 103482 @@ -34081,7 +34562,7 @@ 1 2 - 105781 + 103482 @@ -34091,15 +34572,15 @@ constexpr_if_else - 75913 + 74197 constexpr_if_stmt - 75913 + 74197 else_id - 75913 + 74197 @@ -34113,7 +34594,7 @@ 1 2 - 75913 + 74197 @@ -34129,7 +34610,7 @@ 1 2 - 75913 + 74197 @@ -34235,15 +34716,15 @@ while_body - 39652 + 39664 while_stmt - 39652 + 39664 body_id - 39652 + 39664 @@ -34257,7 +34738,7 @@ 1 2 - 39652 + 39664 @@ -34273,7 +34754,7 @@ 1 2 - 39652 + 39664 @@ -34283,15 +34764,15 @@ do_body - 232290 + 232426 do_stmt - 232290 + 232426 body_id - 232290 + 232426 @@ -34305,7 +34786,7 @@ 1 2 - 232290 + 232426 @@ -34321,7 +34802,7 @@ 1 2 - 232290 + 232426 @@ -34379,19 +34860,19 @@ switch_case - 833592 + 830946 switch_stmt - 410607 + 409304 index - 386 + 384 case_id - 833592 + 830946 @@ -34410,12 +34891,12 @@ 2 3 - 407733 + 406438 3 19 - 2852 + 2844 @@ -34436,12 +34917,12 @@ 2 3 - 407733 + 406438 3 19 - 2852 + 2844 @@ -34457,7 +34938,7 @@ 5 6 - 150 + 149 10 @@ -34505,13 +34986,13 @@ 21 - 19141 - 19142 + 19140 + 19141 21 - 19142 - 19143 + 19141 + 19142 21 @@ -34528,7 +35009,7 @@ 5 6 - 150 + 149 10 @@ -34576,13 +35057,13 @@ 21 - 19141 - 19142 + 19140 + 19141 21 - 19142 - 19143 + 19141 + 19142 21 @@ -34599,7 +35080,7 @@ 1 2 - 833592 + 830946 @@ -34615,7 +35096,7 @@ 1 2 - 833592 + 830946 @@ -34625,15 +35106,15 @@ switch_body - 410607 + 409304 switch_stmt - 410607 + 409304 body_id - 410607 + 409304 @@ -34647,7 +35128,7 @@ 1 2 - 410607 + 409304 @@ -34663,7 +35144,7 @@ 1 2 - 410607 + 409304 @@ -34673,15 +35154,15 @@ for_initialization - 73253 + 73276 for_stmt - 73253 + 73276 init_id - 73253 + 73276 @@ -34695,7 +35176,7 @@ 1 2 - 73253 + 73276 @@ -34711,7 +35192,7 @@ 1 2 - 73253 + 73276 @@ -34721,15 +35202,15 @@ for_condition - 76349 + 76372 for_stmt - 76349 + 76372 condition_id - 76349 + 76372 @@ -34743,7 +35224,7 @@ 1 2 - 76349 + 76372 @@ -34759,7 +35240,7 @@ 1 2 - 76349 + 76372 @@ -34769,15 +35250,15 @@ for_update - 73394 + 73416 for_stmt - 73394 + 73416 update_id - 73394 + 73416 @@ -34791,7 +35272,7 @@ 1 2 - 73394 + 73416 @@ -34807,7 +35288,7 @@ 1 2 - 73394 + 73416 @@ -34817,15 +35298,15 @@ for_body - 84398 + 84423 for_stmt - 84398 + 84423 body_id - 84398 + 84423 @@ -34839,7 +35320,7 @@ 1 2 - 84398 + 84423 @@ -34855,7 +35336,7 @@ 1 2 - 84398 + 84423 @@ -34865,19 +35346,19 @@ stmtparents - 5610809 + 5609399 id - 5610809 + 5609399 index - 15725 + 15721 parent - 2374243 + 2373646 @@ -34891,7 +35372,7 @@ 1 2 - 5610809 + 5609399 @@ -34907,7 +35388,7 @@ 1 2 - 5610809 + 5609399 @@ -34923,7 +35404,7 @@ 1 2 - 5166 + 5165 2 @@ -34938,7 +35419,7 @@ 4 5 - 2000 + 1999 7 @@ -34958,7 +35439,7 @@ 29 39 - 1182 + 1181 42 @@ -34984,7 +35465,7 @@ 1 2 - 5166 + 5165 2 @@ -34999,7 +35480,7 @@ 4 5 - 2000 + 1999 7 @@ -35019,7 +35500,7 @@ 29 39 - 1182 + 1181 42 @@ -35045,32 +35526,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 +35567,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 +35602,22 @@ ishandler - 43224 + 43026 block - 43224 + 43026 stmt_decl_bind - 723577 + 723395 stmt - 713042 + 712863 num @@ -35144,7 +35625,7 @@ decl - 723577 + 723395 @@ -35158,12 +35639,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35179,12 +35660,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35312,7 +35793,7 @@ 1 2 - 723577 + 723395 @@ -35328,7 +35809,7 @@ 1 2 - 723577 + 723395 @@ -35338,11 +35819,11 @@ stmt_decl_entry_bind - 723577 + 723395 stmt - 713042 + 712863 num @@ -35350,7 +35831,7 @@ decl_entry - 723577 + 723395 @@ -35364,12 +35845,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35385,12 +35866,12 @@ 1 2 - 705600 + 705423 2 10 - 7441 + 7439 @@ -35518,7 +35999,7 @@ 1 2 - 723577 + 723395 @@ -35534,7 +36015,7 @@ 1 2 - 723577 + 723395 @@ -35544,15 +36025,15 @@ blockscope - 1640355 + 1618065 block - 1640355 + 1618065 enclosing - 1423690 + 1404210 @@ -35566,7 +36047,7 @@ 1 2 - 1640355 + 1618065 @@ -35582,17 +36063,17 @@ 1 2 - 1291402 + 1273657 2 4 - 116981 + 115417 4 29 - 15307 + 15134 @@ -35602,19 +36083,19 @@ jumpinfo - 348211 + 348317 id - 348211 + 348317 str - 28939 + 28948 target - 72683 + 72705 @@ -35628,7 +36109,7 @@ 1 2 - 348211 + 348317 @@ -35644,7 +36125,7 @@ 1 2 - 348211 + 348317 @@ -35660,17 +36141,17 @@ 2 3 - 13592 + 13596 3 4 - 6056 + 6058 4 5 - 2013 + 2014 5 @@ -35685,7 +36166,7 @@ 10 25 - 2188 + 2189 25 @@ -35706,17 +36187,17 @@ 1 2 - 23183 + 23190 2 3 - 3625 + 3626 3 3321 - 2130 + 2131 @@ -35737,27 +36218,27 @@ 2 3 - 36199 + 36210 3 4 - 17627 + 17633 4 5 - 7376 + 7379 5 8 - 6416 + 6418 8 2124 - 5029 + 5030 @@ -35773,7 +36254,7 @@ 1 2 - 72683 + 72705 @@ -35783,19 +36264,19 @@ preprocdirects - 5395215 + 5334449 id - 5395215 + 5334449 kind - 1368 + 1353 location - 5392104 + 5331372 @@ -35809,7 +36290,7 @@ 1 2 - 5395215 + 5334449 @@ -35825,7 +36306,7 @@ 1 2 - 5395215 + 5334449 @@ -35841,57 +36322,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 +36388,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 +36454,12 @@ 1 2 - 5391979 + 5331249 26 27 - 124 + 123 @@ -35994,7 +36475,7 @@ 1 2 - 5392104 + 5331372 @@ -36004,15 +36485,15 @@ preprocpair - 1138454 + 1125632 begin - 886819 + 876831 elseelifend - 1138454 + 1125632 @@ -36026,17 +36507,17 @@ 1 2 - 648003 + 640704 2 3 - 229856 + 227267 3 9 - 8960 + 8859 @@ -36052,7 +36533,7 @@ 1 2 - 1138454 + 1125632 @@ -36062,41 +36543,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 +36591,7 @@ 1 2 - 4341759 + 4292857 @@ -36126,7 +36607,7 @@ 1 2 - 4341759 + 4292857 @@ -36142,12 +36623,12 @@ 1 2 - 2749813 + 2718842 2 798 - 198122 + 195890 @@ -36163,12 +36644,12 @@ 1 2 - 2866919 + 2834629 2 5 - 81015 + 80103 @@ -36184,17 +36665,17 @@ 1 2 - 1531463 + 1514214 2 10 - 126937 + 125507 10 13605 - 20907 + 20671 @@ -36210,17 +36691,17 @@ 1 2 - 1535694 + 1518397 2 12 - 126564 + 125138 12 3246 - 17049 + 16857 @@ -36230,15 +36711,15 @@ includes - 317338 + 316281 id - 317338 + 316281 included - 58456 + 58261 @@ -36252,7 +36733,7 @@ 1 2 - 317338 + 316281 @@ -36268,37 +36749,37 @@ 1 2 - 28928 + 28831 2 3 - 9404 + 9373 3 4 - 4933 + 4917 4 6 - 5333 + 5315 6 11 - 4502 + 4487 11 47 - 4386 + 4371 47 793 - 967 + 964 @@ -36356,15 +36837,15 @@ link_targets - 816 + 817 id - 816 + 817 binary - 816 + 817 @@ -36378,7 +36859,7 @@ 1 2 - 816 + 817 @@ -36394,7 +36875,7 @@ 1 2 - 816 + 817 @@ -36404,15 +36885,15 @@ link_parent - 30225171 + 30702235 element - 3843767 + 3901138 link_target - 338 + 335 @@ -36426,17 +36907,17 @@ 1 2 - 527070 + 531747 2 9 - 26773 + 26989 9 10 - 3289924 + 3342400 @@ -36455,48 +36936,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/src/change-notes/2026-05-15-cleartext-transmission-fp.md b/cpp/ql/src/change-notes/2026-05-15-cleartext-transmission-fp.md new file mode 100644 index 000000000000..6fcb3e1c88b2 --- /dev/null +++ b/cpp/ql/src/change-notes/2026-05-15-cleartext-transmission-fp.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The 'Cleartext transmission of sensitive information' query (`cpp/cleartext-transmission`) no longer raises an alert on calls to `fscanf` (and variants) when the call reads from an "obviously local" `FILE` stream such as `stdin`. \ No newline at end of file diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 83d7a32e6d41..ddd0014f2e02 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.6.2 +version: 1.6.3-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/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected index 9224cd62e82f..d4d961a3a048 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -4928,6 +4928,8 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future | stl.h:95:69:95:69 | x | stl.h:96:42:96:42 | x | | | stl.h:96:42:96:42 | ref arg x | stl.h:95:69:95:69 | x | | | stl.h:96:42:96:42 | ref arg x | stl.h:95:69:95:69 | x | | +| stl.h:292:30:292:40 | 0 | file://:0:0:0:0 | noexcept(...) | TAINT | +| stl.h:292:30:292:40 | 0 | file://:0:0:0:0 | noexcept(...) | TAINT | | stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | | stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | | stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | 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/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/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp index f4bfe5ca3405..35700d229e75 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test3.cpp @@ -577,3 +577,10 @@ void tests3() str = get_home_address(); send(val(), str, strlen(str), val()); // BAD } + +int fscanf(FILE* stream, const char* format, ... ); + +void test_scanf() { + char password[256]; + fscanf(stdin, "%255s", password); // GOOD: this is not a remote source +} \ No newline at end of file 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/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/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/paket.lock b/csharp/paket.lock index 42d537cc181b..5e114b0d19fc 100644 --- a/csharp/paket.lock +++ b/csharp/paket.lock @@ -13,15 +13,15 @@ NUGET MSBuild.StructuredLogger (>= 2.3.71) NaturalSort.Extension (>= 4.4) NuGet.Versioning (>= 6.14) - Humanizer.Core (3.0.1) + Humanizer.Core (3.0.10) MessagePack (3.1.4) MessagePack.Annotations (>= 3.1.4) MessagePackAnalyzer (>= 3.1.4) 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.Bcl.AsyncInterfaces (10.0.8) + Microsoft.Bcl.Memory (10.0.8) Microsoft.Build (18.0.2) Microsoft.Build.Framework (>= 18.0.2) Microsoft.NET.StringTools (>= 18.0.2) @@ -29,13 +29,13 @@ NUGET 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.Build.Framework (18.4) + Microsoft.Build.Utilities.Core (18.4) + Microsoft.Build.Framework (>= 18.4) + Microsoft.NET.StringTools (>= 18.4) + System.Configuration.ConfigurationManager (>= 10.0.1) + System.Diagnostics.EventLog (>= 10.0.1) + System.Security.Cryptography.ProtectedData (>= 10.0.1) Microsoft.CodeAnalysis (5.0) Humanizer.Core (>= 2.14.1) Microsoft.Bcl.AsyncInterfaces (>= 9.0) @@ -53,7 +53,7 @@ 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.Analyzers (5.3) Microsoft.CodeAnalysis.Common (5.0) Microsoft.CodeAnalysis.Analyzers (>= 3.11) Microsoft.CodeAnalysis.CSharp (5.0) @@ -81,64 +81,63 @@ NUGET Microsoft.CodeAnalysis.Analyzers (>= 3.11) Microsoft.CodeAnalysis.Common (5.0) 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.4) + 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..115b23ac9f1e 100644 --- a/csharp/paket.main.bzl +++ b/csharp/paket.main.bzl @@ -8,58 +8,58 @@ def main(): 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": "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.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.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.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.Build.Framework", "id": "Microsoft.Build.Framework", "version": "18.4.0", "sha512": "sha512-VmOBicA4RSSTO857wrg91S9eOAsfnZLPeZZdXCsffJAZ8zQAMmZjATuin/LZFH21ajS9nPj7GBe+jvFRNzJPhA==", "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.4.0", "sha512": "sha512-cW8W3/rloKlL12/CjTrPsFIOk7gHr6RsosBk9K6Qi6vSMdibgVLTicymvem+pBWPSQ5EG/m7Uwb7jF3qqJMwog==", "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.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.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": "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.4.0", "sha512": "sha512-1II5n0nHfqVnFteNZsg1YLpbNM96P8VcX6UwCtYy4lXFrGNIvPnmfvz1y4ekxGQjHnxDvyphXkqIci9WhKcmBg==", "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": "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": "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": "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/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 88ba74212c7a..c5cfa0dcd89b 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.66 +version: 1.7.67-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index fee050486c93..c9f0acac983d 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.66 +version: 1.7.67-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/change-notes/2026-05-12-user-increment-decrement.md b/csharp/ql/lib/change-notes/2026-05-12-user-increment-decrement.md new file mode 100644 index 000000000000..a840fdf4fe34 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-05-12-user-increment-decrement.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# 14: Added support for user-defined instance increment/decrement operators. diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index daded1ee71e0..0e03db99ca91 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 6.0.0 +version: 6.0.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp 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/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 168ce6a1e5c8..3353866e3343 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -85,12 +85,12 @@ private module GuardsInput implements SharedGuards::InputSig { final private class FinalCase = CS::Case; class Case extends FinalCase { - AstNode getAPattern() { result = this.getPattern() } + AstNode getPattern(int index) { result = this.getPattern() and index = 0 } Expr getGuard() { result = this.getCondition() } 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..c9b8e61f4930 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 diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserialization.qhelp b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserialization.qhelp index 3c68b74a1d92..4cc76003fbf8 100644 --- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserialization.qhelp +++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserialization.qhelp @@ -7,6 +7,17 @@

Deserializing an object from untrusted input may result in security problems, such as denial of service or remote code execution.

+

+Note that a deserialization method is only dangerous if it can instantiate +arbitrary classes. Serialization frameworks that use a schema to instantiate +only expected, predefined types are generally not tracked by this query. Such +frameworks are generally safe with respect to arbitrary-class-instantiation and +gadget-chain attacks when the schema is trusted and does not permit +user-controlled type resolution. However, care must be taken to ensure the schema +strictly limits the allowed types. Permitting common standard library classes +can still leave the application vulnerable to gadget-chain attacks. +

+ diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp index 7c8781b15a17..b2c123bed5c9 100644 --- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp +++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp @@ -7,6 +7,17 @@

Deserializing an object from untrusted input may result in security problems, such as denial of service or remote code execution.

+

+Note that a deserialization method is only dangerous if it can instantiate +arbitrary classes. Serialization frameworks that use a schema to instantiate +only expected, predefined types are generally not tracked by this query. Such +frameworks are generally safe with respect to arbitrary-class-instantiation and +gadget-chain attacks when the schema is trusted and does not permit +user-controlled type resolution. However, care must be taken to ensure the schema +strictly limits the allowed types. Permitting common standard library classes +can still leave the application vulnerable to gadget-chain attacks. +

+ diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 72d951194c3b..de201743065f 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.7.2 +version: 1.7.3-dev groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 50fb2c695313..819674d2746d 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -912,7 +912,7 @@ | PartialImplementationB.cs:4:12:4:18 | Entry | PartialImplementationB.cs:4:12:4:18 | Exit | 11 | | Patterns.cs:3:7:3:14 | Entry | Patterns.cs:3:7:3:14 | Exit | 11 | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:8:13:8:23 | ... is ... | 13 | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:13:22:23 | case ...: | 4 | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:18:22:22 | "xyz" | 5 | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:12:18:12:31 | ... is ... | 5 | | Patterns.cs:8:13:8:23 | [MatchTrue] ... is ... | Patterns.cs:9:9:11:9 | After {...} | 18 | | Patterns.cs:12:14:18:9 | After if (...) ... | Patterns.cs:12:14:18:9 | After if (...) ... | 1 | @@ -922,19 +922,19 @@ | Patterns.cs:16:18:16:28 | After ... is ... [false] | Patterns.cs:16:18:16:28 | After ... is ... [false] | 1 | | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | Patterns.cs:17:9:18:9 | {...} | 4 | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:5:10:5:11 | Exit | 7 | -| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:23:17:23:22 | break; | 4 | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | case ...: | 2 | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | ... > ... | 6 | -| Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | 1 | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:23:17:23:22 | break; | 4 | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:18:24:23 | Int32 i2 | 4 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:30:24:35 | ... > ... | 6 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | 2 | | Patterns.cs:24:30:24:35 | After ... > ... [false] | Patterns.cs:24:30:24:35 | After ... > ... [false] | 1 | | Patterns.cs:24:30:24:35 | After ... > ... [true] | Patterns.cs:26:17:26:22 | break; | 16 | -| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:29:17:29:22 | break; | 17 | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | case ...: | 2 | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | case ...: | 1 | -| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:32:17:32:22 | break; | 17 | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | case ...: | 2 | -| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:34:17:34:22 | break; | 4 | -| Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:37:17:37:22 | break; | 11 | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | Int32 i3 | 2 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:29:17:29:22 | break; | 17 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:30:18:30:26 | String s2 | 4 | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:32:17:32:22 | break; | 17 | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:33:18:33:23 | Object v2 | 4 | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:34:17:34:22 | break; | 4 | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:37:17:37:22 | break; | 12 | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:48:9:48:20 | ... is ... | 5 | | Patterns.cs:48:9:48:20 | After ... is ... | Patterns.cs:47:24:47:25 | Exit | 3 | | Patterns.cs:48:9:48:20 | [MatchTrue] ... is ... | Patterns.cs:48:14:48:20 | After not ... | 5 | @@ -949,24 +949,24 @@ | Patterns.cs:53:24:53:25 | Entry | Patterns.cs:54:9:54:37 | ... is ... | 5 | | Patterns.cs:54:9:54:37 | After ... is ... | Patterns.cs:53:24:53:25 | Exit | 3 | | Patterns.cs:54:9:54:37 | [MatchTrue] ... is ... | Patterns.cs:54:14:54:37 | After not ... | 13 | -| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:28 | ... => ... | 7 | +| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:17 | not ... | 10 | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:56:26:56:27 | Exit | 4 | -| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:22:60:28 | "not 1" | 6 | -| Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:61:18:61:24 | "other" | 5 | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:33 | ... => ... | 6 | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:60:22:60:28 | "not 1" | 3 | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:61:18:61:24 | "other" | 7 | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:17 | not ... | 9 | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:65:26:65:27 | Exit | 4 | -| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:22:69:33 | "impossible" | 6 | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | ... => ... | 2 | -| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:18:70:27 | "possible" | 3 | -| Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | 1 | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:24 | ... => ... | 7 | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:69:22:69:33 | "impossible" | 3 | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:70:13:70:13 | 2 | 4 | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:70:18:70:27 | "possible" | 3 | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | 2 | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:15 | > ... | 10 | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:74:26:74:27 | Exit | 4 | -| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:20:78:24 | "> 1" | 6 | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | ... => ... | 2 | -| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:20:79:24 | "< 0" | 6 | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | ... => ... | 2 | -| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:18:80:20 | "1" | 3 | -| Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:81:18:81:20 | "0" | 5 | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:78:20:78:24 | "> 1" | 3 | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:79:13:79:15 | < ... | 6 | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:79:20:79:24 | "< 0" | 3 | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:80:13:80:13 | 1 | 4 | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:80:18:80:20 | "1" | 3 | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:81:18:81:20 | "0" | 7 | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:39:85:53 | ... is ... | 6 | | Patterns.cs:85:39:85:53 | After ... is ... [false] | Patterns.cs:85:67:85:69 | "2" | 2 | | Patterns.cs:85:39:85:53 | [MatchTrue] ... is ... | Patterns.cs:85:57:85:63 | "not 2" | 11 | @@ -995,129 +995,130 @@ | Qualifiers.cs:10:10:10:10 | Entry | Qualifiers.cs:10:10:10:10 | Exit | 149 | | Switch.cs:3:7:3:12 | Entry | Switch.cs:3:7:3:12 | Exit | 11 | | Switch.cs:5:10:5:11 | Entry | Switch.cs:5:10:5:11 | Exit | 9 | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:13:14:21 | case ...: | 6 | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:18:14:20 | "a" | 7 | | Switch.cs:10:10:10:11 | Exceptional Exit | Switch.cs:10:10:10:11 | Exceptional Exit | 1 | | Switch.cs:10:10:10:11 | Exit | Switch.cs:10:10:10:11 | Exit | 1 | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:10:10:10:11 | Normal Exit | 1 | -| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:15:17:15:23 | return ...; | 4 | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:16:13:16:19 | case ...: | 2 | -| Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:17:17:17:38 | throw ...; | 7 | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | case ...: | 2 | -| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:19:17:19:29 | goto default; | 4 | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | case ...: | 2 | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:21:21:29 | ... == ... | 7 | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | case ...: | 2 | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:15:17:15:23 | return ...; | 4 | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:16:18:16:18 | 0 | 4 | +| Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:17:17:17:38 | throw ...; | 6 | +| Switch.cs:16:18:16:18 | After 0 [match] | Switch.cs:16:18:16:18 | After 0 [match] | 1 | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:18:18:18:21 | null | 4 | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:19:17:19:29 | goto default; | 4 | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:20:18:20:22 | Int32 i | 4 | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:21:21:21:29 | ... == ... | 7 | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:18:24:25 | String s | 4 | | Switch.cs:21:21:21:29 | After ... == ... [false] | Switch.cs:23:17:23:28 | goto case ...; | 5 | | Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:22:21:22:27 | return ...; | 3 | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:43 | ... > ... | 10 | -| Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | 1 | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:32:24:43 | ... > ... | 10 | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | 2 | | Switch.cs:24:32:24:43 | After ... > ... [false] | Switch.cs:24:32:24:43 | After ... > ... [false] | 1 | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:24:48:24:55 | ... != ... | 5 | | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:24:32:24:55 | After ... && ... [false] | 1 | | Switch.cs:24:48:24:55 | After ... != ... [false] | Switch.cs:24:48:24:55 | After ... != ... [false] | 1 | | Switch.cs:24:48:24:55 | After ... != ... [true] | Switch.cs:26:17:26:23 | return ...; | 10 | -| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:32:27:38 | call to method Throw | 4 | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:30:13:30:20 | default: | 2 | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | case ...: | 1 | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | 2 | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:27:32:27:38 | call to method Throw | 4 | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:30:13:30:20 | default: | 3 | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:29:17:29:23 | return ...; | 6 | | Switch.cs:35:10:35:11 | Entry | Switch.cs:35:10:35:11 | Exit | 7 | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:13:48:23 | case ...: | 6 | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:18:48:20 | access to type Int32 | 7 | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:44:10:44:11 | Exit | 4 | -| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:49:17:49:22 | break; | 4 | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | case ...: | 2 | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | ... != ... | 6 | -| Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | 1 | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:49:17:49:22 | break; | 4 | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:18:50:21 | access to type Boolean | 4 | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:30:50:38 | ... != ... | 6 | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | 2 | | Switch.cs:50:30:50:38 | After ... != ... [false] | Switch.cs:50:30:50:38 | After ... != ... [false] | 1 | | Switch.cs:50:30:50:38 | After ... != ... [true] | Switch.cs:51:17:51:22 | break; | 3 | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:13:59:19 | case ...: | 9 | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:18:59:18 | 2 | 10 | | Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:55:10:55:11 | Exit | 4 | -| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:60:17:60:22 | break; | 4 | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | case ...: | 2 | -| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:62:17:62:22 | break; | 4 | -| Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | 1 | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:13:70:23 | case ...: | 9 | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:60:17:60:22 | break; | 4 | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:61:18:61:18 | 3 | 4 | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:62:17:62:22 | break; | 4 | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | 2 | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:18:70:20 | access to type Int32 | 10 | | Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:66:10:66:11 | Exit | 4 | -| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:71:17:71:22 | break; | 4 | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | case ...: | 2 | -| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:73:17:73:22 | break; | 4 | -| Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | 1 | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:13:81:19 | case ...: | 7 | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:71:17:71:22 | break; | 4 | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:72:18:72:19 | "" | 4 | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:73:17:73:22 | break; | 4 | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | 2 | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:18:81:18 | 1 | 8 | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:77:10:77:11 | Exit | 2 | | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:88:9:88:21 | return ...; | 4 | -| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:82:17:82:28 | return ...; | 5 | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | case ...: | 2 | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:21:84:25 | ... > ... | 7 | -| Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | 1 | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:82:17:82:28 | return ...; | 5 | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:83:18:83:18 | 2 | 4 | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:84:21:84:25 | ... > ... | 7 | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | 2 | | Switch.cs:84:21:84:25 | After ... > ... [false] | Switch.cs:86:17:86:28 | return ...; | 5 | | Switch.cs:84:21:84:25 | After ... > ... [true] | Switch.cs:85:21:85:26 | break; | 3 | -| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:13:95:23 | case ...: | 6 | +| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:18:95:20 | access to type Int32 | 7 | | Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:91:10:91:11 | Exit | 2 | -| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:96:17:96:28 | return ...; | 5 | -| Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:98:9:98:21 | return ...; | 5 | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:96:17:96:28 | return ...; | 5 | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:98:9:98:21 | return ...; | 6 | | Switch.cs:101:9:101:10 | Entry | Switch.cs:103:17:103:17 | access to parameter s | 6 | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:101:9:101:10 | Exit | 2 | | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | Switch.cs:103:17:103:25 | access to property Length | 2 | | Switch.cs:103:17:103:17 | After access to parameter s [null] | Switch.cs:103:17:103:17 | After access to parameter s [null] | 1 | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | case ...: | 2 | -| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:21:105:29 | return ...; | 5 | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | case ...: | 2 | -| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:21:106:29 | return ...; | 5 | -| Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:108:9:108:18 | return ...; | 8 | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:18:105:18 | 0 | 3 | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:105:21:105:29 | return ...; | 5 | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:106:18:106:18 | 1 | 4 | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:106:21:106:29 | return ...; | 5 | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:108:9:108:18 | return ...; | 9 | | Switch.cs:111:17:111:21 | Entry | Switch.cs:111:17:111:21 | Exit | 8 | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:13:117:35 | case ...: | 9 | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:18:117:18 | 3 | 10 | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:113:9:113:11 | Exit | 2 | | Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:120:9:120:18 | return ...; | 7 | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | ... == ... | 6 | -| Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:117:13:117:35 | After case ...: [no-match] | 1 | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:25:117:34 | ... == ... | 6 | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:117:13:117:35 | After case ...: [no-match] | 2 | | Switch.cs:117:25:117:34 | After ... == ... [false] | Switch.cs:117:25:117:34 | After ... == ... [false] | 1 | | Switch.cs:117:25:117:34 | After ... == ... [true] | Switch.cs:117:37:117:45 | return ...; | 4 | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | ... == ... | 6 | -| Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:118:13:118:34 | After case ...: [no-match] | 1 | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | case ...: | 1 | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | 2 | 2 | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:25:118:33 | ... == ... | 6 | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:118:13:118:34 | After case ...: [no-match] | 2 | | Switch.cs:118:25:118:33 | After ... == ... [false] | Switch.cs:118:25:118:33 | After ... == ... [false] | 1 | | Switch.cs:118:25:118:33 | After ... == ... [true] | Switch.cs:118:36:118:44 | return ...; | 4 | -| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:34 | ... => ... | 7 | +| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:29 | Boolean b | 8 | | Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:123:10:123:12 | Exit | 2 | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:124:5:127:5 | After {...} | 3 | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:126:13:126:19 | return ...; | 3 | -| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:34:125:34 | access to local variable b | 3 | -| Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:125:42:125:46 | false | 5 | -| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:40 | ... => ... | 8 | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:125:34:125:34 | access to local variable b | 3 | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:125:42:125:46 | false | 7 | +| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:35 | String s | 9 | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:129:12:129:14 | Exit | 4 | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:131:16:131:66 | call to method ToString | 2 | | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | 1 | -| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:40:131:40 | access to local variable s | 3 | -| Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:131:48:131:51 | null | 5 | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:13:139:19 | case ...: | 6 | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:131:40:131:40 | access to local variable s | 3 | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:131:48:131:51 | null | 7 | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:18:139:18 | 1 | 7 | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:134:9:134:11 | Exit | 2 | -| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:21:139:29 | return ...; | 5 | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | case ...: | 2 | -| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:21:140:29 | return ...; | 5 | -| Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:138:22:138:31 | return ...; | 9 | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:13:148:19 | case ...: | 6 | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:139:21:139:29 | return ...; | 5 | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:140:18:140:18 | 2 | 4 | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:140:21:140:29 | return ...; | 5 | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:138:22:138:31 | return ...; | 10 | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:18:148:18 | 1 | 7 | | Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:144:9:144:11 | Exit | 2 | -| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:21:148:29 | return ...; | 5 | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | case ...: | 2 | -| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:21:150:29 | return ...; | 5 | -| Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:149:22:149:31 | return ...; | 9 | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:38 | ... => ... | 9 | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:148:21:148:29 | return ...; | 5 | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:150:18:150:18 | 2 | 4 | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:150:21:150:29 | return ...; | 5 | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:149:22:149:31 | return ...; | 10 | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:31 | true | 10 | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:157:13:157:13 | access to parameter b | 6 | -| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:36:156:38 | "a" | 3 | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | ... => ... | 2 | -| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:50:156:52 | "b" | 3 | -| Switch.cs:156:41:156:52 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | 1 | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:156:36:156:38 | "a" | 3 | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:41:156:45 | false | 4 | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:156:50:156:52 | "b" | 3 | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | 2 | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:154:10:154:12 | Exit | 4 | | Switch.cs:157:13:157:13 | After access to parameter b [false] | Switch.cs:160:13:160:49 | After ...; | 14 | | Switch.cs:157:13:157:13 | After access to parameter b [true] | Switch.cs:158:13:158:49 | After ...; | 14 | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:13:167:19 | case ...: | 6 | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:18:167:18 | 1 | 7 | | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:163:10:163:12 | Exit | 4 | -| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:167:18:167:18 | 1 | 2 | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | case ...: | 2 | -| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:168:18:168:18 | 2 | 2 | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | case ...: | 2 | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:167:13:167:19 | After case ...: [match] | 2 | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:168:18:168:18 | 2 | 4 | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:168:13:168:19 | After case ...: [match] | 2 | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:171:18:171:18 | 3 | 4 | | Switch.cs:169:17:169:51 | ...; | Switch.cs:170:17:170:22 | break; | 8 | -| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:173:17:173:22 | break; | 10 | -| Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:176:17:176:22 | break; | 11 | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:173:17:173:22 | break; | 10 | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:176:17:176:22 | break; | 12 | | TypeAccesses.cs:1:7:1:18 | Entry | TypeAccesses.cs:1:7:1:18 | Exit | 11 | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:7:13:7:22 | ... is ... | 27 | | TypeAccesses.cs:7:9:7:25 | After if (...) ... | TypeAccesses.cs:3:10:3:10 | Exit | 11 | @@ -1157,21 +1158,23 @@ | cflow.cs:30:18:33:37 | After if (...) ... | cflow.cs:30:18:33:37 | After if (...) ... | 1 | | cflow.cs:30:22:30:31 | After ... == ... [false] | cflow.cs:33:17:33:37 | After ...; | 7 | | cflow.cs:30:22:30:31 | After ... == ... [true] | cflow.cs:31:17:31:42 | After ...; | 7 | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:13:41:19 | case ...: | 6 | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:18:41:18 | 1 | 7 | | cflow.cs:37:17:37:22 | Exit | cflow.cs:37:17:37:22 | Exit | 1 | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | case ...: | 4 | -| cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:43:17:43:28 | goto case ...; | 11 | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | case ...: | 2 | -| cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:46:17:46:28 | goto case ...; | 11 | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | case ...: | 2 | -| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:49:17:49:22 | break; | 10 | -| cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | 1 | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | case ...: | 10 | -| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:55:17:55:22 | break; | 10 | -| cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:58:17:58:22 | break; | 11 | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | 42 | 5 | +| cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:43:17:43:28 | goto case ...; | 10 | +| cflow.cs:41:18:41:18 | After 1 [match] | cflow.cs:41:18:41:18 | After 1 [match] | 1 | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:44:18:44:18 | 2 | 4 | +| cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:46:17:46:28 | goto case ...; | 10 | +| cflow.cs:44:18:44:18 | After 2 [match] | cflow.cs:44:18:44:18 | After 2 [match] | 1 | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:47:18:47:18 | 3 | 4 | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:49:17:49:22 | break; | 10 | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | 2 | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | 0 | 11 | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:55:17:55:22 | break; | 10 | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:58:17:58:22 | break; | 12 | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Normal Exit | 5 | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:23:63:33 | ... == ... | 11 | -| cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | 1 | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:63:23:63:33 | ... == ... | 11 | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | 2 | | cflow.cs:63:23:63:33 | After ... == ... [false] | cflow.cs:37:17:37:22 | Exceptional Exit | 8 | | cflow.cs:63:23:63:33 | After ... == ... [true] | cflow.cs:65:17:65:22 | break; | 5 | | cflow.cs:70:18:70:18 | Entry | cflow.cs:72:13:72:21 | ... == ... | 8 | @@ -1293,15 +1296,15 @@ | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:244:13:244:28 | ... > ... | 12 | | cflow.cs:242:19:242:35 | After ... == ... [false] | cflow.cs:242:16:242:36 | After !... [false] | 3 | | cflow.cs:242:19:242:35 | After ... == ... [true] | cflow.cs:242:39:242:41 | {...} | 4 | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:13:248:19 | case ...: | 15 | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:18:248:18 | 0 | 16 | | cflow.cs:244:13:244:28 | After ... > ... [true] | cflow.cs:244:31:244:41 | goto ...; | 3 | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:240:10:240:13 | Exit | 4 | -| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:249:17:249:29 | goto default; | 4 | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | case ...: | 2 | -| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:252:17:252:22 | break; | 10 | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | case ...: | 2 | -| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:254:17:254:27 | goto ...; | 4 | -| cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:255:13:255:20 | default: | 2 | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:249:17:249:29 | goto default; | 4 | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:250:18:250:18 | 1 | 4 | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:252:17:252:22 | break; | 10 | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:253:18:253:18 | 2 | 4 | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:254:17:254:27 | goto ...; | 4 | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:255:13:255:20 | default: | 3 | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:257:17:257:22 | break; | 9 | | cflow.cs:261:49:261:53 | Entry | cflow.cs:264:18:264:22 | After Int32 i = ... | 12 | | cflow.cs:261:49:261:53 | Exceptional Exit | cflow.cs:261:49:261:53 | Exceptional Exit | 1 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected index 94ae54555176..4ed3508dd690 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected @@ -541,19 +541,19 @@ conditionBlock | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:16:14:18:9 | After if (...) ... | false | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:16:18:16:28 | After ... is ... [false] | false | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:13:22:23 | After case ...: [match] | true | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:13:22:23 | After case ...: [no-match] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:13:24:36 | After case ...: [match] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:13:24:36 | After case ...: [no-match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:18:22:22 | After "xyz" [match] | true | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | false | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:30:24:35 | After ... > ... [false] | false | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:30:24:35 | After ... > ... [true] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:13:27:24 | After case ...: [match] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:13:27:24 | After case ...: [no-match] | false | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:13:27:24 | case ...: | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:13:30:27 | After case ...: [match] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:13:30:27 | After case ...: [no-match] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:13:33:24 | After case ...: [match] | false | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:13:33:24 | After case ...: [no-match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:18:30:26 | After String s2 [match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:18:30:26 | After String s2 [no-match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:18:33:23 | After Object v2 [match] | false | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | false | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:12:18:12:31 | After ... is ... [false] | false | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:12:18:12:31 | [MatchTrue] ... is ... | true | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:16:14:18:9 | After if (...) ... | false | @@ -561,24 +561,24 @@ conditionBlock | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | false | | Patterns.cs:12:18:12:31 | After ... is ... [false] | Patterns.cs:16:18:16:28 | After ... is ... [false] | false | | Patterns.cs:12:18:12:31 | After ... is ... [false] | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | true | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [match] | true | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | false | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | true | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | true | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | false | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | true | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [match] | true | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | false | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [match] | false | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | false | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [match] | true | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [no-match] | false | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [match] | false | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [no-match] | false | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [match] | false | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [no-match] | false | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [match] | true | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | false | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | true | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | false | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | true | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | true | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | false | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | true | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | true | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | false | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:18:30:26 | After String s2 [match] | false | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:18:30:26 | After String s2 [no-match] | false | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:18:33:23 | After Object v2 [match] | false | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | false | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:30:18:30:26 | After String s2 [match] | true | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:30:18:30:26 | After String s2 [no-match] | false | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | false | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | false | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | true | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | false | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:48:9:48:20 | [MatchTrue] ... is ... | true | | Patterns.cs:50:24:50:25 | Entry | Patterns.cs:51:9:51:21 | After ... is ... [false] | false | | Patterns.cs:50:24:50:25 | Entry | Patterns.cs:51:9:51:21 | [MatchTrue] ... is ... | true | @@ -589,26 +589,26 @@ conditionBlock | Patterns.cs:51:9:51:21 | After ... is ... [false] | Patterns.cs:51:34:51:39 | [MatchTrue] ... is ... | true | | Patterns.cs:51:9:51:21 | [MatchTrue] ... is ... | Patterns.cs:51:25:51:30 | [MatchTrue] ... is ... | true | | Patterns.cs:53:24:53:25 | Entry | Patterns.cs:54:9:54:37 | [MatchTrue] ... is ... | true | -| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:28 | After ... => ... [match] | true | -| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | false | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:33 | After ... => ... [match] | true | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | false | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:27 | After ... => ... [match] | false | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | false | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [match] | true | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | false | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:24 | After ... => ... [match] | true | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | false | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:24 | After ... => ... [match] | false | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | false | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:20 | After ... => ... [match] | false | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | false | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [match] | true | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | false | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | false | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | false | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | true | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | false | +| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:17 | After not ... [match] | true | +| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:17 | After not ... [no-match] | false | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:17 | After not ... [match] | true | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:17 | After not ... [no-match] | false | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:13 | After 2 [match] | false | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:13 | After 2 [no-match] | false | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:70:13:70:13 | After 2 [match] | true | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:70:13:70:13 | After 2 [no-match] | false | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:15 | After > ... [match] | true | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:15 | After > ... [no-match] | false | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:15 | After < ... [match] | false | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:15 | After < ... [no-match] | false | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:13 | After 1 [match] | false | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:13 | After 1 [no-match] | false | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [match] | true | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [no-match] | false | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [match] | false | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | false | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [match] | true | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | false | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:39:85:53 | After ... is ... [false] | false | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:39:85:53 | [MatchTrue] ... is ... | true | | Patterns.cs:87:26:87:27 | Entry | Patterns.cs:87:39:87:54 | After ... is ... [false] | false | @@ -620,187 +620,189 @@ conditionBlock | PostDominance.cs:17:10:17:11 | Entry | PostDominance.cs:19:13:19:21 | After ... is ... [false] | false | | PostDominance.cs:17:10:17:11 | Entry | PostDominance.cs:19:13:19:21 | [MatchTrue] ... is ... | true | | Switch.cs:10:10:10:11 | Entry | Switch.cs:10:10:10:11 | Exceptional Exit | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:13:14:21 | After case ...: [match] | true | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:13:14:21 | After case ...: [no-match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:18:14:20 | After "a" [match] | true | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:18:14:20 | After "a" [no-match] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:16:13:16:19 | After case ...: [match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:16:13:16:19 | After case ...: [no-match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:13:18:22 | After case ...: [match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:13:18:22 | After case ...: [no-match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:13:20:23 | After case ...: [match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:13:20:23 | After case ...: [no-match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:16:18:16:18 | After 0 [match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:16:18:16:18 | After 0 [no-match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:18:18:21 | After null [match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:18:18:21 | After null [no-match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:18:20:22 | After Int32 i [match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:18:20:22 | After Int32 i [no-match] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:21:21:21:29 | After ... == ... [false] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:21:21:21:29 | After ... == ... [true] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:13:24:56 | After case ...: [match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:13:24:56 | After case ...: [no-match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:18:24:25 | After String s [match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:18:24:25 | After String s [no-match] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:32:24:43 | After ... > ... [false] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:32:24:43 | After ... > ... [true] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:32:24:55 | After ... && ... [false] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:48:24:55 | After ... != ... [false] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:48:24:55 | After ... != ... [true] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:13:27:39 | After case ...: [match] | false | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:13:27:39 | After case ...: [no-match] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:27:13:27:39 | case ...: | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:18:27:25 | After Double d [match] | false | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:18:27:25 | After Double d [no-match] | false | | Switch.cs:10:10:10:11 | Entry | Switch.cs:30:13:30:20 | After default: [match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:16:13:16:19 | After case ...: [no-match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | false | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:30:13:30:20 | After default: [match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [match] | true | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | false | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [match] | true | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | true | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | true | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | false | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | false | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:21:21:29 | After ... == ... [false] | false | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:21:21:29 | After ... == ... [true] | true | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | true | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | false | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | true | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | true | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | true | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | true | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | true | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:43 | After ... > ... [true] | true | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:48:24:55 | After ... != ... [false] | true | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:48:24:55 | After ... != ... [true] | true | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:16:18:16:18 | After 0 [match] | true | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:16:18:16:18 | After 0 [no-match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:18:18:18:21 | After null [match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:20:18:20:22 | After Int32 i [match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:18:24:25 | After String s [match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:27:13:27:39 | case ...: | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | false | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:30:13:30:20 | After default: [match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:18:18:18:21 | After null [match] | true | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:20:18:20:22 | After Int32 i [match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:18:24:25 | After String s [match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:27:13:27:39 | case ...: | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | false | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:20:18:20:22 | After Int32 i [match] | true | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | true | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | true | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:18:24:25 | After String s [match] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:27:13:27:39 | case ...: | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | false | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | false | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:21:21:21:29 | After ... == ... [false] | false | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:21:21:21:29 | After ... == ... [true] | true | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:18:24:25 | After String s [match] | true | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | false | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | true | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | true | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | true | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | true | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | true | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:32:24:43 | After ... > ... [false] | false | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:32:24:43 | After ... > ... [true] | true | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:48:24:55 | After ... != ... [false] | true | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:48:24:55 | After ... != ... [true] | true | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:24:48:24:55 | After ... != ... [false] | false | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:24:48:24:55 | After ... != ... [true] | true | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [match] | true | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [no-match] | false | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:13:48:23 | After case ...: [match] | true | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:13:48:23 | After case ...: [no-match] | false | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:13:50:39 | After case ...: [match] | false | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:13:50:39 | After case ...: [no-match] | false | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | After Double d [match] | true | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | After Double d [no-match] | false | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:18:48:20 | After access to type Int32 [match] | true | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | false | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:18:50:21 | After access to type Boolean [match] | false | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | false | | Switch.cs:44:10:44:11 | Entry | Switch.cs:50:30:50:38 | After ... != ... [false] | false | | Switch.cs:44:10:44:11 | Entry | Switch.cs:50:30:50:38 | After ... != ... [true] | false | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [match] | true | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | false | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:30:50:38 | After ... != ... [false] | true | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:30:50:38 | After ... != ... [true] | true | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | After ... != ... [false] | false | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | After ... != ... [true] | true | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:13:59:19 | After case ...: [match] | true | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:13:59:19 | After case ...: [no-match] | false | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:13:61:19 | After case ...: [match] | false | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:13:61:19 | After case ...: [no-match] | false | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [match] | true | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | false | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:13:70:23 | After case ...: [match] | true | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:13:70:23 | After case ...: [no-match] | false | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:13:72:20 | After case ...: [match] | false | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:13:72:20 | After case ...: [no-match] | false | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [match] | true | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | false | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [match] | true | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | false | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:30:50:38 | After ... != ... [false] | true | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:30:50:38 | After ... != ... [true] | true | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:30:50:38 | After ... != ... [false] | false | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:30:50:38 | After ... != ... [true] | true | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:18:59:18 | After 2 [match] | true | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:18:59:18 | After 2 [no-match] | false | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:18:61:18 | After 3 [match] | false | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:18:61:18 | After 3 [no-match] | false | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:61:18:61:18 | After 3 [match] | true | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:61:18:61:18 | After 3 [no-match] | false | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:18:70:20 | After access to type Int32 [match] | true | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | false | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:18:72:19 | After "" [match] | false | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:18:72:19 | After "" [no-match] | false | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:72:18:72:19 | After "" [match] | true | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:72:18:72:19 | After "" [no-match] | false | | Switch.cs:77:10:77:11 | Entry | Switch.cs:79:9:87:9 | After switch (...) {...} | false | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:13:81:19 | After case ...: [match] | true | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:13:81:19 | After case ...: [no-match] | false | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:13:83:19 | After case ...: [match] | false | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:13:83:19 | After case ...: [no-match] | false | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:18:81:18 | After 1 [match] | true | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:18:81:18 | After 1 [no-match] | false | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:18:83:18 | After 2 [match] | false | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:18:83:18 | After 2 [no-match] | false | | Switch.cs:77:10:77:11 | Entry | Switch.cs:84:21:84:25 | After ... > ... [false] | false | | Switch.cs:77:10:77:11 | Entry | Switch.cs:84:21:84:25 | After ... > ... [true] | false | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [match] | true | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | false | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:84:21:84:25 | After ... > ... [false] | true | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:84:21:84:25 | After ... > ... [true] | true | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:21:84:25 | After ... > ... [false] | false | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:21:84:25 | After ... > ... [true] | true | -| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:13:95:23 | After case ...: [match] | true | -| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:13:95:23 | After case ...: [no-match] | false | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:83:18:83:18 | After 2 [match] | true | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:83:18:83:18 | After 2 [no-match] | false | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:84:21:84:25 | After ... > ... [false] | true | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:84:21:84:25 | After ... > ... [true] | true | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:84:21:84:25 | After ... > ... [false] | false | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:84:21:84:25 | After ... > ... [true] | true | +| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:18:95:20 | After access to type Int32 [match] | true | +| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | false | | Switch.cs:101:9:101:10 | Entry | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | false | | Switch.cs:101:9:101:10 | Entry | Switch.cs:103:17:103:17 | After access to parameter s [null] | true | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | After case ...: [match] | true | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | After case ...: [no-match] | false | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:13:106:19 | After case ...: [match] | false | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:13:106:19 | After case ...: [no-match] | false | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | After case ...: [match] | true | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | After case ...: [no-match] | false | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:13:117:35 | After case ...: [match] | true | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:13:117:35 | After case ...: [no-match] | false | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:18:105:18 | After 0 [match] | true | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:18:105:18 | After 0 [no-match] | false | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:18:106:18 | After 1 [match] | false | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:18:106:18 | After 1 [no-match] | false | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:106:18:106:18 | After 1 [match] | true | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:106:18:106:18 | After 1 [no-match] | false | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:18:117:18 | After 3 [match] | true | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:18:117:18 | After 3 [no-match] | false | | Switch.cs:113:9:113:11 | Entry | Switch.cs:117:25:117:34 | After ... == ... [false] | true | | Switch.cs:113:9:113:11 | Entry | Switch.cs:117:25:117:34 | After ... == ... [true] | true | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | After ... == ... [false] | false | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | After ... == ... [true] | true | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | After ... == ... [false] | false | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | After ... == ... [true] | true | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [match] | true | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [no-match] | false | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:25:117:34 | After ... == ... [false] | false | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:25:117:34 | After ... == ... [true] | true | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | After 2 [match] | true | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | After 2 [no-match] | false | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:25:118:33 | After ... == ... [false] | true | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:25:118:33 | After ... == ... [true] | true | -| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:34 | After ... => ... [match] | true | -| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:34 | After ... => ... [no-match] | false | -| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:40 | After ... => ... [match] | true | -| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:40 | After ... => ... [no-match] | false | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:13:139:19 | After case ...: [match] | true | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:13:139:19 | After case ...: [no-match] | false | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:13:140:19 | After case ...: [match] | false | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:13:140:19 | After case ...: [no-match] | false | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | After case ...: [match] | true | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | After case ...: [no-match] | false | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:13:148:19 | After case ...: [match] | true | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:13:148:19 | After case ...: [no-match] | false | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:13:150:19 | After case ...: [match] | false | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:13:150:19 | After case ...: [no-match] | false | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | After case ...: [match] | true | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | After case ...: [no-match] | false | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:38 | After ... => ... [match] | true | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:38 | After ... => ... [no-match] | false | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:52 | After ... => ... [match] | false | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:52 | After ... => ... [no-match] | false | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:25:118:33 | After ... == ... [false] | false | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:25:118:33 | After ... == ... [true] | true | +| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:29 | After Boolean b [match] | true | +| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:29 | After Boolean b [no-match] | false | +| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:35 | After String s [match] | true | +| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:35 | After String s [no-match] | false | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:18:139:18 | After 1 [match] | true | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:18:139:18 | After 1 [no-match] | false | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:18:140:18 | After 2 [match] | false | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:18:140:18 | After 2 [no-match] | false | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:140:18:140:18 | After 2 [match] | true | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:140:18:140:18 | After 2 [no-match] | false | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:18:148:18 | After 1 [match] | true | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:18:148:18 | After 1 [no-match] | false | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:18:150:18 | After 2 [match] | false | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:18:150:18 | After 2 [no-match] | false | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:150:18:150:18 | After 2 [match] | true | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:150:18:150:18 | After 2 [no-match] | false | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:31 | After true [match] | true | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:31 | After true [no-match] | false | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:45 | After false [match] | false | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:45 | After false [no-match] | false | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:157:13:157:13 | After access to parameter b [false] | false | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:157:13:157:13 | After access to parameter b [true] | true | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [match] | true | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | false | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:13:167:19 | After case ...: [match] | true | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:13:167:19 | After case ...: [no-match] | false | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:13:168:19 | After case ...: [match] | false | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:13:168:19 | After case ...: [no-match] | false | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:13:171:19 | After case ...: [match] | false | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:13:171:19 | After case ...: [no-match] | false | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | After case ...: [match] | true | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | After case ...: [no-match] | false | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [match] | false | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | false | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [match] | true | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | false | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:41:156:45 | After false [match] | true | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:41:156:45 | After false [no-match] | false | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:18:167:18 | After 1 [match] | true | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:18:167:18 | After 1 [no-match] | false | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:18:168:18 | After 2 [match] | false | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:18:168:18 | After 2 [no-match] | false | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:18:171:18 | After 3 [match] | false | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:18:171:18 | After 3 [no-match] | false | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:168:18:168:18 | After 2 [match] | true | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:168:18:168:18 | After 2 [no-match] | false | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:171:18:171:18 | After 3 [match] | false | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | false | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:171:18:171:18 | After 3 [match] | true | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | false | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:7:13:7:22 | After ... is ... [false] | false | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:7:13:7:22 | [MatchTrue] ... is ... | true | | VarDecls.cs:19:7:19:8 | Entry | VarDecls.cs:25:20:25:20 | After access to parameter b [false] | false | @@ -873,41 +875,44 @@ conditionBlock | cflow.cs:28:22:28:31 | After ... == ... [false] | cflow.cs:30:22:30:31 | After ... == ... [true] | true | | cflow.cs:37:17:37:22 | Entry | cflow.cs:37:17:37:22 | Exit | false | | cflow.cs:37:17:37:22 | Entry | cflow.cs:39:9:50:9 | After switch (...) {...} | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:13:41:19 | After case ...: [no-match] | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:44:13:44:19 | After case ...: [no-match] | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:13:47:19 | After case ...: [match] | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:13:47:19 | After case ...: [no-match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:18:41:18 | After 1 [match] | true | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:18:41:18 | After 1 [no-match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:44:18:44:18 | After 2 [match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:44:18:44:18 | After 2 [no-match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:18:47:18 | After 3 [match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:18:47:18 | After 3 [no-match] | false | | cflow.cs:37:17:37:22 | Entry | cflow.cs:51:9:59:9 | After switch (...) {...} | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:13:53:20 | After case ...: [match] | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:13:53:20 | After case ...: [no-match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:18:53:19 | After 42 [match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:18:53:19 | After 42 [no-match] | false | | cflow.cs:37:17:37:22 | Entry | cflow.cs:60:9:66:9 | After switch (...) {...} | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:13:62:19 | After case ...: [match] | false | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:13:62:19 | After case ...: [no-match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:18:62:18 | After 0 [match] | false | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:18:62:18 | After 0 [no-match] | false | | cflow.cs:37:17:37:22 | Entry | cflow.cs:63:23:63:33 | After ... == ... [false] | false | | cflow.cs:37:17:37:22 | Entry | cflow.cs:63:23:63:33 | After ... == ... [true] | false | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [match] | true | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [no-match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Exit | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | After case ...: [no-match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:51:9:59:9 | After switch (...) {...} | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:63:23:63:33 | After ... == ... [false] | false | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:63:23:63:33 | After ... == ... [true] | false | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [match] | true | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | false | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [match] | true | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [no-match] | false | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [match] | true | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [no-match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:37:17:37:22 | Exit | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:44:18:44:18 | After 2 [match] | true | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:44:18:44:18 | After 2 [no-match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:47:18:47:18 | After 3 [match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:51:9:59:9 | After switch (...) {...} | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:53:18:53:19 | After 42 [match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:53:18:53:19 | After 42 [no-match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:62:18:62:18 | After 0 [match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:62:18:62:18 | After 0 [no-match] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:63:23:63:33 | After ... == ... [false] | false | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:63:23:63:33 | After ... == ... [true] | false | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:47:18:47:18 | After 3 [match] | true | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | false | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [match] | true | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [no-match] | false | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [false] | true | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [true] | true | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:23:63:33 | After ... == ... [false] | false | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:23:63:33 | After ... == ... [true] | true | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:63:23:63:33 | After ... == ... [false] | false | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:63:23:63:33 | After ... == ... [true] | true | | cflow.cs:70:18:70:18 | Entry | cflow.cs:72:13:72:21 | After ... == ... [false] | false | | cflow.cs:70:18:70:18 | Entry | cflow.cs:72:13:72:21 | After ... == ... [true] | true | | cflow.cs:70:18:70:18 | Entry | cflow.cs:74:9:81:9 | After if (...) ... | false | @@ -1054,25 +1059,25 @@ conditionBlock | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:244:13:244:28 | After ... > ... [false] | false | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:244:13:244:28 | After ... > ... [true] | true | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:246:9:258:9 | After switch (...) {...} | false | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:13:248:19 | After case ...: [match] | false | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:13:248:19 | After case ...: [no-match] | false | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:13:250:19 | After case ...: [match] | false | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:13:250:19 | After case ...: [no-match] | false | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:13:253:19 | After case ...: [match] | false | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:13:253:19 | After case ...: [no-match] | false | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:18:248:18 | After 0 [match] | false | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:18:248:18 | After 0 [no-match] | false | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:18:250:18 | After 1 [match] | false | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:18:250:18 | After 1 [no-match] | false | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:18:253:18 | After 2 [match] | false | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:18:253:18 | After 2 [no-match] | false | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:255:13:255:20 | After default: [match] | false | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:13:248:19 | After case ...: [match] | true | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:13:248:19 | After case ...: [no-match] | false | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:13:250:19 | After case ...: [match] | false | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:13:250:19 | After case ...: [no-match] | false | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:13:253:19 | After case ...: [match] | false | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:13:253:19 | After case ...: [no-match] | false | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | After case ...: [match] | true | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | After case ...: [no-match] | false | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [match] | false | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | false | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [match] | true | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | false | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:18:248:18 | After 0 [match] | true | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:18:248:18 | After 0 [no-match] | false | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:18:250:18 | After 1 [match] | false | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:18:250:18 | After 1 [no-match] | false | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:18:253:18 | After 2 [match] | false | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:18:253:18 | After 2 [no-match] | false | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:250:18:250:18 | After 1 [match] | true | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:250:18:250:18 | After 1 [no-match] | false | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:253:18:253:18 | After 2 [match] | false | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | false | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:253:18:253:18 | After 2 [match] | true | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | false | | cflow.cs:264:25:264:30 | Before ... < ... | cflow.cs:261:49:261:53 | Exceptional Exit | false | | cflow.cs:264:25:264:30 | Before ... < ... | cflow.cs:261:49:261:53 | Exit | false | | cflow.cs:264:25:264:30 | Before ... < ... | cflow.cs:261:49:261:53 | Normal Exit | false | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index 51d4721caeac..5001f49300a9 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -5212,16 +5212,20 @@ dominance | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:40:9:42:9 | switch (...) {...} | | Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:20:17:20:17 | access to local variable o | | Patterns.cs:20:17:20:17 | access to local variable o | Patterns.cs:22:13:22:23 | case ...: | -| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:22:18:22:22 | "xyz" | +| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:23:17:23:22 | Before break; | | Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | case ...: | -| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:23:17:23:22 | Before break; | +| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:18:22:22 | "xyz" | +| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:22:13:22:23 | After case ...: [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:22:13:22:23 | After case ...: [no-match] | | Patterns.cs:23:17:23:22 | Before break; | Patterns.cs:23:17:23:22 | break; | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:18:24:23 | Int32 i2 | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:13:24:36 | After case ...: [no-match] | -| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:30:24:35 | Before ... > ... | +| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | Before ... > ... | +| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:18:24:23 | Int32 i2 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:13:24:36 | After case ...: [match] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:24:35:24:35 | 0 | | Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:30:24:35 | After ... > ... [true] | @@ -5242,11 +5246,13 @@ dominance | Patterns.cs:25:46:25:49 | {...} | Patterns.cs:25:46:25:49 | After {...} | | Patterns.cs:25:47:25:48 | access to local variable i2 | Patterns.cs:25:46:25:49 | {...} | | Patterns.cs:26:17:26:22 | Before break; | Patterns.cs:26:17:26:22 | break; | -| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:27:18:27:23 | Int32 i3 | +| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:28:17:28:47 | ...; | | Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | case ...: | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [no-match] | -| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:28:17:28:47 | ...; | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | Int32 i3 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:27:13:27:24 | After case ...: [match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:27:13:27:24 | After case ...: [no-match] | +| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | | Patterns.cs:28:17:28:46 | After call to method WriteLine | Patterns.cs:28:17:28:47 | After ...; | | Patterns.cs:28:17:28:46 | Before call to method WriteLine | Patterns.cs:28:35:28:45 | Before $"..." | | Patterns.cs:28:17:28:46 | call to method WriteLine | Patterns.cs:28:17:28:46 | After call to method WriteLine | @@ -5261,11 +5267,13 @@ dominance | Patterns.cs:28:41:28:44 | {...} | Patterns.cs:28:41:28:44 | After {...} | | Patterns.cs:28:42:28:43 | access to local variable i3 | Patterns.cs:28:41:28:44 | {...} | | Patterns.cs:29:17:29:22 | Before break; | Patterns.cs:29:17:29:22 | break; | -| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:30:18:30:26 | String s2 | +| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:31:17:31:50 | ...; | | Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | case ...: | -| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:31:17:31:50 | ...; | +| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:18:30:26 | String s2 | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:30:13:30:27 | After case ...: [match] | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | +| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:18:30:26 | After String s2 [no-match] | | Patterns.cs:31:17:31:49 | After call to method WriteLine | Patterns.cs:31:17:31:50 | After ...; | | Patterns.cs:31:17:31:49 | Before call to method WriteLine | Patterns.cs:31:35:31:48 | Before $"..." | | Patterns.cs:31:17:31:49 | call to method WriteLine | Patterns.cs:31:17:31:49 | After call to method WriteLine | @@ -5280,11 +5288,13 @@ dominance | Patterns.cs:31:44:31:47 | {...} | Patterns.cs:31:44:31:47 | After {...} | | Patterns.cs:31:45:31:46 | access to local variable s2 | Patterns.cs:31:44:31:47 | {...} | | Patterns.cs:32:17:32:22 | Before break; | Patterns.cs:32:17:32:22 | break; | -| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:33:18:33:23 | Object v2 | +| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:34:17:34:22 | Before break; | | Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:35:13:35:20 | default: | -| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [no-match] | -| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:34:17:34:22 | Before break; | +| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:18:33:23 | Object v2 | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:33:13:33:24 | After case ...: [match] | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | +| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | | Patterns.cs:34:17:34:22 | Before break; | Patterns.cs:34:17:34:22 | break; | | Patterns.cs:35:13:35:20 | After default: [match] | Patterns.cs:36:17:36:52 | ...; | | Patterns.cs:35:13:35:20 | default: | Patterns.cs:35:13:35:20 | After default: [match] | @@ -5365,17 +5375,19 @@ dominance | Patterns.cs:58:16:58:16 | access to parameter i | Patterns.cs:60:13:60:28 | ... => ... | | Patterns.cs:58:16:62:9 | ... switch { ... } | Patterns.cs:58:16:58:16 | access to parameter i | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:58:9:62:10 | return ...; | -| Patterns.cs:60:13:60:17 | After not ... | Patterns.cs:60:22:60:28 | "not 1" | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:60:13:60:28 | After ... => ... [match] | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | | Patterns.cs:60:13:60:17 | Before not ... | Patterns.cs:60:17:60:17 | 1 | -| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | After not ... | -| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:28 | After ... => ... [match] | -| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | -| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:13:60:17 | Before not ... | +| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | After not ... [match] | +| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | After not ... [no-match] | +| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:17 | Before not ... | +| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:22:60:28 | "not 1" | | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:61:13:61:24 | ... => ... | | Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:13:60:17 | not ... | -| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:18:61:24 | "other" | -| Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:61:13:61:24 | After ... => ... [match] | -| Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:61:13:61:13 | _ | +| Patterns.cs:61:13:61:13 | After _ [match] | Patterns.cs:61:13:61:24 | After ... => ... [match] | +| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:13:61:13 | After _ [match] | +| Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:61:13:61:13 | _ | +| Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:61:18:61:24 | "other" | | Patterns.cs:65:26:65:27 | Entry | Patterns.cs:66:5:72:5 | {...} | | Patterns.cs:65:26:65:27 | Normal Exit | Patterns.cs:65:26:65:27 | Exit | | Patterns.cs:66:5:72:5 | {...} | Patterns.cs:67:9:71:10 | Before return ...; | @@ -5384,18 +5396,21 @@ dominance | Patterns.cs:67:16:67:16 | 2 | Patterns.cs:69:13:69:33 | ... => ... | | Patterns.cs:67:16:71:9 | ... switch { ... } | Patterns.cs:67:16:67:16 | 2 | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:67:9:71:10 | return ...; | -| Patterns.cs:69:13:69:17 | After not ... | Patterns.cs:69:22:69:33 | "impossible" | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:69:13:69:33 | After ... => ... [match] | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | | Patterns.cs:69:13:69:17 | Before not ... | Patterns.cs:69:17:69:17 | 2 | -| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | After not ... | -| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:33 | After ... => ... [match] | -| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | -| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:13:69:17 | Before not ... | +| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | After not ... [match] | +| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | After not ... [no-match] | +| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:17 | Before not ... | +| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:22:69:33 | "impossible" | | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | ... => ... | | Patterns.cs:69:17:69:17 | 2 | Patterns.cs:69:13:69:17 | not ... | -| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:18:70:27 | "possible" | -| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:27 | After ... => ... [match] | -| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | -| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:13:70:13 | 2 | +| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:13 | After 2 [no-match] | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:70:13:70:27 | After ... => ... [match] | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | +| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:13 | 2 | +| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:18:70:27 | "possible" | | Patterns.cs:74:26:74:27 | Entry | Patterns.cs:74:33:74:33 | i | | Patterns.cs:74:26:74:27 | Normal Exit | Patterns.cs:74:26:74:27 | Exit | | Patterns.cs:74:33:74:33 | i | Patterns.cs:75:5:83:5 | {...} | @@ -5405,30 +5420,35 @@ dominance | Patterns.cs:76:16:76:16 | access to parameter i | Patterns.cs:78:13:78:24 | ... => ... | | Patterns.cs:76:16:82:9 | ... switch { ... } | Patterns.cs:76:16:76:16 | access to parameter i | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:76:9:82:10 | return ...; | -| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | After > ... | -| Patterns.cs:78:13:78:15 | After > ... | Patterns.cs:78:20:78:24 | "> 1" | +| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | After > ... [match] | +| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | After > ... [no-match] | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:78:13:78:24 | After ... => ... [match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | | Patterns.cs:78:13:78:15 | Before > ... | Patterns.cs:78:15:78:15 | 1 | -| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:24 | After ... => ... [match] | -| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | -| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:13:78:15 | Before > ... | +| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:15 | Before > ... | +| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:20:78:24 | "> 1" | | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | ... => ... | | Patterns.cs:78:15:78:15 | 1 | Patterns.cs:78:13:78:15 | > ... | -| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | After < ... | -| Patterns.cs:79:13:79:15 | After < ... | Patterns.cs:79:20:79:24 | "< 0" | +| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | After < ... [no-match] | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:79:13:79:24 | After ... => ... [match] | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | | Patterns.cs:79:13:79:15 | Before < ... | Patterns.cs:79:15:79:15 | 0 | -| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:24 | After ... => ... [match] | -| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:13:79:15 | Before < ... | +| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:15 | Before < ... | +| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:20:79:24 | "< 0" | | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | ... => ... | | Patterns.cs:79:15:79:15 | 0 | Patterns.cs:79:13:79:15 | < ... | -| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:18:80:20 | "1" | -| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | -| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:13:80:13 | 1 | +| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:13 | After 1 [no-match] | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | +| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:13 | 1 | +| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:18:80:20 | "1" | | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:81:13:81:20 | ... => ... | -| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:18:81:20 | "0" | -| Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:81:13:81:20 | After ... => ... [match] | -| Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:81:13:81:13 | _ | +| Patterns.cs:81:13:81:13 | After _ [match] | Patterns.cs:81:13:81:20 | After ... => ... [match] | +| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:13:81:13 | After _ [match] | +| Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:81:13:81:13 | _ | +| Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:81:18:81:20 | "0" | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:33:85:33 | i | | Patterns.cs:85:26:85:27 | Normal Exit | Patterns.cs:85:26:85:27 | Exit | | Patterns.cs:85:33:85:33 | i | Patterns.cs:85:39:85:69 | ... ? ... : ... | @@ -5754,32 +5774,39 @@ dominance | Switch.cs:11:5:33:5 | {...} | Switch.cs:12:9:32:9 | switch (...) {...} | | Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:12:17:12:17 | access to parameter o | | Switch.cs:12:17:12:17 | access to parameter o | Switch.cs:14:13:14:21 | case ...: | -| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:14:18:14:20 | "a" | +| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:15:17:15:23 | Before return ...; | | Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:16:13:16:19 | case ...: | -| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:13:14:21 | After case ...: [match] | -| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:13:14:21 | After case ...: [no-match] | -| Switch.cs:14:18:14:20 | "a" | Switch.cs:15:17:15:23 | Before return ...; | +| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:18:14:20 | "a" | +| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:18:14:20 | After "a" [match] | +| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:18:14:20 | After "a" [no-match] | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:14:13:14:21 | After case ...: [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:14:13:14:21 | After case ...: [no-match] | | Switch.cs:15:17:15:23 | Before return ...; | Switch.cs:15:17:15:23 | return ...; | -| Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:16:18:16:18 | 0 | +| Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:17:17:17:38 | Before throw ...; | | Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | case ...: | -| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:13:16:19 | After case ...: [match] | -| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:16:18:16:18 | 0 | Switch.cs:17:17:17:38 | Before throw ...; | +| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:18:16:18 | 0 | +| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:18:16:18 | After 0 [match] | +| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:18:16:18 | After 0 [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:16:13:16:19 | After case ...: [no-match] | | Switch.cs:17:17:17:38 | Before throw ...; | Switch.cs:17:23:17:37 | Before object creation of type Exception | | Switch.cs:17:23:17:37 | After object creation of type Exception | Switch.cs:17:17:17:38 | throw ...; | | Switch.cs:17:23:17:37 | Before object creation of type Exception | Switch.cs:17:23:17:37 | object creation of type Exception | | Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:23:17:37 | After object creation of type Exception | -| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:18:18:18:21 | null | +| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:19:17:19:29 | Before goto default; | | Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | case ...: | -| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:18:18:18:21 | null | Switch.cs:19:17:19:29 | Before goto default; | +| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:18:18:21 | null | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:18:13:18:22 | After case ...: [match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | +| Switch.cs:18:18:18:21 | null | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:18:18:18:21 | null | Switch.cs:18:18:18:21 | After null [no-match] | | Switch.cs:19:17:19:29 | Before goto default; | Switch.cs:19:17:19:29 | goto default; | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:20:18:20:22 | Int32 i | +| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:17:22:27 | if (...) ... | | Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | case ...: | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:13:20:23 | After case ...: [no-match] | -| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:21:17:22:27 | if (...) ... | +| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:18:20:22 | Int32 i | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:20:13:20:23 | After case ...: [match] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | +| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:18:20:22 | After Int32 i [no-match] | | Switch.cs:21:17:22:27 | After if (...) ... | Switch.cs:23:17:23:28 | Before goto case ...; | | Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:21:21:21:29 | Before ... == ... | | Switch.cs:21:21:21:21 | access to parameter o | Switch.cs:21:26:21:29 | null | @@ -5792,10 +5819,12 @@ dominance | Switch.cs:22:21:22:27 | Before return ...; | Switch.cs:22:21:22:27 | return ...; | | Switch.cs:23:17:23:28 | Before goto case ...; | Switch.cs:23:27:23:27 | 0 | | Switch.cs:23:27:23:27 | 0 | Switch.cs:23:17:23:28 | goto case ...; | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:18:24:25 | String s | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:13:24:56 | After case ...: [no-match] | -| Switch.cs:24:18:24:25 | String s | Switch.cs:24:32:24:55 | ... && ... | +| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:55 | ... && ... | +| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:18:24:25 | String s | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:13:24:56 | After case ...: [match] | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:24:18:24:25 | String s | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:24:18:24:25 | String s | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:24:32:24:39 | access to property Length | | Switch.cs:24:32:24:39 | After access to property Length | Switch.cs:24:43:24:43 | 0 | | Switch.cs:24:32:24:39 | Before access to property Length | Switch.cs:24:32:24:32 | access to local variable s | @@ -5820,11 +5849,13 @@ dominance | Switch.cs:25:17:25:37 | After ...; | Switch.cs:26:17:26:23 | Before return ...; | | Switch.cs:25:35:25:35 | access to local variable s | Switch.cs:25:17:25:36 | call to method WriteLine | | Switch.cs:26:17:26:23 | Before return ...; | Switch.cs:26:17:26:23 | return ...; | -| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:18:27:25 | Double d | +| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:32:27:38 | Before call to method Throw | | Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:30:13:30:20 | default: | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:32:27:38 | Before call to method Throw | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:27:13:27:39 | After case ...: [match] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | +| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:27:32:27:38 | Before call to method Throw | Switch.cs:27:32:27:38 | call to method Throw | | Switch.cs:28:13:28:17 | Label: | Switch.cs:29:17:29:23 | Before return ...; | | Switch.cs:29:17:29:23 | Before return ...; | Switch.cs:29:17:29:23 | return ...; | @@ -5845,16 +5876,20 @@ dominance | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:45:5:53:5 | After {...} | | Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:46:17:46:17 | access to parameter o | | Switch.cs:46:17:46:17 | access to parameter o | Switch.cs:48:13:48:23 | case ...: | -| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:48:18:48:20 | access to type Int32 | +| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:49:17:49:22 | Before break; | | Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | case ...: | -| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:13:48:23 | After case ...: [match] | -| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:13:48:23 | After case ...: [no-match] | -| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:49:17:49:22 | Before break; | +| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:18:48:20 | access to type Int32 | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:48:13:48:23 | After case ...: [match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:48:13:48:23 | After case ...: [no-match] | +| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:18:48:20 | After access to type Int32 [match] | +| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | | Switch.cs:49:17:49:22 | Before break; | Switch.cs:49:17:49:22 | break; | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:18:50:21 | access to type Boolean | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:13:50:39 | After case ...: [match] | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:13:50:39 | After case ...: [no-match] | -| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:30:50:38 | Before ... != ... | +| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | Before ... != ... | +| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:18:50:21 | access to type Boolean | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:13:50:39 | After case ...: [match] | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | +| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | | Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:50:35:50:38 | null | | Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:30:50:38 | After ... != ... [false] | | Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:30:50:38 | After ... != ... [true] | @@ -5873,16 +5908,20 @@ dominance | Switch.cs:57:17:57:21 | After ... + ... | Switch.cs:59:13:59:19 | case ...: | | Switch.cs:57:17:57:21 | Before ... + ... | Switch.cs:57:17:57:17 | 1 | | Switch.cs:57:21:57:21 | 2 | Switch.cs:57:17:57:21 | ... + ... | -| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:59:18:59:18 | 2 | +| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:60:17:60:22 | Before break; | | Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | case ...: | -| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:13:59:19 | After case ...: [match] | -| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:13:59:19 | After case ...: [no-match] | -| Switch.cs:59:18:59:18 | 2 | Switch.cs:60:17:60:22 | Before break; | +| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:18:59:18 | 2 | +| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:18:59:18 | After 2 [match] | +| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:18:59:18 | After 2 [no-match] | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:59:13:59:19 | After case ...: [match] | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:59:13:59:19 | After case ...: [no-match] | | Switch.cs:60:17:60:22 | Before break; | Switch.cs:60:17:60:22 | break; | -| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:61:18:61:18 | 3 | -| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:13:61:19 | After case ...: [no-match] | -| Switch.cs:61:18:61:18 | 3 | Switch.cs:62:17:62:22 | Before break; | +| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:62:17:62:22 | Before break; | +| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:18:61:18 | 3 | +| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:18:61:18 | After 3 [no-match] | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:61:13:61:19 | After case ...: [match] | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | | Switch.cs:62:17:62:22 | Before break; | Switch.cs:62:17:62:22 | break; | | Switch.cs:66:10:66:11 | Entry | Switch.cs:66:20:66:20 | s | | Switch.cs:66:10:66:11 | Normal Exit | Switch.cs:66:10:66:11 | Exit | @@ -5895,16 +5934,20 @@ dominance | Switch.cs:68:17:68:25 | After (...) ... | Switch.cs:70:13:70:23 | case ...: | | Switch.cs:68:17:68:25 | Before (...) ... | Switch.cs:68:25:68:25 | access to parameter s | | Switch.cs:68:25:68:25 | access to parameter s | Switch.cs:68:17:68:25 | (...) ... | -| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:70:18:70:20 | access to type Int32 | +| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:71:17:71:22 | Before break; | | Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | case ...: | -| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:13:70:23 | After case ...: [match] | -| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:13:70:23 | After case ...: [no-match] | -| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:71:17:71:22 | Before break; | +| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:18:70:20 | access to type Int32 | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:70:13:70:23 | After case ...: [match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:70:13:70:23 | After case ...: [no-match] | +| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:18:70:20 | After access to type Int32 [match] | +| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | | Switch.cs:71:17:71:22 | Before break; | Switch.cs:71:17:71:22 | break; | -| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:72:18:72:19 | "" | -| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:13:72:20 | After case ...: [no-match] | -| Switch.cs:72:18:72:19 | "" | Switch.cs:73:17:73:22 | Before break; | +| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:73:17:73:22 | Before break; | +| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:18:72:19 | "" | +| Switch.cs:72:18:72:19 | "" | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:72:18:72:19 | "" | Switch.cs:72:18:72:19 | After "" [no-match] | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:72:13:72:20 | After case ...: [match] | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | | Switch.cs:73:17:73:22 | Before break; | Switch.cs:73:17:73:22 | break; | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:17:77:17 | i | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:77:10:77:11 | Exit | @@ -5914,17 +5957,21 @@ dominance | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:88:9:88:21 | Before return ...; | | Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:79:17:79:17 | access to parameter i | | Switch.cs:79:17:79:17 | access to parameter i | Switch.cs:81:13:81:19 | case ...: | -| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:81:18:81:18 | 1 | +| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:82:17:82:28 | Before return ...; | | Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | case ...: | -| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:13:81:19 | After case ...: [match] | -| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:13:81:19 | After case ...: [no-match] | -| Switch.cs:81:18:81:18 | 1 | Switch.cs:82:17:82:28 | Before return ...; | +| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:18:81:18 | 1 | +| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:18:81:18 | After 1 [match] | +| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:18:81:18 | After 1 [no-match] | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:81:13:81:19 | After case ...: [match] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:81:13:81:19 | After case ...: [no-match] | | Switch.cs:82:17:82:28 | Before return ...; | Switch.cs:82:24:82:27 | true | | Switch.cs:82:24:82:27 | true | Switch.cs:82:17:82:28 | return ...; | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:83:18:83:18 | 2 | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:13:83:19 | After case ...: [match] | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:13:83:19 | After case ...: [no-match] | -| Switch.cs:83:18:83:18 | 2 | Switch.cs:84:17:85:26 | if (...) ... | +| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:17:85:26 | if (...) ... | +| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:18:83:18 | 2 | +| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:18:83:18 | After 2 [no-match] | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:83:13:83:19 | After case ...: [match] | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | | Switch.cs:84:17:85:26 | After if (...) ... | Switch.cs:86:17:86:28 | Before return ...; | | Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:84:21:84:25 | Before ... > ... | | Switch.cs:84:21:84:21 | access to parameter j | Switch.cs:84:25:84:25 | 2 | @@ -5946,11 +5993,13 @@ dominance | Switch.cs:93:9:97:9 | After switch (...) {...} | Switch.cs:98:9:98:21 | Before return ...; | | Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:93:17:93:17 | access to parameter o | | Switch.cs:93:17:93:17 | access to parameter o | Switch.cs:95:13:95:23 | case ...: | -| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:95:18:95:20 | access to type Int32 | +| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:96:17:96:28 | Before return ...; | | Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:93:9:97:9 | After switch (...) {...} | -| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:13:95:23 | After case ...: [match] | -| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:13:95:23 | After case ...: [no-match] | -| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:96:17:96:28 | Before return ...; | +| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:18:95:20 | access to type Int32 | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:95:13:95:23 | After case ...: [match] | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:95:13:95:23 | After case ...: [no-match] | +| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:18:95:20 | After access to type Int32 [match] | +| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | | Switch.cs:96:17:96:28 | Before return ...; | Switch.cs:96:24:96:27 | true | | Switch.cs:96:24:96:27 | true | Switch.cs:96:17:96:28 | return ...; | | Switch.cs:98:9:98:21 | Before return ...; | Switch.cs:98:16:98:20 | false | @@ -5966,18 +6015,22 @@ dominance | Switch.cs:103:17:103:17 | access to parameter s | Switch.cs:103:17:103:17 | After access to parameter s [null] | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | case ...: | | Switch.cs:103:17:103:25 | Before access to property Length | Switch.cs:103:17:103:17 | access to parameter s | -| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:18:105:18 | 0 | +| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:21:105:29 | Before return ...; | | Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | case ...: | -| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:21:105:29 | Before return ...; | +| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:18:105:18 | 0 | +| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:18:105:18 | After 0 [no-match] | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:105:13:105:19 | After case ...: [match] | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:105:13:105:19 | After case ...: [no-match] | | Switch.cs:105:21:105:29 | Before return ...; | Switch.cs:105:28:105:28 | 0 | | Switch.cs:105:28:105:28 | 0 | Switch.cs:105:21:105:29 | return ...; | -| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:18:106:18 | 1 | +| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:21:106:29 | Before return ...; | | Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:103:9:107:9 | After switch (...) {...} | -| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:13:106:19 | After case ...: [no-match] | -| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:21:106:29 | Before return ...; | +| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:18:106:18 | 1 | +| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:18:106:18 | After 1 [no-match] | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:106:13:106:19 | After case ...: [match] | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:106:13:106:19 | After case ...: [no-match] | | Switch.cs:106:21:106:29 | Before return ...; | Switch.cs:106:28:106:28 | 1 | | Switch.cs:106:28:106:28 | 1 | Switch.cs:106:21:106:29 | return ...; | | Switch.cs:108:9:108:18 | Before return ...; | Switch.cs:108:16:108:17 | Before -... | @@ -6002,10 +6055,12 @@ dominance | Switch.cs:115:17:115:24 | After access to property Length | Switch.cs:117:13:117:35 | case ...: | | Switch.cs:115:17:115:24 | Before access to property Length | Switch.cs:115:17:115:17 | access to parameter s | | Switch.cs:115:17:115:24 | access to property Length | Switch.cs:115:17:115:24 | After access to property Length | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:18:117:18 | 3 | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:13:117:35 | After case ...: [match] | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:13:117:35 | After case ...: [no-match] | -| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:25:117:34 | Before ... == ... | +| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | Before ... == ... | +| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:18:117:18 | 3 | +| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:18:117:18 | After 3 [match] | +| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:18:117:18 | After 3 [no-match] | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:13:117:35 | After case ...: [match] | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:117:13:117:35 | After case ...: [no-match] | | Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:117:30:117:34 | "foo" | | Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:25:117:34 | After ... == ... [false] | | Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:25:117:34 | After ... == ... [true] | @@ -6014,10 +6069,12 @@ dominance | Switch.cs:117:30:117:34 | "foo" | Switch.cs:117:25:117:34 | ... == ... | | Switch.cs:117:37:117:45 | Before return ...; | Switch.cs:117:44:117:44 | 1 | | Switch.cs:117:44:117:44 | 1 | Switch.cs:117:37:117:45 | return ...; | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:18:118:18 | 2 | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [match] | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [no-match] | -| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:25:118:33 | Before ... == ... | +| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | Before ... == ... | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | 2 | +| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:18:118:18 | After 2 [no-match] | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:13:118:34 | After case ...: [match] | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:118:13:118:34 | After case ...: [no-match] | | Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:118:30:118:33 | "fu" | | Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:25:118:33 | After ... == ... [false] | | Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:25:118:33 | After ... == ... [true] | @@ -6041,14 +6098,17 @@ dominance | Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:125:13:125:13 | access to parameter o | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:125:9:126:19 | After if (...) ... | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:126:13:126:19 | Before return ...; | -| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:34:125:34 | access to local variable b | -| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:34 | After ... => ... [match] | -| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:34 | After ... => ... [no-match] | -| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:24:125:29 | Boolean b | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:125:24:125:34 | After ... => ... [match] | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:125:24:125:34 | After ... => ... [no-match] | +| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:29 | After Boolean b [match] | +| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:29 | After Boolean b [no-match] | +| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:29 | Boolean b | +| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:34:125:34 | access to local variable b | | Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:125:37:125:46 | ... => ... | -| Switch.cs:125:37:125:37 | _ | Switch.cs:125:42:125:46 | false | -| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:37:125:46 | After ... => ... [match] | -| Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:125:37:125:37 | _ | +| Switch.cs:125:37:125:37 | After _ [match] | Switch.cs:125:37:125:46 | After ... => ... [match] | +| Switch.cs:125:37:125:37 | _ | Switch.cs:125:37:125:37 | After _ [match] | +| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:37:125:37 | _ | +| Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:125:42:125:46 | false | | Switch.cs:126:13:126:19 | Before return ...; | Switch.cs:126:13:126:19 | return ...; | | Switch.cs:129:12:129:14 | Entry | Switch.cs:129:23:129:23 | o | | Switch.cs:129:12:129:14 | Normal Exit | Switch.cs:129:12:129:14 | Exit | @@ -6061,14 +6121,17 @@ dominance | Switch.cs:131:17:131:17 | access to parameter o | Switch.cs:131:28:131:40 | ... => ... | | Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:131:17:131:17 | access to parameter o | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:131:16:131:66 | call to method ToString | -| Switch.cs:131:28:131:35 | String s | Switch.cs:131:40:131:40 | access to local variable s | -| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:40 | After ... => ... [match] | -| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:40 | After ... => ... [no-match] | -| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:28:131:35 | String s | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:131:28:131:40 | After ... => ... [match] | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:131:28:131:40 | After ... => ... [no-match] | +| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:35 | After String s [match] | +| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:35 | After String s [no-match] | +| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:35 | String s | +| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:40:131:40 | access to local variable s | | Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:131:43:131:51 | ... => ... | -| Switch.cs:131:43:131:43 | _ | Switch.cs:131:48:131:51 | null | -| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:51 | After ... => ... [match] | -| Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:131:43:131:43 | _ | +| Switch.cs:131:43:131:43 | After _ [match] | Switch.cs:131:43:131:51 | After ... => ... [match] | +| Switch.cs:131:43:131:43 | _ | Switch.cs:131:43:131:43 | After _ [match] | +| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:43 | _ | +| Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:131:48:131:51 | null | | Switch.cs:134:9:134:11 | Entry | Switch.cs:134:17:134:17 | i | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:134:9:134:11 | Exit | | Switch.cs:134:17:134:17 | i | Switch.cs:135:5:142:5 | {...} | @@ -6082,18 +6145,22 @@ dominance | Switch.cs:138:29:138:30 | After -... | Switch.cs:138:22:138:31 | return ...; | | Switch.cs:138:29:138:30 | Before -... | Switch.cs:138:30:138:30 | 1 | | Switch.cs:138:30:138:30 | 1 | Switch.cs:138:29:138:30 | -... | -| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:18:139:18 | 1 | +| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:21:139:29 | Before return ...; | | Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | case ...: | -| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:13:139:19 | After case ...: [match] | -| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:13:139:19 | After case ...: [no-match] | -| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:21:139:29 | Before return ...; | +| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:18:139:18 | 1 | +| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:18:139:18 | After 1 [match] | +| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:18:139:18 | After 1 [no-match] | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:139:13:139:19 | After case ...: [match] | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:139:13:139:19 | After case ...: [no-match] | | Switch.cs:139:21:139:29 | Before return ...; | Switch.cs:139:28:139:28 | 1 | | Switch.cs:139:28:139:28 | 1 | Switch.cs:139:21:139:29 | return ...; | -| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:18:140:18 | 2 | +| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:21:140:29 | Before return ...; | | Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:138:13:138:20 | default: | -| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:13:140:19 | After case ...: [no-match] | -| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:21:140:29 | Before return ...; | +| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:18:140:18 | 2 | +| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:18:140:18 | After 2 [no-match] | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:140:13:140:19 | After case ...: [match] | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:140:13:140:19 | After case ...: [no-match] | | Switch.cs:140:21:140:29 | Before return ...; | Switch.cs:140:28:140:28 | 2 | | Switch.cs:140:28:140:28 | 2 | Switch.cs:140:21:140:29 | return ...; | | Switch.cs:144:9:144:11 | Entry | Switch.cs:144:17:144:17 | i | @@ -6102,11 +6169,13 @@ dominance | Switch.cs:145:5:152:5 | {...} | Switch.cs:146:9:151:9 | switch (...) {...} | | Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:146:17:146:17 | access to parameter i | | Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:148:13:148:19 | case ...: | -| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:18:148:18 | 1 | +| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:21:148:29 | Before return ...; | | Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | case ...: | -| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:13:148:19 | After case ...: [match] | -| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:13:148:19 | After case ...: [no-match] | -| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:21:148:29 | Before return ...; | +| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:18:148:18 | 1 | +| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:18:148:18 | After 1 [match] | +| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:18:148:18 | After 1 [no-match] | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:148:13:148:19 | After case ...: [match] | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:148:13:148:19 | After case ...: [no-match] | | Switch.cs:148:21:148:29 | Before return ...; | Switch.cs:148:28:148:28 | 1 | | Switch.cs:148:28:148:28 | 1 | Switch.cs:148:21:148:29 | return ...; | | Switch.cs:149:13:149:20 | After default: [match] | Switch.cs:149:22:149:31 | Before return ...; | @@ -6116,11 +6185,13 @@ dominance | Switch.cs:149:29:149:30 | After -... | Switch.cs:149:22:149:31 | return ...; | | Switch.cs:149:29:149:30 | Before -... | Switch.cs:149:30:149:30 | 1 | | Switch.cs:149:30:149:30 | 1 | Switch.cs:149:29:149:30 | -... | -| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:18:150:18 | 2 | +| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:21:150:29 | Before return ...; | | Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:149:13:149:20 | default: | -| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:13:150:19 | After case ...: [no-match] | -| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:21:150:29 | Before return ...; | +| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:18:150:18 | 2 | +| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:18:150:18 | After 2 [no-match] | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:150:13:150:19 | After case ...: [match] | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:150:13:150:19 | After case ...: [no-match] | | Switch.cs:150:21:150:29 | Before return ...; | Switch.cs:150:28:150:28 | 2 | | Switch.cs:150:28:150:28 | 2 | Switch.cs:150:21:150:29 | return ...; | | Switch.cs:154:10:154:12 | Entry | Switch.cs:154:19:154:19 | b | @@ -6137,15 +6208,19 @@ dominance | Switch.cs:156:17:156:17 | access to parameter b | Switch.cs:156:28:156:38 | ... => ... | | Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:156:17:156:17 | access to parameter b | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:13:156:54 | String s = ... | -| Switch.cs:156:28:156:31 | true | Switch.cs:156:36:156:38 | "a" | -| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:38 | After ... => ... [match] | -| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:28:156:31 | true | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:156:28:156:38 | After ... => ... [match] | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:28:156:38 | After ... => ... [no-match] | +| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:31 | true | +| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:36:156:38 | "a" | | Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | ... => ... | -| Switch.cs:156:41:156:45 | false | Switch.cs:156:50:156:52 | "b" | -| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:52 | After ... => ... [no-match] | -| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:41:156:45 | false | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:156:41:156:52 | After ... => ... [match] | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | +| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:45 | After false [no-match] | +| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:45 | false | +| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:50:156:52 | "b" | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:155:5:161:5 | After {...} | | Switch.cs:157:9:160:49 | if (...) ... | Switch.cs:157:13:157:13 | access to parameter b | | Switch.cs:157:13:157:13 | After access to parameter b [false] | Switch.cs:160:13:160:49 | ...; | @@ -6184,14 +6259,18 @@ dominance | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:164:5:178:5 | After {...} | | Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:165:17:165:17 | access to parameter i | | Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:167:13:167:19 | case ...: | -| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:167:18:167:18 | 1 | | Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | case ...: | -| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:13:167:19 | After case ...: [match] | -| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:13:167:19 | After case ...: [no-match] | -| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:168:18:168:18 | 2 | +| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:18:167:18 | 1 | +| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | After 1 [no-match] | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:167:13:167:19 | After case ...: [match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:167:13:167:19 | After case ...: [no-match] | | Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | case ...: | -| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | After case ...: [match] | -| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | After case ...: [no-match] | +| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:18:168:18 | 2 | +| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | After 2 [no-match] | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:168:13:168:19 | After case ...: [match] | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:168:13:168:19 | After case ...: [no-match] | | Switch.cs:169:17:169:50 | After call to method WriteLine | Switch.cs:169:17:169:51 | After ...; | | Switch.cs:169:17:169:50 | Before call to method WriteLine | Switch.cs:169:42:169:49 | "1 or 2" | | Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:169:17:169:50 | After call to method WriteLine | @@ -6199,11 +6278,13 @@ dominance | Switch.cs:169:17:169:51 | After ...; | Switch.cs:170:17:170:22 | Before break; | | Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:17:169:50 | call to method WriteLine | | Switch.cs:170:17:170:22 | Before break; | Switch.cs:170:17:170:22 | break; | -| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:171:18:171:18 | 3 | +| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:172:17:172:46 | ...; | | Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:174:13:174:20 | default: | -| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | After case ...: [no-match] | -| Switch.cs:171:18:171:18 | 3 | Switch.cs:172:17:172:46 | ...; | +| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:18:171:18 | 3 | +| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | After 3 [no-match] | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:171:13:171:19 | After case ...: [match] | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | | Switch.cs:172:17:172:45 | After call to method WriteLine | Switch.cs:172:17:172:46 | After ...; | | Switch.cs:172:17:172:45 | Before call to method WriteLine | Switch.cs:172:42:172:44 | "3" | | Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:172:17:172:45 | After call to method WriteLine | @@ -6569,11 +6650,12 @@ dominance | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:51:9:59:9 | switch (...) {...} | | cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:39:17:39:17 | access to parameter a | | cflow.cs:39:17:39:17 | access to parameter a | cflow.cs:41:13:41:19 | case ...: | -| cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:41:18:41:18 | 1 | +| cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:42:17:42:39 | ...; | | cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | case ...: | -| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:13:41:19 | After case ...: [match] | -| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:41:18:41:18 | 1 | cflow.cs:42:17:42:39 | ...; | +| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:18:41:18 | 1 | +| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:18:41:18 | After 1 [match] | +| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:18:41:18 | After 1 [no-match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:41:13:41:19 | After case ...: [no-match] | | cflow.cs:42:17:42:38 | After call to method WriteLine | cflow.cs:42:17:42:39 | After ...; | | cflow.cs:42:17:42:38 | Before call to method WriteLine | cflow.cs:42:35:42:37 | "1" | | cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:42:17:42:38 | After call to method WriteLine | @@ -6582,10 +6664,12 @@ dominance | cflow.cs:42:35:42:37 | "1" | cflow.cs:42:17:42:38 | call to method WriteLine | | cflow.cs:43:17:43:28 | Before goto case ...; | cflow.cs:43:27:43:27 | 2 | | cflow.cs:43:27:43:27 | 2 | cflow.cs:43:17:43:28 | goto case ...; | -| cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:44:18:44:18 | 2 | +| cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:45:17:45:39 | ...; | | cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | case ...: | -| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:44:18:44:18 | 2 | cflow.cs:45:17:45:39 | ...; | +| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:18:44:18 | 2 | +| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:18:44:18 | After 2 [match] | +| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:44:13:44:19 | After case ...: [no-match] | | cflow.cs:45:17:45:38 | After call to method WriteLine | cflow.cs:45:17:45:39 | After ...; | | cflow.cs:45:17:45:38 | Before call to method WriteLine | cflow.cs:45:35:45:37 | "2" | | cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:45:17:45:38 | After call to method WriteLine | @@ -6594,10 +6678,12 @@ dominance | cflow.cs:45:35:45:37 | "2" | cflow.cs:45:17:45:38 | call to method WriteLine | | cflow.cs:46:17:46:28 | Before goto case ...; | cflow.cs:46:27:46:27 | 1 | | cflow.cs:46:27:46:27 | 1 | cflow.cs:46:17:46:28 | goto case ...; | -| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:47:18:47:18 | 3 | -| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:13:47:19 | After case ...: [no-match] | -| cflow.cs:47:18:47:18 | 3 | cflow.cs:48:17:48:39 | ...; | +| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:48:17:48:39 | ...; | +| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:18:47:18 | 3 | +| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:18:47:18 | After 3 [no-match] | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:47:13:47:19 | After case ...: [match] | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | | cflow.cs:48:17:48:38 | After call to method WriteLine | cflow.cs:48:17:48:39 | After ...; | | cflow.cs:48:17:48:38 | Before call to method WriteLine | cflow.cs:48:35:48:37 | "3" | | cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:48:17:48:38 | After call to method WriteLine | @@ -6608,11 +6694,13 @@ dominance | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:60:9:66:9 | switch (...) {...} | | cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:51:17:51:17 | access to parameter a | | cflow.cs:51:17:51:17 | access to parameter a | cflow.cs:53:13:53:20 | case ...: | -| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:53:18:53:19 | 42 | +| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:54:17:54:48 | ...; | | cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:56:13:56:20 | default: | -| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:13:53:20 | After case ...: [no-match] | -| cflow.cs:53:18:53:19 | 42 | cflow.cs:54:17:54:48 | ...; | +| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:18:53:19 | 42 | +| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:18:53:19 | After 42 [no-match] | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:53:13:53:20 | After case ...: [match] | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | | cflow.cs:54:17:54:47 | After call to method WriteLine | cflow.cs:54:17:54:48 | After ...; | | cflow.cs:54:17:54:47 | Before call to method WriteLine | cflow.cs:54:35:54:46 | "The answer" | | cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:54:17:54:47 | After call to method WriteLine | @@ -6638,10 +6726,12 @@ dominance | cflow.cs:60:27:60:31 | Before access to field Field | cflow.cs:60:27:60:31 | this access | | cflow.cs:60:27:60:31 | access to field Field | cflow.cs:60:27:60:31 | After access to field Field | | cflow.cs:60:27:60:31 | this access | cflow.cs:60:27:60:31 | access to field Field | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:62:18:62:18 | 0 | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:13:62:19 | After case ...: [no-match] | -| cflow.cs:62:18:62:18 | 0 | cflow.cs:63:17:64:55 | if (...) ... | +| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:17:64:55 | if (...) ... | +| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:18:62:18 | 0 | +| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:18:62:18 | After 0 [no-match] | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:62:13:62:19 | After case ...: [match] | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | | cflow.cs:63:17:64:55 | After if (...) ... | cflow.cs:65:17:65:22 | Before break; | | cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:63:21:63:34 | !... | | cflow.cs:63:21:63:34 | !... | cflow.cs:63:23:63:33 | Before ... == ... | @@ -7528,17 +7618,21 @@ dominance | cflow.cs:246:17:246:32 | After ... + ... | cflow.cs:248:13:248:19 | case ...: | | cflow.cs:246:17:246:32 | Before ... + ... | cflow.cs:246:17:246:28 | Before access to property Length | | cflow.cs:246:32:246:32 | 3 | cflow.cs:246:17:246:32 | ... + ... | -| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:248:18:248:18 | 0 | +| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:249:17:249:29 | Before goto default; | | cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | case ...: | -| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:248:18:248:18 | 0 | cflow.cs:249:17:249:29 | Before goto default; | +| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:18:248:18 | 0 | +| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:248:13:248:19 | After case ...: [match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:248:13:248:19 | After case ...: [no-match] | | cflow.cs:249:17:249:29 | Before goto default; | cflow.cs:249:17:249:29 | goto default; | -| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:250:18:250:18 | 1 | +| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:251:17:251:37 | ...; | | cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | case ...: | -| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:250:18:250:18 | 1 | cflow.cs:251:17:251:37 | ...; | +| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:18:250:18 | 1 | +| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:250:13:250:19 | After case ...: [match] | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:250:13:250:19 | After case ...: [no-match] | | cflow.cs:251:17:251:36 | After call to method WriteLine | cflow.cs:251:17:251:37 | After ...; | | cflow.cs:251:17:251:36 | Before call to method WriteLine | cflow.cs:251:35:251:35 | 1 | | cflow.cs:251:17:251:36 | call to method WriteLine | cflow.cs:251:17:251:36 | After call to method WriteLine | @@ -7546,11 +7640,13 @@ dominance | cflow.cs:251:17:251:37 | After ...; | cflow.cs:252:17:252:22 | Before break; | | cflow.cs:251:35:251:35 | 1 | cflow.cs:251:17:251:36 | call to method WriteLine | | cflow.cs:252:17:252:22 | Before break; | cflow.cs:252:17:252:22 | break; | -| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:253:18:253:18 | 2 | +| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:254:17:254:27 | Before goto ...; | | cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:255:13:255:20 | default: | -| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:13:253:19 | After case ...: [no-match] | -| cflow.cs:253:18:253:18 | 2 | cflow.cs:254:17:254:27 | Before goto ...; | +| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:18:253:18 | 2 | +| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:18:253:18 | After 2 [no-match] | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:253:13:253:19 | After case ...: [match] | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | | cflow.cs:254:17:254:27 | Before goto ...; | cflow.cs:254:17:254:27 | goto ...; | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:256:17:256:37 | ...; | | cflow.cs:256:17:256:36 | After call to method WriteLine | cflow.cs:256:17:256:37 | After ...; | @@ -12871,15 +12967,19 @@ postDominance | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:37:17:37:22 | break; | | Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:8:9:18:9 | After if (...) ... | | Patterns.cs:20:17:20:17 | access to local variable o | Patterns.cs:20:9:38:9 | switch (...) {...} | +| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | | Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:20:17:20:17 | access to local variable o | -| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:23:17:23:22 | Before break; | Patterns.cs:22:18:22:22 | "xyz" | +| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:13:22:23 | case ...: | +| Patterns.cs:23:17:23:22 | Before break; | Patterns.cs:22:13:22:23 | After case ...: [match] | | Patterns.cs:23:17:23:22 | break; | Patterns.cs:23:17:23:22 | Before break; | +| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:13:24:36 | After case ...: [match] | +| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:13:24:36 | case ...: | | Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:24:30:24:35 | Before ... > ... | | Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:35:24:35 | 0 | -| Patterns.cs:24:30:24:35 | Before ... > ... | Patterns.cs:24:18:24:23 | Int32 i2 | +| Patterns.cs:24:30:24:35 | Before ... > ... | Patterns.cs:24:13:24:36 | After case ...: [match] | | Patterns.cs:24:35:24:35 | 0 | Patterns.cs:24:30:24:31 | access to local variable i2 | | Patterns.cs:25:17:25:51 | After call to method WriteLine | Patterns.cs:25:17:25:51 | call to method WriteLine | | Patterns.cs:25:17:25:51 | Before call to method WriteLine | Patterns.cs:25:17:25:52 | ...; | @@ -12896,13 +12996,15 @@ postDominance | Patterns.cs:25:47:25:48 | access to local variable i2 | Patterns.cs:25:46:25:49 | Before {...} | | Patterns.cs:26:17:26:22 | Before break; | Patterns.cs:25:17:25:52 | After ...; | | Patterns.cs:26:17:26:22 | break; | Patterns.cs:26:17:26:22 | Before break; | +| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:24:13:24:36 | After case ...: [no-match] | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:24:30:24:35 | After ... > ... [false] | -| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:13:27:24 | After case ...: [match] | +| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:13:27:24 | case ...: | | Patterns.cs:28:17:28:46 | After call to method WriteLine | Patterns.cs:28:17:28:46 | call to method WriteLine | | Patterns.cs:28:17:28:46 | Before call to method WriteLine | Patterns.cs:28:17:28:47 | ...; | | Patterns.cs:28:17:28:46 | call to method WriteLine | Patterns.cs:28:35:28:45 | After $"..." | -| Patterns.cs:28:17:28:47 | ...; | Patterns.cs:27:18:27:23 | Int32 i3 | +| Patterns.cs:28:17:28:47 | ...; | Patterns.cs:27:13:27:24 | After case ...: [match] | | Patterns.cs:28:17:28:47 | After ...; | Patterns.cs:28:17:28:46 | After call to method WriteLine | | Patterns.cs:28:35:28:45 | $"..." | Patterns.cs:28:41:28:44 | After {...} | | Patterns.cs:28:35:28:45 | After $"..." | Patterns.cs:28:35:28:45 | $"..." | @@ -12914,12 +13016,14 @@ postDominance | Patterns.cs:28:42:28:43 | access to local variable i3 | Patterns.cs:28:41:28:44 | Before {...} | | Patterns.cs:29:17:29:22 | Before break; | Patterns.cs:28:17:28:47 | After ...; | | Patterns.cs:29:17:29:22 | break; | Patterns.cs:29:17:29:22 | Before break; | +| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:30:18:30:26 | After String s2 [no-match] | | Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [no-match] | -| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:13:30:27 | After case ...: [match] | +| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:13:30:27 | case ...: | | Patterns.cs:31:17:31:49 | After call to method WriteLine | Patterns.cs:31:17:31:49 | call to method WriteLine | | Patterns.cs:31:17:31:49 | Before call to method WriteLine | Patterns.cs:31:17:31:50 | ...; | | Patterns.cs:31:17:31:49 | call to method WriteLine | Patterns.cs:31:35:31:48 | After $"..." | -| Patterns.cs:31:17:31:50 | ...; | Patterns.cs:30:18:30:26 | String s2 | +| Patterns.cs:31:17:31:50 | ...; | Patterns.cs:30:13:30:27 | After case ...: [match] | | Patterns.cs:31:17:31:50 | After ...; | Patterns.cs:31:17:31:49 | After call to method WriteLine | | Patterns.cs:31:35:31:48 | $"..." | Patterns.cs:31:44:31:47 | After {...} | | Patterns.cs:31:35:31:48 | After $"..." | Patterns.cs:31:35:31:48 | $"..." | @@ -12931,9 +13035,11 @@ postDominance | Patterns.cs:31:45:31:46 | access to local variable s2 | Patterns.cs:31:44:31:47 | Before {...} | | Patterns.cs:32:17:32:22 | Before break; | Patterns.cs:31:17:31:50 | After ...; | | Patterns.cs:32:17:32:22 | break; | Patterns.cs:32:17:32:22 | Before break; | +| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | | Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:34:17:34:22 | Before break; | Patterns.cs:33:18:33:23 | Object v2 | +| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:13:33:24 | case ...: | +| Patterns.cs:34:17:34:22 | Before break; | Patterns.cs:33:13:33:24 | After case ...: [match] | | Patterns.cs:34:17:34:22 | break; | Patterns.cs:34:17:34:22 | Before break; | | Patterns.cs:35:13:35:20 | After default: [match] | Patterns.cs:35:13:35:20 | default: | | Patterns.cs:35:13:35:20 | default: | Patterns.cs:33:13:33:24 | After case ...: [no-match] | @@ -13016,16 +13122,18 @@ postDominance | Patterns.cs:58:16:62:9 | ... switch { ... } | Patterns.cs:58:9:62:10 | Before return ...; | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:60:22:60:28 | "not 1" | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:61:18:61:24 | "other" | -| Patterns.cs:60:13:60:17 | After not ... | Patterns.cs:60:13:60:17 | not ... | -| Patterns.cs:60:13:60:17 | Before not ... | Patterns.cs:60:13:60:28 | After ... => ... [match] | +| Patterns.cs:60:13:60:17 | Before not ... | Patterns.cs:60:13:60:28 | ... => ... | | Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:17:60:17 | 1 | | Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:58:16:58:16 | access to parameter i | +| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:13:60:17 | After not ... [match] | +| Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:60:13:60:17 | After not ... [no-match] | | Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:13:60:17 | Before not ... | -| Patterns.cs:60:22:60:28 | "not 1" | Patterns.cs:60:13:60:17 | After not ... | -| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:13:61:24 | After ... => ... [match] | +| Patterns.cs:60:22:60:28 | "not 1" | Patterns.cs:60:13:60:28 | After ... => ... [match] | +| Patterns.cs:61:13:61:13 | After _ [match] | Patterns.cs:61:13:61:13 | _ | +| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:13:61:24 | ... => ... | | Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | -| Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:61:13:61:24 | ... => ... | -| Patterns.cs:61:18:61:24 | "other" | Patterns.cs:61:13:61:13 | _ | +| Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:61:13:61:13 | After _ [match] | +| Patterns.cs:61:18:61:24 | "other" | Patterns.cs:61:13:61:24 | After ... => ... [match] | | Patterns.cs:65:26:65:27 | Exit | Patterns.cs:65:26:65:27 | Normal Exit | | Patterns.cs:65:26:65:27 | Normal Exit | Patterns.cs:67:9:71:10 | return ...; | | Patterns.cs:66:5:72:5 | {...} | Patterns.cs:65:26:65:27 | Entry | @@ -13036,15 +13144,18 @@ postDominance | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:69:22:69:33 | "impossible" | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:70:18:70:27 | "possible" | -| Patterns.cs:69:13:69:17 | After not ... | Patterns.cs:69:13:69:17 | not ... | -| Patterns.cs:69:13:69:17 | Before not ... | Patterns.cs:69:13:69:33 | After ... => ... [match] | +| Patterns.cs:69:13:69:17 | Before not ... | Patterns.cs:69:13:69:33 | ... => ... | | Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:17:69:17 | 2 | | Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:67:16:67:16 | 2 | +| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:13:69:17 | After not ... [match] | +| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:69:13:69:17 | After not ... [no-match] | | Patterns.cs:69:17:69:17 | 2 | Patterns.cs:69:13:69:17 | Before not ... | -| Patterns.cs:69:22:69:33 | "impossible" | Patterns.cs:69:13:69:17 | After not ... | -| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:27 | After ... => ... [match] | +| Patterns.cs:69:22:69:33 | "impossible" | Patterns.cs:69:13:69:33 | After ... => ... [match] | +| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:27 | ... => ... | | Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | -| Patterns.cs:70:18:70:27 | "possible" | Patterns.cs:70:13:70:13 | 2 | +| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:70:13:70:13 | After 2 [no-match] | +| Patterns.cs:70:18:70:27 | "possible" | Patterns.cs:70:13:70:27 | After ... => ... [match] | | Patterns.cs:74:26:74:27 | Exit | Patterns.cs:74:26:74:27 | Normal Exit | | Patterns.cs:74:26:74:27 | Normal Exit | Patterns.cs:76:9:82:10 | return ...; | | Patterns.cs:74:33:74:33 | i | Patterns.cs:74:26:74:27 | Entry | @@ -13058,24 +13169,29 @@ postDominance | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:80:18:80:20 | "1" | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:81:18:81:20 | "0" | | Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:15:78:15 | 1 | -| Patterns.cs:78:13:78:15 | After > ... | Patterns.cs:78:13:78:15 | > ... | -| Patterns.cs:78:13:78:15 | Before > ... | Patterns.cs:78:13:78:24 | After ... => ... [match] | +| Patterns.cs:78:13:78:15 | Before > ... | Patterns.cs:78:13:78:24 | ... => ... | | Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:76:16:76:16 | access to parameter i | +| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:13:78:15 | After > ... [match] | +| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:78:13:78:15 | After > ... [no-match] | | Patterns.cs:78:15:78:15 | 1 | Patterns.cs:78:13:78:15 | Before > ... | -| Patterns.cs:78:20:78:24 | "> 1" | Patterns.cs:78:13:78:15 | After > ... | +| Patterns.cs:78:20:78:24 | "> 1" | Patterns.cs:78:13:78:24 | After ... => ... [match] | | Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:15:79:15 | 0 | -| Patterns.cs:79:13:79:15 | After < ... | Patterns.cs:79:13:79:15 | < ... | -| Patterns.cs:79:13:79:15 | Before < ... | Patterns.cs:79:13:79:24 | After ... => ... [match] | +| Patterns.cs:79:13:79:15 | Before < ... | Patterns.cs:79:13:79:24 | ... => ... | | Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | +| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [no-match] | | Patterns.cs:79:15:79:15 | 0 | Patterns.cs:79:13:79:15 | Before < ... | -| Patterns.cs:79:20:79:24 | "< 0" | Patterns.cs:79:13:79:15 | After < ... | -| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:20 | After ... => ... [match] | +| Patterns.cs:79:20:79:24 | "< 0" | Patterns.cs:79:13:79:24 | After ... => ... [match] | +| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:20 | ... => ... | | Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:80:18:80:20 | "1" | Patterns.cs:80:13:80:13 | 1 | -| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:13:81:20 | After ... => ... [match] | +| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | +| Patterns.cs:80:18:80:20 | "1" | Patterns.cs:80:13:80:20 | After ... => ... [match] | +| Patterns.cs:81:13:81:13 | After _ [match] | Patterns.cs:81:13:81:13 | _ | +| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:13:81:20 | ... => ... | | Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | -| Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:81:13:81:20 | ... => ... | -| Patterns.cs:81:18:81:20 | "0" | Patterns.cs:81:13:81:13 | _ | +| Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:81:13:81:13 | After _ [match] | +| Patterns.cs:81:18:81:20 | "0" | Patterns.cs:81:13:81:20 | After ... => ... [match] | | Patterns.cs:85:26:85:27 | Exit | Patterns.cs:85:26:85:27 | Normal Exit | | Patterns.cs:85:26:85:27 | Normal Exit | Patterns.cs:85:39:85:69 | After ... ? ... : ... | | Patterns.cs:85:33:85:33 | i | Patterns.cs:85:26:85:27 | Entry | @@ -13403,26 +13519,33 @@ postDominance | Switch.cs:11:5:33:5 | {...} | Switch.cs:10:20:10:20 | o | | Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:11:5:33:5 | {...} | | Switch.cs:12:17:12:17 | access to parameter o | Switch.cs:12:9:32:9 | switch (...) {...} | +| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:14:18:14:20 | After "a" [match] | +| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:14:18:14:20 | After "a" [no-match] | | Switch.cs:14:13:14:21 | case ...: | Switch.cs:12:17:12:17 | access to parameter o | -| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:13:14:21 | After case ...: [match] | -| Switch.cs:15:17:15:23 | Before return ...; | Switch.cs:14:18:14:20 | "a" | +| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:13:14:21 | case ...: | +| Switch.cs:15:17:15:23 | Before return ...; | Switch.cs:14:13:14:21 | After case ...: [match] | | Switch.cs:15:17:15:23 | return ...; | Switch.cs:15:17:15:23 | Before return ...; | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:16:13:16:19 | case ...: | +| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:16:18:16:18 | After 0 [no-match] | | Switch.cs:16:13:16:19 | case ...: | Switch.cs:14:13:14:21 | After case ...: [no-match] | -| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:13:16:19 | After case ...: [match] | -| Switch.cs:17:17:17:38 | Before throw ...; | Switch.cs:16:18:16:18 | 0 | +| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:13:16:19 | case ...: | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:16:18:16:18 | 0 | +| Switch.cs:17:17:17:38 | Before throw ...; | Switch.cs:16:13:16:19 | After case ...: [match] | | Switch.cs:17:17:17:38 | throw ...; | Switch.cs:17:23:17:37 | After object creation of type Exception | | Switch.cs:17:23:17:37 | After object creation of type Exception | Switch.cs:17:23:17:37 | object creation of type Exception | | Switch.cs:17:23:17:37 | Before object creation of type Exception | Switch.cs:17:17:17:38 | Before throw ...; | | Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:23:17:37 | Before object creation of type Exception | +| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | | Switch.cs:18:13:18:22 | case ...: | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:18:18:18:21 | null | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:19:17:19:29 | Before goto default; | Switch.cs:18:18:18:21 | null | +| Switch.cs:18:18:18:21 | null | Switch.cs:18:13:18:22 | case ...: | +| Switch.cs:19:17:19:29 | Before goto default; | Switch.cs:18:13:18:22 | After case ...: [match] | | Switch.cs:19:17:19:29 | goto default; | Switch.cs:19:17:19:29 | Before goto default; | +| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | | Switch.cs:20:13:20:23 | case ...: | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:13:20:23 | After case ...: [match] | +| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:13:20:23 | case ...: | | Switch.cs:21:17:22:27 | After if (...) ... | Switch.cs:21:21:21:29 | After ... == ... [false] | -| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:20:18:20:22 | Int32 i | +| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:20:13:20:23 | After case ...: [match] | | Switch.cs:21:21:21:21 | access to parameter o | Switch.cs:21:21:21:29 | Before ... == ... | | Switch.cs:21:21:21:29 | ... == ... | Switch.cs:21:26:21:29 | null | | Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:21:21:21:29 | ... == ... | @@ -13433,15 +13556,17 @@ postDominance | Switch.cs:23:17:23:28 | Before goto case ...; | Switch.cs:21:17:22:27 | After if (...) ... | | Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:23:27:23:27 | 0 | | Switch.cs:23:27:23:27 | 0 | Switch.cs:23:17:23:28 | Before goto case ...; | +| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:24:13:24:56 | case ...: | Switch.cs:20:13:20:23 | After case ...: [no-match] | -| Switch.cs:24:18:24:25 | String s | Switch.cs:24:13:24:56 | After case ...: [match] | +| Switch.cs:24:18:24:25 | String s | Switch.cs:24:13:24:56 | case ...: | | Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:24:32:24:39 | Before access to property Length | | Switch.cs:24:32:24:39 | After access to property Length | Switch.cs:24:32:24:39 | access to property Length | | Switch.cs:24:32:24:39 | Before access to property Length | Switch.cs:24:32:24:43 | Before ... > ... | | Switch.cs:24:32:24:39 | access to property Length | Switch.cs:24:32:24:32 | access to local variable s | | Switch.cs:24:32:24:43 | ... > ... | Switch.cs:24:43:24:43 | 0 | | Switch.cs:24:32:24:43 | Before ... > ... | Switch.cs:24:32:24:55 | ... && ... | -| Switch.cs:24:32:24:55 | ... && ... | Switch.cs:24:18:24:25 | String s | +| Switch.cs:24:32:24:55 | ... && ... | Switch.cs:24:13:24:56 | After case ...: [match] | | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:24:32:24:55 | After ... && ... [true] | Switch.cs:24:48:24:55 | After ... != ... [true] | @@ -13458,11 +13583,13 @@ postDominance | Switch.cs:25:35:25:35 | access to local variable s | Switch.cs:25:17:25:36 | Before call to method WriteLine | | Switch.cs:26:17:26:23 | Before return ...; | Switch.cs:25:17:25:37 | After ...; | | Switch.cs:26:17:26:23 | return ...; | Switch.cs:26:17:26:23 | Before return ...; | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:13:24:56 | After case ...: [no-match] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:27:32:27:38 | Before call to method Throw | Switch.cs:27:18:27:25 | Double d | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:27:18:27:25 | Double d | +| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:27:32:27:38 | Before call to method Throw | Switch.cs:27:13:27:39 | After case ...: [match] | | Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:27:32:27:38 | Before call to method Throw | | Switch.cs:28:13:28:17 | Label: | Switch.cs:31:17:31:27 | goto ...; | | Switch.cs:29:17:29:23 | Before return ...; | Switch.cs:28:13:28:17 | Label: | @@ -13489,15 +13616,19 @@ postDominance | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:51:17:51:22 | break; | | Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:45:5:53:5 | {...} | | Switch.cs:46:17:46:17 | access to parameter o | Switch.cs:46:9:52:9 | switch (...) {...} | +| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:48:18:48:20 | After access to type Int32 [match] | +| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | | Switch.cs:48:13:48:23 | case ...: | Switch.cs:46:17:46:17 | access to parameter o | -| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:13:48:23 | After case ...: [match] | -| Switch.cs:49:17:49:22 | Before break; | Switch.cs:48:18:48:20 | access to type Int32 | +| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:13:48:23 | case ...: | +| Switch.cs:49:17:49:22 | Before break; | Switch.cs:48:13:48:23 | After case ...: [match] | | Switch.cs:49:17:49:22 | break; | Switch.cs:49:17:49:22 | Before break; | +| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | | Switch.cs:50:13:50:39 | case ...: | Switch.cs:48:13:48:23 | After case ...: [no-match] | -| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:13:50:39 | After case ...: [match] | +| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:13:50:39 | case ...: | | Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:50:30:50:38 | Before ... != ... | | Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:35:50:38 | null | -| Switch.cs:50:30:50:38 | Before ... != ... | Switch.cs:50:18:50:21 | access to type Boolean | +| Switch.cs:50:30:50:38 | Before ... != ... | Switch.cs:50:13:50:39 | After case ...: [match] | | Switch.cs:50:35:50:38 | null | Switch.cs:50:30:50:30 | access to parameter o | | Switch.cs:51:17:51:22 | Before break; | Switch.cs:50:30:50:38 | After ... != ... [true] | | Switch.cs:51:17:51:22 | break; | Switch.cs:51:17:51:22 | Before break; | @@ -13514,13 +13645,17 @@ postDominance | Switch.cs:57:17:57:21 | After ... + ... | Switch.cs:57:17:57:21 | ... + ... | | Switch.cs:57:17:57:21 | Before ... + ... | Switch.cs:57:9:63:9 | switch (...) {...} | | Switch.cs:57:21:57:21 | 2 | Switch.cs:57:17:57:17 | 1 | +| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:59:18:59:18 | After 2 [match] | +| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:59:18:59:18 | After 2 [no-match] | | Switch.cs:59:13:59:19 | case ...: | Switch.cs:57:17:57:21 | After ... + ... | -| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:13:59:19 | After case ...: [match] | -| Switch.cs:60:17:60:22 | Before break; | Switch.cs:59:18:59:18 | 2 | +| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:13:59:19 | case ...: | +| Switch.cs:60:17:60:22 | Before break; | Switch.cs:59:13:59:19 | After case ...: [match] | | Switch.cs:60:17:60:22 | break; | Switch.cs:60:17:60:22 | Before break; | +| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:61:18:61:18 | After 3 [no-match] | | Switch.cs:61:13:61:19 | case ...: | Switch.cs:59:13:59:19 | After case ...: [no-match] | -| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:62:17:62:22 | Before break; | Switch.cs:61:18:61:18 | 3 | +| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:13:61:19 | case ...: | +| Switch.cs:62:17:62:22 | Before break; | Switch.cs:61:13:61:19 | After case ...: [match] | | Switch.cs:62:17:62:22 | break; | Switch.cs:62:17:62:22 | Before break; | | Switch.cs:66:10:66:11 | Exit | Switch.cs:66:10:66:11 | Normal Exit | | Switch.cs:66:10:66:11 | Normal Exit | Switch.cs:67:5:75:5 | After {...} | @@ -13535,13 +13670,17 @@ postDominance | Switch.cs:68:17:68:25 | After (...) ... | Switch.cs:68:17:68:25 | (...) ... | | Switch.cs:68:17:68:25 | Before (...) ... | Switch.cs:68:9:74:9 | switch (...) {...} | | Switch.cs:68:25:68:25 | access to parameter s | Switch.cs:68:17:68:25 | Before (...) ... | +| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:70:18:70:20 | After access to type Int32 [match] | +| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | | Switch.cs:70:13:70:23 | case ...: | Switch.cs:68:17:68:25 | After (...) ... | -| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:13:70:23 | After case ...: [match] | -| Switch.cs:71:17:71:22 | Before break; | Switch.cs:70:18:70:20 | access to type Int32 | +| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:13:70:23 | case ...: | +| Switch.cs:71:17:71:22 | Before break; | Switch.cs:70:13:70:23 | After case ...: [match] | | Switch.cs:71:17:71:22 | break; | Switch.cs:71:17:71:22 | Before break; | +| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:72:18:72:19 | After "" [no-match] | | Switch.cs:72:13:72:20 | case ...: | Switch.cs:70:13:70:23 | After case ...: [no-match] | -| Switch.cs:72:18:72:19 | "" | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:73:17:73:22 | Before break; | Switch.cs:72:18:72:19 | "" | +| Switch.cs:72:18:72:19 | "" | Switch.cs:72:13:72:20 | case ...: | +| Switch.cs:73:17:73:22 | Before break; | Switch.cs:72:13:72:20 | After case ...: [match] | | Switch.cs:73:17:73:22 | break; | Switch.cs:73:17:73:22 | Before break; | | Switch.cs:77:10:77:11 | Exit | Switch.cs:77:10:77:11 | Normal Exit | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:82:17:82:28 | return ...; | @@ -13554,15 +13693,19 @@ postDominance | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:85:21:85:26 | break; | | Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:78:5:89:5 | {...} | | Switch.cs:79:17:79:17 | access to parameter i | Switch.cs:79:9:87:9 | switch (...) {...} | +| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:81:18:81:18 | After 1 [match] | +| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:81:18:81:18 | After 1 [no-match] | | Switch.cs:81:13:81:19 | case ...: | Switch.cs:79:17:79:17 | access to parameter i | -| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:13:81:19 | After case ...: [match] | -| Switch.cs:82:17:82:28 | Before return ...; | Switch.cs:81:18:81:18 | 1 | +| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:13:81:19 | case ...: | +| Switch.cs:82:17:82:28 | Before return ...; | Switch.cs:81:13:81:19 | After case ...: [match] | | Switch.cs:82:17:82:28 | return ...; | Switch.cs:82:24:82:27 | true | | Switch.cs:82:24:82:27 | true | Switch.cs:82:17:82:28 | Before return ...; | +| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:83:18:83:18 | After 2 [no-match] | | Switch.cs:83:13:83:19 | case ...: | Switch.cs:81:13:81:19 | After case ...: [no-match] | -| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:13:83:19 | After case ...: [match] | +| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:13:83:19 | case ...: | | Switch.cs:84:17:85:26 | After if (...) ... | Switch.cs:84:21:84:25 | After ... > ... [false] | -| Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:83:18:83:18 | 2 | +| Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:83:13:83:19 | After case ...: [match] | | Switch.cs:84:21:84:21 | access to parameter j | Switch.cs:84:21:84:25 | Before ... > ... | | Switch.cs:84:21:84:25 | ... > ... | Switch.cs:84:25:84:25 | 2 | | Switch.cs:84:21:84:25 | Before ... > ... | Switch.cs:84:17:85:26 | if (...) ... | @@ -13583,9 +13726,11 @@ postDominance | Switch.cs:93:9:97:9 | After switch (...) {...} | Switch.cs:95:13:95:23 | After case ...: [no-match] | | Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:92:5:99:5 | {...} | | Switch.cs:93:17:93:17 | access to parameter o | Switch.cs:93:9:97:9 | switch (...) {...} | +| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:95:18:95:20 | After access to type Int32 [match] | +| Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | | Switch.cs:95:13:95:23 | case ...: | Switch.cs:93:17:93:17 | access to parameter o | -| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:13:95:23 | After case ...: [match] | -| Switch.cs:96:17:96:28 | Before return ...; | Switch.cs:95:18:95:20 | access to type Int32 | +| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:13:95:23 | case ...: | +| Switch.cs:96:17:96:28 | Before return ...; | Switch.cs:95:13:95:23 | After case ...: [match] | | Switch.cs:96:17:96:28 | return ...; | Switch.cs:96:24:96:27 | true | | Switch.cs:96:24:96:27 | true | Switch.cs:96:17:96:28 | Before return ...; | | Switch.cs:98:9:98:21 | Before return ...; | Switch.cs:93:9:97:9 | After switch (...) {...} | @@ -13604,14 +13749,18 @@ postDominance | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:103:17:103:25 | access to property Length | | Switch.cs:103:17:103:25 | Before access to property Length | Switch.cs:103:9:107:9 | switch (...) {...} | | Switch.cs:103:17:103:25 | access to property Length | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | +| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:105:18:105:18 | After 0 [no-match] | | Switch.cs:105:13:105:19 | case ...: | Switch.cs:103:17:103:25 | After access to property Length | -| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:105:21:105:29 | Before return ...; | Switch.cs:105:18:105:18 | 0 | +| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:13:105:19 | case ...: | +| Switch.cs:105:21:105:29 | Before return ...; | Switch.cs:105:13:105:19 | After case ...: [match] | | Switch.cs:105:21:105:29 | return ...; | Switch.cs:105:28:105:28 | 0 | | Switch.cs:105:28:105:28 | 0 | Switch.cs:105:21:105:29 | Before return ...; | +| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:106:18:106:18 | After 1 [no-match] | | Switch.cs:106:13:106:19 | case ...: | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:106:21:106:29 | Before return ...; | Switch.cs:106:18:106:18 | 1 | +| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:13:106:19 | case ...: | +| Switch.cs:106:21:106:29 | Before return ...; | Switch.cs:106:13:106:19 | After case ...: [match] | | Switch.cs:106:21:106:29 | return ...; | Switch.cs:106:28:106:28 | 1 | | Switch.cs:106:28:106:28 | 1 | Switch.cs:106:21:106:29 | Before return ...; | | Switch.cs:108:9:108:18 | Before return ...; | Switch.cs:103:9:107:9 | After switch (...) {...} | @@ -13640,21 +13789,25 @@ postDominance | Switch.cs:115:17:115:24 | After access to property Length | Switch.cs:115:17:115:24 | access to property Length | | Switch.cs:115:17:115:24 | Before access to property Length | Switch.cs:115:9:119:9 | switch (...) {...} | | Switch.cs:115:17:115:24 | access to property Length | Switch.cs:115:17:115:17 | access to parameter s | +| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:18:117:18 | After 3 [match] | +| Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:117:18:117:18 | After 3 [no-match] | | Switch.cs:117:13:117:35 | case ...: | Switch.cs:115:17:115:24 | After access to property Length | -| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:13:117:35 | After case ...: [match] | +| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:13:117:35 | case ...: | | Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:117:25:117:34 | Before ... == ... | | Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:30:117:34 | "foo" | -| Switch.cs:117:25:117:34 | Before ... == ... | Switch.cs:117:18:117:18 | 3 | +| Switch.cs:117:25:117:34 | Before ... == ... | Switch.cs:117:13:117:35 | After case ...: [match] | | Switch.cs:117:30:117:34 | "foo" | Switch.cs:117:25:117:25 | access to parameter s | | Switch.cs:117:37:117:45 | Before return ...; | Switch.cs:117:25:117:34 | After ... == ... [true] | | Switch.cs:117:37:117:45 | return ...; | Switch.cs:117:44:117:44 | 1 | | Switch.cs:117:44:117:44 | 1 | Switch.cs:117:37:117:45 | Before return ...; | +| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:117:13:117:35 | After case ...: [no-match] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:117:25:117:34 | After ... == ... [false] | -| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:13:118:34 | After case ...: [match] | +| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:13:118:34 | case ...: | | Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:118:25:118:33 | Before ... == ... | | Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:30:118:33 | "fu" | -| Switch.cs:118:25:118:33 | Before ... == ... | Switch.cs:118:18:118:18 | 2 | +| Switch.cs:118:25:118:33 | Before ... == ... | Switch.cs:118:13:118:34 | After case ...: [match] | | Switch.cs:118:30:118:33 | "fu" | Switch.cs:118:25:118:25 | access to parameter s | | Switch.cs:118:36:118:44 | Before return ...; | Switch.cs:118:25:118:33 | After ... == ... [true] | | Switch.cs:118:36:118:44 | return ...; | Switch.cs:118:43:118:43 | 2 | @@ -13675,13 +13828,16 @@ postDominance | Switch.cs:125:9:126:19 | if (...) ... | Switch.cs:124:5:127:5 | {...} | | Switch.cs:125:13:125:13 | access to parameter o | Switch.cs:125:13:125:48 | ... switch { ... } | | Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:125:9:126:19 | if (...) ... | -| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:34 | After ... => ... [match] | +| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:34 | ... => ... | | Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:13:125:13 | access to parameter o | -| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:24:125:29 | Boolean b | -| Switch.cs:125:37:125:37 | _ | Switch.cs:125:37:125:46 | After ... => ... [match] | +| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:24:125:29 | After Boolean b [match] | +| Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:125:24:125:29 | After Boolean b [no-match] | +| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:24:125:34 | After ... => ... [match] | +| Switch.cs:125:37:125:37 | After _ [match] | Switch.cs:125:37:125:37 | _ | +| Switch.cs:125:37:125:37 | _ | Switch.cs:125:37:125:46 | ... => ... | | Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:24:125:34 | After ... => ... [no-match] | -| Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:125:37:125:46 | ... => ... | -| Switch.cs:125:42:125:46 | false | Switch.cs:125:37:125:37 | _ | +| Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:125:37:125:37 | After _ [match] | +| Switch.cs:125:42:125:46 | false | Switch.cs:125:37:125:46 | After ... => ... [match] | | Switch.cs:126:13:126:19 | Before return ...; | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | | Switch.cs:126:13:126:19 | return ...; | Switch.cs:126:13:126:19 | Before return ...; | | Switch.cs:129:12:129:14 | Exit | Switch.cs:129:12:129:14 | Normal Exit | @@ -13696,13 +13852,16 @@ postDominance | Switch.cs:131:16:131:66 | call to method ToString | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | | Switch.cs:131:17:131:17 | access to parameter o | Switch.cs:131:17:131:53 | ... switch { ... } | | Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:131:16:131:66 | Before call to method ToString | -| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:40 | After ... => ... [match] | +| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:40 | ... => ... | | Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:17:131:17 | access to parameter o | -| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:28:131:35 | String s | -| Switch.cs:131:43:131:43 | _ | Switch.cs:131:43:131:51 | After ... => ... [match] | +| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:28:131:35 | After String s [match] | +| Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:131:28:131:35 | After String s [no-match] | +| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:28:131:40 | After ... => ... [match] | +| Switch.cs:131:43:131:43 | After _ [match] | Switch.cs:131:43:131:43 | _ | +| Switch.cs:131:43:131:43 | _ | Switch.cs:131:43:131:51 | ... => ... | | Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:28:131:40 | After ... => ... [no-match] | -| Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:131:43:131:51 | ... => ... | -| Switch.cs:131:48:131:51 | null | Switch.cs:131:43:131:43 | _ | +| Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:131:43:131:43 | After _ [match] | +| Switch.cs:131:48:131:51 | null | Switch.cs:131:43:131:51 | After ... => ... [match] | | Switch.cs:134:9:134:11 | Exit | Switch.cs:134:9:134:11 | Normal Exit | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:138:22:138:31 | return ...; | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:139:21:139:29 | return ...; | @@ -13719,14 +13878,18 @@ postDominance | Switch.cs:138:29:138:30 | After -... | Switch.cs:138:29:138:30 | -... | | Switch.cs:138:29:138:30 | Before -... | Switch.cs:138:22:138:31 | Before return ...; | | Switch.cs:138:30:138:30 | 1 | Switch.cs:138:29:138:30 | Before -... | +| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:18:139:18 | After 1 [match] | +| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:139:18:139:18 | After 1 [no-match] | | Switch.cs:139:13:139:19 | case ...: | Switch.cs:136:17:136:17 | access to parameter i | -| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:13:139:19 | After case ...: [match] | -| Switch.cs:139:21:139:29 | Before return ...; | Switch.cs:139:18:139:18 | 1 | +| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:13:139:19 | case ...: | +| Switch.cs:139:21:139:29 | Before return ...; | Switch.cs:139:13:139:19 | After case ...: [match] | | Switch.cs:139:21:139:29 | return ...; | Switch.cs:139:28:139:28 | 1 | | Switch.cs:139:28:139:28 | 1 | Switch.cs:139:21:139:29 | Before return ...; | +| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:140:18:140:18 | After 2 [no-match] | | Switch.cs:140:13:140:19 | case ...: | Switch.cs:139:13:139:19 | After case ...: [no-match] | -| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:140:21:140:29 | Before return ...; | Switch.cs:140:18:140:18 | 2 | +| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:13:140:19 | case ...: | +| Switch.cs:140:21:140:29 | Before return ...; | Switch.cs:140:13:140:19 | After case ...: [match] | | Switch.cs:140:21:140:29 | return ...; | Switch.cs:140:28:140:28 | 2 | | Switch.cs:140:28:140:28 | 2 | Switch.cs:140:21:140:29 | Before return ...; | | Switch.cs:144:9:144:11 | Exit | Switch.cs:144:9:144:11 | Normal Exit | @@ -13737,9 +13900,11 @@ postDominance | Switch.cs:145:5:152:5 | {...} | Switch.cs:144:17:144:17 | i | | Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:145:5:152:5 | {...} | | Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:146:9:151:9 | switch (...) {...} | +| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:18:148:18 | After 1 [match] | +| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:148:18:148:18 | After 1 [no-match] | | Switch.cs:148:13:148:19 | case ...: | Switch.cs:146:17:146:17 | access to parameter i | -| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:13:148:19 | After case ...: [match] | -| Switch.cs:148:21:148:29 | Before return ...; | Switch.cs:148:18:148:18 | 1 | +| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:13:148:19 | case ...: | +| Switch.cs:148:21:148:29 | Before return ...; | Switch.cs:148:13:148:19 | After case ...: [match] | | Switch.cs:148:21:148:29 | return ...; | Switch.cs:148:28:148:28 | 1 | | Switch.cs:148:28:148:28 | 1 | Switch.cs:148:21:148:29 | Before return ...; | | Switch.cs:149:13:149:20 | After default: [match] | Switch.cs:149:13:149:20 | default: | @@ -13750,9 +13915,11 @@ postDominance | Switch.cs:149:29:149:30 | After -... | Switch.cs:149:29:149:30 | -... | | Switch.cs:149:29:149:30 | Before -... | Switch.cs:149:22:149:31 | Before return ...; | | Switch.cs:149:30:149:30 | 1 | Switch.cs:149:29:149:30 | Before -... | +| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:150:18:150:18 | After 2 [no-match] | | Switch.cs:150:13:150:19 | case ...: | Switch.cs:148:13:148:19 | After case ...: [no-match] | -| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:150:21:150:29 | Before return ...; | Switch.cs:150:18:150:18 | 2 | +| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:13:150:19 | case ...: | +| Switch.cs:150:21:150:29 | Before return ...; | Switch.cs:150:13:150:19 | After case ...: [match] | | Switch.cs:150:21:150:29 | return ...; | Switch.cs:150:28:150:28 | 2 | | Switch.cs:150:28:150:28 | 2 | Switch.cs:150:21:150:29 | Before return ...; | | Switch.cs:154:10:154:12 | Exit | Switch.cs:154:10:154:12 | Normal Exit | @@ -13771,12 +13938,16 @@ postDominance | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:36:156:38 | "a" | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:41:156:52 | After ... => ... [no-match] | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:50:156:52 | "b" | -| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:38 | After ... => ... [match] | +| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:38 | ... => ... | | Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:17:156:17 | access to parameter b | -| Switch.cs:156:36:156:38 | "a" | Switch.cs:156:28:156:31 | true | -| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:52 | After ... => ... [match] | +| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:156:36:156:38 | "a" | Switch.cs:156:28:156:38 | After ... => ... [match] | +| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:52 | ... => ... | | Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:45 | false | +| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:156:41:156:52 | After ... => ... [no-match] | Switch.cs:156:41:156:45 | After false [no-match] | +| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | After ... => ... [match] | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:158:13:158:49 | After ...; | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:160:13:160:49 | After ...; | | Switch.cs:157:9:160:49 | if (...) ... | Switch.cs:156:9:156:55 | After ... ...; | @@ -13817,25 +13988,31 @@ postDominance | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:176:17:176:22 | break; | | Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:164:5:178:5 | {...} | | Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:165:9:177:9 | switch (...) {...} | +| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:167:18:167:18 | After 1 [no-match] | | Switch.cs:167:13:167:19 | case ...: | Switch.cs:165:17:165:17 | access to parameter i | -| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:13:167:19 | After case ...: [match] | +| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:13:167:19 | case ...: | +| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:168:18:168:18 | After 2 [no-match] | | Switch.cs:168:13:168:19 | case ...: | Switch.cs:167:13:167:19 | After case ...: [no-match] | -| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:13:168:19 | After case ...: [match] | +| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:13:168:19 | case ...: | | Switch.cs:169:17:169:50 | After call to method WriteLine | Switch.cs:169:17:169:50 | call to method WriteLine | | Switch.cs:169:17:169:50 | Before call to method WriteLine | Switch.cs:169:17:169:51 | ...; | | Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:169:42:169:49 | "1 or 2" | -| Switch.cs:169:17:169:51 | ...; | Switch.cs:167:18:167:18 | 1 | -| Switch.cs:169:17:169:51 | ...; | Switch.cs:168:18:168:18 | 2 | +| Switch.cs:169:17:169:51 | ...; | Switch.cs:167:13:167:19 | After case ...: [match] | +| Switch.cs:169:17:169:51 | ...; | Switch.cs:168:13:168:19 | After case ...: [match] | | Switch.cs:169:17:169:51 | After ...; | Switch.cs:169:17:169:50 | After call to method WriteLine | | Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:17:169:50 | Before call to method WriteLine | | Switch.cs:170:17:170:22 | Before break; | Switch.cs:169:17:169:51 | After ...; | | Switch.cs:170:17:170:22 | break; | Switch.cs:170:17:170:22 | Before break; | +| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | | Switch.cs:171:13:171:19 | case ...: | Switch.cs:168:13:168:19 | After case ...: [no-match] | -| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:13:171:19 | After case ...: [match] | +| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:13:171:19 | case ...: | | Switch.cs:172:17:172:45 | After call to method WriteLine | Switch.cs:172:17:172:45 | call to method WriteLine | | Switch.cs:172:17:172:45 | Before call to method WriteLine | Switch.cs:172:17:172:46 | ...; | | Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:172:42:172:44 | "3" | -| Switch.cs:172:17:172:46 | ...; | Switch.cs:171:18:171:18 | 3 | +| Switch.cs:172:17:172:46 | ...; | Switch.cs:171:13:171:19 | After case ...: [match] | | Switch.cs:172:17:172:46 | After ...; | Switch.cs:172:17:172:45 | After call to method WriteLine | | Switch.cs:172:42:172:44 | "3" | Switch.cs:172:17:172:45 | Before call to method WriteLine | | Switch.cs:173:17:173:22 | Before break; | Switch.cs:172:17:172:46 | After ...; | @@ -14201,36 +14378,40 @@ postDominance | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:49:17:49:22 | break; | | cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:38:5:68:5 | {...} | | cflow.cs:39:17:39:17 | access to parameter a | cflow.cs:39:9:50:9 | switch (...) {...} | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:41:13:41:19 | case ...: | +| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:41:18:41:18 | After 1 [no-match] | | cflow.cs:41:13:41:19 | case ...: | cflow.cs:39:17:39:17 | access to parameter a | -| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:13:41:19 | After case ...: [match] | +| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:13:41:19 | case ...: | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:41:18:41:18 | 1 | | cflow.cs:42:17:42:38 | After call to method WriteLine | cflow.cs:42:17:42:38 | call to method WriteLine | | cflow.cs:42:17:42:38 | Before call to method WriteLine | cflow.cs:42:17:42:39 | ...; | | cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:42:35:42:37 | "1" | -| cflow.cs:42:17:42:39 | ...; | cflow.cs:41:18:41:18 | 1 | +| cflow.cs:42:17:42:39 | ...; | cflow.cs:41:13:41:19 | After case ...: [match] | | cflow.cs:42:17:42:39 | After ...; | cflow.cs:42:17:42:38 | After call to method WriteLine | | cflow.cs:42:35:42:37 | "1" | cflow.cs:42:17:42:38 | Before call to method WriteLine | | cflow.cs:43:17:43:28 | Before goto case ...; | cflow.cs:42:17:42:39 | After ...; | | cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:43:27:43:27 | 2 | | cflow.cs:43:27:43:27 | 2 | cflow.cs:43:17:43:28 | Before goto case ...; | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | case ...: | +| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:44:18:44:18 | After 2 [no-match] | | cflow.cs:44:13:44:19 | case ...: | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:13:44:19 | After case ...: [match] | +| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:13:44:19 | case ...: | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:44:18:44:18 | 2 | | cflow.cs:45:17:45:38 | After call to method WriteLine | cflow.cs:45:17:45:38 | call to method WriteLine | | cflow.cs:45:17:45:38 | Before call to method WriteLine | cflow.cs:45:17:45:39 | ...; | | cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:45:35:45:37 | "2" | -| cflow.cs:45:17:45:39 | ...; | cflow.cs:44:18:44:18 | 2 | +| cflow.cs:45:17:45:39 | ...; | cflow.cs:44:13:44:19 | After case ...: [match] | | cflow.cs:45:17:45:39 | After ...; | cflow.cs:45:17:45:38 | After call to method WriteLine | | cflow.cs:45:35:45:37 | "2" | cflow.cs:45:17:45:38 | Before call to method WriteLine | | cflow.cs:46:17:46:28 | Before goto case ...; | cflow.cs:45:17:45:39 | After ...; | | cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:46:27:46:27 | 1 | | cflow.cs:46:27:46:27 | 1 | cflow.cs:46:17:46:28 | Before goto case ...; | +| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:47:13:47:19 | case ...: | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:13:47:19 | After case ...: [match] | +| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:13:47:19 | case ...: | | cflow.cs:48:17:48:38 | After call to method WriteLine | cflow.cs:48:17:48:38 | call to method WriteLine | | cflow.cs:48:17:48:38 | Before call to method WriteLine | cflow.cs:48:17:48:39 | ...; | | cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:48:35:48:37 | "3" | -| cflow.cs:48:17:48:39 | ...; | cflow.cs:47:18:47:18 | 3 | +| cflow.cs:48:17:48:39 | ...; | cflow.cs:47:13:47:19 | After case ...: [match] | | cflow.cs:48:17:48:39 | After ...; | cflow.cs:48:17:48:38 | After call to method WriteLine | | cflow.cs:48:35:48:37 | "3" | cflow.cs:48:17:48:38 | Before call to method WriteLine | | cflow.cs:49:17:49:22 | Before break; | cflow.cs:48:17:48:39 | After ...; | @@ -14239,12 +14420,14 @@ postDominance | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:58:17:58:22 | break; | | cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:39:9:50:9 | After switch (...) {...} | | cflow.cs:51:17:51:17 | access to parameter a | cflow.cs:51:9:59:9 | switch (...) {...} | +| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:53:18:53:19 | After 42 [no-match] | | cflow.cs:53:13:53:20 | case ...: | cflow.cs:51:17:51:17 | access to parameter a | -| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:13:53:20 | After case ...: [match] | +| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:13:53:20 | case ...: | | cflow.cs:54:17:54:47 | After call to method WriteLine | cflow.cs:54:17:54:47 | call to method WriteLine | | cflow.cs:54:17:54:47 | Before call to method WriteLine | cflow.cs:54:17:54:48 | ...; | | cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:54:35:54:46 | "The answer" | -| cflow.cs:54:17:54:48 | ...; | cflow.cs:53:18:53:19 | 42 | +| cflow.cs:54:17:54:48 | ...; | cflow.cs:53:13:53:20 | After case ...: [match] | | cflow.cs:54:17:54:48 | After ...; | cflow.cs:54:17:54:47 | After call to method WriteLine | | cflow.cs:54:35:54:46 | "The answer" | cflow.cs:54:17:54:47 | Before call to method WriteLine | | cflow.cs:55:17:55:22 | Before break; | cflow.cs:54:17:54:48 | After ...; | @@ -14269,10 +14452,12 @@ postDominance | cflow.cs:60:27:60:31 | Before access to field Field | cflow.cs:60:17:60:32 | Before call to method Parse | | cflow.cs:60:27:60:31 | access to field Field | cflow.cs:60:27:60:31 | this access | | cflow.cs:60:27:60:31 | this access | cflow.cs:60:27:60:31 | Before access to field Field | +| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:62:13:62:19 | case ...: | cflow.cs:60:17:60:32 | After call to method Parse | -| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:13:62:19 | After case ...: [match] | +| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:13:62:19 | case ...: | | cflow.cs:63:17:64:55 | After if (...) ... | cflow.cs:63:21:63:34 | After !... [false] | -| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:62:18:62:18 | 0 | +| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:62:13:62:19 | After case ...: [match] | | cflow.cs:63:21:63:34 | !... | cflow.cs:63:17:64:55 | if (...) ... | | cflow.cs:63:21:63:34 | After !... [false] | cflow.cs:63:23:63:33 | After ... == ... [true] | | cflow.cs:63:21:63:34 | After !... [true] | cflow.cs:63:23:63:33 | After ... == ... [false] | @@ -15151,23 +15336,29 @@ postDominance | cflow.cs:246:17:246:32 | After ... + ... | cflow.cs:246:17:246:32 | ... + ... | | cflow.cs:246:17:246:32 | Before ... + ... | cflow.cs:246:9:258:9 | switch (...) {...} | | cflow.cs:246:32:246:32 | 3 | cflow.cs:246:17:246:28 | After access to property Length | +| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:248:18:248:18 | After 0 [no-match] | | cflow.cs:248:13:248:19 | case ...: | cflow.cs:246:17:246:32 | After ... + ... | -| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:249:17:249:29 | Before goto default; | cflow.cs:248:18:248:18 | 0 | +| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:13:248:19 | case ...: | +| cflow.cs:249:17:249:29 | Before goto default; | cflow.cs:248:13:248:19 | After case ...: [match] | | cflow.cs:249:17:249:29 | goto default; | cflow.cs:249:17:249:29 | Before goto default; | +| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:250:18:250:18 | After 1 [no-match] | | cflow.cs:250:13:250:19 | case ...: | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:13:250:19 | After case ...: [match] | +| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:13:250:19 | case ...: | | cflow.cs:251:17:251:36 | After call to method WriteLine | cflow.cs:251:17:251:36 | call to method WriteLine | | cflow.cs:251:17:251:36 | Before call to method WriteLine | cflow.cs:251:17:251:37 | ...; | | cflow.cs:251:17:251:36 | call to method WriteLine | cflow.cs:251:35:251:35 | 1 | -| cflow.cs:251:17:251:37 | ...; | cflow.cs:250:18:250:18 | 1 | +| cflow.cs:251:17:251:37 | ...; | cflow.cs:250:13:250:19 | After case ...: [match] | | cflow.cs:251:17:251:37 | After ...; | cflow.cs:251:17:251:36 | After call to method WriteLine | | cflow.cs:251:35:251:35 | 1 | cflow.cs:251:17:251:36 | Before call to method WriteLine | | cflow.cs:252:17:252:22 | Before break; | cflow.cs:251:17:251:37 | After ...; | | cflow.cs:252:17:252:22 | break; | cflow.cs:252:17:252:22 | Before break; | +| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:253:13:253:19 | case ...: | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:254:17:254:27 | Before goto ...; | cflow.cs:253:18:253:18 | 2 | +| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:13:253:19 | case ...: | +| cflow.cs:254:17:254:27 | Before goto ...; | cflow.cs:253:13:253:19 | After case ...: [match] | | cflow.cs:254:17:254:27 | goto ...; | cflow.cs:254:17:254:27 | Before goto ...; | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:249:17:249:29 | goto default; | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:255:13:255:20 | default: | @@ -18387,34 +18578,34 @@ blockDominance | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:16:18:16:28 | After ... is ... [false] | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:20:9:38:9 | After switch (...) {...} | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:27:13:27:24 | After case ...: [no-match] | | Patterns.cs:5:10:5:11 | Entry | Patterns.cs:27:13:27:24 | case ...: | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:33:13:33:24 | After case ...: [no-match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:5:10:5:11 | Entry | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:8:9:18:9 | After if (...) ... | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:20:9:38:9 | After switch (...) {...} | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:13:27:24 | After case ...: [no-match] | | Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:13:27:24 | case ...: | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:13:33:24 | After case ...: [no-match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:8:9:18:9 | After if (...) ... | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:8:13:8:23 | After ... is ... [false] | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:12:14:18:9 | After if (...) ... | | Patterns.cs:8:13:8:23 | After ... is ... [false] | Patterns.cs:12:18:12:31 | After ... is ... [false] | @@ -18433,44 +18624,44 @@ blockDominance | Patterns.cs:16:18:16:28 | After ... is ... [false] | Patterns.cs:16:18:16:28 | After ... is ... [false] | | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:20:9:38:9 | After switch (...) {...} | -| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:27:13:27:24 | After case ...: [no-match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:27:13:27:24 | case ...: | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:27:13:27:24 | case ...: | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:30:24:35 | After ... > ... [false] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:30:24:35 | After ... > ... [true] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:24:30:24:35 | After ... > ... [false] | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:24:30:24:35 | After ... > ... [true] | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:27:13:27:24 | After case ...: [no-match] | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [no-match] | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | case ...: | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [no-match] | -| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | -| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:47:24:47:25 | Entry | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:48:9:48:20 | After ... is ... | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:48:9:48:20 | [MatchTrue] ... is ... | @@ -18502,45 +18693,45 @@ blockDominance | Patterns.cs:54:9:54:37 | [MatchTrue] ... is ... | Patterns.cs:54:9:54:37 | [MatchTrue] ... is ... | | Patterns.cs:56:26:56:27 | Entry | Patterns.cs:56:26:56:27 | Entry | | Patterns.cs:56:26:56:27 | Entry | Patterns.cs:58:16:62:9 | After ... switch { ... } | -| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:28 | After ... => ... [match] | -| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | +| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:17 | After not ... [match] | +| Patterns.cs:56:26:56:27 | Entry | Patterns.cs:60:13:60:17 | After not ... [no-match] | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:58:16:62:9 | After ... switch { ... } | -| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:13:60:28 | After ... => ... [match] | -| Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:60:13:60:17 | After not ... [match] | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:60:13:60:17 | After not ... [no-match] | | Patterns.cs:65:26:65:27 | Entry | Patterns.cs:65:26:65:27 | Entry | | Patterns.cs:65:26:65:27 | Entry | Patterns.cs:67:16:71:9 | After ... switch { ... } | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:33 | After ... => ... [match] | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:27 | After ... => ... [match] | -| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:17 | After not ... [match] | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:69:13:69:17 | After not ... [no-match] | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:65:26:65:27 | Entry | Patterns.cs:70:13:70:13 | After 2 [no-match] | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:67:16:71:9 | After ... switch { ... } | -| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:13:69:33 | After ... => ... [match] | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [match] | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | -| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:13:70:27 | After ... => ... [match] | -| Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:69:13:69:17 | After not ... [match] | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:69:13:69:17 | After not ... [no-match] | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:70:13:70:13 | After 2 [no-match] | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:70:13:70:13 | After 2 [no-match] | | Patterns.cs:74:26:74:27 | Entry | Patterns.cs:74:26:74:27 | Entry | | Patterns.cs:74:26:74:27 | Entry | Patterns.cs:76:16:82:9 | After ... switch { ... } | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:24 | After ... => ... [match] | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:24 | After ... => ... [match] | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:15 | After > ... [match] | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:78:13:78:15 | After > ... [no-match] | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:79:13:79:15 | After < ... [no-match] | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:74:26:74:27 | Entry | Patterns.cs:80:13:80:13 | After 1 [no-match] | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:76:16:82:9 | After ... switch { ... } | -| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:13:78:24 | After ... => ... [match] | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [match] | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | -| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:13:79:24 | After ... => ... [match] | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | -| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:78:13:78:15 | After > ... [match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:78:13:78:15 | After > ... [no-match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [no-match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [no-match] | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:26:85:27 | Entry | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:39:85:53 | After ... is ... [false] | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:39:85:53 | [MatchTrue] ... is ... | @@ -18588,110 +18779,113 @@ blockDominance | Switch.cs:10:10:10:11 | Entry | Switch.cs:10:10:10:11 | Exceptional Exit | | Switch.cs:10:10:10:11 | Entry | Switch.cs:10:10:10:11 | Exit | | Switch.cs:10:10:10:11 | Entry | Switch.cs:10:10:10:11 | Normal Exit | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:13:14:21 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:13:14:21 | After case ...: [no-match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:18:14:20 | After "a" [match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:14:18:14:20 | After "a" [no-match] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:16:13:16:19 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:13:20:23 | After case ...: [no-match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:16:18:16:18 | After 0 [match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:16:18:16:18 | After 0 [no-match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:18:18:18:21 | After null [no-match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:20:18:20:22 | After Int32 i [no-match] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:21:21:21:29 | After ... == ... [false] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:32:24:43 | After ... > ... [true] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:32:24:55 | After ... && ... [false] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:13:27:39 | After case ...: [no-match] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:10:10:10:11 | Entry | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:10:10:10:11 | Entry | Switch.cs:30:13:30:20 | After default: [match] | | Switch.cs:10:10:10:11 | Exceptional Exit | Switch.cs:10:10:10:11 | Exceptional Exit | | Switch.cs:10:10:10:11 | Exit | Switch.cs:10:10:10:11 | Exit | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:10:10:10:11 | Normal Exit | -| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:14:13:14:21 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:10:10:10:11 | Exceptional Exit | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:14:13:14:21 | After case ...: [no-match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:16:13:16:19 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:30:13:30:20 | After default: [match] | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:14:18:14:20 | After "a" [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:10:10:10:11 | Exceptional Exit | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:14:18:14:20 | After "a" [no-match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:16:13:16:19 | After case ...: [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:16:18:16:18 | After 0 [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:16:18:16:18 | After 0 [no-match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:30:13:30:20 | After default: [match] | | Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:16:13:16:19 | After case ...: [match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:30:13:30:20 | After default: [match] | -| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:21:21:29 | After ... == ... [false] | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:16:18:16:18 | After 0 [match] | Switch.cs:16:18:16:18 | After 0 [match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:16:18:16:18 | After 0 [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:30:13:30:20 | After default: [match] | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:21:21:21:29 | After ... == ... [false] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:21:21:21:29 | After ... == ... [true] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:21:21:21:29 | After ... == ... [false] | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:21:21:21:29 | After ... == ... [true] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:32:24:43 | After ... > ... [true] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:24:48:24:55 | After ... != ... [true] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:21:21:21:29 | After ... == ... [false] | Switch.cs:21:21:21:29 | After ... == ... [false] | | Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:43 | After ... > ... [false] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:43 | After ... > ... [true] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:32:24:43 | After ... > ... [false] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:32:24:43 | After ... > ... [true] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:32:24:55 | After ... && ... [false] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:48:24:55 | After ... != ... [false] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:48:24:55 | After ... != ... [true] | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:24:32:24:43 | After ... > ... [false] | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:24:32:24:43 | After ... > ... [true] | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:24:48:24:55 | After ... != ... [false] | @@ -18699,202 +18893,202 @@ blockDominance | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:24:32:24:55 | After ... && ... [false] | | Switch.cs:24:48:24:55 | After ... != ... [false] | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:24:48:24:55 | After ... != ... [true] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [no-match] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | After Double d [no-match] | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:30:13:30:20 | After default: [match] | | Switch.cs:35:10:35:11 | Entry | Switch.cs:35:10:35:11 | Entry | | Switch.cs:44:10:44:11 | Entry | Switch.cs:44:10:44:11 | Entry | | Switch.cs:44:10:44:11 | Entry | Switch.cs:46:9:52:9 | After switch (...) {...} | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:13:48:23 | After case ...: [match] | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:13:48:23 | After case ...: [no-match] | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:13:50:39 | After case ...: [match] | -| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:13:50:39 | After case ...: [no-match] | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:18:48:20 | After access to type Int32 [match] | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:44:10:44:11 | Entry | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | | Switch.cs:44:10:44:11 | Entry | Switch.cs:50:30:50:38 | After ... != ... [false] | | Switch.cs:44:10:44:11 | Entry | Switch.cs:50:30:50:38 | After ... != ... [true] | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:46:9:52:9 | After switch (...) {...} | -| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:48:13:48:23 | After case ...: [match] | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:48:13:48:23 | After case ...: [no-match] | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [match] | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:30:50:38 | After ... != ... [false] | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:30:50:38 | After ... != ... [true] | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:13:50:39 | After case ...: [match] | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | After ... != ... [false] | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | After ... != ... [true] | -| Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:48:18:48:20 | After access to type Int32 [match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:30:50:38 | After ... != ... [false] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:50:30:50:38 | After ... != ... [true] | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:30:50:38 | After ... != ... [false] | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:30:50:38 | After ... != ... [true] | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | | Switch.cs:50:30:50:38 | After ... != ... [false] | Switch.cs:50:30:50:38 | After ... != ... [false] | | Switch.cs:50:30:50:38 | After ... != ... [true] | Switch.cs:50:30:50:38 | After ... != ... [true] | | Switch.cs:55:10:55:11 | Entry | Switch.cs:55:10:55:11 | Entry | | Switch.cs:55:10:55:11 | Entry | Switch.cs:57:9:63:9 | After switch (...) {...} | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:13:59:19 | After case ...: [match] | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:13:59:19 | After case ...: [no-match] | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:13:61:19 | After case ...: [no-match] | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:18:59:18 | After 2 [match] | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:59:18:59:18 | After 2 [no-match] | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:55:10:55:11 | Entry | Switch.cs:61:18:61:18 | After 3 [no-match] | | Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:57:9:63:9 | After switch (...) {...} | -| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:59:13:59:19 | After case ...: [match] | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:59:13:59:19 | After case ...: [no-match] | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | -| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:59:18:59:18 | After 2 [match] | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:59:18:59:18 | After 2 [no-match] | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:61:18:61:18 | After 3 [no-match] | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:61:18:61:18 | After 3 [no-match] | | Switch.cs:66:10:66:11 | Entry | Switch.cs:66:10:66:11 | Entry | | Switch.cs:66:10:66:11 | Entry | Switch.cs:68:9:74:9 | After switch (...) {...} | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:13:70:23 | After case ...: [match] | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:13:70:23 | After case ...: [no-match] | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:13:72:20 | After case ...: [no-match] | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:18:70:20 | After access to type Int32 [match] | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:66:10:66:11 | Entry | Switch.cs:72:18:72:19 | After "" [no-match] | | Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:68:9:74:9 | After switch (...) {...} | -| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:70:13:70:23 | After case ...: [match] | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:70:13:70:23 | After case ...: [no-match] | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | -| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:70:18:70:20 | After access to type Int32 [match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:72:18:72:19 | After "" [no-match] | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:72:18:72:19 | After "" [no-match] | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:10:77:11 | Entry | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:10:77:11 | Normal Exit | | Switch.cs:77:10:77:11 | Entry | Switch.cs:79:9:87:9 | After switch (...) {...} | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:13:81:19 | After case ...: [match] | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:13:81:19 | After case ...: [no-match] | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:13:83:19 | After case ...: [match] | -| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:13:83:19 | After case ...: [no-match] | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:18:81:18 | After 1 [match] | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:81:18:81:18 | After 1 [no-match] | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:77:10:77:11 | Entry | Switch.cs:83:18:83:18 | After 2 [no-match] | | Switch.cs:77:10:77:11 | Entry | Switch.cs:84:21:84:25 | After ... > ... [false] | | Switch.cs:77:10:77:11 | Entry | Switch.cs:84:21:84:25 | After ... > ... [true] | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:77:10:77:11 | Normal Exit | | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:79:9:87:9 | After switch (...) {...} | -| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:81:13:81:19 | After case ...: [match] | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:79:9:87:9 | After switch (...) {...} | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:81:13:81:19 | After case ...: [no-match] | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [match] | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:84:21:84:25 | After ... > ... [false] | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:84:21:84:25 | After ... > ... [true] | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:83:13:83:19 | After case ...: [match] | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:21:84:25 | After ... > ... [false] | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:21:84:25 | After ... > ... [true] | -| Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:81:18:81:18 | After 1 [match] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:79:9:87:9 | After switch (...) {...} | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:81:18:81:18 | After 1 [no-match] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:83:18:83:18 | After 2 [no-match] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:84:21:84:25 | After ... > ... [false] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:84:21:84:25 | After ... > ... [true] | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:84:21:84:25 | After ... > ... [false] | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:84:21:84:25 | After ... > ... [true] | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:83:18:83:18 | After 2 [no-match] | | Switch.cs:84:21:84:25 | After ... > ... [false] | Switch.cs:84:21:84:25 | After ... > ... [false] | | Switch.cs:84:21:84:25 | After ... > ... [true] | Switch.cs:84:21:84:25 | After ... > ... [true] | | Switch.cs:91:10:91:11 | Entry | Switch.cs:91:10:91:11 | Entry | | Switch.cs:91:10:91:11 | Entry | Switch.cs:91:10:91:11 | Normal Exit | -| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:13:95:23 | After case ...: [match] | -| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:13:95:23 | After case ...: [no-match] | +| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:18:95:20 | After access to type Int32 [match] | +| Switch.cs:91:10:91:11 | Entry | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | | Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:91:10:91:11 | Normal Exit | -| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:95:13:95:23 | After case ...: [match] | -| Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:95:13:95:23 | After case ...: [no-match] | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:95:18:95:20 | After access to type Int32 [match] | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | | Switch.cs:101:9:101:10 | Entry | Switch.cs:101:9:101:10 | Entry | | Switch.cs:101:9:101:10 | Entry | Switch.cs:101:9:101:10 | Normal Exit | | Switch.cs:101:9:101:10 | Entry | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | | Switch.cs:101:9:101:10 | Entry | Switch.cs:103:17:103:17 | After access to parameter s [null] | | Switch.cs:101:9:101:10 | Entry | Switch.cs:103:17:103:25 | After access to property Length | -| Switch.cs:101:9:101:10 | Entry | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:101:9:101:10 | Entry | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:101:9:101:10 | Entry | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:101:9:101:10 | Entry | Switch.cs:106:13:106:19 | After case ...: [no-match] | +| Switch.cs:101:9:101:10 | Entry | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:101:9:101:10 | Entry | Switch.cs:105:18:105:18 | After 0 [no-match] | +| Switch.cs:101:9:101:10 | Entry | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:101:9:101:10 | Entry | Switch.cs:106:18:106:18 | After 1 [no-match] | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:101:9:101:10 | Normal Exit | | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | | Switch.cs:103:17:103:17 | After access to parameter s [null] | Switch.cs:103:17:103:17 | After access to parameter s [null] | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:101:9:101:10 | Normal Exit | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:103:17:103:25 | After access to property Length | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:13:106:19 | After case ...: [no-match] | -| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | After case ...: [no-match] | -| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | After case ...: [no-match] | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:18:105:18 | After 0 [no-match] | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:106:18:106:18 | After 1 [no-match] | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:105:18:105:18 | After 0 [no-match] | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:106:18:106:18 | After 1 [no-match] | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:106:18:106:18 | After 1 [no-match] | | Switch.cs:111:17:111:21 | Entry | Switch.cs:111:17:111:21 | Entry | | Switch.cs:113:9:113:11 | Entry | Switch.cs:113:9:113:11 | Entry | | Switch.cs:113:9:113:11 | Entry | Switch.cs:113:9:113:11 | Normal Exit | | Switch.cs:113:9:113:11 | Entry | Switch.cs:115:9:119:9 | After switch (...) {...} | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:13:117:35 | After case ...: [match] | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:13:117:35 | After case ...: [no-match] | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:18:117:18 | After 3 [match] | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:117:18:117:18 | After 3 [no-match] | | Switch.cs:113:9:113:11 | Entry | Switch.cs:117:25:117:34 | After ... == ... [false] | | Switch.cs:113:9:113:11 | Entry | Switch.cs:117:25:117:34 | After ... == ... [true] | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:118:13:118:34 | After case ...: [match] | -| Switch.cs:113:9:113:11 | Entry | Switch.cs:118:13:118:34 | After case ...: [no-match] | | Switch.cs:113:9:113:11 | Entry | Switch.cs:118:13:118:34 | case ...: | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:113:9:113:11 | Entry | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:113:9:113:11 | Entry | Switch.cs:118:25:118:33 | After ... == ... [false] | | Switch.cs:113:9:113:11 | Entry | Switch.cs:118:25:118:33 | After ... == ... [true] | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:113:9:113:11 | Normal Exit | | Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:115:9:119:9 | After switch (...) {...} | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:13:117:35 | After case ...: [match] | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | After ... == ... [false] | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | After ... == ... [true] | -| Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:117:13:117:35 | After case ...: [no-match] | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:18:117:18 | After 3 [match] | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:25:117:34 | After ... == ... [false] | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:25:117:34 | After ... == ... [true] | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:117:18:117:18 | After 3 [no-match] | | Switch.cs:117:25:117:34 | After ... == ... [false] | Switch.cs:117:25:117:34 | After ... == ... [false] | | Switch.cs:117:25:117:34 | After ... == ... [true] | Switch.cs:117:25:117:34 | After ... == ... [true] | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:13:118:34 | After case ...: [match] | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | After ... == ... [false] | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | After ... == ... [true] | -| Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:118:13:118:34 | After case ...: [no-match] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:115:9:119:9 | After switch (...) {...} | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [match] | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [no-match] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | case ...: | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:25:118:33 | After ... == ... [false] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:25:118:33 | After ... == ... [true] | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:25:118:33 | After ... == ... [false] | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:25:118:33 | After ... == ... [true] | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:118:25:118:33 | After ... == ... [false] | Switch.cs:118:25:118:33 | After ... == ... [false] | | Switch.cs:118:25:118:33 | After ... == ... [true] | Switch.cs:118:25:118:33 | After ... == ... [true] | | Switch.cs:123:10:123:12 | Entry | Switch.cs:123:10:123:12 | Entry | | Switch.cs:123:10:123:12 | Entry | Switch.cs:123:10:123:12 | Normal Exit | | Switch.cs:123:10:123:12 | Entry | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | | Switch.cs:123:10:123:12 | Entry | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | -| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:34 | After ... => ... [match] | -| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:34 | After ... => ... [no-match] | +| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:29 | After Boolean b [match] | +| Switch.cs:123:10:123:12 | Entry | Switch.cs:125:24:125:29 | After Boolean b [no-match] | | Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:123:10:123:12 | Normal Exit | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | -| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:24:125:34 | After ... => ... [match] | -| Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:125:24:125:34 | After ... => ... [no-match] | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:125:24:125:29 | After Boolean b [match] | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:125:24:125:29 | After Boolean b [no-match] | | Switch.cs:129:12:129:14 | Entry | Switch.cs:129:12:129:14 | Entry | | Switch.cs:129:12:129:14 | Entry | Switch.cs:131:16:131:66 | After call to method ToString | | Switch.cs:129:12:129:14 | Entry | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | | Switch.cs:129:12:129:14 | Entry | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | -| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:40 | After ... => ... [match] | -| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:40 | After ... => ... [no-match] | +| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:35 | After String s [match] | +| Switch.cs:129:12:129:14 | Entry | Switch.cs:131:28:131:35 | After String s [no-match] | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:16:131:66 | After call to method ToString | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | -| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:28:131:40 | After ... => ... [match] | -| Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:131:28:131:40 | After ... => ... [no-match] | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:131:28:131:35 | After String s [match] | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:131:28:131:35 | After String s [no-match] | | Switch.cs:134:9:134:11 | Entry | Switch.cs:134:9:134:11 | Entry | | Switch.cs:134:9:134:11 | Entry | Switch.cs:134:9:134:11 | Normal Exit | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:13:139:19 | After case ...: [match] | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:13:139:19 | After case ...: [no-match] | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:13:140:19 | After case ...: [no-match] | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:18:139:18 | After 1 [match] | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:139:18:139:18 | After 1 [no-match] | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:134:9:134:11 | Entry | Switch.cs:140:18:140:18 | After 2 [no-match] | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:134:9:134:11 | Normal Exit | -| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:13:139:19 | After case ...: [match] | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:139:13:139:19 | After case ...: [no-match] | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | After case ...: [no-match] | -| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | After case ...: [no-match] | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:139:18:139:18 | After 1 [match] | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:139:18:139:18 | After 1 [no-match] | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:140:18:140:18 | After 2 [no-match] | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:140:18:140:18 | After 2 [no-match] | | Switch.cs:144:9:144:11 | Entry | Switch.cs:144:9:144:11 | Entry | | Switch.cs:144:9:144:11 | Entry | Switch.cs:144:9:144:11 | Normal Exit | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:13:148:19 | After case ...: [match] | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:13:148:19 | After case ...: [no-match] | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:13:150:19 | After case ...: [no-match] | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:18:148:18 | After 1 [match] | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:148:18:148:18 | After 1 [no-match] | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:144:9:144:11 | Entry | Switch.cs:150:18:150:18 | After 2 [no-match] | | Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:144:9:144:11 | Normal Exit | -| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:13:148:19 | After case ...: [match] | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:148:13:148:19 | After case ...: [no-match] | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | After case ...: [no-match] | -| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | After case ...: [no-match] | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:148:18:148:18 | After 1 [match] | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:148:18:148:18 | After 1 [no-match] | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:150:18:150:18 | After 2 [no-match] | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:150:18:150:18 | After 2 [no-match] | | Switch.cs:154:10:154:12 | Entry | Switch.cs:154:10:154:12 | Entry | | Switch.cs:154:10:154:12 | Entry | Switch.cs:156:17:156:54 | After ... switch { ... } | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:38 | After ... => ... [match] | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:52 | After ... => ... [no-match] | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:154:10:154:12 | Entry | Switch.cs:156:41:156:45 | After false [no-match] | | Switch.cs:154:10:154:12 | Entry | Switch.cs:157:9:160:49 | After if (...) ... | | Switch.cs:154:10:154:12 | Entry | Switch.cs:157:13:157:13 | After access to parameter b [false] | | Switch.cs:154:10:154:12 | Entry | Switch.cs:157:13:157:13 | After access to parameter b [true] | @@ -18902,38 +19096,38 @@ blockDominance | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:157:9:160:49 | After if (...) ... | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:157:13:157:13 | After access to parameter b [false] | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:157:13:157:13 | After access to parameter b [true] | -| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:28:156:38 | After ... => ... [match] | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | -| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:156:41:156:52 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:41:156:45 | After false [no-match] | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:156:41:156:45 | After false [no-match] | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:157:9:160:49 | After if (...) ... | | Switch.cs:157:13:157:13 | After access to parameter b [false] | Switch.cs:157:13:157:13 | After access to parameter b [false] | | Switch.cs:157:13:157:13 | After access to parameter b [true] | Switch.cs:157:13:157:13 | After access to parameter b [true] | | Switch.cs:163:10:163:12 | Entry | Switch.cs:163:10:163:12 | Entry | | Switch.cs:163:10:163:12 | Entry | Switch.cs:165:9:177:9 | After switch (...) {...} | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:13:167:19 | After case ...: [match] | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:13:167:19 | After case ...: [no-match] | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:13:168:19 | After case ...: [match] | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:13:168:19 | After case ...: [no-match] | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:167:18:167:18 | After 1 [no-match] | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:168:18:168:18 | After 2 [no-match] | | Switch.cs:163:10:163:12 | Entry | Switch.cs:169:17:169:51 | ...; | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:13:171:19 | After case ...: [no-match] | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:163:10:163:12 | Entry | Switch.cs:171:18:171:18 | After 3 [no-match] | | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:165:9:177:9 | After switch (...) {...} | -| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:167:13:167:19 | After case ...: [match] | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:167:13:167:19 | After case ...: [no-match] | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | After case ...: [match] | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | After case ...: [no-match] | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | -| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:168:13:168:19 | After case ...: [match] | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | After case ...: [no-match] | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:167:18:167:18 | After 1 [no-match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:168:18:168:18 | After 2 [no-match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:168:18:168:18 | After 2 [no-match] | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | | Switch.cs:169:17:169:51 | ...; | Switch.cs:169:17:169:51 | ...; | -| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | | TypeAccesses.cs:1:7:1:18 | Entry | TypeAccesses.cs:1:7:1:18 | Entry | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:3:10:3:10 | Entry | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:7:9:7:25 | After if (...) ... | @@ -19135,75 +19329,80 @@ blockDominance | cflow.cs:37:17:37:22 | Entry | cflow.cs:37:17:37:22 | Exit | | cflow.cs:37:17:37:22 | Entry | cflow.cs:39:9:50:9 | After switch (...) {...} | | cflow.cs:37:17:37:22 | Entry | cflow.cs:41:13:41:19 | After case ...: [match] | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:13:41:19 | After case ...: [no-match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:18:41:18 | After 1 [match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:41:18:41:18 | After 1 [no-match] | | cflow.cs:37:17:37:22 | Entry | cflow.cs:44:13:44:19 | After case ...: [match] | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:13:47:19 | After case ...: [no-match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:44:18:44:18 | After 2 [match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:37:17:37:22 | Entry | cflow.cs:51:9:59:9 | After switch (...) {...} | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:13:53:20 | After case ...: [no-match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:53:18:53:19 | After 42 [no-match] | | cflow.cs:37:17:37:22 | Entry | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:13:62:19 | After case ...: [no-match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:37:17:37:22 | Entry | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:37:17:37:22 | Entry | cflow.cs:63:23:63:33 | After ... == ... [false] | | cflow.cs:37:17:37:22 | Entry | cflow.cs:63:23:63:33 | After ... == ... [true] | | cflow.cs:37:17:37:22 | Exit | cflow.cs:37:17:37:22 | Exit | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Exit | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:39:9:50:9 | After switch (...) {...} | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:51:9:59:9 | After switch (...) {...} | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [no-match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [no-match] | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [no-match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [false] | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [true] | | cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:41:13:41:19 | After case ...: [match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Exit | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:51:9:59:9 | After switch (...) {...} | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:63:23:63:33 | After ... == ... [false] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:63:23:63:33 | After ... == ... [true] | +| cflow.cs:41:18:41:18 | After 1 [match] | cflow.cs:41:18:41:18 | After 1 [match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:37:17:37:22 | Exit | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:41:18:41:18 | After 1 [no-match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:44:18:44:18 | After 2 [match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:51:9:59:9 | After switch (...) {...} | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:53:18:53:19 | After 42 [no-match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:62:18:62:18 | After 0 [no-match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:63:23:63:33 | After ... == ... [false] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:63:23:63:33 | After ... == ... [true] | | cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:44:13:44:19 | After case ...: [match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Exit | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:51:9:59:9 | After switch (...) {...} | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:63:23:63:33 | After ... == ... [false] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:63:23:63:33 | After ... == ... [true] | -| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | +| cflow.cs:44:18:44:18 | After 2 [match] | cflow.cs:44:18:44:18 | After 2 [match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:37:17:37:22 | Exit | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:51:9:59:9 | After switch (...) {...} | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:53:18:53:19 | After 42 [no-match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:62:18:62:18 | After 0 [no-match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:63:23:63:33 | After ... == ... [false] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:63:23:63:33 | After ... == ... [true] | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Exit | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:51:9:59:9 | After switch (...) {...} | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [no-match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [false] | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [true] | -| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:53:18:53:19 | After 42 [no-match] | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:23:63:33 | After ... == ... [false] | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:23:63:33 | After ... == ... [true] | -| cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:63:23:63:33 | After ... == ... [false] | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:63:23:63:33 | After ... == ... [true] | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:63:23:63:33 | After ... == ... [false] | cflow.cs:63:23:63:33 | After ... == ... [false] | | cflow.cs:63:23:63:33 | After ... == ... [true] | cflow.cs:63:23:63:33 | After ... == ... [true] | | cflow.cs:70:18:70:18 | Entry | cflow.cs:70:18:70:18 | Entry | @@ -19588,12 +19787,12 @@ blockDominance | cflow.cs:240:10:240:13 | Entry | cflow.cs:244:13:244:28 | After ... > ... [false] | | cflow.cs:240:10:240:13 | Entry | cflow.cs:244:13:244:28 | After ... > ... [true] | | cflow.cs:240:10:240:13 | Entry | cflow.cs:246:9:258:9 | After switch (...) {...} | -| cflow.cs:240:10:240:13 | Entry | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:240:10:240:13 | Entry | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:240:10:240:13 | Entry | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:240:10:240:13 | Entry | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:240:10:240:13 | Entry | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:240:10:240:13 | Entry | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:240:10:240:13 | Entry | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:240:10:240:13 | Entry | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:240:10:240:13 | Entry | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:240:10:240:13 | Entry | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:240:10:240:13 | Entry | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:240:10:240:13 | Entry | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:240:10:240:13 | Entry | cflow.cs:255:13:255:20 | After default: [match] | | cflow.cs:242:5:242:9 | Label: | cflow.cs:242:5:242:9 | Label: | | cflow.cs:242:5:242:9 | Label: | cflow.cs:242:12:242:41 | After if (...) ... | @@ -19602,49 +19801,49 @@ blockDominance | cflow.cs:242:5:242:9 | Label: | cflow.cs:244:13:244:28 | After ... > ... [false] | | cflow.cs:242:5:242:9 | Label: | cflow.cs:244:13:244:28 | After ... > ... [true] | | cflow.cs:242:5:242:9 | Label: | cflow.cs:246:9:258:9 | After switch (...) {...} | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:242:5:242:9 | Label: | cflow.cs:255:13:255:20 | After default: [match] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:242:12:242:41 | After if (...) ... | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:244:13:244:28 | After ... > ... [false] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:244:13:244:28 | After ... > ... [true] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:246:9:258:9 | After switch (...) {...} | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:255:13:255:20 | After default: [match] | | cflow.cs:242:19:242:35 | After ... == ... [false] | cflow.cs:242:19:242:35 | After ... == ... [false] | | cflow.cs:242:19:242:35 | After ... == ... [true] | cflow.cs:242:19:242:35 | After ... == ... [true] | | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:244:13:244:28 | After ... > ... [false] | | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:246:9:258:9 | After switch (...) {...} | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:255:13:255:20 | After default: [match] | | cflow.cs:244:13:244:28 | After ... > ... [true] | cflow.cs:244:13:244:28 | After ... > ... [true] | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:246:9:258:9 | After switch (...) {...} | -| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | -| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | -| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:255:13:255:20 | After default: [match] | | cflow.cs:261:49:261:53 | Entry | cflow.cs:261:49:261:53 | Entry | | cflow.cs:261:49:261:53 | Entry | cflow.cs:261:49:261:53 | Exceptional Exit | @@ -22546,34 +22745,34 @@ postBlockDominance | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:16:18:16:28 | After ... is ... [false] | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:20:9:38:9 | After switch (...) {...} | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:27:13:27:24 | After case ...: [no-match] | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:27:13:27:24 | case ...: | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:33:13:33:24 | After case ...: [no-match] | -| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:22:13:22:23 | After case ...: [match] | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:22:13:22:23 | After case ...: [no-match] | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:13:24:36 | After case ...: [match] | -| Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:22:18:22:22 | After "xyz" [match] | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:24:30:24:35 | After ... > ... [false] | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:24:30:24:35 | After ... > ... [true] | Patterns.cs:24:30:24:35 | After ... > ... [true] | -| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:27:13:27:24 | After case ...: [match] | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:27:13:27:24 | After case ...: [no-match] | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:24:13:24:36 | After case ...: [no-match] | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:24:30:24:35 | After ... > ... [false] | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | case ...: | -| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:30:13:30:27 | After case ...: [match] | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | -| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:33:13:33:24 | After case ...: [match] | -| Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:30:18:30:26 | After String s2 [match] | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:30:18:30:26 | After String s2 [no-match] | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:33:18:33:23 | After Object v2 [match] | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:47:24:47:25 | Entry | | Patterns.cs:48:9:48:20 | After ... is ... | Patterns.cs:47:24:47:25 | Entry | | Patterns.cs:48:9:48:20 | After ... is ... | Patterns.cs:48:9:48:20 | After ... is ... | @@ -22606,36 +22805,36 @@ postBlockDominance | Patterns.cs:56:26:56:27 | Entry | Patterns.cs:56:26:56:27 | Entry | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:56:26:56:27 | Entry | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:58:16:62:9 | After ... switch { ... } | -| Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:60:13:60:28 | After ... => ... [match] | -| Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | -| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:13:60:28 | After ... => ... [match] | -| Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | +| Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:60:13:60:17 | After not ... [match] | +| Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:60:13:60:17 | After not ... [no-match] | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:60:13:60:17 | After not ... [match] | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:60:13:60:17 | After not ... [no-match] | | Patterns.cs:65:26:65:27 | Entry | Patterns.cs:65:26:65:27 | Entry | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:65:26:65:27 | Entry | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:67:16:71:9 | After ... switch { ... } | -| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:69:13:69:33 | After ... => ... [match] | -| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | -| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:70:13:70:27 | After ... => ... [match] | -| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | -| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:13:69:33 | After ... => ... [match] | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | -| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:13:70:27 | After ... => ... [match] | -| Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | +| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:69:13:69:17 | After not ... [match] | +| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:69:13:69:17 | After not ... [no-match] | +| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:70:13:70:13 | After 2 [no-match] | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:69:13:69:17 | After not ... [match] | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:69:13:69:17 | After not ... [no-match] | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:70:13:70:13 | After 2 [match] | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:70:13:70:13 | After 2 [no-match] | | Patterns.cs:74:26:74:27 | Entry | Patterns.cs:74:26:74:27 | Entry | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:74:26:74:27 | Entry | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:76:16:82:9 | After ... switch { ... } | -| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:78:13:78:24 | After ... => ... [match] | -| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | -| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:79:13:79:24 | After ... => ... [match] | -| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | -| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:13:78:24 | After ... => ... [match] | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | -| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:13:79:24 | After ... => ... [match] | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | -| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | -| Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | +| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:78:13:78:15 | After > ... [match] | +| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:78:13:78:15 | After > ... [no-match] | +| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:79:13:79:15 | After < ... [no-match] | +| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:80:13:80:13 | After 1 [no-match] | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:78:13:78:15 | After > ... [match] | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:78:13:78:15 | After > ... [no-match] | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:79:13:79:15 | After < ... [match] | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:79:13:79:15 | After < ... [no-match] | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:80:13:80:13 | After 1 [match] | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:80:13:80:13 | After 1 [no-match] | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:26:85:27 | Entry | | Patterns.cs:85:39:85:53 | After ... is ... [false] | Patterns.cs:85:39:85:53 | After ... is ... [false] | | Patterns.cs:85:39:85:53 | [MatchTrue] ... is ... | Patterns.cs:85:39:85:53 | [MatchTrue] ... is ... | @@ -22682,38 +22881,39 @@ postBlockDominance | Switch.cs:10:10:10:11 | Exit | Switch.cs:10:10:10:11 | Exit | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:10:10:10:11 | Entry | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:10:10:10:11 | Normal Exit | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:14:13:14:21 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:14:13:14:21 | After case ...: [no-match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:20:13:20:23 | After case ...: [no-match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:14:18:14:20 | After "a" [match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:14:18:14:20 | After "a" [no-match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:16:18:16:18 | After 0 [no-match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:18:18:18:21 | After null [no-match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:20:18:20:22 | After Int32 i [no-match] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:32:24:43 | After ... > ... [true] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:32:24:55 | After ... && ... [false] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:27:13:27:39 | After case ...: [no-match] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:30:13:30:20 | After default: [match] | -| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:14:13:14:21 | After case ...: [match] | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:14:13:14:21 | After case ...: [no-match] | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:14:18:14:20 | After "a" [match] | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:14:18:14:20 | After "a" [no-match] | | Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:16:13:16:19 | After case ...: [match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:14:13:14:21 | After case ...: [no-match] | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:16:13:16:19 | After case ...: [no-match] | -| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:20:13:20:23 | After case ...: [match] | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | +| Switch.cs:16:18:16:18 | After 0 [match] | Switch.cs:16:18:16:18 | After 0 [match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:14:18:14:20 | After "a" [no-match] | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:16:18:16:18 | After 0 [no-match] | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:18:18:18:21 | After null [no-match] | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:20:18:20:22 | After Int32 i [match] | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:20:18:20:22 | After Int32 i [no-match] | | Switch.cs:21:21:21:29 | After ... == ... [false] | Switch.cs:21:21:21:29 | After ... == ... [false] | -| Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:20:13:20:23 | After case ...: [match] | +| Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:20:18:20:22 | After Int32 i [match] | | Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:21:21:21:29 | After ... == ... [true] | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:13:24:56 | After case ...: [match] | -| Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:18:24:25 | After String s [match] | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:24:32:24:43 | After ... > ... [false] | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:24:32:24:43 | After ... > ... [true] | | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:24:32:24:43 | After ... > ... [false] | @@ -22721,136 +22921,136 @@ postBlockDominance | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:24:48:24:55 | After ... != ... [false] | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:24:48:24:55 | After ... != ... [true] | Switch.cs:24:48:24:55 | After ... != ... [true] | -| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:13:27:39 | After case ...: [match] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:32:24:55 | After ... && ... [false] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:24:48:24:55 | After ... != ... [false] | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | case ...: | -| Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:18:13:18:22 | After case ...: [match] | -| Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:27:18:27:25 | After Double d [match] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:24:18:24:25 | After String s [no-match] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:24:32:24:43 | After ... > ... [false] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:24:32:24:55 | After ... && ... [false] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:24:48:24:55 | After ... != ... [false] | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:27:18:27:25 | After Double d [no-match] | +| Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:18:18:18:21 | After null [match] | +| Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:24:18:24:25 | After String s [no-match] | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:24:32:24:43 | After ... > ... [false] | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:24:32:24:55 | After ... && ... [false] | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:24:48:24:55 | After ... != ... [false] | -| Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:27:13:27:39 | case ...: | +| Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:27:18:27:25 | After Double d [no-match] | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:30:13:30:20 | After default: [match] | | Switch.cs:35:10:35:11 | Entry | Switch.cs:35:10:35:11 | Entry | | Switch.cs:44:10:44:11 | Entry | Switch.cs:44:10:44:11 | Entry | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:44:10:44:11 | Entry | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:46:9:52:9 | After switch (...) {...} | -| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:48:13:48:23 | After case ...: [match] | -| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:48:13:48:23 | After case ...: [no-match] | -| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:50:13:50:39 | After case ...: [match] | -| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:50:13:50:39 | After case ...: [no-match] | +| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:48:18:48:20 | After access to type Int32 [match] | +| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | +| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:50:30:50:38 | After ... != ... [false] | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:50:30:50:38 | After ... != ... [true] | -| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:48:13:48:23 | After case ...: [match] | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:48:13:48:23 | After case ...: [no-match] | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:13:50:39 | After case ...: [match] | -| Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:48:18:48:20 | After access to type Int32 [match] | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:18:50:21 | After access to type Boolean [match] | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | | Switch.cs:50:30:50:38 | After ... != ... [false] | Switch.cs:50:30:50:38 | After ... != ... [false] | | Switch.cs:50:30:50:38 | After ... != ... [true] | Switch.cs:50:30:50:38 | After ... != ... [true] | | Switch.cs:55:10:55:11 | Entry | Switch.cs:55:10:55:11 | Entry | | Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:55:10:55:11 | Entry | | Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:57:9:63:9 | After switch (...) {...} | -| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:59:13:59:19 | After case ...: [match] | -| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:59:13:59:19 | After case ...: [no-match] | -| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:61:13:61:19 | After case ...: [no-match] | -| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:59:13:59:19 | After case ...: [match] | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:59:13:59:19 | After case ...: [no-match] | -| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:61:13:61:19 | After case ...: [match] | -| Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | +| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:59:18:59:18 | After 2 [match] | +| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:59:18:59:18 | After 2 [no-match] | +| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:61:18:61:18 | After 3 [no-match] | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:59:18:59:18 | After 2 [match] | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:59:18:59:18 | After 2 [no-match] | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:61:18:61:18 | After 3 [match] | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:61:18:61:18 | After 3 [no-match] | | Switch.cs:66:10:66:11 | Entry | Switch.cs:66:10:66:11 | Entry | | Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:66:10:66:11 | Entry | | Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:68:9:74:9 | After switch (...) {...} | -| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:70:13:70:23 | After case ...: [match] | -| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:70:13:70:23 | After case ...: [no-match] | -| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:72:13:72:20 | After case ...: [no-match] | -| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:70:13:70:23 | After case ...: [match] | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:70:13:70:23 | After case ...: [no-match] | -| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:72:13:72:20 | After case ...: [match] | -| Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | +| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:70:18:70:20 | After access to type Int32 [match] | +| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | +| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:72:18:72:19 | After "" [no-match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:70:18:70:20 | After access to type Int32 [match] | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:72:18:72:19 | After "" [match] | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:72:18:72:19 | After "" [no-match] | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:10:77:11 | Entry | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:77:10:77:11 | Entry | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:77:10:77:11 | Normal Exit | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:79:9:87:9 | After switch (...) {...} | -| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:81:13:81:19 | After case ...: [match] | -| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:81:13:81:19 | After case ...: [no-match] | -| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:83:13:83:19 | After case ...: [match] | -| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:83:13:83:19 | After case ...: [no-match] | +| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:81:18:81:18 | After 1 [match] | +| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:81:18:81:18 | After 1 [no-match] | +| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:83:18:83:18 | After 2 [no-match] | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:84:21:84:25 | After ... > ... [false] | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:84:21:84:25 | After ... > ... [true] | | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:79:9:87:9 | After switch (...) {...} | -| Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:83:13:83:19 | After case ...: [no-match] | +| Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:83:18:83:18 | After 2 [no-match] | | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:84:21:84:25 | After ... > ... [true] | -| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:81:13:81:19 | After case ...: [match] | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:81:13:81:19 | After case ...: [no-match] | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:83:13:83:19 | After case ...: [match] | -| Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:81:18:81:18 | After 1 [match] | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:81:18:81:18 | After 1 [no-match] | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:83:18:83:18 | After 2 [match] | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:83:18:83:18 | After 2 [no-match] | | Switch.cs:84:21:84:25 | After ... > ... [false] | Switch.cs:84:21:84:25 | After ... > ... [false] | | Switch.cs:84:21:84:25 | After ... > ... [true] | Switch.cs:84:21:84:25 | After ... > ... [true] | | Switch.cs:91:10:91:11 | Entry | Switch.cs:91:10:91:11 | Entry | | Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:91:10:91:11 | Entry | | Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:91:10:91:11 | Normal Exit | -| Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:95:13:95:23 | After case ...: [match] | -| Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:95:13:95:23 | After case ...: [no-match] | -| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:95:13:95:23 | After case ...: [match] | -| Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:95:13:95:23 | After case ...: [no-match] | +| Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:95:18:95:20 | After access to type Int32 [match] | +| Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:95:18:95:20 | After access to type Int32 [match] | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | | Switch.cs:101:9:101:10 | Entry | Switch.cs:101:9:101:10 | Entry | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:101:9:101:10 | Entry | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:101:9:101:10 | Normal Exit | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:103:17:103:17 | After access to parameter s [null] | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:103:17:103:25 | After access to property Length | -| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:106:13:106:19 | After case ...: [no-match] | +| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:105:18:105:18 | After 0 [no-match] | +| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:106:18:106:18 | After 1 [no-match] | | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | | Switch.cs:103:17:103:17 | After access to parameter s [null] | Switch.cs:103:17:103:17 | After access to parameter s [null] | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:101:9:101:10 | Entry | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:103:17:103:17 | After access to parameter s [null] | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:103:17:103:25 | After access to property Length | -| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:13:105:19 | After case ...: [match] | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:105:13:105:19 | After case ...: [no-match] | -| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:13:106:19 | After case ...: [match] | -| Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | After case ...: [no-match] | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:105:18:105:18 | After 0 [match] | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:105:18:105:18 | After 0 [no-match] | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:106:18:106:18 | After 1 [match] | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:106:18:106:18 | After 1 [no-match] | | Switch.cs:111:17:111:21 | Entry | Switch.cs:111:17:111:21 | Entry | | Switch.cs:113:9:113:11 | Entry | Switch.cs:113:9:113:11 | Entry | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:113:9:113:11 | Entry | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:113:9:113:11 | Normal Exit | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:115:9:119:9 | After switch (...) {...} | -| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:117:13:117:35 | After case ...: [match] | -| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:117:13:117:35 | After case ...: [no-match] | +| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:117:18:117:18 | After 3 [match] | +| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:117:18:117:18 | After 3 [no-match] | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:117:25:117:34 | After ... == ... [false] | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:117:25:117:34 | After ... == ... [true] | -| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:13:118:34 | After case ...: [match] | -| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:13:118:34 | After case ...: [no-match] | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:13:118:34 | case ...: | +| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:25:118:33 | After ... == ... [false] | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:118:25:118:33 | After ... == ... [true] | | Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:115:9:119:9 | After switch (...) {...} | -| Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:118:13:118:34 | After case ...: [no-match] | +| Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:118:25:118:33 | After ... == ... [false] | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:13:117:35 | After case ...: [match] | -| Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:117:13:117:35 | After case ...: [no-match] | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:18:117:18 | After 3 [match] | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:117:18:117:18 | After 3 [no-match] | | Switch.cs:117:25:117:34 | After ... == ... [false] | Switch.cs:117:25:117:34 | After ... == ... [false] | | Switch.cs:117:25:117:34 | After ... == ... [true] | Switch.cs:117:25:117:34 | After ... == ... [true] | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:13:118:34 | After case ...: [match] | -| Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:118:13:118:34 | After case ...: [no-match] | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:117:13:117:35 | After case ...: [no-match] | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:117:18:117:18 | After 3 [no-match] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:117:25:117:34 | After ... == ... [false] | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | case ...: | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:18:118:18 | After 2 [match] | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:118:18:118:18 | After 2 [no-match] | | Switch.cs:118:25:118:33 | After ... == ... [false] | Switch.cs:118:25:118:33 | After ... == ... [false] | | Switch.cs:118:25:118:33 | After ... == ... [true] | Switch.cs:118:25:118:33 | After ... == ... [true] | | Switch.cs:123:10:123:12 | Entry | Switch.cs:123:10:123:12 | Entry | @@ -22858,62 +23058,62 @@ postBlockDominance | Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:123:10:123:12 | Normal Exit | | Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | | Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | -| Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:125:24:125:34 | After ... => ... [match] | -| Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:125:24:125:34 | After ... => ... [no-match] | +| Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:125:24:125:29 | After Boolean b [match] | +| Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:125:24:125:29 | After Boolean b [no-match] | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | -| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:24:125:34 | After ... => ... [match] | -| Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:125:24:125:34 | After ... => ... [no-match] | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:125:24:125:29 | After Boolean b [match] | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:125:24:125:29 | After Boolean b [no-match] | | Switch.cs:129:12:129:14 | Entry | Switch.cs:129:12:129:14 | Entry | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:129:12:129:14 | Entry | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:16:131:66 | After call to method ToString | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | -| Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:28:131:40 | After ... => ... [match] | -| Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:28:131:40 | After ... => ... [no-match] | +| Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:28:131:35 | After String s [match] | +| Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:131:28:131:35 | After String s [no-match] | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | -| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:28:131:40 | After ... => ... [match] | -| Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:131:28:131:40 | After ... => ... [no-match] | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:131:28:131:35 | After String s [match] | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:131:28:131:35 | After String s [no-match] | | Switch.cs:134:9:134:11 | Entry | Switch.cs:134:9:134:11 | Entry | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:134:9:134:11 | Entry | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:134:9:134:11 | Normal Exit | -| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:139:13:139:19 | After case ...: [match] | -| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:139:13:139:19 | After case ...: [no-match] | -| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:140:13:140:19 | After case ...: [no-match] | -| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:13:139:19 | After case ...: [match] | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:139:13:139:19 | After case ...: [no-match] | -| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:13:140:19 | After case ...: [match] | -| Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | After case ...: [no-match] | +| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:139:18:139:18 | After 1 [match] | +| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:139:18:139:18 | After 1 [no-match] | +| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:140:18:140:18 | After 2 [no-match] | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:139:18:139:18 | After 1 [match] | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:139:18:139:18 | After 1 [no-match] | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:140:18:140:18 | After 2 [match] | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:140:18:140:18 | After 2 [no-match] | | Switch.cs:144:9:144:11 | Entry | Switch.cs:144:9:144:11 | Entry | | Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:144:9:144:11 | Entry | | Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:144:9:144:11 | Normal Exit | -| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:148:13:148:19 | After case ...: [match] | -| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:148:13:148:19 | After case ...: [no-match] | -| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:150:13:150:19 | After case ...: [no-match] | -| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:13:148:19 | After case ...: [match] | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:148:13:148:19 | After case ...: [no-match] | -| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:13:150:19 | After case ...: [match] | -| Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | After case ...: [no-match] | +| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:148:18:148:18 | After 1 [match] | +| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:148:18:148:18 | After 1 [no-match] | +| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:150:18:150:18 | After 2 [no-match] | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:148:18:148:18 | After 1 [match] | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:148:18:148:18 | After 1 [no-match] | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:150:18:150:18 | After 2 [match] | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:150:18:150:18 | After 2 [no-match] | | Switch.cs:154:10:154:12 | Entry | Switch.cs:154:10:154:12 | Entry | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:154:10:154:12 | Entry | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:17:156:54 | After ... switch { ... } | -| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:28:156:38 | After ... => ... [match] | -| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:41:156:52 | After ... => ... [no-match] | -| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:28:156:38 | After ... => ... [match] | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:156:41:156:52 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | +| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:41:156:45 | After false [no-match] | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:156:41:156:45 | After false [no-match] | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:154:10:154:12 | Entry | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:17:156:54 | After ... switch { ... } | -| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:28:156:38 | After ... => ... [match] | -| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:28:156:38 | After ... => ... [no-match] | -| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:41:156:52 | After ... => ... [match] | -| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:41:156:52 | After ... => ... [no-match] | +| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:28:156:31 | After true [match] | +| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:28:156:31 | After true [no-match] | +| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:41:156:45 | After false [match] | +| Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:156:41:156:45 | After false [no-match] | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:157:9:160:49 | After if (...) ... | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:157:13:157:13 | After access to parameter b [false] | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:157:13:157:13 | After access to parameter b [true] | @@ -22922,22 +23122,22 @@ postBlockDominance | Switch.cs:163:10:163:12 | Entry | Switch.cs:163:10:163:12 | Entry | | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:163:10:163:12 | Entry | | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:165:9:177:9 | After switch (...) {...} | -| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:167:13:167:19 | After case ...: [match] | -| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:167:13:167:19 | After case ...: [no-match] | -| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:168:13:168:19 | After case ...: [match] | -| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:168:13:168:19 | After case ...: [no-match] | +| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:167:18:167:18 | After 1 [no-match] | +| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:168:18:168:18 | After 2 [no-match] | | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:169:17:169:51 | ...; | -| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:171:13:171:19 | After case ...: [no-match] | -| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:167:13:167:19 | After case ...: [match] | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:167:13:167:19 | After case ...: [no-match] | -| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:168:13:168:19 | After case ...: [match] | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | After case ...: [no-match] | -| Switch.cs:169:17:169:51 | ...; | Switch.cs:167:13:167:19 | After case ...: [match] | -| Switch.cs:169:17:169:51 | ...; | Switch.cs:168:13:168:19 | After case ...: [match] | +| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:171:18:171:18 | After 3 [no-match] | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:167:18:167:18 | After 1 [no-match] | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:168:18:168:18 | After 2 [match] | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:168:18:168:18 | After 2 [no-match] | +| Switch.cs:169:17:169:51 | ...; | Switch.cs:167:18:167:18 | After 1 [match] | +| Switch.cs:169:17:169:51 | ...; | Switch.cs:168:18:168:18 | After 2 [match] | | Switch.cs:169:17:169:51 | ...; | Switch.cs:169:17:169:51 | ...; | -| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:171:13:171:19 | After case ...: [match] | -| Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:171:18:171:18 | After 3 [match] | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:171:18:171:18 | After 3 [no-match] | | TypeAccesses.cs:1:7:1:18 | Entry | TypeAccesses.cs:1:7:1:18 | Entry | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:3:10:3:10 | Entry | | TypeAccesses.cs:7:9:7:25 | After if (...) ... | TypeAccesses.cs:3:10:3:10 | Entry | @@ -23090,47 +23290,49 @@ postBlockDominance | cflow.cs:37:17:37:22 | Exit | cflow.cs:37:17:37:22 | Exit | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Entry | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:39:9:50:9 | After switch (...) {...} | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:47:13:47:19 | After case ...: [no-match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:41:18:41:18 | After 1 [no-match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:41:13:41:19 | After case ...: [match] | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Entry | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:41:13:41:19 | After case ...: [no-match] | +| cflow.cs:41:18:41:18 | After 1 [match] | cflow.cs:41:18:41:18 | After 1 [match] | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:37:17:37:22 | Entry | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:41:18:41:18 | After 1 [no-match] | | cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:44:13:44:19 | After case ...: [match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Entry | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | +| cflow.cs:44:18:44:18 | After 2 [match] | cflow.cs:44:18:44:18 | After 2 [match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:37:17:37:22 | Entry | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:41:18:41:18 | After 1 [no-match] | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Entry | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:39:9:50:9 | After switch (...) {...} | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:47:13:47:19 | After case ...: [no-match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:41:18:41:18 | After 1 [no-match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:51:9:59:9 | After switch (...) {...} | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [no-match] | -| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [no-match] | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:53:18:53:19 | After 42 [no-match] | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Entry | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:39:9:50:9 | After switch (...) {...} | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:41:13:41:19 | After case ...: [no-match] | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:44:13:44:19 | After case ...: [no-match] | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:47:13:47:19 | After case ...: [match] | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:47:13:47:19 | After case ...: [no-match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:41:18:41:18 | After 1 [no-match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:44:18:44:18 | After 2 [no-match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:47:18:47:18 | After 3 [match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:47:18:47:18 | After 3 [no-match] | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:51:9:59:9 | After switch (...) {...} | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [match] | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:53:13:53:20 | After case ...: [no-match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:53:18:53:19 | After 42 [no-match] | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:60:9:66:9 | After switch (...) {...} | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:62:13:62:19 | After case ...: [no-match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:63:23:63:33 | After ... == ... [true] | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:62:13:62:19 | After case ...: [match] | -| cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:62:18:62:18 | After 0 [match] | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:62:18:62:18 | After 0 [no-match] | | cflow.cs:63:23:63:33 | After ... == ... [false] | cflow.cs:63:23:63:33 | After ... == ... [false] | -| cflow.cs:63:23:63:33 | After ... == ... [true] | cflow.cs:62:13:62:19 | After case ...: [match] | +| cflow.cs:63:23:63:33 | After ... == ... [true] | cflow.cs:62:18:62:18 | After 0 [match] | | cflow.cs:63:23:63:33 | After ... == ... [true] | cflow.cs:63:23:63:33 | After ... == ... [true] | | cflow.cs:70:18:70:18 | Entry | cflow.cs:70:18:70:18 | Entry | | cflow.cs:70:18:70:18 | Normal Exit | cflow.cs:70:18:70:18 | Entry | @@ -23463,14 +23665,14 @@ postBlockDominance | cflow.cs:242:5:242:9 | Label: | cflow.cs:240:10:240:13 | Entry | | cflow.cs:242:5:242:9 | Label: | cflow.cs:242:5:242:9 | Label: | | cflow.cs:242:5:242:9 | Label: | cflow.cs:244:13:244:28 | After ... > ... [true] | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:253:13:253:19 | After case ...: [match] | +| cflow.cs:242:5:242:9 | Label: | cflow.cs:253:18:253:18 | After 2 [match] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:240:10:240:13 | Entry | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:242:5:242:9 | Label: | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:242:12:242:41 | After if (...) ... | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:242:19:242:35 | After ... == ... [false] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:242:19:242:35 | After ... == ... [true] | | cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:244:13:244:28 | After ... > ... [true] | -| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:13:253:19 | After case ...: [match] | +| cflow.cs:242:12:242:41 | After if (...) ... | cflow.cs:253:18:253:18 | After 2 [match] | | cflow.cs:242:19:242:35 | After ... == ... [false] | cflow.cs:242:19:242:35 | After ... == ... [false] | | cflow.cs:242:19:242:35 | After ... == ... [true] | cflow.cs:242:19:242:35 | After ... == ... [true] | | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:240:10:240:13 | Entry | @@ -23480,7 +23682,7 @@ postBlockDominance | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:242:19:242:35 | After ... == ... [true] | | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:244:13:244:28 | After ... > ... [false] | | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:244:13:244:28 | After ... > ... [true] | -| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:13:253:19 | After case ...: [match] | +| cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:253:18:253:18 | After 2 [match] | | cflow.cs:244:13:244:28 | After ... > ... [true] | cflow.cs:244:13:244:28 | After ... > ... [true] | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:240:10:240:13 | Entry | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:242:5:242:9 | Label: | @@ -23490,21 +23692,21 @@ postBlockDominance | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:244:13:244:28 | After ... > ... [false] | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:244:13:244:28 | After ... > ... [true] | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:246:9:258:9 | After switch (...) {...} | -| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:255:13:255:20 | After default: [match] | -| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:248:13:248:19 | After case ...: [no-match] | -| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:250:13:250:19 | After case ...: [match] | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | After case ...: [no-match] | -| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:253:13:253:19 | After case ...: [match] | -| cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | -| cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:248:13:248:19 | After case ...: [match] | -| cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:248:18:248:18 | After 0 [no-match] | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:250:18:250:18 | After 1 [match] | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:250:18:250:18 | After 1 [no-match] | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:253:18:253:18 | After 2 [match] | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:253:18:253:18 | After 2 [no-match] | +| cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:248:18:248:18 | After 0 [match] | +| cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:253:18:253:18 | After 2 [no-match] | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:255:13:255:20 | After default: [match] | | cflow.cs:261:49:261:53 | Entry | cflow.cs:261:49:261:53 | Entry | | cflow.cs:261:49:261:53 | Exceptional Exit | cflow.cs:261:49:261:53 | Exceptional Exit | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index b0824d758a06..2a3a0a7020f9 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -5616,11 +5616,15 @@ nodeEnclosing | Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:23:17:23:22 | Before break; | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:23:17:23:22 | break; | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:5:10:5:11 | M1 | @@ -5646,6 +5650,8 @@ nodeEnclosing | Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:28:17:28:46 | After call to method WriteLine | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:28:17:28:46 | Before call to method WriteLine | Patterns.cs:5:10:5:11 | M1 | @@ -5665,6 +5671,8 @@ nodeEnclosing | Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:31:17:31:49 | After call to method WriteLine | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:31:17:31:49 | Before call to method WriteLine | Patterns.cs:5:10:5:11 | M1 | @@ -5684,6 +5692,8 @@ nodeEnclosing | Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:34:17:34:22 | Before break; | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:34:17:34:22 | break; | Patterns.cs:5:10:5:11 | M1 | @@ -5772,7 +5782,8 @@ nodeEnclosing | Patterns.cs:58:16:58:16 | access to parameter i | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:58:16:62:9 | ... switch { ... } | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:56:26:56:27 | M5 | -| Patterns.cs:60:13:60:17 | After not ... | Patterns.cs:56:26:56:27 | M5 | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:56:26:56:27 | M5 | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:60:13:60:17 | Before not ... | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:60:13:60:17 | not ... | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:56:26:56:27 | M5 | @@ -5780,6 +5791,7 @@ nodeEnclosing | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:60:17:60:17 | 1 | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:60:22:60:28 | "not 1" | Patterns.cs:56:26:56:27 | M5 | +| Patterns.cs:61:13:61:13 | After _ [match] | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:61:13:61:13 | _ | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:56:26:56:27 | M5 | @@ -5793,7 +5805,8 @@ nodeEnclosing | Patterns.cs:67:16:67:16 | 2 | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:67:16:71:9 | ... switch { ... } | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:65:26:65:27 | M6 | -| Patterns.cs:69:13:69:17 | After not ... | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:69:13:69:17 | Before not ... | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:69:13:69:17 | not ... | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:65:26:65:27 | M6 | @@ -5802,6 +5815,8 @@ nodeEnclosing | Patterns.cs:69:17:69:17 | 2 | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:69:22:69:33 | "impossible" | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:70:13:70:13 | 2 | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:65:26:65:27 | M6 | @@ -5817,7 +5832,8 @@ nodeEnclosing | Patterns.cs:76:16:82:9 | ... switch { ... } | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:78:13:78:15 | > ... | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:78:13:78:15 | After > ... | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:78:13:78:15 | Before > ... | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | @@ -5825,7 +5841,8 @@ nodeEnclosing | Patterns.cs:78:15:78:15 | 1 | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:78:20:78:24 | "> 1" | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:79:13:79:15 | < ... | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:79:13:79:15 | After < ... | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:79:13:79:15 | Before < ... | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | @@ -5833,10 +5850,13 @@ nodeEnclosing | Patterns.cs:79:15:79:15 | 0 | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:79:20:79:24 | "< 0" | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:80:13:80:13 | 1 | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:80:18:80:20 | "1" | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:81:13:81:13 | After _ [match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:81:13:81:13 | _ | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | @@ -6191,12 +6211,16 @@ nodeEnclosing | Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:14:13:14:21 | case ...: | Switch.cs:10:10:10:11 | M2 | | Switch.cs:14:18:14:20 | "a" | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:15:17:15:23 | Before return ...; | Switch.cs:10:10:10:11 | M2 | | Switch.cs:15:17:15:23 | return ...; | Switch.cs:10:10:10:11 | M2 | | Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:16:13:16:19 | case ...: | Switch.cs:10:10:10:11 | M2 | | Switch.cs:16:18:16:18 | 0 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:18:16:18 | After 0 [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:17:17:17:38 | Before throw ...; | Switch.cs:10:10:10:11 | M2 | | Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | M2 | | Switch.cs:17:23:17:37 | After object creation of type Exception | Switch.cs:10:10:10:11 | M2 | @@ -6205,12 +6229,16 @@ nodeEnclosing | Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:18:13:18:22 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:18:18:18:21 | null | Switch.cs:10:10:10:11 | M2 | | Switch.cs:19:17:19:29 | Before goto default; | Switch.cs:10:10:10:11 | M2 | | Switch.cs:19:17:19:29 | goto default; | Switch.cs:10:10:10:11 | M2 | | Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:20:13:20:23 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:20:18:20:22 | Int32 i | Switch.cs:10:10:10:11 | M2 | | Switch.cs:21:17:22:27 | After if (...) ... | Switch.cs:10:10:10:11 | M2 | | Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:10:10:10:11 | M2 | @@ -6228,6 +6256,8 @@ nodeEnclosing | Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:13:24:56 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:18:24:25 | String s | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:32:24:39 | After access to property Length | Switch.cs:10:10:10:11 | M2 | @@ -6258,6 +6288,8 @@ nodeEnclosing | Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:27:18:27:25 | Double d | Switch.cs:10:10:10:11 | M2 | | Switch.cs:27:32:27:38 | Before call to method Throw | Switch.cs:10:10:10:11 | M2 | | Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | M2 | @@ -6287,12 +6319,16 @@ nodeEnclosing | Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:48:13:48:23 | case ...: | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:44:10:44:11 | M4 | | Switch.cs:49:17:49:22 | Before break; | Switch.cs:44:10:44:11 | M4 | | Switch.cs:49:17:49:22 | break; | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:13:50:39 | case ...: | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:30:50:38 | ... != ... | Switch.cs:44:10:44:11 | M4 | @@ -6318,12 +6354,16 @@ nodeEnclosing | Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:55:10:55:11 | M5 | | Switch.cs:59:13:59:19 | case ...: | Switch.cs:55:10:55:11 | M5 | | Switch.cs:59:18:59:18 | 2 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:55:10:55:11 | M5 | | Switch.cs:60:17:60:22 | Before break; | Switch.cs:55:10:55:11 | M5 | | Switch.cs:60:17:60:22 | break; | Switch.cs:55:10:55:11 | M5 | | Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:55:10:55:11 | M5 | | Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:55:10:55:11 | M5 | | Switch.cs:61:13:61:19 | case ...: | Switch.cs:55:10:55:11 | M5 | | Switch.cs:61:18:61:18 | 3 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:55:10:55:11 | M5 | | Switch.cs:62:17:62:22 | Before break; | Switch.cs:55:10:55:11 | M5 | | Switch.cs:62:17:62:22 | break; | Switch.cs:55:10:55:11 | M5 | | Switch.cs:66:10:66:11 | Entry | Switch.cs:66:10:66:11 | M6 | @@ -6341,6 +6381,8 @@ nodeEnclosing | Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:66:10:66:11 | M6 | | Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:66:10:66:11 | M6 | | Switch.cs:70:13:70:23 | case ...: | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:66:10:66:11 | M6 | | Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:66:10:66:11 | M6 | | Switch.cs:71:17:71:22 | Before break; | Switch.cs:66:10:66:11 | M6 | | Switch.cs:71:17:71:22 | break; | Switch.cs:66:10:66:11 | M6 | @@ -6348,6 +6390,8 @@ nodeEnclosing | Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:66:10:66:11 | M6 | | Switch.cs:72:13:72:20 | case ...: | Switch.cs:66:10:66:11 | M6 | | Switch.cs:72:18:72:19 | "" | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:66:10:66:11 | M6 | | Switch.cs:73:17:73:22 | Before break; | Switch.cs:66:10:66:11 | M6 | | Switch.cs:73:17:73:22 | break; | Switch.cs:66:10:66:11 | M6 | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:10:77:11 | M7 | @@ -6363,6 +6407,8 @@ nodeEnclosing | Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:81:13:81:19 | case ...: | Switch.cs:77:10:77:11 | M7 | | Switch.cs:81:18:81:18 | 1 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:82:17:82:28 | Before return ...; | Switch.cs:77:10:77:11 | M7 | | Switch.cs:82:17:82:28 | return ...; | Switch.cs:77:10:77:11 | M7 | | Switch.cs:82:24:82:27 | true | Switch.cs:77:10:77:11 | M7 | @@ -6370,6 +6416,8 @@ nodeEnclosing | Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:83:13:83:19 | case ...: | Switch.cs:77:10:77:11 | M7 | | Switch.cs:83:18:83:18 | 2 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:84:17:85:26 | After if (...) ... | Switch.cs:77:10:77:11 | M7 | | Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:77:10:77:11 | M7 | | Switch.cs:84:21:84:21 | access to parameter j | Switch.cs:77:10:77:11 | M7 | @@ -6397,6 +6445,8 @@ nodeEnclosing | Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:91:10:91:11 | M8 | | Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:91:10:91:11 | M8 | | Switch.cs:95:13:95:23 | case ...: | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:91:10:91:11 | M8 | | Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:91:10:91:11 | M8 | | Switch.cs:96:17:96:28 | Before return ...; | Switch.cs:91:10:91:11 | M8 | | Switch.cs:96:17:96:28 | return ...; | Switch.cs:91:10:91:11 | M8 | @@ -6421,6 +6471,8 @@ nodeEnclosing | Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:105:13:105:19 | case ...: | Switch.cs:101:9:101:10 | M9 | | Switch.cs:105:18:105:18 | 0 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:105:21:105:29 | Before return ...; | Switch.cs:101:9:101:10 | M9 | | Switch.cs:105:21:105:29 | return ...; | Switch.cs:101:9:101:10 | M9 | | Switch.cs:105:28:105:28 | 0 | Switch.cs:101:9:101:10 | M9 | @@ -6428,6 +6480,8 @@ nodeEnclosing | Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:106:13:106:19 | case ...: | Switch.cs:101:9:101:10 | M9 | | Switch.cs:106:18:106:18 | 1 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:106:21:106:29 | Before return ...; | Switch.cs:101:9:101:10 | M9 | | Switch.cs:106:21:106:29 | return ...; | Switch.cs:101:9:101:10 | M9 | | Switch.cs:106:28:106:28 | 1 | Switch.cs:101:9:101:10 | M9 | @@ -6460,6 +6514,8 @@ nodeEnclosing | Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:13:117:35 | case ...: | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:18:117:18 | 3 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:25:117:34 | ... == ... | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:25:117:34 | After ... == ... [false] | Switch.cs:113:9:113:11 | M10 | @@ -6473,6 +6529,8 @@ nodeEnclosing | Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:18:118:18 | 2 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:25:118:33 | ... == ... | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:25:118:33 | After ... == ... [false] | Switch.cs:113:9:113:11 | M10 | @@ -6500,11 +6558,14 @@ nodeEnclosing | Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:24:125:29 | Boolean b | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:24:125:34 | ... => ... | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:37:125:37 | After _ [match] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:37:125:37 | _ | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:37:125:46 | ... => ... | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:123:10:123:12 | M11 | @@ -6525,11 +6586,14 @@ nodeEnclosing | Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:28:131:35 | String s | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:28:131:40 | ... => ... | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:43:131:43 | After _ [match] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:43:131:43 | _ | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:43:131:51 | ... => ... | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:129:12:129:14 | M12 | @@ -6553,6 +6617,8 @@ nodeEnclosing | Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:134:9:134:11 | M13 | | Switch.cs:139:13:139:19 | case ...: | Switch.cs:134:9:134:11 | M13 | | Switch.cs:139:18:139:18 | 1 | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:134:9:134:11 | M13 | | Switch.cs:139:21:139:29 | Before return ...; | Switch.cs:134:9:134:11 | M13 | | Switch.cs:139:21:139:29 | return ...; | Switch.cs:134:9:134:11 | M13 | | Switch.cs:139:28:139:28 | 1 | Switch.cs:134:9:134:11 | M13 | @@ -6560,6 +6626,8 @@ nodeEnclosing | Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:134:9:134:11 | M13 | | Switch.cs:140:13:140:19 | case ...: | Switch.cs:134:9:134:11 | M13 | | Switch.cs:140:18:140:18 | 2 | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:134:9:134:11 | M13 | | Switch.cs:140:21:140:29 | Before return ...; | Switch.cs:134:9:134:11 | M13 | | Switch.cs:140:21:140:29 | return ...; | Switch.cs:134:9:134:11 | M13 | | Switch.cs:140:28:140:28 | 2 | Switch.cs:134:9:134:11 | M13 | @@ -6574,6 +6642,8 @@ nodeEnclosing | Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:144:9:144:11 | M14 | | Switch.cs:148:13:148:19 | case ...: | Switch.cs:144:9:144:11 | M14 | | Switch.cs:148:18:148:18 | 1 | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:144:9:144:11 | M14 | | Switch.cs:148:21:148:29 | Before return ...; | Switch.cs:144:9:144:11 | M14 | | Switch.cs:148:21:148:29 | return ...; | Switch.cs:144:9:144:11 | M14 | | Switch.cs:148:28:148:28 | 1 | Switch.cs:144:9:144:11 | M14 | @@ -6589,6 +6659,8 @@ nodeEnclosing | Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:144:9:144:11 | M14 | | Switch.cs:150:13:150:19 | case ...: | Switch.cs:144:9:144:11 | M14 | | Switch.cs:150:18:150:18 | 2 | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:144:9:144:11 | M14 | | Switch.cs:150:21:150:29 | Before return ...; | Switch.cs:144:9:144:11 | M14 | | Switch.cs:150:21:150:29 | return ...; | Switch.cs:144:9:144:11 | M14 | | Switch.cs:150:28:150:28 | 2 | Switch.cs:144:9:144:11 | M14 | @@ -6607,11 +6679,15 @@ nodeEnclosing | Switch.cs:156:17:156:17 | access to parameter b | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:28:156:31 | true | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:28:156:38 | ... => ... | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:36:156:38 | "a" | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:41:156:45 | false | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:41:156:52 | ... => ... | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:154:10:154:12 | M15 | @@ -6661,10 +6737,14 @@ nodeEnclosing | Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:167:13:167:19 | case ...: | Switch.cs:163:10:163:12 | M16 | | Switch.cs:167:18:167:18 | 1 | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:168:13:168:19 | case ...: | Switch.cs:163:10:163:12 | M16 | | Switch.cs:168:18:168:18 | 2 | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:169:17:169:50 | After call to method WriteLine | Switch.cs:163:10:163:12 | M16 | | Switch.cs:169:17:169:50 | Before call to method WriteLine | Switch.cs:163:10:163:12 | M16 | | Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:163:10:163:12 | M16 | @@ -6677,6 +6757,8 @@ nodeEnclosing | Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:171:13:171:19 | case ...: | Switch.cs:163:10:163:12 | M16 | | Switch.cs:171:18:171:18 | 3 | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:172:17:172:45 | After call to method WriteLine | Switch.cs:163:10:163:12 | M16 | | Switch.cs:172:17:172:45 | Before call to method WriteLine | Switch.cs:163:10:163:12 | M16 | | Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:163:10:163:12 | M16 | @@ -7067,6 +7149,8 @@ nodeEnclosing | cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:41:13:41:19 | case ...: | cflow.cs:37:17:37:22 | Switch | | cflow.cs:41:18:41:18 | 1 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:18:41:18 | After 1 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:42:17:42:38 | After call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:42:17:42:38 | Before call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | @@ -7080,6 +7164,8 @@ nodeEnclosing | cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:44:13:44:19 | case ...: | cflow.cs:37:17:37:22 | Switch | | cflow.cs:44:18:44:18 | 2 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:18:44:18 | After 2 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:45:17:45:38 | After call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:45:17:45:38 | Before call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | @@ -7093,6 +7179,8 @@ nodeEnclosing | cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:47:13:47:19 | case ...: | cflow.cs:37:17:37:22 | Switch | | cflow.cs:47:18:47:18 | 3 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:48:17:48:38 | After call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:48:17:48:38 | Before call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | @@ -7108,6 +7196,8 @@ nodeEnclosing | cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:53:13:53:20 | case ...: | cflow.cs:37:17:37:22 | Switch | | cflow.cs:53:18:53:19 | 42 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:54:17:54:47 | After call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:54:17:54:47 | Before call to method WriteLine | cflow.cs:37:17:37:22 | Switch | | cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | @@ -7139,6 +7229,8 @@ nodeEnclosing | cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:62:13:62:19 | case ...: | cflow.cs:37:17:37:22 | Switch | | cflow.cs:62:18:62:18 | 0 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:63:17:64:55 | After if (...) ... | cflow.cs:37:17:37:22 | Switch | | cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:37:17:37:22 | Switch | | cflow.cs:63:21:63:34 | !... | cflow.cs:37:17:37:22 | Switch | @@ -8075,12 +8167,16 @@ nodeEnclosing | cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:248:13:248:19 | case ...: | cflow.cs:240:10:240:13 | Goto | | cflow.cs:248:18:248:18 | 0 | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:249:17:249:29 | Before goto default; | cflow.cs:240:10:240:13 | Goto | | cflow.cs:249:17:249:29 | goto default; | cflow.cs:240:10:240:13 | Goto | | cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:250:13:250:19 | case ...: | cflow.cs:240:10:240:13 | Goto | | cflow.cs:250:18:250:18 | 1 | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:251:17:251:36 | After call to method WriteLine | cflow.cs:240:10:240:13 | Goto | | cflow.cs:251:17:251:36 | Before call to method WriteLine | cflow.cs:240:10:240:13 | Goto | | cflow.cs:251:17:251:36 | call to method WriteLine | cflow.cs:240:10:240:13 | Goto | @@ -8093,6 +8189,8 @@ nodeEnclosing | cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:253:13:253:19 | case ...: | cflow.cs:240:10:240:13 | Goto | | cflow.cs:253:18:253:18 | 2 | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:254:17:254:27 | Before goto ...; | cflow.cs:240:10:240:13 | Goto | | cflow.cs:254:17:254:27 | goto ...; | cflow.cs:240:10:240:13 | Goto | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:240:10:240:13 | Goto | @@ -9204,19 +9302,19 @@ blockEnclosing | Patterns.cs:16:18:16:28 | After ... is ... [false] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:16:18:16:28 | [MatchTrue] ... is ... | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:30:24:35 | After ... > ... [false] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:24:30:24:35 | After ... > ... [true] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:5:10:5:11 | M1 | -| Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:5:10:5:11 | M1 | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:47:24:47:25 | Entry | Patterns.cs:47:24:47:25 | M2 | | Patterns.cs:48:9:48:20 | After ... is ... | Patterns.cs:47:24:47:25 | M2 | | Patterns.cs:48:9:48:20 | [MatchTrue] ... is ... | Patterns.cs:47:24:47:25 | M2 | @@ -9233,22 +9331,22 @@ blockEnclosing | Patterns.cs:54:9:54:37 | [MatchTrue] ... is ... | Patterns.cs:53:24:53:25 | M4 | | Patterns.cs:56:26:56:27 | Entry | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:56:26:56:27 | M5 | -| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:56:26:56:27 | M5 | -| Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:56:26:56:27 | M5 | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:56:26:56:27 | M5 | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:56:26:56:27 | M5 | | Patterns.cs:65:26:65:27 | Entry | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:65:26:65:27 | M6 | -| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:65:26:65:27 | M6 | -| Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:65:26:65:27 | M6 | -| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:65:26:65:27 | M6 | -| Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:65:26:65:27 | M6 | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:65:26:65:27 | M6 | | Patterns.cs:74:26:74:27 | Entry | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:74:26:74:27 | M7 | -| Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:74:26:74:27 | M7 | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:74:26:74:27 | M7 | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:26:85:27 | M8 | | Patterns.cs:85:39:85:53 | After ... is ... [false] | Patterns.cs:85:26:85:27 | M8 | | Patterns.cs:85:39:85:53 | [MatchTrue] ... is ... | Patterns.cs:85:26:85:27 | M8 | @@ -9281,125 +9379,126 @@ blockEnclosing | Switch.cs:10:10:10:11 | Exceptional Exit | Switch.cs:10:10:10:11 | M2 | | Switch.cs:10:10:10:11 | Exit | Switch.cs:10:10:10:11 | M2 | | Switch.cs:10:10:10:11 | Normal Exit | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:18:16:18 | After 0 [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:21:21:21:29 | After ... == ... [false] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:21:21:21:29 | After ... == ... [true] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:32:24:43 | After ... > ... [false] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:32:24:43 | After ... > ... [true] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:32:24:55 | After ... && ... [false] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:48:24:55 | After ... != ... [false] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:24:48:24:55 | After ... != ... [true] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:10:10:10:11 | M2 | -| Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:27:13:27:39 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:30:13:30:20 | After default: [match] | Switch.cs:10:10:10:11 | M2 | | Switch.cs:35:10:35:11 | Entry | Switch.cs:35:10:35:11 | M3 | | Switch.cs:44:10:44:11 | Entry | Switch.cs:44:10:44:11 | M4 | | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:44:10:44:11 | M4 | -| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:44:10:44:11 | M4 | -| Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:44:10:44:11 | M4 | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:44:10:44:11 | M4 | -| Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:30:50:38 | After ... != ... [false] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:50:30:50:38 | After ... != ... [true] | Switch.cs:44:10:44:11 | M4 | | Switch.cs:55:10:55:11 | Entry | Switch.cs:55:10:55:11 | M5 | | Switch.cs:57:9:63:9 | After switch (...) {...} | Switch.cs:55:10:55:11 | M5 | -| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:55:10:55:11 | M5 | -| Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:55:10:55:11 | M5 | -| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:55:10:55:11 | M5 | -| Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:55:10:55:11 | M5 | | Switch.cs:66:10:66:11 | Entry | Switch.cs:66:10:66:11 | M6 | | Switch.cs:68:9:74:9 | After switch (...) {...} | Switch.cs:66:10:66:11 | M6 | -| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:66:10:66:11 | M6 | -| Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:66:10:66:11 | M6 | -| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:66:10:66:11 | M6 | -| Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:66:10:66:11 | M6 | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:10:77:11 | M7 | | Switch.cs:77:10:77:11 | Normal Exit | Switch.cs:77:10:77:11 | M7 | | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:77:10:77:11 | M7 | -| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:77:10:77:11 | M7 | -| Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:77:10:77:11 | M7 | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:77:10:77:11 | M7 | -| Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:84:21:84:25 | After ... > ... [false] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:84:21:84:25 | After ... > ... [true] | Switch.cs:77:10:77:11 | M7 | | Switch.cs:91:10:91:11 | Entry | Switch.cs:91:10:91:11 | M8 | | Switch.cs:91:10:91:11 | Normal Exit | Switch.cs:91:10:91:11 | M8 | -| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:91:10:91:11 | M8 | -| Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:91:10:91:11 | M8 | | Switch.cs:101:9:101:10 | Entry | Switch.cs:101:9:101:10 | M9 | | Switch.cs:101:9:101:10 | Normal Exit | Switch.cs:101:9:101:10 | M9 | | Switch.cs:103:17:103:17 | After access to parameter s [non-null] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:103:17:103:17 | After access to parameter s [null] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:101:9:101:10 | M9 | -| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:101:9:101:10 | M9 | -| Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:101:9:101:10 | M9 | -| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:101:9:101:10 | M9 | -| Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:101:9:101:10 | M9 | | Switch.cs:111:17:111:21 | Entry | Switch.cs:111:17:111:21 | Throw | | Switch.cs:113:9:113:11 | Entry | Switch.cs:113:9:113:11 | M10 | | Switch.cs:113:9:113:11 | Normal Exit | Switch.cs:113:9:113:11 | M10 | | Switch.cs:115:9:119:9 | After switch (...) {...} | Switch.cs:113:9:113:11 | M10 | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:113:9:113:11 | M10 | -| Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:25:117:34 | After ... == ... [false] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:117:25:117:34 | After ... == ... [true] | Switch.cs:113:9:113:11 | M10 | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:113:9:113:11 | M10 | -| Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:13:118:34 | case ...: | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:25:118:33 | After ... == ... [false] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:118:25:118:33 | After ... == ... [true] | Switch.cs:113:9:113:11 | M10 | | Switch.cs:123:10:123:12 | Entry | Switch.cs:123:10:123:12 | M11 | | Switch.cs:123:10:123:12 | Normal Exit | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:123:10:123:12 | M11 | -| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:123:10:123:12 | M11 | -| Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:123:10:123:12 | M11 | | Switch.cs:129:12:129:14 | Entry | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:16:131:66 | After call to method ToString | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | Switch.cs:129:12:129:14 | M12 | -| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:129:12:129:14 | M12 | -| Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:129:12:129:14 | M12 | | Switch.cs:134:9:134:11 | Entry | Switch.cs:134:9:134:11 | M13 | | Switch.cs:134:9:134:11 | Normal Exit | Switch.cs:134:9:134:11 | M13 | -| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:134:9:134:11 | M13 | -| Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:134:9:134:11 | M13 | -| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:134:9:134:11 | M13 | -| Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:134:9:134:11 | M13 | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:134:9:134:11 | M13 | | Switch.cs:144:9:144:11 | Entry | Switch.cs:144:9:144:11 | M14 | | Switch.cs:144:9:144:11 | Normal Exit | Switch.cs:144:9:144:11 | M14 | -| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:144:9:144:11 | M14 | -| Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:144:9:144:11 | M14 | -| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:144:9:144:11 | M14 | -| Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:144:9:144:11 | M14 | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:144:9:144:11 | M14 | | Switch.cs:154:10:154:12 | Entry | Switch.cs:154:10:154:12 | M15 | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:154:10:154:12 | M15 | -| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:154:10:154:12 | M15 | -| Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:154:10:154:12 | M15 | -| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:154:10:154:12 | M15 | -| Switch.cs:156:41:156:52 | After ... => ... [no-match] | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:154:10:154:12 | M15 | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:154:10:154:12 | M15 | | Switch.cs:157:13:157:13 | After access to parameter b [false] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:157:13:157:13 | After access to parameter b [true] | Switch.cs:154:10:154:12 | M15 | | Switch.cs:163:10:163:12 | Entry | Switch.cs:163:10:163:12 | M16 | | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:163:10:163:12 | M16 | -| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:163:10:163:12 | M16 | -| Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:163:10:163:12 | M16 | -| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:163:10:163:12 | M16 | -| Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:163:10:163:12 | M16 | | Switch.cs:169:17:169:51 | ...; | Switch.cs:163:10:163:12 | M16 | -| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:163:10:163:12 | M16 | -| Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:163:10:163:12 | M16 | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:163:10:163:12 | M16 | | TypeAccesses.cs:1:7:1:18 | Entry | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:3:10:3:10 | Entry | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:9:7:25 | After if (...) ... | TypeAccesses.cs:3:10:3:10 | M | @@ -9443,17 +9542,19 @@ blockEnclosing | cflow.cs:37:17:37:22 | Exit | cflow.cs:37:17:37:22 | Switch | | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Switch | | cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:18:41:18 | After 1 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:18:44:18 | After 2 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:60:9:66:9 | After switch (...) {...} | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:37:17:37:22 | Switch | -| cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:63:23:63:33 | After ... == ... [false] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:63:23:63:33 | After ... == ... [true] | cflow.cs:37:17:37:22 | Switch | | cflow.cs:70:18:70:18 | Entry | cflow.cs:70:18:70:18 | M | @@ -9578,12 +9679,12 @@ blockEnclosing | cflow.cs:244:13:244:28 | After ... > ... [false] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:244:13:244:28 | After ... > ... [true] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:246:9:258:9 | After switch (...) {...} | cflow.cs:240:10:240:13 | Goto | -| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:240:10:240:13 | Goto | -| cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:240:10:240:13 | Goto | -| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:240:10:240:13 | Goto | -| cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:240:10:240:13 | Goto | -| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:240:10:240:13 | Goto | -| cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:240:10:240:13 | Goto | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:240:10:240:13 | Goto | | cflow.cs:261:49:261:53 | Entry | cflow.cs:261:49:261:53 | Yield | | cflow.cs:261:49:261:53 | Exceptional Exit | cflow.cs:261:49:261:53 | Yield | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index f9619e825cc8..da56986ea095 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -5714,18 +5714,22 @@ | Patterns.cs:20:9:38:9 | After switch (...) {...} | Patterns.cs:40:9:42:9 | switch (...) {...} | | | Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:20:17:20:17 | access to local variable o | | | Patterns.cs:20:17:20:17 | access to local variable o | Patterns.cs:22:13:22:23 | case ...: | | -| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:22:18:22:22 | "xyz" | | +| Patterns.cs:22:13:22:23 | After case ...: [match] | Patterns.cs:23:17:23:22 | Before break; | | | Patterns.cs:22:13:22:23 | After case ...: [no-match] | Patterns.cs:24:13:24:36 | case ...: | | -| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:13:22:23 | After case ...: [match] | match | -| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:13:22:23 | After case ...: [no-match] | no-match | -| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:23:17:23:22 | Before break; | | +| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:18:22:22 | "xyz" | | +| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:18:22:22 | After "xyz" [match] | match | +| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:18:22:22 | After "xyz" [no-match] | no-match | +| Patterns.cs:22:18:22:22 | After "xyz" [match] | Patterns.cs:22:13:22:23 | After case ...: [match] | match | +| Patterns.cs:22:18:22:22 | After "xyz" [no-match] | Patterns.cs:22:13:22:23 | After case ...: [no-match] | no-match | | Patterns.cs:23:17:23:22 | Before break; | Patterns.cs:23:17:23:22 | break; | | | Patterns.cs:23:17:23:22 | break; | Patterns.cs:20:9:38:9 | After switch (...) {...} | break | -| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:18:24:23 | Int32 i2 | | +| Patterns.cs:24:13:24:36 | After case ...: [match] | Patterns.cs:24:30:24:35 | Before ... > ... | | | Patterns.cs:24:13:24:36 | After case ...: [no-match] | Patterns.cs:27:13:27:24 | case ...: | | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:13:24:36 | After case ...: [match] | match | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:13:24:36 | After case ...: [no-match] | no-match | -| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:30:24:35 | Before ... > ... | | +| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:18:24:23 | Int32 i2 | | +| Patterns.cs:24:18:24:23 | After Int32 i2 [match] | Patterns.cs:24:13:24:36 | After case ...: [match] | match | +| Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | Patterns.cs:24:13:24:36 | After case ...: [no-match] | no-match | +| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:18:24:23 | After Int32 i2 [match] | match | +| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:18:24:23 | After Int32 i2 [no-match] | no-match | | Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:24:35:24:35 | 0 | | | Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:30:24:35 | After ... > ... [false] | false | | Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:30:24:35 | After ... > ... [true] | true | @@ -5748,11 +5752,13 @@ | Patterns.cs:25:47:25:48 | access to local variable i2 | Patterns.cs:25:46:25:49 | {...} | | | Patterns.cs:26:17:26:22 | Before break; | Patterns.cs:26:17:26:22 | break; | | | Patterns.cs:26:17:26:22 | break; | Patterns.cs:20:9:38:9 | After switch (...) {...} | break | -| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:27:18:27:23 | Int32 i3 | | +| Patterns.cs:27:13:27:24 | After case ...: [match] | Patterns.cs:28:17:28:47 | ...; | | | Patterns.cs:27:13:27:24 | After case ...: [no-match] | Patterns.cs:30:13:30:27 | case ...: | | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [match] | match | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:13:27:24 | After case ...: [no-match] | no-match | -| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:28:17:28:47 | ...; | | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | Int32 i3 | | +| Patterns.cs:27:18:27:23 | After Int32 i3 [match] | Patterns.cs:27:13:27:24 | After case ...: [match] | match | +| Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | Patterns.cs:27:13:27:24 | After case ...: [no-match] | no-match | +| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:18:27:23 | After Int32 i3 [match] | match | +| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:18:27:23 | After Int32 i3 [no-match] | no-match | | Patterns.cs:28:17:28:46 | After call to method WriteLine | Patterns.cs:28:17:28:47 | After ...; | | | Patterns.cs:28:17:28:46 | Before call to method WriteLine | Patterns.cs:28:35:28:45 | Before $"..." | | | Patterns.cs:28:17:28:46 | call to method WriteLine | Patterns.cs:28:17:28:46 | After call to method WriteLine | | @@ -5768,11 +5774,13 @@ | Patterns.cs:28:42:28:43 | access to local variable i3 | Patterns.cs:28:41:28:44 | {...} | | | Patterns.cs:29:17:29:22 | Before break; | Patterns.cs:29:17:29:22 | break; | | | Patterns.cs:29:17:29:22 | break; | Patterns.cs:20:9:38:9 | After switch (...) {...} | break | -| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:30:18:30:26 | String s2 | | +| Patterns.cs:30:13:30:27 | After case ...: [match] | Patterns.cs:31:17:31:50 | ...; | | | Patterns.cs:30:13:30:27 | After case ...: [no-match] | Patterns.cs:33:13:33:24 | case ...: | | -| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [match] | match | -| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:13:30:27 | After case ...: [no-match] | no-match | -| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:31:17:31:50 | ...; | | +| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:18:30:26 | String s2 | | +| Patterns.cs:30:18:30:26 | After String s2 [match] | Patterns.cs:30:13:30:27 | After case ...: [match] | match | +| Patterns.cs:30:18:30:26 | After String s2 [no-match] | Patterns.cs:30:13:30:27 | After case ...: [no-match] | no-match | +| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:18:30:26 | After String s2 [match] | match | +| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:18:30:26 | After String s2 [no-match] | no-match | | Patterns.cs:31:17:31:49 | After call to method WriteLine | Patterns.cs:31:17:31:50 | After ...; | | | Patterns.cs:31:17:31:49 | Before call to method WriteLine | Patterns.cs:31:35:31:48 | Before $"..." | | | Patterns.cs:31:17:31:49 | call to method WriteLine | Patterns.cs:31:17:31:49 | After call to method WriteLine | | @@ -5788,11 +5796,13 @@ | Patterns.cs:31:45:31:46 | access to local variable s2 | Patterns.cs:31:44:31:47 | {...} | | | Patterns.cs:32:17:32:22 | Before break; | Patterns.cs:32:17:32:22 | break; | | | Patterns.cs:32:17:32:22 | break; | Patterns.cs:20:9:38:9 | After switch (...) {...} | break | -| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:33:18:33:23 | Object v2 | | +| Patterns.cs:33:13:33:24 | After case ...: [match] | Patterns.cs:34:17:34:22 | Before break; | | | Patterns.cs:33:13:33:24 | After case ...: [no-match] | Patterns.cs:35:13:35:20 | default: | | -| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [match] | match | -| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:13:33:24 | After case ...: [no-match] | no-match | -| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:34:17:34:22 | Before break; | | +| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:18:33:23 | Object v2 | | +| Patterns.cs:33:18:33:23 | After Object v2 [match] | Patterns.cs:33:13:33:24 | After case ...: [match] | match | +| Patterns.cs:33:18:33:23 | After Object v2 [no-match] | Patterns.cs:33:13:33:24 | After case ...: [no-match] | no-match | +| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:18:33:23 | After Object v2 [match] | match | +| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:18:33:23 | After Object v2 [no-match] | no-match | | Patterns.cs:34:17:34:22 | Before break; | Patterns.cs:34:17:34:22 | break; | | | Patterns.cs:34:17:34:22 | break; | Patterns.cs:20:9:38:9 | After switch (...) {...} | break | | Patterns.cs:35:13:35:20 | After default: [match] | Patterns.cs:36:17:36:52 | ...; | | @@ -5881,18 +5891,20 @@ | Patterns.cs:58:16:58:16 | access to parameter i | Patterns.cs:60:13:60:28 | ... => ... | | | Patterns.cs:58:16:62:9 | ... switch { ... } | Patterns.cs:58:16:58:16 | access to parameter i | | | Patterns.cs:58:16:62:9 | After ... switch { ... } | Patterns.cs:58:9:62:10 | return ...; | | -| Patterns.cs:60:13:60:17 | After not ... | Patterns.cs:60:22:60:28 | "not 1" | | +| Patterns.cs:60:13:60:17 | After not ... [match] | Patterns.cs:60:13:60:28 | After ... => ... [match] | match | +| Patterns.cs:60:13:60:17 | After not ... [no-match] | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | no-match | | Patterns.cs:60:13:60:17 | Before not ... | Patterns.cs:60:17:60:17 | 1 | | -| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | After not ... | | -| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:28 | After ... => ... [match] | match | -| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | no-match | -| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:13:60:17 | Before not ... | | +| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | After not ... [match] | match | +| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | After not ... [no-match] | no-match | +| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:17 | Before not ... | | +| Patterns.cs:60:13:60:28 | After ... => ... [match] | Patterns.cs:60:22:60:28 | "not 1" | | | Patterns.cs:60:13:60:28 | After ... => ... [no-match] | Patterns.cs:61:13:61:24 | ... => ... | | | Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:13:60:17 | not ... | | | Patterns.cs:60:22:60:28 | "not 1" | Patterns.cs:58:16:62:9 | After ... switch { ... } | | -| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:18:61:24 | "other" | | -| Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:61:13:61:24 | After ... => ... [match] | match | -| Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:61:13:61:13 | _ | | +| Patterns.cs:61:13:61:13 | After _ [match] | Patterns.cs:61:13:61:24 | After ... => ... [match] | match | +| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:13:61:13 | After _ [match] | match | +| Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:61:13:61:13 | _ | | +| Patterns.cs:61:13:61:24 | After ... => ... [match] | Patterns.cs:61:18:61:24 | "other" | | | Patterns.cs:61:18:61:24 | "other" | Patterns.cs:58:16:62:9 | After ... switch { ... } | | | Patterns.cs:65:26:65:27 | Entry | Patterns.cs:66:5:72:5 | {...} | | | Patterns.cs:65:26:65:27 | Normal Exit | Patterns.cs:65:26:65:27 | Exit | | @@ -5902,19 +5914,22 @@ | Patterns.cs:67:16:67:16 | 2 | Patterns.cs:69:13:69:33 | ... => ... | | | Patterns.cs:67:16:71:9 | ... switch { ... } | Patterns.cs:67:16:67:16 | 2 | | | Patterns.cs:67:16:71:9 | After ... switch { ... } | Patterns.cs:67:9:71:10 | return ...; | | -| Patterns.cs:69:13:69:17 | After not ... | Patterns.cs:69:22:69:33 | "impossible" | | +| Patterns.cs:69:13:69:17 | After not ... [match] | Patterns.cs:69:13:69:33 | After ... => ... [match] | match | +| Patterns.cs:69:13:69:17 | After not ... [no-match] | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | no-match | | Patterns.cs:69:13:69:17 | Before not ... | Patterns.cs:69:17:69:17 | 2 | | -| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | After not ... | | -| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:33 | After ... => ... [match] | match | -| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | no-match | -| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:13:69:17 | Before not ... | | +| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | After not ... [match] | match | +| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | After not ... [no-match] | no-match | +| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:17 | Before not ... | | +| Patterns.cs:69:13:69:33 | After ... => ... [match] | Patterns.cs:69:22:69:33 | "impossible" | | | Patterns.cs:69:13:69:33 | After ... => ... [no-match] | Patterns.cs:70:13:70:27 | ... => ... | | | Patterns.cs:69:17:69:17 | 2 | Patterns.cs:69:13:69:17 | not ... | | | Patterns.cs:69:22:69:33 | "impossible" | Patterns.cs:67:16:71:9 | After ... switch { ... } | | -| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:18:70:27 | "possible" | | -| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:27 | After ... => ... [match] | match | -| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | no-match | -| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:13:70:13 | 2 | | +| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:13 | After 2 [match] | match | +| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:13 | After 2 [no-match] | no-match | +| Patterns.cs:70:13:70:13 | After 2 [match] | Patterns.cs:70:13:70:27 | After ... => ... [match] | match | +| Patterns.cs:70:13:70:13 | After 2 [no-match] | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | no-match | +| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:13 | 2 | | +| Patterns.cs:70:13:70:27 | After ... => ... [match] | Patterns.cs:70:18:70:27 | "possible" | | | Patterns.cs:70:13:70:27 | After ... => ... [no-match] | Patterns.cs:67:16:71:9 | After ... switch { ... } | | | Patterns.cs:70:18:70:27 | "possible" | Patterns.cs:67:16:71:9 | After ... switch { ... } | | | Patterns.cs:74:26:74:27 | Entry | Patterns.cs:74:33:74:33 | i | | @@ -5926,33 +5941,38 @@ | Patterns.cs:76:16:76:16 | access to parameter i | Patterns.cs:78:13:78:24 | ... => ... | | | Patterns.cs:76:16:82:9 | ... switch { ... } | Patterns.cs:76:16:76:16 | access to parameter i | | | Patterns.cs:76:16:82:9 | After ... switch { ... } | Patterns.cs:76:9:82:10 | return ...; | | -| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | After > ... | | -| Patterns.cs:78:13:78:15 | After > ... | Patterns.cs:78:20:78:24 | "> 1" | | +| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | After > ... [match] | match | +| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | After > ... [no-match] | no-match | +| Patterns.cs:78:13:78:15 | After > ... [match] | Patterns.cs:78:13:78:24 | After ... => ... [match] | match | +| Patterns.cs:78:13:78:15 | After > ... [no-match] | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | no-match | | Patterns.cs:78:13:78:15 | Before > ... | Patterns.cs:78:15:78:15 | 1 | | -| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:24 | After ... => ... [match] | match | -| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | no-match | -| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:13:78:15 | Before > ... | | +| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:15 | Before > ... | | +| Patterns.cs:78:13:78:24 | After ... => ... [match] | Patterns.cs:78:20:78:24 | "> 1" | | | Patterns.cs:78:13:78:24 | After ... => ... [no-match] | Patterns.cs:79:13:79:24 | ... => ... | | | Patterns.cs:78:15:78:15 | 1 | Patterns.cs:78:13:78:15 | > ... | | | Patterns.cs:78:20:78:24 | "> 1" | Patterns.cs:76:16:82:9 | After ... switch { ... } | | -| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | After < ... | | -| Patterns.cs:79:13:79:15 | After < ... | Patterns.cs:79:20:79:24 | "< 0" | | +| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | After < ... [match] | match | +| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | After < ... [no-match] | no-match | +| Patterns.cs:79:13:79:15 | After < ... [match] | Patterns.cs:79:13:79:24 | After ... => ... [match] | match | +| Patterns.cs:79:13:79:15 | After < ... [no-match] | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | no-match | | Patterns.cs:79:13:79:15 | Before < ... | Patterns.cs:79:15:79:15 | 0 | | -| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:24 | After ... => ... [match] | match | -| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | no-match | -| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:13:79:15 | Before < ... | | +| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:15 | Before < ... | | +| Patterns.cs:79:13:79:24 | After ... => ... [match] | Patterns.cs:79:20:79:24 | "< 0" | | | Patterns.cs:79:13:79:24 | After ... => ... [no-match] | Patterns.cs:80:13:80:20 | ... => ... | | | Patterns.cs:79:15:79:15 | 0 | Patterns.cs:79:13:79:15 | < ... | | | Patterns.cs:79:20:79:24 | "< 0" | Patterns.cs:76:16:82:9 | After ... switch { ... } | | -| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:18:80:20 | "1" | | -| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:20 | After ... => ... [match] | match | -| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | no-match | -| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:13:80:13 | 1 | | +| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:13 | After 1 [match] | match | +| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:13 | After 1 [no-match] | no-match | +| Patterns.cs:80:13:80:13 | After 1 [match] | Patterns.cs:80:13:80:20 | After ... => ... [match] | match | +| Patterns.cs:80:13:80:13 | After 1 [no-match] | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | no-match | +| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:13 | 1 | | +| Patterns.cs:80:13:80:20 | After ... => ... [match] | Patterns.cs:80:18:80:20 | "1" | | | Patterns.cs:80:13:80:20 | After ... => ... [no-match] | Patterns.cs:81:13:81:20 | ... => ... | | | Patterns.cs:80:18:80:20 | "1" | Patterns.cs:76:16:82:9 | After ... switch { ... } | | -| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:18:81:20 | "0" | | -| Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:81:13:81:20 | After ... => ... [match] | match | -| Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:81:13:81:13 | _ | | +| Patterns.cs:81:13:81:13 | After _ [match] | Patterns.cs:81:13:81:20 | After ... => ... [match] | match | +| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:13:81:13 | After _ [match] | match | +| Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:81:13:81:13 | _ | | +| Patterns.cs:81:13:81:20 | After ... => ... [match] | Patterns.cs:81:18:81:20 | "0" | | | Patterns.cs:81:18:81:20 | "0" | Patterns.cs:76:16:82:9 | After ... switch { ... } | | | Patterns.cs:85:26:85:27 | Entry | Patterns.cs:85:33:85:33 | i | | | Patterns.cs:85:26:85:27 | Normal Exit | Patterns.cs:85:26:85:27 | Exit | | @@ -6291,35 +6311,43 @@ | Switch.cs:11:5:33:5 | {...} | Switch.cs:12:9:32:9 | switch (...) {...} | | | Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:12:17:12:17 | access to parameter o | | | Switch.cs:12:17:12:17 | access to parameter o | Switch.cs:14:13:14:21 | case ...: | | -| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:14:18:14:20 | "a" | | +| Switch.cs:14:13:14:21 | After case ...: [match] | Switch.cs:15:17:15:23 | Before return ...; | | | Switch.cs:14:13:14:21 | After case ...: [no-match] | Switch.cs:16:13:16:19 | case ...: | | -| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:13:14:21 | After case ...: [match] | match | -| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:13:14:21 | After case ...: [no-match] | no-match | -| Switch.cs:14:18:14:20 | "a" | Switch.cs:15:17:15:23 | Before return ...; | | +| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:18:14:20 | "a" | | +| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:18:14:20 | After "a" [match] | match | +| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:18:14:20 | After "a" [no-match] | no-match | +| Switch.cs:14:18:14:20 | After "a" [match] | Switch.cs:14:13:14:21 | After case ...: [match] | match | +| Switch.cs:14:18:14:20 | After "a" [no-match] | Switch.cs:14:13:14:21 | After case ...: [no-match] | no-match | | Switch.cs:15:17:15:23 | Before return ...; | Switch.cs:15:17:15:23 | return ...; | | | Switch.cs:15:17:15:23 | return ...; | Switch.cs:10:10:10:11 | Normal Exit | return | -| Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:16:18:16:18 | 0 | | +| Switch.cs:16:13:16:19 | After case ...: [match] | Switch.cs:17:17:17:38 | Before throw ...; | | | Switch.cs:16:13:16:19 | After case ...: [no-match] | Switch.cs:18:13:18:22 | case ...: | | -| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:13:16:19 | After case ...: [match] | match | -| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:13:16:19 | After case ...: [no-match] | no-match | -| Switch.cs:16:18:16:18 | 0 | Switch.cs:17:17:17:38 | Before throw ...; | | +| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:18:16:18 | 0 | | +| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:18:16:18 | After 0 [match] | match | +| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:18:16:18 | After 0 [no-match] | no-match | +| Switch.cs:16:18:16:18 | After 0 [match] | Switch.cs:16:13:16:19 | After case ...: [match] | match | +| Switch.cs:16:18:16:18 | After 0 [no-match] | Switch.cs:16:13:16:19 | After case ...: [no-match] | no-match | | Switch.cs:17:17:17:38 | Before throw ...; | Switch.cs:17:23:17:37 | Before object creation of type Exception | | | Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | Exceptional Exit | exception | | Switch.cs:17:23:17:37 | After object creation of type Exception | Switch.cs:17:17:17:38 | throw ...; | | | Switch.cs:17:23:17:37 | Before object creation of type Exception | Switch.cs:17:23:17:37 | object creation of type Exception | | | Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:23:17:37 | After object creation of type Exception | | -| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:18:18:18:21 | null | | +| Switch.cs:18:13:18:22 | After case ...: [match] | Switch.cs:19:17:19:29 | Before goto default; | | | Switch.cs:18:13:18:22 | After case ...: [no-match] | Switch.cs:20:13:20:23 | case ...: | | -| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:13:18:22 | After case ...: [match] | match | -| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:13:18:22 | After case ...: [no-match] | no-match | -| Switch.cs:18:18:18:21 | null | Switch.cs:19:17:19:29 | Before goto default; | | +| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:18:18:21 | null | | +| Switch.cs:18:18:18:21 | After null [match] | Switch.cs:18:13:18:22 | After case ...: [match] | match | +| Switch.cs:18:18:18:21 | After null [no-match] | Switch.cs:18:13:18:22 | After case ...: [no-match] | no-match | +| Switch.cs:18:18:18:21 | null | Switch.cs:18:18:18:21 | After null [match] | match | +| Switch.cs:18:18:18:21 | null | Switch.cs:18:18:18:21 | After null [no-match] | no-match | | Switch.cs:19:17:19:29 | Before goto default; | Switch.cs:19:17:19:29 | goto default; | | | Switch.cs:19:17:19:29 | goto default; | Switch.cs:30:13:30:20 | After default: [match] | goto | -| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:20:18:20:22 | Int32 i | | +| Switch.cs:20:13:20:23 | After case ...: [match] | Switch.cs:21:17:22:27 | if (...) ... | | | Switch.cs:20:13:20:23 | After case ...: [no-match] | Switch.cs:24:13:24:56 | case ...: | | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:13:20:23 | After case ...: [match] | match | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:13:20:23 | After case ...: [no-match] | no-match | -| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:21:17:22:27 | if (...) ... | | +| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:18:20:22 | Int32 i | | +| Switch.cs:20:18:20:22 | After Int32 i [match] | Switch.cs:20:13:20:23 | After case ...: [match] | match | +| Switch.cs:20:18:20:22 | After Int32 i [no-match] | Switch.cs:20:13:20:23 | After case ...: [no-match] | no-match | +| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:18:20:22 | After Int32 i [match] | match | +| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:18:20:22 | After Int32 i [no-match] | no-match | | Switch.cs:21:17:22:27 | After if (...) ... | Switch.cs:23:17:23:28 | Before goto case ...; | | | Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:21:21:21:29 | Before ... == ... | | | Switch.cs:21:21:21:21 | access to parameter o | Switch.cs:21:26:21:29 | null | | @@ -6334,11 +6362,13 @@ | Switch.cs:23:17:23:28 | Before goto case ...; | Switch.cs:23:27:23:27 | 0 | | | Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:16:13:16:19 | After case ...: [match] | goto | | Switch.cs:23:27:23:27 | 0 | Switch.cs:23:17:23:28 | goto case ...; | | -| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:18:24:25 | String s | | +| Switch.cs:24:13:24:56 | After case ...: [match] | Switch.cs:24:32:24:55 | ... && ... | | | Switch.cs:24:13:24:56 | After case ...: [no-match] | Switch.cs:27:13:27:39 | case ...: | | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:13:24:56 | After case ...: [match] | match | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:13:24:56 | After case ...: [no-match] | no-match | -| Switch.cs:24:18:24:25 | String s | Switch.cs:24:32:24:55 | ... && ... | | +| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:18:24:25 | String s | | +| Switch.cs:24:18:24:25 | After String s [match] | Switch.cs:24:13:24:56 | After case ...: [match] | match | +| Switch.cs:24:18:24:25 | After String s [no-match] | Switch.cs:24:13:24:56 | After case ...: [no-match] | no-match | +| Switch.cs:24:18:24:25 | String s | Switch.cs:24:18:24:25 | After String s [match] | match | +| Switch.cs:24:18:24:25 | String s | Switch.cs:24:18:24:25 | After String s [no-match] | no-match | | Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:24:32:24:39 | access to property Length | | | Switch.cs:24:32:24:39 | After access to property Length | Switch.cs:24:43:24:43 | 0 | | | Switch.cs:24:32:24:39 | Before access to property Length | Switch.cs:24:32:24:32 | access to local variable s | | @@ -6367,11 +6397,13 @@ | Switch.cs:25:35:25:35 | access to local variable s | Switch.cs:25:17:25:36 | call to method WriteLine | | | Switch.cs:26:17:26:23 | Before return ...; | Switch.cs:26:17:26:23 | return ...; | | | Switch.cs:26:17:26:23 | return ...; | Switch.cs:10:10:10:11 | Normal Exit | return | -| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:18:27:25 | Double d | | +| Switch.cs:27:13:27:39 | After case ...: [match] | Switch.cs:27:32:27:38 | Before call to method Throw | | | Switch.cs:27:13:27:39 | After case ...: [no-match] | Switch.cs:30:13:30:20 | default: | | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [match] | match | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:13:27:39 | After case ...: [no-match] | no-match | -| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:32:27:38 | Before call to method Throw | | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | | +| Switch.cs:27:18:27:25 | After Double d [match] | Switch.cs:27:13:27:39 | After case ...: [match] | match | +| Switch.cs:27:18:27:25 | After Double d [no-match] | Switch.cs:27:13:27:39 | After case ...: [no-match] | no-match | +| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:18:27:25 | After Double d [match] | match | +| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:18:27:25 | After Double d [no-match] | no-match | | Switch.cs:27:32:27:38 | Before call to method Throw | Switch.cs:27:32:27:38 | call to method Throw | | | Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | Exceptional Exit | exception | | Switch.cs:28:13:28:17 | Label: | Switch.cs:29:17:29:23 | Before return ...; | | @@ -6395,18 +6427,22 @@ | Switch.cs:46:9:52:9 | After switch (...) {...} | Switch.cs:45:5:53:5 | After {...} | | | Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:46:17:46:17 | access to parameter o | | | Switch.cs:46:17:46:17 | access to parameter o | Switch.cs:48:13:48:23 | case ...: | | -| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:48:18:48:20 | access to type Int32 | | +| Switch.cs:48:13:48:23 | After case ...: [match] | Switch.cs:49:17:49:22 | Before break; | | | Switch.cs:48:13:48:23 | After case ...: [no-match] | Switch.cs:50:13:50:39 | case ...: | | -| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:13:48:23 | After case ...: [match] | match | -| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:13:48:23 | After case ...: [no-match] | no-match | -| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:49:17:49:22 | Before break; | | +| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:18:48:20 | access to type Int32 | | +| Switch.cs:48:18:48:20 | After access to type Int32 [match] | Switch.cs:48:13:48:23 | After case ...: [match] | match | +| Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | Switch.cs:48:13:48:23 | After case ...: [no-match] | no-match | +| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:18:48:20 | After access to type Int32 [match] | match | +| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:18:48:20 | After access to type Int32 [no-match] | no-match | | Switch.cs:49:17:49:22 | Before break; | Switch.cs:49:17:49:22 | break; | | | Switch.cs:49:17:49:22 | break; | Switch.cs:46:9:52:9 | After switch (...) {...} | break | -| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:18:50:21 | access to type Boolean | | +| Switch.cs:50:13:50:39 | After case ...: [match] | Switch.cs:50:30:50:38 | Before ... != ... | | | Switch.cs:50:13:50:39 | After case ...: [no-match] | Switch.cs:46:9:52:9 | After switch (...) {...} | | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:13:50:39 | After case ...: [match] | match | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:13:50:39 | After case ...: [no-match] | no-match | -| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:30:50:38 | Before ... != ... | | +| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:18:50:21 | access to type Boolean | | +| Switch.cs:50:18:50:21 | After access to type Boolean [match] | Switch.cs:50:13:50:39 | After case ...: [match] | match | +| Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | Switch.cs:50:13:50:39 | After case ...: [no-match] | no-match | +| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:18:50:21 | After access to type Boolean [match] | match | +| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:18:50:21 | After access to type Boolean [no-match] | no-match | | Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:50:35:50:38 | null | | | Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:30:50:38 | After ... != ... [false] | false | | Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:30:50:38 | After ... != ... [true] | true | @@ -6427,18 +6463,22 @@ | Switch.cs:57:17:57:21 | After ... + ... | Switch.cs:59:13:59:19 | case ...: | | | Switch.cs:57:17:57:21 | Before ... + ... | Switch.cs:57:17:57:17 | 1 | | | Switch.cs:57:21:57:21 | 2 | Switch.cs:57:17:57:21 | ... + ... | | -| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:59:18:59:18 | 2 | | +| Switch.cs:59:13:59:19 | After case ...: [match] | Switch.cs:60:17:60:22 | Before break; | | | Switch.cs:59:13:59:19 | After case ...: [no-match] | Switch.cs:61:13:61:19 | case ...: | | -| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:13:59:19 | After case ...: [match] | match | -| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:13:59:19 | After case ...: [no-match] | no-match | -| Switch.cs:59:18:59:18 | 2 | Switch.cs:60:17:60:22 | Before break; | | +| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:18:59:18 | 2 | | +| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:18:59:18 | After 2 [match] | match | +| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:18:59:18 | After 2 [no-match] | no-match | +| Switch.cs:59:18:59:18 | After 2 [match] | Switch.cs:59:13:59:19 | After case ...: [match] | match | +| Switch.cs:59:18:59:18 | After 2 [no-match] | Switch.cs:59:13:59:19 | After case ...: [no-match] | no-match | | Switch.cs:60:17:60:22 | Before break; | Switch.cs:60:17:60:22 | break; | | | Switch.cs:60:17:60:22 | break; | Switch.cs:57:9:63:9 | After switch (...) {...} | break | -| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:61:18:61:18 | 3 | | +| Switch.cs:61:13:61:19 | After case ...: [match] | Switch.cs:62:17:62:22 | Before break; | | | Switch.cs:61:13:61:19 | After case ...: [no-match] | Switch.cs:57:9:63:9 | After switch (...) {...} | | -| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:13:61:19 | After case ...: [match] | match | -| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:13:61:19 | After case ...: [no-match] | no-match | -| Switch.cs:61:18:61:18 | 3 | Switch.cs:62:17:62:22 | Before break; | | +| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:18:61:18 | 3 | | +| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:18:61:18 | After 3 [match] | match | +| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:18:61:18 | After 3 [no-match] | no-match | +| Switch.cs:61:18:61:18 | After 3 [match] | Switch.cs:61:13:61:19 | After case ...: [match] | match | +| Switch.cs:61:18:61:18 | After 3 [no-match] | Switch.cs:61:13:61:19 | After case ...: [no-match] | no-match | | Switch.cs:62:17:62:22 | Before break; | Switch.cs:62:17:62:22 | break; | | | Switch.cs:62:17:62:22 | break; | Switch.cs:57:9:63:9 | After switch (...) {...} | break | | Switch.cs:66:10:66:11 | Entry | Switch.cs:66:20:66:20 | s | | @@ -6452,18 +6492,22 @@ | Switch.cs:68:17:68:25 | After (...) ... | Switch.cs:70:13:70:23 | case ...: | | | Switch.cs:68:17:68:25 | Before (...) ... | Switch.cs:68:25:68:25 | access to parameter s | | | Switch.cs:68:25:68:25 | access to parameter s | Switch.cs:68:17:68:25 | (...) ... | | -| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:70:18:70:20 | access to type Int32 | | +| Switch.cs:70:13:70:23 | After case ...: [match] | Switch.cs:71:17:71:22 | Before break; | | | Switch.cs:70:13:70:23 | After case ...: [no-match] | Switch.cs:72:13:72:20 | case ...: | | -| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:13:70:23 | After case ...: [match] | match | -| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:13:70:23 | After case ...: [no-match] | no-match | -| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:71:17:71:22 | Before break; | | +| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:18:70:20 | access to type Int32 | | +| Switch.cs:70:18:70:20 | After access to type Int32 [match] | Switch.cs:70:13:70:23 | After case ...: [match] | match | +| Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | Switch.cs:70:13:70:23 | After case ...: [no-match] | no-match | +| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:18:70:20 | After access to type Int32 [match] | match | +| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:18:70:20 | After access to type Int32 [no-match] | no-match | | Switch.cs:71:17:71:22 | Before break; | Switch.cs:71:17:71:22 | break; | | | Switch.cs:71:17:71:22 | break; | Switch.cs:68:9:74:9 | After switch (...) {...} | break | -| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:72:18:72:19 | "" | | +| Switch.cs:72:13:72:20 | After case ...: [match] | Switch.cs:73:17:73:22 | Before break; | | | Switch.cs:72:13:72:20 | After case ...: [no-match] | Switch.cs:68:9:74:9 | After switch (...) {...} | | -| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:13:72:20 | After case ...: [match] | match | -| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:13:72:20 | After case ...: [no-match] | no-match | -| Switch.cs:72:18:72:19 | "" | Switch.cs:73:17:73:22 | Before break; | | +| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:18:72:19 | "" | | +| Switch.cs:72:18:72:19 | "" | Switch.cs:72:18:72:19 | After "" [match] | match | +| Switch.cs:72:18:72:19 | "" | Switch.cs:72:18:72:19 | After "" [no-match] | no-match | +| Switch.cs:72:18:72:19 | After "" [match] | Switch.cs:72:13:72:20 | After case ...: [match] | match | +| Switch.cs:72:18:72:19 | After "" [no-match] | Switch.cs:72:13:72:20 | After case ...: [no-match] | no-match | | Switch.cs:73:17:73:22 | Before break; | Switch.cs:73:17:73:22 | break; | | | Switch.cs:73:17:73:22 | break; | Switch.cs:68:9:74:9 | After switch (...) {...} | break | | Switch.cs:77:10:77:11 | Entry | Switch.cs:77:17:77:17 | i | | @@ -6474,19 +6518,23 @@ | Switch.cs:79:9:87:9 | After switch (...) {...} | Switch.cs:88:9:88:21 | Before return ...; | | | Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:79:17:79:17 | access to parameter i | | | Switch.cs:79:17:79:17 | access to parameter i | Switch.cs:81:13:81:19 | case ...: | | -| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:81:18:81:18 | 1 | | +| Switch.cs:81:13:81:19 | After case ...: [match] | Switch.cs:82:17:82:28 | Before return ...; | | | Switch.cs:81:13:81:19 | After case ...: [no-match] | Switch.cs:83:13:83:19 | case ...: | | -| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:13:81:19 | After case ...: [match] | match | -| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:13:81:19 | After case ...: [no-match] | no-match | -| Switch.cs:81:18:81:18 | 1 | Switch.cs:82:17:82:28 | Before return ...; | | +| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:18:81:18 | 1 | | +| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:18:81:18 | After 1 [match] | match | +| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:18:81:18 | After 1 [no-match] | no-match | +| Switch.cs:81:18:81:18 | After 1 [match] | Switch.cs:81:13:81:19 | After case ...: [match] | match | +| Switch.cs:81:18:81:18 | After 1 [no-match] | Switch.cs:81:13:81:19 | After case ...: [no-match] | no-match | | Switch.cs:82:17:82:28 | Before return ...; | Switch.cs:82:24:82:27 | true | | | Switch.cs:82:17:82:28 | return ...; | Switch.cs:77:10:77:11 | Normal Exit | return | | Switch.cs:82:24:82:27 | true | Switch.cs:82:17:82:28 | return ...; | | -| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:83:18:83:18 | 2 | | +| Switch.cs:83:13:83:19 | After case ...: [match] | Switch.cs:84:17:85:26 | if (...) ... | | | Switch.cs:83:13:83:19 | After case ...: [no-match] | Switch.cs:79:9:87:9 | After switch (...) {...} | | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:13:83:19 | After case ...: [match] | match | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:13:83:19 | After case ...: [no-match] | no-match | -| Switch.cs:83:18:83:18 | 2 | Switch.cs:84:17:85:26 | if (...) ... | | +| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:18:83:18 | 2 | | +| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:18:83:18 | After 2 [match] | match | +| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:18:83:18 | After 2 [no-match] | no-match | +| Switch.cs:83:18:83:18 | After 2 [match] | Switch.cs:83:13:83:19 | After case ...: [match] | match | +| Switch.cs:83:18:83:18 | After 2 [no-match] | Switch.cs:83:13:83:19 | After case ...: [no-match] | no-match | | Switch.cs:84:17:85:26 | After if (...) ... | Switch.cs:86:17:86:28 | Before return ...; | | | Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:84:21:84:25 | Before ... > ... | | | Switch.cs:84:21:84:21 | access to parameter j | Switch.cs:84:25:84:25 | 2 | | @@ -6511,11 +6559,13 @@ | Switch.cs:93:9:97:9 | After switch (...) {...} | Switch.cs:98:9:98:21 | Before return ...; | | | Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:93:17:93:17 | access to parameter o | | | Switch.cs:93:17:93:17 | access to parameter o | Switch.cs:95:13:95:23 | case ...: | | -| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:95:18:95:20 | access to type Int32 | | +| Switch.cs:95:13:95:23 | After case ...: [match] | Switch.cs:96:17:96:28 | Before return ...; | | | Switch.cs:95:13:95:23 | After case ...: [no-match] | Switch.cs:93:9:97:9 | After switch (...) {...} | | -| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:13:95:23 | After case ...: [match] | match | -| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:13:95:23 | After case ...: [no-match] | no-match | -| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:96:17:96:28 | Before return ...; | | +| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:18:95:20 | access to type Int32 | | +| Switch.cs:95:18:95:20 | After access to type Int32 [match] | Switch.cs:95:13:95:23 | After case ...: [match] | match | +| Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | Switch.cs:95:13:95:23 | After case ...: [no-match] | no-match | +| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:18:95:20 | After access to type Int32 [match] | match | +| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:18:95:20 | After access to type Int32 [no-match] | no-match | | Switch.cs:96:17:96:28 | Before return ...; | Switch.cs:96:24:96:27 | true | | | Switch.cs:96:17:96:28 | return ...; | Switch.cs:91:10:91:11 | Normal Exit | return | | Switch.cs:96:24:96:27 | true | Switch.cs:96:17:96:28 | return ...; | | @@ -6535,19 +6585,23 @@ | Switch.cs:103:17:103:25 | After access to property Length | Switch.cs:105:13:105:19 | case ...: | | | Switch.cs:103:17:103:25 | Before access to property Length | Switch.cs:103:17:103:17 | access to parameter s | | | Switch.cs:103:17:103:25 | access to property Length | Switch.cs:103:17:103:25 | After access to property Length | | -| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:18:105:18 | 0 | | +| Switch.cs:105:13:105:19 | After case ...: [match] | Switch.cs:105:21:105:29 | Before return ...; | | | Switch.cs:105:13:105:19 | After case ...: [no-match] | Switch.cs:106:13:106:19 | case ...: | | -| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:13:105:19 | After case ...: [match] | match | -| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:13:105:19 | After case ...: [no-match] | no-match | -| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:21:105:29 | Before return ...; | | +| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:18:105:18 | 0 | | +| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:18:105:18 | After 0 [match] | match | +| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:18:105:18 | After 0 [no-match] | no-match | +| Switch.cs:105:18:105:18 | After 0 [match] | Switch.cs:105:13:105:19 | After case ...: [match] | match | +| Switch.cs:105:18:105:18 | After 0 [no-match] | Switch.cs:105:13:105:19 | After case ...: [no-match] | no-match | | Switch.cs:105:21:105:29 | Before return ...; | Switch.cs:105:28:105:28 | 0 | | | Switch.cs:105:21:105:29 | return ...; | Switch.cs:101:9:101:10 | Normal Exit | return | | Switch.cs:105:28:105:28 | 0 | Switch.cs:105:21:105:29 | return ...; | | -| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:18:106:18 | 1 | | +| Switch.cs:106:13:106:19 | After case ...: [match] | Switch.cs:106:21:106:29 | Before return ...; | | | Switch.cs:106:13:106:19 | After case ...: [no-match] | Switch.cs:103:9:107:9 | After switch (...) {...} | | -| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:13:106:19 | After case ...: [match] | match | -| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:13:106:19 | After case ...: [no-match] | no-match | -| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:21:106:29 | Before return ...; | | +| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:18:106:18 | 1 | | +| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:18:106:18 | After 1 [match] | match | +| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:18:106:18 | After 1 [no-match] | no-match | +| Switch.cs:106:18:106:18 | After 1 [match] | Switch.cs:106:13:106:19 | After case ...: [match] | match | +| Switch.cs:106:18:106:18 | After 1 [no-match] | Switch.cs:106:13:106:19 | After case ...: [no-match] | no-match | | Switch.cs:106:21:106:29 | Before return ...; | Switch.cs:106:28:106:28 | 1 | | | Switch.cs:106:21:106:29 | return ...; | Switch.cs:101:9:101:10 | Normal Exit | return | | Switch.cs:106:28:106:28 | 1 | Switch.cs:106:21:106:29 | return ...; | | @@ -6574,11 +6628,13 @@ | Switch.cs:115:17:115:24 | After access to property Length | Switch.cs:117:13:117:35 | case ...: | | | Switch.cs:115:17:115:24 | Before access to property Length | Switch.cs:115:17:115:17 | access to parameter s | | | Switch.cs:115:17:115:24 | access to property Length | Switch.cs:115:17:115:24 | After access to property Length | | -| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:18:117:18 | 3 | | +| Switch.cs:117:13:117:35 | After case ...: [match] | Switch.cs:117:25:117:34 | Before ... == ... | | | Switch.cs:117:13:117:35 | After case ...: [no-match] | Switch.cs:118:13:118:34 | case ...: | | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:13:117:35 | After case ...: [match] | match | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:13:117:35 | After case ...: [no-match] | no-match | -| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:25:117:34 | Before ... == ... | | +| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:18:117:18 | 3 | | +| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:18:117:18 | After 3 [match] | match | +| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:18:117:18 | After 3 [no-match] | no-match | +| Switch.cs:117:18:117:18 | After 3 [match] | Switch.cs:117:13:117:35 | After case ...: [match] | match | +| Switch.cs:117:18:117:18 | After 3 [no-match] | Switch.cs:117:13:117:35 | After case ...: [no-match] | no-match | | Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:117:30:117:34 | "foo" | | | Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:25:117:34 | After ... == ... [false] | false | | Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:25:117:34 | After ... == ... [true] | true | @@ -6589,11 +6645,13 @@ | Switch.cs:117:37:117:45 | Before return ...; | Switch.cs:117:44:117:44 | 1 | | | Switch.cs:117:37:117:45 | return ...; | Switch.cs:113:9:113:11 | Normal Exit | return | | Switch.cs:117:44:117:44 | 1 | Switch.cs:117:37:117:45 | return ...; | | -| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:18:118:18 | 2 | | +| Switch.cs:118:13:118:34 | After case ...: [match] | Switch.cs:118:25:118:33 | Before ... == ... | | | Switch.cs:118:13:118:34 | After case ...: [no-match] | Switch.cs:115:9:119:9 | After switch (...) {...} | | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [match] | match | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:13:118:34 | After case ...: [no-match] | no-match | -| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:25:118:33 | Before ... == ... | | +| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | 2 | | +| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:18:118:18 | After 2 [match] | match | +| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:18:118:18 | After 2 [no-match] | no-match | +| Switch.cs:118:18:118:18 | After 2 [match] | Switch.cs:118:13:118:34 | After case ...: [match] | match | +| Switch.cs:118:18:118:18 | After 2 [no-match] | Switch.cs:118:13:118:34 | After case ...: [no-match] | no-match | | Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:118:30:118:33 | "fu" | | | Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:25:118:33 | After ... == ... [false] | false | | Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:25:118:33 | After ... == ... [true] | true | @@ -6621,16 +6679,19 @@ | Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:125:13:125:13 | access to parameter o | | | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | Switch.cs:125:9:126:19 | After if (...) ... | | | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | Switch.cs:126:13:126:19 | Before return ...; | | -| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:34:125:34 | access to local variable b | | -| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:34 | After ... => ... [match] | match | -| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:34 | After ... => ... [no-match] | no-match | -| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:24:125:29 | Boolean b | | +| Switch.cs:125:24:125:29 | After Boolean b [match] | Switch.cs:125:24:125:34 | After ... => ... [match] | match | +| Switch.cs:125:24:125:29 | After Boolean b [no-match] | Switch.cs:125:24:125:34 | After ... => ... [no-match] | no-match | +| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:29 | After Boolean b [match] | match | +| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:29 | After Boolean b [no-match] | no-match | +| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:29 | Boolean b | | +| Switch.cs:125:24:125:34 | After ... => ... [match] | Switch.cs:125:34:125:34 | access to local variable b | | | Switch.cs:125:24:125:34 | After ... => ... [no-match] | Switch.cs:125:37:125:46 | ... => ... | | | Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | false | | Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | true | -| Switch.cs:125:37:125:37 | _ | Switch.cs:125:42:125:46 | false | | -| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:37:125:46 | After ... => ... [match] | match | -| Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:125:37:125:37 | _ | | +| Switch.cs:125:37:125:37 | After _ [match] | Switch.cs:125:37:125:46 | After ... => ... [match] | match | +| Switch.cs:125:37:125:37 | _ | Switch.cs:125:37:125:37 | After _ [match] | match | +| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:37:125:37 | _ | | +| Switch.cs:125:37:125:46 | After ... => ... [match] | Switch.cs:125:42:125:46 | false | | | Switch.cs:125:42:125:46 | false | Switch.cs:125:13:125:48 | After ... switch { ... } [false] | false | | Switch.cs:125:42:125:46 | false | Switch.cs:125:13:125:48 | After ... switch { ... } [true] | true | | Switch.cs:126:13:126:19 | Before return ...; | Switch.cs:126:13:126:19 | return ...; | | @@ -6648,16 +6709,19 @@ | Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:131:17:131:17 | access to parameter o | | | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | Switch.cs:131:16:131:66 | call to method ToString | | | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | Switch.cs:131:16:131:66 | After call to method ToString | | -| Switch.cs:131:28:131:35 | String s | Switch.cs:131:40:131:40 | access to local variable s | | -| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:40 | After ... => ... [match] | match | -| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:40 | After ... => ... [no-match] | no-match | -| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:28:131:35 | String s | | +| Switch.cs:131:28:131:35 | After String s [match] | Switch.cs:131:28:131:40 | After ... => ... [match] | match | +| Switch.cs:131:28:131:35 | After String s [no-match] | Switch.cs:131:28:131:40 | After ... => ... [no-match] | no-match | +| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:35 | After String s [match] | match | +| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:35 | After String s [no-match] | no-match | +| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:35 | String s | | +| Switch.cs:131:28:131:40 | After ... => ... [match] | Switch.cs:131:40:131:40 | access to local variable s | | | Switch.cs:131:28:131:40 | After ... => ... [no-match] | Switch.cs:131:43:131:51 | ... => ... | | | Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | non-null | | Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | null | -| Switch.cs:131:43:131:43 | _ | Switch.cs:131:48:131:51 | null | | -| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:51 | After ... => ... [match] | match | -| Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:131:43:131:43 | _ | | +| Switch.cs:131:43:131:43 | After _ [match] | Switch.cs:131:43:131:51 | After ... => ... [match] | match | +| Switch.cs:131:43:131:43 | _ | Switch.cs:131:43:131:43 | After _ [match] | match | +| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:43 | _ | | +| Switch.cs:131:43:131:51 | After ... => ... [match] | Switch.cs:131:48:131:51 | null | | | Switch.cs:131:48:131:51 | null | Switch.cs:131:17:131:53 | After ... switch { ... } [non-null] | non-null | | Switch.cs:131:48:131:51 | null | Switch.cs:131:17:131:53 | After ... switch { ... } [null] | null | | Switch.cs:134:9:134:11 | Entry | Switch.cs:134:17:134:17 | i | | @@ -6674,19 +6738,23 @@ | Switch.cs:138:29:138:30 | After -... | Switch.cs:138:22:138:31 | return ...; | | | Switch.cs:138:29:138:30 | Before -... | Switch.cs:138:30:138:30 | 1 | | | Switch.cs:138:30:138:30 | 1 | Switch.cs:138:29:138:30 | -... | | -| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:18:139:18 | 1 | | +| Switch.cs:139:13:139:19 | After case ...: [match] | Switch.cs:139:21:139:29 | Before return ...; | | | Switch.cs:139:13:139:19 | After case ...: [no-match] | Switch.cs:140:13:140:19 | case ...: | | -| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:13:139:19 | After case ...: [match] | match | -| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:13:139:19 | After case ...: [no-match] | no-match | -| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:21:139:29 | Before return ...; | | +| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:18:139:18 | 1 | | +| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:18:139:18 | After 1 [match] | match | +| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:18:139:18 | After 1 [no-match] | no-match | +| Switch.cs:139:18:139:18 | After 1 [match] | Switch.cs:139:13:139:19 | After case ...: [match] | match | +| Switch.cs:139:18:139:18 | After 1 [no-match] | Switch.cs:139:13:139:19 | After case ...: [no-match] | no-match | | Switch.cs:139:21:139:29 | Before return ...; | Switch.cs:139:28:139:28 | 1 | | | Switch.cs:139:21:139:29 | return ...; | Switch.cs:134:9:134:11 | Normal Exit | return | | Switch.cs:139:28:139:28 | 1 | Switch.cs:139:21:139:29 | return ...; | | -| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:18:140:18 | 2 | | +| Switch.cs:140:13:140:19 | After case ...: [match] | Switch.cs:140:21:140:29 | Before return ...; | | | Switch.cs:140:13:140:19 | After case ...: [no-match] | Switch.cs:138:13:138:20 | default: | | -| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:13:140:19 | After case ...: [match] | match | -| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:13:140:19 | After case ...: [no-match] | no-match | -| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:21:140:29 | Before return ...; | | +| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:18:140:18 | 2 | | +| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:18:140:18 | After 2 [match] | match | +| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:18:140:18 | After 2 [no-match] | no-match | +| Switch.cs:140:18:140:18 | After 2 [match] | Switch.cs:140:13:140:19 | After case ...: [match] | match | +| Switch.cs:140:18:140:18 | After 2 [no-match] | Switch.cs:140:13:140:19 | After case ...: [no-match] | no-match | | Switch.cs:140:21:140:29 | Before return ...; | Switch.cs:140:28:140:28 | 2 | | | Switch.cs:140:21:140:29 | return ...; | Switch.cs:134:9:134:11 | Normal Exit | return | | Switch.cs:140:28:140:28 | 2 | Switch.cs:140:21:140:29 | return ...; | | @@ -6696,11 +6764,13 @@ | Switch.cs:145:5:152:5 | {...} | Switch.cs:146:9:151:9 | switch (...) {...} | | | Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:146:17:146:17 | access to parameter i | | | Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:148:13:148:19 | case ...: | | -| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:18:148:18 | 1 | | +| Switch.cs:148:13:148:19 | After case ...: [match] | Switch.cs:148:21:148:29 | Before return ...; | | | Switch.cs:148:13:148:19 | After case ...: [no-match] | Switch.cs:150:13:150:19 | case ...: | | -| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:13:148:19 | After case ...: [match] | match | -| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:13:148:19 | After case ...: [no-match] | no-match | -| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:21:148:29 | Before return ...; | | +| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:18:148:18 | 1 | | +| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:18:148:18 | After 1 [match] | match | +| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:18:148:18 | After 1 [no-match] | no-match | +| Switch.cs:148:18:148:18 | After 1 [match] | Switch.cs:148:13:148:19 | After case ...: [match] | match | +| Switch.cs:148:18:148:18 | After 1 [no-match] | Switch.cs:148:13:148:19 | After case ...: [no-match] | no-match | | Switch.cs:148:21:148:29 | Before return ...; | Switch.cs:148:28:148:28 | 1 | | | Switch.cs:148:21:148:29 | return ...; | Switch.cs:144:9:144:11 | Normal Exit | return | | Switch.cs:148:28:148:28 | 1 | Switch.cs:148:21:148:29 | return ...; | | @@ -6712,11 +6782,13 @@ | Switch.cs:149:29:149:30 | After -... | Switch.cs:149:22:149:31 | return ...; | | | Switch.cs:149:29:149:30 | Before -... | Switch.cs:149:30:149:30 | 1 | | | Switch.cs:149:30:149:30 | 1 | Switch.cs:149:29:149:30 | -... | | -| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:18:150:18 | 2 | | +| Switch.cs:150:13:150:19 | After case ...: [match] | Switch.cs:150:21:150:29 | Before return ...; | | | Switch.cs:150:13:150:19 | After case ...: [no-match] | Switch.cs:149:13:149:20 | default: | | -| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:13:150:19 | After case ...: [match] | match | -| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:13:150:19 | After case ...: [no-match] | no-match | -| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:21:150:29 | Before return ...; | | +| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:18:150:18 | 2 | | +| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:18:150:18 | After 2 [match] | match | +| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:18:150:18 | After 2 [no-match] | no-match | +| Switch.cs:150:18:150:18 | After 2 [match] | Switch.cs:150:13:150:19 | After case ...: [match] | match | +| Switch.cs:150:18:150:18 | After 2 [no-match] | Switch.cs:150:13:150:19 | After case ...: [no-match] | no-match | | Switch.cs:150:21:150:29 | Before return ...; | Switch.cs:150:28:150:28 | 2 | | | Switch.cs:150:21:150:29 | return ...; | Switch.cs:144:9:144:11 | Normal Exit | return | | Switch.cs:150:28:150:28 | 2 | Switch.cs:150:21:150:29 | return ...; | | @@ -6734,16 +6806,20 @@ | Switch.cs:156:17:156:17 | access to parameter b | Switch.cs:156:28:156:38 | ... => ... | | | Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:156:17:156:17 | access to parameter b | | | Switch.cs:156:17:156:54 | After ... switch { ... } | Switch.cs:156:13:156:54 | String s = ... | | -| Switch.cs:156:28:156:31 | true | Switch.cs:156:36:156:38 | "a" | | -| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:38 | After ... => ... [match] | match | -| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:38 | After ... => ... [no-match] | no-match | -| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:28:156:31 | true | | +| Switch.cs:156:28:156:31 | After true [match] | Switch.cs:156:28:156:38 | After ... => ... [match] | match | +| Switch.cs:156:28:156:31 | After true [no-match] | Switch.cs:156:28:156:38 | After ... => ... [no-match] | no-match | +| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:31 | After true [match] | match | +| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:31 | After true [no-match] | no-match | +| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:31 | true | | +| Switch.cs:156:28:156:38 | After ... => ... [match] | Switch.cs:156:36:156:38 | "a" | | | Switch.cs:156:28:156:38 | After ... => ... [no-match] | Switch.cs:156:41:156:52 | ... => ... | | | Switch.cs:156:36:156:38 | "a" | Switch.cs:156:17:156:54 | After ... switch { ... } | | -| Switch.cs:156:41:156:45 | false | Switch.cs:156:50:156:52 | "b" | | -| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:52 | After ... => ... [match] | match | -| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:52 | After ... => ... [no-match] | no-match | -| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:41:156:45 | false | | +| Switch.cs:156:41:156:45 | After false [match] | Switch.cs:156:41:156:52 | After ... => ... [match] | match | +| Switch.cs:156:41:156:45 | After false [no-match] | Switch.cs:156:41:156:52 | After ... => ... [no-match] | no-match | +| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:45 | After false [match] | match | +| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:45 | After false [no-match] | no-match | +| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:45 | false | | +| Switch.cs:156:41:156:52 | After ... => ... [match] | Switch.cs:156:50:156:52 | "b" | | | Switch.cs:156:41:156:52 | After ... => ... [no-match] | Switch.cs:156:17:156:54 | After ... switch { ... } | | | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:17:156:54 | After ... switch { ... } | | | Switch.cs:157:9:160:49 | After if (...) ... | Switch.cs:155:5:161:5 | After {...} | | @@ -6786,16 +6862,20 @@ | Switch.cs:165:9:177:9 | After switch (...) {...} | Switch.cs:164:5:178:5 | After {...} | | | Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:165:17:165:17 | access to parameter i | | | Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:167:13:167:19 | case ...: | | -| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:167:18:167:18 | 1 | | +| Switch.cs:167:13:167:19 | After case ...: [match] | Switch.cs:169:17:169:51 | ...; | | | Switch.cs:167:13:167:19 | After case ...: [no-match] | Switch.cs:168:13:168:19 | case ...: | | -| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:13:167:19 | After case ...: [match] | match | -| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:13:167:19 | After case ...: [no-match] | no-match | -| Switch.cs:167:18:167:18 | 1 | Switch.cs:169:17:169:51 | ...; | | -| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:168:18:168:18 | 2 | | +| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:18:167:18 | 1 | | +| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | After 1 [match] | match | +| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | After 1 [no-match] | no-match | +| Switch.cs:167:18:167:18 | After 1 [match] | Switch.cs:167:13:167:19 | After case ...: [match] | match | +| Switch.cs:167:18:167:18 | After 1 [no-match] | Switch.cs:167:13:167:19 | After case ...: [no-match] | no-match | +| Switch.cs:168:13:168:19 | After case ...: [match] | Switch.cs:169:17:169:51 | ...; | | | Switch.cs:168:13:168:19 | After case ...: [no-match] | Switch.cs:171:13:171:19 | case ...: | | -| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | After case ...: [match] | match | -| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | After case ...: [no-match] | no-match | -| Switch.cs:168:18:168:18 | 2 | Switch.cs:169:17:169:51 | ...; | | +| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:18:168:18 | 2 | | +| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | After 2 [match] | match | +| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | After 2 [no-match] | no-match | +| Switch.cs:168:18:168:18 | After 2 [match] | Switch.cs:168:13:168:19 | After case ...: [match] | match | +| Switch.cs:168:18:168:18 | After 2 [no-match] | Switch.cs:168:13:168:19 | After case ...: [no-match] | no-match | | Switch.cs:169:17:169:50 | After call to method WriteLine | Switch.cs:169:17:169:51 | After ...; | | | Switch.cs:169:17:169:50 | Before call to method WriteLine | Switch.cs:169:42:169:49 | "1 or 2" | | | Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:169:17:169:50 | After call to method WriteLine | | @@ -6804,11 +6884,13 @@ | Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:17:169:50 | call to method WriteLine | | | Switch.cs:170:17:170:22 | Before break; | Switch.cs:170:17:170:22 | break; | | | Switch.cs:170:17:170:22 | break; | Switch.cs:165:9:177:9 | After switch (...) {...} | break | -| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:171:18:171:18 | 3 | | +| Switch.cs:171:13:171:19 | After case ...: [match] | Switch.cs:172:17:172:46 | ...; | | | Switch.cs:171:13:171:19 | After case ...: [no-match] | Switch.cs:174:13:174:20 | default: | | -| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | After case ...: [match] | match | -| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | After case ...: [no-match] | no-match | -| Switch.cs:171:18:171:18 | 3 | Switch.cs:172:17:172:46 | ...; | | +| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:18:171:18 | 3 | | +| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | After 3 [match] | match | +| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | After 3 [no-match] | no-match | +| Switch.cs:171:18:171:18 | After 3 [match] | Switch.cs:171:13:171:19 | After case ...: [match] | match | +| Switch.cs:171:18:171:18 | After 3 [no-match] | Switch.cs:171:13:171:19 | After case ...: [no-match] | no-match | | Switch.cs:172:17:172:45 | After call to method WriteLine | Switch.cs:172:17:172:46 | After ...; | | | Switch.cs:172:17:172:45 | Before call to method WriteLine | Switch.cs:172:42:172:44 | "3" | | | Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:172:17:172:45 | After call to method WriteLine | | @@ -7195,11 +7277,13 @@ | cflow.cs:39:9:50:9 | After switch (...) {...} | cflow.cs:51:9:59:9 | switch (...) {...} | | | cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:39:17:39:17 | access to parameter a | | | cflow.cs:39:17:39:17 | access to parameter a | cflow.cs:41:13:41:19 | case ...: | | -| cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:41:18:41:18 | 1 | | +| cflow.cs:41:13:41:19 | After case ...: [match] | cflow.cs:42:17:42:39 | ...; | | | cflow.cs:41:13:41:19 | After case ...: [no-match] | cflow.cs:44:13:44:19 | case ...: | | -| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:13:41:19 | After case ...: [match] | match | -| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:13:41:19 | After case ...: [no-match] | no-match | -| cflow.cs:41:18:41:18 | 1 | cflow.cs:42:17:42:39 | ...; | | +| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:18:41:18 | 1 | | +| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:18:41:18 | After 1 [match] | match | +| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:18:41:18 | After 1 [no-match] | no-match | +| cflow.cs:41:18:41:18 | After 1 [match] | cflow.cs:41:13:41:19 | After case ...: [match] | match | +| cflow.cs:41:18:41:18 | After 1 [no-match] | cflow.cs:41:13:41:19 | After case ...: [no-match] | no-match | | cflow.cs:42:17:42:38 | After call to method WriteLine | cflow.cs:42:17:42:39 | After ...; | | | cflow.cs:42:17:42:38 | Before call to method WriteLine | cflow.cs:42:35:42:37 | "1" | | | cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:42:17:42:38 | After call to method WriteLine | | @@ -7209,11 +7293,13 @@ | cflow.cs:43:17:43:28 | Before goto case ...; | cflow.cs:43:27:43:27 | 2 | | | cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:44:13:44:19 | After case ...: [match] | goto | | cflow.cs:43:27:43:27 | 2 | cflow.cs:43:17:43:28 | goto case ...; | | -| cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:44:18:44:18 | 2 | | +| cflow.cs:44:13:44:19 | After case ...: [match] | cflow.cs:45:17:45:39 | ...; | | | cflow.cs:44:13:44:19 | After case ...: [no-match] | cflow.cs:47:13:47:19 | case ...: | | -| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:13:44:19 | After case ...: [match] | match | -| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:13:44:19 | After case ...: [no-match] | no-match | -| cflow.cs:44:18:44:18 | 2 | cflow.cs:45:17:45:39 | ...; | | +| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:18:44:18 | 2 | | +| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:18:44:18 | After 2 [match] | match | +| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:18:44:18 | After 2 [no-match] | no-match | +| cflow.cs:44:18:44:18 | After 2 [match] | cflow.cs:44:13:44:19 | After case ...: [match] | match | +| cflow.cs:44:18:44:18 | After 2 [no-match] | cflow.cs:44:13:44:19 | After case ...: [no-match] | no-match | | cflow.cs:45:17:45:38 | After call to method WriteLine | cflow.cs:45:17:45:39 | After ...; | | | cflow.cs:45:17:45:38 | Before call to method WriteLine | cflow.cs:45:35:45:37 | "2" | | | cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:45:17:45:38 | After call to method WriteLine | | @@ -7223,11 +7309,13 @@ | cflow.cs:46:17:46:28 | Before goto case ...; | cflow.cs:46:27:46:27 | 1 | | | cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:41:13:41:19 | After case ...: [match] | goto | | cflow.cs:46:27:46:27 | 1 | cflow.cs:46:17:46:28 | goto case ...; | | -| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:47:18:47:18 | 3 | | +| cflow.cs:47:13:47:19 | After case ...: [match] | cflow.cs:48:17:48:39 | ...; | | | cflow.cs:47:13:47:19 | After case ...: [no-match] | cflow.cs:39:9:50:9 | After switch (...) {...} | | -| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:13:47:19 | After case ...: [match] | match | -| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:13:47:19 | After case ...: [no-match] | no-match | -| cflow.cs:47:18:47:18 | 3 | cflow.cs:48:17:48:39 | ...; | | +| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:18:47:18 | 3 | | +| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:18:47:18 | After 3 [match] | match | +| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:18:47:18 | After 3 [no-match] | no-match | +| cflow.cs:47:18:47:18 | After 3 [match] | cflow.cs:47:13:47:19 | After case ...: [match] | match | +| cflow.cs:47:18:47:18 | After 3 [no-match] | cflow.cs:47:13:47:19 | After case ...: [no-match] | no-match | | cflow.cs:48:17:48:38 | After call to method WriteLine | cflow.cs:48:17:48:39 | After ...; | | | cflow.cs:48:17:48:38 | Before call to method WriteLine | cflow.cs:48:35:48:37 | "3" | | | cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:48:17:48:38 | After call to method WriteLine | | @@ -7239,11 +7327,13 @@ | cflow.cs:51:9:59:9 | After switch (...) {...} | cflow.cs:60:9:66:9 | switch (...) {...} | | | cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:51:17:51:17 | access to parameter a | | | cflow.cs:51:17:51:17 | access to parameter a | cflow.cs:53:13:53:20 | case ...: | | -| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:53:18:53:19 | 42 | | +| cflow.cs:53:13:53:20 | After case ...: [match] | cflow.cs:54:17:54:48 | ...; | | | cflow.cs:53:13:53:20 | After case ...: [no-match] | cflow.cs:56:13:56:20 | default: | | -| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:13:53:20 | After case ...: [match] | match | -| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:13:53:20 | After case ...: [no-match] | no-match | -| cflow.cs:53:18:53:19 | 42 | cflow.cs:54:17:54:48 | ...; | | +| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:18:53:19 | 42 | | +| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:18:53:19 | After 42 [match] | match | +| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:18:53:19 | After 42 [no-match] | no-match | +| cflow.cs:53:18:53:19 | After 42 [match] | cflow.cs:53:13:53:20 | After case ...: [match] | match | +| cflow.cs:53:18:53:19 | After 42 [no-match] | cflow.cs:53:13:53:20 | After case ...: [no-match] | no-match | | cflow.cs:54:17:54:47 | After call to method WriteLine | cflow.cs:54:17:54:48 | After ...; | | | cflow.cs:54:17:54:47 | Before call to method WriteLine | cflow.cs:54:35:54:46 | "The answer" | | | cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:54:17:54:47 | After call to method WriteLine | | @@ -7271,11 +7361,13 @@ | cflow.cs:60:27:60:31 | Before access to field Field | cflow.cs:60:27:60:31 | this access | | | cflow.cs:60:27:60:31 | access to field Field | cflow.cs:60:27:60:31 | After access to field Field | | | cflow.cs:60:27:60:31 | this access | cflow.cs:60:27:60:31 | access to field Field | | -| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:62:18:62:18 | 0 | | +| cflow.cs:62:13:62:19 | After case ...: [match] | cflow.cs:63:17:64:55 | if (...) ... | | | cflow.cs:62:13:62:19 | After case ...: [no-match] | cflow.cs:60:9:66:9 | After switch (...) {...} | | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:13:62:19 | After case ...: [match] | match | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:13:62:19 | After case ...: [no-match] | no-match | -| cflow.cs:62:18:62:18 | 0 | cflow.cs:63:17:64:55 | if (...) ... | | +| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:18:62:18 | 0 | | +| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:18:62:18 | After 0 [match] | match | +| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:18:62:18 | After 0 [no-match] | no-match | +| cflow.cs:62:18:62:18 | After 0 [match] | cflow.cs:62:13:62:19 | After case ...: [match] | match | +| cflow.cs:62:18:62:18 | After 0 [no-match] | cflow.cs:62:13:62:19 | After case ...: [no-match] | no-match | | cflow.cs:63:17:64:55 | After if (...) ... | cflow.cs:65:17:65:22 | Before break; | | | cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:63:21:63:34 | !... | | | cflow.cs:63:21:63:34 | !... | cflow.cs:63:23:63:33 | Before ... == ... | | @@ -8221,18 +8313,22 @@ | cflow.cs:246:17:246:32 | After ... + ... | cflow.cs:248:13:248:19 | case ...: | | | cflow.cs:246:17:246:32 | Before ... + ... | cflow.cs:246:17:246:28 | Before access to property Length | | | cflow.cs:246:32:246:32 | 3 | cflow.cs:246:17:246:32 | ... + ... | | -| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:248:18:248:18 | 0 | | +| cflow.cs:248:13:248:19 | After case ...: [match] | cflow.cs:249:17:249:29 | Before goto default; | | | cflow.cs:248:13:248:19 | After case ...: [no-match] | cflow.cs:250:13:250:19 | case ...: | | -| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:13:248:19 | After case ...: [match] | match | -| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:13:248:19 | After case ...: [no-match] | no-match | -| cflow.cs:248:18:248:18 | 0 | cflow.cs:249:17:249:29 | Before goto default; | | +| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:18:248:18 | 0 | | +| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:18:248:18 | After 0 [match] | match | +| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:18:248:18 | After 0 [no-match] | no-match | +| cflow.cs:248:18:248:18 | After 0 [match] | cflow.cs:248:13:248:19 | After case ...: [match] | match | +| cflow.cs:248:18:248:18 | After 0 [no-match] | cflow.cs:248:13:248:19 | After case ...: [no-match] | no-match | | cflow.cs:249:17:249:29 | Before goto default; | cflow.cs:249:17:249:29 | goto default; | | | cflow.cs:249:17:249:29 | goto default; | cflow.cs:255:13:255:20 | After default: [match] | goto | -| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:250:18:250:18 | 1 | | +| cflow.cs:250:13:250:19 | After case ...: [match] | cflow.cs:251:17:251:37 | ...; | | | cflow.cs:250:13:250:19 | After case ...: [no-match] | cflow.cs:253:13:253:19 | case ...: | | -| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:13:250:19 | After case ...: [match] | match | -| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:13:250:19 | After case ...: [no-match] | no-match | -| cflow.cs:250:18:250:18 | 1 | cflow.cs:251:17:251:37 | ...; | | +| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:18:250:18 | 1 | | +| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:18:250:18 | After 1 [match] | match | +| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:18:250:18 | After 1 [no-match] | no-match | +| cflow.cs:250:18:250:18 | After 1 [match] | cflow.cs:250:13:250:19 | After case ...: [match] | match | +| cflow.cs:250:18:250:18 | After 1 [no-match] | cflow.cs:250:13:250:19 | After case ...: [no-match] | no-match | | cflow.cs:251:17:251:36 | After call to method WriteLine | cflow.cs:251:17:251:37 | After ...; | | | cflow.cs:251:17:251:36 | Before call to method WriteLine | cflow.cs:251:35:251:35 | 1 | | | cflow.cs:251:17:251:36 | call to method WriteLine | cflow.cs:251:17:251:36 | After call to method WriteLine | | @@ -8241,11 +8337,13 @@ | cflow.cs:251:35:251:35 | 1 | cflow.cs:251:17:251:36 | call to method WriteLine | | | cflow.cs:252:17:252:22 | Before break; | cflow.cs:252:17:252:22 | break; | | | cflow.cs:252:17:252:22 | break; | cflow.cs:246:9:258:9 | After switch (...) {...} | break | -| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:253:18:253:18 | 2 | | +| cflow.cs:253:13:253:19 | After case ...: [match] | cflow.cs:254:17:254:27 | Before goto ...; | | | cflow.cs:253:13:253:19 | After case ...: [no-match] | cflow.cs:255:13:255:20 | default: | | -| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:13:253:19 | After case ...: [match] | match | -| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:13:253:19 | After case ...: [no-match] | no-match | -| cflow.cs:253:18:253:18 | 2 | cflow.cs:254:17:254:27 | Before goto ...; | | +| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:18:253:18 | 2 | | +| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:18:253:18 | After 2 [match] | match | +| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:18:253:18 | After 2 [no-match] | no-match | +| cflow.cs:253:18:253:18 | After 2 [match] | cflow.cs:253:13:253:19 | After case ...: [match] | match | +| cflow.cs:253:18:253:18 | After 2 [no-match] | cflow.cs:253:13:253:19 | After case ...: [no-match] | no-match | | cflow.cs:254:17:254:27 | Before goto ...; | cflow.cs:254:17:254:27 | goto ...; | | | cflow.cs:254:17:254:27 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto | | cflow.cs:255:13:255:20 | After default: [match] | cflow.cs:256:17:256:37 | ...; | | diff --git a/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected b/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected index b274d7905b2a..374550924481 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected @@ -79,7 +79,6 @@ | Guards.cs:287:17:287:17 | access to parameter o | Guards.cs:278:13:279:28 | ... => ... | Guards.cs:279:17:279:17 | access to parameter o | false | | Guards.cs:287:17:287:17 | access to parameter o | Guards.cs:282:13:283:28 | ... => ... | Guards.cs:283:17:283:17 | access to parameter o | false | | Guards.cs:287:17:287:17 | access to parameter o | Guards.cs:284:13:285:28 | ... => ... | Guards.cs:285:17:285:17 | access to parameter o | false | -| Guards.cs:334:13:334:15 | access to constant B | Guards.cs:334:13:334:20 | ... => ... | Guards.cs:334:13:334:15 | access to constant B | true | | Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false | | Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:21 | ... != ... | Guards.cs:342:13:342:13 | access to local variable s | true | | Guards.cs:349:13:349:13 | access to parameter o | Guards.cs:348:13:348:25 | ... is ... | Guards.cs:348:13:348:13 | access to parameter o | true | diff --git a/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected b/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected index c038c49ba176..765b8670a18e 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected @@ -202,7 +202,6 @@ | Guards.cs:287:17:287:28 | call to method ToString | Guards.cs:278:13:279:28 | ... => ... | Guards.cs:279:17:279:28 | call to method ToString | false | | Guards.cs:287:17:287:28 | call to method ToString | Guards.cs:282:13:283:28 | ... => ... | Guards.cs:283:17:283:28 | call to method ToString | false | | Guards.cs:287:17:287:28 | call to method ToString | Guards.cs:284:13:285:28 | ... => ... | Guards.cs:285:17:285:28 | call to method ToString | false | -| Guards.cs:334:13:334:15 | access to constant B | Guards.cs:334:13:334:20 | ... => ... | Guards.cs:334:13:334:15 | access to constant B | true | | Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false | | Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:32 | ... ? ... : ... | Guards.cs:341:20:341:20 | access to parameter b | not null | | Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:13 | access to local variable s | Guards.cs:342:13:342:13 | access to local variable s | not null | diff --git a/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected b/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected index c038c49ba176..765b8670a18e 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected @@ -202,7 +202,6 @@ | Guards.cs:287:17:287:28 | call to method ToString | Guards.cs:278:13:279:28 | ... => ... | Guards.cs:279:17:279:28 | call to method ToString | false | | Guards.cs:287:17:287:28 | call to method ToString | Guards.cs:282:13:283:28 | ... => ... | Guards.cs:283:17:283:28 | call to method ToString | false | | Guards.cs:287:17:287:28 | call to method ToString | Guards.cs:284:13:285:28 | ... => ... | Guards.cs:285:17:285:28 | call to method ToString | false | -| Guards.cs:334:13:334:15 | access to constant B | Guards.cs:334:13:334:20 | ... => ... | Guards.cs:334:13:334:15 | access to constant B | true | | Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false | | Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:32 | ... ? ... : ... | Guards.cs:341:20:341:20 | access to parameter b | not null | | Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:13 | access to local variable s | Guards.cs:342:13:342:13 | access to local variable s | not null | diff --git a/csharp/ql/test/library-tests/csharp7/IsFlow.expected b/csharp/ql/test/library-tests/csharp7/IsFlow.expected index a1dafe05ce6b..07d3079854d6 100644 --- a/csharp/ql/test/library-tests/csharp7/IsFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/IsFlow.expected @@ -3,18 +3,22 @@ | CSharp7.cs:248:9:274:9 | After switch (...) {...} | CSharp7.cs:231:5:275:5 | After {...} | semmle.label | successor | | CSharp7.cs:248:9:274:9 | switch (...) {...} | CSharp7.cs:248:17:248:17 | access to local variable o | semmle.label | successor | | CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:250:13:250:23 | case ...: | semmle.label | successor | -| CSharp7.cs:250:13:250:23 | After case ...: [match] | CSharp7.cs:250:18:250:22 | "xyz" | semmle.label | successor | +| CSharp7.cs:250:13:250:23 | After case ...: [match] | CSharp7.cs:251:17:251:22 | Before break; | semmle.label | successor | | CSharp7.cs:250:13:250:23 | After case ...: [no-match] | CSharp7.cs:252:13:252:31 | case ...: | semmle.label | successor | -| CSharp7.cs:250:13:250:23 | case ...: | CSharp7.cs:250:13:250:23 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:250:13:250:23 | case ...: | CSharp7.cs:250:13:250:23 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:250:18:250:22 | "xyz" | CSharp7.cs:251:17:251:22 | Before break; | semmle.label | successor | +| CSharp7.cs:250:13:250:23 | case ...: | CSharp7.cs:250:18:250:22 | "xyz" | semmle.label | successor | +| CSharp7.cs:250:18:250:22 | "xyz" | CSharp7.cs:250:18:250:22 | After "xyz" [match] | semmle.label | match | +| CSharp7.cs:250:18:250:22 | "xyz" | CSharp7.cs:250:18:250:22 | After "xyz" [no-match] | semmle.label | no-match | +| CSharp7.cs:250:18:250:22 | After "xyz" [match] | CSharp7.cs:250:13:250:23 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:250:18:250:22 | After "xyz" [no-match] | CSharp7.cs:250:13:250:23 | After case ...: [no-match] | semmle.label | no-match | | CSharp7.cs:251:17:251:22 | Before break; | CSharp7.cs:251:17:251:22 | break; | semmle.label | successor | | CSharp7.cs:251:17:251:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:252:13:252:31 | After case ...: [match] | CSharp7.cs:252:18:252:19 | "" | semmle.label | successor | +| CSharp7.cs:252:13:252:31 | After case ...: [match] | CSharp7.cs:252:26:252:30 | Before ... < ... | semmle.label | successor | | CSharp7.cs:252:13:252:31 | After case ...: [no-match] | CSharp7.cs:254:13:254:41 | case ...: | semmle.label | successor | -| CSharp7.cs:252:13:252:31 | case ...: | CSharp7.cs:252:13:252:31 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:252:13:252:31 | case ...: | CSharp7.cs:252:13:252:31 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:252:18:252:19 | "" | CSharp7.cs:252:26:252:30 | Before ... < ... | semmle.label | successor | +| CSharp7.cs:252:13:252:31 | case ...: | CSharp7.cs:252:18:252:19 | "" | semmle.label | successor | +| CSharp7.cs:252:18:252:19 | "" | CSharp7.cs:252:18:252:19 | After "" [match] | semmle.label | match | +| CSharp7.cs:252:18:252:19 | "" | CSharp7.cs:252:18:252:19 | After "" [no-match] | semmle.label | no-match | +| CSharp7.cs:252:18:252:19 | After "" [match] | CSharp7.cs:252:13:252:31 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:252:18:252:19 | After "" [no-match] | CSharp7.cs:252:13:252:31 | After case ...: [no-match] | semmle.label | no-match | | CSharp7.cs:252:26:252:26 | 1 | CSharp7.cs:252:30:252:30 | 2 | semmle.label | successor | | CSharp7.cs:252:26:252:30 | ... < ... | CSharp7.cs:252:26:252:30 | After ... < ... [false] | semmle.label | false | | CSharp7.cs:252:26:252:30 | ... < ... | CSharp7.cs:252:26:252:30 | After ... < ... [true] | semmle.label | true | @@ -24,11 +28,13 @@ | CSharp7.cs:252:30:252:30 | 2 | CSharp7.cs:252:26:252:30 | ... < ... | semmle.label | successor | | CSharp7.cs:253:17:253:22 | Before break; | CSharp7.cs:253:17:253:22 | break; | semmle.label | successor | | CSharp7.cs:253:17:253:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:254:13:254:41 | After case ...: [match] | CSharp7.cs:254:18:254:20 | "x" | semmle.label | successor | +| CSharp7.cs:254:13:254:41 | After case ...: [match] | CSharp7.cs:254:27:254:40 | Before ... is ... | semmle.label | successor | | CSharp7.cs:254:13:254:41 | After case ...: [no-match] | CSharp7.cs:257:13:257:36 | case ...: | semmle.label | successor | -| CSharp7.cs:254:13:254:41 | case ...: | CSharp7.cs:254:13:254:41 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:254:13:254:41 | case ...: | CSharp7.cs:254:13:254:41 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:254:18:254:20 | "x" | CSharp7.cs:254:27:254:40 | Before ... is ... | semmle.label | successor | +| CSharp7.cs:254:13:254:41 | case ...: | CSharp7.cs:254:18:254:20 | "x" | semmle.label | successor | +| CSharp7.cs:254:18:254:20 | "x" | CSharp7.cs:254:18:254:20 | After "x" [match] | semmle.label | match | +| CSharp7.cs:254:18:254:20 | "x" | CSharp7.cs:254:18:254:20 | After "x" [no-match] | semmle.label | no-match | +| CSharp7.cs:254:18:254:20 | After "x" [match] | CSharp7.cs:254:13:254:41 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:254:18:254:20 | After "x" [no-match] | CSharp7.cs:254:13:254:41 | After case ...: [no-match] | semmle.label | no-match | | CSharp7.cs:254:27:254:27 | access to local variable o | CSharp7.cs:254:27:254:40 | ... is ... | semmle.label | successor | | CSharp7.cs:254:27:254:40 | ... is ... | CSharp7.cs:254:27:254:40 | After ... is ... [false] | semmle.label | false | | CSharp7.cs:254:27:254:40 | ... is ... | CSharp7.cs:254:27:254:40 | [MatchTrue] ... is ... | semmle.label | true | @@ -52,11 +58,13 @@ | CSharp7.cs:255:40:255:41 | access to local variable s4 | CSharp7.cs:255:39:255:42 | {...} | semmle.label | successor | | CSharp7.cs:256:17:256:22 | Before break; | CSharp7.cs:256:17:256:22 | break; | semmle.label | successor | | CSharp7.cs:256:17:256:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:257:13:257:36 | After case ...: [match] | CSharp7.cs:257:18:257:23 | Int32 i2 | semmle.label | successor | +| CSharp7.cs:257:13:257:36 | After case ...: [match] | CSharp7.cs:257:30:257:35 | Before ... > ... | semmle.label | successor | | CSharp7.cs:257:13:257:36 | After case ...: [no-match] | CSharp7.cs:260:13:260:24 | case ...: | semmle.label | successor | -| CSharp7.cs:257:13:257:36 | case ...: | CSharp7.cs:257:13:257:36 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:257:13:257:36 | case ...: | CSharp7.cs:257:13:257:36 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:257:18:257:23 | Int32 i2 | CSharp7.cs:257:30:257:35 | Before ... > ... | semmle.label | successor | +| CSharp7.cs:257:13:257:36 | case ...: | CSharp7.cs:257:18:257:23 | Int32 i2 | semmle.label | successor | +| CSharp7.cs:257:18:257:23 | After Int32 i2 [match] | CSharp7.cs:257:13:257:36 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:257:18:257:23 | After Int32 i2 [no-match] | CSharp7.cs:257:13:257:36 | After case ...: [no-match] | semmle.label | no-match | +| CSharp7.cs:257:18:257:23 | Int32 i2 | CSharp7.cs:257:18:257:23 | After Int32 i2 [match] | semmle.label | match | +| CSharp7.cs:257:18:257:23 | Int32 i2 | CSharp7.cs:257:18:257:23 | After Int32 i2 [no-match] | semmle.label | no-match | | CSharp7.cs:257:30:257:31 | access to local variable i2 | CSharp7.cs:257:35:257:35 | 0 | semmle.label | successor | | CSharp7.cs:257:30:257:35 | ... > ... | CSharp7.cs:257:30:257:35 | After ... > ... [false] | semmle.label | false | | CSharp7.cs:257:30:257:35 | ... > ... | CSharp7.cs:257:30:257:35 | After ... > ... [true] | semmle.label | true | @@ -79,11 +87,13 @@ | CSharp7.cs:258:47:258:48 | access to local variable i2 | CSharp7.cs:258:46:258:49 | {...} | semmle.label | successor | | CSharp7.cs:259:17:259:22 | Before break; | CSharp7.cs:259:17:259:22 | break; | semmle.label | successor | | CSharp7.cs:259:17:259:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:260:13:260:24 | After case ...: [match] | CSharp7.cs:260:18:260:23 | Int32 i3 | semmle.label | successor | +| CSharp7.cs:260:13:260:24 | After case ...: [match] | CSharp7.cs:261:17:261:47 | ...; | semmle.label | successor | | CSharp7.cs:260:13:260:24 | After case ...: [no-match] | CSharp7.cs:263:13:263:27 | case ...: | semmle.label | successor | -| CSharp7.cs:260:13:260:24 | case ...: | CSharp7.cs:260:13:260:24 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:260:13:260:24 | case ...: | CSharp7.cs:260:13:260:24 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:260:18:260:23 | Int32 i3 | CSharp7.cs:261:17:261:47 | ...; | semmle.label | successor | +| CSharp7.cs:260:13:260:24 | case ...: | CSharp7.cs:260:18:260:23 | Int32 i3 | semmle.label | successor | +| CSharp7.cs:260:18:260:23 | After Int32 i3 [match] | CSharp7.cs:260:13:260:24 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:260:18:260:23 | After Int32 i3 [no-match] | CSharp7.cs:260:13:260:24 | After case ...: [no-match] | semmle.label | no-match | +| CSharp7.cs:260:18:260:23 | Int32 i3 | CSharp7.cs:260:18:260:23 | After Int32 i3 [match] | semmle.label | match | +| CSharp7.cs:260:18:260:23 | Int32 i3 | CSharp7.cs:260:18:260:23 | After Int32 i3 [no-match] | semmle.label | no-match | | CSharp7.cs:261:17:261:46 | After call to method WriteLine | CSharp7.cs:261:17:261:47 | After ...; | semmle.label | successor | | CSharp7.cs:261:17:261:46 | Before call to method WriteLine | CSharp7.cs:261:35:261:45 | Before $"..." | semmle.label | successor | | CSharp7.cs:261:17:261:46 | call to method WriteLine | CSharp7.cs:261:17:261:46 | After call to method WriteLine | semmle.label | successor | @@ -99,11 +109,13 @@ | CSharp7.cs:261:42:261:43 | access to local variable i3 | CSharp7.cs:261:41:261:44 | {...} | semmle.label | successor | | CSharp7.cs:262:17:262:22 | Before break; | CSharp7.cs:262:17:262:22 | break; | semmle.label | successor | | CSharp7.cs:262:17:262:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:263:13:263:27 | After case ...: [match] | CSharp7.cs:263:18:263:26 | String s2 | semmle.label | successor | +| CSharp7.cs:263:13:263:27 | After case ...: [match] | CSharp7.cs:264:17:264:50 | ...; | semmle.label | successor | | CSharp7.cs:263:13:263:27 | After case ...: [no-match] | CSharp7.cs:266:13:266:26 | case ...: | semmle.label | successor | -| CSharp7.cs:263:13:263:27 | case ...: | CSharp7.cs:263:13:263:27 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:263:13:263:27 | case ...: | CSharp7.cs:263:13:263:27 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:263:18:263:26 | String s2 | CSharp7.cs:264:17:264:50 | ...; | semmle.label | successor | +| CSharp7.cs:263:13:263:27 | case ...: | CSharp7.cs:263:18:263:26 | String s2 | semmle.label | successor | +| CSharp7.cs:263:18:263:26 | After String s2 [match] | CSharp7.cs:263:13:263:27 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:263:18:263:26 | After String s2 [no-match] | CSharp7.cs:263:13:263:27 | After case ...: [no-match] | semmle.label | no-match | +| CSharp7.cs:263:18:263:26 | String s2 | CSharp7.cs:263:18:263:26 | After String s2 [match] | semmle.label | match | +| CSharp7.cs:263:18:263:26 | String s2 | CSharp7.cs:263:18:263:26 | After String s2 [no-match] | semmle.label | no-match | | CSharp7.cs:264:17:264:49 | After call to method WriteLine | CSharp7.cs:264:17:264:50 | After ...; | semmle.label | successor | | CSharp7.cs:264:17:264:49 | Before call to method WriteLine | CSharp7.cs:264:35:264:48 | Before $"..." | semmle.label | successor | | CSharp7.cs:264:17:264:49 | call to method WriteLine | CSharp7.cs:264:17:264:49 | After call to method WriteLine | semmle.label | successor | @@ -119,11 +131,13 @@ | CSharp7.cs:264:45:264:46 | access to local variable s2 | CSharp7.cs:264:44:264:47 | {...} | semmle.label | successor | | CSharp7.cs:265:17:265:22 | Before break; | CSharp7.cs:265:17:265:22 | break; | semmle.label | successor | | CSharp7.cs:265:17:265:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:266:13:266:26 | After case ...: [match] | CSharp7.cs:266:18:266:23 | access to type Double | semmle.label | successor | +| CSharp7.cs:266:13:266:26 | After case ...: [match] | CSharp7.cs:267:17:267:44 | ...; | semmle.label | successor | | CSharp7.cs:266:13:266:26 | After case ...: [no-match] | CSharp7.cs:269:13:269:24 | case ...: | semmle.label | successor | -| CSharp7.cs:266:13:266:26 | case ...: | CSharp7.cs:266:13:266:26 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:266:13:266:26 | case ...: | CSharp7.cs:266:13:266:26 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:266:18:266:23 | access to type Double | CSharp7.cs:267:17:267:44 | ...; | semmle.label | successor | +| CSharp7.cs:266:13:266:26 | case ...: | CSharp7.cs:266:18:266:23 | access to type Double | semmle.label | successor | +| CSharp7.cs:266:18:266:23 | After access to type Double [match] | CSharp7.cs:266:13:266:26 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:266:18:266:23 | After access to type Double [no-match] | CSharp7.cs:266:13:266:26 | After case ...: [no-match] | semmle.label | no-match | +| CSharp7.cs:266:18:266:23 | access to type Double | CSharp7.cs:266:18:266:23 | After access to type Double [match] | semmle.label | match | +| CSharp7.cs:266:18:266:23 | access to type Double | CSharp7.cs:266:18:266:23 | After access to type Double [no-match] | semmle.label | no-match | | CSharp7.cs:267:17:267:43 | After call to method WriteLine | CSharp7.cs:267:17:267:44 | After ...; | semmle.label | successor | | CSharp7.cs:267:17:267:43 | Before call to method WriteLine | CSharp7.cs:267:35:267:42 | "Double" | semmle.label | successor | | CSharp7.cs:267:17:267:43 | call to method WriteLine | CSharp7.cs:267:17:267:43 | After call to method WriteLine | semmle.label | successor | @@ -132,11 +146,13 @@ | CSharp7.cs:267:35:267:42 | "Double" | CSharp7.cs:267:17:267:43 | call to method WriteLine | semmle.label | successor | | CSharp7.cs:268:17:268:22 | Before break; | CSharp7.cs:268:17:268:22 | break; | semmle.label | successor | | CSharp7.cs:268:17:268:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | -| CSharp7.cs:269:13:269:24 | After case ...: [match] | CSharp7.cs:269:18:269:23 | Object v2 | semmle.label | successor | +| CSharp7.cs:269:13:269:24 | After case ...: [match] | CSharp7.cs:270:17:270:22 | Before break; | semmle.label | successor | | CSharp7.cs:269:13:269:24 | After case ...: [no-match] | CSharp7.cs:271:13:271:20 | default: | semmle.label | successor | -| CSharp7.cs:269:13:269:24 | case ...: | CSharp7.cs:269:13:269:24 | After case ...: [match] | semmle.label | match | -| CSharp7.cs:269:13:269:24 | case ...: | CSharp7.cs:269:13:269:24 | After case ...: [no-match] | semmle.label | no-match | -| CSharp7.cs:269:18:269:23 | Object v2 | CSharp7.cs:270:17:270:22 | Before break; | semmle.label | successor | +| CSharp7.cs:269:13:269:24 | case ...: | CSharp7.cs:269:18:269:23 | Object v2 | semmle.label | successor | +| CSharp7.cs:269:18:269:23 | After Object v2 [match] | CSharp7.cs:269:13:269:24 | After case ...: [match] | semmle.label | match | +| CSharp7.cs:269:18:269:23 | After Object v2 [no-match] | CSharp7.cs:269:13:269:24 | After case ...: [no-match] | semmle.label | no-match | +| CSharp7.cs:269:18:269:23 | Object v2 | CSharp7.cs:269:18:269:23 | After Object v2 [match] | semmle.label | match | +| CSharp7.cs:269:18:269:23 | Object v2 | CSharp7.cs:269:18:269:23 | After Object v2 [no-match] | semmle.label | no-match | | CSharp7.cs:270:17:270:22 | Before break; | CSharp7.cs:270:17:270:22 | break; | semmle.label | successor | | CSharp7.cs:270:17:270:22 | break; | CSharp7.cs:248:9:274:9 | After switch (...) {...} | semmle.label | break | | CSharp7.cs:271:13:271:20 | After default: [match] | CSharp7.cs:272:17:272:52 | ...; | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected index 898a1ff46912..4493882fa476 100644 --- a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected +++ b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected @@ -12,10 +12,12 @@ | patterns.cs:100:20:100:20 | access to parameter x | patterns.cs:101:13:101:40 | ... => ... | semmle.label | successor | | patterns.cs:100:20:103:9 | ... switch { ... } | patterns.cs:100:20:100:20 | access to parameter x | semmle.label | successor | | patterns.cs:100:20:103:9 | After ... switch { ... } | patterns.cs:100:13:103:9 | String size = ... | semmle.label | successor | -| patterns.cs:101:13:101:17 | Int32 y | patterns.cs:101:24:101:29 | Before ... > ... | semmle.label | successor | -| patterns.cs:101:13:101:40 | ... => ... | patterns.cs:101:13:101:40 | After ... => ... [match] | semmle.label | match | -| patterns.cs:101:13:101:40 | ... => ... | patterns.cs:101:13:101:40 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:101:13:101:40 | After ... => ... [match] | patterns.cs:101:13:101:17 | Int32 y | semmle.label | successor | +| patterns.cs:101:13:101:17 | After Int32 y [match] | patterns.cs:101:13:101:40 | After ... => ... [match] | semmle.label | match | +| patterns.cs:101:13:101:17 | After Int32 y [no-match] | patterns.cs:101:13:101:40 | After ... => ... [no-match] | semmle.label | no-match | +| patterns.cs:101:13:101:17 | Int32 y | patterns.cs:101:13:101:17 | After Int32 y [match] | semmle.label | match | +| patterns.cs:101:13:101:17 | Int32 y | patterns.cs:101:13:101:17 | After Int32 y [no-match] | semmle.label | no-match | +| patterns.cs:101:13:101:40 | ... => ... | patterns.cs:101:13:101:17 | Int32 y | semmle.label | successor | +| patterns.cs:101:13:101:40 | After ... => ... [match] | patterns.cs:101:24:101:29 | Before ... > ... | semmle.label | successor | | patterns.cs:101:13:101:40 | After ... => ... [no-match] | patterns.cs:102:13:102:24 | ... => ... | semmle.label | successor | | patterns.cs:101:24:101:24 | access to local variable y | patterns.cs:101:28:101:29 | 10 | semmle.label | successor | | patterns.cs:101:24:101:29 | ... > ... | patterns.cs:101:24:101:29 | After ... > ... [false] | semmle.label | false | @@ -25,9 +27,10 @@ | patterns.cs:101:24:101:29 | Before ... > ... | patterns.cs:101:24:101:24 | access to local variable y | semmle.label | successor | | patterns.cs:101:28:101:29 | 10 | patterns.cs:101:24:101:29 | ... > ... | semmle.label | successor | | patterns.cs:101:34:101:40 | "large" | patterns.cs:100:20:103:9 | After ... switch { ... } | semmle.label | successor | -| patterns.cs:102:13:102:13 | _ | patterns.cs:102:18:102:24 | "small" | semmle.label | successor | -| patterns.cs:102:13:102:24 | ... => ... | patterns.cs:102:13:102:24 | After ... => ... [match] | semmle.label | match | -| patterns.cs:102:13:102:24 | After ... => ... [match] | patterns.cs:102:13:102:13 | _ | semmle.label | successor | +| patterns.cs:102:13:102:13 | After _ [match] | patterns.cs:102:13:102:24 | After ... => ... [match] | semmle.label | match | +| patterns.cs:102:13:102:13 | _ | patterns.cs:102:13:102:13 | After _ [match] | semmle.label | match | +| patterns.cs:102:13:102:24 | ... => ... | patterns.cs:102:13:102:13 | _ | semmle.label | successor | +| patterns.cs:102:13:102:24 | After ... => ... [match] | patterns.cs:102:18:102:24 | "small" | semmle.label | successor | | patterns.cs:102:18:102:24 | "small" | patterns.cs:100:20:103:9 | After ... switch { ... } | semmle.label | successor | | patterns.cs:105:9:105:27 | ... ...; | patterns.cs:105:13:105:18 | Before Int32 x0 = ... | semmle.label | successor | | patterns.cs:105:9:105:27 | After ... ...; | patterns.cs:108:9:112:10 | ...; | semmle.label | successor | @@ -60,13 +63,14 @@ | patterns.cs:108:29:108:30 | access to local variable y0 | patterns.cs:108:24:108:31 | (..., ...) | semmle.label | successor | | patterns.cs:110:13:110:17 | ( ... ) | patterns.cs:110:13:110:17 | After ( ... ) | semmle.label | successor | | patterns.cs:110:13:110:17 | After ( ... ) | patterns.cs:110:13:110:17 | { ... } | semmle.label | successor | -| patterns.cs:110:13:110:17 | After { ... } | patterns.cs:110:22:110:26 | Before (..., ...) | semmle.label | successor | +| patterns.cs:110:13:110:17 | After { ... } [match] | patterns.cs:110:13:110:26 | After ... => ... [match] | semmle.label | match | +| patterns.cs:110:13:110:17 | After { ... } [no-match] | patterns.cs:110:13:110:26 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:110:13:110:17 | Before ( ... ) | patterns.cs:110:14:110:14 | 0 | semmle.label | successor | | patterns.cs:110:13:110:17 | Before { ... } | patterns.cs:110:13:110:17 | Before ( ... ) | semmle.label | successor | -| patterns.cs:110:13:110:17 | { ... } | patterns.cs:110:13:110:17 | After { ... } | semmle.label | successor | -| patterns.cs:110:13:110:26 | ... => ... | patterns.cs:110:13:110:26 | After ... => ... [match] | semmle.label | match | -| patterns.cs:110:13:110:26 | ... => ... | patterns.cs:110:13:110:26 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:110:13:110:26 | After ... => ... [match] | patterns.cs:110:13:110:17 | Before { ... } | semmle.label | successor | +| patterns.cs:110:13:110:17 | { ... } | patterns.cs:110:13:110:17 | After { ... } [match] | semmle.label | match | +| patterns.cs:110:13:110:17 | { ... } | patterns.cs:110:13:110:17 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:110:13:110:26 | ... => ... | patterns.cs:110:13:110:17 | Before { ... } | semmle.label | successor | +| patterns.cs:110:13:110:26 | After ... => ... [match] | patterns.cs:110:22:110:26 | Before (..., ...) | semmle.label | successor | | patterns.cs:110:13:110:26 | After ... => ... [no-match] | patterns.cs:111:13:111:26 | ... => ... | semmle.label | successor | | patterns.cs:110:14:110:14 | 0 | patterns.cs:110:16:110:16 | 1 | semmle.label | successor | | patterns.cs:110:16:110:16 | 1 | patterns.cs:110:13:110:17 | ( ... ) | semmle.label | successor | @@ -77,13 +81,14 @@ | patterns.cs:110:25:110:25 | 0 | patterns.cs:110:22:110:26 | (..., ...) | semmle.label | successor | | patterns.cs:111:13:111:17 | ( ... ) | patterns.cs:111:13:111:17 | After ( ... ) | semmle.label | successor | | patterns.cs:111:13:111:17 | After ( ... ) | patterns.cs:111:13:111:17 | { ... } | semmle.label | successor | -| patterns.cs:111:13:111:17 | After { ... } | patterns.cs:111:22:111:26 | Before (..., ...) | semmle.label | successor | +| patterns.cs:111:13:111:17 | After { ... } [match] | patterns.cs:111:13:111:26 | After ... => ... [match] | semmle.label | match | +| patterns.cs:111:13:111:17 | After { ... } [no-match] | patterns.cs:111:13:111:26 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:111:13:111:17 | Before ( ... ) | patterns.cs:111:14:111:14 | 1 | semmle.label | successor | | patterns.cs:111:13:111:17 | Before { ... } | patterns.cs:111:13:111:17 | Before ( ... ) | semmle.label | successor | -| patterns.cs:111:13:111:17 | { ... } | patterns.cs:111:13:111:17 | After { ... } | semmle.label | successor | -| patterns.cs:111:13:111:26 | ... => ... | patterns.cs:111:13:111:26 | After ... => ... [match] | semmle.label | match | -| patterns.cs:111:13:111:26 | ... => ... | patterns.cs:111:13:111:26 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:111:13:111:26 | After ... => ... [match] | patterns.cs:111:13:111:17 | Before { ... } | semmle.label | successor | +| patterns.cs:111:13:111:17 | { ... } | patterns.cs:111:13:111:17 | After { ... } [match] | semmle.label | match | +| patterns.cs:111:13:111:17 | { ... } | patterns.cs:111:13:111:17 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:111:13:111:26 | ... => ... | patterns.cs:111:13:111:17 | Before { ... } | semmle.label | successor | +| patterns.cs:111:13:111:26 | After ... => ... [match] | patterns.cs:111:22:111:26 | Before (..., ...) | semmle.label | successor | | patterns.cs:111:13:111:26 | After ... => ... [no-match] | patterns.cs:108:24:112:9 | After ... switch { ... } | semmle.label | successor | | patterns.cs:111:14:111:14 | 1 | patterns.cs:111:16:111:16 | 0 | semmle.label | successor | | patterns.cs:111:16:111:16 | 0 | patterns.cs:111:13:111:17 | ( ... ) | semmle.label | successor | @@ -111,13 +116,14 @@ | patterns.cs:115:25:115:26 | access to local variable y0 | patterns.cs:115:20:115:27 | (..., ...) | semmle.label | successor | | patterns.cs:117:13:117:22 | ( ... ) | patterns.cs:117:13:117:22 | After ( ... ) | semmle.label | successor | | patterns.cs:117:13:117:22 | After ( ... ) | patterns.cs:117:13:117:22 | { ... } | semmle.label | successor | -| patterns.cs:117:13:117:22 | After { ... } | patterns.cs:117:27:117:33 | Before (..., ...) | semmle.label | successor | +| patterns.cs:117:13:117:22 | After { ... } [match] | patterns.cs:117:13:117:33 | After ... => ... [match] | semmle.label | match | +| patterns.cs:117:13:117:22 | After { ... } [no-match] | patterns.cs:117:13:117:33 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:117:13:117:22 | Before ( ... ) | patterns.cs:117:14:117:14 | 0 | semmle.label | successor | | patterns.cs:117:13:117:22 | Before { ... } | patterns.cs:117:13:117:22 | Before ( ... ) | semmle.label | successor | -| patterns.cs:117:13:117:22 | { ... } | patterns.cs:117:13:117:22 | After { ... } | semmle.label | successor | -| patterns.cs:117:13:117:33 | ... => ... | patterns.cs:117:13:117:33 | After ... => ... [match] | semmle.label | match | -| patterns.cs:117:13:117:33 | ... => ... | patterns.cs:117:13:117:33 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:117:13:117:33 | After ... => ... [match] | patterns.cs:117:13:117:22 | Before { ... } | semmle.label | successor | +| patterns.cs:117:13:117:22 | { ... } | patterns.cs:117:13:117:22 | After { ... } [match] | semmle.label | match | +| patterns.cs:117:13:117:22 | { ... } | patterns.cs:117:13:117:22 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:117:13:117:33 | ... => ... | patterns.cs:117:13:117:22 | Before { ... } | semmle.label | successor | +| patterns.cs:117:13:117:33 | After ... => ... [match] | patterns.cs:117:27:117:33 | Before (..., ...) | semmle.label | successor | | patterns.cs:117:13:117:33 | After ... => ... [no-match] | patterns.cs:118:13:118:34 | ... => ... | semmle.label | successor | | patterns.cs:117:14:117:14 | 0 | patterns.cs:117:16:117:21 | Int32 y2 | semmle.label | successor | | patterns.cs:117:16:117:21 | Int32 y2 | patterns.cs:117:13:117:22 | ( ... ) | semmle.label | successor | @@ -128,13 +134,14 @@ | patterns.cs:117:32:117:32 | 0 | patterns.cs:117:27:117:33 | (..., ...) | semmle.label | successor | | patterns.cs:118:13:118:23 | ( ... ) | patterns.cs:118:13:118:23 | After ( ... ) | semmle.label | successor | | patterns.cs:118:13:118:23 | After ( ... ) | patterns.cs:118:13:118:23 | { ... } | semmle.label | successor | -| patterns.cs:118:13:118:23 | After { ... } | patterns.cs:118:28:118:34 | Before (..., ...) | semmle.label | successor | +| patterns.cs:118:13:118:23 | After { ... } [match] | patterns.cs:118:13:118:34 | After ... => ... [match] | semmle.label | match | +| patterns.cs:118:13:118:23 | After { ... } [no-match] | patterns.cs:118:13:118:34 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:118:13:118:23 | Before ( ... ) | patterns.cs:118:14:118:19 | Int32 x2 | semmle.label | successor | | patterns.cs:118:13:118:23 | Before { ... } | patterns.cs:118:13:118:23 | Before ( ... ) | semmle.label | successor | -| patterns.cs:118:13:118:23 | { ... } | patterns.cs:118:13:118:23 | After { ... } | semmle.label | successor | -| patterns.cs:118:13:118:34 | ... => ... | patterns.cs:118:13:118:34 | After ... => ... [match] | semmle.label | match | -| patterns.cs:118:13:118:34 | ... => ... | patterns.cs:118:13:118:34 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:118:13:118:34 | After ... => ... [match] | patterns.cs:118:13:118:23 | Before { ... } | semmle.label | successor | +| patterns.cs:118:13:118:23 | { ... } | patterns.cs:118:13:118:23 | After { ... } [match] | semmle.label | match | +| patterns.cs:118:13:118:23 | { ... } | patterns.cs:118:13:118:23 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:118:13:118:34 | ... => ... | patterns.cs:118:13:118:23 | Before { ... } | semmle.label | successor | +| patterns.cs:118:13:118:34 | After ... => ... [match] | patterns.cs:118:28:118:34 | Before (..., ...) | semmle.label | successor | | patterns.cs:118:13:118:34 | After ... => ... [no-match] | patterns.cs:119:13:119:38 | ... => ... | semmle.label | successor | | patterns.cs:118:14:118:19 | Int32 x2 | patterns.cs:118:22:118:22 | 0 | semmle.label | successor | | patterns.cs:118:22:118:22 | 0 | patterns.cs:118:13:118:23 | ( ... ) | semmle.label | successor | @@ -145,13 +152,14 @@ | patterns.cs:118:32:118:33 | access to local variable x2 | patterns.cs:118:28:118:34 | (..., ...) | semmle.label | successor | | patterns.cs:119:13:119:28 | ( ... ) | patterns.cs:119:13:119:28 | After ( ... ) | semmle.label | successor | | patterns.cs:119:13:119:28 | After ( ... ) | patterns.cs:119:13:119:28 | { ... } | semmle.label | successor | -| patterns.cs:119:13:119:28 | After { ... } | patterns.cs:119:33:119:38 | Before (..., ...) | semmle.label | successor | +| patterns.cs:119:13:119:28 | After { ... } [match] | patterns.cs:119:13:119:38 | After ... => ... [match] | semmle.label | match | +| patterns.cs:119:13:119:28 | After { ... } [no-match] | patterns.cs:119:13:119:38 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:119:13:119:28 | Before ( ... ) | patterns.cs:119:14:119:19 | Int32 x2 | semmle.label | successor | | patterns.cs:119:13:119:28 | Before { ... } | patterns.cs:119:13:119:28 | Before ( ... ) | semmle.label | successor | -| patterns.cs:119:13:119:28 | { ... } | patterns.cs:119:13:119:28 | After { ... } | semmle.label | successor | -| patterns.cs:119:13:119:38 | ... => ... | patterns.cs:119:13:119:38 | After ... => ... [match] | semmle.label | match | -| patterns.cs:119:13:119:38 | ... => ... | patterns.cs:119:13:119:38 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:119:13:119:38 | After ... => ... [match] | patterns.cs:119:13:119:28 | Before { ... } | semmle.label | successor | +| patterns.cs:119:13:119:28 | { ... } | patterns.cs:119:13:119:28 | After { ... } [match] | semmle.label | match | +| patterns.cs:119:13:119:28 | { ... } | patterns.cs:119:13:119:28 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:119:13:119:38 | ... => ... | patterns.cs:119:13:119:28 | Before { ... } | semmle.label | successor | +| patterns.cs:119:13:119:38 | After ... => ... [match] | patterns.cs:119:33:119:38 | Before (..., ...) | semmle.label | successor | | patterns.cs:119:13:119:38 | After ... => ... [no-match] | patterns.cs:115:20:120:9 | After ... switch { ... } | semmle.label | successor | | patterns.cs:119:14:119:19 | Int32 x2 | patterns.cs:119:22:119:27 | Int32 y2 | semmle.label | successor | | patterns.cs:119:22:119:27 | Int32 y2 | patterns.cs:119:13:119:28 | ( ... ) | semmle.label | successor | @@ -193,12 +201,13 @@ | patterns.cs:126:17:132:9 | ... switch { ... } | patterns.cs:126:17:126:17 | access to local variable s | semmle.label | successor | | patterns.cs:126:17:132:9 | After ... switch { ... } | patterns.cs:126:13:132:9 | Int32 r = ... | semmle.label | successor | | patterns.cs:128:13:128:20 | access to type MyStruct | patterns.cs:128:22:128:33 | Before { ... } | semmle.label | successor | -| patterns.cs:128:13:128:33 | After { ... } | patterns.cs:128:40:128:44 | Before ... > ... | semmle.label | successor | +| patterns.cs:128:13:128:33 | After { ... } [match] | patterns.cs:128:13:128:49 | After ... => ... [match] | semmle.label | match | +| patterns.cs:128:13:128:33 | After { ... } [no-match] | patterns.cs:128:13:128:49 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:128:13:128:33 | Before { ... } | patterns.cs:128:13:128:20 | access to type MyStruct | semmle.label | successor | -| patterns.cs:128:13:128:33 | { ... } | patterns.cs:128:13:128:33 | After { ... } | semmle.label | successor | -| patterns.cs:128:13:128:49 | ... => ... | patterns.cs:128:13:128:49 | After ... => ... [match] | semmle.label | match | -| patterns.cs:128:13:128:49 | ... => ... | patterns.cs:128:13:128:49 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:128:13:128:49 | After ... => ... [match] | patterns.cs:128:13:128:33 | Before { ... } | semmle.label | successor | +| patterns.cs:128:13:128:33 | { ... } | patterns.cs:128:13:128:33 | After { ... } [match] | semmle.label | match | +| patterns.cs:128:13:128:33 | { ... } | patterns.cs:128:13:128:33 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:128:13:128:49 | ... => ... | patterns.cs:128:13:128:33 | Before { ... } | semmle.label | successor | +| patterns.cs:128:13:128:49 | After ... => ... [match] | patterns.cs:128:40:128:44 | Before ... > ... | semmle.label | successor | | patterns.cs:128:13:128:49 | After ... => ... [no-match] | patterns.cs:129:13:129:38 | ... => ... | semmle.label | successor | | patterns.cs:128:22:128:33 | After { ... } | patterns.cs:128:13:128:33 | { ... } | semmle.label | successor | | patterns.cs:128:22:128:33 | Before { ... } | patterns.cs:128:27:128:31 | Int32 x | semmle.label | successor | @@ -213,13 +222,14 @@ | patterns.cs:128:44:128:44 | 2 | patterns.cs:128:40:128:44 | ... > ... | semmle.label | successor | | patterns.cs:128:49:128:49 | 0 | patterns.cs:126:17:132:9 | After ... switch { ... } | semmle.label | successor | | patterns.cs:129:13:129:20 | access to type MyStruct | patterns.cs:129:22:129:30 | Before { ... } | semmle.label | successor | -| patterns.cs:129:13:129:33 | After { ... } | patterns.cs:129:38:129:38 | 1 | semmle.label | successor | +| patterns.cs:129:13:129:33 | After { ... } [match] | patterns.cs:129:13:129:38 | After ... => ... [match] | semmle.label | match | +| patterns.cs:129:13:129:33 | After { ... } [no-match] | patterns.cs:129:13:129:38 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:129:13:129:33 | Before { ... } | patterns.cs:129:13:129:33 | MyStruct ms | semmle.label | successor | | patterns.cs:129:13:129:33 | MyStruct ms | patterns.cs:129:13:129:20 | access to type MyStruct | semmle.label | successor | -| patterns.cs:129:13:129:33 | { ... } | patterns.cs:129:13:129:33 | After { ... } | semmle.label | successor | -| patterns.cs:129:13:129:38 | ... => ... | patterns.cs:129:13:129:38 | After ... => ... [match] | semmle.label | match | -| patterns.cs:129:13:129:38 | ... => ... | patterns.cs:129:13:129:38 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:129:13:129:38 | After ... => ... [match] | patterns.cs:129:13:129:33 | Before { ... } | semmle.label | successor | +| patterns.cs:129:13:129:33 | { ... } | patterns.cs:129:13:129:33 | After { ... } [match] | semmle.label | match | +| patterns.cs:129:13:129:33 | { ... } | patterns.cs:129:13:129:33 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:129:13:129:38 | ... => ... | patterns.cs:129:13:129:33 | Before { ... } | semmle.label | successor | +| patterns.cs:129:13:129:38 | After ... => ... [match] | patterns.cs:129:38:129:38 | 1 | semmle.label | successor | | patterns.cs:129:13:129:38 | After ... => ... [no-match] | patterns.cs:130:13:130:23 | ... => ... | semmle.label | successor | | patterns.cs:129:22:129:30 | After { ... } | patterns.cs:129:13:129:33 | { ... } | semmle.label | successor | | patterns.cs:129:22:129:30 | Before { ... } | patterns.cs:129:27:129:28 | 10 | semmle.label | successor | @@ -228,23 +238,25 @@ | patterns.cs:129:38:129:38 | 1 | patterns.cs:126:17:132:9 | After ... switch { ... } | semmle.label | successor | | patterns.cs:130:13:130:18 | ( ... ) | patterns.cs:130:13:130:18 | After ( ... ) | semmle.label | successor | | patterns.cs:130:13:130:18 | After ( ... ) | patterns.cs:130:13:130:18 | { ... } | semmle.label | successor | -| patterns.cs:130:13:130:18 | After { ... } | patterns.cs:130:23:130:23 | 2 | semmle.label | successor | +| patterns.cs:130:13:130:18 | After { ... } [match] | patterns.cs:130:13:130:23 | After ... => ... [match] | semmle.label | match | +| patterns.cs:130:13:130:18 | After { ... } [no-match] | patterns.cs:130:13:130:23 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:130:13:130:18 | Before ( ... ) | patterns.cs:130:14:130:14 | 1 | semmle.label | successor | | patterns.cs:130:13:130:18 | Before { ... } | patterns.cs:130:13:130:18 | Before ( ... ) | semmle.label | successor | -| patterns.cs:130:13:130:18 | { ... } | patterns.cs:130:13:130:18 | After { ... } | semmle.label | successor | -| patterns.cs:130:13:130:23 | ... => ... | patterns.cs:130:13:130:23 | After ... => ... [match] | semmle.label | match | -| patterns.cs:130:13:130:23 | ... => ... | patterns.cs:130:13:130:23 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:130:13:130:23 | After ... => ... [match] | patterns.cs:130:13:130:18 | Before { ... } | semmle.label | successor | +| patterns.cs:130:13:130:18 | { ... } | patterns.cs:130:13:130:18 | After { ... } [match] | semmle.label | match | +| patterns.cs:130:13:130:18 | { ... } | patterns.cs:130:13:130:18 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:130:13:130:23 | ... => ... | patterns.cs:130:13:130:18 | Before { ... } | semmle.label | successor | +| patterns.cs:130:13:130:23 | After ... => ... [match] | patterns.cs:130:23:130:23 | 2 | semmle.label | successor | | patterns.cs:130:13:130:23 | After ... => ... [no-match] | patterns.cs:131:13:131:27 | ... => ... | semmle.label | successor | | patterns.cs:130:14:130:14 | 1 | patterns.cs:130:17:130:17 | 2 | semmle.label | successor | | patterns.cs:130:17:130:17 | 2 | patterns.cs:130:13:130:18 | ( ... ) | semmle.label | successor | | patterns.cs:130:23:130:23 | 2 | patterns.cs:126:17:132:9 | After ... switch { ... } | semmle.label | successor | -| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:131:13:131:22 | After (..., ...) | semmle.label | successor | -| patterns.cs:131:13:131:22 | After (..., ...) | patterns.cs:131:27:131:27 | 3 | semmle.label | successor | +| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:131:13:131:22 | After (..., ...) [match] | semmle.label | match | +| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:131:13:131:22 | After (..., ...) [no-match] | semmle.label | no-match | +| patterns.cs:131:13:131:22 | After (..., ...) [match] | patterns.cs:131:13:131:27 | After ... => ... [match] | semmle.label | match | +| patterns.cs:131:13:131:22 | After (..., ...) [no-match] | patterns.cs:131:13:131:27 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:131:13:131:22 | Before (..., ...) | patterns.cs:131:18:131:18 | Int32 x | semmle.label | successor | -| patterns.cs:131:13:131:27 | ... => ... | patterns.cs:131:13:131:27 | After ... => ... [match] | semmle.label | match | -| patterns.cs:131:13:131:27 | ... => ... | patterns.cs:131:13:131:27 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:131:13:131:27 | After ... => ... [match] | patterns.cs:131:13:131:22 | Before (..., ...) | semmle.label | successor | +| patterns.cs:131:13:131:27 | ... => ... | patterns.cs:131:13:131:22 | Before (..., ...) | semmle.label | successor | +| patterns.cs:131:13:131:27 | After ... => ... [match] | patterns.cs:131:27:131:27 | 3 | semmle.label | successor | | patterns.cs:131:13:131:27 | After ... => ... [no-match] | patterns.cs:126:17:132:9 | After ... switch { ... } | semmle.label | successor | | patterns.cs:131:18:131:18 | Int32 x | patterns.cs:131:21:131:21 | _ | semmle.label | successor | | patterns.cs:131:21:131:21 | _ | patterns.cs:131:13:131:22 | (..., ...) | semmle.label | successor | @@ -262,10 +274,12 @@ | patterns.cs:136:17:136:17 | access to parameter o | patterns.cs:138:17:138:50 | ... => ... | semmle.label | successor | | patterns.cs:136:17:143:13 | ... switch { ... } | patterns.cs:136:17:136:17 | access to parameter o | semmle.label | successor | | patterns.cs:136:17:143:13 | After ... switch { ... } | patterns.cs:136:13:143:13 | ... = ... | semmle.label | successor | -| patterns.cs:138:17:138:17 | 1 | patterns.cs:138:22:138:50 | Before throw ... | semmle.label | successor | -| patterns.cs:138:17:138:50 | ... => ... | patterns.cs:138:17:138:50 | After ... => ... [match] | semmle.label | match | -| patterns.cs:138:17:138:50 | ... => ... | patterns.cs:138:17:138:50 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:138:17:138:50 | After ... => ... [match] | patterns.cs:138:17:138:17 | 1 | semmle.label | successor | +| patterns.cs:138:17:138:17 | 1 | patterns.cs:138:17:138:17 | After 1 [match] | semmle.label | match | +| patterns.cs:138:17:138:17 | 1 | patterns.cs:138:17:138:17 | After 1 [no-match] | semmle.label | no-match | +| patterns.cs:138:17:138:17 | After 1 [match] | patterns.cs:138:17:138:50 | After ... => ... [match] | semmle.label | match | +| patterns.cs:138:17:138:17 | After 1 [no-match] | patterns.cs:138:17:138:50 | After ... => ... [no-match] | semmle.label | no-match | +| patterns.cs:138:17:138:50 | ... => ... | patterns.cs:138:17:138:17 | 1 | semmle.label | successor | +| patterns.cs:138:17:138:50 | After ... => ... [match] | patterns.cs:138:22:138:50 | Before throw ... | semmle.label | successor | | patterns.cs:138:17:138:50 | After ... => ... [no-match] | patterns.cs:139:17:139:22 | ... => ... | semmle.label | successor | | patterns.cs:138:22:138:50 | Before throw ... | patterns.cs:138:28:138:50 | Before object creation of type ArgumentException | semmle.label | successor | | patterns.cs:138:22:138:50 | throw ... | patterns.cs:145:9:148:9 | catch (...) {...} | semmle.label | exception | @@ -273,16 +287,20 @@ | patterns.cs:138:28:138:50 | Before object creation of type ArgumentException | patterns.cs:138:28:138:50 | object creation of type ArgumentException | semmle.label | successor | | patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:138:28:138:50 | After object creation of type ArgumentException | semmle.label | successor | | patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:145:9:148:9 | catch (...) {...} | semmle.label | exception | -| patterns.cs:139:17:139:17 | 2 | patterns.cs:139:22:139:22 | 3 | semmle.label | successor | -| patterns.cs:139:17:139:22 | ... => ... | patterns.cs:139:17:139:22 | After ... => ... [match] | semmle.label | match | -| patterns.cs:139:17:139:22 | ... => ... | patterns.cs:139:17:139:22 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:139:17:139:22 | After ... => ... [match] | patterns.cs:139:17:139:17 | 2 | semmle.label | successor | +| patterns.cs:139:17:139:17 | 2 | patterns.cs:139:17:139:17 | After 2 [match] | semmle.label | match | +| patterns.cs:139:17:139:17 | 2 | patterns.cs:139:17:139:17 | After 2 [no-match] | semmle.label | no-match | +| patterns.cs:139:17:139:17 | After 2 [match] | patterns.cs:139:17:139:22 | After ... => ... [match] | semmle.label | match | +| patterns.cs:139:17:139:17 | After 2 [no-match] | patterns.cs:139:17:139:22 | After ... => ... [no-match] | semmle.label | no-match | +| patterns.cs:139:17:139:22 | ... => ... | patterns.cs:139:17:139:17 | 2 | semmle.label | successor | +| patterns.cs:139:17:139:22 | After ... => ... [match] | patterns.cs:139:22:139:22 | 3 | semmle.label | successor | | patterns.cs:139:17:139:22 | After ... => ... [no-match] | patterns.cs:140:17:140:42 | ... => ... | semmle.label | successor | | patterns.cs:139:22:139:22 | 3 | patterns.cs:136:17:143:13 | After ... switch { ... } | semmle.label | successor | -| patterns.cs:140:17:140:24 | Object y | patterns.cs:140:31:140:37 | Before ... is ... | semmle.label | successor | -| patterns.cs:140:17:140:42 | ... => ... | patterns.cs:140:17:140:42 | After ... => ... [match] | semmle.label | match | -| patterns.cs:140:17:140:42 | ... => ... | patterns.cs:140:17:140:42 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:140:17:140:42 | After ... => ... [match] | patterns.cs:140:17:140:24 | Object y | semmle.label | successor | +| patterns.cs:140:17:140:24 | After Object y [match] | patterns.cs:140:17:140:42 | After ... => ... [match] | semmle.label | match | +| patterns.cs:140:17:140:24 | After Object y [no-match] | patterns.cs:140:17:140:42 | After ... => ... [no-match] | semmle.label | no-match | +| patterns.cs:140:17:140:24 | Object y | patterns.cs:140:17:140:24 | After Object y [match] | semmle.label | match | +| patterns.cs:140:17:140:24 | Object y | patterns.cs:140:17:140:24 | After Object y [no-match] | semmle.label | no-match | +| patterns.cs:140:17:140:42 | ... => ... | patterns.cs:140:17:140:24 | Object y | semmle.label | successor | +| patterns.cs:140:17:140:42 | After ... => ... [match] | patterns.cs:140:31:140:37 | Before ... is ... | semmle.label | successor | | patterns.cs:140:17:140:42 | After ... => ... [no-match] | patterns.cs:141:17:141:29 | ... => ... | semmle.label | successor | | patterns.cs:140:31:140:31 | access to local variable y | patterns.cs:140:31:140:37 | ... is ... | semmle.label | successor | | patterns.cs:140:31:140:37 | ... is ... | patterns.cs:140:31:140:37 | After ... is ... [false] | semmle.label | false | @@ -296,19 +314,22 @@ | patterns.cs:140:36:140:37 | { ... } | patterns.cs:140:36:140:37 | After { ... } | semmle.label | successor | | patterns.cs:140:36:140:37 | { ... } | patterns.cs:140:36:140:37 | { ... } | semmle.label | successor | | patterns.cs:140:42:140:42 | 4 | patterns.cs:136:17:143:13 | After ... switch { ... } | semmle.label | successor | -| patterns.cs:141:17:141:22 | access to type String | patterns.cs:141:29:141:29 | 5 | semmle.label | successor | -| patterns.cs:141:17:141:29 | ... => ... | patterns.cs:141:17:141:29 | After ... => ... [match] | semmle.label | match | -| patterns.cs:141:17:141:29 | ... => ... | patterns.cs:141:17:141:29 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:141:17:141:29 | After ... => ... [match] | patterns.cs:141:17:141:22 | access to type String | semmle.label | successor | +| patterns.cs:141:17:141:22 | After access to type String [match] | patterns.cs:141:17:141:29 | After ... => ... [match] | semmle.label | match | +| patterns.cs:141:17:141:22 | After access to type String [no-match] | patterns.cs:141:17:141:29 | After ... => ... [no-match] | semmle.label | no-match | +| patterns.cs:141:17:141:22 | access to type String | patterns.cs:141:17:141:22 | After access to type String [match] | semmle.label | match | +| patterns.cs:141:17:141:22 | access to type String | patterns.cs:141:17:141:22 | After access to type String [no-match] | semmle.label | no-match | +| patterns.cs:141:17:141:29 | ... => ... | patterns.cs:141:17:141:22 | access to type String | semmle.label | successor | +| patterns.cs:141:17:141:29 | After ... => ... [match] | patterns.cs:141:29:141:29 | 5 | semmle.label | successor | | patterns.cs:141:17:141:29 | After ... => ... [no-match] | patterns.cs:142:17:142:41 | ... => ... | semmle.label | successor | | patterns.cs:141:29:141:29 | 5 | patterns.cs:136:17:143:13 | After ... switch { ... } | semmle.label | successor | | patterns.cs:142:17:142:24 | access to type MyStruct | patterns.cs:142:26:142:34 | Before { ... } | semmle.label | successor | -| patterns.cs:142:17:142:36 | After { ... } | patterns.cs:142:41:142:41 | 6 | semmle.label | successor | +| patterns.cs:142:17:142:36 | After { ... } [match] | patterns.cs:142:17:142:41 | After ... => ... [match] | semmle.label | match | +| patterns.cs:142:17:142:36 | After { ... } [no-match] | patterns.cs:142:17:142:41 | After ... => ... [no-match] | semmle.label | no-match | | patterns.cs:142:17:142:36 | Before { ... } | patterns.cs:142:17:142:24 | access to type MyStruct | semmle.label | successor | -| patterns.cs:142:17:142:36 | { ... } | patterns.cs:142:17:142:36 | After { ... } | semmle.label | successor | -| patterns.cs:142:17:142:41 | ... => ... | patterns.cs:142:17:142:41 | After ... => ... [match] | semmle.label | match | -| patterns.cs:142:17:142:41 | ... => ... | patterns.cs:142:17:142:41 | After ... => ... [no-match] | semmle.label | no-match | -| patterns.cs:142:17:142:41 | After ... => ... [match] | patterns.cs:142:17:142:36 | Before { ... } | semmle.label | successor | +| patterns.cs:142:17:142:36 | { ... } | patterns.cs:142:17:142:36 | After { ... } [match] | semmle.label | match | +| patterns.cs:142:17:142:36 | { ... } | patterns.cs:142:17:142:36 | After { ... } [no-match] | semmle.label | no-match | +| patterns.cs:142:17:142:41 | ... => ... | patterns.cs:142:17:142:36 | Before { ... } | semmle.label | successor | +| patterns.cs:142:17:142:41 | After ... => ... [match] | patterns.cs:142:41:142:41 | 6 | semmle.label | successor | | patterns.cs:142:17:142:41 | After ... => ... [no-match] | patterns.cs:136:17:143:13 | After ... switch { ... } | semmle.label | successor | | patterns.cs:142:26:142:34 | After { ... } | patterns.cs:142:17:142:36 | { ... } | semmle.label | successor | | patterns.cs:142:26:142:34 | Before { ... } | patterns.cs:142:31:142:32 | 10 | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.expected b/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.expected index 0f9769342d1f..ee5851bbd8f9 100644 --- a/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.expected +++ b/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.expected @@ -22,11 +22,13 @@ | patterns.cs:36:9:44:9 | After switch (...) {...} | patterns.cs:46:9:63:9 | switch (...) {...} | semmle.label | successor | | patterns.cs:36:9:44:9 | switch (...) {...} | patterns.cs:36:17:36:17 | access to local variable s | semmle.label | successor | | patterns.cs:36:17:36:17 | access to local variable s | patterns.cs:38:13:38:47 | case ...: | semmle.label | successor | -| patterns.cs:38:13:38:47 | After case ...: [match] | patterns.cs:38:18:38:29 | MyStruct ms1 | semmle.label | successor | +| patterns.cs:38:13:38:47 | After case ...: [match] | patterns.cs:38:36:38:46 | Before ... == ... | semmle.label | successor | | patterns.cs:38:13:38:47 | After case ...: [no-match] | patterns.cs:41:13:41:46 | case ...: | semmle.label | successor | -| patterns.cs:38:13:38:47 | case ...: | patterns.cs:38:13:38:47 | After case ...: [match] | semmle.label | match | -| patterns.cs:38:13:38:47 | case ...: | patterns.cs:38:13:38:47 | After case ...: [no-match] | semmle.label | no-match | -| patterns.cs:38:18:38:29 | MyStruct ms1 | patterns.cs:38:36:38:46 | Before ... == ... | semmle.label | successor | +| patterns.cs:38:13:38:47 | case ...: | patterns.cs:38:18:38:29 | MyStruct ms1 | semmle.label | successor | +| patterns.cs:38:18:38:29 | After MyStruct ms1 [match] | patterns.cs:38:13:38:47 | After case ...: [match] | semmle.label | match | +| patterns.cs:38:18:38:29 | After MyStruct ms1 [no-match] | patterns.cs:38:13:38:47 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:38:18:38:29 | MyStruct ms1 | patterns.cs:38:18:38:29 | After MyStruct ms1 [match] | semmle.label | match | +| patterns.cs:38:18:38:29 | MyStruct ms1 | patterns.cs:38:18:38:29 | After MyStruct ms1 [no-match] | semmle.label | no-match | | patterns.cs:38:36:38:38 | access to local variable ms1 | patterns.cs:38:36:38:40 | access to field X | semmle.label | successor | | patterns.cs:38:36:38:40 | After access to field X | patterns.cs:38:45:38:46 | 10 | semmle.label | successor | | patterns.cs:38:36:38:40 | Before access to field X | patterns.cs:38:36:38:38 | access to local variable ms1 | semmle.label | successor | @@ -45,11 +47,13 @@ | patterns.cs:39:35:39:54 | "Hit the breakpoint" | patterns.cs:39:17:39:55 | call to method WriteLine | semmle.label | successor | | patterns.cs:40:17:40:22 | Before break; | patterns.cs:40:17:40:22 | break; | semmle.label | successor | | patterns.cs:40:17:40:22 | break; | patterns.cs:36:9:44:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:41:13:41:46 | After case ...: [match] | patterns.cs:41:18:41:29 | MyStruct ms2 | semmle.label | successor | +| patterns.cs:41:13:41:46 | After case ...: [match] | patterns.cs:41:36:41:45 | Before ... < ... | semmle.label | successor | | patterns.cs:41:13:41:46 | After case ...: [no-match] | patterns.cs:36:9:44:9 | After switch (...) {...} | semmle.label | successor | -| patterns.cs:41:13:41:46 | case ...: | patterns.cs:41:13:41:46 | After case ...: [match] | semmle.label | match | -| patterns.cs:41:13:41:46 | case ...: | patterns.cs:41:13:41:46 | After case ...: [no-match] | semmle.label | no-match | -| patterns.cs:41:18:41:29 | MyStruct ms2 | patterns.cs:41:36:41:45 | Before ... < ... | semmle.label | successor | +| patterns.cs:41:13:41:46 | case ...: | patterns.cs:41:18:41:29 | MyStruct ms2 | semmle.label | successor | +| patterns.cs:41:18:41:29 | After MyStruct ms2 [match] | patterns.cs:41:13:41:46 | After case ...: [match] | semmle.label | match | +| patterns.cs:41:18:41:29 | After MyStruct ms2 [no-match] | patterns.cs:41:13:41:46 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:41:18:41:29 | MyStruct ms2 | patterns.cs:41:18:41:29 | After MyStruct ms2 [match] | semmle.label | match | +| patterns.cs:41:18:41:29 | MyStruct ms2 | patterns.cs:41:18:41:29 | After MyStruct ms2 [no-match] | semmle.label | no-match | | patterns.cs:41:36:41:38 | access to local variable ms2 | patterns.cs:41:36:41:40 | access to field X | semmle.label | successor | | patterns.cs:41:36:41:40 | After access to field X | patterns.cs:41:44:41:45 | 10 | semmle.label | successor | | patterns.cs:41:36:41:40 | Before access to field X | patterns.cs:41:36:41:38 | access to local variable ms2 | semmle.label | successor | @@ -71,14 +75,15 @@ | patterns.cs:46:9:63:9 | After switch (...) {...} | patterns.cs:65:9:73:9 | switch (...) {...} | semmle.label | successor | | patterns.cs:46:9:63:9 | switch (...) {...} | patterns.cs:46:17:46:17 | access to local variable s | semmle.label | successor | | patterns.cs:46:17:46:17 | access to local variable s | patterns.cs:48:13:48:50 | case ...: | semmle.label | successor | -| patterns.cs:48:13:48:50 | After case ...: [match] | patterns.cs:48:18:48:38 | Before { ... } | semmle.label | successor | +| patterns.cs:48:13:48:50 | After case ...: [match] | patterns.cs:48:45:48:49 | Before ... > ... | semmle.label | successor | | patterns.cs:48:13:48:50 | After case ...: [no-match] | patterns.cs:51:13:51:39 | case ...: | semmle.label | successor | -| patterns.cs:48:13:48:50 | case ...: | patterns.cs:48:13:48:50 | After case ...: [match] | semmle.label | match | -| patterns.cs:48:13:48:50 | case ...: | patterns.cs:48:13:48:50 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:48:13:48:50 | case ...: | patterns.cs:48:18:48:38 | Before { ... } | semmle.label | successor | | patterns.cs:48:18:48:25 | access to type MyStruct | patterns.cs:48:27:48:38 | Before { ... } | semmle.label | successor | -| patterns.cs:48:18:48:38 | After { ... } | patterns.cs:48:45:48:49 | Before ... > ... | semmle.label | successor | +| patterns.cs:48:18:48:38 | After { ... } [match] | patterns.cs:48:13:48:50 | After case ...: [match] | semmle.label | match | +| patterns.cs:48:18:48:38 | After { ... } [no-match] | patterns.cs:48:13:48:50 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:48:18:48:38 | Before { ... } | patterns.cs:48:18:48:25 | access to type MyStruct | semmle.label | successor | -| patterns.cs:48:18:48:38 | { ... } | patterns.cs:48:18:48:38 | After { ... } | semmle.label | successor | +| patterns.cs:48:18:48:38 | { ... } | patterns.cs:48:18:48:38 | After { ... } [match] | semmle.label | match | +| patterns.cs:48:18:48:38 | { ... } | patterns.cs:48:18:48:38 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:48:27:48:38 | After { ... } | patterns.cs:48:18:48:38 | { ... } | semmle.label | successor | | patterns.cs:48:27:48:38 | Before { ... } | patterns.cs:48:32:48:36 | Int32 x | semmle.label | successor | | patterns.cs:48:27:48:38 | { ... } | patterns.cs:48:27:48:38 | After { ... } | semmle.label | successor | @@ -98,15 +103,16 @@ | patterns.cs:49:35:49:35 | access to local variable x | patterns.cs:49:17:49:36 | call to method WriteLine | semmle.label | successor | | patterns.cs:50:17:50:22 | Before break; | patterns.cs:50:17:50:22 | break; | semmle.label | successor | | patterns.cs:50:17:50:22 | break; | patterns.cs:46:9:63:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:51:13:51:39 | After case ...: [match] | patterns.cs:51:18:51:38 | Before { ... } | semmle.label | successor | +| patterns.cs:51:13:51:39 | After case ...: [match] | patterns.cs:52:17:52:56 | ...; | semmle.label | successor | | patterns.cs:51:13:51:39 | After case ...: [no-match] | patterns.cs:54:13:54:43 | case ...: | semmle.label | successor | -| patterns.cs:51:13:51:39 | case ...: | patterns.cs:51:13:51:39 | After case ...: [match] | semmle.label | match | -| patterns.cs:51:13:51:39 | case ...: | patterns.cs:51:13:51:39 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:51:13:51:39 | case ...: | patterns.cs:51:18:51:38 | Before { ... } | semmle.label | successor | | patterns.cs:51:18:51:25 | access to type MyStruct | patterns.cs:51:27:51:35 | Before { ... } | semmle.label | successor | -| patterns.cs:51:18:51:38 | After { ... } | patterns.cs:52:17:52:56 | ...; | semmle.label | successor | +| patterns.cs:51:18:51:38 | After { ... } [match] | patterns.cs:51:13:51:39 | After case ...: [match] | semmle.label | match | +| patterns.cs:51:18:51:38 | After { ... } [no-match] | patterns.cs:51:13:51:39 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:51:18:51:38 | Before { ... } | patterns.cs:51:18:51:38 | MyStruct ms | semmle.label | successor | | patterns.cs:51:18:51:38 | MyStruct ms | patterns.cs:51:18:51:25 | access to type MyStruct | semmle.label | successor | -| patterns.cs:51:18:51:38 | { ... } | patterns.cs:51:18:51:38 | After { ... } | semmle.label | successor | +| patterns.cs:51:18:51:38 | { ... } | patterns.cs:51:18:51:38 | After { ... } [match] | semmle.label | match | +| patterns.cs:51:18:51:38 | { ... } | patterns.cs:51:18:51:38 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:51:27:51:35 | After { ... } | patterns.cs:51:18:51:38 | { ... } | semmle.label | successor | | patterns.cs:51:27:51:35 | Before { ... } | patterns.cs:51:32:51:33 | 10 | semmle.label | successor | | patterns.cs:51:27:51:35 | { ... } | patterns.cs:51:27:51:35 | After { ... } | semmle.label | successor | @@ -119,16 +125,17 @@ | patterns.cs:52:35:52:54 | "Hit the breakpoint" | patterns.cs:52:17:52:55 | call to method WriteLine | semmle.label | successor | | patterns.cs:53:17:53:22 | Before break; | patterns.cs:53:17:53:22 | break; | semmle.label | successor | | patterns.cs:53:17:53:22 | break; | patterns.cs:46:9:63:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:54:13:54:43 | After case ...: [match] | patterns.cs:54:18:54:30 | Before { ... } | semmle.label | successor | +| patterns.cs:54:13:54:43 | After case ...: [match] | patterns.cs:54:37:54:42 | Before ... > ... | semmle.label | successor | | patterns.cs:54:13:54:43 | After case ...: [no-match] | patterns.cs:57:13:57:24 | case ...: | semmle.label | successor | -| patterns.cs:54:13:54:43 | case ...: | patterns.cs:54:13:54:43 | After case ...: [match] | semmle.label | match | -| patterns.cs:54:13:54:43 | case ...: | patterns.cs:54:13:54:43 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:54:13:54:43 | case ...: | patterns.cs:54:18:54:30 | Before { ... } | semmle.label | successor | | patterns.cs:54:18:54:30 | After { ... } | patterns.cs:54:18:54:30 | { ... } | semmle.label | successor | -| patterns.cs:54:18:54:30 | After { ... } | patterns.cs:54:37:54:42 | Before ... > ... | semmle.label | successor | +| patterns.cs:54:18:54:30 | After { ... } [match] | patterns.cs:54:13:54:43 | After case ...: [match] | semmle.label | match | +| patterns.cs:54:18:54:30 | After { ... } [no-match] | patterns.cs:54:13:54:43 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:54:18:54:30 | Before { ... } | patterns.cs:54:18:54:30 | Before { ... } | semmle.label | successor | | patterns.cs:54:18:54:30 | Before { ... } | patterns.cs:54:23:54:28 | Int32 x2 | semmle.label | successor | | patterns.cs:54:18:54:30 | { ... } | patterns.cs:54:18:54:30 | After { ... } | semmle.label | successor | -| patterns.cs:54:18:54:30 | { ... } | patterns.cs:54:18:54:30 | After { ... } | semmle.label | successor | +| patterns.cs:54:18:54:30 | { ... } | patterns.cs:54:18:54:30 | After { ... } [match] | semmle.label | match | +| patterns.cs:54:18:54:30 | { ... } | patterns.cs:54:18:54:30 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:54:23:54:28 | Int32 x2 | patterns.cs:54:18:54:30 | { ... } | semmle.label | successor | | patterns.cs:54:37:54:38 | access to local variable x2 | patterns.cs:54:42:54:42 | 2 | semmle.label | successor | | patterns.cs:54:37:54:42 | ... > ... | patterns.cs:54:37:54:42 | After ... > ... [false] | semmle.label | false | @@ -145,26 +152,28 @@ | patterns.cs:55:35:55:36 | access to local variable x2 | patterns.cs:55:17:55:37 | call to method WriteLine | semmle.label | successor | | patterns.cs:56:17:56:22 | Before break; | patterns.cs:56:17:56:22 | break; | semmle.label | successor | | patterns.cs:56:17:56:22 | break; | patterns.cs:46:9:63:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:57:13:57:24 | After case ...: [match] | patterns.cs:57:18:57:23 | Before { ... } | semmle.label | successor | +| patterns.cs:57:13:57:24 | After case ...: [match] | patterns.cs:58:17:58:22 | Before break; | semmle.label | successor | | patterns.cs:57:13:57:24 | After case ...: [no-match] | patterns.cs:59:13:59:28 | case ...: | semmle.label | successor | -| patterns.cs:57:13:57:24 | case ...: | patterns.cs:57:13:57:24 | After case ...: [match] | semmle.label | match | -| patterns.cs:57:13:57:24 | case ...: | patterns.cs:57:13:57:24 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:57:13:57:24 | case ...: | patterns.cs:57:18:57:23 | Before { ... } | semmle.label | successor | | patterns.cs:57:18:57:23 | ( ... ) | patterns.cs:57:18:57:23 | After ( ... ) | semmle.label | successor | | patterns.cs:57:18:57:23 | After ( ... ) | patterns.cs:57:18:57:23 | { ... } | semmle.label | successor | -| patterns.cs:57:18:57:23 | After { ... } | patterns.cs:58:17:58:22 | Before break; | semmle.label | successor | +| patterns.cs:57:18:57:23 | After { ... } [match] | patterns.cs:57:13:57:24 | After case ...: [match] | semmle.label | match | +| patterns.cs:57:18:57:23 | After { ... } [no-match] | patterns.cs:57:13:57:24 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:57:18:57:23 | Before ( ... ) | patterns.cs:57:19:57:19 | 1 | semmle.label | successor | | patterns.cs:57:18:57:23 | Before { ... } | patterns.cs:57:18:57:23 | Before ( ... ) | semmle.label | successor | -| patterns.cs:57:18:57:23 | { ... } | patterns.cs:57:18:57:23 | After { ... } | semmle.label | successor | +| patterns.cs:57:18:57:23 | { ... } | patterns.cs:57:18:57:23 | After { ... } [match] | semmle.label | match | +| patterns.cs:57:18:57:23 | { ... } | patterns.cs:57:18:57:23 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:57:19:57:19 | 1 | patterns.cs:57:22:57:22 | 2 | semmle.label | successor | | patterns.cs:57:22:57:22 | 2 | patterns.cs:57:18:57:23 | ( ... ) | semmle.label | successor | | patterns.cs:58:17:58:22 | Before break; | patterns.cs:58:17:58:22 | break; | semmle.label | successor | | patterns.cs:58:17:58:22 | break; | patterns.cs:46:9:63:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:59:13:59:28 | After case ...: [match] | patterns.cs:59:18:59:27 | Before (..., ...) | semmle.label | successor | +| patterns.cs:59:13:59:28 | After case ...: [match] | patterns.cs:60:17:60:22 | Before break; | semmle.label | successor | | patterns.cs:59:13:59:28 | After case ...: [no-match] | patterns.cs:61:13:61:20 | default: | semmle.label | successor | -| patterns.cs:59:13:59:28 | case ...: | patterns.cs:59:13:59:28 | After case ...: [match] | semmle.label | match | -| patterns.cs:59:13:59:28 | case ...: | patterns.cs:59:13:59:28 | After case ...: [no-match] | semmle.label | no-match | -| patterns.cs:59:18:59:27 | (..., ...) | patterns.cs:59:18:59:27 | After (..., ...) | semmle.label | successor | -| patterns.cs:59:18:59:27 | After (..., ...) | patterns.cs:60:17:60:22 | Before break; | semmle.label | successor | +| patterns.cs:59:13:59:28 | case ...: | patterns.cs:59:18:59:27 | Before (..., ...) | semmle.label | successor | +| patterns.cs:59:18:59:27 | (..., ...) | patterns.cs:59:18:59:27 | After (..., ...) [match] | semmle.label | match | +| patterns.cs:59:18:59:27 | (..., ...) | patterns.cs:59:18:59:27 | After (..., ...) [no-match] | semmle.label | no-match | +| patterns.cs:59:18:59:27 | After (..., ...) [match] | patterns.cs:59:13:59:28 | After case ...: [match] | semmle.label | match | +| patterns.cs:59:18:59:27 | After (..., ...) [no-match] | patterns.cs:59:13:59:28 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:59:18:59:27 | Before (..., ...) | patterns.cs:59:23:59:23 | Int32 x | semmle.label | successor | | patterns.cs:59:23:59:23 | Int32 x | patterns.cs:59:26:59:26 | Int32 y | semmle.label | successor | | patterns.cs:59:26:59:26 | Int32 y | patterns.cs:59:18:59:27 | (..., ...) | semmle.label | successor | @@ -177,14 +186,15 @@ | patterns.cs:65:9:73:9 | After switch (...) {...} | patterns.cs:76:9:84:9 | switch (...) {...} | semmle.label | successor | | patterns.cs:65:9:73:9 | switch (...) {...} | patterns.cs:65:17:65:17 | access to local variable s | semmle.label | successor | | patterns.cs:65:17:65:17 | access to local variable s | patterns.cs:67:13:67:50 | case ...: | semmle.label | successor | -| patterns.cs:67:13:67:50 | After case ...: [match] | patterns.cs:67:18:67:38 | Before { ... } | semmle.label | successor | +| patterns.cs:67:13:67:50 | After case ...: [match] | patterns.cs:67:45:67:49 | Before ... > ... | semmle.label | successor | | patterns.cs:67:13:67:50 | After case ...: [no-match] | patterns.cs:70:13:70:51 | case ...: | semmle.label | successor | -| patterns.cs:67:13:67:50 | case ...: | patterns.cs:67:13:67:50 | After case ...: [match] | semmle.label | match | -| patterns.cs:67:13:67:50 | case ...: | patterns.cs:67:13:67:50 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:67:13:67:50 | case ...: | patterns.cs:67:18:67:38 | Before { ... } | semmle.label | successor | | patterns.cs:67:18:67:25 | access to type MyStruct | patterns.cs:67:27:67:38 | Before { ... } | semmle.label | successor | -| patterns.cs:67:18:67:38 | After { ... } | patterns.cs:67:45:67:49 | Before ... > ... | semmle.label | successor | +| patterns.cs:67:18:67:38 | After { ... } [match] | patterns.cs:67:13:67:50 | After case ...: [match] | semmle.label | match | +| patterns.cs:67:18:67:38 | After { ... } [no-match] | patterns.cs:67:13:67:50 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:67:18:67:38 | Before { ... } | patterns.cs:67:18:67:25 | access to type MyStruct | semmle.label | successor | -| patterns.cs:67:18:67:38 | { ... } | patterns.cs:67:18:67:38 | After { ... } | semmle.label | successor | +| patterns.cs:67:18:67:38 | { ... } | patterns.cs:67:18:67:38 | After { ... } [match] | semmle.label | match | +| patterns.cs:67:18:67:38 | { ... } | patterns.cs:67:18:67:38 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:67:27:67:38 | After { ... } | patterns.cs:67:18:67:38 | { ... } | semmle.label | successor | | patterns.cs:67:27:67:38 | Before { ... } | patterns.cs:67:32:67:36 | Int32 x | semmle.label | successor | | patterns.cs:67:27:67:38 | { ... } | patterns.cs:67:27:67:38 | After { ... } | semmle.label | successor | @@ -204,15 +214,16 @@ | patterns.cs:68:35:68:35 | access to local variable x | patterns.cs:68:17:68:36 | call to method WriteLine | semmle.label | successor | | patterns.cs:69:17:69:22 | Before break; | patterns.cs:69:17:69:22 | break; | semmle.label | successor | | patterns.cs:69:17:69:22 | break; | patterns.cs:65:9:73:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:70:13:70:51 | After case ...: [match] | patterns.cs:70:18:70:38 | Before { ... } | semmle.label | successor | +| patterns.cs:70:13:70:51 | After case ...: [match] | patterns.cs:70:45:70:50 | Before ... == ... | semmle.label | successor | | patterns.cs:70:13:70:51 | After case ...: [no-match] | patterns.cs:65:9:73:9 | After switch (...) {...} | semmle.label | successor | -| patterns.cs:70:13:70:51 | case ...: | patterns.cs:70:13:70:51 | After case ...: [match] | semmle.label | match | -| patterns.cs:70:13:70:51 | case ...: | patterns.cs:70:13:70:51 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:70:13:70:51 | case ...: | patterns.cs:70:18:70:38 | Before { ... } | semmle.label | successor | | patterns.cs:70:18:70:25 | access to type MyStruct | patterns.cs:70:27:70:35 | Before { ... } | semmle.label | successor | -| patterns.cs:70:18:70:38 | After { ... } | patterns.cs:70:45:70:50 | Before ... == ... | semmle.label | successor | +| patterns.cs:70:18:70:38 | After { ... } [match] | patterns.cs:70:13:70:51 | After case ...: [match] | semmle.label | match | +| patterns.cs:70:18:70:38 | After { ... } [no-match] | patterns.cs:70:13:70:51 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:70:18:70:38 | Before { ... } | patterns.cs:70:18:70:38 | MyStruct ms | semmle.label | successor | | patterns.cs:70:18:70:38 | MyStruct ms | patterns.cs:70:18:70:25 | access to type MyStruct | semmle.label | successor | -| patterns.cs:70:18:70:38 | { ... } | patterns.cs:70:18:70:38 | After { ... } | semmle.label | successor | +| patterns.cs:70:18:70:38 | { ... } | patterns.cs:70:18:70:38 | After { ... } [match] | semmle.label | match | +| patterns.cs:70:18:70:38 | { ... } | patterns.cs:70:18:70:38 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:70:27:70:35 | After { ... } | patterns.cs:70:18:70:38 | { ... } | semmle.label | successor | | patterns.cs:70:27:70:35 | Before { ... } | patterns.cs:70:32:70:33 | 10 | semmle.label | successor | | patterns.cs:70:27:70:35 | { ... } | patterns.cs:70:27:70:35 | After { ... } | semmle.label | successor | @@ -240,16 +251,17 @@ | patterns.cs:76:17:76:28 | After object creation of type Object | patterns.cs:78:13:78:43 | case ...: | semmle.label | successor | | patterns.cs:76:17:76:28 | Before object creation of type Object | patterns.cs:76:17:76:28 | object creation of type Object | semmle.label | successor | | patterns.cs:76:17:76:28 | object creation of type Object | patterns.cs:76:17:76:28 | After object creation of type Object | semmle.label | successor | -| patterns.cs:78:13:78:43 | After case ...: [match] | patterns.cs:78:18:78:33 | Before { ... } | semmle.label | successor | +| patterns.cs:78:13:78:43 | After case ...: [match] | patterns.cs:78:40:78:42 | Before ... < ... | semmle.label | successor | | patterns.cs:78:13:78:43 | After case ...: [no-match] | patterns.cs:80:13:80:20 | case ...: | semmle.label | successor | -| patterns.cs:78:13:78:43 | case ...: | patterns.cs:78:13:78:43 | After case ...: [match] | semmle.label | match | -| patterns.cs:78:13:78:43 | case ...: | patterns.cs:78:13:78:43 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:78:13:78:43 | case ...: | patterns.cs:78:18:78:33 | Before { ... } | semmle.label | successor | | patterns.cs:78:18:78:33 | ( ... ) | patterns.cs:78:18:78:33 | After ( ... ) | semmle.label | successor | | patterns.cs:78:18:78:33 | After ( ... ) | patterns.cs:78:18:78:33 | { ... } | semmle.label | successor | -| patterns.cs:78:18:78:33 | After { ... } | patterns.cs:78:40:78:42 | Before ... < ... | semmle.label | successor | +| patterns.cs:78:18:78:33 | After { ... } [match] | patterns.cs:78:13:78:43 | After case ...: [match] | semmle.label | match | +| patterns.cs:78:18:78:33 | After { ... } [no-match] | patterns.cs:78:13:78:43 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:78:18:78:33 | Before ( ... ) | patterns.cs:78:19:78:23 | Int32 x | semmle.label | successor | | patterns.cs:78:18:78:33 | Before { ... } | patterns.cs:78:18:78:33 | Before ( ... ) | semmle.label | successor | -| patterns.cs:78:18:78:33 | { ... } | patterns.cs:78:18:78:33 | After { ... } | semmle.label | successor | +| patterns.cs:78:18:78:33 | { ... } | patterns.cs:78:18:78:33 | After { ... } [match] | semmle.label | match | +| patterns.cs:78:18:78:33 | { ... } | patterns.cs:78:18:78:33 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:78:19:78:23 | Int32 x | patterns.cs:78:26:78:32 | Single y | semmle.label | successor | | patterns.cs:78:26:78:32 | Single y | patterns.cs:78:18:78:33 | ( ... ) | semmle.label | successor | | patterns.cs:78:40:78:40 | (...) ... | patterns.cs:78:40:78:40 | After (...) ... | semmle.label | successor | @@ -264,23 +276,25 @@ | patterns.cs:78:42:78:42 | access to local variable y | patterns.cs:78:40:78:42 | ... < ... | semmle.label | successor | | patterns.cs:79:17:79:22 | Before break; | patterns.cs:79:17:79:22 | break; | semmle.label | successor | | patterns.cs:79:17:79:22 | break; | patterns.cs:76:9:84:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:80:13:80:20 | After case ...: [match] | patterns.cs:80:18:80:19 | Before { ... } | semmle.label | successor | +| patterns.cs:80:13:80:20 | After case ...: [match] | patterns.cs:81:17:81:22 | Before break; | semmle.label | successor | | patterns.cs:80:13:80:20 | After case ...: [no-match] | patterns.cs:82:13:82:20 | case ...: | semmle.label | successor | -| patterns.cs:80:13:80:20 | case ...: | patterns.cs:80:13:80:20 | After case ...: [match] | semmle.label | match | -| patterns.cs:80:13:80:20 | case ...: | patterns.cs:80:13:80:20 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:80:13:80:20 | case ...: | patterns.cs:80:18:80:19 | Before { ... } | semmle.label | successor | | patterns.cs:80:18:80:19 | ( ... ) | patterns.cs:80:18:80:19 | { ... } | semmle.label | successor | -| patterns.cs:80:18:80:19 | After { ... } | patterns.cs:81:17:81:22 | Before break; | semmle.label | successor | +| patterns.cs:80:18:80:19 | After { ... } [match] | patterns.cs:80:13:80:20 | After case ...: [match] | semmle.label | match | +| patterns.cs:80:18:80:19 | After { ... } [no-match] | patterns.cs:80:13:80:20 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:80:18:80:19 | Before { ... } | patterns.cs:80:18:80:19 | ( ... ) | semmle.label | successor | -| patterns.cs:80:18:80:19 | { ... } | patterns.cs:80:18:80:19 | After { ... } | semmle.label | successor | +| patterns.cs:80:18:80:19 | { ... } | patterns.cs:80:18:80:19 | After { ... } [match] | semmle.label | match | +| patterns.cs:80:18:80:19 | { ... } | patterns.cs:80:18:80:19 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:81:17:81:22 | Before break; | patterns.cs:81:17:81:22 | break; | semmle.label | successor | | patterns.cs:81:17:81:22 | break; | patterns.cs:76:9:84:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:82:13:82:20 | After case ...: [match] | patterns.cs:82:18:82:19 | Before { ... } | semmle.label | successor | +| patterns.cs:82:13:82:20 | After case ...: [match] | patterns.cs:83:17:83:22 | Before break; | semmle.label | successor | | patterns.cs:82:13:82:20 | After case ...: [no-match] | patterns.cs:76:9:84:9 | After switch (...) {...} | semmle.label | successor | -| patterns.cs:82:13:82:20 | case ...: | patterns.cs:82:13:82:20 | After case ...: [match] | semmle.label | match | -| patterns.cs:82:13:82:20 | case ...: | patterns.cs:82:13:82:20 | After case ...: [no-match] | semmle.label | no-match | -| patterns.cs:82:18:82:19 | After { ... } | patterns.cs:83:17:83:22 | Before break; | semmle.label | successor | +| patterns.cs:82:13:82:20 | case ...: | patterns.cs:82:18:82:19 | Before { ... } | semmle.label | successor | +| patterns.cs:82:18:82:19 | After { ... } [match] | patterns.cs:82:13:82:20 | After case ...: [match] | semmle.label | match | +| patterns.cs:82:18:82:19 | After { ... } [no-match] | patterns.cs:82:13:82:20 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:82:18:82:19 | Before { ... } | patterns.cs:82:18:82:19 | { ... } | semmle.label | successor | -| patterns.cs:82:18:82:19 | { ... } | patterns.cs:82:18:82:19 | After { ... } | semmle.label | successor | +| patterns.cs:82:18:82:19 | { ... } | patterns.cs:82:18:82:19 | After { ... } [match] | semmle.label | match | +| patterns.cs:82:18:82:19 | { ... } | patterns.cs:82:18:82:19 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:82:18:82:19 | { ... } | patterns.cs:82:18:82:19 | { ... } | semmle.label | successor | | patterns.cs:83:17:83:22 | Before break; | patterns.cs:83:17:83:22 | break; | semmle.label | successor | | patterns.cs:83:17:83:22 | break; | patterns.cs:76:9:84:9 | After switch (...) {...} | semmle.label | break | @@ -291,16 +305,17 @@ | patterns.cs:86:15:86:19 | Before (..., ...) | patterns.cs:86:16:86:16 | 1 | semmle.label | successor | | patterns.cs:86:16:86:16 | 1 | patterns.cs:86:18:86:18 | 2 | semmle.label | successor | | patterns.cs:86:18:86:18 | 2 | patterns.cs:86:15:86:19 | (..., ...) | semmle.label | successor | -| patterns.cs:88:13:88:24 | After case ...: [match] | patterns.cs:88:18:88:23 | Before { ... } | semmle.label | successor | +| patterns.cs:88:13:88:24 | After case ...: [match] | patterns.cs:88:26:88:31 | Before break; | semmle.label | successor | | patterns.cs:88:13:88:24 | After case ...: [no-match] | patterns.cs:86:9:89:9 | After switch (...) {...} | semmle.label | successor | -| patterns.cs:88:13:88:24 | case ...: | patterns.cs:88:13:88:24 | After case ...: [match] | semmle.label | match | -| patterns.cs:88:13:88:24 | case ...: | patterns.cs:88:13:88:24 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:88:13:88:24 | case ...: | patterns.cs:88:18:88:23 | Before { ... } | semmle.label | successor | | patterns.cs:88:18:88:23 | ( ... ) | patterns.cs:88:18:88:23 | After ( ... ) | semmle.label | successor | | patterns.cs:88:18:88:23 | After ( ... ) | patterns.cs:88:18:88:23 | { ... } | semmle.label | successor | -| patterns.cs:88:18:88:23 | After { ... } | patterns.cs:88:26:88:31 | Before break; | semmle.label | successor | +| patterns.cs:88:18:88:23 | After { ... } [match] | patterns.cs:88:13:88:24 | After case ...: [match] | semmle.label | match | +| patterns.cs:88:18:88:23 | After { ... } [no-match] | patterns.cs:88:13:88:24 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:88:18:88:23 | Before ( ... ) | patterns.cs:88:19:88:19 | 1 | semmle.label | successor | | patterns.cs:88:18:88:23 | Before { ... } | patterns.cs:88:18:88:23 | Before ( ... ) | semmle.label | successor | -| patterns.cs:88:18:88:23 | { ... } | patterns.cs:88:18:88:23 | After { ... } | semmle.label | successor | +| patterns.cs:88:18:88:23 | { ... } | patterns.cs:88:18:88:23 | After { ... } [match] | semmle.label | match | +| patterns.cs:88:18:88:23 | { ... } | patterns.cs:88:18:88:23 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:88:19:88:19 | 1 | patterns.cs:88:22:88:22 | 2 | semmle.label | successor | | patterns.cs:88:22:88:22 | 2 | patterns.cs:88:18:88:23 | ( ... ) | semmle.label | successor | | patterns.cs:88:26:88:31 | Before break; | patterns.cs:88:26:88:31 | break; | semmle.label | successor | @@ -312,30 +327,32 @@ | patterns.cs:91:16:91:20 | Before (..., ...) | patterns.cs:91:17:91:17 | 1 | semmle.label | successor | | patterns.cs:91:17:91:17 | 1 | patterns.cs:91:19:91:19 | 2 | semmle.label | successor | | patterns.cs:91:19:91:19 | 2 | patterns.cs:91:16:91:20 | (..., ...) | semmle.label | successor | -| patterns.cs:93:13:93:28 | After case ...: [match] | patterns.cs:93:18:93:27 | Before { ... } | semmle.label | successor | +| patterns.cs:93:13:93:28 | After case ...: [match] | patterns.cs:93:30:93:35 | Before break; | semmle.label | successor | | patterns.cs:93:13:93:28 | After case ...: [no-match] | patterns.cs:94:13:94:24 | case ...: | semmle.label | successor | -| patterns.cs:93:13:93:28 | case ...: | patterns.cs:93:13:93:28 | After case ...: [match] | semmle.label | match | -| patterns.cs:93:13:93:28 | case ...: | patterns.cs:93:13:93:28 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:93:13:93:28 | case ...: | patterns.cs:93:18:93:27 | Before { ... } | semmle.label | successor | | patterns.cs:93:18:93:27 | ( ... ) | patterns.cs:93:18:93:27 | After ( ... ) | semmle.label | successor | | patterns.cs:93:18:93:27 | After ( ... ) | patterns.cs:93:18:93:27 | { ... } | semmle.label | successor | -| patterns.cs:93:18:93:27 | After { ... } | patterns.cs:93:30:93:35 | Before break; | semmle.label | successor | +| patterns.cs:93:18:93:27 | After { ... } [match] | patterns.cs:93:13:93:28 | After case ...: [match] | semmle.label | match | +| patterns.cs:93:18:93:27 | After { ... } [no-match] | patterns.cs:93:13:93:28 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:93:18:93:27 | Before ( ... ) | patterns.cs:93:19:93:19 | 1 | semmle.label | successor | | patterns.cs:93:18:93:27 | Before { ... } | patterns.cs:93:18:93:27 | Before ( ... ) | semmle.label | successor | -| patterns.cs:93:18:93:27 | { ... } | patterns.cs:93:18:93:27 | After { ... } | semmle.label | successor | +| patterns.cs:93:18:93:27 | { ... } | patterns.cs:93:18:93:27 | After { ... } [match] | semmle.label | match | +| patterns.cs:93:18:93:27 | { ... } | patterns.cs:93:18:93:27 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:93:19:93:19 | 1 | patterns.cs:93:22:93:26 | Int32 x | semmle.label | successor | | patterns.cs:93:22:93:26 | Int32 x | patterns.cs:93:18:93:27 | ( ... ) | semmle.label | successor | | patterns.cs:93:30:93:35 | Before break; | patterns.cs:93:30:93:35 | break; | semmle.label | successor | | patterns.cs:93:30:93:35 | break; | patterns.cs:91:9:95:9 | After switch (...) {...} | semmle.label | break | -| patterns.cs:94:13:94:24 | After case ...: [match] | patterns.cs:94:18:94:23 | Before { ... } | semmle.label | successor | +| patterns.cs:94:13:94:24 | After case ...: [match] | patterns.cs:94:26:94:31 | Before break; | semmle.label | successor | | patterns.cs:94:13:94:24 | After case ...: [no-match] | patterns.cs:91:9:95:9 | After switch (...) {...} | semmle.label | successor | -| patterns.cs:94:13:94:24 | case ...: | patterns.cs:94:13:94:24 | After case ...: [match] | semmle.label | match | -| patterns.cs:94:13:94:24 | case ...: | patterns.cs:94:13:94:24 | After case ...: [no-match] | semmle.label | no-match | +| patterns.cs:94:13:94:24 | case ...: | patterns.cs:94:18:94:23 | Before { ... } | semmle.label | successor | | patterns.cs:94:18:94:23 | ( ... ) | patterns.cs:94:18:94:23 | After ( ... ) | semmle.label | successor | | patterns.cs:94:18:94:23 | After ( ... ) | patterns.cs:94:18:94:23 | { ... } | semmle.label | successor | -| patterns.cs:94:18:94:23 | After { ... } | patterns.cs:94:26:94:31 | Before break; | semmle.label | successor | +| patterns.cs:94:18:94:23 | After { ... } [match] | patterns.cs:94:13:94:24 | After case ...: [match] | semmle.label | match | +| patterns.cs:94:18:94:23 | After { ... } [no-match] | patterns.cs:94:13:94:24 | After case ...: [no-match] | semmle.label | no-match | | patterns.cs:94:18:94:23 | Before ( ... ) | patterns.cs:94:19:94:19 | 2 | semmle.label | successor | | patterns.cs:94:18:94:23 | Before { ... } | patterns.cs:94:18:94:23 | Before ( ... ) | semmle.label | successor | -| patterns.cs:94:18:94:23 | { ... } | patterns.cs:94:18:94:23 | After { ... } | semmle.label | successor | +| patterns.cs:94:18:94:23 | { ... } | patterns.cs:94:18:94:23 | After { ... } [match] | semmle.label | match | +| patterns.cs:94:18:94:23 | { ... } | patterns.cs:94:18:94:23 | After { ... } [no-match] | semmle.label | no-match | | patterns.cs:94:19:94:19 | 2 | patterns.cs:94:22:94:22 | _ | semmle.label | successor | | patterns.cs:94:22:94:22 | _ | patterns.cs:94:18:94:23 | ( ... ) | semmle.label | successor | | patterns.cs:94:26:94:31 | Before break; | patterns.cs:94:26:94:31 | break; | semmle.label | successor | 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/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/goto/Goto1.expected b/csharp/ql/test/library-tests/goto/Goto1.expected index e649e3a07dec..354941651647 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.expected +++ b/csharp/ql/test/library-tests/goto/Goto1.expected @@ -27,45 +27,55 @@ | goto.cs:10:9:18:9 | After switch (...) {...} | goto.cs:19:9:19:10 | s9: | semmle.label | successor | | goto.cs:10:9:18:9 | switch (...) {...} | goto.cs:10:17:10:17 | access to local variable s | semmle.label | successor | | goto.cs:10:17:10:17 | access to local variable s | goto.cs:12:13:12:22 | case ...: | semmle.label | successor | -| goto.cs:12:13:12:22 | After case ...: [match] | goto.cs:12:18:12:21 | null | semmle.label | successor | +| goto.cs:12:13:12:22 | After case ...: [match] | goto.cs:12:24:12:25 | s3: | semmle.label | successor | | goto.cs:12:13:12:22 | After case ...: [no-match] | goto.cs:13:13:13:21 | case ...: | semmle.label | successor | -| goto.cs:12:13:12:22 | case ...: | goto.cs:12:13:12:22 | After case ...: [match] | semmle.label | match | -| goto.cs:12:13:12:22 | case ...: | goto.cs:12:13:12:22 | After case ...: [no-match] | semmle.label | no-match | -| goto.cs:12:18:12:21 | null | goto.cs:12:24:12:25 | s3: | semmle.label | successor | +| goto.cs:12:13:12:22 | case ...: | goto.cs:12:18:12:21 | null | semmle.label | successor | +| goto.cs:12:18:12:21 | After null [match] | goto.cs:12:13:12:22 | After case ...: [match] | semmle.label | match | +| goto.cs:12:18:12:21 | After null [no-match] | goto.cs:12:13:12:22 | After case ...: [no-match] | semmle.label | no-match | +| goto.cs:12:18:12:21 | null | goto.cs:12:18:12:21 | After null [match] | semmle.label | match | +| goto.cs:12:18:12:21 | null | goto.cs:12:18:12:21 | After null [no-match] | semmle.label | no-match | | goto.cs:12:24:12:25 | s3: | goto.cs:12:28:12:41 | Before goto case ...; | semmle.label | successor | | goto.cs:12:28:12:41 | Before goto case ...; | goto.cs:12:38:12:40 | "1" | semmle.label | successor | | goto.cs:12:28:12:41 | goto case ...; | goto.cs:13:13:13:21 | After case ...: [match] | semmle.label | goto | | goto.cs:12:38:12:40 | "1" | goto.cs:12:28:12:41 | goto case ...; | semmle.label | successor | -| goto.cs:13:13:13:21 | After case ...: [match] | goto.cs:13:18:13:20 | "1" | semmle.label | successor | +| goto.cs:13:13:13:21 | After case ...: [match] | goto.cs:13:23:13:24 | s4: | semmle.label | successor | | goto.cs:13:13:13:21 | After case ...: [no-match] | goto.cs:14:13:14:21 | case ...: | semmle.label | successor | -| goto.cs:13:13:13:21 | case ...: | goto.cs:13:13:13:21 | After case ...: [match] | semmle.label | match | -| goto.cs:13:13:13:21 | case ...: | goto.cs:13:13:13:21 | After case ...: [no-match] | semmle.label | no-match | -| goto.cs:13:18:13:20 | "1" | goto.cs:13:23:13:24 | s4: | semmle.label | successor | +| goto.cs:13:13:13:21 | case ...: | goto.cs:13:18:13:20 | "1" | semmle.label | successor | +| goto.cs:13:18:13:20 | "1" | goto.cs:13:18:13:20 | After "1" [match] | semmle.label | match | +| goto.cs:13:18:13:20 | "1" | goto.cs:13:18:13:20 | After "1" [no-match] | semmle.label | no-match | +| goto.cs:13:18:13:20 | After "1" [match] | goto.cs:13:13:13:21 | After case ...: [match] | semmle.label | match | +| goto.cs:13:18:13:20 | After "1" [no-match] | goto.cs:13:13:13:21 | After case ...: [no-match] | semmle.label | no-match | | goto.cs:13:23:13:24 | s4: | goto.cs:13:27:13:40 | Before goto case ...; | semmle.label | successor | | goto.cs:13:27:13:40 | Before goto case ...; | goto.cs:13:37:13:39 | "2" | semmle.label | successor | | goto.cs:13:27:13:40 | goto case ...; | goto.cs:14:13:14:21 | After case ...: [match] | semmle.label | goto | | goto.cs:13:37:13:39 | "2" | goto.cs:13:27:13:40 | goto case ...; | semmle.label | successor | -| goto.cs:14:13:14:21 | After case ...: [match] | goto.cs:14:18:14:20 | "2" | semmle.label | successor | +| goto.cs:14:13:14:21 | After case ...: [match] | goto.cs:14:23:14:24 | s5: | semmle.label | successor | | goto.cs:14:13:14:21 | After case ...: [no-match] | goto.cs:15:13:15:21 | case ...: | semmle.label | successor | -| goto.cs:14:13:14:21 | case ...: | goto.cs:14:13:14:21 | After case ...: [match] | semmle.label | match | -| goto.cs:14:13:14:21 | case ...: | goto.cs:14:13:14:21 | After case ...: [no-match] | semmle.label | no-match | -| goto.cs:14:18:14:20 | "2" | goto.cs:14:23:14:24 | s5: | semmle.label | successor | +| goto.cs:14:13:14:21 | case ...: | goto.cs:14:18:14:20 | "2" | semmle.label | successor | +| goto.cs:14:18:14:20 | "2" | goto.cs:14:18:14:20 | After "2" [match] | semmle.label | match | +| goto.cs:14:18:14:20 | "2" | goto.cs:14:18:14:20 | After "2" [no-match] | semmle.label | no-match | +| goto.cs:14:18:14:20 | After "2" [match] | goto.cs:14:13:14:21 | After case ...: [match] | semmle.label | match | +| goto.cs:14:18:14:20 | After "2" [no-match] | goto.cs:14:13:14:21 | After case ...: [no-match] | semmle.label | no-match | | goto.cs:14:23:14:24 | s5: | goto.cs:14:27:14:34 | Before goto ...; | semmle.label | successor | | goto.cs:14:27:14:34 | Before goto ...; | goto.cs:14:27:14:34 | goto ...; | semmle.label | successor | | goto.cs:14:27:14:34 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto | -| goto.cs:15:13:15:21 | After case ...: [match] | goto.cs:15:18:15:20 | "3" | semmle.label | successor | +| goto.cs:15:13:15:21 | After case ...: [match] | goto.cs:15:23:15:24 | s6: | semmle.label | successor | | goto.cs:15:13:15:21 | After case ...: [no-match] | goto.cs:16:13:16:21 | case ...: | semmle.label | successor | -| goto.cs:15:13:15:21 | case ...: | goto.cs:15:13:15:21 | After case ...: [match] | semmle.label | match | -| goto.cs:15:13:15:21 | case ...: | goto.cs:15:13:15:21 | After case ...: [no-match] | semmle.label | no-match | -| goto.cs:15:18:15:20 | "3" | goto.cs:15:23:15:24 | s6: | semmle.label | successor | +| goto.cs:15:13:15:21 | case ...: | goto.cs:15:18:15:20 | "3" | semmle.label | successor | +| goto.cs:15:18:15:20 | "3" | goto.cs:15:18:15:20 | After "3" [match] | semmle.label | match | +| goto.cs:15:18:15:20 | "3" | goto.cs:15:18:15:20 | After "3" [no-match] | semmle.label | no-match | +| goto.cs:15:18:15:20 | After "3" [match] | goto.cs:15:13:15:21 | After case ...: [match] | semmle.label | match | +| goto.cs:15:18:15:20 | After "3" [no-match] | goto.cs:15:13:15:21 | After case ...: [no-match] | semmle.label | no-match | | goto.cs:15:23:15:24 | s6: | goto.cs:15:27:15:39 | Before goto default; | semmle.label | successor | | goto.cs:15:27:15:39 | Before goto default; | goto.cs:15:27:15:39 | goto default; | semmle.label | successor | | goto.cs:15:27:15:39 | goto default; | goto.cs:17:13:17:20 | After default: [match] | semmle.label | goto | -| goto.cs:16:13:16:21 | After case ...: [match] | goto.cs:16:18:16:20 | "4" | semmle.label | successor | +| goto.cs:16:13:16:21 | After case ...: [match] | goto.cs:16:23:16:24 | s7: | semmle.label | successor | | goto.cs:16:13:16:21 | After case ...: [no-match] | goto.cs:17:13:17:20 | default: | semmle.label | successor | -| goto.cs:16:13:16:21 | case ...: | goto.cs:16:13:16:21 | After case ...: [match] | semmle.label | match | -| goto.cs:16:13:16:21 | case ...: | goto.cs:16:13:16:21 | After case ...: [no-match] | semmle.label | no-match | -| goto.cs:16:18:16:20 | "4" | goto.cs:16:23:16:24 | s7: | semmle.label | successor | +| goto.cs:16:13:16:21 | case ...: | goto.cs:16:18:16:20 | "4" | semmle.label | successor | +| goto.cs:16:18:16:20 | "4" | goto.cs:16:18:16:20 | After "4" [match] | semmle.label | match | +| goto.cs:16:18:16:20 | "4" | goto.cs:16:18:16:20 | After "4" [no-match] | semmle.label | no-match | +| goto.cs:16:18:16:20 | After "4" [match] | goto.cs:16:13:16:21 | After case ...: [match] | semmle.label | match | +| goto.cs:16:18:16:20 | After "4" [no-match] | goto.cs:16:13:16:21 | After case ...: [no-match] | semmle.label | no-match | | goto.cs:16:23:16:24 | s7: | goto.cs:16:27:16:32 | Before break; | semmle.label | successor | | goto.cs:16:27:16:32 | Before break; | goto.cs:16:27:16:32 | break; | semmle.label | successor | | goto.cs:16:27:16:32 | break; | goto.cs:10:9:18:9 | After switch (...) {...} | semmle.label | break | 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/docs/codeql/codeql-language-guides/codeql-for-rust.rst b/docs/codeql/codeql-language-guides/codeql-for-rust.rst index 1c08acbf2fbe..f6b1691a771a 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-rust.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-rust.rst @@ -12,9 +12,12 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat basic-query-for-rust-code codeql-library-for-rust analyzing-data-flow-in-rust + customizing-library-models-for-rust - :doc:`Basic query for Rust code `: Learn to write and run a simple CodeQL query. - :doc:`CodeQL library for Rust `: When analyzing Rust code, you can make use of the large collection of classes in the CodeQL library for Rust. - :doc:`Analyzing data flow in Rust `: You can use CodeQL to track the flow of data through a Rust program to places where the data is used. + +- :doc:`Customizing library models for Rust `: You can model frameworks and libraries that your codebase depends on using data extensions and publish them as CodeQL model packs. diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst new file mode 100644 index 000000000000..7057812b31f5 --- /dev/null +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst @@ -0,0 +1,567 @@ +.. _customizing-library-models-for-rust: + +Customizing library models for Rust +==================================== + +You can model the functions and methods that control data flow in any framework or library. This is especially useful for custom frameworks or niche libraries that are not supported by the standard CodeQL libraries. + +.. include:: ../reusables/beta-note-customizing-library-models.rst + +About this article +------------------ + +This article contains reference material about how to define custom models for sources, sinks, and flow summaries for Rust dependencies in data extension files. + +About data extensions +--------------------- + +You can customize analysis by defining models (summaries, sinks, and sources) of your code's Rust dependencies in data extension files. Each model defines the behavior of one or more elements of your library or framework, such as functions and methods. When you run dataflow analysis, these models expand the potential sources and sinks tracked by dataflow analysis and improve the precision of results. + +Most of the security queries search for paths from a source of untrusted input to a sink that represents a vulnerability. This is known as taint tracking. Each source is a starting point for dataflow analysis to track tainted data and each sink is an end point. + +Taint tracking queries also need to know how data can flow through elements that are not included in the source code. These are modeled as summaries. A summary model enables queries to synthesize the flow behavior through elements in dependency code that is not stored in your repository. + +Syntax used to define an element in an extension file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each model of an element is defined using a data extension where each tuple constitutes a model. +A data extension file to extend the standard Rust queries included with CodeQL is a YAML file with the form: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: + data: + - + - + - ... + +Each YAML file may contain one or more top-level extensions. + +- ``addsTo`` defines the CodeQL pack name and extensible predicate that the extension is injected into. +- ``data`` defines one or more rows of tuples that are injected as values into the extensible predicate. The number of columns and their types must match the definition of the extensible predicate. + +Data extensions use union semantics, which means that the tuples of all extensions for a single extensible predicate are combined, duplicates are removed, and all of the remaining tuples are queryable by referencing the extensible predicate. + +Publish data extension files in a CodeQL model pack to share +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can group one or more data extension files into a CodeQL model pack and publish it to the GitHub Container Registry. This makes it easy for anyone to download the model pack and use it to extend their analysis. For more information, see `Creating a CodeQL model pack `__ and `Publishing and using CodeQL packs `__ in the CodeQL CLI documentation. + +Extensible predicates used to create custom models in Rust +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The CodeQL library for Rust analysis exposes the following extensible predicates: + +- ``sourceModel(path, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." +- ``sinkModel(path, input, kind, provenance)``. This is used to model sinks where tainted data may be used in a way that makes the code vulnerable. +- ``summaryModel(path, input, output, kind, provenance)``. This is used to model flow through elements. +- ``neutralModel(path, kind, provenance)``. This is similar to a summary model but used to indicate that a callable has no flow for a given category. Manual neutral models (those with a provenance such as ``manual``) can be used to override generated summary, source, or sink models (those with a provenance such as ``df-generated``), so that the generated model will be ignored. +- ``barrierModel(path, output, kind, provenance)``. This is used to model barriers, which are elements that stop the flow of taint. +- ``barrierGuardModel(path, input, acceptingValue, kind, provenance)``. This is used to model barrier guards, which are elements that can stop the flow of taint depending on a conditional check. + +The extensible predicates are populated using the models defined in data extension files. + +Canonical paths +~~~~~~~~~~~~~~~ + +In Rust models, each callable is identified by its **canonical path** — the fully-qualified path to the function or method. The canonical path follows the internal module structure of the crate, which may differ from the public re-export path. + +Canonical paths take the following forms: + +- **Free functions**: ``crate::module::function``, for example ``std::env::var`` or ``std::fs::read_to_string``. +- **Inherent methods**: ``::method``, for example ``::open``. +- **Trait methods with a concrete type**: ``::method``, for example ``::read_to_end``. +- **Trait methods with a wildcard type**: ``<_ as Trait>::method``, for example ``<_ as core::clone::Clone>::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (::method), that model will take precedence over the trait model. + +Examples of custom model definitions +------------------------------------- + +The examples in this section are based on models from the standard CodeQL Rust query pack published by GitHub. They demonstrate how to add tuples to extend extensible predicates that are used by the standard queries. + +Example: Taint sink for SQL injection in the ``sqlx`` crate +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models the first argument of the ``sqlx::query`` function as a SQL injection sink. The ``query`` function accepts a SQL query string that will be executed against a database. + +.. code-block:: rust + + use sqlx; + + async fn run_query(pool: &sqlx::PgPool, user_input: &str) { + sqlx::query(user_input) // The argument to this function is a SQL injection sink. + .execute(pool) + .await + .unwrap(); + } + +We need to add a tuple to the ``sinkModel(path, input, kind, provenance)`` extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["sqlx_core::query::query", "Argument[0]", "sql-injection", "manual"] + + +- The first value ``sqlx_core::query::query`` is the canonical path of the function to model. Note that this is the internal module path (``sqlx_core::query::query``), not the public re-export path (``sqlx::query``). +- The second value ``Argument[0]`` is the access path to the first argument of the function call, which is the SQL query string. This is the location of the sink. +- The third value ``sql-injection`` is the kind of the sink. The sink kind is used to define the queries where the sink is in scope. +- The fourth value ``manual`` is the provenance of the sink, which is used to identify the origin of the sink. + +Example: Taint source from the ``reqwest`` crate +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models the return value of the ``reqwest::get`` function as a ``remote`` source. This function makes an HTTP GET request to a remote server. + +.. code-block:: rust + + async fn fetch_data(url: &str) -> Result { + let response = reqwest::get(url).await?; // The return value is a remote source of taint. + Ok(response) + } + +We need to add a tuple to the ``sourceModel(path, output, kind, provenance)`` extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: sourceModel + data: + - ["reqwest::get", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "remote", "manual"] + + +- The first value ``reqwest::get`` is the canonical path of the function. +- The second value ``ReturnValue.Future.Field[core::result::Result::Ok(0)]`` is the access path to the output. This compound path is read left to right: + + - ``ReturnValue`` selects the return value of the function call. Since ``reqwest::get`` is an ``async`` function, the return value is a ``Future``. + - ``Future`` unwraps the ``Future`` to reach the value that will be available after ``.await``. + - ``Field[core::result::Result::Ok(0)]`` selects the first positional field of the ``Ok`` variant of the ``Result`` — that is, the ``reqwest::Response`` value. + +- The third value ``remote`` is the kind of the source. ``remote`` indicates that this source represents data that originates from a remote network request. For more information, see ":ref:`Threat models `." +- The fourth value ``manual`` is the provenance of the source. + +Example: Taint source from environment variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models the return value of ``std::env::var`` as a source of data from the environment. + +.. code-block:: rust + + fn get_config() { + let db_url = std::env::var("DATABASE_URL").unwrap(); // The return value is a source of environment data. + // ... + } + +We need to add a tuple to the ``sourceModel(path, output, kind, provenance)`` extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: sourceModel + data: + - ["std::env::var", "ReturnValue.Field[core::result::Result::Ok(0)]", "environment", "manual"] + +- The first value ``std::env::var`` is the canonical path to the ``var`` function in the ``std::env`` module. +- The second value ``ReturnValue.Field[core::result::Result::Ok(0)]`` selects the ``Ok`` variant of the returned ``Result``. +- The third value ``environment`` is the source kind. This is a subcategory of the ``local`` threat model. For more information, see ":ref:`Threat models `." +- The fourth value ``manual`` is the provenance of the source. + +Example: Add flow through the ``Response::text`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models taint flow through the ``text`` method of ``reqwest::Response``, which reads the response body as a string. + +.. code-block:: rust + + async fn read_body(response: reqwest::Response) { + let body = response.text().await.unwrap(); // There is taint flow from response to body. + // ... + } + +We need to add a tuple to the ``summaryModel(path, input, output, kind, provenance)`` extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::text", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + + +- The first value ``::text`` is the canonical path. Note the format ``::method`` used for inherent methods. Also note that the canonical path uses the internal module path ``reqwest::response::Response``, not just ``reqwest::Response``. +- The second value ``Argument[self]`` is the access path to the input. ``Argument[self]`` refers to the receiver of the method call (``response`` in the example). +- The third value ``ReturnValue.Future.Field[core::result::Result::Ok(0)]`` is the access path to the output. This models the fact that ``text()`` is an ``async`` method returning ``impl Future>``, so we follow through ``Future`` and then unwrap the ``Ok`` variant. +- The fourth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call — the output is derived from the input but may not be identical to it. +- The fifth value ``manual`` is the provenance of the summary. + +Example: Add flow through the ``Path::join`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models taint flow through the ``join`` method of ``std::path::Path``, where both the receiver and argument contribute to the result. + +.. code-block:: rust + + use std::path::Path; + + fn build_path(base: &Path, user_input: &str) { + let full_path = base.join(user_input); // There is taint flow from both base and user_input to full_path. + // ... + } + +We need to add tuples to the ``summaryModel(path, input, output, kind, provenance)`` extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::join", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::join", "Argument[0]", "ReturnValue", "taint", "manual"] + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. Each tuple defines flow from one input to the output. The first row defines flow from the receiver and the second row defines flow from the first argument. + +- The first value ``::join`` is the canonical path, the same for both rows. +- The second value differs: + + - ``Argument[self].Reference`` is the access path to the receiver. Since ``join`` takes ``&self``, we use ``Argument[self]`` to select the ``self`` reference, and then ``Reference`` to follow through the reference to the underlying ``Path`` value. + - ``Argument[0]`` is the access path to the first argument (``user_input`` in the example). + +- The third value ``ReturnValue`` is the access path to the output — the return value of the method call. +- The fourth value ``taint`` is the kind of flow. Since ``join`` combines the path and the argument, the output is derived from the inputs but is not identical to either one. +- The fifth value ``manual`` is the provenance of the summary. + +.. note:: + + When using ``Argument[self]`` to refer to the receiver, the ``Reference`` token may need to be appended to follow through the ``&self`` or ``&mut self`` reference to the underlying value. This depends on whether the data you want to track is on the reference itself or on the value behind the reference. + +Example: Add flow through the ``Iterator::map`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models a more complex flow through a higher-order method. Here we model flow through the ``map`` method of the ``Iterator`` trait, which takes a closure and applies it to each element. + +.. code-block:: rust + + fn transform(items: Vec) { + let results: Vec = items.into_iter().map(|item| { + item.to_uppercase() // There is value flow from elements of `items` to `item`. + }).collect(); + } + +We need to add tuples to the ``summaryModel(path, input, output, kind, provenance)`` extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["<_ as core::iter::traits::iterator::Iterator>::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + + +- The first value ``<_ as core::iter::traits::iterator::Iterator>::map`` is the canonical path. The ``<_ as Trait>::method`` form uses a wildcard type (``_``) to match any type that implements the ``Iterator`` trait. +- The second value ``Argument[self].Element`` is the access path to the input — the elements of the iterator (the receiver). +- The third value ``Argument[0].Parameter[0]`` is the access path to the output: + + - ``Argument[0]`` selects the closure argument to ``map``. + - ``Parameter[0]`` selects the first parameter of the closure (``item`` in the example). + +- The fourth value ``value`` is the kind of flow. ``value`` means the value is preserved as it flows — each element of the iterator flows unchanged into the closure parameter. +- The fifth value ``manual`` is the provenance of the summary. + +Example: Add a ``neutral`` model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the Rust query pack models the ``Option::map`` method as neutral with respect to sinks. + +A neutral model prevents generated or inherited models of a specific category (``source``, ``sink``, or ``summary``) from being applied to a callable. This is useful when an automatically generated model incorrectly identifies a callable as, for example, a sink. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: neutralModel + data: + - ["::map", "sink", "manual"] + +Since we are adding a neutral model, we need to add a tuple to the ``neutralModel`` extensible predicate. The tuple has three values: + +- The first value ``::map`` is the canonical path of the function. +- The second value ``sink`` is the category of model to suppress. This means that any generated sink model for ``Option::map`` will be ignored. The category can be ``source``, ``sink``, or ``summary``. +- The third value ``manual`` is the provenance of the neutral model. + +Example: Add a barrier for SQL injection +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how to model a barrier that stops the flow of taint. A barrier model is used to define that the flow of taint stops at the modeled element for the specified kind of query. + +Consider a hypothetical function ``my_crate::sanitize::escape_sql`` which escapes a SQL string, making it safe to use in a SQL query. + +.. code-block:: rust + + fn run_query(pool: &sqlx::PgPool, user_input: &str) { + let safe_input = my_crate::sanitize::escape_sql(user_input); // The return value is safe to use in SQL. + let query = format!("SELECT * FROM users WHERE name = '{}'", safe_input); + // ... + } + +We need to add a tuple to the ``barrierModel(path, output, kind, provenance)`` extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: barrierModel + data: + - ["my_crate::sanitize::escape_sql", "ReturnValue", "sql-injection", "manual"] + + +- The first value ``my_crate::sanitize::escape_sql`` is the canonical path of the function. +- The second value ``ReturnValue`` is the access path to the output of the barrier, which means that the return value is considered sanitized. +- The third value ``sql-injection`` is the kind of the barrier. The barrier kind must match the kind used in the query where the barrier should take effect. In this case, it matches the ``sql-injection`` sink kind used by SQL injection queries. +- The fourth value ``manual`` is the provenance of the barrier. + +Example: Add a barrier guard +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how to model a barrier guard that stops the flow of taint when a conditional check is performed on data. +A barrier guard model is used when a function returns a boolean that indicates whether the data is safe to use. + +Consider a hypothetical function ``my_crate::validate::is_safe_path`` which returns ``true`` when the given path is safe to use in a file system access. + +.. code-block:: rust + + fn read_file(user_path: &str) { + if my_crate::validate::is_safe_path(user_path) { // The check guards the use, so the input is safe. + let contents = std::fs::read_to_string(user_path).unwrap(); + // ... + } + } + +We need to add a tuple to the ``barrierGuardModel(path, input, acceptingValue, kind, provenance)`` extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: barrierGuardModel + data: + - ["my_crate::validate::is_safe_path", "Argument[0]", "true", "path-injection", "manual"] + + +- The first value ``my_crate::validate::is_safe_path`` is the canonical path of the function. +- The second value ``Argument[0]`` is the access path to the input whose flow is blocked. In this case, the first argument to the function (``user_path`` in the example). +- The third value ``true`` is the accepting value of the barrier guard. This is the value that the conditional check must return for the barrier to apply. In this case, when ``is_safe_path`` returns ``true``, the input is considered safe. +- The fourth value ``path-injection`` is the kind of the barrier guard. The barrier guard kind must match the kind used in the query where the barrier guard should take effect. In this case, it matches the ``path-injection`` sink kind used by tainted path queries. +- The fifth value ``manual`` is the provenance of the barrier guard. + +.. _threat-models-rust: + +Threat models +------------- + +.. include:: ../reusables/threat-model-description.rst + +Reference material +------------------ + +The following sections provide reference material for extensible predicates, access paths, and kinds. + +Extensible predicates +--------------------- + +sourceModel(path, output, kind, provenance) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Adds a new taint source. Most taint-tracking queries will use the new source. + +- **path**: Canonical path of the function or method. +- **output**: Access path leading to the source value. +- **kind**: Kind of source to add. See ":ref:`Threat models `" for available source kinds. +- **provenance**: Origin of the model. Use ``manual`` for custom models. + +Example: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: sourceModel + data: + - ["std::env::var", "ReturnValue.Field[core::result::Result::Ok(0)]", "environment", "manual"] + +sinkModel(path, input, kind, provenance) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Adds a new taint sink. Sinks are query-specific and will typically affect one or two queries. + +- **path**: Canonical path of the function or method. +- **input**: Access path leading to the sink value. +- **kind**: Kind of sink to add. See the section on sink kinds for a list of commonly used kinds. +- **provenance**: Origin of the model. Use ``manual`` for custom models. + +Example: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["sqlx_core::query::query", "Argument[0]", "sql-injection", "manual"] + +summaryModel(path, input, output, kind, provenance) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Adds flow through a function or method call. + +- **path**: Canonical path of the function or method. +- **input**: Access path leading to the input of the flow (where data flows from). +- **output**: Access path leading to the output of the flow (where data flows to). +- **kind**: Kind of summary to add. Can be ``taint`` for taint-propagating flow, or ``value`` for value-preserving flow. +- **provenance**: Origin of the model. Use ``manual`` for custom models. + +Example: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::text", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + +neutralModel(path, kind, provenance) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Prevents generated or inherited models of the specified category from being applied to the callable. + +- **path**: Canonical path of the function or method. +- **kind**: The category of model to suppress: ``source``, ``sink``, or ``summary``. +- **provenance**: Origin of the model. Use ``manual`` for custom models. + +Example: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: neutralModel + data: + - ["::map", "sink", "manual"] + +barrierModel(path, output, kind, provenance) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Adds a new barrier that stops the flow of taint at the specified element. + +- **path**: Canonical path of the function or method. +- **output**: Access path leading to the output of the barrier (the value that is considered sanitized). +- **kind**: Kind of barrier to add. The barrier kind must match the kind used in the query where the barrier should take effect. +- **provenance**: Origin of the model. Use ``manual`` for custom models. + +Example: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: barrierModel + data: + - ["my_crate::sanitize::escape_sql", "ReturnValue", "sql-injection", "manual"] + +barrierGuardModel(path, input, acceptingValue, kind, provenance) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Adds a new barrier guard that stops the flow of taint when a conditional check is performed on data. + +- **path**: Canonical path of the function or method. +- **input**: Access path to the input whose flow is blocked. +- **acceptingValue**: The value that the conditional check must return for the barrier to apply. Usually ``"true"`` or ``"false"``. +- **kind**: Kind of barrier guard to add. The barrier guard kind must match the kind used in the query where the barrier guard should take effect. +- **provenance**: Origin of the model. Use ``manual`` for custom models. + +Example: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/rust-all + extensible: barrierGuardModel + data: + - ["my_crate::validate::is_safe_path", "Argument[0]", "true", "path-injection", "manual"] + +Access paths +------------ + +The ``input`` and ``output`` columns consist of a ``.``-separated list of access path tokens, which is evaluated from left to right, with each step selecting a new set of values derived from the previous set. + +The following tokens are commonly used: + +- **Argument[**\ ``n``\ **]** selects the ``n``-th argument to a call (0-indexed). May be a range of the form ``x..y`` (inclusive) and/or a comma-separated list. +- **Argument[self]** selects the receiver (``self``) of a method call. +- **Parameter[**\ ``n``\ **]** selects the ``n``-th parameter of a callback. May be a range of the form ``x..y`` (inclusive) and/or a comma-separated list. +- **ReturnValue** selects the return value of a function call. +- **Element** selects an element in a collection (such as a ``Vec``, ``HashMap``, or iterator). +- **Field[**\ ``type::field``\ **]** selects a named field of a struct or enum variant. For example, ``Field[ihex::Record::Data::value]`` selects the field ``value`` of the ``ihex::Record::Data`` variant. +- **Field[**\ ``type(i)``\ **]** selects the ``i``-th positional field of a tuple struct or tuple enum variant. For example, ``Field[core::result::Result::Ok(0)]`` selects the first positional value inside ``Ok``. +- **Field[**\ ``i``\ **]** selects the ``i``-th element of a tuple. +- **Reference** follows through a reference (``&T`` or ``&mut T``) to reach the referenced value. +- **Future** follows through a ``Future`` to reach the value that will be available after ``.await``. + +Additional notes about the syntax: + +- Multiple operands may be given to a single token, as a shorthand for the union of the operands. For example, ``Argument[0,1]`` matches both ``Argument[0]`` and ``Argument[1]``. +- Numeric operands to ``Argument`` and ``Parameter`` may be given as a range. For example, ``Argument[0..2]`` matches arguments 0, 1, and 2. + +Kinds +----- + +Source kinds +~~~~~~~~~~~~ + +See ":ref:`Threat models `" for available source kinds. + +Sink kinds +~~~~~~~~~~ + +Unlike sources, sinks tend to be highly query-specific, rarely affecting more than one or two queries. Not every query supports customizable sinks. + +Commonly used sink kinds for Rust include: + +- **sql-injection**: A sink for SQL injection, such as an argument to ``sqlx::query``. +- **path-injection**: A sink for path injection in a file system access, such as an argument to ``std::fs::read``. +- **log-injection**: A sink for log injection, such as an argument to a logging function. +- **html-injection**: A sink for HTML injection (cross-site scripting), such as a response body. +- **command-injection**: A sink for command injection, such as an argument to ``std::process::Command``. +- **request-url**: A sink for server-side request forgery, such as a URL passed to an HTTP client. +- **regex-use**: A sink for regex injection, such as a pattern passed to a regex constructor. + +Summary kinds +~~~~~~~~~~~~~ + +- **taint**: A summary that propagates taint. This means the output is not necessarily equal to the input, but it was derived from the input in an unrestrictive way. An attacker who controls the input will have significant control over the output as well. +- **value**: A summary that preserves the value of the input or creates a copy of the input such that all of its properties are preserved. diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.3.rst index 88130515732f..b14905f6eb67 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.3.rst @@ -1,7 +1,7 @@ .. _codeql-cli-2.25.3: ========================== -CodeQL 2.25.3 (2026-05-01) +CodeQL 2.25.3 (2026-04-30) ========================== .. contents:: Contents diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.4.rst new file mode 100644 index 000000000000..649c6f26f6a3 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.25.4.rst @@ -0,0 +1,147 @@ +.. _codeql-cli-2.25.4: + +========================== +CodeQL 2.25.4 (2026-05-05) +========================== + +.. 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.4 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. + +Language Libraries +------------------ + +Breaking Changes +~~~~~~~~~~~~~~~~ + +C# +"" + +* The C# control flow graph (CFG) implementation has been completely rewritten. The CFG now includes additional nodes to more accurately represent certain constructs. This also means that any existing code that implicitly relies on very specific details about the CFG may need to be updated. + The CFG no longer uses splitting, which means that AST nodes now have a unique CFG node representation. + Additionally, the following breaking changes have been made: + + * :code:`ControlFlow::Node` has been renamed to :code:`ControlFlowNode`. + * :code:`ControlFlow::Nodes` has been renamed to :code:`ControlFlowNodes`. + * :code:`BasicBlock.getCallable` has been renamed to :code:`BasicBlock.getEnclosingCallable`. + * :code:`BasicBlocks.qll` has been deleted. + * :code:`ControlFlowNode.getAstNode` has changed its meaning. The AST-to-CFG mapping remains one-to-many, but now for a different reason. It used to be because of splitting, but now it's because of additional "helper" CFG nodes. To get the (now canonical) CFG node for a given AST node, use + :code:`ControlFlowNode.asExpr()` or :code:`ControlFlowNode.asStmt()` or + :code:`ControlFlowElement.getControlFlowNode()` instead. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* When resolving dependencies in :code:`build-mode: none`, :code:`dotnet restore` now explicitly receives reachable NuGet feeds configured in :code:`nuget.config` when feed responsiveness checking is enabled (the default), and any private registries directly, improving reliability when default feeds are unavailable or restricted. + +Swift +""""" + +* Upgraded to allow analysis of Swift 6.3.1. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* Added taint flow models for the :code:`Strsafe.h` header from the Windows SDK. + +C# +"" + +* Expanded ASP and ASP.NET remote source modeling to cover additional sources, including fields of tainted parameters as well as properties and fields that become tainted transitively. +* C# 14: Added support for user-defined compound assignment operators. + +Java/Kotlin +""""""""""" + +* Added :code:`sql-injection` sink models for the Hibernate :code:`org.hibernate.query.QueryProducer` methods :code:`createNativeMutationQuery`, :code:`createMutationQuery`, and :code:`createSelectionQuery`. +* The :code:`java/partial-path-traversal` and :code:`java/partial-path-traversal-from-remote` queries now correctly recognize file separator appends using :code:`+=`. +* The :code:`java/path-injection` and :code:`java/zipslip` queries now recognize :code:`Path.toRealPath()` as a path normalization sanitizer, consistent with the existing treatment of :code:`Path.normalize()` and :code:`File.getCanonicalPath()`. This reduces false positives for code that uses the NIO.2 API for path canonicalization. +* The :code:`java/sensitive-log` query now excludes additional common variable naming patterns that do not hold sensitive data, reducing false positives. This includes pagination/iteration tokens (:code:`nextToken`, :code:`pageToken`, :code:`continuationToken`), token metadata (:code:`tokenType`, :code:`tokenEndpoint`, :code:`tokenCount`), and secret metadata (:code:`secretName`, :code:`secretId`, :code:`secretVersion`). +* The :code:`java/sensitive-log` query now treats method calls whose names contain "encrypt", "hash", or "digest" as sanitizers, consistent with the existing treatment in :code:`java/cleartext-storage-in-log`. This reduces false positives when sensitive data is hashed or encrypted before logging. +* The :code:`java/trust-boundary-violation` query now recognizes regular expression checks (including :code:`String.matches()` guards and :code:`@javax.validation.constraints.Pattern` annotations) as sanitizers, consistent with the existing treatment of ESAPI validators. This reduces false positives when input is validated against a pattern before being stored in a session. + +Python +"""""" + +* The Python extractor now supports unpacking in comprehensions, e.g. :code:`[*x for x in nested]` (as defined in `PEP-798 `__) that will be part of Python 3.15. + +Deprecated APIs +~~~~~~~~~~~~~~~ + +C# +"" + +* The QL classes in the C# SSA library have been renamed to improve consistency between languages. Any custom QL code that makes use of SSA needs to be updated. The old classes have been deprecated and include more detailed migration instructions in their qldoc. + +New Features +~~~~~~~~~~~~ + +C/C++ +""""" + +* A new predicate :code:`getSwitchCase` was added to the :code:`SwitchStmt` class, which yields the :code:`n`\ th :code:`case` statement from a :code:`switch` statement. +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for C and C++ `__. + +C# +"" + +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for C# `__. + +Golang +"""""" + +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for Go `__. + +Java/Kotlin +""""""""""" + +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for Java and Kotlin `__. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Added support for |link-code-vercel-node-1|_ Vercel serverless functions. Handlers are recognized via the :code:`VercelRequest`\ /\ :code:`VercelResponse` TypeScript parameter types, and standard security queries (:code:`js/reflected-xss`, :code:`js/request-forgery`, :code:`js/sql-injection`, :code:`js/command-line-injection`, etc.) now detect vulnerabilities in Vercel API route files. +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for JavaScript `__. + +Python +"""""" + +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for Python `__. + +Ruby +"""" + +* Data flow barriers and barrier guards can now be added using data extensions. For more information see `Customizing library models for Ruby `__. + +Swift +""""" + +* The :code:`BuiltinFixedArrayType` class now defines the predicates :code:`getSize` and :code:`getElementType`, which yield the size of the array and the type of elements stored in the array, respectively. + +Rust +"""" + +* Data flow barriers and barrier guards can now be added using data extensions. + +.. |link-code-vercel-node-1| replace:: :code:`@vercel/node`\ +.. _link-code-vercel-node-1: https://www.npmjs.com/package/@vercel/node + diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 5835176a93fa..c5d4fee45769 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here currentSyntaxCount + } + + // Fall back to string length + return len(pkg.ID) > len(current.ID) +} + +// selectBestPackages builds a map from package paths to their best package variants. +// In the context of a `go test -c` compilation, we see the same package more than +// once, with IDs like "abc.com/pkgname [abc.com/pkgname.test]" to distinguish the version +// that contains and is used by test code. +// We prefer the version with the most complete test coverage, which is typically: +// 1. The exact test package (e.g., "pkg [pkg.test]") over nested test dependencies +// 2. The package with the most Syntax nodes (most files to extract) +// 3. The longest ID string as a tiebreaker +func selectBestPackages(pkgs []*packages.Package) map[string]*packages.Package { + bestPackageIds := make(map[string]*packages.Package) + packages.Visit(pkgs, nil, func(pkg *packages.Package) { + if bestSoFar, present := bestPackageIds[pkg.PkgPath]; present { + if isBetterPackage(pkg, bestSoFar) { + bestPackageIds[pkg.PkgPath] = pkg + } + } else { + bestPackageIds[pkg.PkgPath] = pkg + } + }) + return bestPackageIds +} + // ExtractWithFlags extracts the packages specified by the given patterns and build flags func ExtractWithFlags(buildFlags []string, patterns []string, extractTests bool, sourceRoot string) error { startTime := time.Now() @@ -153,22 +210,8 @@ func ExtractWithFlags(buildFlags []string, patterns []string, extractTests bool, pkgsNotFound := make([]string, 0, len(pkgs)) - // Build a map from package paths to their longest IDs-- - // in the context of a `go test -c` compilation, we will see the same package more than - // once, with IDs like "abc.com/pkgname [abc.com/pkgname.test]" to distinguish the version - // that contains and is used by test code. - // For our purposes it is simplest to just ignore the non-test version, since the test - // version seems to be a superset of it. - longestPackageIds := make(map[string]string) - packages.Visit(pkgs, nil, func(pkg *packages.Package) { - if longestIDSoFar, present := longestPackageIds[pkg.PkgPath]; present { - if len(pkg.ID) > len(longestIDSoFar) { - longestPackageIds[pkg.PkgPath] = pkg.ID - } - } else { - longestPackageIds[pkg.PkgPath] = pkg.ID - } - }) + // Build a map from package paths to their best IDs + bestPackageIds := selectBestPackages(pkgs) // Do a post-order traversal and extract the package scope of each package packages.Visit(pkgs, nil, func(pkg *packages.Package) { @@ -257,15 +300,15 @@ func ExtractWithFlags(buildFlags []string, patterns []string, extractTests bool, // extract AST information for all packages packages.Visit(pkgs, nil, func(pkg *packages.Package) { - // If this is a variant of a package that also occurs with a longer ID, skip it; + // If this is a variant of a package that also occurs with a better ID, skip it; // otherwise we would extract the same file more than once including extracting the // body of methods twice, causing database inconsistencies. // - // We prefer the version with the longest ID because that is (so far as I know) always - // the version that defines more entities -- the only case I'm aware of being a test - // variant of a package, which includes test-only functions in addition to the complete - // contents of the main variant. - if pkg.ID != longestPackageIds[pkg.PkgPath] { + // We prefer the version with the most complete test coverage, prioritizing: + // 1. Exact test packages (e.g., "pkg [pkg.test]") over nested test dependencies + // 2. Packages with more Syntax nodes (more files to extract) + // 3. Longer ID strings as a tiebreaker + if pkg.ID != bestPackageIds[pkg.PkgPath].ID { return } diff --git a/go/extractor/extractor_test.go b/go/extractor/extractor_test.go new file mode 100644 index 000000000000..2b585ec7fa1f --- /dev/null +++ b/go/extractor/extractor_test.go @@ -0,0 +1,343 @@ +package extractor + +import ( + "go/ast" + "testing" + + "golang.org/x/tools/go/packages" +) + +func TestIsExactTestPackage(t *testing.T) { + tests := []struct { + name string + pkgID string + pkgPath string + expected bool + }{ + { + name: "exact test package", + pkgID: "github.com/foo/bar [github.com/foo/bar.test]", + pkgPath: "github.com/foo/bar", + expected: true, + }, + { + name: "nested test package", + pkgID: "github.com/foo/bar [github.com/foo/bar/nested.test]", + pkgPath: "github.com/foo/bar", + expected: false, + }, + { + name: "deeply nested test package", + pkgID: "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6/plumbing/format/packfile.test]", + pkgPath: "github.com/go-git/go-git/v6", + expected: false, + }, + { + name: "exact test package with version", + pkgID: "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6.test]", + pkgPath: "github.com/go-git/go-git/v6", + expected: true, + }, + { + name: "non-test package", + pkgID: "github.com/foo/bar", + pkgPath: "github.com/foo/bar", + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pkg := &packages.Package{ + ID: tt.pkgID, + PkgPath: tt.pkgPath, + } + result := isExactTestPackage(pkg) + if result != tt.expected { + t.Errorf("isExactTestPackage(%q) = %v, want %v", tt.pkgID, result, tt.expected) + } + }) + } +} + +func TestIsBetterPackage(t *testing.T) { + // Helper to create a package with specified properties + makePkg := func(id, path string, syntaxCount int) *packages.Package { + syntax := make([]*ast.File, syntaxCount) + return &packages.Package{ + ID: id, + PkgPath: path, + Syntax: syntax, + } + } + + tests := []struct { + name string + pkg *packages.Package + current *packages.Package + expected bool // true if pkg is better than current + }{ + { + name: "exact test package beats nested test package", + pkg: makePkg( + "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6.test]", + "github.com/go-git/go-git/v6", + 39, // 19 production + 20 test files + ), + current: makePkg( + "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6/plumbing/format/packfile.test]", + "github.com/go-git/go-git/v6", + 19, // production files only + ), + expected: true, + }, + { + name: "nested test package loses to exact test package", + pkg: makePkg( + "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6/plumbing/format/packfile.test]", + "github.com/go-git/go-git/v6", + 19, + ), + current: makePkg( + "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6.test]", + "github.com/go-git/go-git/v6", + 39, + ), + expected: false, + }, + { + name: "more syntax nodes wins when both are exact tests", + pkg: makePkg( + "github.com/foo/bar [github.com/foo/bar.test]", + "github.com/foo/bar", + 50, + ), + current: makePkg( + "github.com/foo/bar [github.com/foo/bar.test]", + "github.com/foo/bar", + 30, + ), + expected: true, + }, + { + name: "fewer syntax nodes loses when both are exact tests", + pkg: makePkg( + "github.com/foo/bar [github.com/foo/bar.test]", + "github.com/foo/bar", + 30, + ), + current: makePkg( + "github.com/foo/bar [github.com/foo/bar.test]", + "github.com/foo/bar", + 50, + ), + expected: false, + }, + { + name: "more syntax nodes wins when both are nested tests", + pkg: makePkg( + "github.com/foo/bar [github.com/foo/bar/pkg1.test]", + "github.com/foo/bar", + 25, + ), + current: makePkg( + "github.com/foo/bar [github.com/foo/bar/pkg2.test]", + "github.com/foo/bar", + 20, + ), + expected: true, + }, + { + name: "longer ID wins when same syntax count", + pkg: makePkg( + "github.com/foo/bar [github.com/foo/bar/verylongpackagename.test]", + "github.com/foo/bar", + 20, + ), + current: makePkg( + "github.com/foo/bar [github.com/foo/bar/short.test]", + "github.com/foo/bar", + 20, + ), + expected: true, + }, + { + name: "test package beats non-test with same syntax count", + pkg: makePkg( + "github.com/foo/bar [github.com/foo/bar.test]", + "github.com/foo/bar", + 20, + ), + current: makePkg( + "github.com/foo/bar", + "github.com/foo/bar", + 20, + ), + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := isBetterPackage(tt.pkg, tt.current) + if result != tt.expected { + t.Errorf("isBetterPackage() = %v, want %v\n pkg: %q (%d syntax nodes)\n current: %q (%d syntax nodes)", + result, tt.expected, + tt.pkg.ID, len(tt.pkg.Syntax), + tt.current.ID, len(tt.current.Syntax)) + } + }) + } +} + +// TestSelectBestPackages tests the selectBestPackages function +func TestSelectBestPackages(t *testing.T) { + // Helper to create a package with specified properties + makePkg := func(id, path string, syntaxCount int) *packages.Package { + syntax := make([]*ast.File, syntaxCount) + return &packages.Package{ + ID: id, + PkgPath: path, + Syntax: syntax, + } + } + + tests := []struct { + name string + pkgs []*packages.Package + expectedPkgIDs map[string]string // pkgPath -> expected selected ID + }{ + { + name: "single package", + pkgs: []*packages.Package{ + makePkg("example.com/pkg", "example.com/pkg", 10), + }, + expectedPkgIDs: map[string]string{ + "example.com/pkg": "example.com/pkg", + }, + }, + { + name: "test package preferred over production", + pkgs: []*packages.Package{ + makePkg("example.com/pkg", "example.com/pkg", 10), + makePkg("example.com/pkg [example.com/pkg.test]", "example.com/pkg", 15), + }, + expectedPkgIDs: map[string]string{ + "example.com/pkg": "example.com/pkg [example.com/pkg.test]", + }, + }, + { + name: "exact test preferred over nested test", + pkgs: []*packages.Package{ + makePkg("example.com/pkg [example.com/pkg.test]", "example.com/pkg", 20), + makePkg("example.com/pkg [example.com/pkg/nested.test]", "example.com/pkg", 15), + }, + expectedPkgIDs: map[string]string{ + "example.com/pkg": "example.com/pkg [example.com/pkg.test]", + }, + }, + { + name: "multiple packages with different paths", + pkgs: []*packages.Package{ + makePkg("example.com/pkg1", "example.com/pkg1", 10), + makePkg("example.com/pkg1 [example.com/pkg1.test]", "example.com/pkg1", 15), + makePkg("example.com/pkg2", "example.com/pkg2", 8), + makePkg("example.com/pkg2 [example.com/pkg2.test]", "example.com/pkg2", 12), + }, + expectedPkgIDs: map[string]string{ + "example.com/pkg1": "example.com/pkg1 [example.com/pkg1.test]", + "example.com/pkg2": "example.com/pkg2 [example.com/pkg2.test]", + }, + }, + { + name: "more syntax nodes wins among nested tests", + pkgs: []*packages.Package{ + makePkg("example.com/pkg [example.com/pkg/a.test]", "example.com/pkg", 10), + makePkg("example.com/pkg [example.com/pkg/b.test]", "example.com/pkg", 20), + }, + expectedPkgIDs: map[string]string{ + "example.com/pkg": "example.com/pkg [example.com/pkg/b.test]", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := selectBestPackages(tt.pkgs) + + // Check that all expected packages are present + for pkgPath, expectedID := range tt.expectedPkgIDs { + selected, found := result[pkgPath] + if !found { + t.Errorf("Expected package path %q not found in result", pkgPath) + continue + } + if selected.ID != expectedID { + t.Errorf("For package path %q: got ID %q, want %q", + pkgPath, selected.ID, expectedID) + } + } + + // Check that no unexpected packages are present + if len(result) != len(tt.expectedPkgIDs) { + t.Errorf("Expected %d packages in result, got %d", + len(tt.expectedPkgIDs), len(result)) + } + }) + } +} + +// TestPackageSelectionRealWorld simulates the real-world go-git scenario +func TestPackageSelectionRealWorld(t *testing.T) { + // Simulate the actual packages.Load result for go-git repository + // when EXTRACT_TESTS=true + pkgs := []*packages.Package{ + // Production package only + { + ID: "github.com/go-git/go-git/v6", + PkgPath: "github.com/go-git/go-git/v6", + Syntax: make([]*ast.File, 19), // 19 production files + }, + // Root test package - this is what we want! + { + ID: "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6.test]", + PkgPath: "github.com/go-git/go-git/v6", + Syntax: make([]*ast.File, 39), // 19 production + 20 test files + }, + // Nested test dependency 1 + { + ID: "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6/plumbing/format/packfile.test]", + PkgPath: "github.com/go-git/go-git/v6", + Syntax: make([]*ast.File, 19), // production files only (dependency) + }, + // Nested test dependency 2 + { + ID: "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6/plumbing/object.test]", + PkgPath: "github.com/go-git/go-git/v6", + Syntax: make([]*ast.File, 19), // production files only (dependency) + }, + } + + // Use the actual selection logic from the extractor + bestPackageIds := selectBestPackages(pkgs) + + // Verify the correct package was selected + selected := bestPackageIds["github.com/go-git/go-git/v6"] + expectedID := "github.com/go-git/go-git/v6 [github.com/go-git/go-git/v6.test]" + expectedSyntaxCount := 39 + + if selected.ID != expectedID { + t.Errorf("Wrong package selected!\n got: %q (%d syntax nodes)\n want: %q (%d syntax nodes)", + selected.ID, len(selected.Syntax), + expectedID, expectedSyntaxCount) + } + + if len(selected.Syntax) != expectedSyntaxCount { + t.Errorf("Wrong syntax count: got %d, want %d", len(selected.Syntax), expectedSyntaxCount) + } + + // Verify it's recognized as an exact test package + if !isExactTestPackage(selected) { + t.Errorf("Selected package %q should be recognized as exact test package", selected.ID) + } +} diff --git a/go/extractor/go.mod b/go/extractor/go.mod index 18415e544020..25c8e3d0e5d2 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -9,8 +9,8 @@ toolchain go1.26.0 // when adding or removing dependencies, run // bazel mod tidy require ( - golang.org/x/mod v0.35.0 - golang.org/x/tools v0.44.0 + golang.org/x/mod v0.36.0 + golang.org/x/tools v0.45.0 ) require github.com/stretchr/testify v1.11.1 diff --git a/go/extractor/go.sum b/go/extractor/go.sum index 89e151102bd8..660ae874a65c 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -6,12 +6,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= -golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/go/extractor/toolchain/toolchain.go b/go/extractor/toolchain/toolchain.go index fb9d5512cd83..c5cd2dd243e7 100644 --- a/go/extractor/toolchain/toolchain.go +++ b/go/extractor/toolchain/toolchain.go @@ -130,7 +130,13 @@ func parseGoVersion(data string) string { for sc.Scan() { lastLine = sc.Text() } - return strings.Fields(lastLine)[2] + + var goVersion = strings.Fields(lastLine)[2] + + // Drop custom build suffixes. + goVersion, _, _ = strings.Cut(goVersion, "-") + + return goVersion } // Returns a value indicating whether the system Go toolchain supports workspaces. diff --git a/go/extractor/toolchain/toolchain_test.go b/go/extractor/toolchain/toolchain_test.go index 57a7294daae3..8a6b38318cb9 100644 --- a/go/extractor/toolchain/toolchain_test.go +++ b/go/extractor/toolchain/toolchain_test.go @@ -8,7 +8,9 @@ import ( func TestParseGoVersion(t *testing.T) { tests := map[string]string{ - "go version go1.18.9 linux/amd64": "go1.18.9", + "go version go1.18.9 linux/amd64": "go1.18.9", + "go version go1.26.3-X:nodwarf5 linux/amd64": "go1.26.3", + "go version go1.26.3rc1 linux/amd64": "go1.26.3rc1", "warning: GOPATH set to GOROOT (/usr/local/go) has no effect\ngo version go1.18.9 linux/amd64": "go1.18.9", } for input, expected := range tests { diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 73a837bd0e01..49572c215bbd 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.49 +version: 1.0.50-dev groups: - go - queries diff --git a/go/ql/integration-tests/root-internal-tests/src/go.mod b/go/ql/integration-tests/root-internal-tests/src/go.mod new file mode 100644 index 000000000000..12e11856e552 --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/src/go.mod @@ -0,0 +1,3 @@ +module example.com/testpkg + +go 1.26 diff --git a/go/ql/integration-tests/root-internal-tests/src/main.go b/go/ql/integration-tests/root-internal-tests/src/main.go new file mode 100644 index 000000000000..fff083caa0ac --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/src/main.go @@ -0,0 +1,13 @@ +package main + +func PublicFunc() int { + return 42 +} + +func privateFunc() int { + return 24 +} + +func main() { + PublicFunc() +} diff --git a/go/ql/integration-tests/root-internal-tests/src/main_test.go b/go/ql/integration-tests/root-internal-tests/src/main_test.go new file mode 100644 index 000000000000..7c38d61d4c87 --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/src/main_test.go @@ -0,0 +1,16 @@ +package main + +import "testing" + +// Root internal test - tests private functions +func TestPrivateFunc(t *testing.T) { + if privateFunc() != 24 { + t.Error("privateFunc failed") + } +} + +func TestPublicFunc(t *testing.T) { + if PublicFunc() != 42 { + t.Error("PublicFunc failed") + } +} diff --git a/go/ql/integration-tests/root-internal-tests/src/nested/nested.go b/go/ql/integration-tests/root-internal-tests/src/nested/nested.go new file mode 100644 index 000000000000..427af1e44b63 --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/src/nested/nested.go @@ -0,0 +1,5 @@ +package nested + +func NestedFunc() string { + return "nested" +} diff --git a/go/ql/integration-tests/root-internal-tests/src/nested/nested_test.go b/go/ql/integration-tests/root-internal-tests/src/nested/nested_test.go new file mode 100644 index 000000000000..a7e063c61859 --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/src/nested/nested_test.go @@ -0,0 +1,9 @@ +package nested + +import "testing" + +func TestNestedFunc(t *testing.T) { + if NestedFunc() != "nested" { + t.Error("NestedFunc failed") + } +} diff --git a/go/ql/integration-tests/root-internal-tests/test.expected b/go/ql/integration-tests/root-internal-tests/test.expected new file mode 100644 index 000000000000..f68c14d1338b --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/test.expected @@ -0,0 +1,7 @@ +#select +| main_test.go | +| nested/nested_test.go | +testFunctions +| TestNestedFunc | nested/nested_test.go | +| TestPrivateFunc | main_test.go | +| TestPublicFunc | main_test.go | diff --git a/go/ql/integration-tests/root-internal-tests/test.py b/go/ql/integration-tests/root-internal-tests/test.py new file mode 100644 index 000000000000..a8f376e33975 --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/test.py @@ -0,0 +1,5 @@ +import os + +def test(codeql, go): + # Test that root internal test files are extracted when nested packages have tests + codeql.database.create(source_root="src", extractor_option = ["extract_tests=true"]) diff --git a/go/ql/integration-tests/root-internal-tests/test.ql b/go/ql/integration-tests/root-internal-tests/test.ql new file mode 100644 index 000000000000..234fd1a04203 --- /dev/null +++ b/go/ql/integration-tests/root-internal-tests/test.ql @@ -0,0 +1,15 @@ +import go + +// Verify that root internal test files are extracted +// when nested packages also have tests +from File f +where f.getBaseName().matches("%_test.go") +select f.getRelativePath() + +query predicate testFunctions(string name, string file) { + exists(FuncDecl fn | + fn.getName().matches("Test%") and + name = fn.getName() and + file = fn.getFile().getRelativePath() + ) +} diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 1d1682d6108c..16ddb133517d 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.1.0 +version: 7.1.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 78c754593872..5fdc63fe363d 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.2 +version: 1.6.3-dev groups: - go - queries diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index 1fc91c3c8499..f99bbd1ed975 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -1,296 +1,296 @@ -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: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,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,,,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,,,,,,,,,,,56,,,,,,,,,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,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,, -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,,,,,,,,,,,,,,,44,,,,,,,,,,,,,,,,,,,,,,,1,,202,23 -java.lang,38,3,790,,13,,,,,,1,,,,,,,,,,,,8,,,,11,,,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,,,,,,,,,,,,,,,41,,,,,,,,,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,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,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,,,,,,,,,,,,,,,105,,,,,,,,,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,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,, -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,,,,,,,,,,,9,,,,,,,,,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,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,,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: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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/java/documentation/library-coverage/cwe-sink.csv b/java/documentation/library-coverage/cwe-sink.csv index 16fff1e653bc..c673888f683b 100644 --- a/java/documentation/library-coverage/cwe-sink.csv +++ b/java/documentation/library-coverage/cwe-sink.csv @@ -1,6 +1,6 @@ CWE,Sink identifier,Label CWE‑089,sql-injection,SQL injection -CWE‑022,path-injection,Path injection +CWE‑022,path-injection path-injection[read],Path injection CWE‑094,bean-validation,Code injection CWE‑918,request-forgery,Request Forgery CWE‑079,html-injection js-injection,Cross-site scripting diff --git a/java/ql/lib/change-notes/2026-04-21-path-injection-read-subkind.md b/java/ql/lib/change-notes/2026-04-21-path-injection-read-subkind.md new file mode 100644 index 000000000000..bcd9479d2afd --- /dev/null +++ b/java/ql/lib/change-notes/2026-04-21-path-injection-read-subkind.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Introduced a new sink kind `path-injection[read]` for Models-as-Data rows that only read from a path (such as `ClassLoader.getResource`, `FileInputStream`, `FileReader`, `Files.readAllBytes`, and related APIs). The general `java/path-injection` query continues to consider both `path-injection` and `path-injection[read]` sinks. diff --git a/java/ql/lib/change-notes/2026-05-19-avro-mads.md b/java/ql/lib/change-notes/2026-05-19-avro-mads.md new file mode 100644 index 000000000000..43368b098b1f --- /dev/null +++ b/java/ql/lib/change-notes/2026-05-19-avro-mads.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added LLM-generated source and sink models for `org.apache.avro`. diff --git a/java/ql/lib/ext/com.google.common.io.model.yml b/java/ql/lib/ext/com.google.common.io.model.yml index 8ce06de61b96..a8d2690bf00b 100644 --- a/java/ql/lib/ext/com.google.common.io.model.yml +++ b/java/ql/lib/ext/com.google.common.io.model.yml @@ -5,12 +5,12 @@ extensions: data: - ["com.google.common.io", "Files", False, "asByteSink", "(File,FileWriteMode[])", "", "Argument[0]", "path-injection", "ai-manual"] - ["com.google.common.io", "Files", False, "asCharSink", "(File,Charset,FileWriteMode[])", "", "Argument[0]", "path-injection", "ai-manual"] - - ["com.google.common.io", "Files", False, "asCharSource", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["com.google.common.io", "Files", False, "copy", "(File,OutputStream)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["com.google.common.io", "Files", False, "asCharSource", "(File,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["com.google.common.io", "Files", False, "copy", "(File,OutputStream)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["com.google.common.io", "Files", False, "newWriter", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["com.google.common.io", "Files", False, "readLines", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["com.google.common.io", "Files", False, "toByteArray", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["com.google.common.io", "Files", False, "toString", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["com.google.common.io", "Files", False, "readLines", "(File,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["com.google.common.io", "Files", False, "toByteArray", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["com.google.common.io", "Files", False, "toString", "(File,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["com.google.common.io", "Files", False, "write", "(byte[],File)", "", "Argument[0]", "file-content-store", "ai-manual"] - ["com.google.common.io", "Files", False, "write", "(byte[],File)", "", "Argument[1]", "path-injection", "manual"] - addsTo: diff --git a/java/ql/lib/ext/com.thoughtworks.xstream.model.yml b/java/ql/lib/ext/com.thoughtworks.xstream.model.yml index c34bb91d42c9..62e17590ebfd 100644 --- a/java/ql/lib/ext/com.thoughtworks.xstream.model.yml +++ b/java/ql/lib/ext/com.thoughtworks.xstream.model.yml @@ -3,4 +3,4 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["com.thoughtworks.xstream", "XStream", True, "fromXML", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["com.thoughtworks.xstream", "XStream", True, "fromXML", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] 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/hudson.model.model.yml b/java/ql/lib/ext/hudson.model.model.yml index 253f26fbd24e..b52f7195b2b2 100644 --- a/java/ql/lib/ext/hudson.model.model.yml +++ b/java/ql/lib/ext/hudson.model.model.yml @@ -5,8 +5,8 @@ extensions: data: - ["hudson.model", "DownloadService", True, "loadJSON", "(URL)", "", "Argument[0]", "request-forgery", "ai-manual"] - ["hudson.model", "DownloadService", True, "loadJSONHTML", "(URL)", "", "Argument[0]", "request-forgery", "ai-manual"] - - ["hudson.model", "DirectoryBrowserSupport", False, "DirectoryBrowserSupport", "(ModelObject,FilePath,String,String,boolean)", "", "Argument[1]", "path-injection", "ai-manual"] - - ["hudson.model", "Items", True, "load", "(ItemGroup,File)", "", "Argument[1]", "path-injection", "ai-manual"] + - ["hudson.model", "DirectoryBrowserSupport", False, "DirectoryBrowserSupport", "(ModelObject,FilePath,String,String,boolean)", "", "Argument[1]", "path-injection[read]", "ai-manual"] + - ["hudson.model", "Items", True, "load", "(ItemGroup,File)", "", "Argument[1]", "path-injection[read]", "ai-manual"] - ["hudson.model", "UpdateCenter$UpdateCenterConfiguration", True, "download", "(UpdateCenter$DownloadJob,URL)", "", "Argument[1]", "request-forgery", "ai-manual"] - ["hudson.model", "UpdateCenter$UpdateCenterConfiguration", True, "install", "(UpdateCenter$DownloadJob,File,File)", "", "Argument[1]", "path-injection", "ai-manual"] - ["hudson.model", "UpdateCenter$UpdateCenterConfiguration", True, "install", "(UpdateCenter$DownloadJob,File,File)", "", "Argument[2]", "path-injection", "ai-manual"] diff --git a/java/ql/lib/ext/hudson.model.yml b/java/ql/lib/ext/hudson.model.yml index 0dfff091fcd4..da2753c86bdd 100644 --- a/java/ql/lib/ext/hudson.model.yml +++ b/java/ql/lib/ext/hudson.model.yml @@ -6,14 +6,14 @@ extensions: - ["hudson", "FilePath", False, "tar", "(OutputStream,String)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson", "FilePath", False, "unzipFrom", "(InputStream)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyFrom", "", "", "Argument[this]", "path-injection", "manual"] - - ["hudson", "FilePath", True, "copyFrom", "(FilePath)", "", "Argument[0]", "path-injection", "manual"] - - ["hudson", "FilePath", True, "copyFrom", "(URL)", "", "Argument[0]", "path-injection", "manual"] - - ["hudson", "FilePath", True, "copyFrom", "(FileItem)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["hudson", "FilePath", True, "copyFrom", "(FilePath)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["hudson", "FilePath", True, "copyFrom", "(URL)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["hudson", "FilePath", True, "copyFrom", "(FileItem)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "", "", "Argument[this]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(DirScanner,FilePath,String,FilePath$TarCompression)", "", "Argument[1]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(DirScanner,FilePath,String)", "", "Argument[1]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,FilePath)", "", "Argument[1]", "path-injection", "ai-manual"] - - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,String,FilePath)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,String,FilePath)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["hudson", "FilePath", True, "copyRecursiveTo", "(String,String,FilePath)", "", "Argument[2]", "path-injection", "ai-manual"] - ["hudson", "FilePath", True, "copyTo", "", "", "Argument[this]", "path-injection", "manual"] - ["hudson", "FilePath", True, "copyTo", "(FilePath)", "", "Argument[0]", "path-injection", "ai-manual"] @@ -21,7 +21,7 @@ extensions: - ["hudson", "FilePath", True, "copyToWithPermission", "(FilePath)", "", "Argument[0]", "path-injection", "manual"] - ["hudson", "FilePath", True, "exists", "()", "", "Argument[this]", "path-injection", "manual"] - ["hudson", "FilePath", True, "installIfNecessaryFrom", "(URL,TaskListener,String)", "", "Argument[0]", "request-forgery", "ai-manual"] - - ["hudson", "FilePath", True, "newInputStreamDenyingSymlinkAsNeeded", "(File,String,boolean)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["hudson", "FilePath", True, "newInputStreamDenyingSymlinkAsNeeded", "(File,String,boolean)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["hudson", "FilePath", True, "openInputStream", "(File,OpenOption[])", "", "Argument[0]", "path-injection", "manual"] - ["hudson", "FilePath", True, "read", "", "", "Argument[this]", "path-injection", "manual"] - ["hudson", "FilePath", True, "read", "(FilePath,OpenOption[])", "", "Argument[0]", "path-injection", "manual"] diff --git a/java/ql/lib/ext/hudson.scm.model.yml b/java/ql/lib/ext/hudson.scm.model.yml index dc6e0bfa5bb8..a6cf1532b6b4 100644 --- a/java/ql/lib/ext/hudson.scm.model.yml +++ b/java/ql/lib/ext/hudson.scm.model.yml @@ -3,11 +3,11 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["hudson.scm", "ChangeLogParser", True, "parse", "(AbstractBuild,File)", "", "Argument[1]", "path-injection", "ai-manual"] - - ["hudson.scm", "ChangeLogParser", True, "parse", "(Run,RepositoryBrowser,File)", "", "Argument[2]", "path-injection", "ai-manual"] + - ["hudson.scm", "ChangeLogParser", True, "parse", "(AbstractBuild,File)", "", "Argument[1]", "path-injection[read]", "ai-manual"] + - ["hudson.scm", "ChangeLogParser", True, "parse", "(Run,RepositoryBrowser,File)", "", "Argument[2]", "path-injection[read]", "ai-manual"] - ["hudson.scm", "SCM", True, "checkout", "(AbstractBuild,Launcher,FilePath,BuildListener,File)", "", "Argument[2]", "path-injection", "ai-manual"] - ["hudson.scm", "SCM", True, "checkout", "(Run,Launcher,FilePath,TaskListener,File,SCMRevisionState)", "", "Argument[2]", "path-injection", "ai-manual"] - - ["hudson.scm", "SCM", True, "compareRemoteRevisionWith", "(Job,Launcher,FilePath,TaskListener,SCMRevisionState)", "", "Argument[2]", "path-injection", "ai-manual"] + - ["hudson.scm", "SCM", True, "compareRemoteRevisionWith", "(Job,Launcher,FilePath,TaskListener,SCMRevisionState)", "", "Argument[2]", "path-injection[read]", "ai-manual"] - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/hudson.util.jna.model.yml b/java/ql/lib/ext/hudson.util.jna.model.yml index c840d0f47256..11efc9ace86b 100644 --- a/java/ql/lib/ext/hudson.util.jna.model.yml +++ b/java/ql/lib/ext/hudson.util.jna.model.yml @@ -3,6 +3,6 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["hudson.util.jna", "GNUCLibrary", True, "open", "(String,int)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["hudson.util.jna", "GNUCLibrary", True, "open", "(String,int)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["hudson.util.jna", "Kernel32", True, "MoveFileExA", "(String,String,int)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson.util.jna", "Kernel32", True, "MoveFileExA", "(String,String,int)", "", "Argument[1]", "path-injection", "ai-manual"] diff --git a/java/ql/lib/ext/hudson.util.model.yml b/java/ql/lib/ext/hudson.util.model.yml index 1ac3aa8c10ae..0fcf7b0cbfb9 100644 --- a/java/ql/lib/ext/hudson.util.model.yml +++ b/java/ql/lib/ext/hudson.util.model.yml @@ -6,7 +6,7 @@ extensions: - ["hudson.util", "AtomicFileWriter", True, "AtomicFileWriter", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson.util", "AtomicFileWriter", True, "AtomicFileWriter", "(Path,Charset,boolean,boolean)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson.util", "AtomicFileWriter", True, "AtomicFileWriter", "(Path,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["hudson.util", "ClasspathBuilder", True, "add", "(FilePath)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["hudson.util", "ClasspathBuilder", True, "add", "(FilePath)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["hudson.util", "FormValidation", True, "errorWithMarkup", "", "", "Argument[0]", "html-injection", "manual"] - ["hudson.util", "FormValidation", True, "okWithMarkup", "", "", "Argument[0]", "html-injection", "manual"] - ["hudson.util", "FormValidation", True, "respond", "", "", "Argument[1]", "html-injection", "manual"] @@ -14,11 +14,11 @@ extensions: - ["hudson.util", "IOUtils", True, "mkdirs", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson.util", "StreamTaskListener", True, "StreamTaskListener", "(File,boolean,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - ["hudson.util", "TextFile", True, "delete", "()", "", "Argument[this]", "path-injection", "manual"] - - ["hudson.util", "TextFile", True, "fastTail", "", "", "Argument[this]", "path-injection", "manual"] - - ["hudson.util", "TextFile", True, "head", "", "", "Argument[this]", "path-injection", "manual"] - - ["hudson.util", "TextFile", True, "lines", "()", "", "Argument[this]", "path-injection", "manual"] - - ["hudson.util", "TextFile", True, "read", "()", "", "Argument[this]", "path-injection", "manual"] - - ["hudson.util", "TextFile", True, "readTrim", "()", "", "Argument[this]", "path-injection", "manual"] + - ["hudson.util", "TextFile", True, "fastTail", "", "", "Argument[this]", "path-injection[read]", "manual"] + - ["hudson.util", "TextFile", True, "head", "", "", "Argument[this]", "path-injection[read]", "manual"] + - ["hudson.util", "TextFile", True, "lines", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["hudson.util", "TextFile", True, "read", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["hudson.util", "TextFile", True, "readTrim", "()", "", "Argument[this]", "path-injection[read]", "manual"] - ["hudson.util", "TextFile", True, "write", "(String)", "", "Argument[this]", "path-injection", "manual"] - ["hudson.util", "TextFile", True, "write", "(String)", "", "Argument[0]", "file-content-store", "manual"] - ["hudson.util", "HttpResponses", True, "staticResource", "(File)", "", "Argument[0]", "path-injection", "manual"] diff --git a/java/ql/lib/ext/io.netty.handler.codec.http.multipart.model.yml b/java/ql/lib/ext/io.netty.handler.codec.http.multipart.model.yml index a44a2c6c4005..04f1c2ebc19d 100644 --- a/java/ql/lib/ext/io.netty.handler.codec.http.multipart.model.yml +++ b/java/ql/lib/ext/io.netty.handler.codec.http.multipart.model.yml @@ -3,7 +3,7 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["io.netty.handler.codec.http.multipart", "HttpPostRequestEncoder", True, "addBodyFileUpload", "(String,File,String,boolean)", "", "Argument[1]", "path-injection", "ai-manual"] + - ["io.netty.handler.codec.http.multipart", "HttpPostRequestEncoder", True, "addBodyFileUpload", "(String,File,String,boolean)", "", "Argument[1]", "path-injection[read]", "ai-manual"] - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/io.netty.handler.ssl.model.yml b/java/ql/lib/ext/io.netty.handler.ssl.model.yml index f63a7a3906f9..2df3ddd6fbc2 100644 --- a/java/ql/lib/ext/io.netty.handler.ssl.model.yml +++ b/java/ql/lib/ext/io.netty.handler.ssl.model.yml @@ -3,7 +3,7 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["io.netty.handler.ssl", "OpenSslServerContext", False, "OpenSslServerContext", "(File,File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["io.netty.handler.ssl", "SslContextBuilder", False, "forServer", "(File,File)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["io.netty.handler.ssl", "OpenSslServerContext", False, "OpenSslServerContext", "(File,File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["io.netty.handler.ssl", "SslContextBuilder", False, "forServer", "(File,File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["io.netty.handler.ssl", "SslContextBuilder", False, "trustManager", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["io.netty.handler.ssl", "SslContextBuilder", False, "trustManager", "(InputStream)", "", "Argument[0]", "path-injection", "ai-manual"] diff --git a/java/ql/lib/ext/io.netty.handler.stream.model.yml b/java/ql/lib/ext/io.netty.handler.stream.model.yml index f4e635f4437e..1a154c59192c 100644 --- a/java/ql/lib/ext/io.netty.handler.stream.model.yml +++ b/java/ql/lib/ext/io.netty.handler.stream.model.yml @@ -3,4 +3,4 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["io.netty.handler.stream", "ChunkedFile", True, "ChunkedFile", "(RandomAccessFile,long,long,int)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["io.netty.handler.stream", "ChunkedFile", True, "ChunkedFile", "(RandomAccessFile,long,long,int)", "", "Argument[0]", "path-injection[read]", "ai-manual"] diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index 07e39c9e12f7..dd47342d590a 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -3,17 +3,17 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["java.io", "File", True, "canExecute", "()", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "File", True, "canRead", "()", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "File", True, "canWrite", "()", "", "Argument[this]", "path-injection", "manual"] + - ["java.io", "File", True, "canExecute", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["java.io", "File", True, "canRead", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["java.io", "File", True, "canWrite", "()", "", "Argument[this]", "path-injection[read]", "manual"] - ["java.io", "File", True, "createNewFile", "()", "", "Argument[this]", "path-injection", "ai-manual"] - ["java.io", "File", True, "createTempFile", "(String,String,File)", "", "Argument[2]", "path-injection", "ai-manual"] - ["java.io", "File", True, "delete", "()", "", "Argument[this]", "path-injection", "manual"] - ["java.io", "File", True, "deleteOnExit", "()", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "File", True, "exists", "()", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "File", True, "isDirectory", "()", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "File", True, "isFile", "()", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "File", True, "isHidden", "()", "", "Argument[this]", "path-injection", "manual"] + - ["java.io", "File", True, "exists", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["java.io", "File", True, "isDirectory", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["java.io", "File", True, "isFile", "()", "", "Argument[this]", "path-injection[read]", "manual"] + - ["java.io", "File", True, "isHidden", "()", "", "Argument[this]", "path-injection[read]", "manual"] - ["java.io", "File", True, "mkdir", "()", "", "Argument[this]", "path-injection", "manual"] - ["java.io", "File", True, "mkdirs", "()", "", "Argument[this]", "path-injection", "manual"] - ["java.io", "File", True, "renameTo", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] @@ -23,16 +23,16 @@ extensions: - ["java.io", "File", True, "setReadable", "", "", "Argument[this]", "path-injection", "manual"] - ["java.io", "File", True, "setReadOnly", "", "", "Argument[this]", "path-injection", "manual"] - ["java.io", "File", True, "setWritable", "", "", "Argument[this]", "path-injection", "manual"] - - ["java.io", "FileInputStream", True, "FileInputStream", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.io", "FileInputStream", True, "FileInputStream", "(FileDescriptor)", "", "Argument[0]", "path-injection", "manual"] - - ["java.io", "FileInputStream", True, "FileInputStream", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["java.io", "FileInputStream", True, "FileInputStream", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.io", "FileInputStream", True, "FileInputStream", "(FileDescriptor)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["java.io", "FileInputStream", True, "FileInputStream", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["java.io", "FileOutputStream", False, "FileOutputStream", "", "", "Argument[0]", "path-injection", "manual"] - ["java.io", "FileOutputStream", False, "write", "", "", "Argument[0]", "file-content-store", "manual"] - - ["java.io", "FileReader", True, "FileReader", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.io", "FileReader", True, "FileReader", "(FileDescriptor)", "", "Argument[0]", "path-injection", "manual"] - - ["java.io", "FileReader", True, "FileReader", "(File,Charset)", "", "Argument[0]", "path-injection", "manual"] - - ["java.io", "FileReader", True, "FileReader", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.io", "FileReader", True, "FileReader", "(String,Charset)", "", "Argument[0]", "path-injection", "manual"] + - ["java.io", "FileReader", True, "FileReader", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.io", "FileReader", True, "FileReader", "(FileDescriptor)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["java.io", "FileReader", True, "FileReader", "(File,Charset)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["java.io", "FileReader", True, "FileReader", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.io", "FileReader", True, "FileReader", "(String,Charset)", "", "Argument[0]", "path-injection[read]", "manual"] - ["java.io", "FileSystem", True, "createDirectory", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["java.io", "FileWriter", False, "FileWriter", "", "", "Argument[0]", "path-injection", "manual"] - ["java.io", "PrintStream", False, "PrintStream", "(File)", "", "Argument[0]", "path-injection", "manual"] diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 8c2c448f4c2f..9e3d9e8cee54 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -3,15 +3,15 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["java.lang", "Class", False, "getResource", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "Class", False, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "ClassLoader", False, "getSystemResources", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "ClassLoader", True, "getResource", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "ClassLoader", True, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "ClassLoader", True, "getResources", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "ClassLoader", True, "getSystemResource", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "ClassLoader", True, "getSystemResourceAsStream", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.lang", "Module", True, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["java.lang", "Class", False, "getResource", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "Class", False, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "ClassLoader", False, "getSystemResources", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "ClassLoader", True, "getResource", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "ClassLoader", True, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "ClassLoader", True, "getResources", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "ClassLoader", True, "getSystemResource", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "ClassLoader", True, "getSystemResourceAsStream", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.lang", "Module", True, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["java.lang", "ProcessBuilder", False, "command", "(List)", "", "Argument[0]", "command-injection", "manual"] - ["java.lang", "ProcessBuilder", False, "command", "(String[])", "", "Argument[0]", "command-injection", "ai-manual"] - ["java.lang", "ProcessBuilder", False, "directory", "(File)", "", "Argument[0]", "command-injection", "ai-manual"] diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index 8d7db676e533..66cbe2da7b4a 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -3,8 +3,8 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["java.nio.file", "Files", False, "copy", "(Path,OutputStream)", "", "Argument[0]", "path-injection", "manual"] - - ["java.nio.file", "Files", False, "copy", "(Path,Path,CopyOption[])", "", "Argument[0]", "path-injection", "manual"] + - ["java.nio.file", "Files", False, "copy", "(Path,OutputStream)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["java.nio.file", "Files", False, "copy", "(Path,Path,CopyOption[])", "", "Argument[0]", "path-injection[read]", "manual"] - ["java.nio.file", "Files", False, "copy", "(Path,Path,CopyOption[])", "", "Argument[1]", "path-injection", "manual"] - ["java.nio.file", "Files", False, "copy", "(InputStream,Path,CopyOption[])", "", "Argument[0]", "file-content-store", "manual"] - ["java.nio.file", "Files", False, "copy", "(InputStream,Path,CopyOption[])", "", "Argument[1]", "path-injection", "manual"] @@ -17,24 +17,24 @@ extensions: - ["java.nio.file", "Files", False, "createTempFile", "(Path,String,String,FileAttribute[])", "", "Argument[0]", "path-injection", "manual"] - ["java.nio.file", "Files", False, "delete", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] - ["java.nio.file", "Files", False, "deleteIfExists", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "getFileStore", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] # the FileStore class is unlikely to be used for later sanitization - - ["java.nio.file", "Files", False, "exists", "(Path,LinkOption[])", "", "Argument[0]", "path-injection", "manual"] - - ["java.nio.file", "Files", False, "lines", "(Path,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "lines", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["java.nio.file", "Files", False, "getFileStore", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] # the FileStore class is unlikely to be used for later sanitization + - ["java.nio.file", "Files", False, "exists", "(Path,LinkOption[])", "", "Argument[0]", "path-injection[read]", "manual"] + - ["java.nio.file", "Files", False, "lines", "(Path,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.nio.file", "Files", False, "lines", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["java.nio.file", "Files", False, "move", "", "", "Argument[1]", "path-injection", "manual"] - ["java.nio.file", "Files", False, "move", "(Path,Path,CopyOption[])", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "newBufferedReader", "(Path,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "newBufferedReader", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["java.nio.file", "Files", False, "newBufferedReader", "(Path,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.nio.file", "Files", False, "newBufferedReader", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["java.nio.file", "Files", False, "newBufferedWriter", "", "", "Argument[0]", "path-injection", "manual"] - - ["java.nio.file", "Files", False, "newInputStream", "(Path,OpenOption[])", "", "Argument[0]", "path-injection", "ai-manual"] + - ["java.nio.file", "Files", False, "newInputStream", "(Path,OpenOption[])", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["java.nio.file", "Files", False, "newOutputStream", "", "", "Argument[0]", "path-injection", "manual"] - - ["java.nio.file", "Files", False, "notExists", "(Path,LinkOption[])", "", "Argument[0]", "path-injection", "manual"] - - ["java.nio.file", "Files", False, "probeContentType", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] # accesses the file based on user input, but only reads its content type from it - - ["java.nio.file", "Files", False, "readAllBytes", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "readAllLines", "(Path,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "readAllLines", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "readString", "(Path,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["java.nio.file", "Files", False, "readString", "(Path)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["java.nio.file", "Files", False, "notExists", "(Path,LinkOption[])", "", "Argument[0]", "path-injection[read]", "manual"] + - ["java.nio.file", "Files", False, "probeContentType", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] # accesses the file based on user input, but only reads its content type from it + - ["java.nio.file", "Files", False, "readAllBytes", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.nio.file", "Files", False, "readAllLines", "(Path,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.nio.file", "Files", False, "readAllLines", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.nio.file", "Files", False, "readString", "(Path,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["java.nio.file", "Files", False, "readString", "(Path)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["java.nio.file", "Files", False, "write", "", "", "Argument[0]", "path-injection", "manual"] - ["java.nio.file", "Files", False, "write", "", "", "Argument[1]", "file-content-store", "manual"] - ["java.nio.file", "Files", False, "writeString", "", "", "Argument[0]", "path-injection", "manual"] diff --git a/java/ql/lib/ext/javax.servlet.model.yml b/java/ql/lib/ext/javax.servlet.model.yml index cbf99dcd97ef..3d4a580edfc4 100644 --- a/java/ql/lib/ext/javax.servlet.model.yml +++ b/java/ql/lib/ext/javax.servlet.model.yml @@ -13,8 +13,8 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["javax.servlet", "ServletContext", True, "getResource", "(String)", "", "Argument[0]", "path-injection", "manual"] - - ["javax.servlet", "ServletContext", True, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["javax.servlet", "ServletContext", True, "getResource", "(String)", "", "Argument[0]", "path-injection[read]", "manual"] + - ["javax.servlet", "ServletContext", True, "getResourceAsStream", "(String)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["javax.servlet", "ServletContext", True, "getRequestDispatcher", "(String)", "", "Argument[0]", "url-forward", "manual"] - ["javax.servlet", "ServletRequest", True, "getRequestDispatcher", "(String)", "", "Argument[0]", "url-forward", "manual"] - addsTo: diff --git a/java/ql/lib/ext/kotlin.io.model.yml b/java/ql/lib/ext/kotlin.io.model.yml index b748e04a292d..550ba509a090 100644 --- a/java/ql/lib/ext/kotlin.io.model.yml +++ b/java/ql/lib/ext/kotlin.io.model.yml @@ -4,9 +4,9 @@ extensions: extensible: sinkModel data: - ["kotlin.io", "FilesKt", False, "deleteRecursively", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["kotlin.io", "FilesKt", False, "inputStream", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["kotlin.io", "FilesKt", False, "readBytes", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["kotlin.io", "FilesKt", False, "readText", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["kotlin.io", "FilesKt", False, "inputStream", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["kotlin.io", "FilesKt", False, "readBytes", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["kotlin.io", "FilesKt", False, "readText", "(File,Charset)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/org.apache.commons.io.model.yml b/java/ql/lib/ext/org.apache.commons.io.model.yml index 9c75ce8b41ad..7ef2f1f60e68 100644 --- a/java/ql/lib/ext/org.apache.commons.io.model.yml +++ b/java/ql/lib/ext/org.apache.commons.io.model.yml @@ -29,18 +29,18 @@ extensions: - ["org.apache.commons.io", "FileUtils", False, "forceMkdir", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["org.apache.commons.io", "FileUtils", False, "moveDirectory", "(File,File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["org.apache.commons.io", "FileUtils", False, "readFileToByteArray", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["org.apache.commons.io", "FileUtils", False, "readFileToString", "(File,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.apache.commons.io", "FileUtils", False, "readFileToByteArray", "", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["org.apache.commons.io", "FileUtils", False, "writeLines", "(File,String,Collection,String)", "", "Argument[3]", "file-content-store", "ai-manual"] - ["org.apache.commons.io", "FileUtils", False, "writeStringToFile", "(File,String,Charset,boolean)", "", "Argument[1]", "file-content-store", "ai-manual"] - ["org.apache.commons.io", "FileUtils", True, "copyInputStreamToFile", "(InputStream,File)", "", "Argument[0]", "file-content-store", "ai-manual"] - ["org.apache.commons.io", "FileUtils", True, "copyInputStreamToFile", "(InputStream,File)", "", "Argument[1]", "path-injection", "manual"] - ["org.apache.commons.io", "FileUtils", True, "copyToFile", "(InputStream,File)", "", "Argument[0]", "file-content-store", "ai-manual"] - ["org.apache.commons.io", "FileUtils", True, "copyToFile", "(InputStream,File)", "", "Argument[1]", "path-injection", "manual"] - - ["org.apache.commons.io", "FileUtils", True, "openInputStream", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.apache.commons.io", "FileUtils", True, "openInputStream", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["org.apache.commons.io", "FileUtils", True, "delete", "(File)", "", "Argument[0]", "path-injection", "manual"] - ["org.apache.commons.io", "FileUtils", True, "deleteDirectory", "(File)", "", "Argument[0]", "path-injection", "manual"] - ["org.apache.commons.io", "FileUtils", True, "deleteQuietly", "(File)", "", "Argument[0]", "path-injection", "manual"] - ["org.apache.commons.io", "FileUtils", True, "forceDelete", "(File)", "", "Argument[0]", "path-injection", "manual"] - ["org.apache.commons.io", "FileUtils", True, "forceDeleteOnExit", "(File)", "", "Argument[0]", "path-injection", "manual"] - ["org.apache.commons.io", "FileUtils", True, "forceMkdirParent", "(File)", "", "Argument[0]", "path-injection", "manual"] - - ["org.apache.commons.io", "IOUtils", False, "resourceToString", "(String,Charset)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.apache.commons.io", "IOUtils", False, "resourceToString", "", "", "Argument[0]", "path-injection[read]", "ai-manual"] diff --git a/java/ql/lib/ext/org.apache.commons.net.model.yml b/java/ql/lib/ext/org.apache.commons.net.model.yml index 0a4c46e6a3c3..689aa873d960 100644 --- a/java/ql/lib/ext/org.apache.commons.net.model.yml +++ b/java/ql/lib/ext/org.apache.commons.net.model.yml @@ -9,9 +9,9 @@ extensions: - ["org.apache.commons.net", "SocketClient", true, "connect", "(String)", "", "Argument[0]", "request-forgery", "manual"] - ["org.apache.commons.net", "SocketClient", true, "connect", "(String,int)", "", "Argument[0]", "request-forgery", "df-manual"] - ["org.apache.commons.net", "SocketClient", true, "connect", "(String,int,InetAddress,int)", "", "Argument[0]", "request-forgery", "manual"] - - ["org.apache.commons.net.util", "KeyManagerUtils", false, "createClientKeyManager", "(File,String)", "", "Argument[0]", "path-injection", "df-manual"] - - ["org.apache.commons.net.util", "KeyManagerUtils", false, "createClientKeyManager", "(File,String,String)", "", "Argument[0]", "path-injection", "df-manual"] - - ["org.apache.commons.net.util", "KeyManagerUtils", false, "createClientKeyManager", "(String,File,String,String,String)", "", "Argument[1]", "path-injection", "df-manual"] + - ["org.apache.commons.net.util", "KeyManagerUtils", false, "createClientKeyManager", "(File,String)", "", "Argument[0]", "path-injection[read]", "df-manual"] + - ["org.apache.commons.net.util", "KeyManagerUtils", false, "createClientKeyManager", "(File,String,String)", "", "Argument[0]", "path-injection[read]", "df-manual"] + - ["org.apache.commons.net.util", "KeyManagerUtils", false, "createClientKeyManager", "(String,File,String,String,String)", "", "Argument[1]", "path-injection[read]", "df-manual"] - addsTo: pack: codeql/java-all extensible: sourceModel diff --git a/java/ql/lib/ext/org.apache.tools.ant.model.yml b/java/ql/lib/ext/org.apache.tools.ant.model.yml index 474429db030f..cd1b6e198a46 100644 --- a/java/ql/lib/ext/org.apache.tools.ant.model.yml +++ b/java/ql/lib/ext/org.apache.tools.ant.model.yml @@ -3,8 +3,8 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["org.apache.tools.ant", "AntClassLoader", True, "addPathComponent", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["org.apache.tools.ant", "AntClassLoader", True, "AntClassLoader", "(ClassLoader,Project,Path,boolean)", "", "Argument[2]", "path-injection", "ai-manual"] - - ["org.apache.tools.ant", "AntClassLoader", True, "AntClassLoader", "(Project,Path,boolean)", "", "Argument[1]", "path-injection", "ai-manual"] - - ["org.apache.tools.ant", "AntClassLoader", True, "AntClassLoader", "(Project,Path)", "", "Argument[1]", "path-injection", "ai-manual"] - - ["org.apache.tools.ant", "DirectoryScanner", True, "setBasedir", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.apache.tools.ant", "AntClassLoader", True, "addPathComponent", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["org.apache.tools.ant", "AntClassLoader", True, "AntClassLoader", "(ClassLoader,Project,Path,boolean)", "", "Argument[2]", "path-injection[read]", "ai-manual"] + - ["org.apache.tools.ant", "AntClassLoader", True, "AntClassLoader", "(Project,Path,boolean)", "", "Argument[1]", "path-injection[read]", "ai-manual"] + - ["org.apache.tools.ant", "AntClassLoader", True, "AntClassLoader", "(Project,Path)", "", "Argument[1]", "path-injection[read]", "ai-manual"] + - ["org.apache.tools.ant", "DirectoryScanner", True, "setBasedir", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] diff --git a/java/ql/lib/ext/org.apache.tools.ant.taskdefs.model.yml b/java/ql/lib/ext/org.apache.tools.ant.taskdefs.model.yml index 2695c2881f76..5d930f387e9f 100644 --- a/java/ql/lib/ext/org.apache.tools.ant.taskdefs.model.yml +++ b/java/ql/lib/ext/org.apache.tools.ant.taskdefs.model.yml @@ -3,12 +3,12 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["org.apache.tools.ant.taskdefs", "Copy", True, "addFileset", "(FileSet)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["org.apache.tools.ant.taskdefs", "Copy", True, "setFile", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.apache.tools.ant.taskdefs", "Copy", True, "addFileset", "(FileSet)", "", "Argument[0]", "path-injection[read]", "ai-manual"] + - ["org.apache.tools.ant.taskdefs", "Copy", True, "setFile", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["org.apache.tools.ant.taskdefs", "Copy", True, "setTodir", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["org.apache.tools.ant.taskdefs", "Copy", True, "setTofile", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - ["org.apache.tools.ant.taskdefs", "Execute", False, "runCommand", "(Task,String[])", "", "Argument[1]", "command-injection", "ai-manual"] - ["org.apache.tools.ant.taskdefs", "Expand", True, "setDest", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] - - ["org.apache.tools.ant.taskdefs", "Expand", True, "setSrc", "(File)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.apache.tools.ant.taskdefs", "Expand", True, "setSrc", "(File)", "", "Argument[0]", "path-injection[read]", "ai-manual"] - ["org.apache.tools.ant.taskdefs", "Property", True, "setFile", "(File)", "", "Argument[0]", "path-injection", "manual"] - ["org.apache.tools.ant.taskdefs", "Property", True, "setResource", "(String)", "", "Argument[0]", "path-injection", "manual"] diff --git a/java/ql/lib/ext/org.kohsuke.stapler.framework.io.model.yml b/java/ql/lib/ext/org.kohsuke.stapler.framework.io.model.yml index 49cd049cdfab..de662c040115 100644 --- a/java/ql/lib/ext/org.kohsuke.stapler.framework.io.model.yml +++ b/java/ql/lib/ext/org.kohsuke.stapler.framework.io.model.yml @@ -3,4 +3,4 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["org.kohsuke.stapler.framework.io", "LargeText", True, "LargeText", "(File,Charset,boolean,boolean)", "", "Argument[0]", "path-injection", "ai-manual"] + - ["org.kohsuke.stapler.framework.io", "LargeText", True, "LargeText", "(File,Charset,boolean,boolean)", "", "Argument[0]", "path-injection[read]", "ai-manual"] diff --git a/java/ql/lib/ext/org.springframework.util.model.yml b/java/ql/lib/ext/org.springframework.util.model.yml index fffcebb72f88..a3c5e7448d8a 100644 --- a/java/ql/lib/ext/org.springframework.util.model.yml +++ b/java/ql/lib/ext/org.springframework.util.model.yml @@ -4,7 +4,7 @@ extensions: extensible: sinkModel data: - ["org.springframework.util", "FileCopyUtils", False, "copy", "(byte[],File)", "", "Argument[1]", "path-injection", "manual"] - - ["org.springframework.util", "FileCopyUtils", False, "copy", "(File,File)", "", "Argument[0]", "path-injection", "manual"] + - ["org.springframework.util", "FileCopyUtils", False, "copy", "(File,File)", "", "Argument[0]", "path-injection[read]", "manual"] - ["org.springframework.util", "FileCopyUtils", False, "copy", "(File,File)", "", "Argument[1]", "path-injection", "manual"] - addsTo: diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index e57412ee1fc3..e5ebb1d2131c 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.1.0 +version: 9.1.1-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 a1e071df10c4..27f0102b3cfb 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -153,10 +153,10 @@ private module Ast implements AstSig { } class Case extends AstNode instanceof J::SwitchCase { - /** Gets a pattern being matched by this case. */ - AstNode getAPattern() { - result = this.(PatternCase).getAPattern() or - result = this.(ConstCase).getValue(_) + /** Gets the pattern being matched by this case at the specified (zero-based) `index`. */ + AstNode getPattern(int index) { + result = this.(PatternCase).getPattern(index) or + result = this.(ConstCase).getValue(index) } /** Gets the guard expression of this case, if any. */ diff --git a/java/ql/lib/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll index 23088bd2f809..56dc9aa55e50 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Guards.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Guards.qll @@ -168,14 +168,20 @@ private module GuardsInput implements SharedGuards::InputSig; /** * A sink that represents a file creation, such as a file write, copy or move operation. + * + * This deliberately selects only the `path-injection` sink kind and excludes + * `path-injection[read]`: Zip Slip is an archive-extraction vulnerability, so + * read-only path sinks (for example `ClassLoader.getResource`, + * `FileInputStream`, and `FileReader`) are outside the threat model. */ private class FileCreationSink extends DataFlow::Node { FileCreationSink() { sinkNode(this, "path-injection") } diff --git a/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp b/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp index bf7205d535ff..a6d2d9936a5f 100644 --- a/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp +++ b/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp @@ -5,26 +5,37 @@

Deserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable -and in many cases allows an attacker to execute arbitrary code. Even before a +and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, -and finalizers. Automatic deserialization of fields means that an attacker may +and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code.

-There are many different serialization frameworks. This query currently +There are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, Jackson, Jabsorb, Jodd JSON, Flexjson, Gson, JMS, and Java IO serialization through ObjectInputStream/ObjectOutputStream.

+

+Note that a deserialization method is only dangerous if it can instantiate +arbitrary classes. Serialization frameworks that use a schema to instantiate +only expected, predefined types are generally not tracked by this query. For +example, Apache Avro's deserialization methods follow a schema and are +therefore generally safe with respect to arbitrary-class-instantiation and +gadget-chain attacks when the schema is trusted and does not permit +user-controlled type resolution. However, care must be taken to ensure the schema +strictly limits the allowed types. Permitting common standard library classes +can still leave the application vulnerable to gadget-chain attacks. +

-Avoid deserialization of untrusted data if at all possible. If the +Avoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, -for example JSON or XML. However, these formats should not be deserialized +for example JSON or XML. However, these formats should not be deserialized into complex objects because this provides further opportunities for attack. For example, XML-based deserialization attacks are possible through libraries such as XStream and XmlDecoder. @@ -43,7 +54,7 @@ Recommendations specific to particular frameworks supported by this query:

  • Recommendation: Call com.alibaba.fastjson.parser.ParserConfig#setSafeMode with the argument true before deserializing untrusted data.
  • -

    FasterXML - com.fasterxml.jackson.core:jackson-databind

    +

    FasterXML - com.fasterxml.jackson.core:jackson-databind

    • Secure by Default: Yes
    • Recommendation: Don't call com.fasterxml.jackson.databind.ObjectMapper#enableDefaultTyping and don't annotate any object fields with com.fasterxml.jackson.annotation.JsonTypeInfo passing either the CLASS or MINIMAL_CLASS values to the annotation. @@ -56,16 +67,16 @@ Recommendations specific to particular frameworks supported by this query:
    • Recommendation: Don't call com.esotericsoftware.kryo(5).Kryo#setRegistrationRequired with the argument false on any Kryo instance that may deserialize untrusted data.

    -

    ObjectInputStream - Java Standard Library

    +

    ObjectInputStream - Java Standard Library

    • Secure by Default: No
    • -
    • Recommendation: Use a validating input stream, such as org.apache.commons.io.serialization.ValidatingObjectInputStream.
    • +
    • Recommendation: Use a validating input stream, such as org.apache.commons.io.serialization.ValidatingObjectInputStream.

    SnakeYAML - org.yaml:snakeyaml

    • Secure by Default: As of version 2.0.
    • -
    • Recommendation: For versions before 2.0, pass an instance of org.yaml.snakeyaml.constructor.SafeConstructor to org.yaml.snakeyaml.Yaml's constructor before using it to deserialize untrusted data.
    • +
    • Recommendation: For versions before 2.0, pass an instance of org.yaml.snakeyaml.constructor.SafeConstructor to org.yaml.snakeyaml.Yaml's constructor before using it to deserialize untrusted data.

    XML Decoder - Standard Java Library

    diff --git a/java/ql/src/change-notes/2026-04-21-zipslip-exclude-read-sinks.md b/java/ql/src/change-notes/2026-04-21-zipslip-exclude-read-sinks.md new file mode 100644 index 000000000000..ee6889240526 --- /dev/null +++ b/java/ql/src/change-notes/2026-04-21-zipslip-exclude-read-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `java/zipslip` query no longer reports archive entry names that flow only to read-only path sinks such as `ClassLoader.getResource`, `FileInputStream`, and `FileReader`. The query now restricts its sinks to the `path-injection` kind and deliberately excludes the new `path-injection[read]` sub-kind, matching the Zip Slip threat model of unsafe archive extraction. diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index bdaaf77ec9e2..3776af914c2c 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.2 +version: 1.11.3-dev groups: - java - queries diff --git a/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected index 9ddb20829483..e1567af8ada1 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected +++ b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected @@ -9,8 +9,8 @@ edges | FilePathInjection.java:209:24:209:31 | filePath : String | FilePathInjection.java:209:15:209:32 | new File(...) : File | provenance | MaD:6 | | FilePathInjection.java:217:19:217:22 | file : File | FilePathInjection.java:177:50:177:58 | file : File | provenance | | models -| 1 | Sink: java.io; File; true; exists; (); ; Argument[this]; path-injection; manual | -| 2 | Sink: java.io; FileInputStream; true; FileInputStream; (File); ; Argument[0]; path-injection; ai-manual | +| 1 | Sink: java.io; File; true; exists; (); ; Argument[this]; path-injection[read]; manual | +| 2 | Sink: java.io; FileInputStream; true; FileInputStream; (File); ; Argument[0]; path-injection[read]; ai-manual | | 3 | Sink: java.io; FileOutputStream; false; FileOutputStream; ; ; Argument[0]; path-injection; manual | | 4 | Source: com.jfinal.core; Controller; true; getPara; ; ; ReturnValue; remote; manual | | 5 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | diff --git a/java/ql/test/library-tests/guards/guardslogic.expected b/java/ql/test/library-tests/guards/guardslogic.expected index f186c385b8ce..3a4aeeeef7be 100644 --- a/java/ql/test/library-tests/guards/guardslogic.expected +++ b/java/ql/test/library-tests/guards/guardslogic.expected @@ -19,15 +19,15 @@ | Logic.java:17:11:17:15 | ... > ... | false | Logic.java:15:29:15:29 | i | | Logic.java:17:11:17:15 | ... > ... | true | Logic.java:17:18:17:23 | break | | Logic.java:19:9:19:12 | g(...) | false | Logic.java:24:7:24:17 | case ... | -| Logic.java:19:9:19:12 | g(...) | false | Logic.java:24:12:24:16 | "foo" | +| Logic.java:19:9:19:12 | g(...) | false | Logic.java:25:9:25:14 | break | | Logic.java:19:9:19:12 | g(...) | false | Logic.java:26:7:26:14 | default | | Logic.java:19:9:19:12 | g(...) | true | Logic.java:20:7:20:16 | ; | | Logic.java:22:7:22:17 | case ... | false | Logic.java:24:7:24:17 | case ... | -| Logic.java:22:7:22:17 | case ... | false | Logic.java:24:12:24:16 | "foo" | +| Logic.java:22:7:22:17 | case ... | false | Logic.java:25:9:25:14 | break | | Logic.java:22:7:22:17 | case ... | false | Logic.java:26:7:26:14 | default | -| Logic.java:22:7:22:17 | case ... | true | Logic.java:22:12:22:16 | "bar" | +| Logic.java:22:7:22:17 | case ... | true | Logic.java:23:9:23:14 | break | | Logic.java:24:7:24:17 | case ... | false | Logic.java:26:7:26:14 | default | -| Logic.java:24:7:24:17 | case ... | true | Logic.java:24:12:24:16 | "foo" | +| Logic.java:24:7:24:17 | case ... | true | Logic.java:25:9:25:14 | break | | Logic.java:29:16:29:19 | g(...) | false | Logic.java:29:30:29:30 | s | | Logic.java:29:16:29:19 | g(...) | false | Logic.java:30:30:31:5 | { ... } | | Logic.java:29:16:29:19 | g(...) | true | Logic.java:29:23:29:26 | null | diff --git a/java/ql/test/library-tests/guards12/guard.expected b/java/ql/test/library-tests/guards12/guard.expected index e12bf8c6edb6..f88b560c9a40 100644 --- a/java/ql/test/library-tests/guards12/guard.expected +++ b/java/ql/test/library-tests/guards12/guard.expected @@ -1,80 +1,76 @@ hasBranchEdge -| Test.java:4:7:4:22 | case ... | Test.java:2:39:36:3 | { ... } | Test.java:4:7:4:22 | After case ... [match] | true | -| Test.java:4:7:4:22 | case ... | Test.java:2:39:36:3 | { ... } | Test.java:5:7:5:17 | case ... | false | -| Test.java:5:7:5:17 | case ... | Test.java:5:7:5:17 | case ... | Test.java:5:12:5:14 | "c" | true | +| Test.java:5:7:5:17 | case ... | Test.java:5:7:5:17 | case ... | Test.java:5:19:5:19 | 2 | true | | Test.java:5:7:5:17 | case ... | Test.java:5:7:5:17 | case ... | Test.java:6:7:6:17 | case ... | false | -| Test.java:6:7:6:17 | case ... | Test.java:6:7:6:17 | case ... | Test.java:6:12:6:14 | "d" | true | +| Test.java:6:7:6:17 | case ... | Test.java:6:7:6:17 | case ... | Test.java:6:19:6:19 | 2 | true | | Test.java:6:7:6:17 | case ... | Test.java:6:7:6:17 | case ... | Test.java:7:7:7:16 | default | false | -| Test.java:10:7:10:22 | case ... | Test.java:3:9:3:21 | x | Test.java:10:7:10:22 | After case ... [match] | true | -| Test.java:10:7:10:22 | case ... | Test.java:3:9:3:21 | x | Test.java:11:7:11:17 | case ... | false | -| Test.java:11:7:11:17 | case ... | Test.java:11:7:11:17 | case ... | Test.java:11:12:11:14 | "c" | true | +| Test.java:11:7:11:17 | case ... | Test.java:11:7:11:17 | case ... | Test.java:11:19:11:21 | { ... } | true | | Test.java:11:7:11:17 | case ... | Test.java:11:7:11:17 | case ... | Test.java:12:7:12:17 | case ... | false | -| Test.java:12:7:12:17 | case ... | Test.java:12:7:12:17 | case ... | Test.java:12:12:12:14 | "d" | true | +| Test.java:12:7:12:17 | case ... | Test.java:12:7:12:17 | case ... | Test.java:12:19:12:21 | { ... } | true | | Test.java:12:7:12:17 | case ... | Test.java:12:7:12:17 | case ... | Test.java:13:7:13:16 | default | false | -| Test.java:17:7:17:36 | case | Test.java:15:5:15:25 | var ...; | Test.java:17:7:17:36 | After case [no-match] | false | -| Test.java:17:7:17:36 | case | Test.java:15:5:15:25 | var ...; | Test.java:17:19:17:19 | | true | -| Test.java:17:26:17:33 | ... == ... | Test.java:17:19:17:19 | | Test.java:17:26:17:33 | After ... == ... [false] | false | -| Test.java:17:26:17:33 | ... == ... | Test.java:17:19:17:19 | | Test.java:17:38:17:40 | { ... } | true | -| Test.java:18:7:18:17 | case ... | Test.java:18:7:18:17 | case ... | Test.java:18:12:18:14 | "e" | true | +| Test.java:17:7:17:36 | case | Test.java:15:5:15:25 | var ...; | Test.java:17:19:17:19 | After [no-match] | false | +| Test.java:17:7:17:36 | case | Test.java:15:5:15:25 | var ...; | Test.java:17:26:17:28 | len | true | +| Test.java:17:26:17:33 | ... == ... | Test.java:17:26:17:28 | len | Test.java:17:26:17:33 | After ... == ... [false] | false | +| Test.java:17:26:17:33 | ... == ... | Test.java:17:26:17:28 | len | Test.java:17:38:17:40 | { ... } | true | +| Test.java:18:7:18:17 | case ... | Test.java:18:7:18:17 | case ... | Test.java:18:19:18:21 | { ... } | true | | Test.java:18:7:18:17 | case ... | Test.java:18:7:18:17 | case ... | Test.java:19:7:19:16 | default | false | | Test.java:21:13:21:19 | unknown | Test.java:21:5:21:42 | switch (...) | Test.java:21:23:21:23 | s | true | | Test.java:21:13:21:19 | unknown | Test.java:21:5:21:42 | switch (...) | Test.java:21:27:21:27 | s | false | -| Test.java:22:7:22:17 | case ... | Test.java:22:7:22:17 | case ... | Test.java:22:12:22:14 | "f" | true | +| Test.java:22:7:22:17 | case ... | Test.java:22:7:22:17 | case ... | Test.java:22:19:22:21 | { ... } | true | | Test.java:22:7:22:17 | case ... | Test.java:22:7:22:17 | case ... | Test.java:23:7:23:37 | case | false | -| Test.java:23:7:23:37 | case | Test.java:23:7:23:37 | case | Test.java:23:7:23:37 | After case [no-match] | false | -| Test.java:23:7:23:37 | case | Test.java:23:7:23:37 | case | Test.java:23:19:23:20 | s2 | true | -| Test.java:23:27:23:34 | ... == ... | Test.java:23:19:23:20 | s2 | Test.java:23:27:23:34 | After ... == ... [false] | false | -| Test.java:23:27:23:34 | ... == ... | Test.java:23:19:23:20 | s2 | Test.java:23:39:23:41 | { ... } | true | -| Test.java:24:7:24:17 | case ... | Test.java:24:7:24:17 | case ... | Test.java:24:12:24:14 | "g" | true | +| Test.java:23:7:23:37 | case | Test.java:23:7:23:37 | case | Test.java:23:19:23:20 | After s2 [no-match] | false | +| Test.java:23:7:23:37 | case | Test.java:23:7:23:37 | case | Test.java:23:27:23:29 | len | true | +| Test.java:23:27:23:34 | ... == ... | Test.java:23:27:23:29 | len | Test.java:23:27:23:34 | After ... == ... [false] | false | +| Test.java:23:27:23:34 | ... == ... | Test.java:23:27:23:29 | len | Test.java:23:39:23:41 | { ... } | true | +| Test.java:24:7:24:17 | case ... | Test.java:24:7:24:17 | case ... | Test.java:24:19:24:21 | { ... } | true | | Test.java:24:7:24:17 | case ... | Test.java:24:7:24:17 | case ... | Test.java:25:7:25:16 | default | false | -| Test.java:28:7:28:15 | case ... | Test.java:27:5:27:14 | switch (...) | Test.java:28:12:28:14 | "h" | true | +| Test.java:28:7:28:15 | case ... | Test.java:27:5:27:14 | switch (...) | Test.java:28:12:28:14 | After "h" [match] | true | | Test.java:28:7:28:15 | case ... | Test.java:27:5:27:14 | switch (...) | Test.java:29:7:29:34 | case | false | -| Test.java:29:7:29:34 | case | Test.java:29:7:29:34 | case | Test.java:29:7:29:34 | After case [no-match] | false | -| Test.java:29:7:29:34 | case | Test.java:29:7:29:34 | case | Test.java:29:19:29:19 | | true | -| Test.java:29:26:29:33 | ... == ... | Test.java:29:19:29:19 | | Test.java:29:26:29:33 | After ... == ... [false] | false | -| Test.java:29:26:29:33 | ... == ... | Test.java:29:19:29:19 | | Test.java:29:26:29:33 | After ... == ... [true] | true | -| Test.java:30:7:30:15 | case ... | Test.java:30:7:30:15 | case ... | Test.java:30:12:30:14 | "i" | true | +| Test.java:29:7:29:34 | case | Test.java:29:7:29:34 | case | Test.java:29:19:29:19 | After [no-match] | false | +| Test.java:29:7:29:34 | case | Test.java:29:7:29:34 | case | Test.java:29:26:29:28 | len | true | +| Test.java:29:26:29:33 | ... == ... | Test.java:29:26:29:28 | len | Test.java:29:26:29:33 | After ... == ... [false] | false | +| Test.java:29:26:29:33 | ... == ... | Test.java:29:26:29:28 | len | Test.java:29:26:29:33 | After ... == ... [true] | true | +| Test.java:30:7:30:15 | case ... | Test.java:30:7:30:15 | case ... | Test.java:30:12:30:14 | After "i" [match] | true | | Test.java:30:7:30:15 | case ... | Test.java:30:7:30:15 | case ... | Test.java:33:7:33:14 | default | false | #select | Test.java:5:7:5:17 | case ... | Test.java:3:20:3:20 | s | Test.java:5:12:5:14 | "c" | true | false | Test.java:6:7:6:17 | case ... | -| Test.java:5:7:5:17 | case ... | Test.java:3:20:3:20 | s | Test.java:5:12:5:14 | "c" | true | false | Test.java:6:12:6:14 | "d" | +| Test.java:5:7:5:17 | case ... | Test.java:3:20:3:20 | s | Test.java:5:12:5:14 | "c" | true | false | Test.java:6:19:6:19 | 2 | | Test.java:5:7:5:17 | case ... | Test.java:3:20:3:20 | s | Test.java:5:12:5:14 | "c" | true | false | Test.java:7:7:7:16 | default | -| Test.java:5:7:5:17 | case ... | Test.java:3:20:3:20 | s | Test.java:5:12:5:14 | "c" | true | true | Test.java:5:12:5:14 | "c" | +| Test.java:5:7:5:17 | case ... | Test.java:3:20:3:20 | s | Test.java:5:12:5:14 | "c" | true | true | Test.java:5:19:5:19 | 2 | | Test.java:6:7:6:17 | case ... | Test.java:3:20:3:20 | s | Test.java:6:12:6:14 | "d" | true | false | Test.java:7:7:7:16 | default | -| Test.java:6:7:6:17 | case ... | Test.java:3:20:3:20 | s | Test.java:6:12:6:14 | "d" | true | true | Test.java:6:12:6:14 | "d" | +| Test.java:6:7:6:17 | case ... | Test.java:3:20:3:20 | s | Test.java:6:12:6:14 | "d" | true | true | Test.java:6:19:6:19 | 2 | | Test.java:11:7:11:17 | case ... | Test.java:9:13:9:13 | s | Test.java:11:12:11:14 | "c" | true | false | Test.java:12:7:12:17 | case ... | -| Test.java:11:7:11:17 | case ... | Test.java:9:13:9:13 | s | Test.java:11:12:11:14 | "c" | true | false | Test.java:12:12:12:14 | "d" | +| Test.java:11:7:11:17 | case ... | Test.java:9:13:9:13 | s | Test.java:11:12:11:14 | "c" | true | false | Test.java:12:19:12:21 | { ... } | | Test.java:11:7:11:17 | case ... | Test.java:9:13:9:13 | s | Test.java:11:12:11:14 | "c" | true | false | Test.java:13:7:13:16 | default | -| Test.java:11:7:11:17 | case ... | Test.java:9:13:9:13 | s | Test.java:11:12:11:14 | "c" | true | true | Test.java:11:12:11:14 | "c" | +| Test.java:11:7:11:17 | case ... | Test.java:9:13:9:13 | s | Test.java:11:12:11:14 | "c" | true | true | Test.java:11:19:11:21 | { ... } | | Test.java:12:7:12:17 | case ... | Test.java:9:13:9:13 | s | Test.java:12:12:12:14 | "d" | true | false | Test.java:13:7:13:16 | default | -| Test.java:12:7:12:17 | case ... | Test.java:9:13:9:13 | s | Test.java:12:12:12:14 | "d" | true | true | Test.java:12:12:12:14 | "d" | +| Test.java:12:7:12:17 | case ... | Test.java:9:13:9:13 | s | Test.java:12:12:12:14 | "d" | true | true | Test.java:12:19:12:21 | { ... } | | Test.java:17:26:17:33 | ... == ... | Test.java:17:26:17:28 | len | Test.java:17:33:17:33 | 4 | true | false | Test.java:17:26:17:33 | After ... == ... [false] | | Test.java:17:26:17:33 | ... == ... | Test.java:17:26:17:28 | len | Test.java:17:33:17:33 | 4 | true | true | Test.java:17:38:17:40 | { ... } | | Test.java:18:7:18:17 | case ... | Test.java:16:13:16:13 | s | Test.java:18:12:18:14 | "e" | true | false | Test.java:19:7:19:16 | default | -| Test.java:18:7:18:17 | case ... | Test.java:16:13:16:13 | s | Test.java:18:12:18:14 | "e" | true | true | Test.java:18:12:18:14 | "e" | -| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:7:23:37 | After case [no-match] | +| Test.java:18:7:18:17 | case ... | Test.java:16:13:16:13 | s | Test.java:18:12:18:14 | "e" | true | true | Test.java:18:19:18:21 | { ... } | | Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:7:23:37 | case | -| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:19:23:20 | s2 | +| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:19:23:20 | After s2 [no-match] | +| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:27:23:29 | len | | Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:27:23:34 | After ... == ... [false] | | Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:23:39:23:41 | { ... } | | Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:24:7:24:17 | case ... | -| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:24:12:24:14 | "g" | +| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:24:19:24:21 | { ... } | | Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | false | Test.java:25:7:25:16 | default | -| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | true | Test.java:22:12:22:14 | "f" | +| Test.java:22:7:22:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:22:12:22:14 | "f" | true | true | Test.java:22:19:22:21 | { ... } | | Test.java:23:27:23:34 | ... == ... | Test.java:23:27:23:29 | len | Test.java:23:34:23:34 | 4 | true | false | Test.java:23:27:23:34 | After ... == ... [false] | | Test.java:23:27:23:34 | ... == ... | Test.java:23:27:23:29 | len | Test.java:23:34:23:34 | 4 | true | true | Test.java:23:39:23:41 | { ... } | | Test.java:24:7:24:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:24:12:24:14 | "g" | true | false | Test.java:25:7:25:16 | default | -| Test.java:24:7:24:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:24:12:24:14 | "g" | true | true | Test.java:24:12:24:14 | "g" | -| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:7:29:34 | After case [no-match] | +| Test.java:24:7:24:17 | case ... | Test.java:21:13:21:41 | ...?...:... | Test.java:24:12:24:14 | "g" | true | true | Test.java:24:19:24:21 | { ... } | | Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:7:29:34 | case | -| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:19:29:19 | | +| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:19:29:19 | After [no-match] | +| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:26:29:28 | len | | Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:26:29:33 | After ... == ... [false] | | Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:29:26:29:33 | After ... == ... [true] | | Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:30:7:30:15 | case ... | -| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:30:12:30:14 | "i" | +| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:30:12:30:14 | After "i" [match] | | Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | false | Test.java:33:7:33:14 | default | -| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | true | Test.java:28:12:28:14 | "h" | +| Test.java:28:7:28:15 | case ... | Test.java:27:13:27:13 | s | Test.java:28:12:28:14 | "h" | true | true | Test.java:28:12:28:14 | After "h" [match] | | Test.java:29:26:29:33 | ... == ... | Test.java:29:26:29:28 | len | Test.java:29:33:29:33 | 4 | true | false | Test.java:29:26:29:33 | After ... == ... [false] | | Test.java:29:26:29:33 | ... == ... | Test.java:29:26:29:28 | len | Test.java:29:33:29:33 | 4 | true | true | Test.java:29:26:29:33 | After ... == ... [true] | | Test.java:30:7:30:15 | case ... | Test.java:27:13:27:13 | s | Test.java:30:12:30:14 | "i" | true | false | Test.java:33:7:33:14 | default | -| Test.java:30:7:30:15 | case ... | Test.java:27:13:27:13 | s | Test.java:30:12:30:14 | "i" | true | true | Test.java:30:12:30:14 | "i" | +| Test.java:30:7:30:15 | case ... | Test.java:27:13:27:13 | s | Test.java:30:12:30:14 | "i" | true | true | Test.java:30:12:30:14 | After "i" [match] | diff --git a/java/ql/test/library-tests/pattern-switch/cfg/test.expected b/java/ql/test/library-tests/pattern-switch/cfg/test.expected index d398c5f6ecd3..1abd0419db0c 100644 --- a/java/ql/test/library-tests/pattern-switch/cfg/test.expected +++ b/java/ql/test/library-tests/pattern-switch/cfg/test.expected @@ -35,8 +35,8 @@ | Exhaustive.java:11:5:11:14 | switch (...) | Exhaustive.java:11:13:11:13 | o | | Exhaustive.java:11:13:11:13 | o | Exhaustive.java:12:7:12:22 | case | | Exhaustive.java:12:7:12:22 | case | Exhaustive.java:12:19:12:19 | s | -| Exhaustive.java:12:7:12:22 | case | Exhaustive.java:13:7:13:23 | case | | Exhaustive.java:12:19:12:19 | s | Exhaustive.java:12:24:12:26 | { ... } | +| Exhaustive.java:12:19:12:19 | s | Exhaustive.java:13:7:13:23 | case | | Exhaustive.java:12:24:12:26 | { ... } | Exhaustive.java:18:5:18:14 | switch (...) | | Exhaustive.java:13:7:13:23 | case | Exhaustive.java:13:19:13:20 | o2 | | Exhaustive.java:13:19:13:20 | o2 | Exhaustive.java:13:25:13:27 | { ... } | @@ -44,22 +44,22 @@ | Exhaustive.java:18:5:18:14 | switch (...) | Exhaustive.java:18:13:18:13 | e | | Exhaustive.java:18:13:18:13 | e | Exhaustive.java:19:7:19:15 | case ... | | Exhaustive.java:19:7:19:15 | case ... | Exhaustive.java:19:12:19:12 | A | -| Exhaustive.java:19:7:19:15 | case ... | Exhaustive.java:20:7:20:15 | case ... | | Exhaustive.java:19:12:19:12 | A | Exhaustive.java:19:17:19:19 | { ... } | +| Exhaustive.java:19:12:19:12 | A | Exhaustive.java:20:7:20:15 | case ... | | Exhaustive.java:19:17:19:19 | { ... } | Exhaustive.java:24:5:24:14 | switch (...) | | Exhaustive.java:20:7:20:15 | case ... | Exhaustive.java:20:12:20:12 | B | -| Exhaustive.java:20:7:20:15 | case ... | Exhaustive.java:21:7:21:15 | case ... | | Exhaustive.java:20:12:20:12 | B | Exhaustive.java:20:17:20:19 | { ... } | +| Exhaustive.java:20:12:20:12 | B | Exhaustive.java:21:7:21:15 | case ... | | Exhaustive.java:20:17:20:19 | { ... } | Exhaustive.java:24:5:24:14 | switch (...) | | Exhaustive.java:21:7:21:15 | case ... | Exhaustive.java:21:12:21:12 | C | -| Exhaustive.java:21:7:21:15 | case ... | Exhaustive.java:24:5:24:14 | switch (...) | | Exhaustive.java:21:12:21:12 | C | Exhaustive.java:21:17:21:19 | { ... } | +| Exhaustive.java:21:12:21:12 | C | Exhaustive.java:24:5:24:14 | switch (...) | | Exhaustive.java:21:17:21:19 | { ... } | Exhaustive.java:24:5:24:14 | switch (...) | | Exhaustive.java:24:5:24:14 | switch (...) | Exhaustive.java:24:13:24:13 | i | | Exhaustive.java:24:13:24:13 | i | Exhaustive.java:25:7:25:17 | case | | Exhaustive.java:25:7:25:17 | case | Exhaustive.java:25:14:25:14 | x | -| Exhaustive.java:25:7:25:17 | case | Exhaustive.java:26:7:26:17 | case | | Exhaustive.java:25:14:25:14 | x | Exhaustive.java:25:19:25:21 | { ... } | +| Exhaustive.java:25:14:25:14 | x | Exhaustive.java:26:7:26:17 | case | | Exhaustive.java:25:19:25:21 | { ... } | Exhaustive.java:30:5:30:14 | switch (...) | | Exhaustive.java:26:7:26:17 | case | Exhaustive.java:26:14:26:14 | y | | Exhaustive.java:26:14:26:14 | y | Exhaustive.java:26:19:26:21 | { ... } | @@ -67,8 +67,8 @@ | Exhaustive.java:30:5:30:14 | switch (...) | Exhaustive.java:30:13:30:13 | i | | Exhaustive.java:30:13:30:13 | i | Exhaustive.java:31:7:31:15 | case | | Exhaustive.java:31:7:31:15 | case | Exhaustive.java:31:14:31:14 | | -| Exhaustive.java:31:7:31:15 | case | Exhaustive.java:32:7:32:15 | case | | Exhaustive.java:31:14:31:14 | | Exhaustive.java:8:22:8:25 | Normal Exit | +| Exhaustive.java:31:14:31:14 | | Exhaustive.java:32:7:32:15 | case | | Exhaustive.java:32:7:32:15 | case | Exhaustive.java:32:14:32:14 | | | Exhaustive.java:32:14:32:14 | | Exhaustive.java:8:22:8:25 | Normal Exit | | Test.java:1:14:1:17 | Entry | Test.java:1:14:1:17 | { ... } | @@ -81,14 +81,14 @@ | Test.java:5:6:5:19 | switch (...) | Test.java:5:14:5:18 | thing | | Test.java:5:14:5:18 | thing | Test.java:6:8:6:23 | case | | Test.java:6:8:6:23 | case | Test.java:6:20:6:20 | s | -| Test.java:6:8:6:23 | case | Test.java:7:8:7:24 | case | | Test.java:6:20:6:20 | s | Test.java:6:25:6:34 | System.out | +| Test.java:6:20:6:20 | s | Test.java:7:8:7:24 | case | | Test.java:6:25:6:34 | System.out | Test.java:6:44:6:44 | s | | Test.java:6:25:6:45 | println(...) | Test.java:11:6:11:19 | switch (...) | | Test.java:6:44:6:44 | s | Test.java:6:25:6:45 | println(...) | | Test.java:7:8:7:24 | case | Test.java:7:21:7:21 | i | -| Test.java:7:8:7:24 | case | Test.java:8:8:8:17 | default | | Test.java:7:21:7:21 | i | Test.java:7:26:7:35 | System.out | +| Test.java:7:21:7:21 | i | Test.java:8:8:8:17 | default | | Test.java:7:26:7:35 | System.out | Test.java:7:45:7:58 | "An integer: " | | Test.java:7:26:7:63 | println(...) | Test.java:11:6:11:19 | switch (...) | | Test.java:7:45:7:58 | "An integer: " | Test.java:7:62:7:62 | i | @@ -99,16 +99,16 @@ | Test.java:11:6:11:19 | switch (...) | Test.java:11:14:11:18 | thing | | Test.java:11:14:11:18 | thing | Test.java:12:8:12:21 | case | | Test.java:12:8:12:21 | case | Test.java:12:20:12:20 | s | -| Test.java:12:8:12:21 | case | Test.java:15:8:15:22 | case | | Test.java:12:20:12:20 | s | Test.java:13:10:13:31 | ; | +| Test.java:12:20:12:20 | s | Test.java:15:8:15:22 | case | | Test.java:13:10:13:19 | System.out | Test.java:13:29:13:29 | s | | Test.java:13:10:13:30 | println(...) | Test.java:14:10:14:15 | break | | Test.java:13:10:13:31 | ; | Test.java:13:10:13:19 | System.out | | Test.java:13:29:13:29 | s | Test.java:13:10:13:30 | println(...) | | Test.java:14:10:14:15 | break | Test.java:22:6:26:7 | var ...; | | Test.java:15:8:15:22 | case | Test.java:15:21:15:21 | i | -| Test.java:15:8:15:22 | case | Test.java:18:8:18:15 | default | | Test.java:15:21:15:21 | i | Test.java:16:10:16:47 | ; | +| Test.java:15:21:15:21 | i | Test.java:18:8:18:15 | default | | Test.java:16:10:16:19 | System.out | Test.java:16:29:16:41 | "An integer:" | | Test.java:16:10:16:46 | println(...) | Test.java:17:10:17:15 | break | | Test.java:16:10:16:47 | ; | Test.java:16:10:16:19 | System.out | @@ -123,12 +123,12 @@ | Test.java:22:26:22:38 | switch (...) | Test.java:22:33:22:37 | thing | | Test.java:22:33:22:37 | thing | Test.java:23:8:23:23 | case | | Test.java:23:8:23:23 | case | Test.java:23:20:23:20 | s | -| Test.java:23:8:23:23 | case | Test.java:24:8:24:24 | case | | Test.java:23:20:23:20 | s | Test.java:23:25:23:25 | s | +| Test.java:23:20:23:20 | s | Test.java:24:8:24:24 | case | | Test.java:23:25:23:25 | s | Test.java:22:10:22:38 | thingAsString | | Test.java:24:8:24:24 | case | Test.java:24:21:24:21 | i | -| Test.java:24:8:24:24 | case | Test.java:25:8:25:17 | default | | Test.java:24:21:24:21 | i | Test.java:24:26:24:39 | "An integer: " | +| Test.java:24:21:24:21 | i | Test.java:25:8:25:17 | default | | Test.java:24:26:24:39 | "An integer: " | Test.java:24:43:24:43 | i | | Test.java:24:26:24:43 | ... + ... | Test.java:22:10:22:38 | thingAsString | | Test.java:24:43:24:43 | i | Test.java:24:26:24:43 | ... + ... | @@ -139,13 +139,13 @@ | Test.java:28:27:28:39 | switch (...) | Test.java:28:34:28:38 | thing | | Test.java:28:34:28:38 | thing | Test.java:29:8:29:21 | case | | Test.java:29:8:29:21 | case | Test.java:29:20:29:20 | s | -| Test.java:29:8:29:21 | case | Test.java:31:8:31:22 | case | | Test.java:29:20:29:20 | s | Test.java:30:16:30:16 | s | +| Test.java:29:20:29:20 | s | Test.java:31:8:31:22 | case | | Test.java:30:10:30:17 | yield ... | Test.java:28:10:28:39 | thingAsString2 | | Test.java:30:16:30:16 | s | Test.java:30:10:30:17 | yield ... | | Test.java:31:8:31:22 | case | Test.java:31:21:31:21 | i | -| Test.java:31:8:31:22 | case | Test.java:33:8:33:15 | default | | Test.java:31:21:31:21 | i | Test.java:32:16:32:29 | "An integer: " | +| Test.java:31:21:31:21 | i | Test.java:33:8:33:15 | default | | Test.java:32:10:32:34 | yield ... | Test.java:28:10:28:39 | thingAsString2 | | Test.java:32:16:32:29 | "An integer: " | Test.java:32:33:32:33 | i | | Test.java:32:16:32:33 | ... + ... | Test.java:32:10:32:34 | yield ... | @@ -156,8 +156,8 @@ | Test.java:37:6:37:18 | switch (...) | Test.java:37:13:37:17 | thing | | Test.java:37:13:37:17 | thing | Test.java:38:8:38:42 | case | | Test.java:38:8:38:42 | case | Test.java:38:20:38:20 | s | -| Test.java:38:8:38:42 | case | Test.java:41:8:41:42 | case | | Test.java:38:20:38:20 | s | Test.java:38:27:38:27 | s | +| Test.java:38:20:38:20 | s | Test.java:41:8:41:42 | case | | Test.java:38:27:38:27 | s | Test.java:38:27:38:36 | length(...) | | Test.java:38:27:38:36 | length(...) | Test.java:38:41:38:41 | 3 | | Test.java:38:27:38:41 | ... == ... | Test.java:39:10:39:40 | ; | @@ -169,8 +169,8 @@ | Test.java:39:29:39:38 | "Length 3" | Test.java:39:10:39:39 | println(...) | | Test.java:40:10:40:15 | break | Test.java:49:6:49:18 | switch (...) | | Test.java:41:8:41:42 | case | Test.java:41:20:41:20 | s | -| Test.java:41:8:41:42 | case | Test.java:44:8:44:15 | default | | Test.java:41:20:41:20 | s | Test.java:41:27:41:27 | s | +| Test.java:41:20:41:20 | s | Test.java:44:8:44:15 | default | | Test.java:41:27:41:27 | s | Test.java:41:27:41:36 | length(...) | | Test.java:41:27:41:36 | length(...) | Test.java:41:41:41:41 | 5 | | Test.java:41:27:41:41 | ... == ... | Test.java:42:10:42:40 | ; | @@ -190,8 +190,8 @@ | Test.java:49:6:49:18 | switch (...) | Test.java:49:13:49:17 | thing | | Test.java:49:13:49:17 | thing | Test.java:50:8:50:44 | case | | Test.java:50:8:50:44 | case | Test.java:50:20:50:20 | s | -| Test.java:50:8:50:44 | case | Test.java:51:8:51:44 | case | | Test.java:50:20:50:20 | s | Test.java:50:27:50:27 | s | +| Test.java:50:20:50:20 | s | Test.java:51:8:51:44 | case | | Test.java:50:27:50:27 | s | Test.java:50:27:50:36 | length(...) | | Test.java:50:27:50:36 | length(...) | Test.java:50:41:50:41 | 3 | | Test.java:50:27:50:41 | ... == ... | Test.java:50:46:50:55 | System.out | @@ -201,8 +201,8 @@ | Test.java:50:46:50:75 | println(...) | Test.java:55:6:55:26 | switch (...) | | Test.java:50:65:50:74 | "Length 3" | Test.java:50:46:50:75 | println(...) | | Test.java:51:8:51:44 | case | Test.java:51:20:51:20 | s | -| Test.java:51:8:51:44 | case | Test.java:52:8:52:17 | default | | Test.java:51:20:51:20 | s | Test.java:51:27:51:27 | s | +| Test.java:51:20:51:20 | s | Test.java:52:8:52:17 | default | | Test.java:51:27:51:27 | s | Test.java:51:27:51:36 | length(...) | | Test.java:51:27:51:36 | length(...) | Test.java:51:41:51:41 | 5 | | Test.java:51:27:51:41 | ... == ... | Test.java:51:46:51:55 | System.out | @@ -217,23 +217,23 @@ | Test.java:55:13:55:25 | (...)... | Test.java:56:8:56:21 | case ... | | Test.java:55:21:55:25 | thing | Test.java:55:13:55:25 | (...)... | | Test.java:56:8:56:21 | case ... | Test.java:56:13:56:20 | "Const1" | -| Test.java:56:8:56:21 | case ... | Test.java:58:8:58:21 | case ... | | Test.java:56:13:56:20 | "Const1" | Test.java:57:10:57:44 | ; | +| Test.java:56:13:56:20 | "Const1" | Test.java:58:8:58:21 | case ... | | Test.java:57:10:57:19 | System.out | Test.java:57:29:57:42 | "It's Const1!" | | Test.java:57:10:57:43 | println(...) | Test.java:59:10:59:54 | ; | | Test.java:57:10:57:44 | ; | Test.java:57:10:57:19 | System.out | | Test.java:57:29:57:42 | "It's Const1!" | Test.java:57:10:57:43 | println(...) | | Test.java:58:8:58:21 | case ... | Test.java:58:13:58:20 | "Const2" | -| Test.java:58:8:58:21 | case ... | Test.java:61:8:61:42 | case | | Test.java:58:13:58:20 | "Const2" | Test.java:59:10:59:54 | ; | +| Test.java:58:13:58:20 | "Const2" | Test.java:61:8:61:42 | case | | Test.java:59:10:59:19 | System.out | Test.java:59:29:59:52 | "It's Const1 or Const2!" | | Test.java:59:10:59:53 | println(...) | Test.java:60:10:60:15 | break | | Test.java:59:10:59:54 | ; | Test.java:59:10:59:19 | System.out | | Test.java:59:29:59:52 | "It's Const1 or Const2!" | Test.java:59:10:59:53 | println(...) | | Test.java:60:10:60:15 | break | Test.java:73:6:73:18 | switch (...) | | Test.java:61:8:61:42 | case | Test.java:61:20:61:20 | s | -| Test.java:61:8:61:42 | case | Test.java:63:8:63:21 | case ... | | Test.java:61:20:61:20 | s | Test.java:61:27:61:27 | s | +| Test.java:61:20:61:20 | s | Test.java:63:8:63:21 | case ... | | Test.java:61:27:61:27 | s | Test.java:61:27:61:36 | length(...) | | Test.java:61:27:61:36 | length(...) | Test.java:61:41:61:41 | 6 | | Test.java:61:27:61:41 | ... <= ... | Test.java:62:10:62:83 | ; | @@ -244,16 +244,16 @@ | Test.java:62:10:62:83 | ; | Test.java:62:10:62:19 | System.out | | Test.java:62:29:62:81 | "It's <= 6 chars long, and neither Const1 nor Const2" | Test.java:62:10:62:82 | println(...) | | Test.java:63:8:63:21 | case ... | Test.java:63:13:63:20 | "Const3" | -| Test.java:63:8:63:21 | case ... | Test.java:66:8:66:22 | case ... | | Test.java:63:13:63:20 | "Const3" | Test.java:64:10:64:96 | ; | +| Test.java:63:13:63:20 | "Const3" | Test.java:66:8:66:22 | case ... | | Test.java:64:10:64:19 | System.out | Test.java:64:29:64:94 | "It's (<= 6 chars long, and neither Const1 nor Const2), or Const3" | | Test.java:64:10:64:95 | println(...) | Test.java:65:10:65:15 | break | | Test.java:64:10:64:96 | ; | Test.java:64:10:64:19 | System.out | | Test.java:64:29:64:94 | "It's (<= 6 chars long, and neither Const1 nor Const2), or Const3" | Test.java:64:10:64:95 | println(...) | | Test.java:65:10:65:15 | break | Test.java:73:6:73:18 | switch (...) | | Test.java:66:8:66:22 | case ... | Test.java:66:13:66:21 | "Const30" | -| Test.java:66:8:66:22 | case ... | Test.java:69:8:69:26 | case null, default | | Test.java:66:13:66:21 | "Const30" | Test.java:67:10:67:44 | ; | +| Test.java:66:13:66:21 | "Const30" | Test.java:69:8:69:26 | case null, default | | Test.java:67:10:67:19 | System.out | Test.java:67:29:67:42 | "It's Const30" | | Test.java:67:10:67:43 | println(...) | Test.java:68:10:68:15 | break | | Test.java:67:10:67:44 | ; | Test.java:67:10:67:19 | System.out | @@ -267,24 +267,24 @@ | Test.java:73:6:73:18 | switch (...) | Test.java:73:13:73:17 | thing | | Test.java:73:13:73:17 | thing | Test.java:74:8:74:21 | case | | Test.java:74:8:74:21 | case | Test.java:74:20:74:20 | s | -| Test.java:74:8:74:21 | case | Test.java:77:8:77:17 | case ... | | Test.java:74:20:74:20 | s | Test.java:75:10:75:31 | ; | +| Test.java:74:20:74:20 | s | Test.java:77:8:77:17 | case ... | | Test.java:75:10:75:19 | System.out | Test.java:75:29:75:29 | s | | Test.java:75:10:75:30 | println(...) | Test.java:76:10:76:15 | break | | Test.java:75:10:75:31 | ; | Test.java:75:10:75:19 | System.out | | Test.java:75:29:75:29 | s | Test.java:75:10:75:30 | println(...) | | Test.java:76:10:76:15 | break | Test.java:87:6:87:18 | switch (...) | | Test.java:77:8:77:17 | case ... | Test.java:77:13:77:16 | null | -| Test.java:77:8:77:17 | case ... | Test.java:80:8:80:22 | case | | Test.java:77:13:77:16 | null | Test.java:78:10:78:41 | ; | +| Test.java:77:13:77:16 | null | Test.java:80:8:80:22 | case | | Test.java:78:10:78:19 | System.out | Test.java:78:29:78:39 | "It's null" | | Test.java:78:10:78:40 | println(...) | Test.java:79:10:79:15 | break | | Test.java:78:10:78:41 | ; | Test.java:78:10:78:19 | System.out | | Test.java:78:29:78:39 | "It's null" | Test.java:78:10:78:40 | println(...) | | Test.java:79:10:79:15 | break | Test.java:87:6:87:18 | switch (...) | | Test.java:80:8:80:22 | case | Test.java:80:21:80:21 | i | -| Test.java:80:8:80:22 | case | Test.java:83:8:83:15 | default | | Test.java:80:21:80:21 | i | Test.java:81:10:81:47 | ; | +| Test.java:80:21:80:21 | i | Test.java:83:8:83:15 | default | | Test.java:81:10:81:19 | System.out | Test.java:81:29:81:41 | "An integer:" | | Test.java:81:10:81:46 | println(...) | Test.java:82:10:82:15 | break | | Test.java:81:10:81:47 | ; | Test.java:81:10:81:19 | System.out | @@ -297,8 +297,8 @@ | Test.java:87:6:87:18 | switch (...) | Test.java:87:13:87:17 | thing | | Test.java:87:13:87:17 | thing | Test.java:88:8:88:43 | case | | Test.java:88:8:88:43 | case | Test.java:88:21:88:21 | x | -| Test.java:88:8:88:43 | case | Test.java:90:8:90:15 | default | | Test.java:88:13:88:42 | A(...) | Test.java:89:10:89:15 | break | +| Test.java:88:13:88:42 | A(...) | Test.java:90:8:90:15 | default | | Test.java:88:15:88:32 | B(...) | Test.java:88:41:88:41 | z | | Test.java:88:21:88:21 | x | Test.java:88:31:88:31 | y | | Test.java:88:31:88:31 | y | Test.java:88:15:88:32 | B(...) | @@ -309,8 +309,8 @@ | Test.java:94:6:94:18 | switch (...) | Test.java:94:13:94:17 | thing | | Test.java:94:13:94:17 | thing | Test.java:95:8:95:38 | case | | Test.java:95:8:95:38 | case | Test.java:95:21:95:21 | x | -| Test.java:95:8:95:38 | case | Test.java:97:8:97:15 | default | | Test.java:95:13:95:37 | A(...) | Test.java:96:10:96:15 | break | +| Test.java:95:13:95:37 | A(...) | Test.java:97:8:97:15 | default | | Test.java:95:15:95:29 | B(...) | Test.java:95:36:95:36 | z | | Test.java:95:21:95:21 | x | Test.java:95:28:95:28 | y | | Test.java:95:28:95:28 | y | Test.java:95:15:95:29 | B(...) | @@ -321,17 +321,17 @@ | Test.java:101:6:101:18 | switch (...) | Test.java:101:13:101:17 | thing | | Test.java:101:13:101:17 | thing | Test.java:102:8:102:20 | case | | Test.java:102:8:102:20 | case | Test.java:102:15:102:15 | | -| Test.java:102:8:102:20 | case | Test.java:103:8:103:77 | case | +| Test.java:102:13:102:19 | B(...) | Test.java:103:8:103:77 | case | | Test.java:102:13:102:19 | B(...) | Test.java:105:10:105:15 | break | | Test.java:102:15:102:15 | | Test.java:102:18:102:18 | | | Test.java:102:18:102:18 | | Test.java:102:13:102:19 | B(...) | | Test.java:103:8:103:77 | case | Test.java:103:21:103:21 | | -| Test.java:103:8:103:77 | case | Test.java:103:31:103:31 | | -| Test.java:103:8:103:77 | case | Test.java:103:36:103:36 | | -| Test.java:103:8:103:77 | case | Test.java:104:8:104:20 | case | +| Test.java:103:21:103:21 | | Test.java:103:31:103:31 | | | Test.java:103:21:103:21 | | Test.java:103:47:103:51 | thing | +| Test.java:103:31:103:31 | | Test.java:103:36:103:36 | | | Test.java:103:31:103:31 | | Test.java:103:47:103:51 | thing | | Test.java:103:34:103:40 | A(...) | Test.java:103:47:103:51 | thing | +| Test.java:103:34:103:40 | A(...) | Test.java:104:8:104:20 | case | | Test.java:103:36:103:36 | | Test.java:103:39:103:39 | | | Test.java:103:39:103:39 | | Test.java:103:34:103:40 | A(...) | | Test.java:103:47:103:51 | thing | Test.java:103:47:103:62 | toString(...) | @@ -340,8 +340,8 @@ | Test.java:103:47:103:76 | equals(...) | Test.java:105:10:105:15 | break | | Test.java:103:71:103:75 | "abc" | Test.java:103:47:103:76 | equals(...) | | Test.java:104:8:104:20 | case | Test.java:104:19:104:19 | | -| Test.java:104:8:104:20 | case | Test.java:106:8:106:15 | default | | Test.java:104:19:104:19 | | Test.java:105:10:105:15 | break | +| Test.java:104:19:104:19 | | Test.java:106:8:106:15 | default | | Test.java:105:10:105:15 | break | Test.java:110:6:117:7 | var ...; | | Test.java:106:8:106:15 | default | Test.java:107:10:107:15 | break | | Test.java:107:10:107:15 | break | Test.java:110:6:117:7 | var ...; | @@ -350,17 +350,17 @@ | Test.java:110:19:110:31 | switch (...) | Test.java:110:26:110:30 | thing | | Test.java:110:26:110:30 | thing | Test.java:111:8:111:20 | case | | Test.java:111:8:111:20 | case | Test.java:111:15:111:15 | | -| Test.java:111:8:111:20 | case | Test.java:112:8:112:77 | case | +| Test.java:111:13:111:19 | B(...) | Test.java:112:8:112:77 | case | | Test.java:111:13:111:19 | B(...) | Test.java:114:16:114:16 | 1 | | Test.java:111:15:111:15 | | Test.java:111:18:111:18 | | | Test.java:111:18:111:18 | | Test.java:111:13:111:19 | B(...) | | Test.java:112:8:112:77 | case | Test.java:112:21:112:21 | | -| Test.java:112:8:112:77 | case | Test.java:112:31:112:31 | | -| Test.java:112:8:112:77 | case | Test.java:112:36:112:36 | | -| Test.java:112:8:112:77 | case | Test.java:113:8:113:20 | case | +| Test.java:112:21:112:21 | | Test.java:112:31:112:31 | | | Test.java:112:21:112:21 | | Test.java:112:47:112:51 | thing | +| Test.java:112:31:112:31 | | Test.java:112:36:112:36 | | | Test.java:112:31:112:31 | | Test.java:112:47:112:51 | thing | | Test.java:112:34:112:40 | A(...) | Test.java:112:47:112:51 | thing | +| Test.java:112:34:112:40 | A(...) | Test.java:113:8:113:20 | case | | Test.java:112:36:112:36 | | Test.java:112:39:112:39 | | | Test.java:112:39:112:39 | | Test.java:112:34:112:40 | A(...) | | Test.java:112:47:112:51 | thing | Test.java:112:47:112:62 | toString(...) | @@ -369,8 +369,8 @@ | Test.java:112:47:112:76 | equals(...) | Test.java:114:16:114:16 | 1 | | Test.java:112:71:112:75 | "abc" | Test.java:112:47:112:76 | equals(...) | | Test.java:113:8:113:20 | case | Test.java:113:19:113:19 | | -| Test.java:113:8:113:20 | case | Test.java:115:8:115:15 | default | | Test.java:113:19:113:19 | | Test.java:114:16:114:16 | 1 | +| Test.java:113:19:113:19 | | Test.java:115:8:115:15 | default | | Test.java:114:10:114:17 | yield ... | Test.java:110:10:110:31 | result | | Test.java:114:16:114:16 | 1 | Test.java:114:10:114:17 | yield ... | | Test.java:115:8:115:15 | default | Test.java:116:16:116:16 | 2 | @@ -380,11 +380,11 @@ | Test.java:119:14:119:26 | (...)... | Test.java:120:8:120:16 | case ... | | Test.java:119:22:119:26 | thing | Test.java:119:14:119:26 | (...)... | | Test.java:120:8:120:16 | case ... | Test.java:120:13:120:15 | "a" | -| Test.java:120:8:120:16 | case ... | Test.java:121:8:121:56 | case | +| Test.java:120:13:120:15 | "a" | Test.java:121:8:121:56 | case | | Test.java:120:13:120:15 | "a" | Test.java:123:10:123:15 | break | | Test.java:121:8:121:56 | case | Test.java:121:20:121:20 | | -| Test.java:121:8:121:56 | case | Test.java:122:8:122:16 | case ... | | Test.java:121:20:121:20 | | Test.java:121:36:121:40 | thing | +| Test.java:121:20:121:20 | | Test.java:122:8:122:16 | case ... | | Test.java:121:27:121:50 | length(...) | Test.java:121:55:121:55 | 5 | | Test.java:121:27:121:55 | ... == ... | Test.java:122:8:122:16 | case ... | | Test.java:121:27:121:55 | ... == ... | Test.java:123:10:123:15 | break | @@ -392,16 +392,16 @@ | Test.java:121:36:121:40 | thing | Test.java:121:28:121:40 | (...)... | | Test.java:121:55:121:55 | 5 | Test.java:121:27:121:55 | ... == ... | | Test.java:122:8:122:16 | case ... | Test.java:122:13:122:15 | "b" | -| Test.java:122:8:122:16 | case ... | Test.java:124:8:124:15 | default | | Test.java:122:13:122:15 | "b" | Test.java:123:10:123:15 | break | +| Test.java:122:13:122:15 | "b" | Test.java:124:8:124:15 | default | | Test.java:123:10:123:15 | break | Test.java:129:6:129:18 | switch (...) | | Test.java:124:8:124:15 | default | Test.java:125:10:125:15 | break | | Test.java:125:10:125:15 | break | Test.java:129:6:129:18 | switch (...) | | Test.java:129:6:129:18 | switch (...) | Test.java:129:13:129:17 | thing | | Test.java:129:13:129:17 | thing | Test.java:130:8:130:21 | case | | Test.java:130:8:130:21 | case | Test.java:130:20:130:20 | | -| Test.java:130:8:130:21 | case | Test.java:131:8:131:15 | default | | Test.java:130:20:130:20 | | Test.java:3:22:3:25 | Normal Exit | +| Test.java:130:20:130:20 | | Test.java:131:8:131:15 | default | | Test.java:131:8:131:15 | default | Test.java:3:22:3:25 | Normal Exit | | Test.java:138:8:138:8 | ...=... | Test.java:138:8:138:8 | ; | | Test.java:138:8:138:8 | ...=... | Test.java:138:8:138:8 | Normal Exit | diff --git a/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected b/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected index ad033101fd6f..923978b49794 100644 --- a/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected +++ b/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected @@ -87,8 +87,8 @@ | TestBreak.java:52:3:52:12 | switch (...) | TestBreak.java:52:11:52:11 | x | | TestBreak.java:52:11:52:11 | x | TestBreak.java:54:3:54:9 | case ... | | TestBreak.java:54:3:54:9 | case ... | TestBreak.java:54:8:54:8 | 1 | -| TestBreak.java:54:3:54:9 | case ... | TestBreak.java:57:3:57:9 | case ... | | TestBreak.java:54:8:54:8 | 1 | TestBreak.java:55:4:55:13 | ; | +| TestBreak.java:54:8:54:8 | 1 | TestBreak.java:57:3:57:9 | case ... | | TestBreak.java:55:4:55:4 | x | TestBreak.java:55:8:55:8 | x | | TestBreak.java:55:4:55:12 | ...=... | TestBreak.java:56:4:56:13 | ; | | TestBreak.java:55:4:55:13 | ; | TestBreak.java:55:4:55:4 | x | @@ -102,8 +102,8 @@ | TestBreak.java:56:8:56:12 | ... + ... | TestBreak.java:56:4:56:12 | ...=... | | TestBreak.java:56:12:56:12 | 1 | TestBreak.java:56:8:56:12 | ... + ... | | TestBreak.java:57:3:57:9 | case ... | TestBreak.java:57:8:57:8 | 2 | -| TestBreak.java:57:3:57:9 | case ... | TestBreak.java:61:3:61:9 | case ... | | TestBreak.java:57:8:57:8 | 2 | TestBreak.java:58:4:58:13 | ; | +| TestBreak.java:57:8:57:8 | 2 | TestBreak.java:61:3:61:9 | case ... | | TestBreak.java:58:4:58:4 | x | TestBreak.java:58:8:58:8 | x | | TestBreak.java:58:4:58:12 | ...=... | TestBreak.java:59:4:59:13 | ; | | TestBreak.java:58:4:58:13 | ; | TestBreak.java:58:4:58:4 | x | @@ -118,11 +118,11 @@ | TestBreak.java:59:12:59:12 | 2 | TestBreak.java:59:8:59:12 | ... + ... | | TestBreak.java:60:4:60:9 | break | TestBreak.java:76:3:76:11 | switch (...) | | TestBreak.java:61:3:61:9 | case ... | TestBreak.java:61:8:61:8 | 3 | -| TestBreak.java:61:3:61:9 | case ... | TestBreak.java:62:3:62:9 | case ... | +| TestBreak.java:61:8:61:8 | 3 | TestBreak.java:62:3:62:9 | case ... | | TestBreak.java:61:8:61:8 | 3 | TestBreak.java:63:4:63:13 | ; | | TestBreak.java:62:3:62:9 | case ... | TestBreak.java:62:8:62:8 | 4 | -| TestBreak.java:62:3:62:9 | case ... | TestBreak.java:66:3:66:9 | case ... | | TestBreak.java:62:8:62:8 | 4 | TestBreak.java:63:4:63:13 | ; | +| TestBreak.java:62:8:62:8 | 4 | TestBreak.java:66:3:66:9 | case ... | | TestBreak.java:63:4:63:4 | x | TestBreak.java:63:8:63:8 | x | | TestBreak.java:63:4:63:12 | ...=... | TestBreak.java:64:4:64:13 | ; | | TestBreak.java:63:4:63:13 | ; | TestBreak.java:63:4:63:4 | x | @@ -137,11 +137,11 @@ | TestBreak.java:64:12:64:12 | 4 | TestBreak.java:64:8:64:12 | ... + ... | | TestBreak.java:65:4:65:9 | break | TestBreak.java:76:3:76:11 | switch (...) | | TestBreak.java:66:3:66:9 | case ... | TestBreak.java:66:8:66:8 | 5 | -| TestBreak.java:66:3:66:9 | case ... | TestBreak.java:67:3:67:9 | case ... | +| TestBreak.java:66:8:66:8 | 5 | TestBreak.java:67:3:67:9 | case ... | | TestBreak.java:66:8:66:8 | 5 | TestBreak.java:68:4:68:13 | ; | | TestBreak.java:67:3:67:9 | case ... | TestBreak.java:67:8:67:8 | 6 | -| TestBreak.java:67:3:67:9 | case ... | TestBreak.java:70:3:70:10 | default | | TestBreak.java:67:8:67:8 | 6 | TestBreak.java:68:4:68:13 | ; | +| TestBreak.java:67:8:67:8 | 6 | TestBreak.java:70:3:70:10 | default | | TestBreak.java:68:4:68:4 | x | TestBreak.java:68:8:68:8 | x | | TestBreak.java:68:4:68:12 | ...=... | TestBreak.java:69:4:69:13 | ; | | TestBreak.java:68:4:68:13 | ; | TestBreak.java:68:4:68:4 | x | @@ -166,15 +166,15 @@ | TestBreak.java:76:3:76:11 | switch (...) | TestBreak.java:76:10:76:10 | x | | TestBreak.java:76:10:76:10 | x | TestBreak.java:78:3:78:9 | case ... | | TestBreak.java:78:3:78:9 | case ... | TestBreak.java:78:8:78:8 | 1 | -| TestBreak.java:78:3:78:9 | case ... | TestBreak.java:81:3:81:9 | case ... | | TestBreak.java:78:8:78:8 | 1 | TestBreak.java:79:4:79:9 | ; | +| TestBreak.java:78:8:78:8 | 1 | TestBreak.java:81:3:81:9 | case ... | | TestBreak.java:79:4:79:4 | x | TestBreak.java:79:8:79:8 | 1 | | TestBreak.java:79:4:79:8 | ...=... | TestBreak.java:80:4:80:9 | break | | TestBreak.java:79:4:79:9 | ; | TestBreak.java:79:4:79:4 | x | | TestBreak.java:79:8:79:8 | 1 | TestBreak.java:79:4:79:8 | ...=... | | TestBreak.java:80:4:80:9 | break | TestBreak.java:4:14:4:14 | Normal Exit | -| TestBreak.java:81:3:81:9 | case ... | TestBreak.java:4:14:4:14 | Normal Exit | | TestBreak.java:81:3:81:9 | case ... | TestBreak.java:81:8:81:8 | 2 | +| TestBreak.java:81:8:81:8 | 2 | TestBreak.java:4:14:4:14 | Normal Exit | | TestBreak.java:81:8:81:8 | 2 | TestBreak.java:82:4:82:9 | ; | | TestBreak.java:82:4:82:4 | x | TestBreak.java:82:8:82:8 | 2 | | TestBreak.java:82:4:82:8 | ...=... | TestBreak.java:83:4:83:9 | break | diff --git a/java/ql/test/library-tests/successors/TestLoopBranch/TestSucc.expected b/java/ql/test/library-tests/successors/TestLoopBranch/TestSucc.expected index a6b5849eef68..fb986684465e 100644 --- a/java/ql/test/library-tests/successors/TestLoopBranch/TestSucc.expected +++ b/java/ql/test/library-tests/successors/TestLoopBranch/TestSucc.expected @@ -148,8 +148,8 @@ | TestLoopBranch.java:62:3:62:12 | switch (...) | TestLoopBranch.java:62:11:62:11 | x | | TestLoopBranch.java:62:11:62:11 | x | TestLoopBranch.java:64:3:64:9 | case ... | | TestLoopBranch.java:64:3:64:9 | case ... | TestLoopBranch.java:64:8:64:8 | 1 | -| TestLoopBranch.java:64:3:64:9 | case ... | TestLoopBranch.java:67:3:67:9 | case ... | | TestLoopBranch.java:64:8:64:8 | 1 | TestLoopBranch.java:65:4:65:13 | ; | +| TestLoopBranch.java:64:8:64:8 | 1 | TestLoopBranch.java:67:3:67:9 | case ... | | TestLoopBranch.java:65:4:65:4 | x | TestLoopBranch.java:65:8:65:8 | x | | TestLoopBranch.java:65:4:65:12 | ...=... | TestLoopBranch.java:66:4:66:13 | ; | | TestLoopBranch.java:65:4:65:13 | ; | TestLoopBranch.java:65:4:65:4 | x | @@ -163,8 +163,8 @@ | TestLoopBranch.java:66:8:66:12 | ... + ... | TestLoopBranch.java:66:4:66:12 | ...=... | | TestLoopBranch.java:66:12:66:12 | 1 | TestLoopBranch.java:66:8:66:12 | ... + ... | | TestLoopBranch.java:67:3:67:9 | case ... | TestLoopBranch.java:67:8:67:8 | 2 | -| TestLoopBranch.java:67:3:67:9 | case ... | TestLoopBranch.java:71:3:71:9 | case ... | | TestLoopBranch.java:67:8:67:8 | 2 | TestLoopBranch.java:68:4:68:13 | ; | +| TestLoopBranch.java:67:8:67:8 | 2 | TestLoopBranch.java:71:3:71:9 | case ... | | TestLoopBranch.java:68:4:68:4 | x | TestLoopBranch.java:68:8:68:8 | x | | TestLoopBranch.java:68:4:68:12 | ...=... | TestLoopBranch.java:69:4:69:13 | ; | | TestLoopBranch.java:68:4:68:13 | ; | TestLoopBranch.java:68:4:68:4 | x | @@ -179,11 +179,11 @@ | TestLoopBranch.java:69:12:69:12 | 2 | TestLoopBranch.java:69:8:69:12 | ... + ... | | TestLoopBranch.java:70:4:70:9 | break | TestLoopBranch.java:86:3:86:11 | switch (...) | | TestLoopBranch.java:71:3:71:9 | case ... | TestLoopBranch.java:71:8:71:8 | 3 | -| TestLoopBranch.java:71:3:71:9 | case ... | TestLoopBranch.java:72:3:72:9 | case ... | +| TestLoopBranch.java:71:8:71:8 | 3 | TestLoopBranch.java:72:3:72:9 | case ... | | TestLoopBranch.java:71:8:71:8 | 3 | TestLoopBranch.java:73:4:73:13 | ; | | TestLoopBranch.java:72:3:72:9 | case ... | TestLoopBranch.java:72:8:72:8 | 4 | -| TestLoopBranch.java:72:3:72:9 | case ... | TestLoopBranch.java:76:3:76:9 | case ... | | TestLoopBranch.java:72:8:72:8 | 4 | TestLoopBranch.java:73:4:73:13 | ; | +| TestLoopBranch.java:72:8:72:8 | 4 | TestLoopBranch.java:76:3:76:9 | case ... | | TestLoopBranch.java:73:4:73:4 | x | TestLoopBranch.java:73:8:73:8 | x | | TestLoopBranch.java:73:4:73:12 | ...=... | TestLoopBranch.java:74:4:74:13 | ; | | TestLoopBranch.java:73:4:73:13 | ; | TestLoopBranch.java:73:4:73:4 | x | @@ -198,11 +198,11 @@ | TestLoopBranch.java:74:12:74:12 | 4 | TestLoopBranch.java:74:8:74:12 | ... + ... | | TestLoopBranch.java:75:4:75:9 | break | TestLoopBranch.java:86:3:86:11 | switch (...) | | TestLoopBranch.java:76:3:76:9 | case ... | TestLoopBranch.java:76:8:76:8 | 5 | -| TestLoopBranch.java:76:3:76:9 | case ... | TestLoopBranch.java:77:3:77:9 | case ... | +| TestLoopBranch.java:76:8:76:8 | 5 | TestLoopBranch.java:77:3:77:9 | case ... | | TestLoopBranch.java:76:8:76:8 | 5 | TestLoopBranch.java:78:4:78:13 | ; | | TestLoopBranch.java:77:3:77:9 | case ... | TestLoopBranch.java:77:8:77:8 | 6 | -| TestLoopBranch.java:77:3:77:9 | case ... | TestLoopBranch.java:80:3:80:10 | default | | TestLoopBranch.java:77:8:77:8 | 6 | TestLoopBranch.java:78:4:78:13 | ; | +| TestLoopBranch.java:77:8:77:8 | 6 | TestLoopBranch.java:80:3:80:10 | default | | TestLoopBranch.java:78:4:78:4 | x | TestLoopBranch.java:78:8:78:8 | x | | TestLoopBranch.java:78:4:78:12 | ...=... | TestLoopBranch.java:79:4:79:13 | ; | | TestLoopBranch.java:78:4:78:13 | ; | TestLoopBranch.java:78:4:78:4 | x | @@ -227,16 +227,16 @@ | TestLoopBranch.java:86:3:86:11 | switch (...) | TestLoopBranch.java:86:10:86:10 | x | | TestLoopBranch.java:86:10:86:10 | x | TestLoopBranch.java:88:3:88:9 | case ... | | TestLoopBranch.java:88:3:88:9 | case ... | TestLoopBranch.java:88:8:88:8 | 1 | -| TestLoopBranch.java:88:3:88:9 | case ... | TestLoopBranch.java:91:3:91:9 | case ... | | TestLoopBranch.java:88:8:88:8 | 1 | TestLoopBranch.java:89:4:89:9 | ; | +| TestLoopBranch.java:88:8:88:8 | 1 | TestLoopBranch.java:91:3:91:9 | case ... | | TestLoopBranch.java:89:4:89:4 | x | TestLoopBranch.java:89:8:89:8 | 1 | | TestLoopBranch.java:89:4:89:8 | ...=... | TestLoopBranch.java:90:4:90:9 | break | | TestLoopBranch.java:89:4:89:9 | ; | TestLoopBranch.java:89:4:89:4 | x | | TestLoopBranch.java:89:8:89:8 | 1 | TestLoopBranch.java:89:4:89:8 | ...=... | | TestLoopBranch.java:90:4:90:9 | break | TestLoopBranch.java:96:3:102:4 | var ...; | | TestLoopBranch.java:91:3:91:9 | case ... | TestLoopBranch.java:91:8:91:8 | 2 | -| TestLoopBranch.java:91:3:91:9 | case ... | TestLoopBranch.java:96:3:102:4 | var ...; | | TestLoopBranch.java:91:8:91:8 | 2 | TestLoopBranch.java:92:4:92:9 | ; | +| TestLoopBranch.java:91:8:91:8 | 2 | TestLoopBranch.java:96:3:102:4 | var ...; | | TestLoopBranch.java:92:4:92:4 | x | TestLoopBranch.java:92:8:92:8 | 2 | | TestLoopBranch.java:92:4:92:8 | ...=... | TestLoopBranch.java:93:4:93:9 | break | | TestLoopBranch.java:92:4:92:9 | ; | TestLoopBranch.java:92:4:92:4 | x | diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected index aee29733bca4..06ab1d6340d8 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected @@ -235,17 +235,17 @@ edges | Test.java:199:26:199:33 | source(...) : String | Test.java:199:19:199:33 | (...)... | provenance | Sink:MaD:59 | | Test.java:204:29:204:36 | source(...) : String | Test.java:204:20:204:36 | (...)... | provenance | Sink:MaD:68 | models -| 1 | Sink: java.io; File; true; canExecute; (); ; Argument[this]; path-injection; manual | -| 2 | Sink: java.io; File; true; canRead; (); ; Argument[this]; path-injection; manual | -| 3 | Sink: java.io; File; true; canWrite; (); ; Argument[this]; path-injection; manual | +| 1 | Sink: java.io; File; true; canExecute; (); ; Argument[this]; path-injection[read]; manual | +| 2 | Sink: java.io; File; true; canRead; (); ; Argument[this]; path-injection[read]; manual | +| 3 | Sink: java.io; File; true; canWrite; (); ; Argument[this]; path-injection[read]; manual | | 4 | Sink: java.io; File; true; createNewFile; (); ; Argument[this]; path-injection; ai-manual | | 5 | Sink: java.io; File; true; createTempFile; (String,String,File); ; Argument[2]; path-injection; ai-manual | | 6 | Sink: java.io; File; true; delete; (); ; Argument[this]; path-injection; manual | | 7 | Sink: java.io; File; true; deleteOnExit; (); ; Argument[this]; path-injection; manual | -| 8 | Sink: java.io; File; true; exists; (); ; Argument[this]; path-injection; manual | -| 9 | Sink: java.io; File; true; isDirectory; (); ; Argument[this]; path-injection; manual | -| 10 | Sink: java.io; File; true; isFile; (); ; Argument[this]; path-injection; manual | -| 11 | Sink: java.io; File; true; isHidden; (); ; Argument[this]; path-injection; manual | +| 8 | Sink: java.io; File; true; exists; (); ; Argument[this]; path-injection[read]; manual | +| 9 | Sink: java.io; File; true; isDirectory; (); ; Argument[this]; path-injection[read]; manual | +| 10 | Sink: java.io; File; true; isFile; (); ; Argument[this]; path-injection[read]; manual | +| 11 | Sink: java.io; File; true; isHidden; (); ; Argument[this]; path-injection[read]; manual | | 12 | Sink: java.io; File; true; mkdir; (); ; Argument[this]; path-injection; manual | | 13 | Sink: java.io; File; true; mkdirs; (); ; Argument[this]; path-injection; manual | | 14 | Sink: java.io; File; true; renameTo; (File); ; Argument[0]; path-injection; ai-manual | @@ -255,20 +255,20 @@ models | 18 | Sink: java.io; File; true; setReadOnly; ; ; Argument[this]; path-injection; manual | | 19 | Sink: java.io; File; true; setReadable; ; ; Argument[this]; path-injection; manual | | 20 | Sink: java.io; File; true; setWritable; ; ; Argument[this]; path-injection; manual | -| 21 | Sink: java.io; FileInputStream; true; FileInputStream; (File); ; Argument[0]; path-injection; ai-manual | -| 22 | Sink: java.io; FileInputStream; true; FileInputStream; (FileDescriptor); ; Argument[0]; path-injection; manual | -| 23 | Sink: java.io; FileInputStream; true; FileInputStream; (String); ; Argument[0]; path-injection; ai-manual | -| 24 | Sink: java.io; FileReader; true; FileReader; (File); ; Argument[0]; path-injection; ai-manual | -| 25 | Sink: java.io; FileReader; true; FileReader; (File,Charset); ; Argument[0]; path-injection; manual | -| 26 | Sink: java.io; FileReader; true; FileReader; (FileDescriptor); ; Argument[0]; path-injection; manual | -| 27 | Sink: java.io; FileReader; true; FileReader; (String); ; Argument[0]; path-injection; ai-manual | -| 28 | Sink: java.io; FileReader; true; FileReader; (String,Charset); ; Argument[0]; path-injection; manual | -| 29 | Sink: java.lang; Class; false; getResource; (String); ; Argument[0]; path-injection; ai-manual | -| 30 | Sink: java.lang; ClassLoader; true; getSystemResourceAsStream; (String); ; Argument[0]; path-injection; ai-manual | -| 31 | Sink: java.lang; Module; true; getResourceAsStream; (String); ; Argument[0]; path-injection; ai-manual | +| 21 | Sink: java.io; FileInputStream; true; FileInputStream; (File); ; Argument[0]; path-injection[read]; ai-manual | +| 22 | Sink: java.io; FileInputStream; true; FileInputStream; (FileDescriptor); ; Argument[0]; path-injection[read]; manual | +| 23 | Sink: java.io; FileInputStream; true; FileInputStream; (String); ; Argument[0]; path-injection[read]; ai-manual | +| 24 | Sink: java.io; FileReader; true; FileReader; (File); ; Argument[0]; path-injection[read]; ai-manual | +| 25 | Sink: java.io; FileReader; true; FileReader; (File,Charset); ; Argument[0]; path-injection[read]; manual | +| 26 | Sink: java.io; FileReader; true; FileReader; (FileDescriptor); ; Argument[0]; path-injection[read]; manual | +| 27 | Sink: java.io; FileReader; true; FileReader; (String); ; Argument[0]; path-injection[read]; ai-manual | +| 28 | Sink: java.io; FileReader; true; FileReader; (String,Charset); ; Argument[0]; path-injection[read]; manual | +| 29 | Sink: java.lang; Class; false; getResource; (String); ; Argument[0]; path-injection[read]; ai-manual | +| 30 | Sink: java.lang; ClassLoader; true; getSystemResourceAsStream; (String); ; Argument[0]; path-injection[read]; ai-manual | +| 31 | Sink: java.lang; Module; true; getResourceAsStream; (String); ; Argument[0]; path-injection[read]; ai-manual | | 32 | Sink: java.nio.file; Files; false; copy; (InputStream,Path,CopyOption[]); ; Argument[1]; path-injection; manual | -| 33 | Sink: java.nio.file; Files; false; copy; (Path,OutputStream); ; Argument[0]; path-injection; manual | -| 34 | Sink: java.nio.file; Files; false; copy; (Path,Path,CopyOption[]); ; Argument[0]; path-injection; manual | +| 33 | Sink: java.nio.file; Files; false; copy; (Path,OutputStream); ; Argument[0]; path-injection[read]; manual | +| 34 | Sink: java.nio.file; Files; false; copy; (Path,Path,CopyOption[]); ; Argument[0]; path-injection[read]; manual | | 35 | Sink: java.nio.file; Files; false; copy; (Path,Path,CopyOption[]); ; Argument[1]; path-injection; manual | | 36 | Sink: java.nio.file; Files; false; createDirectories; ; ; Argument[0]; path-injection; manual | | 37 | Sink: java.nio.file; Files; false; createDirectory; ; ; Argument[0]; path-injection; manual | @@ -279,31 +279,31 @@ models | 42 | Sink: java.nio.file; Files; false; createTempFile; (Path,String,String,FileAttribute[]); ; Argument[0]; path-injection; manual | | 43 | Sink: java.nio.file; Files; false; delete; (Path); ; Argument[0]; path-injection; ai-manual | | 44 | Sink: java.nio.file; Files; false; deleteIfExists; (Path); ; Argument[0]; path-injection; ai-manual | -| 45 | Sink: java.nio.file; Files; false; lines; (Path,Charset); ; Argument[0]; path-injection; ai-manual | +| 45 | Sink: java.nio.file; Files; false; lines; (Path,Charset); ; Argument[0]; path-injection[read]; ai-manual | | 46 | Sink: java.nio.file; Files; false; move; ; ; Argument[1]; path-injection; manual | -| 47 | Sink: java.nio.file; Files; false; newBufferedReader; (Path,Charset); ; Argument[0]; path-injection; ai-manual | +| 47 | Sink: java.nio.file; Files; false; newBufferedReader; (Path,Charset); ; Argument[0]; path-injection[read]; ai-manual | | 48 | Sink: java.nio.file; Files; false; newBufferedWriter; ; ; Argument[0]; path-injection; manual | | 49 | Sink: java.nio.file; Files; false; newOutputStream; ; ; Argument[0]; path-injection; manual | | 50 | Sink: java.nio.file; Files; false; write; ; ; Argument[0]; path-injection; manual | | 51 | Sink: java.nio.file; Files; false; writeString; ; ; Argument[0]; path-injection; manual | | 52 | Sink: javax.xml.transform.stream; StreamResult; true; StreamResult; (File); ; Argument[0]; path-injection; ai-manual | -| 53 | Sink: org.apache.commons.io; FileUtils; true; openInputStream; (File); ; Argument[0]; path-injection; ai-manual | -| 54 | Sink: org.apache.tools.ant.taskdefs; Copy; true; addFileset; (FileSet); ; Argument[0]; path-injection; ai-manual | -| 55 | Sink: org.apache.tools.ant.taskdefs; Copy; true; setFile; (File); ; Argument[0]; path-injection; ai-manual | +| 53 | Sink: org.apache.commons.io; FileUtils; true; openInputStream; (File); ; Argument[0]; path-injection[read]; ai-manual | +| 54 | Sink: org.apache.tools.ant.taskdefs; Copy; true; addFileset; (FileSet); ; Argument[0]; path-injection[read]; ai-manual | +| 55 | Sink: org.apache.tools.ant.taskdefs; Copy; true; setFile; (File); ; Argument[0]; path-injection[read]; ai-manual | | 56 | Sink: org.apache.tools.ant.taskdefs; Copy; true; setTodir; (File); ; Argument[0]; path-injection; ai-manual | | 57 | Sink: org.apache.tools.ant.taskdefs; Copy; true; setTofile; (File); ; Argument[0]; path-injection; ai-manual | | 58 | Sink: org.apache.tools.ant.taskdefs; Expand; true; setDest; (File); ; Argument[0]; path-injection; ai-manual | -| 59 | Sink: org.apache.tools.ant.taskdefs; Expand; true; setSrc; (File); ; Argument[0]; path-injection; ai-manual | -| 60 | Sink: org.apache.tools.ant; AntClassLoader; true; AntClassLoader; (ClassLoader,Project,Path,boolean); ; Argument[2]; path-injection; ai-manual | -| 61 | Sink: org.apache.tools.ant; AntClassLoader; true; AntClassLoader; (Project,Path); ; Argument[1]; path-injection; ai-manual | -| 62 | Sink: org.apache.tools.ant; AntClassLoader; true; AntClassLoader; (Project,Path,boolean); ; Argument[1]; path-injection; ai-manual | -| 63 | Sink: org.apache.tools.ant; AntClassLoader; true; addPathComponent; (File); ; Argument[0]; path-injection; ai-manual | -| 64 | Sink: org.apache.tools.ant; DirectoryScanner; true; setBasedir; (File); ; Argument[0]; path-injection; ai-manual | +| 59 | Sink: org.apache.tools.ant.taskdefs; Expand; true; setSrc; (File); ; Argument[0]; path-injection[read]; ai-manual | +| 60 | Sink: org.apache.tools.ant; AntClassLoader; true; AntClassLoader; (ClassLoader,Project,Path,boolean); ; Argument[2]; path-injection[read]; ai-manual | +| 61 | Sink: org.apache.tools.ant; AntClassLoader; true; AntClassLoader; (Project,Path); ; Argument[1]; path-injection[read]; ai-manual | +| 62 | Sink: org.apache.tools.ant; AntClassLoader; true; AntClassLoader; (Project,Path,boolean); ; Argument[1]; path-injection[read]; ai-manual | +| 63 | Sink: org.apache.tools.ant; AntClassLoader; true; addPathComponent; (File); ; Argument[0]; path-injection[read]; ai-manual | +| 64 | Sink: org.apache.tools.ant; DirectoryScanner; true; setBasedir; (File); ; Argument[0]; path-injection[read]; ai-manual | | 65 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[1]; path-injection; ai-manual | | 66 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[2]; path-injection; ai-manual | -| 67 | Sink: org.kohsuke.stapler.framework.io; LargeText; true; LargeText; (File,Charset,boolean,boolean); ; Argument[0]; path-injection; ai-manual | +| 67 | Sink: org.kohsuke.stapler.framework.io; LargeText; true; LargeText; (File,Charset,boolean,boolean); ; Argument[0]; path-injection[read]; ai-manual | | 68 | Sink: org.openjdk.jmh.runner.options; ChainedOptionsBuilder; true; result; (String); ; Argument[0]; path-injection; ai-manual | -| 69 | Sink: org.springframework.util; FileCopyUtils; false; copy; (File,File); ; Argument[0]; path-injection; manual | +| 69 | Sink: org.springframework.util; FileCopyUtils; false; copy; (File,File); ; Argument[0]; path-injection[read]; manual | | 70 | Sink: org.springframework.util; FileCopyUtils; false; copy; (File,File); ; Argument[1]; path-injection; manual | | 71 | Sink: org.springframework.util; FileCopyUtils; false; copy; (byte[],File); ; Argument[1]; path-injection; manual | | 72 | Source: java.net; Socket; false; getInputStream; (); ; ReturnValue; remote; manual | diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/ZipTest.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/ZipTest.java index b5bee61b9654..2c5e1cd9d539 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/ZipTest.java +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/ZipTest.java @@ -60,4 +60,16 @@ public void m6(ZipEntry entry, Path dir) throws Exception { throw new Exception(); OutputStream os = Files.newOutputStream(target); // OK } + + // Regression for https://github.com/github/codeql/issues/21606: archive entry + // names flowing into read-only classpath/resource lookups are outside the + // Zip Slip threat model. + public void m7(ZipEntry entry) throws Exception { + String name = entry.getName(); + ClassLoader.getSystemResources(name); // OK - read-only resource lookup + getClass().getResource(name); // OK - read-only resource lookup + getClass().getResourceAsStream(name); // OK - read-only resource lookup + new FileInputStream(name); // OK - read-only file open + new FileReader(name); // OK - read-only file open + } } diff --git a/java/ql/test/utils/modelgenerator/dataflow/p/Sinks.java b/java/ql/test/utils/modelgenerator/dataflow/p/Sinks.java index d9a0d9324f3c..13c84954ca00 100644 --- a/java/ql/test/utils/modelgenerator/dataflow/p/Sinks.java +++ b/java/ql/test/utils/modelgenerator/dataflow/p/Sinks.java @@ -33,7 +33,7 @@ public Object saveAndGet(Object o) { return null; } - // sink=p;Sinks;true;copyFileToDirectory;(Path,Path,CopyOption[]);;Argument[0];path-injection;df-generated + // sink=p;Sinks;true;copyFileToDirectory;(Path,Path,CopyOption[]);;Argument[0];path-injection[read];df-generated // sink=p;Sinks;true;copyFileToDirectory;(Path,Path,CopyOption[]);;Argument[1];path-injection;df-generated // neutral=p;Sinks;copyFileToDirectory;(Path,Path,CopyOption[]);summary;df-generated public Path copyFileToDirectory( diff --git a/javascript/ql/lib/change-notes/2026-05-14-sensitive-data.md b/javascript/ql/lib/change-notes/2026-05-14-sensitive-data.md new file mode 100644 index 000000000000..f6e6caed3253 --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-05-14-sensitive-data.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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/qlpack.yml b/javascript/ql/lib/qlpack.yml index 97c3de6a8eb6..623a7f4db2f2 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.7.0 +version: 2.7.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 417df72e5bad..593c00324664 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.3.9 +version: 2.3.10-dev groups: - javascript - queries diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index a5cfeccdcea8..bb32aa97a5e2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -55,6 +55,18 @@ alias( tags = ["manual"], ) +alias( + name = "cc-1.2.61", + actual = "@vendor_ts__cc-1.2.61//:cc", + tags = ["manual"], +) + +alias( + name = "cc", + actual = "@vendor_ts__cc-1.2.61//:cc", + tags = ["manual"], +) + alias( name = "chalk-ir-0.104.0", actual = "@vendor_ts__chalk-ir-0.104.0//:chalk_ir", @@ -529,6 +541,18 @@ alias( tags = ["manual"], ) +alias( + name = "serde_yaml-0.9.34+deprecated", + actual = "@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml", + tags = ["manual"], +) + +alias( + name = "serde_yaml", + actual = "@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml", + tags = ["manual"], +) + alias( name = "syn-2.0.106", actual = "@vendor_ts__syn-2.0.106//:syn", @@ -590,14 +614,14 @@ alias( ) alias( - name = "tree-sitter-0.25.9", - actual = "@vendor_ts__tree-sitter-0.25.9//:tree_sitter", + name = "tree-sitter-0.26.8", + actual = "@vendor_ts__tree-sitter-0.26.8//:tree_sitter", tags = ["manual"], ) alias( name = "tree-sitter", - actual = "@vendor_ts__tree-sitter-0.25.9//:tree_sitter", + actual = "@vendor_ts__tree-sitter-0.26.8//:tree_sitter", tags = ["manual"], ) @@ -613,6 +637,18 @@ alias( tags = ["manual"], ) +alias( + name = "tree-sitter-generate-0.26.8", + actual = "@vendor_ts__tree-sitter-generate-0.26.8//:tree_sitter_generate", + tags = ["manual"], +) + +alias( + name = "tree-sitter-generate", + actual = "@vendor_ts__tree-sitter-generate-0.26.8//:tree_sitter_generate", + tags = ["manual"], +) + alias( name = "tree-sitter-json-0.24.8", actual = "@vendor_ts__tree-sitter-json-0.24.8//:tree_sitter_json", @@ -625,6 +661,30 @@ alias( tags = ["manual"], ) +alias( + name = "tree-sitter-language-0.1.5", + actual = "@vendor_ts__tree-sitter-language-0.1.5//:tree_sitter_language", + tags = ["manual"], +) + +alias( + name = "tree-sitter-language", + actual = "@vendor_ts__tree-sitter-language-0.1.5//:tree_sitter_language", + tags = ["manual"], +) + +alias( + name = "tree-sitter-python-0.23.6", + actual = "@vendor_ts__tree-sitter-python-0.23.6//:tree_sitter_python", + tags = ["manual"], +) + +alias( + name = "tree-sitter-python", + actual = "@vendor_ts__tree-sitter-python-0.23.6//:tree_sitter_python", + tags = ["manual"], +) + alias( name = "tree-sitter-ql-0.23.1", actual = "@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql", @@ -649,6 +709,18 @@ alias( tags = ["manual"], ) +alias( + name = "tree-sitter-swift-0.7.2", + actual = "@vendor_ts__tree-sitter-swift-0.7.2//:tree_sitter_swift", + tags = ["manual"], +) + +alias( + name = "tree-sitter-swift", + actual = "@vendor_ts__tree-sitter-swift-0.7.2//:tree_sitter_swift", + tags = ["manual"], +) + alias( name = "triomphe-0.1.14", actual = "@vendor_ts__triomphe-0.1.14//:triomphe", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bindgen-0.72.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bindgen-0.72.1.bazel new file mode 100644 index 000000000000..903b1c8fc773 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bindgen-0.72.1.bazel @@ -0,0 +1,190 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "bindgen", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "logging", + "prettyplease", + "runtime", + ], + crate_root = "lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=bindgen", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.72.1", + deps = [ + "@vendor_ts__bindgen-0.72.1//:build_script_build", + "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__cexpr-0.6.0//:cexpr", + "@vendor_ts__clang-sys-1.8.1//:clang_sys", + "@vendor_ts__itertools-0.12.1//:itertools", + "@vendor_ts__log-0.4.28//:log", + "@vendor_ts__prettyplease-0.2.37//:prettyplease", + "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + "@vendor_ts__quote-1.0.41//:quote", + "@vendor_ts__regex-1.11.3//:regex", + "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__shlex-1.3.0//:shlex", + "@vendor_ts__syn-2.0.106//:syn", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "logging", + "prettyplease", + "runtime", + ], + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + link_deps = [ + "@vendor_ts__clang-sys-1.8.1//:clang_sys", + "@vendor_ts__prettyplease-0.2.37//:prettyplease", + ], + pkg_name = "bindgen", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=bindgen", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.72.1", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel index 802e8d678083..79d9696b3cd8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel @@ -95,11 +95,11 @@ rust_library( }), version = "0.8.2", deps = [ - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", "@vendor_ts__serde-untagged-0.1.8//:serde_untagged", "@vendor_ts__serde-value-0.7.0//:serde_value", - "@vendor_ts__thiserror-2.0.16//:thiserror", + "@vendor_ts__thiserror-2.0.18//:thiserror", "@vendor_ts__toml-0.8.23//:toml", "@vendor_ts__unicode-xid-0.2.6//:unicode_xid", "@vendor_ts__url-2.5.7//:url", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel index aefea796d4c3..10cd194b507d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel @@ -101,9 +101,9 @@ rust_library( "@vendor_ts__camino-1.1.12//:camino", "@vendor_ts__cargo-platform-0.2.0//:cargo_platform", "@vendor_ts__cargo-util-schemas-0.8.2//:cargo_util_schemas", - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", "@vendor_ts__serde_json-1.0.145//:serde_json", - "@vendor_ts__thiserror-2.0.16//:thiserror", + "@vendor_ts__thiserror-2.0.18//:thiserror", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.37.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.61.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.37.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.61.bazel index c747c1c3c4fc..4071cd592439 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.37.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.61.bazel @@ -96,9 +96,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.37", + version = "1.2.61", deps = [ - "@vendor_ts__find-msvc-tools-0.1.1//:find_msvc_tools", + "@vendor_ts__find-msvc-tools-0.1.9//:find_msvc_tools", "@vendor_ts__jobserver-0.1.34//:jobserver", "@vendor_ts__shlex-1.3.0//:shlex", ] + select({ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cexpr-0.6.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cexpr-0.6.0.bazel new file mode 100644 index 000000000000..500c657be108 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cexpr-0.6.0.bazel @@ -0,0 +1,100 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "cexpr", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=cexpr", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.6.0", + deps = [ + "@vendor_ts__nom-7.1.3//:nom", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel index f1124f1108fa..4fb684fec28b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel @@ -100,7 +100,7 @@ rust_library( deps = [ "@vendor_ts__chalk-ir-0.103.0//:chalk_ir", "@vendor_ts__ena-0.14.3//:ena", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.12.1//:itertools", "@vendor_ts__petgraph-0.6.5//:petgraph", "@vendor_ts__rustc-hash-1.1.0//:rustc_hash", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clang-sys-1.8.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clang-sys-1.8.1.bazel new file mode 100644 index 000000000000..b039f4c28e5b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clang-sys-1.8.1.bazel @@ -0,0 +1,203 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "clang_sys", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "clang_10_0", + "clang_11_0", + "clang_3_5", + "clang_3_6", + "clang_3_7", + "clang_3_8", + "clang_3_9", + "clang_4_0", + "clang_5_0", + "clang_6_0", + "clang_7_0", + "clang_8_0", + "clang_9_0", + "libloading", + "runtime", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=clang-sys", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.8.1", + deps = [ + "@vendor_ts__clang-sys-1.8.1//:build_script_build", + "@vendor_ts__glob-0.3.3//:glob", + "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libloading-0.8.9//:libloading", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "clang_10_0", + "clang_11_0", + "clang_3_5", + "clang_3_6", + "clang_3_7", + "clang_3_8", + "clang_3_9", + "clang_4_0", + "clang_5_0", + "clang_6_0", + "clang_7_0", + "clang_8_0", + "clang_9_0", + "libloading", + "runtime", + ], + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + links = "clang", + pkg_name = "clang-sys", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=clang-sys", + "manual", + "noclippy", + "norustfmt", + ], + version = "1.8.1", + visibility = ["//visibility:private"], + deps = [ + "@vendor_ts__glob-0.3.3//:glob", + ], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.convert_case-0.8.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.convert_case-0.8.0.bazel new file mode 100644 index 000000000000..a1a2df07bf1f --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.convert_case-0.8.0.bazel @@ -0,0 +1,100 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "convert_case", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=convert_case", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.8.0", + deps = [ + "@vendor_ts__unicode-segmentation-1.13.2//:unicode_segmentation", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fastrand-2.4.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fastrand-2.4.1.bazel new file mode 100644 index 000000000000..f6f016a9f467 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fastrand-2.4.1.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "fastrand", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=fastrand", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "2.4.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel index 8fc8c9a81e26..12cd2ecbe0cc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.1", + version = "0.1.9", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel new file mode 100644 index 000000000000..03940fb08ac2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "foldhash", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=foldhash", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.2.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.16.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.16.1.bazel new file mode 100644 index 000000000000..8090f6f8c7fc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.16.1.bazel @@ -0,0 +1,110 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "hashbrown", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "allocator-api2", + "default", + "default-hasher", + "equivalent", + "inline-more", + "raw-entry", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=hashbrown", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.16.1", + deps = [ + "@vendor_ts__allocator-api2-0.2.21//:allocator_api2", + "@vendor_ts__equivalent-1.0.2//:equivalent", + "@vendor_ts__foldhash-0.2.0//:foldhash", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel new file mode 100644 index 000000000000..eba4862da685 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "hashbrown", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=hashbrown", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.17.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel index fe120c046896..582c31e06fb7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel @@ -154,7 +154,7 @@ cargo_build_script( version = "0.1.2", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.11.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.11.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel index 53cca2f56778..5a727af4c881 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.11.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel @@ -40,7 +40,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -98,10 +98,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.11.4", + version = "2.14.0", deps = [ "@vendor_ts__equivalent-1.0.2//:equivalent", - "@vendor_ts__hashbrown-0.15.5//:hashbrown", + "@vendor_ts__hashbrown-0.17.1//:hashbrown", "@vendor_ts__serde_core-1.0.228//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indoc-2.0.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indoc-2.0.7.bazel new file mode 100644 index 000000000000..f3a9dea14d42 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indoc-2.0.7.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_proc_macro") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_proc_macro( + name = "indoc", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=indoc", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "2.0.7", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libloading-0.8.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libloading-0.8.9.bazel new file mode 100644 index 000000000000..e87fddeaaa5c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libloading-0.8.9.bazel @@ -0,0 +1,190 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "libloading", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2015", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=libloading", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.8.9", + deps = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-apple-ios": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-linux-android": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ + "@vendor_ts__windows-link-0.2.0//:windows_link", # cfg(windows) + ], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:armv7-linux-androideabi": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:i686-apple-darwin": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:i686-linux-android": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [ + "@vendor_ts__windows-link-0.2.0//:windows_link", # cfg(windows) + ], + "@rules_rust//rust/platform:i686-unknown-freebsd": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-apple-ios": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-linux-android": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ + "@vendor_ts__windows-link-0.2.0//:windows_link", # cfg(windows) + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "@vendor_ts__cfg-if-1.0.3//:cfg_if", # cfg(unix) + ], + "//conditions:default": [], + }), +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.minimal-lexical-0.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.minimal-lexical-0.2.1.bazel new file mode 100644 index 000000000000..40e1e2259be6 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.minimal-lexical-0.2.1.bazel @@ -0,0 +1,100 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "minimal_lexical", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "std", + ], + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=minimal-lexical", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.2.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nom-7.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nom-7.1.3.bazel new file mode 100644 index 000000000000..b1524d8a86d9 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nom-7.1.3.bazel @@ -0,0 +1,105 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "nom", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "std", + ], + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=nom", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "7.1.3", + deps = [ + "@vendor_ts__memchr-2.7.5//:memchr", + "@vendor_ts__minimal-lexical-0.2.1//:minimal_lexical", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pathdiff-0.2.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pathdiff-0.2.3.bazel new file mode 100644 index 000000000000..48df9a3c3d89 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pathdiff-0.2.3.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "pathdiff", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=pathdiff", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.2.3", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel index 1ad22b9f498f..675b426dd1ab 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel @@ -102,6 +102,6 @@ rust_library( version = "0.6.5", deps = [ "@vendor_ts__fixedbitset-0.4.2//:fixedbitset", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf-0.13.1.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf-0.13.1.bazel index 3ad30e38760d..8c41939eb97f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf-0.13.1.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "toml_parser", + name = "phf", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -35,7 +35,7 @@ rust_library( ], ), crate_features = [ - "alloc", + "default", "std", ], crate_root = "src/lib.rs", @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=toml_parser", + "crate-name=phf", "manual", "noclippy", "norustfmt", @@ -97,8 +97,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "0.13.1", deps = [ - "@vendor_ts__winnow-0.7.13//:winnow", + "@vendor_ts__phf_shared-0.13.1//:phf_shared", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf_generator-0.13.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf_generator-0.13.1.bazel new file mode 100644 index 000000000000..c270102428d2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf_generator-0.13.1.bazel @@ -0,0 +1,101 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "phf_generator", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=phf_generator", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.13.1", + deps = [ + "@vendor_ts__fastrand-2.4.1//:fastrand", + "@vendor_ts__phf_shared-0.13.1//:phf_shared", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf_shared-0.13.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf_shared-0.13.1.bazel new file mode 100644 index 000000000000..164cee335225 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.phf_shared-0.13.1.bazel @@ -0,0 +1,104 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "phf_shared", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=phf_shared", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.13.1", + deps = [ + "@vendor_ts__siphasher-1.0.3//:siphasher", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.26.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel similarity index 92% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.26.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel index a495f639d420..5d0886807cb8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.26.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "semver", + name = "prettyplease", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,12 +39,10 @@ rust_library( ], ), crate_features = [ - "default", - "serde", - "std", + "verbatim", ], crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -53,7 +51,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=semver", + "crate-name=prettyplease", "manual", "noclippy", "norustfmt", @@ -102,10 +100,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.26", + version = "0.2.37", deps = [ - "@vendor_ts__semver-1.0.26//:build_script_build", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__prettyplease-0.2.37//:build_script_build", + "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + "@vendor_ts__syn-2.0.106//:syn", ], ) @@ -129,9 +128,7 @@ cargo_build_script( ], ), crate_features = [ - "default", - "serde", - "std", + "verbatim", ], crate_name = "build_script_build", crate_root = "build.rs", @@ -147,8 +144,9 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2018", - pkg_name = "semver", + edition = "2021", + links = "prettyplease02", + pkg_name = "prettyplease", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -157,12 +155,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=semver", + "crate-name=prettyplease", "manual", "noclippy", "norustfmt", ], - version = "1.0.26", + version = "0.2.37", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro-crate-3.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro-crate-3.5.0.bazel new file mode 100644 index 000000000000..0ae50367face --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro-crate-3.5.0.bazel @@ -0,0 +1,100 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "proc_macro_crate", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=proc-macro-crate", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "3.5.0", + deps = [ + "@vendor_ts__toml_edit-0.25.11-spec-1.1.0//:toml_edit", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel index 60cece39191b..073916cafe78 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel @@ -108,7 +108,7 @@ rust_library( version = "0.0.301", deps = [ "@vendor_ts__dashmap-6.1.0//:dashmap", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__la-arena-0.3.1//:la_arena", "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", @@ -117,7 +117,7 @@ rust_library( "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", "@vendor_ts__salsa-0.23.0//:salsa", - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__tracing-0.1.41//:tracing", "@vendor_ts__triomphe-0.1.14//:triomphe", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel index c1272206d934..2d77b3cb351a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel @@ -109,7 +109,7 @@ rust_library( deps = [ "@vendor_ts__arrayvec-0.7.6//:arrayvec", "@vendor_ts__either-1.15.0//:either", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel index bd85f440ba5d..caaa0ae151ed 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel @@ -117,7 +117,7 @@ rust_library( "@vendor_ts__drop_bomb-0.1.5//:drop_bomb", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", "@vendor_ts__ra-ap-rustc_abi-0.123.0//:ra_ap_rustc_abi", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel index 2dbbe4f77179..23f08b414914 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel @@ -118,7 +118,7 @@ rust_library( "@vendor_ts__cov-mark-2.1.0//:cov_mark", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__ena-0.14.3//:ena", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", "@vendor_ts__oorandom-11.1.5//:oorandom", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel index 66d015a2efbf..b004cb57d399 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel @@ -116,7 +116,7 @@ rust_library( "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__line-index-0.1.2//:line_index", "@vendor_ts__memchr-2.7.5//:memchr", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel index 12961c51aec0..f0e9033583f7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel @@ -105,7 +105,7 @@ rust_library( }), version = "0.0.301", deps = [ - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel index 8f551d7bd0b8..0939c28b54b1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel @@ -119,7 +119,7 @@ rust_library( "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", "@vendor_ts__ra_ap_toolchain-0.0.301//:ra_ap_toolchain", "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", "@vendor_ts__serde_json-1.0.145//:serde_json", "@vendor_ts__temp-dir-0.1.16//:temp_dir", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel index 67dd8bdd6104..4508df3a376f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel @@ -101,7 +101,7 @@ rust_library( deps = [ "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__nohash-hasher-0.2.0//:nohash_hasher", "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.relative-path-2.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.relative-path-2.0.1.bazel new file mode 100644 index 000000000000..67aef624737c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.relative-path-2.0.1.bazel @@ -0,0 +1,101 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "relative_path", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=relative-path", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "2.0.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-0.10.0.bazel new file mode 100644 index 000000000000..3c57513b3d3b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-0.10.0.bazel @@ -0,0 +1,112 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "rquickjs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "bindgen", + "default", + "loader", + "macro", + "phf", + "rquickjs-macro", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + proc_macro_deps = [ + "@vendor_ts__rquickjs-macro-0.10.0//:rquickjs_macro", + ], + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rquickjs", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.10.0", + deps = [ + "@vendor_ts__rquickjs-core-0.10.0//:rquickjs_core", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-core-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-core-0.10.0.bazel new file mode 100644 index 000000000000..415c9ee4e4b3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-core-0.10.0.bazel @@ -0,0 +1,110 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "rquickjs_core", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "bindgen", + "loader", + "phf", + "relative-path", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rquickjs-core", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.10.0", + deps = [ + "@vendor_ts__hashbrown-0.16.1//:hashbrown", + "@vendor_ts__phf-0.13.1//:phf", + "@vendor_ts__relative-path-2.0.1//:relative_path", + "@vendor_ts__rquickjs-sys-0.10.0//:rquickjs_sys", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-macro-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-macro-0.10.0.bazel new file mode 100644 index 000000000000..055e627f3bed --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-macro-0.10.0.bazel @@ -0,0 +1,116 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_proc_macro") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_proc_macro( + name = "rquickjs_macro", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "bindgen", + "phf", + "phf_generator", + "phf_shared", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rquickjs-macro", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.10.0", + deps = [ + "@vendor_ts__convert_case-0.8.0//:convert_case", + "@vendor_ts__fnv-1.0.7//:fnv", + "@vendor_ts__ident_case-1.0.1//:ident_case", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__phf_generator-0.13.1//:phf_generator", + "@vendor_ts__phf_shared-0.13.1//:phf_shared", + "@vendor_ts__proc-macro-crate-3.5.0//:proc_macro_crate", + "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + "@vendor_ts__quote-1.0.41//:quote", + "@vendor_ts__rquickjs-core-0.10.0//:rquickjs_core", + "@vendor_ts__syn-2.0.106//:syn", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-sys-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-sys-0.10.0.bazel new file mode 100644 index 000000000000..185637f6ba47 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rquickjs-sys-0.10.0.bazel @@ -0,0 +1,177 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "rquickjs_sys", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "bindgen", + "bindgen-rs", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rquickjs-sys", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.10.0", + deps = [ + "@vendor_ts__rquickjs-sys-0.10.0//:build_script_build", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__bindgen-0.72.1//:bindgen": "bindgen_rs", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "bindgen", + "bindgen-rs", + ], + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + pkg_name = "rquickjs-sys", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rquickjs-sys", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.10.0", + visibility = ["//visibility:private"], + deps = [ + "@vendor_ts__bindgen-0.72.1//:bindgen", + "@vendor_ts__cc-1.2.61//:cc", + ], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel index 25fcd798c654..5e02ff49c087 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel @@ -109,7 +109,7 @@ rust_library( "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", "@vendor_ts__hashbrown-0.15.5//:hashbrown", "@vendor_ts__hashlink-0.10.0//:hashlink", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__intrusive-collections-0.9.7//:intrusive_collections", "@vendor_ts__papaya-0.2.3//:papaya", "@vendor_ts__parking_lot-0.12.4//:parking_lot", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel new file mode 100644 index 000000000000..5c659d959e2c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel @@ -0,0 +1,108 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "semver", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__serde_core-1.0.228//:serde_core": "serde", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "serde", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=semver", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.0.28", + deps = [ + "@vendor_ts__serde_core-1.0.228//:serde_core", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel index eaee1ee4b284..dbbf22985e33 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel @@ -173,49 +173,49 @@ rust_library( "@vendor_ts__serde_json-1.0.145//:build_script_build", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-apple-darwin + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-pc-windows-msvc + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-pc-windows-msvc ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-unknown-linux-gnu ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # arm-unknown-linux-gnueabi + "@vendor_ts__indexmap-2.14.0//:indexmap", # arm-unknown-linux-gnueabi ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # i686-pc-windows-msvc + "@vendor_ts__indexmap-2.14.0//:indexmap", # i686-pc-windows-msvc ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # i686-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # i686-unknown-linux-gnu ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # powerpc-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # powerpc-unknown-linux-gnu ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # riscv64gc-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # riscv64gc-unknown-linux-gnu ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # s390x-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # s390x-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-apple-darwin + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-pc-windows-msvc + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-pc-windows-msvc ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-unknown-freebsd + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-unknown-freebsd ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel index 42f05a8553a0..1cb0484417b3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel @@ -95,7 +95,7 @@ rust_library( }), version = "0.9.34+deprecated", deps = [ - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itoa-1.0.15//:itoa", "@vendor_ts__ryu-1.0.20//:ryu", "@vendor_ts__serde-1.0.228//:serde", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.siphasher-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.siphasher-1.0.3.bazel new file mode 100644 index 000000000000..472af635f83e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.siphasher-1.0.3.bazel @@ -0,0 +1,101 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "siphasher", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "std", + ], + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=siphasher", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.0.3", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallbitvec-2.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallbitvec-2.6.1.bazel new file mode 100644 index 000000000000..6dc39e352601 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallbitvec-2.6.1.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "smallbitvec", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=smallbitvec", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "2.6.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.16.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel index 3e1ae194c3b9..7ba5989625a1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel @@ -45,7 +45,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__thiserror-impl-2.0.16//:thiserror_impl", + "@vendor_ts__thiserror-impl-2.0.18//:thiserror_impl", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -104,9 +104,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.16", + version = "2.0.18", deps = [ - "@vendor_ts__thiserror-2.0.16//:build_script_build", + "@vendor_ts__thiserror-2.0.18//:build_script_build", ], ) @@ -162,7 +162,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "2.0.16", + version = "2.0.18", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.16.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel index 9d87f60d5d14..1c39cdf06597 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel @@ -93,7 +93,7 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.16", + version = "2.0.18", deps = [ "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", "@vendor_ts__quote-1.0.41//:quote", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel index 04609ea84f5a..fad5edad1a26 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel @@ -105,7 +105,7 @@ rust_library( "@vendor_ts__serde_core-1.0.228//:serde_core", "@vendor_ts__serde_spanned-1.0.2//:serde_spanned", "@vendor_ts__toml_datetime-0.7.2//:toml_datetime", - "@vendor_ts__toml_parser-1.0.3//:toml_parser", + "@vendor_ts__toml_parser-1.1.2-spec-1.1.0//:toml_parser", "@vendor_ts__toml_writer-1.0.3//:toml_writer", "@vendor_ts__winnow-0.7.13//:winnow", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel new file mode 100644 index 000000000000..a4809f145b60 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel @@ -0,0 +1,102 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "toml_datetime", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "default", + "std", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=toml_datetime", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.1.1+spec-1.1.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel index b8a2048b67fb..bdee26270825 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel @@ -100,7 +100,7 @@ rust_library( }), version = "0.22.27", deps = [ - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__serde-1.0.228//:serde", "@vendor_ts__serde_spanned-0.6.9//:serde_spanned", "@vendor_ts__toml_datetime-0.6.11//:toml_datetime", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.25.11+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.25.11+spec-1.1.0.bazel new file mode 100644 index 000000000000..596127714520 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.25.11+spec-1.1.0.bazel @@ -0,0 +1,106 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "toml_edit", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "parse", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=toml_edit", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.25.11+spec-1.1.0", + deps = [ + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__toml_datetime-1.1.1-spec-1.1.0//:toml_datetime", + "@vendor_ts__toml_parser-1.1.2-spec-1.1.0//:toml_parser", + "@vendor_ts__winnow-1.0.2//:winnow", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel new file mode 100644 index 000000000000..4504ea44e88a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel @@ -0,0 +1,151 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "toml_parser", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "std", + ] + select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "default", # aarch64-apple-darwin + ], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ + "default", # aarch64-pc-windows-msvc + ], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ + "default", # aarch64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ + "default", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + ], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ + "default", # arm-unknown-linux-gnueabi + ], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [ + "default", # i686-pc-windows-msvc + ], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ + "default", # i686-unknown-linux-gnu + ], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ + "default", # powerpc-unknown-linux-gnu + ], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ + "default", # riscv64gc-unknown-linux-gnu + ], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ + "default", # s390x-unknown-linux-gnu + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "default", # x86_64-apple-darwin + ], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ + "default", # x86_64-pc-windows-msvc + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "default", # x86_64-unknown-freebsd + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "default", # x86_64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "default", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + ], + "//conditions:default": [], + }), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=toml_parser", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.1.2+spec-1.1.0", + deps = [ + "@vendor_ts__winnow-1.0.2//:winnow", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.topological-sort-0.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.topological-sort-0.2.2.bazel new file mode 100644 index 000000000000..4cba2e919677 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.topological-sort-0.2.2.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "topological_sort", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=topological-sort", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.2.2", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.8.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.8.bazel index fd97779c54c6..98cdfaa4d2fd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.8.bazel @@ -101,12 +101,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.25.9", + version = "0.26.8", deps = [ "@vendor_ts__regex-1.11.3//:regex", "@vendor_ts__regex-syntax-0.8.6//:regex_syntax", "@vendor_ts__streaming-iterator-0.1.9//:streaming_iterator", - "@vendor_ts__tree-sitter-0.25.9//:build_script_build", + "@vendor_ts__tree-sitter-0.26.8//:build_script_build", "@vendor_ts__tree-sitter-language-0.1.5//:tree_sitter_language", ], ) @@ -164,10 +164,10 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.25.9", + version = "0.26.8", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", "@vendor_ts__serde_json-1.0.145//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel index c9dd60b03c0e..57cf6cd860bf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.25.0", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-generate-0.26.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-generate-0.26.8.bazel new file mode 100644 index 000000000000..12951a955489 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-generate-0.26.8.bazel @@ -0,0 +1,124 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "tree_sitter_generate", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "load", + "pathdiff", + "qjs-rt", + "rquickjs", + ], + crate_root = "src/generate.rs", + edition = "2021", + proc_macro_deps = [ + "@vendor_ts__indoc-2.0.7//:indoc", + ], + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=tree-sitter-generate", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.26.8", + deps = [ + "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__dunce-1.0.5//:dunce", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__log-0.4.28//:log", + "@vendor_ts__pathdiff-0.2.3//:pathdiff", + "@vendor_ts__regex-1.11.3//:regex", + "@vendor_ts__regex-syntax-0.8.6//:regex_syntax", + "@vendor_ts__rquickjs-0.10.0//:rquickjs", + "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__semver-1.0.28//:semver", + "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde_json-1.0.145//:serde_json", + "@vendor_ts__smallbitvec-2.6.1//:smallbitvec", + "@vendor_ts__thiserror-2.0.18//:thiserror", + "@vendor_ts__topological-sort-0.2.2//:topological_sort", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel index 6b9a7bf0582b..245539d02e73 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.24.8", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.23.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.23.6.bazel new file mode 100644 index 000000000000..fc7a098193a4 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.23.6.bazel @@ -0,0 +1,166 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "tree_sitter_python", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "bindings/rust/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=tree-sitter-python", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.23.6", + deps = [ + "@vendor_ts__tree-sitter-language-0.1.5//:tree_sitter_language", + "@vendor_ts__tree-sitter-python-0.23.6//:build_script_build", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_name = "build_script_build", + crate_root = "bindings/rust/build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + pkg_name = "tree-sitter-python", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=tree-sitter-python", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.23.6", + visibility = ["//visibility:private"], + deps = [ + "@vendor_ts__cc-1.2.61//:cc", + ], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel index 0b7ce3a9a29c..6d68d04cf007 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.23.1", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel index f939b4b9493c..855b75133117 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.23.1", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-segmentation-1.13.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-segmentation-1.13.2.bazel new file mode 100644 index 000000000000..020b1bf1a716 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-segmentation-1.13.2.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "unicode_segmentation", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=unicode-segmentation", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.13.2", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.2.bazel new file mode 100644 index 000000000000..e9d478c9c660 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.2.bazel @@ -0,0 +1,220 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "winnow", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "alloc", # aarch64-apple-darwin + "ascii", # aarch64-apple-darwin + "binary", # aarch64-apple-darwin + "default", # aarch64-apple-darwin + "parser", # aarch64-apple-darwin + "std", # aarch64-apple-darwin + ], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ + "alloc", # aarch64-pc-windows-msvc + "ascii", # aarch64-pc-windows-msvc + "binary", # aarch64-pc-windows-msvc + "default", # aarch64-pc-windows-msvc + "parser", # aarch64-pc-windows-msvc + "std", # aarch64-pc-windows-msvc + ], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ + "alloc", # aarch64-unknown-linux-gnu + "ascii", # aarch64-unknown-linux-gnu + "binary", # aarch64-unknown-linux-gnu + "default", # aarch64-unknown-linux-gnu + "parser", # aarch64-unknown-linux-gnu + "std", # aarch64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ + "alloc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "ascii", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "binary", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "default", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "parser", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "std", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + ], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ + "alloc", # arm-unknown-linux-gnueabi + "ascii", # arm-unknown-linux-gnueabi + "binary", # arm-unknown-linux-gnueabi + "default", # arm-unknown-linux-gnueabi + "parser", # arm-unknown-linux-gnueabi + "std", # arm-unknown-linux-gnueabi + ], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [ + "alloc", # i686-pc-windows-msvc + "ascii", # i686-pc-windows-msvc + "binary", # i686-pc-windows-msvc + "default", # i686-pc-windows-msvc + "parser", # i686-pc-windows-msvc + "std", # i686-pc-windows-msvc + ], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ + "alloc", # i686-unknown-linux-gnu + "ascii", # i686-unknown-linux-gnu + "binary", # i686-unknown-linux-gnu + "default", # i686-unknown-linux-gnu + "parser", # i686-unknown-linux-gnu + "std", # i686-unknown-linux-gnu + ], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ + "alloc", # powerpc-unknown-linux-gnu + "ascii", # powerpc-unknown-linux-gnu + "binary", # powerpc-unknown-linux-gnu + "default", # powerpc-unknown-linux-gnu + "parser", # powerpc-unknown-linux-gnu + "std", # powerpc-unknown-linux-gnu + ], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ + "alloc", # riscv64gc-unknown-linux-gnu + "ascii", # riscv64gc-unknown-linux-gnu + "binary", # riscv64gc-unknown-linux-gnu + "default", # riscv64gc-unknown-linux-gnu + "parser", # riscv64gc-unknown-linux-gnu + "std", # riscv64gc-unknown-linux-gnu + ], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ + "alloc", # s390x-unknown-linux-gnu + "ascii", # s390x-unknown-linux-gnu + "binary", # s390x-unknown-linux-gnu + "default", # s390x-unknown-linux-gnu + "parser", # s390x-unknown-linux-gnu + "std", # s390x-unknown-linux-gnu + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "alloc", # x86_64-apple-darwin + "ascii", # x86_64-apple-darwin + "binary", # x86_64-apple-darwin + "default", # x86_64-apple-darwin + "parser", # x86_64-apple-darwin + "std", # x86_64-apple-darwin + ], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ + "alloc", # x86_64-pc-windows-msvc + "ascii", # x86_64-pc-windows-msvc + "binary", # x86_64-pc-windows-msvc + "default", # x86_64-pc-windows-msvc + "parser", # x86_64-pc-windows-msvc + "std", # x86_64-pc-windows-msvc + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "alloc", # x86_64-unknown-freebsd + "ascii", # x86_64-unknown-freebsd + "binary", # x86_64-unknown-freebsd + "default", # x86_64-unknown-freebsd + "parser", # x86_64-unknown-freebsd + "std", # x86_64-unknown-freebsd + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "alloc", # x86_64-unknown-linux-gnu + "ascii", # x86_64-unknown-linux-gnu + "binary", # x86_64-unknown-linux-gnu + "default", # x86_64-unknown-linux-gnu + "parser", # x86_64-unknown-linux-gnu + "std", # x86_64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "alloc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "ascii", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "binary", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "default", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "parser", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "std", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + ], + "//conditions:default": [], + }), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=winnow", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.0.2", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel index 32a06f947886..f2a70faf4640 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel @@ -165,7 +165,7 @@ cargo_build_script( version = "2.0.16+zstd.1.5.7", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.61//:cc", "@vendor_ts__pkg-config-0.3.32//:pkg_config", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index bf11bc6c82fa..11842460638f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -303,7 +303,7 @@ _NORMAL_DEPENDENCIES = { "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), "tracing": Label("@vendor_ts__tracing-0.1.41//:tracing"), "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber"), - "tree-sitter": Label("@vendor_ts__tree-sitter-0.25.9//:tree_sitter"), + "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.8//:tree_sitter"), "tree-sitter-embedded-template": Label("@vendor_ts__tree-sitter-embedded-template-0.25.0//:tree_sitter_embedded_template"), "tree-sitter-ruby": Label("@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby"), }, @@ -381,10 +381,47 @@ _NORMAL_DEPENDENCIES = { "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), "tracing": Label("@vendor_ts__tracing-0.1.41//:tracing"), "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber"), - "tree-sitter": Label("@vendor_ts__tree-sitter-0.25.9//:tree_sitter"), + "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.8//:tree_sitter"), "zstd": Label("@vendor_ts__zstd-0.13.3//:zstd"), }, }, + "shared/yeast": { + _COMMON_CONDITION: { + "clap": Label("@vendor_ts__clap-4.5.48//:clap"), + "serde": Label("@vendor_ts__serde-1.0.228//:serde"), + "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), + "serde_yaml": Label("@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml"), + "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.8//:tree_sitter"), + "tree-sitter-python": Label("@vendor_ts__tree-sitter-python-0.23.6//:tree_sitter_python"), + "tree-sitter-ruby": Label("@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby"), + }, + }, + "shared/yeast-macros": { + _COMMON_CONDITION: { + "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.101//:proc_macro2"), + "quote": Label("@vendor_ts__quote-1.0.41//:quote"), + "syn": Label("@vendor_ts__syn-2.0.106//:syn"), + }, + }, + "unified/extractor": { + _COMMON_CONDITION: { + "clap": Label("@vendor_ts__clap-4.5.48//:clap"), + "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), + "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), + "rayon": Label("@vendor_ts__rayon-1.11.0//:rayon"), + "regex": Label("@vendor_ts__regex-1.11.3//:regex"), + "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), + "tracing": Label("@vendor_ts__tracing-0.1.41//:tracing"), + "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber"), + "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.8//:tree_sitter"), + "tree-sitter-embedded-template": Label("@vendor_ts__tree-sitter-embedded-template-0.25.0//:tree_sitter_embedded_template"), + }, + }, + "unified/extractor/tree-sitter-swift": { + _COMMON_CONDITION: { + "tree-sitter-language": Label("@vendor_ts__tree-sitter-language-0.1.5//:tree_sitter_language"), + }, + }, } _NORMAL_ALIASES = { @@ -411,6 +448,22 @@ _NORMAL_ALIASES = { _COMMON_CONDITION: { }, }, + "shared/yeast": { + _COMMON_CONDITION: { + }, + }, + "shared/yeast-macros": { + _COMMON_CONDITION: { + }, + }, + "unified/extractor": { + _COMMON_CONDITION: { + }, + }, + "unified/extractor/tree-sitter-swift": { + _COMMON_CONDITION: { + }, + }, } _NORMAL_DEV_DEPENDENCIES = { @@ -431,6 +484,14 @@ _NORMAL_DEV_DEPENDENCIES = { "tree-sitter-ql": Label("@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql"), }, }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _NORMAL_DEV_ALIASES = { @@ -448,6 +509,14 @@ _NORMAL_DEV_ALIASES = { _COMMON_CONDITION: { }, }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _PROC_MACRO_DEPENDENCIES = { @@ -463,6 +532,14 @@ _PROC_MACRO_DEPENDENCIES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _PROC_MACRO_ALIASES = { @@ -478,6 +555,14 @@ _PROC_MACRO_ALIASES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _PROC_MACRO_DEV_DEPENDENCIES = { @@ -493,6 +578,14 @@ _PROC_MACRO_DEV_DEPENDENCIES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _PROC_MACRO_DEV_ALIASES = { @@ -510,6 +603,14 @@ _PROC_MACRO_DEV_ALIASES = { _COMMON_CONDITION: { }, }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _BUILD_DEPENDENCIES = { @@ -525,6 +626,18 @@ _BUILD_DEPENDENCIES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + _COMMON_CONDITION: { + "cc": Label("@vendor_ts__cc-1.2.61//:cc"), + "tree-sitter-generate": Label("@vendor_ts__tree-sitter-generate-0.26.8//:tree_sitter_generate"), + }, + }, } _BUILD_ALIASES = { @@ -540,6 +653,16 @@ _BUILD_ALIASES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + _COMMON_CONDITION: { + }, + }, } _BUILD_PROC_MACRO_DEPENDENCIES = { @@ -555,6 +678,14 @@ _BUILD_PROC_MACRO_DEPENDENCIES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _BUILD_PROC_MACRO_ALIASES = { @@ -570,6 +701,14 @@ _BUILD_PROC_MACRO_ALIASES = { }, "shared/tree-sitter-extractor": { }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "unified/extractor": { + }, + "unified/extractor/tree-sitter-swift": { + }, } _CONDITIONS = { @@ -811,6 +950,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.base64-0.22.1.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__bindgen-0.72.1", + sha256 = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bindgen/0.72.1/download"], + strip_prefix = "bindgen-0.72.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bindgen-0.72.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__bitflags-1.3.2", @@ -923,12 +1072,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__cc-1.2.37", - sha256 = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44", + name = "vendor_ts__cc-1.2.61", + sha256 = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d", type = "tar.gz", - urls = ["https://static.crates.io/crates/cc/1.2.37/download"], - strip_prefix = "cc-1.2.37", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.2.37.bazel"), + urls = ["https://static.crates.io/crates/cc/1.2.61/download"], + strip_prefix = "cc-1.2.61", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.2.61.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cexpr-0.6.0", + sha256 = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cexpr/0.6.0/download"], + strip_prefix = "cexpr-0.6.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cexpr-0.6.0.bazel"), ) maybe( @@ -1021,6 +1180,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.42.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__clang-sys-1.8.1", + sha256 = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clang-sys/1.8.1/download"], + strip_prefix = "clang-sys-1.8.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clang-sys-1.8.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__clap-4.5.48", @@ -1071,6 +1240,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.colorchoice-1.0.4.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__convert_case-0.8.0", + sha256 = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/convert_case/0.8.0/download"], + strip_prefix = "convert_case-0.8.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.convert_case-0.8.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__core-foundation-sys-0.8.7", @@ -1361,6 +1540,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.erased-serde-0.4.6.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__fastrand-2.4.1", + sha256 = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6", + type = "tar.gz", + urls = ["https://static.crates.io/crates/fastrand/2.4.1/download"], + strip_prefix = "fastrand-2.4.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fastrand-2.4.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__figment-0.10.19", @@ -1373,12 +1562,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__find-msvc-tools-0.1.1", - sha256 = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d", + name = "vendor_ts__find-msvc-tools-0.1.9", + sha256 = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582", type = "tar.gz", - urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.1/download"], - strip_prefix = "find-msvc-tools-0.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.1.bazel"), + urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.9/download"], + strip_prefix = "find-msvc-tools-0.1.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.9.bazel"), ) maybe( @@ -1421,6 +1610,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.1.5.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__foldhash-0.2.0", + sha256 = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/foldhash/0.2.0/download"], + strip_prefix = "foldhash-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.2.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__form_urlencoded-1.2.2", @@ -1521,6 +1720,26 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.15.5.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.16.1", + sha256 = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.16.1/download"], + strip_prefix = "hashbrown-0.16.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.16.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.17.1", + sha256 = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.17.1/download"], + strip_prefix = "hashbrown-0.17.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.17.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__hashlink-0.10.0", @@ -1703,12 +1922,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__indexmap-2.11.4", - sha256 = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5", + name = "vendor_ts__indexmap-2.14.0", + sha256 = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/indexmap/2.14.0/download"], + strip_prefix = "indexmap-2.14.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-2.14.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__indoc-2.0.7", + sha256 = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706", type = "tar.gz", - urls = ["https://static.crates.io/crates/indexmap/2.11.4/download"], - strip_prefix = "indexmap-2.11.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-2.11.4.bazel"), + urls = ["https://static.crates.io/crates/indoc/2.0.7/download"], + strip_prefix = "indoc-2.0.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indoc-2.0.7.bazel"), ) maybe( @@ -1871,6 +2100,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.175.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__libloading-0.8.9", + sha256 = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55", + type = "tar.gz", + urls = ["https://static.crates.io/crates/libloading/0.8.9/download"], + strip_prefix = "libloading-0.8.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libloading-0.8.9.bazel"), + ) + maybe( http_archive, name = "vendor_ts__line-index-0.1.2", @@ -1951,6 +2190,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memoffset-0.9.1.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__minimal-lexical-0.2.1", + sha256 = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/minimal-lexical/0.2.1/download"], + strip_prefix = "minimal-lexical-0.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.minimal-lexical-0.2.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__miniz_oxide-0.8.9", @@ -2001,6 +2250,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.nohash-hasher-0.2.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__nom-7.1.3", + sha256 = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/nom/7.1.3/download"], + strip_prefix = "nom-7.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.nom-7.1.3.bazel"), + ) + maybe( http_archive, name = "vendor_ts__notify-8.2.0", @@ -2141,6 +2400,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.parking_lot_core-0.9.11.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__pathdiff-0.2.3", + sha256 = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/pathdiff/0.2.3/download"], + strip_prefix = "pathdiff-0.2.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pathdiff-0.2.3.bazel"), + ) + maybe( http_archive, name = "vendor_ts__pear-0.2.9", @@ -2201,6 +2470,36 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.petgraph-0.6.5.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__phf-0.13.1", + sha256 = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf", + type = "tar.gz", + urls = ["https://static.crates.io/crates/phf/0.13.1/download"], + strip_prefix = "phf-0.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.phf-0.13.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__phf_generator-0.13.1", + sha256 = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737", + type = "tar.gz", + urls = ["https://static.crates.io/crates/phf_generator/0.13.1/download"], + strip_prefix = "phf_generator-0.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.phf_generator-0.13.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__phf_shared-0.13.1", + sha256 = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266", + type = "tar.gz", + urls = ["https://static.crates.io/crates/phf_shared/0.13.1/download"], + strip_prefix = "phf_shared-0.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.phf_shared-0.13.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__pin-project-lite-0.2.16", @@ -2261,6 +2560,26 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ppv-lite86-0.2.21.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__prettyplease-0.2.37", + sha256 = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/prettyplease/0.2.37/download"], + strip_prefix = "prettyplease-0.2.37", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.prettyplease-0.2.37.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__proc-macro-crate-3.5.0", + sha256 = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/proc-macro-crate/3.5.0/download"], + strip_prefix = "proc-macro-crate-3.5.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro-crate-3.5.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__proc-macro2-1.0.101", @@ -2741,6 +3060,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.6.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__relative-path-2.0.1", + sha256 = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/relative-path/2.0.1/download"], + strip_prefix = "relative-path-2.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.relative-path-2.0.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__rowan-0.15.15", @@ -2751,6 +3080,46 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.15.15.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__rquickjs-0.10.0", + sha256 = "a135375fbac5ba723bb6a48f432a72f81539cedde422f0121a86c7c4e96d8e0d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rquickjs/0.10.0/download"], + strip_prefix = "rquickjs-0.10.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rquickjs-0.10.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rquickjs-core-0.10.0", + sha256 = "bccb7121a123865c8ace4dea42e7ed84d78b90cbaf4ca32c59849d8d210c9672", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rquickjs-core/0.10.0/download"], + strip_prefix = "rquickjs-core-0.10.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rquickjs-core-0.10.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rquickjs-macro-0.10.0", + sha256 = "89f93602cc3112c7f30bf5f29e722784232138692c7df4c52ebbac7e035d900d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rquickjs-macro/0.10.0/download"], + strip_prefix = "rquickjs-macro-0.10.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rquickjs-macro-0.10.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rquickjs-sys-0.10.0", + sha256 = "57b1b6528590d4d65dc86b5159eae2d0219709546644c66408b2441696d1d725", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rquickjs-sys/0.10.0/download"], + strip_prefix = "rquickjs-sys-0.10.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rquickjs-sys-0.10.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__rustc-hash-1.1.0", @@ -2913,12 +3282,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__semver-1.0.26", - sha256 = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0", + name = "vendor_ts__semver-1.0.28", + sha256 = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd", type = "tar.gz", - urls = ["https://static.crates.io/crates/semver/1.0.26/download"], - strip_prefix = "semver-1.0.26", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.semver-1.0.26.bazel"), + urls = ["https://static.crates.io/crates/semver/1.0.28/download"], + strip_prefix = "semver-1.0.28", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.semver-1.0.28.bazel"), ) maybe( @@ -3051,6 +3420,26 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.shlex-1.3.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__siphasher-1.0.3", + sha256 = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649", + type = "tar.gz", + urls = ["https://static.crates.io/crates/siphasher/1.0.3/download"], + strip_prefix = "siphasher-1.0.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.siphasher-1.0.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__smallbitvec-2.6.1", + sha256 = "9b0e903ee191d8f7a8fbf0d712c3a1699d19e04ceba5ad1eb673053c7d938a09", + type = "tar.gz", + urls = ["https://static.crates.io/crates/smallbitvec/2.6.1/download"], + strip_prefix = "smallbitvec-2.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smallbitvec-2.6.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__smallvec-1.15.1", @@ -3153,22 +3542,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__thiserror-2.0.16", - sha256 = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0", + name = "vendor_ts__thiserror-2.0.18", + sha256 = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4", type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror/2.0.16/download"], - strip_prefix = "thiserror-2.0.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.16.bazel"), + urls = ["https://static.crates.io/crates/thiserror/2.0.18/download"], + strip_prefix = "thiserror-2.0.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.18.bazel"), ) maybe( http_archive, - name = "vendor_ts__thiserror-impl-2.0.16", - sha256 = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960", + name = "vendor_ts__thiserror-impl-2.0.18", + sha256 = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5", type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror-impl/2.0.16/download"], - strip_prefix = "thiserror-impl-2.0.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.16.bazel"), + urls = ["https://static.crates.io/crates/thiserror-impl/2.0.18/download"], + strip_prefix = "thiserror-impl-2.0.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.18.bazel"), ) maybe( @@ -3261,6 +3650,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-0.7.2.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__toml_datetime-1.1.1-spec-1.1.0", + sha256 = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7", + type = "tar.gz", + urls = ["https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download"], + strip_prefix = "toml_datetime-1.1.1+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__toml_edit-0.22.27", @@ -3273,12 +3672,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__toml_parser-1.0.3", - sha256 = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627", + name = "vendor_ts__toml_edit-0.25.11-spec-1.1.0", + sha256 = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_parser/1.0.3/download"], - strip_prefix = "toml_parser-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.0.3.bazel"), + urls = ["https://static.crates.io/crates/toml_edit/0.25.11+spec-1.1.0/download"], + strip_prefix = "toml_edit-0.25.11+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_edit-0.25.11+spec-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__toml_parser-1.1.2-spec-1.1.0", + sha256 = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526", + type = "tar.gz", + urls = ["https://static.crates.io/crates/toml_parser/1.1.2+spec-1.1.0/download"], + strip_prefix = "toml_parser-1.1.2+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.1.2+spec-1.1.0.bazel"), ) maybe( @@ -3301,6 +3710,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.0.3.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__topological-sort-0.2.2", + sha256 = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/topological-sort/0.2.2/download"], + strip_prefix = "topological-sort-0.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.topological-sort-0.2.2.bazel"), + ) + maybe( http_archive, name = "vendor_ts__tracing-0.1.41", @@ -3363,12 +3782,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__tree-sitter-0.25.9", - sha256 = "ccd2a058a86cfece0bf96f7cce1021efef9c8ed0e892ab74639173e5ed7a34fa", + name = "vendor_ts__tree-sitter-0.26.8", + sha256 = "887bd495d0582c5e3e0d8ece2233666169fa56a9644d172fc22ad179ab2d0538", type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter/0.25.9/download"], - strip_prefix = "tree-sitter-0.25.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-0.25.9.bazel"), + urls = ["https://static.crates.io/crates/tree-sitter/0.26.8/download"], + strip_prefix = "tree-sitter-0.26.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-0.26.8.bazel"), ) maybe( @@ -3381,6 +3800,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-embedded-template-0.25.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__tree-sitter-generate-0.26.8", + sha256 = "c3fb2e1bdb1d5f9d23cd5fa68cf98b3bedbd223c92a2edd60bbcf30bcf7180a5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-generate/0.26.8/download"], + strip_prefix = "tree-sitter-generate-0.26.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-generate-0.26.8.bazel"), + ) + maybe( http_archive, name = "vendor_ts__tree-sitter-json-0.24.8", @@ -3401,6 +3830,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-language-0.1.5.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__tree-sitter-python-0.23.6", + sha256 = "3d065aaa27f3aaceaf60c1f0e0ac09e1cb9eb8ed28e7bcdaa52129cffc7f4b04", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-python/0.23.6/download"], + strip_prefix = "tree-sitter-python-0.23.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-python-0.23.6.bazel"), + ) + maybe( http_archive, name = "vendor_ts__tree-sitter-ql-0.23.1", @@ -3491,6 +3930,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-properties-0.1.3.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__unicode-segmentation-1.13.2", + sha256 = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/unicode-segmentation/1.13.2/download"], + strip_prefix = "unicode-segmentation-1.13.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-segmentation-1.13.2.bazel"), + ) + maybe( http_archive, name = "vendor_ts__unicode-xid-0.2.6", @@ -3961,6 +4410,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-0.7.13.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__winnow-1.0.2", + sha256 = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/winnow/1.0.2/download"], + strip_prefix = "winnow-1.0.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-1.0.2.bazel"), + ) + maybe( http_archive, name = "vendor_ts__wit-bindgen-0.45.1", @@ -4114,6 +4573,7 @@ def crate_repositories(): return [ struct(repo = "vendor_ts__anyhow-1.0.100", is_dev_dep = False), struct(repo = "vendor_ts__argfile-0.2.1", is_dev_dep = False), + struct(repo = "vendor_ts__cc-1.2.61", is_dev_dep = False), struct(repo = "vendor_ts__chalk-ir-0.104.0", is_dev_dep = False), struct(repo = "vendor_ts__chrono-0.4.42", is_dev_dep = False), struct(repo = "vendor_ts__clap-4.5.48", is_dev_dep = False), @@ -4152,13 +4612,17 @@ def crate_repositories(): struct(repo = "vendor_ts__serde-1.0.228", is_dev_dep = False), struct(repo = "vendor_ts__serde_json-1.0.145", is_dev_dep = False), struct(repo = "vendor_ts__serde_with-3.14.1", is_dev_dep = False), + struct(repo = "vendor_ts__serde_yaml-0.9.34-deprecated", is_dev_dep = False), struct(repo = "vendor_ts__syn-2.0.106", is_dev_dep = False), struct(repo = "vendor_ts__toml-0.9.7", is_dev_dep = False), struct(repo = "vendor_ts__tracing-0.1.41", is_dev_dep = False), struct(repo = "vendor_ts__tracing-flame-0.2.0", is_dev_dep = False), struct(repo = "vendor_ts__tracing-subscriber-0.3.20", is_dev_dep = False), - struct(repo = "vendor_ts__tree-sitter-0.25.9", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-0.26.8", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-embedded-template-0.25.0", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-generate-0.26.8", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-language-0.1.5", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-python-0.23.6", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-ruby-0.23.1", is_dev_dep = False), struct(repo = "vendor_ts__triomphe-0.1.14", is_dev_dep = False), struct(repo = "vendor_ts__ungrammar-1.16.1", is_dev_dep = False), diff --git a/misc/scripts/models-as-data/generate_mad.py b/misc/scripts/models-as-data/generate_mad.py index 9e6c5516b492..d78d5b10cc5d 100755 --- a/misc/scripts/models-as-data/generate_mad.py +++ b/misc/scripts/models-as-data/generate_mad.py @@ -67,7 +67,8 @@ def setenvironment(self, database=None, folder=None): self.database = database or self.database self.folder = folder or self.folder self.generated_frameworks = os.path.join( - self.codeql_root, f"{self.language}/ql/lib/ext/generated/modelgenerator/{self.folder}" + self.codeql_root, + f"{self.language}/ql/lib/ext/generated/modelgenerator/{self.folder}", ) self.workDir = tempfile.mkdtemp() if self.ram is None: diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 52fc453aa323..802112d0fc81 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.49 +version: 1.0.50-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/lib/change-notes/2026-05-14-sensitive-data.md b/python/ql/lib/change-notes/2026-05-14-sensitive-data.md new file mode 100644 index 000000000000..49754de35ce1 --- /dev/null +++ b/python/ql/lib/change-notes/2026-05-14-sensitive-data.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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/qlpack.yml b/python/ql/lib/qlpack.yml index 2cd96a3e4430..724d270b4e87 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.1.0 +version: 7.1.1-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/Security/CWE-502/UnsafeDeserialization.qhelp b/python/ql/src/Security/CWE-502/UnsafeDeserialization.qhelp index 2c5afee586b1..dea8a8794bb8 100644 --- a/python/ql/src/Security/CWE-502/UnsafeDeserialization.qhelp +++ b/python/ql/src/Security/CWE-502/UnsafeDeserialization.qhelp @@ -5,22 +5,32 @@

    Deserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable -and in many cases allows an attacker to execute arbitrary code. Even before a +and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, -and finalizers. Automatic deserialization of fields means that an attacker may +and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code.

    -There are many different serialization frameworks. This query currently +There are many different serialization frameworks. This query currently supports Pickle, Marshal and Yaml.

    +

    +Note that a deserialization method is only dangerous if it can instantiate +arbitrary classes. Serialization frameworks that use a schema to instantiate +only expected, predefined types are generally not tracked by this query. Such +frameworks are generally safe with respect to arbitrary-class-instantiation and +gadget-chain attacks when the schema is trusted and does not permit +user-controlled type resolution. However, care must be taken to ensure the schema +strictly limits the allowed types. Permitting common standard library classes +can still leave the application vulnerable to gadget-chain attacks. +

    -Avoid deserialization of untrusted data if at all possible. If the +Avoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, for example JSON.

    diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 46e7203a953d..0544fddc168f 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.2 +version: 1.8.3-dev groups: - python - queries 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..7cb9e0151907 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 | | @@ -42,7 +44,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 | @@ -79,6 +85,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) | 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/ql/extractor/src/extractor.rs b/ql/extractor/src/extractor.rs index 8383d8424eee..66096442e85f 100644 --- a/ql/extractor/src/extractor.rs +++ b/ql/extractor/src/extractor.rs @@ -29,24 +29,28 @@ pub fn run(options: Options) -> std::io::Result<()> { prefix: "ql", ts_language: tree_sitter_ql::LANGUAGE.into(), node_types: tree_sitter_ql::NODE_TYPES, + desugar: None, file_globs: vec!["*.ql".into(), "*.qll".into()], }, simple::LanguageSpec { prefix: "dbscheme", ts_language: tree_sitter_ql_dbscheme::LANGUAGE.into(), node_types: tree_sitter_ql_dbscheme::NODE_TYPES, + desugar: None, file_globs: vec!["*.dbscheme".into()], }, simple::LanguageSpec { prefix: "json", ts_language: tree_sitter_json::LANGUAGE.into(), node_types: tree_sitter_json::NODE_TYPES, + desugar: None, file_globs: vec!["*.json".into(), "*.jsonl".into(), "*.jsonc".into()], }, simple::LanguageSpec { prefix: "blame", ts_language: tree_sitter_blame::LANGUAGE.into(), node_types: tree_sitter_blame::NODE_TYPES, + desugar: None, file_globs: vec!["*.blame".into()], }, ], diff --git a/ql/extractor/src/generator.rs b/ql/extractor/src/generator.rs index 650e11c138b8..96ce5319dd19 100644 --- a/ql/extractor/src/generator.rs +++ b/ql/extractor/src/generator.rs @@ -21,18 +21,22 @@ pub fn run(options: Options) -> std::io::Result<()> { Language { name: "QL".to_owned(), node_types: tree_sitter_ql::NODE_TYPES, + desugar: None, }, Language { name: "Dbscheme".to_owned(), node_types: tree_sitter_ql_dbscheme::NODE_TYPES, + desugar: None, }, Language { name: "Blame".to_owned(), node_types: tree_sitter_blame::NODE_TYPES, + desugar: None, }, Language { name: "JSON".to_owned(), node_types: tree_sitter_json::NODE_TYPES, + desugar: None, }, ]; diff --git a/ruby/extractor/src/extractor.rs b/ruby/extractor/src/extractor.rs index 6807d09e9bec..4849f473ccbc 100644 --- a/ruby/extractor/src/extractor.rs +++ b/ruby/extractor/src/extractor.rs @@ -123,6 +123,7 @@ pub fn run(options: Options) -> std::io::Result<()> { &path, &source, &[], + None, ); let (ranges, line_breaks) = scan_erb( @@ -211,6 +212,7 @@ pub fn run(options: Options) -> std::io::Result<()> { &path, &source, &code_ranges, + None, ); std::fs::create_dir_all(src_archive_file.parent().unwrap())?; if needs_conversion { diff --git a/ruby/extractor/src/generator.rs b/ruby/extractor/src/generator.rs index de1d0dbfd7e3..0430afd103e7 100644 --- a/ruby/extractor/src/generator.rs +++ b/ruby/extractor/src/generator.rs @@ -21,10 +21,12 @@ pub fn run(options: Options) -> std::io::Result<()> { Language { name: "Ruby".to_owned(), node_types: tree_sitter_ruby::NODE_TYPES, + desugar: None, }, Language { name: "Erb".to_owned(), node_types: tree_sitter_embedded_template::NODE_TYPES, + desugar: None, }, ]; diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 261a9890d44b..cfdaf454426f 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 5.2.0 +version: 5.2.1-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 34f5d14c39cd..beaf92c0d8a3 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.2 +version: 1.6.3-dev groups: - ruby - queries diff --git a/ruby/ql/src/queries/security/cwe-502/UnsafeDeserialization.qhelp b/ruby/ql/src/queries/security/cwe-502/UnsafeDeserialization.qhelp index b84c7dce0677..001f7ef1448c 100644 --- a/ruby/ql/src/queries/security/cwe-502/UnsafeDeserialization.qhelp +++ b/ruby/ql/src/queries/security/cwe-502/UnsafeDeserialization.qhelp @@ -7,6 +7,16 @@ Deserializing untrusted data using any method that allows the construction of arbitrary objects is easily exploitable and, in many cases, allows an attacker to execute arbitrary code.

    +

    +Note that a deserialization method is only dangerous if it can instantiate +arbitrary classes or objects. Serialization frameworks that use a schema to instantiate +only expected, predefined types are generally not tracked by this query. Such +frameworks are generally safe with respect to arbitrary-class-instantiation and +gadget-chain attacks when the schema is trusted and does not permit +user-controlled type resolution. However, care must be taken to ensure the schema +strictly limits the allowed types. Permitting common standard library classes +can still leave the application vulnerable to gadget-chain attacks. +

    @@ -31,7 +41,7 @@ safely be used. If deserializing an untrusted XML document using the ox gem, do not use parse_obj and load using the non-default :object mode. Instead use the load method in the default mode or better explicitly set a safe -mode such as :hash. +mode such as :hash.

    diff --git a/rust/ql/lib/change-notes/2026-05-14-sensitive-data.md b/rust/ql/lib/change-notes/2026-05-14-sensitive-data.md new file mode 100644 index 000000000000..5aa6febd49ba --- /dev/null +++ b/rust/ql/lib/change-notes/2026-05-14-sensitive-data.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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/qlpack.yml b/rust/ql/lib/qlpack.yml index 96b825fd9496..47f846eb02b0 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.13 +version: 0.2.14-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 3fde632f1ac0..ec76e8f1265b 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.34 +version: 0.1.35-dev groups: - rust - queries 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/type-inference/associated_types.rs b/rust/ql/test/library-tests/type-inference/associated_types.rs index a678a531f8d4..f382f68ec26f 100644 --- a/rust/ql/test/library-tests/type-inference/associated_types.rs +++ b/rust/ql/test/library-tests/type-inference/associated_types.rs @@ -131,9 +131,9 @@ mod default_method_using_associated_type { println!("{:?}", y); let x5 = S2; - println!("{:?}", x5.m1()); // $ target=m1 type=x5.m1():A.S2 + println!("{:?}", x5.m1()); // $ target=m1 type=x5.m1()@Wrapper:S2 let x6 = S2; - println!("{:?}", x6.m2()); // $ target=m2 type=x6.m2():A.S2 + println!("{:?}", x6.m2()); // $ target=m2 type=x6.m2()@Wrapper:S2 } } @@ -400,10 +400,10 @@ mod generic_associated_type { pub fn test() { let s = S; // Call to the method in `impl` block - let _g1 = s.put(1i32); // $ target=S::put type=_g1:A.i32 + let _g1 = s.put(1i32); // $ target=S::put type=_g1@Wrapper:i32 // Call to default implementation in `trait` block - let _g2 = s.put_two(true, false); // $ target=MyTraitAssoc2::put_two MISSING: type=_g2:A.bool + let _g2 = s.put_two(true, false); // $ target=MyTraitAssoc2::put_two MISSING: type=_g2@Wrapper:bool } } @@ -534,12 +534,12 @@ mod generic_associated_type_name_clash { type Output = Result; fn get(&self) -> Self::Output { - Ok(self.0) // $ fieldof=ST type=Ok(...):Result type=Ok(...):T.Output type=Ok(...):E.Output + Ok(self.0) // $ fieldof=ST type=Ok(...)@Result:Output type=Ok(...)@Result:Output } } pub fn test() { - let _y = ST(true).get(); // $ type=_y:Result type=_y:T.bool type=_y:E.bool target=get + let _y = ST(true).get(); // $ type=_y@Result:bool type=_y@Result:bool target=get } } diff --git a/rust/ql/test/library-tests/type-inference/dereference.rs b/rust/ql/test/library-tests/type-inference/dereference.rs index 4767e07576f4..99886987d995 100644 --- a/rust/ql/test/library-tests/type-inference/dereference.rs +++ b/rust/ql/test/library-tests/type-inference/dereference.rs @@ -46,7 +46,7 @@ impl S { fn explicit_monomorphic_dereference() { // Dereference with method call let a1 = MyIntPointer { value: 34i64 }; - let _b1 = a1.deref(); // $ target=MyIntPointer::deref type=_b1:TRef.i64 + let _b1 = a1.deref(); // $ target=MyIntPointer::deref type=_b1@&:i64 // Dereference with overloaded dereference operator let a2 = MyIntPointer { value: 34i64 }; @@ -60,7 +60,7 @@ fn explicit_monomorphic_dereference() { fn explicit_polymorphic_dereference() { // Explicit dereference with type parameter let c1 = MySmartPointer { value: 'a' }; - let _d1 = c1.deref(); // $ target=MySmartPointer::deref type=_d1:TRef.char + let _d1 = c1.deref(); // $ target=MySmartPointer::deref type=_d1@&:char // Explicit dereference with type parameter let c2 = MySmartPointer { value: 'a' }; @@ -74,7 +74,7 @@ fn explicit_polymorphic_dereference() { fn explicit_ref_dereference() { // Explicit dereference with type parameter let e1 = &'a'; - let _f1 = e1.deref(); // $ target=deref type=_f1:TRef.char + let _f1 = e1.deref(); // $ target=deref type=_f1@&:char // Explicit dereference with type parameter let e2 = &'a'; @@ -88,7 +88,7 @@ fn explicit_ref_dereference() { fn explicit_box_dereference() { // Explicit dereference with type parameter let g1: Box = Box::new('a'); // $ target=new - let _h1 = g1.deref(); // $ target=deref type=_h1:TRef.char + let _h1 = g1.deref(); // $ target=deref type=_h1@&:char // Explicit dereference with type parameter let g2: Box = Box::new('a'); // $ target=new @@ -109,9 +109,9 @@ fn implicit_dereference() { let _y = x.is_positive(); // $ target=is_positive type=_y:bool let z = MySmartPointer { value: S(0i64) }; - let z_ = z.foo(); // $ target=foo type=z_:TRef.i64 + let z_ = z.foo(); // $ target=foo type=z_@&:i64 - let v = Vec::new(); // $ target=new type=v:T.i32 + let v = Vec::new(); // $ target=new type=v@Vec:i32 let mut x = MySmartPointer { value: v }; x.push(0); // $ target=push } diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index ecb4816ebb01..ddba6c53da86 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -34,7 +34,7 @@ mod field_access { fn generic_field_access() { // Explicit type argument - let x = GenericThing:: { a: S }; // $ certainType=x:A.S + let x = GenericThing:: { a: S }; // $ certainType=x@GenericThing:S println!("{:?}", x.a); // $ fieldof=GenericThing // Implicit type argument @@ -427,7 +427,7 @@ mod method_non_parametric_trait_impl { let x = call_trait_m1(thing_s1); // $ type=x:S1 target=call_trait_m1 println!("{:?}", x); - let y = call_trait_m1(thing_s2); // $ type=y:MyThing type=y:A.S2 target=call_trait_m1 + let y = call_trait_m1(thing_s2); // $ type=y:MyThing type=y@MyThing:S2 target=call_trait_m1 println!("{:?}", y.a); // $ fieldof=MyThing // First implementation @@ -566,7 +566,7 @@ mod trait_default_self_type_parameter { // The trait bound on `T` uses the default for `A` which contains `Self` fn tp_uses_default(thing: S) -> i64 { - let _ms = thing.get_a(); // $ target=TraitWithSelfTp::get_a type=_ms:T.S + let _ms = thing.get_a(); // $ target=TraitWithSelfTp::get_a type=_ms@Option:S 0 } @@ -575,7 +575,7 @@ mod trait_default_self_type_parameter { fn get_a_through_tp(thing: &S) { // `thing` is a `TraitWithSelfTp` through the trait hierarchy - let _ms = get_a(thing); // $ target=get_a type=_ms:T.S + let _ms = get_a(thing); // $ target=get_a type=_ms@Option:S } struct MyStruct { @@ -593,7 +593,7 @@ mod trait_default_self_type_parameter { pub fn test() { let s = MyStruct { value: 0 }; - let _ms = get_a(&s); // $ target=get_a type=_ms:T.MyStruct + let _ms = get_a(&s); // $ target=get_a type=_ms@Option:MyStruct } } @@ -871,7 +871,7 @@ mod method_supertraits { fn type_param_trait_to_supertrait>(x: T) { // Test that `MyTrait3` is a subtrait of `MyTrait1>` - let a = x.m1(); // $ target=MyTrait1::m1 type=a:MyThing type=a:A.S1 + let a = x.m1(); // $ target=MyTrait1::m1 type=a@MyThing:S1 println!("{:?}", a); } @@ -898,7 +898,7 @@ mod method_supertraits { let s = call_trait_m1(x); // $ type=s:S1 target=call_trait_m1 let x = MyThing2 { a: S2 }; - let s = call_trait_m1(x); // $ type=s:MyThing type=s:A.S2 target=call_trait_m1 + let s = call_trait_m1(x); // $ type=s@MyThing:S2 target=call_trait_m1 } } @@ -1011,20 +1011,20 @@ mod type_aliases { println!("{:?}", p1); // Type can be only inferred from the type alias - let p2: MyPair = PairOption::PairNone(); // $ certainType=p2:Fst.S1 certainType=p2:Snd.S2 + let p2: MyPair = PairOption::PairNone(); // $ certainType=p2@PairOption:S1 certainType=p2@PairOption:S2 println!("{:?}", p2); // First type from alias, second from constructor - let p3: AnotherPair<_> = PairOption::PairSnd(S3); // $ certainType=p3:Fst.S2 + let p3: AnotherPair<_> = PairOption::PairSnd(S3); // $ certainType=p3@PairOption:S2 println!("{:?}", p3); // First type from alias definition, second from argument to alias - let p3: AnotherPair = PairOption::PairNone(); // $ certainType=p3:Fst.S2 certainType=p3:Snd.S3 + let p3: AnotherPair = PairOption::PairNone(); // $ certainType=p3@PairOption:S2 certainType=p3@PairOption:S3 println!("{:?}", p3); g(PairOption::PairSnd(PairOption::PairSnd(S3))); // $ target=g - let x: S7; // $ certainType=x:Result $ certainType=x:E.S1 $ certainType=x:T.S4 $ certainType=x:T.T41.S2 $ certainType=x:T.T42.S5 $ certainType=x:T.T42.T5.S2 + let x: S7; // $ certainType=x@Result:S1 $ certainType=x@Result:S4 $ certainType=x@Result.S4:S2 $ certainType=x@Result.S4:S5 $ certainType=x@Result.S4.S5:S2 } } @@ -1068,7 +1068,7 @@ mod option_methods { struct S; pub fn f() { - let x1 = MyOption::::new(); // $ certainType=x1:T.S target=new + let x1 = MyOption::::new(); // $ certainType=x1@MyOption:S target=new println!("{:?}", x1); let mut x2 = MyOption::new(); // $ target=new @@ -1192,14 +1192,14 @@ mod method_call_type_conversion { let x7 = S(&S2); // Non-implicit dereference with nested borrow in order to test that the // implicit dereference handling doesn't affect nested borrows. - let t = x7.m1(); // $ target=m1 type=t:& type=t:TRef.S2 + let t = x7.m1(); // $ target=m1 type=t:& type=t@&:S2 println!("{:?}", x7); let x9: String = "Hello".to_string(); // $ certainType=x9:String target=to_string // Implicit `String` -> `str` conversion happens via the `Deref` trait: // https://doc.rust-lang.org/std/string/struct.String.html#deref. - let u = x9.parse::(); // $ target=parse type=u:T.u32 + let u = x9.parse::(); // $ target=parse type=u@Result:u32 let my_thing = &MyInt { a: 37 }; // implicit borrow of a `&` @@ -1382,7 +1382,7 @@ mod builtins { let z = x + y; // $ type=z:i32 target=add let z = x.abs(); // $ target=abs $ type=z:i32 let c = 'c'; // $ certainType=c:char - let hello = "Hello"; // $ certainType=hello:TRef.str + let hello = "Hello"; // $ certainType=hello@&:str let f = 123.0f64; // $ certainType=f:f64 let t = true; // $ certainType=t:bool let f = false; // $ certainType=f:bool @@ -1403,8 +1403,8 @@ mod builtins { } } - let x = [1, 2, 3].my_method(); // $ target=my_method type=x:TRef.i32 - let x = <[_; 3]>::my_method(&[1, 2, 3]); // $ target=my_method type=x:TRef.i32 + let x = [1, 2, 3].my_method(); // $ target=my_method type=x@&:i32 + let x = <[_; 3]>::my_method(&[1, 2, 3]); // $ target=my_method type=x@&:i32 let x = <[i32; 3]>::my_func(); // $ target=my_func type=x:i32 impl MyTrait for [T] { @@ -1418,8 +1418,8 @@ mod builtins { } let s: &[i32] = &[1, 2, 3]; - let x = s.my_method(); // $ target=my_method type=x:TRef.i32 - let x = <[_]>::my_method(s); // $ target=my_method type=x:TRef.i32 + let x = s.my_method(); // $ target=my_method type=x@&:i32 + let x = <[_]>::my_method(s); // $ target=my_method type=x@&:i32 let x = <[i32]>::my_func(); // $ target=my_func type=x:i32 impl MyTrait for (T, i32) { @@ -1433,8 +1433,8 @@ mod builtins { } let p = (42, 7); - let x = p.my_method(); // $ target=my_method type=x:TRef.i32 - let x = <(_, _)>::my_method(&p); // $ target=my_method type=x:TRef.i32 + let x = p.my_method(); // $ target=my_method type=x@&:i32 + let x = <(_, _)>::my_method(&p); // $ target=my_method type=x@&:i32 let x = <(i32, i32)>::my_func(); // $ target=my_func type=x:i32 impl MyTrait for &T { @@ -1448,8 +1448,8 @@ mod builtins { } let r = &42; - let x = r.my_method(); // $ target=my_method type=x:TRef.i32 - let x = <&_>::my_method(&r); // $ target=my_method type=x:TRef.i32 + let x = r.my_method(); // $ target=my_method type=x@&:i32 + let x = <&_>::my_method(&r); // $ target=my_method type=x@&:i32 let x = <&i32>::my_func(); // $ target=my_func type=x:i32 impl MyTrait for *mut T { @@ -1464,8 +1464,8 @@ mod builtins { let mut v = 42; let p: *mut i32 = &mut v; - let x = unsafe { p.my_method() }; // $ target=my_method type=x:TRef.i32 - let x = unsafe { <*mut _>::my_method(&p) }; // $ target=my_method type=x:TRef.i32 + let x = unsafe { p.my_method() }; // $ target=my_method type=x@&:i32 + let x = unsafe { <*mut _>::my_method(&p) }; // $ target=my_method type=x@&:i32 let x = <*mut i32>::my_func(); // $ target=my_func type=x:i32 } } @@ -2046,7 +2046,7 @@ mod indexers { } pub fn f() { - let mut vec = MyVec::new(); // $ type=vec:T.S target=new + let mut vec = MyVec::new(); // $ type=vec@MyVec:S target=new vec.push(S); // $ target=push vec[0].foo(); // $ target=MyVec::index target=foo @@ -2262,24 +2262,24 @@ mod loops { for i in [1, 2, 3].map(|x| x + 1) {} // $ target=map target=add type=i:i32 for i in [1, 2, 3].into_iter() {} // $ target=into_iter type=i:i32 - let vals1 = [1u8, 2, 3]; // $ type=vals1:TArray.u8 + let vals1 = [1u8, 2, 3]; // $ type=vals1@[;]:u8 for u in vals1 {} // $ type=u:u8 - let vals2 = [1u16; 3]; // $ type=vals2:TArray.u16 + let vals2 = [1u16; 3]; // $ type=vals2@[;]:u16 for u in vals2 {} // $ type=u:u16 - let vals3: [u32; 3] = [1, 2, 3]; // $ certainType=vals3:TArray.u32 + let vals3: [u32; 3] = [1, 2, 3]; // $ certainType=vals3@[;]:u32 for u in vals3 {} // $ type=u:u32 - let vals4: [u64; 3] = [1; 3]; // $ certainType=vals4:TArray.u64 + let vals4: [u64; 3] = [1; 3]; // $ certainType=vals4@[;]:u64 for u in vals4 {} // $ type=u:u64 - let mut strings1 = ["foo", "bar", "baz"]; // $ type=strings1:TArray.TRef.str - for s in &strings1 {} // $ type=s:TRef.TRef.str - for s in &mut strings1 {} // $ type=s:TRefMut.TRef.str - for s in strings1 {} // $ type=s:TRef.str + let mut strings1 = ["foo", "bar", "baz"]; // $ type=strings1@[;].&:str + for s in &strings1 {} // $ type=s@&.&:str + for s in &mut strings1 {} // $ type=s@&mut.&:str + for s in strings1 {} // $ type=s@&:str - let strings2 = // $ type=strings2:TArray.String + let strings2 = // $ type=strings2@[;]:String [ String::from("foo"), // $ target=from String::from("bar"), // $ target=from @@ -2287,15 +2287,15 @@ mod loops { ]; for s in strings2 {} // $ type=s:String - let strings3 = // $ type=strings3:TRef.TArray.String + let strings3 = // $ type=strings3@&.[;]:String &[ String::from("foo"), // $ target=from String::from("bar"), // $ target=from String::from("baz"), // $ target=from ]; - for s in strings3 {} // $ type=s:TRef.String + for s in strings3 {} // $ type=s@&:String - let callables = [MyCallable::new(), MyCallable::new(), MyCallable::new()]; // $ target=new $ type=callables:TArray.MyCallable + let callables = [MyCallable::new(), MyCallable::new(), MyCallable::new()]; // $ target=new $ type=callables@[;]:MyCallable for c // $ type=c:MyCallable in callables { @@ -2305,13 +2305,13 @@ mod loops { // for loops with ranges for i in 0..10 {} // $ type=i:i32 - for u in [0u8..10] {} // $ type=u:Range type=u:Idx.u8 - let range = 0..10; // $ certainType=range:Range type=range:Idx.i32 + for u in [0u8..10] {} // $ type=u:Range type=u@Range:u8 + let range = 0..10; // $ certainType=range:Range type=range@Range:i32 for i in range {} // $ type=i:i32 let range_full = ..; // $ certainType=range_full:RangeFull - for i in &[1i64, 2i64, 3i64][range_full] {} // $ target=index MISSING: type=i:TRef.i64 + for i in &[1i64, 2i64, 3i64][range_full] {} // $ target=index MISSING: type=i@&:i64 - let range1 = // $ certainType=range1:Range type=range1:Idx.u16 + let range1 = // $ certainType=range1:Range type=range1@Range:u16 std::ops::Range { start: 0u16, end: 10u16, @@ -2320,39 +2320,39 @@ mod loops { // for loops with containers - let vals3 = vec![1, 2, 3]; // $ type=vals3:Vec $ MISSING: type=vals3:T.i32 + let vals3 = vec![1, 2, 3]; // $ type=vals3:Vec $ MISSING: type=vals3@Vec:i32 for i in vals3 {} // $ MISSING: type=i:i32 - let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ certainType=vals4a:Vec certainType=vals4a:T.u16 + let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ certainType=vals4a@Vec:u16 for u in vals4a {} // $ type=u:u16 - let vals4b = [1u16, 2, 3].to_vec(); // $ MISSING: type=vals4b:Vec type=vals4b:T.u16 + let vals4b = [1u16, 2, 3].to_vec(); // $ MISSING: type=vals4b:Vec type=vals4b@Vec:u16 for u in vals4b {} // $ MISSING: type=u:u16 - let vals5 = Vec::from([1u32, 2, 3]); // $ certainType=vals5:Vec target=from type=vals5:T.u32 + let vals5 = Vec::from([1u32, 2, 3]); // $ target=from type=vals5@Vec:u32 for u in vals5 {} // $ type=u:u32 - let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6:Vec certainType=vals6:T.TRef.u64 - for u in vals6 {} // $ type=u:TRef.u64 + let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6@Vec.&:u64 + for u in vals6 {} // $ type=u@&:u64 - let mut vals7 = Vec::new(); // $ target=new certainType=vals7:Vec type=vals7:T.u8 + let mut vals7 = Vec::new(); // $ target=new type=vals7@Vec:u8 vals7.push(1u8); // $ target=push for u in vals7 {} // $ type=u:u8 - let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ type=matrix1:Vec $ MISSING: type=matrix1:T.Vec type=matrix1:T.T.i32 + let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ type=matrix1:Vec $ MISSING: type=matrix1@Vec:Vec type=matrix1@Vec.Vec:i32 #[rustfmt::skip] - let _ = for row in matrix1 { // $ MISSING: type=row:Vec type=row:T.i32 + let _ = for row in matrix1 { // $ MISSING: type=row:Vec type=row@Vec:i32 for cell in row { // $ MISSING: type=cell:i32 } }; - let mut map1 = std::collections::HashMap::new(); // $ target=new type=map1:K.i32 type=map1:V.Box $ MISSING: type=map1:Hashmap type1=map1:V.T.TRef.str + let mut map1 = std::collections::HashMap::new(); // $ target=new type=map1@HashMap:i32 type=map1@HashMap.Box.&:str map1.insert(1, Box::new("one")); // $ target=insert target=new map1.insert(2, Box::new("two")); // $ target=insert target=new - for key in map1.keys() {} // $ target=keys type=key:TRef.i32 - for value in map1.values() {} // $ target=values type=value:TRef.Box type=value:TRef.T.TRef.str - for (key, value) in map1.iter() {} // $ target=iter type=key:TRef.i32 type=value:TRef.Box type=value:TRef.T.TRef.str - for (key, value) in &map1 {} // $ type=key:TRef.i32 type=value:TRef.Box type=value:TRef.T.TRef.str + for key in map1.keys() {} // $ target=keys type=key@&:i32 + for value in map1.values() {} // $ target=values type=value@&.Box.&:str + for (key, value) in map1.iter() {} // $ target=iter type=key@&:i32 type=value@&.Box.&:str + for (key, value) in &map1 {} // $ type=key@&:i32 type=value@&.Box.&:str // while loops @@ -2398,27 +2398,27 @@ mod explicit_type_args { } pub fn f() { - let x1: Option> = S1::assoc_fun(); // $ certainType=x1:T.T.S2 target=assoc_fun - let x2 = S1::::assoc_fun(); // $ certainType=x2:T.T.S2 target=assoc_fun - let x3 = S3::assoc_fun(); // $ certainType=x3:T.T.S2 target=assoc_fun - let x4 = S1::::method(S1::default()); // $ target=method target=default certainType=x4:T.S2 - let x5 = S3::method(S1::default()); // $ target=method target=default certainType=x5:T.S2 - let x6 = S4::(Default::default()); // $ type=x6:T4.S2 target=default - let x7 = S4(S2); // $ type=x7:T4.S2 - let x8 = S4(0); // $ type=x8:T4.i32 - let x9 = S4(S2::default()); // $ type=x9:T4.S2 target=default - let x10 = S5:: // $ certainType=x10:T5.S2 + let x1: Option> = S1::assoc_fun(); // $ certainType=x1@Option.S1:S2 target=assoc_fun + let x2 = S1::::assoc_fun(); // $ certainType=x2@Option.S1:S2 target=assoc_fun + let x3 = S3::assoc_fun(); // $ certainType=x3@Option.S1:S2 target=assoc_fun + let x4 = S1::::method(S1::default()); // $ target=method target=default certainType=x4@S1:S2 + let x5 = S3::method(S1::default()); // $ target=method target=default certainType=x5@S1:S2 + let x6 = S4::(Default::default()); // $ type=x6@S4:S2 target=default + let x7 = S4(S2); // $ type=x7@S4:S2 + let x8 = S4(0); // $ type=x8@S4:i32 + let x9 = S4(S2::default()); // $ type=x9@S4:S2 target=default + let x10 = S5:: // $ certainType=x10@S5:S2 { field: Default::default(), // $ target=default }; - let x11 = S5 { field: S2 }; // $ type=x11:T5.S2 - let x12 = S5 { field: 0 }; // $ type=x12:T5.i32 - let x13 = S5 // $ type=x13:T5.S2 + let x11 = S5 { field: S2 }; // $ type=x11@S5:S2 + let x12 = S5 { field: 0 }; // $ type=x12@S5:i32 + let x13 = S5 // $ type=x13@S5:S2 { field: S2::default(), // $ target=default }; let x14 = foo::(Default::default()); // $ certainType=x14:i32 target=default target=foo - let x15 = S1::::default(); // $ certainType=x15:T.S2 target=default + let x15 = S1::::default(); // $ certainType=x15@S1:S2 target=default } } @@ -2454,11 +2454,11 @@ mod tuples { // `a` and `b` to be inferred. let a = Default::default(); // $ target=default type=a:i64 let b = Default::default(); // $ target=default type=b:bool - let pair = (a, b); // $ type=pair:T0.i64 type=pair:T1.bool + let pair = (a, b); // $ type=pair@(T_2):i64 type=pair@(T_2):bool let i: i64 = pair.0; // $ fieldof=Tuple2 let j: bool = pair.1; // $ fieldof=Tuple2 - let pair = [1, 1].into(); // $ type=pair:(T_2) type=pair:T0.i32 type=pair:T1.i32 target=into + let pair = [1, 1].into(); // $ type=pair@(T_2):i32 type=pair@(T_2):i32 target=into match pair { (0, 0) => print!("unexpected"), _ => print!("expected"), @@ -2572,7 +2572,7 @@ mod if_expr { pub fn f(b: bool) -> Box> { let x = if b { let y = Default::default(); // $ target=default - y // $ type=y:T.i32 + y // $ type=y@S:i32 } else { S(2) }; @@ -2648,14 +2648,14 @@ mod context_typed { } pub fn f() { - let x = None; // $ type=x:T.i32 + let x = None; // $ type=x@Option:i32 let x: Option = x; - let x = Option::::None; // $ type=x:T.i32 - let x = Option::None::; // $ type=x:T.i32 + let x = Option::::None; // $ type=x@Option:i32 + let x = Option::None::; // $ type=x@Option:i32 fn pin_option(opt: Option, x: T) {} - let x = None; // $ type=x:T.i32 + let x = None; // $ type=x@Option:i32 pin_option(x, 0); // $ target=pin_option enum MyEither { @@ -2663,33 +2663,33 @@ mod context_typed { B { right: T2 }, } - let x = MyEither::A { left: 0 }; // $ type=x:T1.i32 type=x:T2.String + let x = MyEither::A { left: 0 }; // $ type=x@MyEither:i32 type=x@MyEither:String let x: MyEither = x; - let x = MyEither::<_, String>::A { left: 0 }; // $ type=x:T1.i32 certainType=x:T2.String + let x = MyEither::<_, String>::A { left: 0 }; // $ type=x@MyEither:i32 certainType=x@MyEither:String #[rustfmt::skip] - let x = MyEither::B:: { // $ certainType=x:T1.i32 type=x:T2.String + let x = MyEither::B:: { // $ certainType=x@MyEither:i32 type=x@MyEither:String right: String::new(), // $ target=new }; fn pin_my_either(e: MyEither, x: T) {} #[rustfmt::skip] - let x = MyEither::B { // $ type=x:T1.i32 type=x:T2.String + let x = MyEither::B { // $ type=x@MyEither:i32 type=x@MyEither:String right: String::new(), // $ target=new }; pin_my_either(x, 0); // $ target=pin_my_either - let x = Result::Ok(0); // $ type=x:E.String + let x = Result::Ok(0); // $ type=x@Result:String let x: Result = x; - let x = Result::::Ok(0); // $ type=x:E.String - let x = Result::Ok::(0); // $ type=x:E.String + let x = Result::::Ok(0); // $ type=x@Result:String + let x = Result::Ok::(0); // $ type=x@Result:String fn pin_result(res: Result, x: E) {} - let x = Result::Ok(0); // $ type=x:T.i32 type=x:E.bool + let x = Result::Ok(0); // $ type=x@Result:i32 type=x@Result:bool pin_result(x, false); // $ target=pin_result - let mut x = Vec::new(); // $ type=x:T.i32 target=new + let mut x = Vec::new(); // $ type=x@Vec:i32 target=new x.push(0); // $ target=push let y = Default::default(); // $ type=y:i32 target=default diff --git a/rust/ql/test/library-tests/type-inference/pattern_matching.rs b/rust/ql/test/library-tests/type-inference/pattern_matching.rs index 33e6b9f09f30..bc85b0ee96ff 100755 --- a/rust/ql/test/library-tests/type-inference/pattern_matching.rs +++ b/rust/ql/test/library-tests/type-inference/pattern_matching.rs @@ -37,18 +37,18 @@ pub fn f() -> Option<()> { let value3 = 42; if let ref mesg = value3 { - let mesg = mesg; // $ type=mesg:TRef.i32 + let mesg = mesg; // $ type=mesg@&:i32 println!("{mesg}"); } let value4 = Some(42); if let Some(ref mesg) = value4 { - let mesg = mesg; // $ type=mesg:TRef.i32 + let mesg = mesg; // $ type=mesg@&:i32 println!("{mesg}"); } let ref value5 = 42; - let x = value5; // $ type=x:TRef.i32 + let x = value5; // $ type=x@&:i32 let my_record_struct = MyRecordStruct { value1: 42, @@ -102,27 +102,27 @@ pub fn f() -> Option<()> { ) => { let a = value1; // $ type=a:bool let b = x; // $ type=b:i32 - let c = y; // $ type=c:TRef.str + let c = y; // $ type=c@&:str (); } _ => (), } - let opt1 = Some(Default::default()); // $ type=opt1:T.i32 target=default + let opt1 = Some(Default::default()); // $ type=opt1@Option:i32 target=default #[rustfmt::skip] let _ = if let Some::(x) = opt1 { x; // $ type=x:i32 }; - let opt2 = Some(Default::default()); // $ type=opt2:T.i32 target=default + let opt2 = Some(Default::default()); // $ type=opt2@Option:i32 target=default #[rustfmt::skip] let _ = if let Option::Some::(x) = opt2 { x; // $ type=x:i32 }; - let opt3 = Some(Default::default()); // $ type=opt3:T.i32 target=default + let opt3 = Some(Default::default()); // $ type=opt3@Option:i32 target=default #[rustfmt::skip] let _ = if let Option::::Some(x) = opt3 { @@ -197,7 +197,7 @@ pub fn literal_patterns() { let string_val = "hello"; match string_val { "hello" => { - let hello_match = string_val; // $ certainType=hello_match:TRef.str + let hello_match = string_val; // $ certainType=hello_match@&:str println!("String literal: {}", hello_match); } _ => {} @@ -230,7 +230,7 @@ pub fn identifier_patterns() { // IdentPat with ref match &value { ref x => { - let ref_bound = x; // $ type=ref_bound:TRef.TRef.i32 + let ref_bound = x; // $ type=ref_bound@&.&:i32 println!("Reference identifier: {:?}", ref_bound); } } @@ -269,7 +269,7 @@ pub fn identifier_patterns() { let mut ref_mut_val = 5i32; match &mut ref_mut_val { ref mut x => { - let ref_mut_bound = x; // $ type=ref_mut_bound:TRefMut.TRefMut.i32 + let ref_mut_bound = x; // $ type=ref_mut_bound@&mut.&mut:i32 **ref_mut_bound += 1; // $ target=deref target=add_assign println!("Ref mut pattern"); } @@ -341,14 +341,14 @@ pub fn reference_patterns() { match &mut mutable_value { &mut ref x => { - let mut_ref_bound = x; // $ type=mut_ref_bound:TRef.i32 + let mut_ref_bound = x; // $ type=mut_ref_bound@&:i32 println!("Mutable ref pattern: {}", mut_ref_bound); } } match &value { ref x => { - let ref_pattern = x; // $ type=ref_pattern:TRef.TRef.i32 + let ref_pattern = x; // $ type=ref_pattern@&.&:i32 println!("Reference pattern: {}", ref_pattern); } } @@ -525,7 +525,7 @@ pub fn slice_patterns() { // SlicePat - Slice patterns match slice { [] => { - let empty_slice = slice; // $ certainType=empty_slice:TRef.TSlice.i32 + let empty_slice = slice; // $ certainType=empty_slice@&.[]:i32 println!("Empty slice: {:?}", empty_slice); } [x] => { @@ -540,7 +540,7 @@ pub fn slice_patterns() { [first, middle @ .., last] => { let slice_start = *first; // $ MISSING: type=slice_start:i32 let slice_end = *last; // $ MISSING: type=slice_end:i32 - let slice_middle = middle; // $ MISSING: type=slice_middle:TRef.TSlice.i32 + let slice_middle = middle; // $ MISSING: type=slice_middle@&.[]:i32 println!( "First: {}, last: {}, middle len: {}", slice_start, @@ -717,7 +717,7 @@ pub fn complex_nested_patterns() { } // Catch-all with identifier pattern other => { - let other_complex = other; // $ type=other_complex:T0.Point type=other_complex:T1.MyOption + let other_complex = other; // $ type=other_complex@(T_2):Point type=other_complex@(T_2):MyOption println!("Other complex data: {:?}", other_complex); } } @@ -750,7 +750,7 @@ pub fn patterns_in_let_statements() { // Let with reference pattern let value = 42i32; let ref ref_val = value; - let let_ref = ref_val; // $ certainType=let_ref:TRef.i32 + let let_ref = ref_val; // $ certainType=let_ref@&:i32 // Let with mutable pattern let mut mut_val = 10i32; @@ -779,13 +779,13 @@ pub fn patterns_in_function_parameters() { // Call the functions to use them let point = Point { x: 5, y: 10 }; - let extracted = extract_point(point); // $ target=extract_point certainType=extracted:T0.i32 certainType=extracted:T1.i32 + let extracted = extract_point(point); // $ target=extract_point certainType=extracted@(T_2):i32 certainType=extracted@(T_2):i32 let color = Color(200, 100, 50); let red = extract_color(color); // $ target=extract_color certainType=red:u8 let tuple = (42i32, 3.14f64, true); - let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple certainType=tuple_extracted:T0.i32 certainType=tuple_extracted:T1.bool + let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple certainType=tuple_extracted@(T_2):i32 certainType=tuple_extracted@(T_2):bool } #[rustfmt::skip] diff --git a/rust/ql/test/library-tests/type-inference/raw_pointer.rs b/rust/ql/test/library-tests/type-inference/raw_pointer.rs index bf4537f30ce6..065396b35f57 100644 --- a/rust/ql/test/library-tests/type-inference/raw_pointer.rs +++ b/rust/ql/test/library-tests/type-inference/raw_pointer.rs @@ -12,7 +12,7 @@ fn raw_pointer_mut_deref(x: *mut bool) -> i32 { fn raw_const_borrow() { let a: i64 = 10; - let x = &raw const a; // $ type=x:TPtrConst.i64 + let x = &raw const a; // $ type=x@*const:i64 unsafe { let _y = *x; // $ type=_y:i64 } @@ -20,7 +20,7 @@ fn raw_const_borrow() { fn raw_mut_borrow() { let mut a = 10i32; - let x = &raw mut a; // $ type=x:TPtrMut.i32 + let x = &raw mut a; // $ type=x@*mut:i32 unsafe { let _y = *x; // $ type=_y:i32 } @@ -29,7 +29,7 @@ fn raw_mut_borrow() { fn raw_mut_write(cond: bool) { let a = 10i32; // The type of `ptr_written` must be inferred from the write below. - let ptr_written = null_mut(); // $ target=null_mut type=ptr_written:TPtrMut.i32 + let ptr_written = null_mut(); // $ target=null_mut type=ptr_written@*mut:i32 if cond { unsafe { // NOTE: This write is undefined behavior because `ptr_written` is a null pointer. @@ -41,7 +41,7 @@ fn raw_mut_write(cond: bool) { fn raw_type_from_deref(cond: bool) { // The type of `ptr_read` must be inferred from the read below. - let ptr_read = null_mut(); // $ target=null_mut type=ptr_read:TPtrMut.i64 + let ptr_read = null_mut(); // $ target=null_mut type=ptr_read@*mut:i64 if cond { unsafe { // NOTE: This read is undefined behavior because `ptr_read` is a null pointer. diff --git a/rust/ql/test/library-tests/type-inference/regressions.rs b/rust/ql/test/library-tests/type-inference/regressions.rs index 465475475bfb..d854f55a1adc 100644 --- a/rust/ql/test/library-tests/type-inference/regressions.rs +++ b/rust/ql/test/library-tests/type-inference/regressions.rs @@ -149,7 +149,7 @@ mod regression5 { fn foo() -> S2 { let x = S1.into(); // $ target=into - x // $ type=x:T2.S1 + x // $ type=x@S2:S1 } } @@ -176,6 +176,6 @@ mod regression6 { } fn foo() { - let x = S(0) + S(1); // $ target=add1 $ SPURIOUS: target=add2 type=x:T.T.i32 + let x = S(0) + S(1); // $ target=add1 $ SPURIOUS: target=add2 type=x@S.S:i32 } } diff --git a/rust/ql/test/library-tests/type-inference/type-inference.ql b/rust/ql/test/library-tests/type-inference/type-inference.ql index ea8ef68134d0..8dcc34ad8001 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.ql +++ b/rust/ql/test/library-tests/type-inference/type-inference.ql @@ -65,7 +65,7 @@ module TypeTest implements TestSig { predicate hasActualResult(Location location, string element, string tag, string value) { none() } predicate hasOptionalResult(Location location, string element, string tag, string value) { - exists(AstNode n, TypePath path, Type t | + exists(AstNode n, TypePath path, Type t, string at | t = TypeInference::inferType(n, path) and ( tag = "type" @@ -74,11 +74,8 @@ module TypeTest implements TestSig { tag = "certainType" ) and location = n.getLocation() and - ( - if path.isEmpty() - then value = element + ":" + t - else value = element + ":" + path.toString() + "." + t.toString() - ) and + (if path.isEmpty() then at = "" else at = "@" + TypePath::printTypePathVerbose(path)) and + value = element + at + ":" + t.toString() and element = [n.toString(), n.(IdentPat).getName().getText()] ) } 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|((? { /** A case in a switch. */ class Case extends AstNode { - /** Gets a pattern being matched by this case. */ - AstNode getAPattern(); + /** Gets the pattern being matched by this case at the specified (zero-based) `index`. */ + AstNode getPattern(int index); /** Gets the guard expression of this case, if any. */ Expr getGuard(); @@ -489,6 +489,18 @@ module Make0 Ast> { * need to be consecutive nor start from a specific index. */ default Parameter callableGetParameter(Callable c, CallableContext ctx, int index) { none() } + + /** Holds if catch clause `catch` catches all exceptions. */ + default predicate catchAll(CatchClause catch) { none() } + + /** + * Holds if case `c` matches all possible values, for example, if it is a + * `default` case or a match-all pattern like `Object o` or if it is the + * final case in a switch that is known to be exhaustive. + * + * A match-all case can still ultimately fail to match if it has a guard. + */ + default predicate matchAll(Case c) { c instanceof DefaultCase } } /** @@ -612,6 +624,8 @@ module Make0 Ast> { or n instanceof Case or + n = any(Case case).getPattern(_) + or exists(n.(Parameter).getDefaultValue()) ) } @@ -772,12 +786,25 @@ module Make0 Ast> { result = DenseRank2::denseRank(c, ctx.asSome(), rnk) } + private predicate constantCondition(AstNode n, ConditionalSuccessor t) { + n.(BooleanLiteral).getValue() = t.(BooleanSuccessor).getValue() + or + exists(Case c, int i | + Input1::matchAll(c) and + c.getPattern(i) = n and + not exists(c.getPattern(i + 1)) and + t.(MatchingSuccessor).getValue() = true + ) + } + cached private newtype TNode = TBeforeNode(AstNode n) { Input1::cfgCachedStageRef() and exists(getEnclosingCallable(n)) } or TAstNode(AstNode n) { postOrInOrder(n) and exists(getEnclosingCallable(n)) } or TAfterValueNode(AstNode n, ConditionalSuccessor t) { - inConditionalContext(n, t.getKind()) and exists(getEnclosingCallable(n)) + inConditionalContext(n, t.getKind()) and + exists(getEnclosingCallable(n)) and + not constantCondition(n, t.getDual()) } or TAfterNode(AstNode n) { exists(getEnclosingCallable(n)) and @@ -1105,18 +1132,6 @@ module Make0 Ast> { } signature module InputSig2 { - /** Holds if this catch clause catches all exceptions. */ - default predicate catchAll(CatchClause catch) { none() } - - /** - * Holds if this case matches all possible values, for example, if it is a - * `default` case or a match-all pattern like `Object o` or if it is the - * final case in a switch that is known to be exhaustive. - * - * A match-all case can still ultimately fail to match if it has a guard. - */ - default predicate matchAll(Case c) { c instanceof DefaultCase } - /** * Holds if `ast` may result in an abrupt completion `c` originating at * `n`. The boolean `always` indicates whether the abrupt completion @@ -1471,12 +1486,6 @@ module Make0 Ast> { n2.isBefore(condexpr.getElse()) ) or - exists(BooleanLiteral boollit | - inConditionalContext(boollit, _) and - n1.isBefore(boollit) and - n2.isAfterValue(boollit, any(BooleanSuccessor t | t.getValue() = boollit.getValue())) - ) - or exists(PatternMatchExpr pme | n1.isBefore(pme) and n2.isBefore(pme.getExpr()) @@ -1662,7 +1671,7 @@ module Make0 Ast> { exists(MatchingSuccessor t | n1.isBefore(catchclause) and n2.isAfterValue(catchclause, t) and - if Input2::catchAll(catchclause) then t.getValue() = true else any() + if Input1::catchAll(catchclause) then t.getValue() = true else any() ) or exists(PreControlFlowNode beforeVar, PreControlFlowNode beforeCond | @@ -1720,21 +1729,22 @@ module Make0 Ast> { ) or exists(Case case | - exists(MatchingSuccessor t | - n1.isBefore(case) and - n2.isAfterValue(case, t) and - if Input2::matchAll(case) then t.getValue() = true else any() + n1.isBefore(case) and + ( + if exists(case.getPattern(_)) + then n2.isBefore(case.getPattern(0)) + else n2.isAfterValue(case, any(MatchingSuccessor t | t.getValue() = true)) ) or - exists( - PreControlFlowNode beforePattern, PreControlFlowNode beforeGuard, - PreControlFlowNode beforeBody - | - ( - beforePattern.isBefore(case.getAPattern()) - or - not exists(case.getAPattern()) and beforePattern = beforeGuard - ) and + exists(int i, MatchingSuccessor ms | n1.isAfterValue(case.getPattern(i), ms) | + ms.getValue() = false and + n2.isBefore(case.getPattern(i + 1)) + or + (ms.getValue() = true or not exists(case.getPattern(i + 1))) and + n2.isAfterValue(case, ms) + ) + or + exists(PreControlFlowNode beforeGuard, PreControlFlowNode beforeBody | ( beforeGuard.isBefore(case.getGuard()) or @@ -1748,9 +1758,6 @@ module Make0 Ast> { ) | n1.isAfterValue(case, any(MatchingSuccessor t | t.getValue() = true)) and - n2 = beforePattern - or - n1.isAfter(case.getAPattern()) and n2 = beforeGuard or n1.isAfterTrue(case.getGuard()) and @@ -2225,12 +2232,6 @@ module Make0 Ast> { t instanceof DirectSuccessor and node.isAdditional(any(ForeachStmt foreach), loopHeaderTag()) ) and - // allow for disjunctive patterns (e.g. `case "foo", "bar":`) - not ( - t instanceof DirectSuccessor and - node.isAfterValue(any(Case c | 2 <= strictcount(c.getAPattern())), - any(MatchingSuccessor m | m.getValue() = true)) - ) and // allow for functions with multiple bodies not exists(Callable c | successor.getAstNode() = getBodyEntry(c, _) and diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index fa246d14d696..7fbe2fd4ea99 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.33 +version: 2.0.34-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 700651f8de61..34336f4c3221 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.5 +version: 2.1.6-dev groups: shared library: true dependencies: diff --git a/shared/mad/codeql/mad/ModelValidation.qll b/shared/mad/codeql/mad/ModelValidation.qll index 5eaa78626ab3..3f11d3ce0896 100644 --- a/shared/mad/codeql/mad/ModelValidation.qll +++ b/shared/mad/codeql/mad/ModelValidation.qll @@ -54,6 +54,8 @@ module KindValidation { this.matches([ // shared "credentials-%", "encryption-%", "qltest%", "test-%", "regex-use%", + // Java-only currently + "path-injection[%]", // Swift-only currently, but may be shared in the future "%string-%length", "weak-hash-input-%", // Go-only currently, but may be shared in the future diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 472719d4127b..5631fbf1a734 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index d29cac4faa18..794f238b6e90 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.27 +version: 0.0.28-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 4261dfb4991e..e43819bf36ee 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 3d6feafbf39b..242382c6a1f3 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 517a79c557c9..9e510c43dd0c 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.25 +version: 2.0.26-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 71e6b70a3138..14e33e435d13 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.49 +version: 1.0.50-dev library: true groups: shared dataExtensions: diff --git a/shared/tree-sitter-extractor/BUILD.bazel b/shared/tree-sitter-extractor/BUILD.bazel index ee19d8e5c778..5539641e90e9 100644 --- a/shared/tree-sitter-extractor/BUILD.bazel +++ b/shared/tree-sitter-extractor/BUILD.bazel @@ -12,7 +12,9 @@ rust_library( compile_data = [ "src/generator/prefix.dbscheme", ], - deps = all_crate_deps(), + deps = all_crate_deps() + [ + "//shared/yeast", + ], ) alias( diff --git a/shared/tree-sitter-extractor/Cargo.toml b/shared/tree-sitter-extractor/Cargo.toml index d02f02fd5888..1ad18a6df5a5 100644 --- a/shared/tree-sitter-extractor/Cargo.toml +++ b/shared/tree-sitter-extractor/Cargo.toml @@ -20,6 +20,7 @@ serde_json = "1.0" chrono = { version = "0.4.42", features = ["serde"] } num_cpus = "1.17.0" zstd = "0.13.3" +yeast = { path = "../yeast" } [dev-dependencies] tree-sitter-ql = "0.23.1" diff --git a/shared/tree-sitter-extractor/src/extractor/mod.rs b/shared/tree-sitter-extractor/src/extractor/mod.rs index 0ace38318810..00816a00fd04 100644 --- a/shared/tree-sitter-extractor/src/extractor/mod.rs +++ b/shared/tree-sitter-extractor/src/extractor/mod.rs @@ -18,6 +18,82 @@ use tree_sitter::{Language, Node, Parser, Range, Tree}; pub mod simple; +/// Trait abstracting over tree-sitter and yeast node types for extraction. +trait AstNode { + fn kind(&self) -> &str; + fn is_named(&self) -> bool; + fn is_missing(&self) -> bool; + fn is_error(&self) -> bool; + fn is_extra(&self) -> bool; + fn start_position(&self) -> tree_sitter::Point; + fn end_position(&self) -> tree_sitter::Point; + fn byte_range(&self) -> std::ops::Range; + fn end_byte(&self) -> usize { + self.byte_range().end + } + /// For yeast nodes with synthetic content, return it. Otherwise None. + fn opt_string_content(&self) -> Option { + None + } +} + +impl<'a> AstNode for Node<'a> { + fn kind(&self) -> &str { + Node::kind(self) + } + fn is_named(&self) -> bool { + Node::is_named(self) + } + fn is_missing(&self) -> bool { + Node::is_missing(self) + } + fn is_error(&self) -> bool { + Node::is_error(self) + } + fn is_extra(&self) -> bool { + Node::is_extra(self) + } + fn start_position(&self) -> tree_sitter::Point { + Node::start_position(self) + } + fn end_position(&self) -> tree_sitter::Point { + Node::end_position(self) + } + fn byte_range(&self) -> std::ops::Range { + Node::byte_range(self) + } +} + +impl AstNode for yeast::Node { + fn kind(&self) -> &str { + yeast::Node::kind(self) + } + fn is_named(&self) -> bool { + yeast::Node::is_named(self) + } + fn is_missing(&self) -> bool { + yeast::Node::is_missing(self) + } + fn is_error(&self) -> bool { + yeast::Node::is_error(self) + } + fn is_extra(&self) -> bool { + yeast::Node::is_extra(self) + } + fn start_position(&self) -> tree_sitter::Point { + yeast::Node::start_position(self) + } + fn end_position(&self) -> tree_sitter::Point { + yeast::Node::end_position(self) + } + fn byte_range(&self) -> std::ops::Range { + yeast::Node::byte_range(self) + } + fn opt_string_content(&self) -> Option { + yeast::Node::opt_string_content(self) + } +} + /// Sets the tracing level based on the environment variables /// `RUST_LOG` and `CODEQL_VERBOSITY` (prioritized in that order), /// falling back to `warn` if neither is set. @@ -204,6 +280,11 @@ pub fn location_label(writer: &mut trap::Writer, location: trap::Location) -> tr } /// Extracts the source file at `path`, which is assumed to be canonicalized. +/// When `yeast_runner` is `Some`, the parsed tree is first transformed +/// through the supplied yeast `Runner` before TRAP extraction. Building the +/// `Runner` (which parses YAML and constructs the schema) is the caller's +/// responsibility, allowing it to be done once and shared across files. +#[allow(clippy::too_many_arguments)] pub fn extract( language: &Language, language_prefix: &str, @@ -214,6 +295,7 @@ pub fn extract( path: &Path, source: &[u8], ranges: &[Range], + yeast_runner: Option<&yeast::Runner<'_>>, ) { let path_str = file_paths::normalize_and_transform_path(path, transformer); let span = tracing::span!( @@ -236,13 +318,20 @@ pub fn extract( source, diagnostics_writer, trap_writer, - // TODO: should we handle path strings that are not valid UTF8 better? &path_str, file_label, language_prefix, schema, ); - traverse(&tree, &mut visitor); + + if let Some(yeast_runner) = yeast_runner { + let ast = yeast_runner + .run_from_tree(&tree) + .unwrap_or_else(|e| panic!("Desugaring failed for {path_str}: {e}")); + traverse_yeast(&ast, &mut visitor); + } else { + traverse(&tree, &mut visitor); + } parser.reset(); } @@ -329,11 +418,11 @@ impl<'a> Visitor<'a> { ); } - fn record_parse_error_for_node( + fn record_parse_error_for_node( &mut self, message: &str, args: &[diagnostics::MessageArg], - node: Node, + node: &N, status_page: bool, ) { let loc = location_for(self, self.file_label, node); @@ -357,7 +446,7 @@ impl<'a> Visitor<'a> { self.record_parse_error(loc_label, &mesg); } - fn enter_node(&mut self, node: Node) -> bool { + fn enter_node(&mut self, node: &N) -> bool { if node.is_missing() { self.record_parse_error_for_node( "A parse error occurred (expected {} symbol). Check the syntax of the file. If the file is invalid, correct the error or {} the file from analysis.", @@ -383,20 +472,21 @@ impl<'a> Visitor<'a> { true } - fn leave_node(&mut self, field_name: Option<&'static str>, node: Node) { + fn leave_node(&mut self, field_name: Option<&'static str>, node: &N) { if node.is_error() || node.is_missing() { return; } let (id, _, child_nodes) = self.stack.pop().expect("Vistor: empty stack"); let loc = location_for(self, self.file_label, node); let loc_label = location_label(self.trap_writer, loc); + let type_name = TypeName { + kind: node.kind().to_owned(), + named: node.is_named(), + }; let table = self .schema - .get(&TypeName { - kind: node.kind().to_owned(), - named: node.is_named(), - }) - .unwrap(); + .get(&type_name) + .unwrap_or_else(|| panic!("missing extractor schema entry for {type_name:?}")); let mut valid = true; let parent_info = match self.stack.last_mut() { Some(p) if !node.is_extra() => { @@ -434,7 +524,7 @@ impl<'a> Visitor<'a> { fields, name: table_name, } => { - if let Some(args) = self.complex_node(&node, fields, &child_nodes, id) { + if let Some(args) = self.complex_node(node, fields, &child_nodes, id) { self.trap_writer.add_tuple( &self.ast_node_location_table_name, vec![trap::Arg::Label(id), trap::Arg::Label(loc_label)], @@ -495,9 +585,9 @@ impl<'a> Visitor<'a> { } } - fn complex_node( + fn complex_node( &mut self, - node: &Node, + node: &N, fields: &[Field], child_nodes: &[ChildNode], parent_id: trap::Label, @@ -529,7 +619,7 @@ impl<'a> Visitor<'a> { diagnostics::MessageArg::Code(&format!("{:?}", child_node.type_name)), diagnostics::MessageArg::Code(&format!("{:?}", field.type_info)), ], - *node, + node, false, ); } @@ -541,7 +631,7 @@ impl<'a> Visitor<'a> { diagnostics::MessageArg::Code(child_node.field_name.unwrap_or("child")), diagnostics::MessageArg::Code(&format!("{:?}", child_node.type_name)), ], - *node, + node, false, ); } @@ -566,7 +656,7 @@ impl<'a> Visitor<'a> { node.kind(), column_name ); - self.record_parse_error_for_node(&error_message, &[], *node, false); + self.record_parse_error_for_node(&error_message, &[], node, false); } } Storage::Table { @@ -582,7 +672,7 @@ impl<'a> Visitor<'a> { diagnostics::MessageArg::Code(node.kind()), diagnostics::MessageArg::Code(table_name), ], - *node, + node, false, ); break; @@ -639,15 +729,21 @@ impl<'a> Visitor<'a> { } // Emit a slice of a source file as an Arg. -fn sliced_source_arg(source: &[u8], n: Node) -> trap::Arg { - let range = n.byte_range(); - trap::Arg::String(String::from_utf8_lossy(&source[range.start..range.end]).into_owned()) +fn sliced_source_arg(source: &[u8], n: &N) -> trap::Arg { + trap::Arg::String(n.opt_string_content().unwrap_or_else(|| { + let range = n.byte_range(); + String::from_utf8_lossy(&source[range.start..range.end]).into_owned() + })) } // Emit a pair of `TrapEntry`s for the provided node, appropriately calibrated. // The first is the location and label definition, and the second is the // 'Located' entry. -fn location_for(visitor: &mut Visitor, file_label: trap::Label, n: Node) -> trap::Location { +fn location_for( + visitor: &mut Visitor, + file_label: trap::Label, + n: &N, +) -> trap::Location { // Tree-sitter row, column values are 0-based while CodeQL starts // counting at 1. In addition Tree-sitter's row and column for the // end position are exclusive while CodeQL's end positions are inclusive. @@ -715,6 +811,28 @@ fn location_for(visitor: &mut Visitor, file_label: trap::Label, n: Node) -> trap fn traverse(tree: &Tree, visitor: &mut Visitor) { let cursor = &mut tree.walk(); + visitor.enter_node(&cursor.node()); + let mut recurse = true; + loop { + if recurse && cursor.goto_first_child() { + recurse = visitor.enter_node(&cursor.node()); + } else { + visitor.leave_node(cursor.field_name(), &cursor.node()); + + if cursor.goto_next_sibling() { + recurse = visitor.enter_node(&cursor.node()); + } else if cursor.goto_parent() { + recurse = false; + } else { + break; + } + } + } +} + +fn traverse_yeast(tree: &yeast::Ast, visitor: &mut Visitor) { + use yeast::Cursor; + let mut cursor = tree.walk(); visitor.enter_node(cursor.node()); let mut recurse = true; loop { diff --git a/shared/tree-sitter-extractor/src/extractor/simple.rs b/shared/tree-sitter-extractor/src/extractor/simple.rs index b8446d02f892..6fcd29b03443 100644 --- a/shared/tree-sitter-extractor/src/extractor/simple.rs +++ b/shared/tree-sitter-extractor/src/extractor/simple.rs @@ -7,11 +7,17 @@ use std::path::{Path, PathBuf}; use crate::diagnostics; use crate::node_types; +use yeast; pub struct LanguageSpec { pub prefix: &'static str, pub ts_language: tree_sitter::Language, pub node_types: &'static str, + /// Optional yeast desugaring configuration. When set, the parsed + /// tree is rewritten through yeast before TRAP extraction. The + /// config's `output_node_types_yaml` (if set) provides the schema + /// used both at runtime (for the rewriter) and for TRAP validation. + pub desugar: Option, pub file_globs: Vec, } @@ -85,9 +91,35 @@ impl Extractor { .collect(); let mut schemas = vec![]; + let mut yeast_runners = Vec::new(); for lang in &self.languages { - let schema = node_types::read_node_types_str(lang.prefix, lang.node_types)?; + let effective_node_types: String = + match lang.desugar.as_ref().and_then(|c| c.output_node_types_yaml) { + Some(yaml) => yeast::node_types_yaml::convert(yaml).map_err(|e| { + std::io::Error::other(format!( + "Failed to convert YAML node-types to JSON for {}: {e}", + lang.prefix + )) + })?, + None => lang.node_types.to_string(), + }; + let schema = node_types::read_node_types_str(lang.prefix, &effective_node_types)?; schemas.push(schema); + + // Build the yeast runner once per language so the YAML schema + // isn't re-parsed for every file. + let yeast_runner = lang + .desugar + .as_ref() + .map(|config| yeast::Runner::from_config(lang.ts_language.clone(), config)) + .transpose() + .map_err(|e| { + std::io::Error::other(format!( + "Failed to build desugaring runner for {}: {e}", + lang.prefix + )) + })?; + yeast_runners.push(yeast_runner); } // Construct a single globset containing all language globs, @@ -162,6 +194,7 @@ impl Extractor { &path, &source, &[], + yeast_runners[i].as_ref(), ); std::fs::create_dir_all(src_archive_file.parent().unwrap())?; std::fs::copy(&path, &src_archive_file)?; diff --git a/shared/tree-sitter-extractor/src/generator/language.rs b/shared/tree-sitter-extractor/src/generator/language.rs index f0b0ed1790f2..a95f750b5727 100644 --- a/shared/tree-sitter-extractor/src/generator/language.rs +++ b/shared/tree-sitter-extractor/src/generator/language.rs @@ -1,4 +1,9 @@ pub struct Language { pub name: String, pub node_types: &'static str, + /// Optional yeast desugaring configuration. When set with an + /// `output_node_types_yaml`, the generator uses that YAML for the + /// dbscheme/QL library instead of `node_types`. The `rules` field is + /// unused at code-generation time; only the schema matters. + pub desugar: Option, } diff --git a/shared/tree-sitter-extractor/src/generator/mod.rs b/shared/tree-sitter-extractor/src/generator/mod.rs index 78e9e4a0b694..d2521c51b3ec 100644 --- a/shared/tree-sitter-extractor/src/generator/mod.rs +++ b/shared/tree-sitter-extractor/src/generator/mod.rs @@ -6,6 +6,7 @@ use std::io::Write; use std::path::PathBuf; use crate::node_types; +use yeast; pub mod dbscheme; pub mod language; @@ -68,7 +69,20 @@ pub fn generate( let token_name = format!("{}_token", &prefix); let tokeninfo_name = format!("{}_tokeninfo", &prefix); let reserved_word_name = format!("{}_reserved_word", &prefix); - let nodes = node_types::read_node_types_str(&prefix, language.node_types)?; + let effective_node_types: String = match language + .desugar + .as_ref() + .and_then(|c| c.output_node_types_yaml) + { + Some(yaml) => yeast::node_types_yaml::convert(yaml).map_err(|e| { + std::io::Error::other(format!( + "Failed to convert YAML node-types to JSON for {}: {e}", + language.name + )) + })?, + None => language.node_types.to_string(), + }; + let nodes = node_types::read_node_types_str(&prefix, &effective_node_types)?; let (dbscheme_entries, mut ast_node_members, token_kinds) = convert_nodes(&nodes); ast_node_members.insert(&token_name); writeln!(&mut dbscheme_writer, "/*- {} dbscheme -*/", language.name)?; diff --git a/shared/tree-sitter-extractor/tests/integration_test.rs b/shared/tree-sitter-extractor/tests/integration_test.rs index 2b243ff7945b..694eb526f394 100644 --- a/shared/tree-sitter-extractor/tests/integration_test.rs +++ b/shared/tree-sitter-extractor/tests/integration_test.rs @@ -13,6 +13,7 @@ fn simple_extractor() { prefix: "ql", ts_language: tree_sitter_ql::LANGUAGE.into(), node_types: tree_sitter_ql::NODE_TYPES, + desugar: None, file_globs: vec!["*.qll".into()], }; diff --git a/shared/tree-sitter-extractor/tests/multiple_languages.rs b/shared/tree-sitter-extractor/tests/multiple_languages.rs index 2e45e56754a3..e345eec58280 100644 --- a/shared/tree-sitter-extractor/tests/multiple_languages.rs +++ b/shared/tree-sitter-extractor/tests/multiple_languages.rs @@ -13,12 +13,14 @@ fn multiple_language_extractor() { prefix: "ql", ts_language: tree_sitter_ql::LANGUAGE.into(), node_types: tree_sitter_ql::NODE_TYPES, + desugar: None, file_globs: vec!["*.qll".into()], }; let lang_json = simple::LanguageSpec { prefix: "json", ts_language: tree_sitter_json::LANGUAGE.into(), node_types: tree_sitter_json::NODE_TYPES, + desugar: None, file_globs: vec!["*.json".into(), "*Jsonfile".into()], }; diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index c1df7d67b850..10b77ca04381 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.49 +version: 1.0.50-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 2f22c6655a58..9301be5228f9 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 1f4400d8f2d7..cf82d77b5e1d 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -275,7 +275,34 @@ module Make1 Input1> { class TypePath = UnboundList; /** Provides predicates for constructing `TypePath`s. */ - module TypePath = UnboundList; + module TypePath { + import UnboundList + + private string printTypeParameterVerbose(TypeParameter tp) { + exists(Type t | + t.getATypeParameter() = tp and + result = t.toString() + "<" + tp.toString() + ">" + ) + } + + /** + * Gets a verbose textual representation of `path`, which includes the names + * of the types that the type parameters belong to. + * + * For example, the verbose textual representation of the path `"T1.T2"` is + * `"S1.S2"`, provided that `T1` is a type parameter of `S1` and `T2` + * is a type parameter of `S2`. + */ + bindingset[path] + string printTypePathVerbose(TypePath path) { + result = + concat(int i, TypeParameter e | + e = path.getElement(i) + | + printTypeParameterVerbose(e), "." order by i + ) + } + } /** * A class that has a type tree associated with it. diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 039107b5ef96..1db3c0e95acc 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.30 +version: 0.0.31-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 4f8f21fd5690..436b35815f01 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.33 +version: 2.0.34-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 441404e19f3b..4057cfb57844 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index f3b6b7f3ff83..cff240056a43 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.36 +version: 2.0.37-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 718c36108f61..748ac73e0f8d 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 4bb6e173ab60..54d582bb9fab 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.49 +version: 1.0.50-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/yeast-macros/BUILD.bazel b/shared/yeast-macros/BUILD.bazel new file mode 100644 index 000000000000..71bc6eb288ad --- /dev/null +++ b/shared/yeast-macros/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_rust//rust:defs.bzl", "rust_proc_macro") +load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") + +exports_files(["Cargo.toml"]) + +rust_proc_macro( + name = "yeast-macros", + srcs = glob(["src/**/*.rs"]), + aliases = aliases(), + visibility = ["//visibility:public"], + deps = all_crate_deps(), +) diff --git a/shared/yeast-macros/Cargo.toml b/shared/yeast-macros/Cargo.toml new file mode 100644 index 000000000000..30c82d03b6eb --- /dev/null +++ b/shared/yeast-macros/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "yeast-macros" +version = "0.1.0" +edition = "2021" + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1.0" +quote = "1.0" +syn = "2.0" diff --git a/shared/yeast-macros/src/lib.rs b/shared/yeast-macros/src/lib.rs new file mode 100644 index 000000000000..1d7236b500a9 --- /dev/null +++ b/shared/yeast-macros/src/lib.rs @@ -0,0 +1,112 @@ +use proc_macro::TokenStream; +use proc_macro2::TokenStream as TokenStream2; + +mod parse; + +/// Proc macro for constructing a `QueryNode` from a tree-sitter-inspired pattern. +/// +/// # Syntax +/// +/// ```text +/// (_) - match any named node (skips unnamed tokens) +/// _ - match any node, named or unnamed +/// (kind) - match a named node of the given kind +/// ("literal") - match an unnamed token by its text +/// "literal" - shorthand for `("literal")` +/// (kind field: (pattern)) - match with named field +/// (kind field: _) - bare `_` and bare literals work in field position too +/// (kind (pat) (pat)...) - match unnamed children +/// (pattern) @capture - capture the matched node +/// "literal" @capture - capture an unnamed token +/// _ @capture - capture any node +/// (pattern)* @capture - capture each repeated match +/// (pattern)? - zero or one +/// ``` +/// +/// Named fields and bare child patterns may be intermixed in any order. +#[proc_macro] +pub fn query(input: TokenStream) -> TokenStream { + let input2: TokenStream2 = input.into(); + match parse::parse_query_top(input2) { + Ok(output) => output.into(), + Err(err) => err.to_compile_error().into(), + } +} + +/// Build a single AST node from a template, returning its `Id`. +/// +/// # Template syntax +/// +/// ```text +/// (kind "literal") - leaf with static content +/// (kind #{expr}) - leaf with computed content (expr.to_string()) +/// (kind $fresh) - leaf with auto-generated unique name +/// {expr} - embed a Rust expression returning Id +/// {..expr} - splice an iterable of Id (in child/field position) +/// field: {..expr} - splice into a named field +/// ``` +/// +/// Can be called with an explicit context or using the implicit context +/// from an enclosing `rule!`: +/// +/// ```text +/// tree!(ctx, (kind ...)) // explicit BuildCtx +/// tree!((kind ...)) // implicit context from rule! +/// ``` +#[proc_macro] +pub fn tree(input: TokenStream) -> TokenStream { + let input2: TokenStream2 = input.into(); + match parse::parse_tree_top(input2) { + Ok(output) => output.into(), + Err(err) => err.to_compile_error().into(), + } +} + +/// Build a list of AST nodes from a template, returning `Vec`. +/// +/// Like `tree!` but returns `Vec` and supports multiple top-level +/// elements. All syntax from `tree!` is available. +/// +/// Can be called with an explicit context or using the implicit context +/// from an enclosing `rule!`: +/// +/// ```text +/// trees!(ctx, (node1 ...) (node2 ...)) // explicit BuildCtx +/// trees!((node1 ...) (node2 ...)) // implicit context from rule! +/// ``` +#[proc_macro] +pub fn trees(input: TokenStream) -> TokenStream { + let input2: TokenStream2 = input.into(); + match parse::parse_trees_top(input2) { + Ok(output) => output.into(), + Err(err) => err.to_compile_error().into(), + } +} + +/// Define a desugaring rule with query and transform in one declaration. +/// +/// ```text +/// rule!( +/// (query_pattern field: (_) @name (kind)* @repeated (_)? @optional) +/// => +/// (output_template field: {name} {..repeated}) +/// ) +/// +/// // Shorthand: captures become fields on the output node +/// rule!((query ...) => output_kind) +/// ``` +/// +/// Captures become Rust variables automatically: +/// - `@name` (no quantifier) → `name: Id` +/// - `@name` (after `*`/`+`) → `name: Vec` +/// - `@name` (after `?`) → `name: Option` +/// +/// `tree!` and `trees!` can be used without explicit context inside `{...}`. +#[proc_macro] +pub fn rule(input: TokenStream) -> TokenStream { + let input2: TokenStream2 = input.into(); + match parse::parse_rule_top(input2) { + Ok(output) => output.into(), + Err(err) => err.to_compile_error().into(), + } +} diff --git a/shared/yeast-macros/src/parse.rs b/shared/yeast-macros/src/parse.rs new file mode 100644 index 000000000000..70bd46d5b6f6 --- /dev/null +++ b/shared/yeast-macros/src/parse.rs @@ -0,0 +1,858 @@ +use proc_macro2::{Delimiter, Ident, Literal, Span, TokenStream, TokenTree}; +use quote::quote; +use std::iter::Peekable; + +type Tokens = Peekable; +type Result = std::result::Result; + +// --------------------------------------------------------------------------- +// Query parsing +// --------------------------------------------------------------------------- + +/// Top-level entry: parse a single query node from the full input. +pub fn parse_query_top(input: TokenStream) -> Result { + let mut tokens = input.into_iter().peekable(); + let result = parse_query_node(&mut tokens)?; + if let Some(tok) = tokens.next() { + return Err(syn::Error::new_spanned(tok, "unexpected token after query")); + } + Ok(result) +} + +/// Parse a single query node (possibly with a trailing `@capture`). +fn parse_query_node(tokens: &mut Tokens) -> Result { + let base = parse_query_atom(tokens)?; + // Check for trailing @capture + if peek_is_at(tokens) { + tokens.next(); // consume @ + let capture_name = expect_ident(tokens, "expected capture name after @")?; + let name_str = capture_name.to_string(); + Ok(quote! { + yeast::query::QueryNode::Capture { + capture: #name_str, + node: Box::new(#base), + } + }) + } else { + Ok(base) + } +} + +/// Parse a query atom: a parenthesized node, a bare `_` (any node), or a +/// bare string literal (unnamed token). +/// Does not handle `@capture` — that's handled by the caller as a postfix. +fn parse_query_atom(tokens: &mut Tokens) -> Result { + match tokens.peek() { + None => Err(syn::Error::new( + Span::call_site(), + "unexpected end of query", + )), + Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Parenthesis => { + let group = expect_group(tokens, Delimiter::Parenthesis)?; + let mut inner = group.stream().into_iter().peekable(); + let result = parse_query_node_inner(&mut inner)?; + if let Some(tok) = inner.next() { + return Err(syn::Error::new_spanned( + tok, + "unexpected token in query node", + )); + } + Ok(result) + } + Some(TokenTree::Ident(id)) if *id == "_" => { + tokens.next(); + Ok(quote! { yeast::query::QueryNode::Any { match_unnamed: true } }) + } + Some(TokenTree::Literal(_)) => { + let lit = expect_literal(tokens)?; + Ok(quote! { yeast::query::QueryNode::UnnamedNode { kind: #lit } }) + } + Some(tok) => Err(syn::Error::new_spanned( + tok.clone(), + "expected `(`, `_`, or string literal in query", + )), + } +} + +/// Parse the inside of a parenthesized query node: `kind fields...` or `_` or `"lit"`. +fn parse_query_node_inner(tokens: &mut Tokens) -> Result { + match tokens.peek() { + None => Err(syn::Error::new( + Span::call_site(), + "empty parenthesized group in query", + )), + Some(TokenTree::Ident(id)) if *id == "_" => { + tokens.next(); + Ok(quote! { yeast::query::QueryNode::Any { match_unnamed: false } }) + } + Some(TokenTree::Literal(_)) => { + let lit = expect_literal(tokens)?; + Ok(quote! { yeast::query::QueryNode::UnnamedNode { kind: #lit } }) + } + Some(TokenTree::Ident(_)) => { + let kind = expect_ident(tokens, "expected node kind")?; + let kind_str = kind.to_string(); + let fields = parse_query_fields(tokens)?; + Ok(quote! { + yeast::query::QueryNode::Node { + kind: #kind_str, + children: vec![#(#fields),*], + } + }) + } + Some(tok) => Err(syn::Error::new_spanned( + tok.clone(), + "expected node kind, `_`, or string literal", + )), + } +} + +/// Parse zero or more field specifications and bare patterns. +/// Named fields: `name: pattern`. Bare patterns (no field name) become +/// implicit `child` field entries. Named fields and bare patterns may +/// 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(); + let mut bare_children: Vec = Vec::new(); + while tokens.peek().is_some() { + if peek_is_field(tokens) { + let field_name = expect_ident(tokens, "expected field name")?; + let field_str = field_name.to_string(); + + expect_punct(tokens, ':', "expected `:` after field name")?; + + let child = parse_query_node(tokens)?; + fields.push(quote! { + (#field_str, vec![yeast::query::QueryListElem::SingleNode(#child)]) + }); + } else { + // Bare patterns — accumulate into the implicit `child` field. + // We don't break here, so we can interleave with named fields. + let elems = parse_query_list(tokens)?; + if elems.is_empty() { + // Nothing more we can parse at this level. + break; + } + bare_children.extend(elems); + } + } + if !bare_children.is_empty() { + fields.push(quote! { + ("child", vec![#(#bare_children),*]) + }); + } + Ok(fields) +} + +/// Parse a list of query elements (bare children). +/// Each element is a node pattern, possibly followed by `*`, `+`, `?`. +fn parse_query_list(tokens: &mut Tokens) -> Result> { + let mut elems = Vec::new(); + while tokens.peek().is_some() { + // Check for parenthesized group + if peek_is_group(tokens, Delimiter::Parenthesis) { + let group = expect_group(tokens, Delimiter::Parenthesis)?; + let mut inner = group.stream().into_iter().peekable(); + + // Check for repetition after the group + if peek_is_repetition(tokens) { + let rep = expect_repetition(tokens)?; + // Determine if the group is a single node pattern or a list + // of patterns. If it starts with an identifier (node kind) or + // `_`, treat it as a single repeated node. Otherwise, parse + // as a repeated list of sub-patterns. + let is_single_node = matches!(inner.peek(), Some(TokenTree::Ident(_))); + if is_single_node { + let node = parse_query_node_inner(&mut inner)?; + let elem = quote! { + yeast::query::QueryListElem::Repeated { + children: vec![yeast::query::QueryListElem::SingleNode(#node)], + rep: #rep, + } + }; + let elem = maybe_wrap_list_capture(tokens, elem)?; + elems.push(elem); + } else { + let sub_elems = parse_query_list(&mut inner)?; + let elem = quote! { + yeast::query::QueryListElem::Repeated { + children: vec![#(#sub_elems),*], + rep: #rep, + } + }; + let elem = maybe_wrap_list_capture(tokens, elem)?; + elems.push(elem); + } + } else { + // Single parenthesized node, possibly followed by @capture + let node = parse_query_node_inner(&mut inner)?; + let node = maybe_wrap_capture(tokens, node)?; + elems.push(quote! { + yeast::query::QueryListElem::SingleNode(#node) + }); + } + continue; + } + + // Check for string literal (unnamed node), optionally followed by @capture + if peek_is_literal(tokens) { + let lit = expect_literal(tokens)?; + let node = quote! { yeast::query::QueryNode::UnnamedNode { kind: #lit } }; + let node = maybe_wrap_capture(tokens, node)?; + let elem = maybe_wrap_repetition( + tokens, + quote! { + yeast::query::QueryListElem::SingleNode(#node) + }, + )?; + elems.push(elem); + continue; + } + + // Check for bare `_` (any node, named or unnamed), possibly followed by @capture. + // Distinct from `(_)` which only matches named nodes — this matches + // tree-sitter query semantics. + if peek_is_underscore(tokens) { + tokens.next(); + let node = quote! { yeast::query::QueryNode::Any { match_unnamed: true } }; + let node = maybe_wrap_capture(tokens, node)?; + let elem = maybe_wrap_repetition( + tokens, + quote! { + yeast::query::QueryListElem::SingleNode(#node) + }, + )?; + elems.push(elem); + continue; + } + + break; + } + Ok(elems) +} + +// --------------------------------------------------------------------------- +// tree! / trees! parsing — direct code generation against BuildCtx +// --------------------------------------------------------------------------- + +const IMPLICIT_CTX: &str = "__yeast_ctx"; + +/// Determine the context identifier: either explicit `ctx,` or the implicit +/// `__yeast_ctx` from an enclosing `rule!`. +fn parse_ctx_or_implicit(tokens: &mut Tokens) -> Ident { + // Check if first token is an ident followed by a comma + let mut lookahead = tokens.clone(); + let is_explicit = matches!(lookahead.next(), Some(TokenTree::Ident(_))) + && matches!(lookahead.next(), Some(TokenTree::Punct(p)) if p.as_char() == ','); + + if is_explicit { + let ctx = expect_ident(tokens, "").unwrap(); + let _ = tokens.next(); // consume comma + ctx + } else { + Ident::new(IMPLICIT_CTX, Span::call_site()) + } +} + +/// Parse `tree!(ctx, (template))` or `tree!((template))` — returns single `Id`. +pub fn parse_tree_top(input: TokenStream) -> Result { + let mut tokens = input.into_iter().peekable(); + let ctx = parse_ctx_or_implicit(&mut tokens); + + let first = parse_direct_node(&mut tokens, &ctx)?; + + if let Some(tok) = tokens.next() { + return Err(syn::Error::new_spanned( + tok, + "unexpected tokens after tree! template; use trees! for multiple nodes", + )); + } + + Ok(quote! { { #first } }) +} + +/// Parse `trees!(ctx, ...)` or `trees!(...)` — returns `Vec`. +pub fn parse_trees_top(input: TokenStream) -> Result { + let mut tokens = input.into_iter().peekable(); + let ctx = parse_ctx_or_implicit(&mut tokens); + let items = parse_direct_list(&mut tokens, &ctx)?; + if let Some(tok) = tokens.next() { + return Err(syn::Error::new_spanned( + tok, + "unexpected token after trees! template", + )); + } + Ok(quote! { + { + let mut __nodes: Vec = Vec::new(); + #(#items)* + __nodes + } + }) +} + +/// Parse a single node template and generate code that returns an `Id`. +/// Handles: `(kind fields... children...)` and `{expr}`. +fn parse_direct_node(tokens: &mut Tokens, ctx: &Ident) -> Result { + match tokens.peek() { + Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Brace => { + let group = expect_group(tokens, Delimiter::Brace)?; + let expr = group.stream(); + Ok(quote! { #expr }) + } + Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Parenthesis => { + let group = expect_group(tokens, Delimiter::Parenthesis)?; + let mut inner = group.stream().into_iter().peekable(); + parse_direct_node_inner(&mut inner, ctx) + } + Some(tok) => Err(syn::Error::new_spanned( + tok.clone(), + "expected `(` or `{` in tree template", + )), + None => Err(syn::Error::new( + Span::call_site(), + "unexpected end of tree template", + )), + } +} + +/// Parse the inside of a parenthesized node: `kind fields... children...` +/// or `kind "literal"` or `kind $fresh`. +fn parse_direct_node_inner(tokens: &mut Tokens, ctx: &Ident) -> Result { + let kind = expect_ident(tokens, "expected node kind")?; + let kind_str = kind.to_string(); + + // Check for (kind "literal") + if peek_is_literal(tokens) { + let lit = expect_literal(tokens)?; + return Ok(quote! { #ctx.literal(#kind_str, #lit) }); + } + + // Check for (kind #{expr}) — computed literal, expr converted via .to_string() + if peek_is_hash(tokens) { + tokens.next(); // consume # + let group = expect_group(tokens, Delimiter::Brace)?; + let expr = group.stream(); + return Ok(quote! { #ctx.literal(#kind_str, &(#expr).to_string()) }); + } + + // Check for (kind $fresh) + if peek_is_dollar(tokens) { + tokens.next(); + let name = expect_ident(tokens, "expected fresh variable name after $")?; + let name_str = name.to_string(); + return Ok(quote! { #ctx.fresh(#kind_str, #name_str) }); + } + + // Parse named fields + let mut stmts = Vec::new(); + let mut field_args = Vec::new(); + let mut field_counter = 0usize; + + // Named fields — compute each value into a temp, then reference it + while peek_is_field(tokens) { + let field_name = expect_ident(tokens, "expected field name")?; + let field_str = field_name.to_string(); + expect_punct(tokens, ':', "expected `:` after field name")?; + let temp = Ident::new( + &format!("__field_{field_str}_{field_counter}"), + Span::call_site(), + ); + field_counter += 1; + + // Check for field: {..expr} — splice a Vec into the field + if peek_is_group(tokens, Delimiter::Brace) { + let group_clone = tokens.clone().next().unwrap(); + if let TokenTree::Group(g) = &group_clone { + let mut inner_check = g.stream().into_iter(); + let is_splice = matches!(inner_check.next(), Some(TokenTree::Punct(p)) if p.as_char() == '.') + && matches!(inner_check.next(), Some(TokenTree::Punct(p)) if p.as_char() == '.'); + if is_splice { + let group = expect_group(tokens, Delimiter::Brace)?; + let mut inner = group.stream().into_iter().peekable(); + inner.next(); // consume first . + inner.next(); // consume second . + let expr: proc_macro2::TokenStream = inner.collect(); + stmts.push(quote! { let #temp: Vec = #expr; }); + field_args.push(quote! { (#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]) }); + } + + // After all named fields, no other tokens are allowed. + // Output templates require all children to be in named fields. + if let Some(tok) = tokens.peek() { + return Err(syn::Error::new_spanned( + tok.clone(), + "expected named field (`name:`) or end of node template; \ + output templates do not support unnamed children", + )); + } + + Ok(quote! { + { + #(#stmts)* + #ctx.node(#kind_str, vec![#(#field_args),*]) + } + }) +} + +/// Parse the top-level list of a `trees!` template. +/// Each item is a node template or `{expr}` splice. +fn parse_direct_list(tokens: &mut Tokens, ctx: &Ident) -> Result> { + let mut items = Vec::new(); + while tokens.peek().is_some() { + if peek_is_group(tokens, Delimiter::Parenthesis) { + let group = expect_group(tokens, Delimiter::Parenthesis)?; + let mut inner = group.stream().into_iter().peekable(); + + // Regular node + let node = parse_direct_node_inner(&mut inner, ctx)?; + items.push(quote! { __nodes.push(#node); }); + continue; + } + + // {expr} or {..expr} — single node or splice + if peek_is_group(tokens, Delimiter::Brace) { + let group = expect_group(tokens, Delimiter::Brace)?; + let mut inner = group.stream().into_iter().peekable(); + if peek_is_dotdot(&inner) { + inner.next(); // consume first . + inner.next(); // consume second . + let expr: TokenStream = inner.collect(); + items.push(quote! { __nodes.extend(#expr); }); + } else { + let expr = group.stream(); + items.push(quote! { __nodes.push(#expr); }); + } + continue; + } + + break; + } + Ok(items) +} + +// --------------------------------------------------------------------------- +// rule! parsing +// --------------------------------------------------------------------------- + +/// A captured variable from a query pattern. +struct CaptureInfo { + name: String, + multiplicity: CaptureMultiplicity, +} + +#[derive(Clone, Copy, PartialEq)] +enum CaptureMultiplicity { + /// Exactly one match (bare pattern or after no quantifier) + Single, + /// Zero or one match (after `?`) + Optional, + /// Zero or more matches (after `*` or `+`, or inside a repeated group) + Repeated, +} + +/// Walk a token stream and extract all `@name` captures, noting whether +/// they appear after `*` or `+` (repeated) or not. +fn extract_captures(stream: &TokenStream) -> Vec { + let mut captures = Vec::new(); + extract_captures_inner( + &mut stream.clone().into_iter().peekable(), + &mut captures, + CaptureMultiplicity::Single, + ); + captures +} + +fn extract_captures_inner( + tokens: &mut Tokens, + captures: &mut Vec, + parent_mult: CaptureMultiplicity, +) { + let mut last_mult = CaptureMultiplicity::Single; + while let Some(tok) = tokens.next() { + match tok { + TokenTree::Group(g) => { + let mut inner = g.stream().into_iter().peekable(); + let group_mult = match tokens.peek() { + Some(TokenTree::Punct(p)) if p.as_char() == '*' || p.as_char() == '+' => { + CaptureMultiplicity::Repeated + } + Some(TokenTree::Punct(p)) if p.as_char() == '?' => { + CaptureMultiplicity::Optional + } + _ => CaptureMultiplicity::Single, + }; + last_mult = group_mult; + let child_mult = if parent_mult == CaptureMultiplicity::Repeated + || group_mult == CaptureMultiplicity::Repeated + { + CaptureMultiplicity::Repeated + } else if parent_mult == CaptureMultiplicity::Optional + || group_mult == CaptureMultiplicity::Optional + { + CaptureMultiplicity::Optional + } else { + CaptureMultiplicity::Single + }; + extract_captures_inner(&mut inner, captures, child_mult); + } + TokenTree::Punct(p) if p.as_char() == '@' => { + if let Some(TokenTree::Ident(name)) = tokens.next() { + let mult = if parent_mult == CaptureMultiplicity::Repeated + || last_mult == CaptureMultiplicity::Repeated + { + CaptureMultiplicity::Repeated + } else if parent_mult == CaptureMultiplicity::Optional + || last_mult == CaptureMultiplicity::Optional + { + CaptureMultiplicity::Optional + } else { + CaptureMultiplicity::Single + }; + captures.push(CaptureInfo { + name: name.to_string(), + multiplicity: mult, + }); + } + last_mult = CaptureMultiplicity::Single; + } + TokenTree::Punct(p) if matches!(p.as_char(), '*' | '+' | '?') => { + // Keep last_mult — the @capture follows + } + _ => { + last_mult = CaptureMultiplicity::Single; + } + } + } +} + +/// Parse `rule!( query => transform )`. +pub fn parse_rule_top(input: TokenStream) -> Result { + let mut tokens = input.into_iter().peekable(); + + // Collect query tokens up to `=>` + let mut query_tokens = Vec::new(); + loop { + match tokens.peek() { + None => return Err(syn::Error::new(Span::call_site(), "expected `=>` in rule!")), + Some(TokenTree::Punct(p)) if p.as_char() == '=' => { + let eq = tokens.next().unwrap(); + match tokens.peek() { + Some(TokenTree::Punct(p)) if p.as_char() == '>' => { + tokens.next(); // consume > + break; + } + _ => { + query_tokens.push(eq); + continue; + } + } + } + _ => { + query_tokens.push(tokens.next().unwrap()); + } + } + } + + let query_stream: TokenStream = query_tokens.into_iter().collect(); + + // Extract captures from query + let captures = extract_captures(&query_stream); + + // Parse query + let query_code = parse_query_top(query_stream.clone())?; + + // Generate capture bindings + let ctx_ident = Ident::new(IMPLICIT_CTX, Span::call_site()); + let bindings: Vec = captures + .iter() + .map(|cap| { + let name = Ident::new(&cap.name, Span::call_site()); + let name_str = &cap.name; + match cap.multiplicity { + CaptureMultiplicity::Repeated => { + quote! { let #name: Vec = __captures.get_all(#name_str); } + } + CaptureMultiplicity::Optional => { + quote! { let #name: Option = __captures.get_opt(#name_str); } + } + CaptureMultiplicity::Single => { + quote! { let #name: usize = __captures.get_var(#name_str).unwrap(); } + } + } + }) + .collect(); + + // Parse transform: either shorthand `=> kind_name` or full `=> (template ...)` + let transform_body = if peek_is_field(&mut tokens) && { + // Shorthand form: bare identifier = output node kind. + // Auto-generate template from captures. + let mut lookahead = tokens.clone(); + lookahead.next(); // skip ident + lookahead.peek().is_none() // nothing after = shorthand + } { + let output_kind = expect_ident(&mut tokens, "expected output node kind")?; + let output_kind_str = output_kind.to_string(); + + // Generate field assignments from captures + let field_stmts: Vec = captures + .iter() + .map(|cap| { + let name = Ident::new(&cap.name, Span::call_site()); + let name_str = &cap.name; + match cap.multiplicity { + 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); + }, + 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); + } + }, + 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); + }, + } + }) + .collect(); + + quote! { + let __kind = #ctx_ident.ast.id_for_node_kind(#output_kind_str) + .unwrap_or_else(|| panic!("node kind '{}' not found", #output_kind_str)); + let mut __fields = std::collections::BTreeMap::new(); + #(#field_stmts)* + let __id = #ctx_ident.ast.create_node_with_range( + __kind, + yeast::NodeContent::DynamicString(String::new()), + __fields, + true, + __source_range, + ); + vec![__id] + } + } else { + // Full template form + let transform_items = parse_direct_list(&mut tokens, &ctx_ident)?; + + if let Some(tok) = tokens.next() { + return Err(syn::Error::new_spanned( + tok, + "unexpected token after rule! transform", + )); + } + + quote! { + let mut __nodes: Vec = Vec::new(); + #(#transform_items)* + __nodes + } + }; + + Ok(quote! { + { + let __query = #query_code; + yeast::Rule::new(__query, Box::new(|__ast: &mut yeast::Ast, __captures: yeast::captures::Captures, __fresh: &yeast::tree_builder::FreshScope, __source_range: Option| { + #(#bindings)* + let mut #ctx_ident = yeast::build::BuildCtx::with_source_range(__ast, &__captures, __fresh, __source_range); + #transform_body + })) + } + }) +} + +// --------------------------------------------------------------------------- +// Token utilities +// --------------------------------------------------------------------------- + +fn peek_is_at(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Punct(p)) if p.as_char() == '@') +} + +fn peek_is_literal(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Literal(_))) +} + +fn peek_is_dollar(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Punct(p)) if p.as_char() == '$') +} + +fn peek_is_hash(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Punct(p)) if p.as_char() == '#') +} + +/// Check for `..` (two consecutive dot punctuation tokens). +fn peek_is_dotdot(tokens: &Tokens) -> bool { + let mut lookahead = tokens.clone(); + matches!(lookahead.next(), Some(TokenTree::Punct(p)) if p.as_char() == '.') + && matches!(lookahead.next(), Some(TokenTree::Punct(p)) if p.as_char() == '.') +} + +fn peek_is_underscore(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Ident(id)) if *id == "_") +} + +/// Check if the next tokens form a field specification (ident followed by `:` or `*:`). +/// A bare identifier (other than `_`) at this position is always a field name, since +/// bare child patterns must start with `(`, `@`, `"literal"`, or `_`. +fn peek_is_field(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Ident(id)) if *id != "_") +} + +fn peek_is_group(tokens: &mut Tokens, delim: Delimiter) -> bool { + matches!(tokens.peek(), Some(TokenTree::Group(g)) if g.delimiter() == delim) +} + +fn peek_is_repetition(tokens: &mut Tokens) -> bool { + matches!(tokens.peek(), Some(TokenTree::Punct(p)) if matches!(p.as_char(), '*' | '+' | '?')) +} + +fn expect_ident(tokens: &mut Tokens, msg: &str) -> Result { + match tokens.next() { + Some(TokenTree::Ident(id)) => Ok(id), + Some(tok) => Err(syn::Error::new_spanned(tok, msg)), + None => Err(syn::Error::new(Span::call_site(), msg)), + } +} + +fn expect_literal(tokens: &mut Tokens) -> Result { + match tokens.next() { + Some(TokenTree::Literal(lit)) => Ok(lit), + Some(tok) => Err(syn::Error::new_spanned(tok, "expected string literal")), + None => Err(syn::Error::new( + Span::call_site(), + "expected string literal", + )), + } +} + +fn expect_punct(tokens: &mut Tokens, ch: char, msg: &str) -> Result<()> { + match tokens.next() { + Some(TokenTree::Punct(p)) if p.as_char() == ch => Ok(()), + Some(tok) => Err(syn::Error::new_spanned(tok, msg)), + None => Err(syn::Error::new(Span::call_site(), msg)), + } +} + +fn expect_group(tokens: &mut Tokens, delim: Delimiter) -> Result { + match tokens.next() { + Some(TokenTree::Group(g)) if g.delimiter() == delim => Ok(g), + Some(tok) => Err(syn::Error::new_spanned( + tok, + format!("expected {delim:?} group"), + )), + None => Err(syn::Error::new( + Span::call_site(), + format!("expected {delim:?} group"), + )), + } +} + +fn expect_repetition(tokens: &mut Tokens) -> Result { + match tokens.next() { + Some(TokenTree::Punct(p)) => match p.as_char() { + '*' => Ok(quote! { yeast::query::Rep::ZeroOrMore }), + '+' => Ok(quote! { yeast::query::Rep::OneOrMore }), + '?' => Ok(quote! { yeast::query::Rep::ZeroOrOne }), + _ => Err(syn::Error::new(p.span(), "expected `*`, `+`, or `?`")), + }, + Some(tok) => Err(syn::Error::new_spanned( + tok, + "expected repetition quantifier", + )), + None => Err(syn::Error::new( + Span::call_site(), + "expected repetition quantifier", + )), + } +} + +fn maybe_wrap_capture(tokens: &mut Tokens, base: TokenStream) -> Result { + if peek_is_at(tokens) { + tokens.next(); // consume @ + let name = expect_ident(tokens, "expected capture name after @")?; + let name_str = name.to_string(); + Ok(quote! { + yeast::query::QueryNode::Capture { + capture: #name_str, + node: Box::new(#base), + } + }) + } else { + Ok(base) + } +} + +fn maybe_wrap_repetition(tokens: &mut Tokens, single: TokenStream) -> Result { + if peek_is_repetition(tokens) { + let rep = expect_repetition(tokens)?; + Ok(quote! { + yeast::query::QueryListElem::Repeated { + children: vec![#single], + rep: #rep, + } + }) + } else { + Ok(single) + } +} + +/// If `@name` follows a Repeated list element, wrap each child SingleNode +/// inside the repetition with a Capture. This matches tree-sitter semantics +/// where `(_)* @name` captures each matched node. +fn maybe_wrap_list_capture(tokens: &mut Tokens, elem: TokenStream) -> Result { + if peek_is_at(tokens) { + tokens.next(); + let name = expect_ident(tokens, "expected capture name after @")?; + let name_str = name.to_string(); + // Re-parse the element isn't practical, so we generate a wrapper + // that creates a new Repeated with each child wrapped in a capture. + // The simplest approach: generate code that the runtime can interpret. + // Actually, the capture annotation on repeated elements is best handled + // by re-generating the Repeated with captures injected. + // For now, assume the common case: the repetition contains a single + // SingleNode child, and we wrap that node in a capture. + Ok(quote! { + { + let __rep = #elem; + match __rep { + yeast::query::QueryListElem::Repeated { children, rep } => { + yeast::query::QueryListElem::Repeated { + children: children.into_iter().map(|child| { + match child { + yeast::query::QueryListElem::SingleNode(node) => { + yeast::query::QueryListElem::SingleNode( + yeast::query::QueryNode::Capture { + capture: #name_str, + node: Box::new(node), + } + ) + } + other => other, + } + }).collect(), + rep, + } + } + other => other, + } + } + }) + } else { + Ok(elem) + } +} diff --git a/shared/yeast/BUILD.bazel b/shared/yeast/BUILD.bazel new file mode 100644 index 000000000000..fe0b01bb87bd --- /dev/null +++ b/shared/yeast/BUILD.bazel @@ -0,0 +1,18 @@ +load("@rules_rust//rust:defs.bzl", "rust_library") +load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") + +exports_files(["Cargo.toml"]) + +rust_library( + name = "yeast", + srcs = glob( + ["src/**/*.rs"], + exclude = ["src/bin/**"], + ), + aliases = aliases(), + proc_macro_deps = [ + "//shared/yeast-macros", + ], + visibility = ["//visibility:public"], + deps = all_crate_deps(), +) diff --git a/shared/yeast/Cargo.toml b/shared/yeast/Cargo.toml new file mode 100644 index 000000000000..166887c324cf --- /dev/null +++ b/shared/yeast/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "yeast" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "4.4.10", features = ["derive"] } +serde = { version = "1.0.193", features = ["derive"] } +serde_json = "1.0.108" +serde_yaml = "0.9" +tree-sitter = ">= 0.23.0" +yeast-macros = { path = "../yeast-macros" } + +tree-sitter-ruby = "0.23" +tree-sitter-python = "0.23" diff --git a/shared/yeast/doc/node-types-yaml.md b/shared/yeast/doc/node-types-yaml.md new file mode 100644 index 000000000000..b887f5a82bbf --- /dev/null +++ b/shared/yeast/doc/node-types-yaml.md @@ -0,0 +1,241 @@ +# YAML Node Types Format + +The YAML node-types format is a human-friendly alternative to tree-sitter's +`node-types.json`. It can be converted to and from JSON using the +`node_types_yaml` tool. + +## Overview + +A YAML node-types file has three top-level sections: + +```yaml +supertypes: + # Abstract union types + +named: + # Concrete AST nodes and leaf tokens + +unnamed: + # Punctuation and keyword tokens +``` + +All three sections are optional. If omitted, they default to empty. + +## Supertypes + +Supertypes are abstract groupings of node types (unions). Each supertype maps +to a list of its members: + +```yaml +supertypes: + _expression: + - assignment + - binary + - identifier + - call +``` + +This corresponds to the following JSON: + +```json +{ + "type": "_expression", + "named": true, + "subtypes": [ + { "type": "assignment", "named": true }, + { "type": "binary", "named": true }, + { "type": "identifier", "named": true }, + { "type": "call", "named": true } + ] +} +``` + +Members are resolved as named or unnamed using the +[type reference rules](#type-references) described below. + +## Named nodes + +Named nodes are concrete AST node types. Each entry is a node kind mapping to +its fields. A node with no fields (a leaf token like `identifier`) uses an +empty value: + +```yaml +named: + identifier: + constant: +``` + +```json +{"type": "identifier", "named": true, "fields": {}}, +{"type": "constant", "named": true, "fields": {}} +``` + +### Fields + +Each field has a name, a multiplicity suffix, and a list of allowed types. + +| Suffix | Meaning | JSON `multiple` | JSON `required` | +| ------ | ------------ | --------------- | --------------- | +| (none) | exactly one | `false` | `true` | +| `?` | zero or one | `false` | `false` | +| `+` | one or more | `true` | `true` | +| `*` | zero or more | `true` | `false` | + +Example: + +```yaml +named: + assignment: + left: _lhs + right: _expression +``` + +```json +{ + "type": "assignment", + "named": true, + "fields": { + "left": { + "multiple": false, + "required": true, + "types": [{ "type": "_lhs", "named": true }] + }, + "right": { + "multiple": false, + "required": true, + "types": [{ "type": "_expression", "named": true }] + } + } +} +``` + +A field with multiple allowed types uses a list: + +```yaml +named: + binary: + left: [_expression, _simple_numeric] + operator: ["!=", "+", "&&"] + right: _expression +``` + +A singleton list can be written as a bare value (as shown with `right` above). + +### Unnamed children + +Unnamed children (nodes that appear as children without a field name) are +specified using the special `$children` field name, with the same suffixes: + +```yaml +named: + argument_list: + $children*: [_expression, block_argument, splat_argument] +``` + +```json +{ + "type": "argument_list", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { "type": "_expression", "named": true }, + { "type": "block_argument", "named": true }, + { "type": "splat_argument", "named": true } + ] + } +} +``` + +## Unnamed tokens + +Unnamed tokens are punctuation, operators, and keywords that appear in the +parse tree but don't have their own AST node type. They are listed as simple +strings: + +```yaml +unnamed: + - "=" + - "end" + - "+" + - "&&" +``` + +```json +{"type": "=", "named": false}, +{"type": "end", "named": false}, +{"type": "+", "named": false}, +{"type": "&&", "named": false} +``` + +When converting to YAML, unnamed tokens are always wrapped in quotes for +visual clarity. This is purely cosmetic — YAML treats `end` and `"end"` as +the same string. + +## Type references + +When a type name appears in a field's type list or a supertype's member list, +it needs to be resolved as either named or unnamed. The rules are: + +1. If the name only appears in `named` or `supertypes`, it is **named**. +2. If the name only appears in `unnamed`, it is **unnamed**. +3. If the name appears in both, it defaults to **named**. +4. To explicitly reference an unnamed type in the ambiguous case, use the + map form: + +```yaml +named: + example: + field: { unnamed: foo } +``` + +In practice, ambiguity is rare — names like `end`, `+`, `if` are almost +always only unnamed, while names like `identifier`, `assignment` are only +named. + +## Complete example + +```yaml +supertypes: + _expression: + - assignment + - binary + - identifier + +named: + assignment: + left: _expression + right?: _expression + binary: + left: [_expression, _simple_numeric] + operator: ["!=", "+"] + right: _expression + argument_list: + $children*: [_expression, block_argument] + identifier: + constant: + +unnamed: + - "!=" + - "+" + - "=" + - "end" +``` + +## CLI usage + +Convert YAML to JSON: + +``` +node_types_yaml input.yaml > node-types.json +``` + +Convert JSON to YAML: + +``` +node_types_yaml --from-json node-types.json > node-types.yaml +``` + +Both commands also accept input from stdin if no file argument is given. diff --git a/shared/yeast/doc/yeast.md b/shared/yeast/doc/yeast.md new file mode 100644 index 000000000000..893cdea24dde --- /dev/null +++ b/shared/yeast/doc/yeast.md @@ -0,0 +1,375 @@ +# YEAST — YEAST Elaborates Abstract Syntax Trees + +YEAST is a framework for transforming tree-sitter parse trees before they are +extracted into a CodeQL database. It sits between the tree-sitter parser and +the TRAP extractor, rewriting parts of the AST according to declarative rules. + +## Motivation + +Tree-sitter grammars describe the **concrete syntax** of a language — every +keyword, operator, and punctuation token appears in the parse tree. CodeQL +analyses often prefer a **simplified abstract syntax** where syntactic sugar +has been removed. YEAST bridges this gap by desugaring the tree-sitter output +into a cleaner form before extraction. + +For example, Ruby's `for x in list do ... end` is syntactic sugar for +`list.each { |x| ... }`. A YEAST rule can rewrite the former into the latter +so that CodeQL queries only need to reason about the `.each` form. + +## Architecture + +``` +Source code + │ + ▼ +┌──────────────┐ +│ tree-sitter │ Parse source into a concrete syntax tree +│ parser │ +└──────┬───────┘ + │ tree_sitter::Tree + ▼ +┌──────────────┐ +│ YEAST │ Apply desugaring rules, producing a new AST +│ Runner │ +└──────┬───────┘ + │ yeast::Ast + ▼ +┌──────────────┐ +│ TRAP │ Walk the (possibly rewritten) AST and emit TRAP tuples +│ extractor │ +└──────────────┘ +``` + +The entry point is `extract()` in the shared tree-sitter extractor. When +called with a non-empty `rules` vector, the parsed tree is run through the +YEAST `Runner` before TRAP extraction; with an empty `rules` vector the +tree is extracted unchanged. + +## How desugaring works + +A YEAST `Rule` has two parts: + +1. A **query** that matches nodes in the AST using a tree-sitter-inspired + pattern language. +2. A **transform** that produces replacement nodes from the match captures. + +The `Runner` applies rules by walking the tree top-down. At each node, it +tries each rule in order. If a rule's query matches, the node is replaced by +the transform's output, and the rules are re-applied to the result. If no +rule matches, the node is kept and its children are processed recursively. + +A rule can replace one node with zero nodes (deletion), one node (rewriting), +or multiple nodes (expansion). + +By default a rule fires **at most once on a given node**: after firing, the +engine will not re-try that same rule on the result root. Other rules may +still fire on the result, and the rule may still fire on different nodes +(including the result's children). To opt into iterative behaviour — when a +rule's output is intentionally re-matched by the same rule — call +`.repeated()` on the constructed `Rule`: + +```rust +let r = yeast::rule!((foo ...) => (foo ...)).repeated(); +``` + +Without `.repeated()`, a rule whose output happens to match its own query +simply fires once and stops. With `.repeated()`, the rule is allowed to +re-match indefinitely; the runner still enforces a global rewrite-depth +limit (currently 100) as a safety net against accidental cycles. + +## Query language + +Queries use a syntax inspired by +[tree-sitter queries](https://tree-sitter.github.io/tree-sitter/using-parsers/queries/index.html), +written inside the `yeast::query!()` proc macro. + +### Node patterns + +```rust +// Match any named node +(_) + +// Match a node of a specific kind +(assignment) + +// Match an unnamed token by its text +("end") +``` + +### Fields + +```rust +// Match a node with specific fields +(assignment + left: (identifier) @lhs + right: (_) @rhs +) +``` + +Fields are matched by name. Unmentioned fields are ignored — the pattern +`(assignment left: (_) @x)` matches any `assignment` node regardless of +what's in `right`. + +### Captures + +Captures bind matched nodes to names for use in the transform. A capture +`@name` always follows the pattern it captures: + +```rust +(identifier) @name // capture an identifier node +(_) @value // capture any named node +(identifier)* @items // capture each repeated match +("=") @op // capture an unnamed token by its text +"=" @op // shorthand for the line above +_ @anything // capture any node, named or unnamed +``` + +### Named vs unnamed children + +The two wildcard forms `(_)` and bare `_` differ: + +- `(_)` matches only **named** nodes. When used as a positional pattern, + unnamed children (keywords, operators, punctuation) are skipped over. +- Bare `_` matches **any** node, named or unnamed, taking whatever is next + in the child list. + +Bare child patterns are matched **forward-scan**: each pattern advances +through the iterator until it finds a child that matches, skipping +non-matching children along the way. So `(foo ("baz"))` against a `foo` +whose children are `[bar, baz]` succeeds — the matcher scans past `bar` +and matches `baz`. The iterator advances as it goes, so subsequent +patterns can never match children that appear earlier in source order +than already-matched ones. + +For named-only patterns (`(_)`, `(some_kind ...)`), the scan additionally +skips past unnamed tokens without trying to match them, since they can +never match anyway. + +Anchors (`.`) for forcing immediate adjacency, like in tree-sitter +queries, are not supported. + +```rust +(for + pattern: (_) @pat // named field, captures any named node + value: (in (_) @val) // "in" wrapper is a named node here + body: (do (_)* @body) // "do" and "end" tokens skipped by (_) +) +``` + +### Repetitions + +```rust +(_)* // zero or more +(_)+ // one or more +(_)? // zero or one +(identifier)* @names // capture each repeated match +``` + +## Template language + +Templates construct new AST nodes using the `tree!` and `trees!` macros. +All children in a template must be in named fields — output AST nodes are +always fully fielded. + +When used inside a `rule!` macro, the context is implicit — no explicit +`BuildCtx` argument is needed. When used standalone, they take a `BuildCtx` +as the first argument: + +```rust +// Inside rule! — implicit context, captures are Rust variables +yeast::rule!( + (assignment left: (_) @left right: (_) @right) + => + (assignment left: {right} right: {left}) +); + +// Standalone — explicit context +let fresh = yeast::tree_builder::FreshScope::new(); +let mut ctx = BuildCtx::new(ast, &captures, &fresh); +let id = yeast::tree!(ctx, + (assignment + left: {ctx.capture("lhs")} + right: {ctx.capture("rhs")} + ) +); +``` + +### `tree!` — build a single node + +`tree!(...)` returns a single node `Id`: + +```rust +yeast::tree!(ctx, + (assignment + left: {ctx.capture("lhs")} + right: {ctx.capture("rhs")} + ) +) +``` + +### `trees!` — build multiple nodes + +`trees!(...)` returns `Vec`: + +```rust +yeast::trees!(ctx, + (assignment left: {tmp} right: {right}) + {..body} +) +``` + +### Literal nodes + +`(kind "text")` creates a leaf node with fixed text content: + +```rust +(identifier "each") // an identifier node whose text is "each" +``` + +### Computed literals + +`(kind #{expr})` creates a leaf node whose content is `expr.to_string()`: + +```rust +(integer #{i}) // an integer node with the value of i +(identifier #{name}) // an identifier from a Rust variable +``` + +### Fresh identifiers + +`(kind $name)` creates a leaf node with an auto-generated unique name. All +occurrences of the same `$name` within one `BuildCtx` share the same value: + +```rust +(block + parameters: (block_parameters + (identifier $tmp) // generates e.g. "$tmp-0" + ) + body: (block_body + (assignment + left: {pat} + right: (identifier $tmp) // same "$tmp-0" value + ) + ) +) +``` + +### Embedded Rust expressions + +`{expr}` embeds a Rust expression that returns a single node `Id`: + +```rust +(assignment + left: {some_node_id} // insert a pre-built node + right: {rhs} // insert a captured value (inside rule!) +) +``` + +`{..expr}` splices a `Vec` (or any iterable of `Id`): + +```rust +yeast::trees!(ctx, + (assignment left: {tmp} right: {right}) + {..extra_nodes} // splice a Vec +) +``` + +Inside `rule!`, captures are Rust variables, so `{name}` inserts a +single capture (`Id`) and `{..name}` splices a repeated capture +(`Vec`). + +## Complete example: for-loop desugaring + +This rule rewrites Ruby's `for pat in val do body end` into +`val.each { |tmp| pat = tmp; body }`: + +```rust +let for_rule = yeast::rule!( + (for + pattern: (_) @pat + value: (in (_) @val) + body: (do (_)* @body) + ) + => + (call + receiver: {val} + method: (identifier "each") + block: (block + parameters: (block_parameters + (identifier $tmp) + ) + body: (block_body + (assignment + left: {pat} + right: (identifier $tmp) + ) + {..body} + ) + ) + ) +); +``` + +Captures from the query (`@pat`, `@val`, `@body`) become Rust variables +automatically: single captures bind as `Id`, repeated captures (after +`*` or `+`) as `Vec`, and optional captures (after `?`) as +`Option`. + +## The `rule!` macro + +`rule!` combines a query and a transform into a single declaration: + +```rust +// Full template form +yeast::rule!( + (query_pattern field: (_) @capture) + => + (output_template field: {capture}) +) + +// Shorthand form — captures become fields on the output node +yeast::rule!( + (query_pattern field: (_) @capture) + => output_kind +) +``` + +The shorthand `=> kind` form auto-generates the template, mapping each +capture name to a field of the same name on the output node. + +## Integration with the extractor + +A YEAST desugaring pass is configured with a [`DesugaringConfig`], which +carries one or more named [`Phase`]s of rules and an optional output +node-types schema (in YAML format). Each phase is a complete traversal +that runs to completion before the next phase starts; only the current +phase's rules are considered during that traversal. Attach the config to +a language spec +to enable rewriting: + +```rust +let desugar = yeast::DesugaringConfig::new() + .add_phase("cleanup", cleanup_rules()) + .add_phase("desugar", desugar_rules()) + .with_output_node_types_yaml(include_str!("output-node-types.yml")); + +let lang = simple::LanguageSpec { + prefix: "ruby", + ts_language: tree_sitter_ruby::LANGUAGE.into(), + node_types: tree_sitter_ruby::NODE_TYPES, + desugar: Some(desugar), + file_globs: vec!["*.rb".into()], +}; +``` + +A single-phase config is just `.add_phase(...)` called once. Phase names +appear in error messages so you can tell which phase failed. + +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). + +For the dbscheme/QL code generator, set `Language::desugar` to a +`DesugaringConfig` carrying the same YAML; the generator converts it to +JSON for downstream code generation. The `phases` field of the config is +unused at code-generation time. diff --git a/shared/yeast/src/bin/main.rs b/shared/yeast/src/bin/main.rs new file mode 100644 index 000000000000..975c8e8b25f5 --- /dev/null +++ b/shared/yeast/src/bin/main.rs @@ -0,0 +1,26 @@ +use clap::Parser; + +#[derive(Parser)] +#[clap(name = "yeast", about = "yeast elaborates abstract syntax trees")] +struct Cli { + file: String, + #[clap(default_value = "ruby")] + language: String, +} + +fn get_language(language: &str) -> tree_sitter::Language { + match language { + "ruby" => tree_sitter_ruby::LANGUAGE.into(), + "python" => tree_sitter_python::LANGUAGE.into(), + _ => panic!("Unsupported language: {language}"), + } +} + +fn main() { + let args = Cli::parse(); + let language = get_language(&args.language); + let source = std::fs::read_to_string(&args.file).unwrap(); + let runner = yeast::Runner::new(language, &[]); + let ast = runner.run(&source).unwrap(); + println!("{}", ast.print(&source, ast.get_root())); +} diff --git a/shared/yeast/src/bin/node_types_yaml.rs b/shared/yeast/src/bin/node_types_yaml.rs new file mode 100644 index 000000000000..bc392ecb1f66 --- /dev/null +++ b/shared/yeast/src/bin/node_types_yaml.rs @@ -0,0 +1,51 @@ +use clap::Parser; +use std::io::Read; + +#[derive(Parser)] +#[clap( + name = "node-types-yaml", + about = "Convert between YAML and JSON node-types formats" +)] +struct Cli { + /// Input file (reads from stdin if not provided) + input: Option, + + /// Convert from JSON to YAML (default is YAML to JSON) + #[arg(long)] + from_json: bool, +} + +fn main() { + let args = Cli::parse(); + + let input = match &args.input { + Some(path) => std::fs::read_to_string(path).unwrap_or_else(|e| { + eprintln!("Error reading {path}: {e}"); + std::process::exit(1); + }), + None => { + let mut buf = String::new(); + std::io::stdin() + .read_to_string(&mut buf) + .unwrap_or_else(|e| { + eprintln!("Error reading stdin: {e}"); + std::process::exit(1); + }); + buf + } + }; + + let result = if args.from_json { + yeast::node_types_yaml::convert_from_json(&input) + } else { + yeast::node_types_yaml::convert(&input) + }; + + match result { + Ok(output) => print!("{output}"), + Err(e) => { + eprintln!("Error: {e}"); + std::process::exit(1); + } + } +} diff --git a/shared/yeast/src/build.rs b/shared/yeast/src/build.rs new file mode 100644 index 000000000000..bee4c4f7d034 --- /dev/null +++ b/shared/yeast/src/build.rs @@ -0,0 +1,91 @@ +use std::collections::BTreeMap; + +use crate::captures::Captures; +use crate::tree_builder::FreshScope; +use crate::{Ast, FieldId, Id, NodeContent}; + +/// Context for building new AST nodes during a transformation. +/// +/// Used by the `tree!` and `trees!` macros. Holds a mutable reference to the +/// AST, a reference to the captures from a query match, and a `FreshScope` for +/// generating unique identifiers. +pub struct BuildCtx<'a> { + pub ast: &'a mut Ast, + pub captures: &'a Captures, + pub fresh: &'a FreshScope, + /// Source range of the matched node, inherited by synthetic nodes. + pub source_range: Option, +} + +impl<'a> BuildCtx<'a> { + pub fn new(ast: &'a mut Ast, captures: &'a Captures, fresh: &'a FreshScope) -> Self { + Self { + ast, + captures, + fresh, + source_range: None, + } + } + + pub fn with_source_range( + ast: &'a mut Ast, + captures: &'a Captures, + fresh: &'a FreshScope, + source_range: Option, + ) -> Self { + Self { + ast, + captures, + fresh, + source_range, + } + } + + /// Look up a capture variable, returning its node Id. + pub fn capture(&self, name: &str) -> Id { + self.captures + .get_var(name) + .unwrap_or_else(|e| panic!("build: {e}")) + } + + /// Get all values of a repeated capture variable. + pub fn capture_all(&self, name: &str) -> Vec { + self.captures.get_all(name) + } + + /// Create a named AST node with the given kind and fields. + pub fn node(&mut self, kind: &str, fields: Vec<(&str, Vec)>) -> Id { + let kind_id = self + .ast + .id_for_node_kind(kind) + .unwrap_or_else(|| panic!("build: node kind '{kind}' not found")); + let mut field_map: BTreeMap> = BTreeMap::new(); + for (name, ids) in fields { + let field_id = self + .ast + .field_id_for_name(name) + .unwrap_or_else(|| panic!("build: field '{name}' not found")); + field_map.entry(field_id).or_default().extend(ids); + } + self.ast.create_node_with_range( + kind_id, + NodeContent::DynamicString(String::new()), + field_map, + true, + self.source_range, + ) + } + + /// Create a leaf node with a fixed string content. + pub fn literal(&mut self, kind: &'static str, value: &str) -> Id { + self.ast + .create_named_token_with_range(kind, value.to_string(), self.source_range) + } + + /// Create a leaf node with an auto-generated unique name. + pub fn fresh(&mut self, kind: &'static str, name: &str) -> Id { + let generated = self.fresh.resolve(name); + self.ast + .create_named_token_with_range(kind, generated, self.source_range) + } +} diff --git a/shared/yeast/src/captures.rs b/shared/yeast/src/captures.rs new file mode 100644 index 000000000000..a92c5096e94e --- /dev/null +++ b/shared/yeast/src/captures.rs @@ -0,0 +1,105 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use crate::Id; + +#[derive(Debug, Clone)] +pub struct Captures { + captures: BTreeMap<&'static str, Vec>, +} + +impl Default for Captures { + fn default() -> Self { + Self::new() + } +} + +impl Captures { + pub fn new() -> Self { + Captures { + captures: BTreeMap::new(), + } + } + + pub fn get_var(&self, key: &str) -> Result { + let ids = self.captures.get(key); + if let Some(ids) = ids { + if ids.len() == 1 { + Ok(ids[0]) + } else { + Err(format!( + "Variable {} has {} matches, use * to allow repetition", + key, + ids.len() + )) + } + } else { + Err(format!("No variable named {key}")) + } + } + + /// Get all values of a capture variable (for repeated captures). + pub fn get_all(&self, key: &str) -> Vec { + self.captures.get(key).cloned().unwrap_or_default() + } + + /// Get an optional capture variable. Returns None if unmatched, + /// Some(id) if matched exactly once. + pub fn get_opt(&self, key: &str) -> Option { + self.captures + .get(key) + .and_then(|ids| if ids.len() == 1 { Some(ids[0]) } else { None }) + } + + pub fn insert(&mut self, key: &'static str, id: Id) { + self.captures.entry(key).or_default().push(id); + } + + pub fn map_captures(&mut self, kind: &str, f: &mut impl FnMut(Id) -> Id) { + if let Some(ids) = self.captures.get_mut(kind) { + for id in ids { + *id = f(*id); + } + } + } + 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(); + self.captures.insert(to, new_values); + } + } + + pub fn merge(&mut self, other: &Captures) { + for (key, ids) in &other.captures { + self.captures.entry(key).or_default().extend(ids); + } + } + + pub fn un_star<'a>( + &'a self, + children: &'a BTreeSet<&'static str>, + ) -> Result + 'a, String> { + let mut id_iter = children.iter(); + + if let Some(fst) = id_iter.next() { + let repeats = self + .captures + .get(fst) + .ok_or_else(|| format!("No variable named {fst}"))? + .len(); + // TODO: better error on missing capture + if id_iter.any(|id| self.captures.get(id).map(Vec::len).unwrap_or(0) != repeats) { + return Err("Repeated captures must have the same number of matches".to_string()); + } + Ok((0..repeats).map(move |iter| { + let mut new_vars: Captures = Captures::new(); + for id in children { + let child_capture = self.captures.get(id).unwrap()[iter]; + new_vars.captures.insert(id, vec![child_capture]); + } + new_vars + })) + } else { + Err("Repeated captures must have at least one capture".to_string()) + } + } +} diff --git a/shared/yeast/src/cursor.rs b/shared/yeast/src/cursor.rs new file mode 100644 index 000000000000..ef5f6d94f259 --- /dev/null +++ b/shared/yeast/src/cursor.rs @@ -0,0 +1,8 @@ +pub trait Cursor<'a, T, N, F> { + fn node(&self) -> &'a N; + fn field_id(&self) -> Option; + fn field_name(&self) -> Option<&'static str>; + fn goto_first_child(&mut self) -> bool; + fn goto_next_sibling(&mut self) -> bool; + fn goto_parent(&mut self) -> bool; +} diff --git a/shared/yeast/src/dump.rs b/shared/yeast/src/dump.rs new file mode 100644 index 000000000000..99ba019cc3ea --- /dev/null +++ b/shared/yeast/src/dump.rs @@ -0,0 +1,181 @@ +use std::fmt::Write; + +use crate::{Ast, Node, NodeContent, CHILD_FIELD}; + +/// Options for controlling AST dump output. +pub struct DumpOptions { + /// Whether to include source locations in the output. + pub show_locations: bool, + /// Whether to include source text for leaf nodes. + pub show_content: bool, +} + +impl Default for DumpOptions { + fn default() -> Self { + Self { + show_locations: false, + show_content: true, + } + } +} + +/// Dump a yeast AST as a human-readable indented text format. +/// +/// Output format: +/// ```text +/// program +/// assignment +/// left: +/// left_assignment_list +/// identifier "x" +/// identifier "y" +/// right: +/// call +/// method: +/// identifier "foo" +/// ``` +pub fn dump_ast(ast: &Ast, root: usize, source: &str) -> String { + dump_ast_with_options(ast, root, source, &DumpOptions::default()) +} + +pub fn dump_ast_with_options( + ast: &Ast, + root: usize, + source: &str, + options: &DumpOptions, +) -> String { + let mut out = String::new(); + dump_node(ast, root, source, options, 0, &mut out); + out +} + +fn dump_node( + ast: &Ast, + id: usize, + source: &str, + options: &DumpOptions, + indent: usize, + out: &mut String, +) { + let node = match ast.get_node(id) { + Some(n) => n, + None => return, + }; + + let prefix = " ".repeat(indent); + + // Node kind + write!(out, "{}{}", prefix, node.kind_name()).unwrap(); + + // Location + if options.show_locations { + let start = node.start_position(); + let end = node.end_position(); + write!( + out, + " [{},{}]-[{},{}]", + start.row + 1, + start.column + 1, + end.row + 1, + end.column + 1 + ) + .unwrap(); + } + + // Content for leaf nodes + if options.show_content && node.is_named() && is_leaf(node) { + let content = node_content(node, source); + if !content.is_empty() { + write!(out, " {content:?}").unwrap(); + } + } + + writeln!(out).unwrap(); + + // Named fields first + for (&field_id, children) in &node.fields { + if field_id == CHILD_FIELD { + continue; // Handle unnamed children last + } + let field_name = ast.field_name_for_id(field_id).unwrap_or("?"); + 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); + } else { + writeln!(out).unwrap(); + dump_node(ast, children[0], source, options, indent + 2, out); + } + } else { + writeln!(out, "{prefix} {field_name}:").unwrap(); + for &child_id in children { + dump_node(ast, child_id, source, options, indent + 2, out); + } + } + } + + // Unnamed children — skip unnamed tokens (keywords, punctuation) + if let Some(children) = node.fields.get(&CHILD_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 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) { + let node = match ast.get_node(id) { + Some(n) => n, + None => return, + }; + + write!(out, "{}", node.kind_name()).unwrap(); + + if options.show_locations { + let start = node.start_position(); + let end = node.end_position(); + write!( + out, + " [{},{}]-[{},{}]", + start.row + 1, + start.column + 1, + end.row + 1, + end.column + 1 + ) + .unwrap(); + } + + if options.show_content && node.is_named() { + let content = node_content(node, source); + if !content.is_empty() { + write!(out, " {content:?}").unwrap(); + } + } + + writeln!(out).unwrap(); +} + +fn is_leaf(node: &Node) -> bool { + node.fields.is_empty() +} + +fn node_content(node: &Node, source: &str) -> String { + match &node.content { + NodeContent::DynamicString(s) if !s.is_empty() => s.clone(), + _ => { + let range = node.byte_range(); + if range.start < source.len() && range.end <= source.len() { + source[range.start..range.end].to_string() + } else { + String::new() + } + } + } +} diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs new file mode 100644 index 000000000000..281f44a98b26 --- /dev/null +++ b/shared/yeast/src/lib.rs @@ -0,0 +1,790 @@ +use std::collections::BTreeMap; + +extern crate self as yeast; + +use serde::Serialize; +use serde_json::{json, Value}; + +pub mod build; +pub mod captures; +pub mod cursor; +pub mod dump; +pub mod node_types_yaml; +pub mod query; +mod range; +pub mod schema; +pub mod tree_builder; +mod visitor; + +pub use yeast_macros::{query, rule, tree, trees}; + +use captures::Captures; +pub use cursor::Cursor; +use query::QueryNode; + +/// Node ids are indexes into the arena +type Id = usize; + +/// Field and Kind ids are provided by tree-sitter +type FieldId = u16; +type KindId = u16; + +pub const CHILD_FIELD: u16 = u16::MAX; + +#[derive(Debug)] +pub struct AstCursor<'a> { + ast: &'a Ast, + /// A stack of parents, along with iterators for their children. + parents: Vec<(Id, ChildrenIter<'a>)>, + node_id: Id, +} + +impl<'a> AstCursor<'a> { + pub fn new(ast: &'a Ast) -> Self { + Self { + ast, + parents: vec![], + node_id: ast.root, + } + } + + /// The Id of the node currently under the cursor. + pub fn node_id(&self) -> Id { + self.node_id + } + + fn goto_next_sibling_opt(&mut self) -> Option<()> { + self.node_id = self.parents.last_mut()?.1.next()?; + Some(()) + } + + fn goto_first_child_opt(&mut self) -> Option<()> { + let parent_id = self.node_id; + let parent = self.ast.get_node(parent_id)?; + let mut children = ChildrenIter::new(parent); + let first_child = children.next()?; + self.node_id = first_child; + self.parents.push((parent_id, children)); + Some(()) + } + + fn goto_parent_opt(&mut self) -> Option<()> { + self.node_id = self.parents.pop()?.0; + Some(()) + } +} +impl<'a> Cursor<'a, Ast, Node, FieldId> for AstCursor<'a> { + fn node(&self) -> &'a Node { + &self.ast.nodes[self.node_id] + } + + fn field_id(&self) -> Option { + let (_, children) = self.parents.last()?; + children.current_field() + } + + fn field_name(&self) -> Option<&'static str> { + if self.field_id() == Some(CHILD_FIELD) { + None + } else { + self.field_id() + .and_then(|id| self.ast.field_name_for_id(id)) + } + } + + fn goto_first_child(&mut self) -> bool { + self.goto_first_child_opt().is_some() + } + + fn goto_next_sibling(&mut self) -> bool { + self.goto_next_sibling_opt().is_some() + } + + fn goto_parent(&mut self) -> bool { + self.goto_parent_opt().is_some() + } +} + +/// An iterator over the child Ids of a node. +#[derive(Debug)] +struct ChildrenIter<'a> { + current_field: Option, + fields: std::collections::btree_map::Iter<'a, FieldId, Vec>, + field_children: Option>, +} + +impl<'a> ChildrenIter<'a> { + fn new(node: &'a Node) -> Self { + Self { + current_field: None, + fields: node.fields.iter(), + field_children: None, + } + } + + fn current_field(&self) -> Option { + self.current_field + } +} + +impl Iterator for ChildrenIter<'_> { + type Item = Id; + + fn next(&mut self) -> Option { + match self.field_children.as_mut() { + None => match self.fields.next() { + Some((field, children)) => { + self.current_field = Some(*field); + self.field_children = Some(children.iter()); + self.next() + } + None => None, + }, + Some(children) => match children.next() { + None => match self.fields.next() { + None => None, + Some((field, children)) => { + self.current_field = Some(*field); + self.field_children = Some(children.iter()); + self.next() + } + }, + Some(child_id) => Some(*child_id), + }, + } + } +} + +/// Our AST +pub struct Ast { + root: Id, + nodes: Vec, + schema: schema::Schema, +} + +impl std::fmt::Debug for Ast { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Ast") + .field("root", &self.root) + .field("nodes", &self.nodes.len()) + .finish() + } +} + +impl Ast { + /// Construct an AST from a TS tree + pub fn from_tree(language: tree_sitter::Language, tree: &tree_sitter::Tree) -> Self { + let schema = schema::Schema::from_language(&language); + Self::from_tree_with_schema(schema, tree, &language) + } + + pub fn from_tree_with_schema( + schema: schema::Schema, + tree: &tree_sitter::Tree, + language: &tree_sitter::Language, + ) -> Self { + let mut visitor = visitor::Visitor::new(language.clone()); + visitor.visit(tree); + + visitor.build_with_schema(schema) + } + + pub fn walk(&self) -> AstCursor { + AstCursor::new(self) + } + + pub fn nodes(&self) -> &[Node] { + &self.nodes + } + + pub fn get_root(&self) -> Id { + self.root + } + + pub fn set_root(&mut self, root: Id) { + self.root = root; + } + + pub fn get_node(&self, id: Id) -> Option<&Node> { + self.nodes.get(id) + } + + pub fn print(&self, source: &str, root_id: Id) -> Value { + let root = &self.nodes()[root_id]; + self.print_node(root, source) + } + + pub fn create_node( + &mut self, + kind: KindId, + content: NodeContent, + fields: BTreeMap>, + is_named: bool, + ) -> Id { + self.create_node_with_range(kind, content, fields, is_named, None) + } + + pub fn create_node_with_range( + &mut self, + kind: KindId, + content: NodeContent, + fields: BTreeMap>, + is_named: bool, + source_range: Option, + ) -> Id { + let id = self.nodes.len(); + self.nodes.push(Node { + kind, + kind_name: self.schema.node_kind_for_id(kind).unwrap(), + fields, + content, + is_missing: false, + is_error: false, + is_extra: false, + is_named, + source_range, + }); + id + } + + pub fn create_named_token(&mut self, kind: &'static str, content: String) -> Id { + self.create_named_token_with_range(kind, content, None) + } + + pub fn create_named_token_with_range( + &mut self, + kind: &'static str, + content: String, + source_range: Option, + ) -> Id { + let kind_id = self.schema.id_for_node_kind(kind).unwrap_or_else(|| { + panic!("create_named_token: node kind '{kind}' not found in schema") + }); + let id = self.nodes.len(); + self.nodes.push(Node { + kind: kind_id, + kind_name: kind, + is_named: true, + is_missing: false, + is_error: false, + source_range, + is_extra: false, + fields: BTreeMap::new(), + content: NodeContent::DynamicString(content), + }); + id + } + + pub fn field_name_for_id(&self, id: FieldId) -> Option<&'static str> { + self.schema.field_name_for_id(id) + } + + pub fn field_id_for_name(&self, name: &str) -> Option { + self.schema.field_id_for_name(name) + } + + /// Print a node for debugging + fn print_node(&self, node: &Node, source: &str) -> Value { + let fields: BTreeMap<&'static str, Vec> = node + .fields + .iter() + .map(|(field_id, nodes)| { + let field_name = if field_id == &CHILD_FIELD { + "rest" + } else { + self.field_name_for_id(*field_id).unwrap() + }; + let nodes: Vec = nodes + .iter() + .map(|id| self.print_node(self.get_node(*id).unwrap(), source)) + .collect(); + (field_name, nodes) + }) + .collect(); + let mut value = BTreeMap::new(); + let kind = self.schema.node_kind_for_id(node.kind).unwrap(); + let content = match &node.content { + NodeContent::Range(range) => source[range.start_byte..range.end_byte].to_string(), + NodeContent::String(s) => s.to_string(), + NodeContent::DynamicString(s) => s.clone(), + }; + if fields.is_empty() { + value.insert(kind, json!(content)); + } else { + let mut fields: BTreeMap<_, _> = + fields.into_iter().map(|(k, v)| (k, json!(v))).collect(); + fields.insert("content", json!(content)); + value.insert(kind, json!(fields)); + } + json!(value) + } + + pub fn id_for_node_kind(&self, kind: &str) -> Option { + let id = self.schema.id_for_node_kind(kind).unwrap_or(0); + if id == 0 { + None + } else { + Some(id) + } + } + + fn id_for_unnamed_node_kind(&self, kind: &str) -> Option { + let id = self.schema.id_for_unnamed_node_kind(kind).unwrap_or(0); + if id == 0 { + None + } else { + Some(id) + } + } +} + +/// A node in our AST +#[derive(PartialEq, Eq, Debug, Clone, Serialize)] +pub struct Node { + kind: KindId, + kind_name: &'static str, + pub(crate) fields: BTreeMap>, + pub(crate) content: NodeContent, + /// For synthetic nodes, the source range of the original node they + /// were desugared from. Used for location information in TRAP output. + #[serde(skip)] + source_range: Option, + is_named: bool, + is_missing: bool, + is_extra: bool, + is_error: bool, +} + +impl Node { + pub fn kind(&self) -> &'static str { + self.kind_name + } + + pub fn kind_name(&self) -> &'static str { + self.kind_name + } + + pub fn is_named(&self) -> bool { + self.is_named + } + + pub fn is_missing(&self) -> bool { + self.is_missing + } + + pub fn is_extra(&self) -> bool { + self.is_extra + } + + pub fn is_error(&self) -> bool { + self.is_error + } + + fn fake_point(&self) -> tree_sitter::Point { + tree_sitter::Point { row: 0, column: 0 } + } + + pub fn start_position(&self) -> tree_sitter::Point { + match self.content { + NodeContent::Range(range) => range.start_point, + _ => self + .source_range + .map_or_else(|| self.fake_point(), |r| r.start_point), + } + } + + pub fn end_position(&self) -> tree_sitter::Point { + match self.content { + NodeContent::Range(range) => range.end_point, + _ => self + .source_range + .map_or_else(|| self.fake_point(), |r| r.end_point), + } + } + + pub fn start_byte(&self) -> usize { + match self.content { + NodeContent::Range(range) => range.start_byte, + _ => self.source_range.map_or(0, |r| r.start_byte), + } + } + + pub fn end_byte(&self) -> usize { + match self.content { + NodeContent::Range(range) => range.end_byte, + _ => self.source_range.map_or(0, |r| r.end_byte), + } + } + + pub fn byte_range(&self) -> std::ops::Range { + self.start_byte()..self.end_byte() + } + + pub fn opt_string_content(&self) -> Option { + match &self.content { + NodeContent::Range(_range) => None, + NodeContent::String(s) => Some(s.to_string()), + NodeContent::DynamicString(s) => Some(s.to_string()), + } + } +} + +/// The contents of a node is either a range in the original source file, +/// or a new string if the node is synthesized. +#[derive(PartialEq, Eq, Debug, Clone, Serialize)] +pub enum NodeContent { + Range(#[serde(with = "range::Range")] tree_sitter::Range), + String(&'static str), + DynamicString(String), +} + +impl From<&'static str> for NodeContent { + fn from(value: &'static str) -> Self { + NodeContent::String(value) + } +} + +impl From for NodeContent { + fn from(value: tree_sitter::Range) -> Self { + NodeContent::Range(value) + } +} + +/// The transform function for a rule: takes the AST, captured variables, a +/// fresh-name scope, and the source range of the matched node, and returns +/// the IDs of the replacement nodes. +pub type Transform = Box< + dyn Fn(&mut Ast, Captures, &tree_builder::FreshScope, Option) -> Vec + + Send + + Sync, +>; + +pub struct Rule { + query: QueryNode, + transform: Transform, + /// If true, after this rule fires on a node the engine will try to + /// re-apply this same rule on the result root. Defaults to false: + /// each rule fires at most once on a given node, which prevents + /// accidental loops where a rule's output matches its own query. + repeated: bool, +} + +impl Rule { + pub fn new(query: QueryNode, transform: Transform) -> Self { + Self { + query, + transform, + repeated: false, + } + } + + /// Mark this rule as allowed to fire multiple times on the same node. + /// Use when the rule is intentionally iterative (its output may match + /// its own query). Without this, a rule fires at most once per node; + /// other rules can still fire on the result. + pub fn repeated(mut self) -> Self { + self.repeated = true; + self + } + + fn try_rule( + &self, + ast: &mut Ast, + node: Id, + fresh: &tree_builder::FreshScope, + ) -> 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))) + } else { + Ok(None) + } + } +} + +const MAX_REWRITE_DEPTH: usize = 100; + +/// Index of rules by their root query kind for fast lookup. +struct RuleIndex<'a> { + /// Rules indexed by root node kind name. + by_kind: BTreeMap<&'static str, Vec<&'a Rule>>, + /// Rules with wildcard queries (Any) that apply to all nodes. + wildcard: Vec<&'a Rule>, +} + +impl<'a> RuleIndex<'a> { + fn new(rules: &'a [Rule]) -> Self { + let mut by_kind: BTreeMap<&'static str, Vec<&'a Rule>> = BTreeMap::new(); + let mut wildcard = Vec::new(); + for rule in rules { + match rule.query.root_kind() { + Some(kind) => by_kind.entry(kind).or_default().push(rule), + None => wildcard.push(rule), + } + } + Self { by_kind, wildcard } + } + + fn rules_for_kind(&self, kind: &str) -> impl Iterator { + self.by_kind + .get(kind) + .into_iter() + .flat_map(|v| v.iter()) + .chain(self.wildcard.iter()) + } +} + +fn apply_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) +} + +fn apply_rules_inner( + index: &RuleIndex, + ast: &mut Ast, + id: Id, + fresh: &tree_builder::FreshScope, + rewrite_depth: usize, + skip_rule: Option<*const Rule>, +) -> 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(""); + for rule in index.rules_for_kind(node_kind) { + let rule_ptr = *rule as *const Rule; + if Some(rule_ptr) == skip_rule { + continue; + } + if let Some(result_node) = rule.try_rule(ast, id, fresh)? { + // For non-repeated rules, suppress further application of *this* + // rule on the result root, so a rule whose output matches its own + // query doesn't loop. Other rules and child traversal are + // unaffected. + 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( + index, + ast, + node, + fresh, + rewrite_depth + 1, + next_skip, + )?); + } + return Ok(results); + } + } + + // Take the parent's fields by ownership: the recursion will rewrite + // each child Id, and we'll write the (possibly mutated) field map back + // when we're done. Avoids cloning the whole BTreeMap and its child + // Vecs on entry. Each child Vec is only re-allocated if a rewrite + // actually changes its contents. + // + // Child traversal does not increment rewrite depth and starts fresh + // (no rule is skipped on child subtrees). + let mut fields = std::mem::take(&mut ast.nodes[id].fields); + 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 unchanged = result.len() == 1 && result[0] == child_id; + match (&mut new_children, unchanged) { + (None, true) => {} // unchanged so far, no allocation needed + (None, false) => { + // First divergence — copy already-processed Ids and + // start collecting the rewritten sequence. + let mut new = Vec::with_capacity(children.len()); + new.extend_from_slice(&children[..i]); + new.extend(result); + new_children = Some(new); + } + (Some(new), _) => { + new.extend(result); + } + } + } + if let Some(new) = new_children { + *children = new; + } + } + ast.nodes[id].fields = fields; + Ok(vec![id]) +} + +/// 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 +/// different phases never compete because each traversal only considers the +/// current phase's rules. +pub struct Phase { + /// Name used in error messages. + pub name: String, + pub rules: Vec, +} + +impl Phase { + pub fn new(name: impl Into, rules: Vec) -> Self { + Self { + name: name.into(), + rules, + } + } +} + +/// Configuration for a desugaring pass: an ordered list of [`Phase`]s and +/// an optional output node-types schema (in YAML format). +/// +/// When attached to a `LanguageSpec` (in the shared tree-sitter extractor), +/// enables yeast-based AST rewriting before TRAP extraction. The same YAML +/// is used both to validate TRAP output (via JSON conversion) and to +/// resolve output-only node kinds and fields at runtime. +/// +/// Construct with `DesugaringConfig::new()` and add phases via +/// `add_phase`: +/// +/// ```ignore +/// let config = yeast::DesugaringConfig::new() +/// .add_phase("cleanup", cleanup_rules) +/// .add_phase("desugar", desugar_rules) +/// .with_output_node_types_yaml(yaml); +/// ``` +#[derive(Default)] +pub struct DesugaringConfig { + /// Phases of rule application, applied in order. + pub phases: Vec, + /// Output node-types in YAML format. If `None`, the input grammar's + /// node types are used (i.e. the desugared AST has the same node types + /// as the tree-sitter grammar). + pub output_node_types_yaml: Option<&'static str>, +} + +impl DesugaringConfig { + /// Create an empty configuration. Add phases via [`add_phase`] and an + /// optional output schema via [`with_output_node_types_yaml`]. + pub fn new() -> Self { + 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)); + self + } + + pub fn with_output_node_types_yaml(mut self, yaml: &'static str) -> Self { + self.output_node_types_yaml = Some(yaml); + self + } + + /// Build the yeast `Schema` for this config, given the input language. + /// If `output_node_types_yaml` is `None`, returns the schema derived from + /// the input grammar. + pub fn build_schema(&self, language: &tree_sitter::Language) -> Result { + match self.output_node_types_yaml { + Some(yaml) => node_types_yaml::schema_from_yaml_with_language(yaml, language), + None => Ok(schema::Schema::from_language(language)), + } + } +} + +pub struct Runner<'a> { + language: tree_sitter::Language, + schema: schema::Schema, + phases: &'a [Phase], +} + +impl<'a> Runner<'a> { + /// Create a runner using the input grammar's schema for output. + pub fn new(language: tree_sitter::Language, phases: &'a [Phase]) -> Self { + let schema = schema::Schema::from_language(&language); + Self { + language, + schema, + phases, + } + } + + /// Create a runner with separate input language and output schema. + pub fn with_schema( + language: tree_sitter::Language, + schema: &schema::Schema, + phases: &'a [Phase], + ) -> Self { + Self { + language, + schema: schema.clone(), + phases, + } + } + + /// Create a runner from a [`DesugaringConfig`]. + pub fn from_config( + language: tree_sitter::Language, + config: &'a DesugaringConfig, + ) -> Result { + let schema = config.build_schema(&language)?; + Ok(Self { + language, + schema, + phases: &config.phases, + }) + } + + 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); + self.run_phases(&mut ast)?; + Ok(ast) + } + + pub fn run(&self, input: &str) -> Result { + let mut parser = tree_sitter::Parser::new(); + parser + .set_language(&self.language) + .map_err(|e| format!("Failed to set language: {e}"))?; + 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); + self.run_phases(&mut ast)?; + Ok(ast) + } + + /// Apply each phase in turn to the AST, threading the root through. + /// A single `FreshScope` is shared across phases so that fresh + /// identifiers generated in different phases don't collide. + fn run_phases(&self, ast: &mut Ast) -> Result<(), String> { + 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))?; + if res.len() != 1 { + return Err(format!( + "Phase `{}`: expected exactly one result node, got {}", + phase.name, + res.len() + )); + } + root = res[0]; + } + ast.set_root(root); + Ok(()) + } +} diff --git a/shared/yeast/src/node_types_yaml.rs b/shared/yeast/src/node_types_yaml.rs new file mode 100644 index 000000000000..d321ba8a2cf0 --- /dev/null +++ b/shared/yeast/src/node_types_yaml.rs @@ -0,0 +1,722 @@ +/// Converts a YAML node-types file to the tree-sitter `node-types.json` format. +/// +/// # YAML format +/// +/// ```yaml +/// supertypes: +/// _expression: +/// - assignment +/// - binary +/// +/// named: +/// assignment: +/// left: _lhs +/// right: _expression +/// identifier: +/// +/// unnamed: +/// - "+" +/// - "end" +/// ``` +/// +/// See the crate-level docs for the full format specification. +use std::collections::{BTreeMap, BTreeSet}; +use std::fmt::Write; + +use serde::Deserialize; +use serde_json::json; + +/// Top-level YAML structure. +#[derive(Deserialize, Default)] +struct YamlNodeTypes { + #[serde(default)] + supertypes: BTreeMap>, + #[serde(default)] + named: BTreeMap>>, + #[serde(default)] + unnamed: Vec, +} + +/// A reference to a node type. Can be: +/// - a plain string (resolved by looking up named vs unnamed) +/// - a map `{unnamed: "name"}` to force unnamed interpretation +#[derive(Deserialize, Debug, Clone)] +#[serde(untagged)] +enum TypeRef { + Name(String), + Explicit { unnamed: String }, +} + +/// A field value: either a single type ref or a list of them. +#[derive(Deserialize, Debug, Clone)] +#[serde(untagged)] +enum TypeRefOrList { + Single(TypeRef), + List(Vec), +} + +impl TypeRefOrList { + fn into_vec(self) -> Vec { + match self { + TypeRefOrList::Single(t) => vec![t], + TypeRefOrList::List(v) => v, + } + } +} + +/// Parsed field name: base name + multiplicity markers. +struct FieldSpec { + name: Option, // None for $children + multiple: bool, + required: bool, +} + +fn parse_field_name(raw: &str) -> FieldSpec { + let is_children = + raw == "$children" || raw == "$children?" || raw == "$children*" || raw == "$children+"; + + let suffix = raw.chars().last().filter(|c| matches!(c, '?' | '*' | '+')); + + let (multiple, required) = match suffix { + Some('?') => (false, false), + Some('*') => (true, false), + Some('+') => (true, true), + _ => (false, true), // bare field name = required, single + }; + + let name = if is_children { + None + } else { + let base = raw.trim_end_matches(['?', '*', '+']); + Some(base.to_string()) + }; + + FieldSpec { + name, + multiple, + required, + } +} + +/// Resolve a TypeRef to a (type, named) pair, 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 { + match type_ref { + TypeRef::Explicit { unnamed } => { + json!({"type": unnamed, "named": 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}) + } else if is_unnamed { + json!({"type": name, "named": false}) + } else { + // Named, or unknown (assume named) + json!({"type": name, "named": true}) + } + } + } +} + +/// Convert YAML string to node-types JSON string. +pub fn convert(yaml_input: &str) -> Result { + let yaml: YamlNodeTypes = + serde_yaml::from_str(yaml_input).map_err(|e| format!("Failed to parse YAML: {e}"))?; + + // Build the sets of known named and unnamed types for resolution. + let mut named_types = BTreeSet::new(); + for name in yaml.supertypes.keys() { + named_types.insert(name.clone()); + } + for name in yaml.named.keys() { + named_types.insert(name.clone()); + } + let unnamed_types: BTreeSet = yaml.unnamed.iter().cloned().collect(); + + let mut output = Vec::new(); + + // 1. Supertypes + for (name, members) in &yaml.supertypes { + let subtypes: Vec<_> = members + .iter() + .map(|m| resolve_type_ref(m, &named_types, &unnamed_types)) + .collect(); + output.push(json!({ + "type": name, + "named": true, + "subtypes": subtypes, + })); + } + + // 2. Named nodes + for (name, fields_opt) in &yaml.named { + let fields_map = match fields_opt { + None => { + // Leaf token: no fields, no children, no subtypes + output.push(json!({ + "type": name, + "named": true, + "fields": {}, + })); + continue; + } + Some(m) if m.is_empty() => { + output.push(json!({ + "type": name, + "named": true, + "fields": {}, + })); + continue; + } + Some(m) => m, + }; + + let mut json_fields = serde_json::Map::new(); + let mut json_children: Option = None; + + for (raw_field_name, type_refs) in fields_map { + let spec = parse_field_name(raw_field_name); + let types: Vec<_> = type_refs + .clone() + .into_vec() + .iter() + .map(|t| resolve_type_ref(t, &named_types, &unnamed_types)) + .collect(); + + // Cloning to make the borrow checker happy + let field_info = json!({ + "multiple": spec.multiple, + "required": spec.required, + "types": types, + }); + + if spec.name.is_none() { + // $children + json_children = Some(field_info); + } else { + json_fields.insert(spec.name.unwrap(), field_info); + } + } + + let mut entry = json!({ + "type": name, + "named": true, + "fields": json_fields, + }); + + if let Some(children) = json_children { + entry + .as_object_mut() + .unwrap() + .insert("children".to_string(), children); + } + + output.push(entry); + } + + // 3. Unnamed tokens + for name in &yaml.unnamed { + output.push(json!({ + "type": name, + "named": false, + })); + } + + 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(); + + // Register all supertypes as node kinds + 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 as node kinds + for name in &yaml.unnamed { + schema.register_unnamed_kind(name); + } + + Ok(schema) +} + +/// Build a Schema from a YAML string, extending a tree-sitter Language. +/// The Schema inherits all field/kind names from the Language, plus any +/// additional ones defined in the YAML. +pub fn schema_from_yaml_with_language( + yaml_input: &str, + language: &tree_sitter::Language, +) -> 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::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); + } + + Ok(schema) +} + +// --------------------------------------------------------------------------- +// JSON → YAML conversion +// --------------------------------------------------------------------------- + +/// JSON node-types structures (mirrors tree-sitter's format). +#[derive(Deserialize)] +struct JsonNodeInfo { + #[serde(rename = "type")] + kind: String, + named: bool, + #[serde(default)] + fields: BTreeMap, + children: Option, + #[serde(default)] + subtypes: Vec, +} + +#[derive(Deserialize)] +struct JsonNodeType { + #[serde(rename = "type")] + kind: String, + named: bool, +} + +#[derive(Deserialize)] +struct JsonFieldInfo { + multiple: bool, + required: bool, + types: Vec, +} + +/// Convert a tree-sitter node-types.json string to the YAML format. +pub fn convert_from_json(json_input: &str) -> Result { + let nodes: Vec = + serde_json::from_str(json_input).map_err(|e| format!("Failed to parse JSON: {e}"))?; + + // Collect all named and unnamed types for disambiguation decisions. + let mut all_named: BTreeSet = BTreeSet::new(); + let mut all_unnamed: BTreeSet = BTreeSet::new(); + for node in &nodes { + if node.named { + all_named.insert(node.kind.clone()); + } else { + all_unnamed.insert(node.kind.clone()); + } + } + + let mut supertypes: BTreeMap> = BTreeMap::new(); + let mut named: BTreeMap>> = BTreeMap::new(); + let mut unnamed: Vec = Vec::new(); + + for node in nodes { + if !node.named { + unnamed.push(node.kind); + continue; + } + + if !node.subtypes.is_empty() { + supertypes.insert(node.kind, node.subtypes); + continue; + } + + if node.fields.is_empty() && node.children.is_none() { + // Leaf token + named.insert(node.kind, None); + } else { + let mut fields = BTreeMap::new(); + for (name, info) in node.fields { + fields.insert(name, info); + } + if let Some(children) = node.children { + fields.insert("$children".to_string(), children); + } + named.insert(node.kind, Some(fields)); + } + } + + // Now emit YAML + let mut out = String::new(); + + // Supertypes + if !supertypes.is_empty() { + writeln!(out, "supertypes:").unwrap(); + for (name, members) in &supertypes { + writeln!(out, " {name}:").unwrap(); + for member in members { + let ref_str = format_type_ref(&member.kind, member.named, &all_named, &all_unnamed); + writeln!(out, " - {ref_str}").unwrap(); + } + } + writeln!(out).unwrap(); + } + + // Named + if !named.is_empty() { + writeln!(out, "named:").unwrap(); + for (name, fields_opt) in &named { + match fields_opt { + None => { + writeln!(out, " {name}:").unwrap(); + } + Some(fields) => { + writeln!(out, " {name}:").unwrap(); + for (field_name, info) in fields { + let suffix = field_suffix(info.multiple, info.required); + let yaml_name = if field_name == "$children" { + format!("$children{suffix}") + } else { + format!("{field_name}{suffix}") + }; + + let type_refs: Vec = info + .types + .iter() + .map(|t| format_type_ref(&t.kind, t.named, &all_named, &all_unnamed)) + .collect(); + + if type_refs.len() == 1 { + writeln!(out, " {yaml_name}: {}", type_refs[0]).unwrap(); + } else { + let list = type_refs + .iter() + .map(|s| s.as_str()) + .collect::>() + .join(", "); + writeln!(out, " {yaml_name}: [{list}]").unwrap(); + } + } + } + } + } + writeln!(out).unwrap(); + } + + // Unnamed + if !unnamed.is_empty() { + writeln!(out, "unnamed:").unwrap(); + for name in &unnamed { + writeln!(out, " - {}", force_quote(name)).unwrap(); + } + } + + Ok(out) +} + +fn field_suffix(multiple: bool, required: bool) -> &'static str { + match (multiple, required) { + (false, true) => "", + (false, false) => "?", + (true, true) => "+", + (true, false) => "*", + } +} + +/// Format a type reference for YAML output. Uses the disambiguation rule: +/// plain string if unambiguous, `{unnamed: name}` if the name exists as both +/// named and unnamed and we need the unnamed interpretation. +fn format_type_ref( + kind: &str, + named: bool, + all_named: &BTreeSet, + _all_unnamed: &BTreeSet, +) -> String { + if named { + quote_yaml(kind) + } else { + let is_also_named = all_named.contains(kind); + if is_also_named { + format!("{{unnamed: {}}}", force_quote(kind)) + } else { + force_quote(kind) + } + } +} + +/// Always wrap in double quotes. Used for unnamed node references so they're +/// visually distinct from named ones — YAML treats both forms as equivalent strings. +fn force_quote(s: &str) -> String { + format!("\"{}\"", s.replace('\\', "\\\\").replace('"', "\\\"")) +} + +/// Quote a YAML string value if it contains special characters or could be +/// misinterpreted. +fn quote_yaml(s: &str) -> String { + let needs_quoting = s.is_empty() + || s.contains(|c: char| { + matches!( + c, + ':' | '{' + | '}' + | '[' + | ']' + | ',' + | '&' + | '*' + | '#' + | '?' + | '|' + | '-' + | '<' + | '>' + | '=' + | '!' + | '%' + | '@' + | '`' + | '"' + | '\'' + ) + }) + || s.starts_with(' ') + || s.ends_with(' ') + || s == "true" + || s == "false" + || s == "null" + || s == "yes" + || s == "no" + || s.parse::().is_ok(); + + if needs_quoting { + format!("\"{}\"", s.replace('\\', "\\\\").replace('"', "\\\"")) + } else { + s.to_string() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_basic_conversion() { + let yaml = r#" +supertypes: + _expression: + - assignment + - binary + +named: + assignment: + left: _lhs + right: _expression + binary: + left: [_expression, _simple_numeric] + operator: ["!=", "+"] + right: _expression + argument_list: + $children*: [_expression, block_argument] + identifier: + +unnamed: + - "!=" + - "+" + - "end" +"#; + + let json_str = convert(yaml).unwrap(); + let result: Vec = serde_json::from_str(&json_str).unwrap(); + + // Check supertype + let expr = &result[0]; + assert_eq!(expr["type"], "_expression"); + assert_eq!(expr["named"], true); + assert_eq!(expr["subtypes"].as_array().unwrap().len(), 2); + + // Check assignment + let assign = result.iter().find(|n| n["type"] == "assignment").unwrap(); + assert_eq!(assign["fields"]["left"]["required"], true); + assert_eq!(assign["fields"]["left"]["multiple"], false); + assert_eq!(assign["fields"]["left"]["types"][0]["type"], "_lhs"); + assert_eq!(assign["fields"]["left"]["types"][0]["named"], true); + + // Check binary.operator — "!=" and "+" should resolve to unnamed + let binary = result.iter().find(|n| n["type"] == "binary").unwrap(); + let op_types = binary["fields"]["operator"]["types"].as_array().unwrap(); + assert_eq!(op_types[0]["type"], "!="); + assert_eq!(op_types[0]["named"], false); + assert_eq!(op_types[1]["type"], "+"); + assert_eq!(op_types[1]["named"], false); + + // Check argument_list has children, not a field + let arg_list = result + .iter() + .find(|n| n["type"] == "argument_list") + .unwrap(); + assert!(arg_list.get("children").is_some()); + assert_eq!(arg_list["children"]["multiple"], true); + assert_eq!(arg_list["children"]["required"], false); + + // Check identifier is a leaf + let ident = result.iter().find(|n| n["type"] == "identifier").unwrap(); + assert_eq!(ident["fields"].as_object().unwrap().len(), 0); + + // Check unnamed tokens + let end = result.iter().find(|n| n["type"] == "end").unwrap(); + assert_eq!(end["named"], false); + } + + #[test] + fn test_explicit_unnamed_disambiguation() { + let yaml = r#" +named: + foo: + field: [{unnamed: bar}] + +unnamed: + - bar +"#; + + let json_str = convert(yaml).unwrap(); + let result: Vec = serde_json::from_str(&json_str).unwrap(); + let foo = result.iter().find(|n| n["type"] == "foo").unwrap(); + assert_eq!(foo["fields"]["field"]["types"][0]["named"], false); + } + + #[test] + fn test_field_suffixes() { + let yaml = r#" +named: + test_node: + required_single: foo + optional_single?: foo + required_multiple+: foo + optional_multiple*: foo +"#; + + let json_str = convert(yaml).unwrap(); + let result: Vec = serde_json::from_str(&json_str).unwrap(); + let node = result.iter().find(|n| n["type"] == "test_node").unwrap(); + let fields = node["fields"].as_object().unwrap(); + + assert_eq!(fields["required_single"]["required"], true); + assert_eq!(fields["required_single"]["multiple"], false); + + assert_eq!(fields["optional_single"]["required"], false); + assert_eq!(fields["optional_single"]["multiple"], false); + + assert_eq!(fields["required_multiple"]["required"], true); + assert_eq!(fields["required_multiple"]["multiple"], true); + + assert_eq!(fields["optional_multiple"]["required"], false); + assert_eq!(fields["optional_multiple"]["multiple"], true); + } + + #[test] + fn test_json_to_yaml() { + let json = r#"[ + {"type": "_expression", "named": true, "subtypes": [ + {"type": "assignment", "named": true}, + {"type": "identifier", "named": true} + ]}, + {"type": "assignment", "named": true, "fields": { + "left": {"multiple": false, "required": true, "types": [ + {"type": "_expression", "named": true} + ]}, + "right": {"multiple": false, "required": false, "types": [ + {"type": "_expression", "named": true} + ]} + }, "children": { + "multiple": true, "required": false, "types": [ + {"type": "identifier", "named": true} + ] + }}, + {"type": "identifier", "named": true, "fields": {}}, + {"type": "=", "named": false}, + {"type": "end", "named": false} + ]"#; + + let yaml = convert_from_json(json).unwrap(); + + // Verify key structures are present + assert!(yaml.contains("supertypes:")); + assert!(yaml.contains("_expression:")); + assert!(yaml.contains("named:")); + assert!(yaml.contains("assignment:")); + assert!(yaml.contains("left:")); + assert!(yaml.contains("right?:")); + assert!(yaml.contains("$children*:")); + assert!(yaml.contains("identifier:")); + assert!(yaml.contains("unnamed:")); + assert!(yaml.contains("\"=\"")); + assert!(yaml.contains("end")); + } + + #[test] + fn test_round_trip() { + let yaml_input = r#" +supertypes: + _expression: + - assignment + - identifier + +named: + assignment: + left: _expression + right?: _expression + $children*: identifier + identifier: + +unnamed: + - "=" + - end +"#; + + // YAML → JSON → YAML + let json = convert(yaml_input).unwrap(); + let yaml_output = convert_from_json(&json).unwrap(); + // YAML → JSON again (should be identical) + let json2 = convert(&yaml_output).unwrap(); + + let v1: serde_json::Value = serde_json::from_str(&json).unwrap(); + let v2: serde_json::Value = serde_json::from_str(&json2).unwrap(); + assert_eq!(v1, v2); + } +} diff --git a/shared/yeast/src/query.rs b/shared/yeast/src/query.rs new file mode 100644 index 000000000000..01e5e22ad730 --- /dev/null +++ b/shared/yeast/src/query.rs @@ -0,0 +1,237 @@ +use crate::{captures::Captures, Ast, Id}; + +#[derive(Debug, Clone)] +pub enum QueryNode { + /// A wildcard. With `match_unnamed = false` (the default for `(_)`), + /// only matches named nodes when used positionally — unnamed children + /// are skipped over. With `match_unnamed = true` (for bare `_`), the + /// wildcard consumes whatever the next child is, named or unnamed. + Any { + match_unnamed: bool, + }, + Node { + kind: &'static str, + children: Vec<(&'static str, Vec)>, + }, + UnnamedNode { + kind: &'static str, + }, + Capture { + capture: &'static str, + node: Box, + }, +} + +impl QueryNode { + /// Returns the root node kind this query matches, if it's specific. + /// Returns None for wildcards (Any) and captures wrapping wildcards. + pub fn root_kind(&self) -> Option<&'static str> { + match self { + QueryNode::Node { kind, .. } => Some(kind), + QueryNode::UnnamedNode { kind } => Some(kind), + QueryNode::Capture { node, .. } => node.root_kind(), + QueryNode::Any { .. } => None, + } + } +} + +#[derive(Debug, Clone)] +pub enum QueryListElem { + Repeated { + children: Vec, + rep: Rep, + }, + SingleNode(QueryNode), +} + +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +pub enum Rep { + ZeroOrMore, + OneOrMore, + ZeroOrOne, +} + +impl QueryNode { + /// Returns true if this query only matches named nodes (not unnamed tokens). + /// Used to skip unnamed children in positional matching, matching tree-sitter + /// semantics where `(_)` only matches named nodes. + fn matches_named_only(&self) -> bool { + match self { + QueryNode::Any { match_unnamed } => !match_unnamed, + QueryNode::Node { .. } => true, + QueryNode::UnnamedNode { .. } => false, + QueryNode::Capture { node, .. } => node.matches_named_only(), + } + } + + pub fn do_match(&self, ast: &Ast, node: Id, matches: &mut Captures) -> Result { + match self { + QueryNode::Any { .. } => Ok(true), + QueryNode::Node { kind, children } => { + let node = ast.get_node(node).unwrap(); + let target_kind = ast + .id_for_node_kind(kind) + .ok_or_else(|| format!("Node kind {kind} not found in language"))?; + if node.kind != target_kind { + return Ok(false); + } + for (field, field_children) in children { + let field_id = ast + .field_id_for_name(field) + .ok_or_else(|| format!("Field {field} not found in language"))?; + let empty = Vec::new(); + let mut child_iter = + node.fields.get(&field_id).unwrap_or(&empty).iter().cloned(); + if !match_children(field_children.iter(), ast, &mut child_iter, matches)? { + return Ok(false); + } + } + Ok(true) + } + QueryNode::UnnamedNode { kind } => { + let node = ast.get_node(node).unwrap(); + let target_kind = ast + .id_for_unnamed_node_kind(kind) + .ok_or_else(|| format!("unnamed Node kind {kind} not found in language"))?; + Ok(node.kind == target_kind) + } + QueryNode::Capture { + capture, + node: sub_query, + } => { + let matched = sub_query.do_match(ast, node, matches)?; + if matched { + matches.insert(capture, node); + } + Ok(matched) + } + } + } +} + +fn match_children<'a>( + child_matchers: impl Iterator, + ast: &Ast, + remaining_children: &mut (impl Iterator + Clone), + matches: &mut Captures, +) -> Result { + for child in child_matchers { + if !child.do_match(ast, remaining_children, matches)? { + return Ok(false); + } + } + Ok(true) +} + +impl QueryListElem { + fn do_match( + &self, + ast: &Ast, + remaining_children: &mut (impl Iterator + Clone), + matches: &mut Captures, + ) -> Result { + match self { + QueryListElem::Repeated { children, rep } => { + if children.is_empty() { + // Empty repetition always succeeds without consuming + return Ok(*rep != Rep::OneOrMore); + } + + let mut iters = 0; + + loop { + let matches_initial = matches.clone(); + let start = remaining_children.clone(); + let start_next = start.clone().next(); + if !match_children(children.iter(), ast, remaining_children, matches)? { + *remaining_children = start; + *matches = matches_initial; + break; + } + // Guard against zero-width matches: if the iterator + // didn't advance, break to avoid infinite looping. + let current_next = remaining_children.clone().next(); + if start_next == current_next { + break; + } + iters += 1; + if *rep == Rep::ZeroOrOne { + break; + } + } + if *rep == Rep::OneOrMore && iters == 0 { + // We didn't match any children but we were supposed to + Ok(false) + } else { + Ok(true) + } + } + QueryListElem::SingleNode(sub_query) => { + // Forward-scan semantics: advance through the iterator until + // we find a child that matches `sub_query`. Skip ahead past + // unnamed children when the sub-query is named-only (so they + // can never match anyway). On a match attempt that fails, + // restore the captures so partial captures from a complex + // sub-query don't leak. + let skip_unnamed = sub_query.matches_named_only(); + loop { + 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 snapshot = matches.clone(); + if sub_query.do_match(ast, child, matches)? { + return Ok(true); + } + *matches = snapshot; + } + } + } + } +} + +#[cfg(test)] +mod tests { + use crate::query::*; + #[test] + fn it_works() { + let query1: QueryNode = yeast::query!((_)); + println!("{query1:?}"); + let query2 = yeast::query!((foo)); + println!("{query2:?}"); + let query3 = yeast::query!((foo child: (_))); + println!("{query3:?}"); + let query4 = yeast::query!((foo (_)*)); + println!("{query4:?}"); + let query5: QueryNode = yeast::query!((foo (_)*)); + println!("{query5:?}"); + let query6: QueryNode = yeast::query!((_) @bar); + println!("{query6:?}"); + let query7: QueryNode = yeast::query!((foo child: (_) @bar)); + println!("{query7:?}"); + let query8: QueryNode = yeast::query!( + (assignment + left: (element_reference + object: (_) @obj + (_) @index + ) + right: (_) @rhs + ) + ); + println!("{query8:?}"); + let query9 = yeast::query!( + (program + child: (assignment + left: (_) @left + right: (_) @right + ) + ) + ); + println!("{query9:?}"); + } +} diff --git a/shared/yeast/src/range.rs b/shared/yeast/src/range.rs new file mode 100644 index 000000000000..ec670b438d56 --- /dev/null +++ b/shared/yeast/src/range.rs @@ -0,0 +1,21 @@ +//! (de)-serialize helpers for tree_sitter::Range + +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +#[serde(remote = "tree_sitter::Point")] +pub struct Point { + pub row: usize, + pub column: usize, +} + +#[derive(Serialize, Deserialize)] +#[serde(remote = "tree_sitter::Range")] +pub struct Range { + pub start_byte: usize, + pub end_byte: usize, + #[serde(with = "Point")] + pub start_point: tree_sitter::Point, + #[serde(with = "Point")] + pub end_point: tree_sitter::Point, +} diff --git a/shared/yeast/src/schema.rs b/shared/yeast/src/schema.rs new file mode 100644 index 000000000000..12554d9c8692 --- /dev/null +++ b/shared/yeast/src/schema.rs @@ -0,0 +1,169 @@ +use std::collections::BTreeMap; + +use crate::{FieldId, KindId, CHILD_FIELD}; + +/// 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. +/// +/// # Memory management +/// +/// `register_field`/`register_kind`/`register_unnamed_kind` use `Box::leak` +/// to obtain `&'static str` names. This is intentional: the `&'static str` +/// names appear pervasively in `Node`, `AstCursor`, query patterns, and the +/// extractor's TRAP output, where adding a lifetime would propagate widely. +/// +/// The leak is bounded by the number of distinct kind/field names registered. +/// Schemas are expected to be constructed once per process (e.g. at extractor +/// startup) and reused. Repeated construction in long-running processes will +/// leak memory unboundedly and should be avoided. +#[derive(Clone)] +pub struct Schema { + field_ids: BTreeMap, + field_names: BTreeMap, + next_field_id: FieldId, + kind_ids: BTreeMap, + unnamed_kind_ids: BTreeMap, + kind_names: BTreeMap, + next_kind_id: KindId, +} + +impl Default for Schema { + fn default() -> Self { + Self::new() + } +} + +impl Schema { + pub fn new() -> Self { + Self { + field_ids: BTreeMap::new(), + field_names: BTreeMap::new(), + next_field_id: 1, // 0 is reserved + kind_ids: BTreeMap::new(), + unnamed_kind_ids: BTreeMap::new(), + kind_names: BTreeMap::new(), + next_kind_id: 1, // 0 is reserved + } + } + + /// Create a schema from a tree-sitter language, importing all its + /// known field and kind names. + pub fn from_language(language: &tree_sitter::Language) -> Self { + let mut schema = Self::new(); + // Import all field names, preserving tree-sitter's IDs + for id in 1..=language.field_count() as u16 { + if let Some(name) = language.field_name_for_id(id) { + schema.field_ids.insert(name.to_string(), id); + schema.field_names.insert(id, name); + if id >= schema.next_field_id { + schema.next_field_id = id + 1; + } + } + } + // Import all node kind names, preserving tree-sitter's IDs. + // Track named and unnamed variants separately. For both named and + // unnamed kinds, use the canonical ID from id_for_node_kind, since + // some languages have multiple IDs for the same name (e.g., the + // reserved error token at ID 0 may share a name with a real token). + for id in 0..language.node_kind_count() as u16 { + if let Some(name) = language.node_kind_for_id(id) { + if !name.is_empty() { + let is_named = language.node_kind_is_named(id); + if is_named { + let canonical_id = language.id_for_node_kind(name, true); + if canonical_id != 0 && !schema.kind_ids.contains_key(name) { + schema.kind_ids.insert(name.to_string(), canonical_id); + schema.kind_names.insert(canonical_id, name); + } + } else { + let canonical_id = language.id_for_node_kind(name, false); + if canonical_id != 0 && !schema.unnamed_kind_ids.contains_key(name) { + schema + .unnamed_kind_ids + .insert(name.to_string(), canonical_id); + schema.kind_names.insert(canonical_id, name); + } + } + // Always track the name for any ID we encounter + schema.kind_names.entry(id).or_insert(name); + if id >= schema.next_kind_id { + schema.next_kind_id = id + 1; + } + } + } + } + schema + } + + /// Register a field name, returning its ID. + /// If already registered, returns the existing ID. + pub fn register_field(&mut self, name: &str) -> FieldId { + if name == "child" { + return CHILD_FIELD; + } + if let Some(&id) = self.field_ids.get(name) { + return id; + } + let id = self.next_field_id; + assert!(id < CHILD_FIELD, "too many fields"); + self.next_field_id += 1; + let leaked: &'static str = Box::leak(name.to_string().into_boxed_str()); + self.field_ids.insert(name.to_string(), id); + self.field_names.insert(id, leaked); + id + } + + /// Register a named node kind name, returning its ID. + /// If already registered, returns the existing ID. + pub fn register_kind(&mut self, name: &str) -> KindId { + if let Some(&id) = self.kind_ids.get(name) { + return id; + } + let id = self.next_kind_id; + self.next_kind_id += 1; + let leaked: &'static str = Box::leak(name.to_string().into_boxed_str()); + self.kind_ids.insert(name.to_string(), id); + self.kind_names.insert(id, leaked); + id + } + + /// Register an unnamed token kind (e.g. `"="`, `"end"`), returning its ID. + /// If already registered, returns the existing ID. + pub fn register_unnamed_kind(&mut self, name: &str) -> KindId { + if let Some(&id) = self.unnamed_kind_ids.get(name) { + return id; + } + let id = self.next_kind_id; + self.next_kind_id += 1; + let leaked: &'static str = Box::leak(name.to_string().into_boxed_str()); + self.unnamed_kind_ids.insert(name.to_string(), id); + self.kind_names.insert(id, leaked); + id + } + + pub fn field_id_for_name(&self, name: &str) -> Option { + if name == "child" { + return Some(CHILD_FIELD); + } + self.field_ids.get(name).copied() + } + + pub fn field_name_for_id(&self, id: FieldId) -> Option<&'static str> { + if id == CHILD_FIELD { + return Some("child"); + } + self.field_names.get(&id).copied() + } + + pub fn id_for_node_kind(&self, kind: &str) -> Option { + self.kind_ids.get(kind).copied() + } + + pub fn id_for_unnamed_node_kind(&self, kind: &str) -> Option { + self.unnamed_kind_ids.get(kind).copied() + } + + pub fn node_kind_for_id(&self, id: KindId) -> Option<&'static str> { + self.kind_names.get(&id).copied() + } +} diff --git a/shared/yeast/src/tree_builder.rs b/shared/yeast/src/tree_builder.rs new file mode 100644 index 000000000000..c735c272d283 --- /dev/null +++ b/shared/yeast/src/tree_builder.rs @@ -0,0 +1,43 @@ +use std::cell::Cell; +use std::collections::BTreeMap; + +/// Tracks fresh identifier generation during a single tree-building operation. +/// All occurrences of the same `$name` within one build share the same generated value. +pub struct FreshScope { + counter: Cell, + resolved: std::cell::RefCell>, +} + +impl Default for FreshScope { + fn default() -> Self { + Self::new() + } +} + +impl FreshScope { + pub fn new() -> Self { + Self { + counter: Cell::new(0), + resolved: std::cell::RefCell::new(BTreeMap::new()), + } + } + + pub fn resolve(&self, name: &str) -> String { + self.resolved + .borrow_mut() + .entry(name.to_string()) + .or_insert_with(|| { + let id = self.counter.get(); + self.counter.set(id + 1); + format!("${name}-{id}") + }) + .clone() + } + + /// Clear resolved names but keep the counter. Called between rule + /// applications so that `$tmp` in different rules gets different values + /// while the counter increases monotonically. + pub fn next_scope(&self) { + self.resolved.borrow_mut().clear(); + } +} diff --git a/shared/yeast/src/visitor.rs b/shared/yeast/src/visitor.rs new file mode 100644 index 000000000000..1b9c5eab3627 --- /dev/null +++ b/shared/yeast/src/visitor.rs @@ -0,0 +1,109 @@ +use std::collections::BTreeMap; +use tree_sitter::{Language, Tree}; + +use crate::{Ast, Id, Node, NodeContent, CHILD_FIELD}; + +#[derive(Debug)] +struct VisitorNode { + inner: Node, + parent: Option, +} + +/// A type that can walk a TS tree and produce an `Ast`. +#[derive(Debug)] +pub(crate) struct Visitor { + nodes: Vec, + current: Option, + language: Language, +} + +impl Visitor { + pub fn new(language: Language) -> Self { + Self { + nodes: Vec::new(), + current: None, + language, + } + } + + pub fn visit(&mut self, tree: &Tree) { + let cursor = &mut tree.walk(); + self.enter_node(cursor.node()); + let mut recurse = true; + loop { + if recurse && cursor.goto_first_child() { + recurse = self.enter_node(cursor.node()); + } else { + self.leave_node(cursor.field_name(), cursor.node()); + + if cursor.goto_next_sibling() { + recurse = self.enter_node(cursor.node()); + } else if cursor.goto_parent() { + recurse = false; + } else { + break; + } + } + } + } + + pub fn build_with_schema(self, schema: crate::schema::Schema) -> Ast { + Ast { + root: 0, + schema, + nodes: self.nodes.into_iter().map(|n| n.inner).collect(), + } + } + + fn add_node(&mut self, n: tree_sitter::Node<'_>, content: NodeContent, is_named: bool) -> Id { + let id = self.nodes.len(); + self.nodes.push(VisitorNode { + inner: Node { + kind: self.language.id_for_node_kind(n.kind(), is_named), + kind_name: n.kind(), + content, + fields: BTreeMap::new(), + is_missing: n.is_missing(), + is_named: n.is_named(), + is_extra: n.is_extra(), + is_error: n.is_error(), + source_range: None, + }, + parent: self.current, + }); + id + } + + fn enter_node(&mut self, node: tree_sitter::Node<'_>) -> bool { + let id = self.add_node(node, node.range().into(), node.is_named()); + self.current = Some(id); + true + } + + fn leave_node(&mut self, field_name: Option<&'static str>, _node: tree_sitter::Node<'_>) { + let node_id = self.current.unwrap(); + let node_parent = self.nodes[node_id].parent; + + if let Some(parent_id) = node_parent { + let parent = self.nodes.get_mut(parent_id).unwrap(); + if let Some(field) = field_name { + let field_id = self.language.field_id_for_name(field).unwrap().get(); + parent + .inner + .fields + .entry(field_id) + .or_default() + .push(node_id); + } else { + parent + .inner + .fields + .entry(CHILD_FIELD) + .or_default() + .push(node_id); + } + } + + self.current = node_parent; + } +} diff --git a/shared/yeast/tests/node-types.yml b/shared/yeast/tests/node-types.yml new file mode 100644 index 000000000000..8416d377ee80 --- /dev/null +++ b/shared/yeast/tests/node-types.yml @@ -0,0 +1,73 @@ +# Output node types for yeast test rules. +# Inspired by tree-sitter-ruby, but with all children in named fields +# (no unnamed children). This represents the desugared output schema. + +named: + program: + stmt*: [assignment, call, identifier, for, first_node, second_node] + + assignment: + left: [identifier, left_assignment_list] + right: [identifier, integer, call, element_reference] + + left_assignment_list: + item*: identifier + + element_reference: + object: identifier + index: [integer, identifier] + + for: + pattern: [identifier, left_assignment_list] + value: in + body: do + + in: + value: [identifier, call] + + do: + stmt*: [assignment, identifier, call] + + call: + receiver: [identifier, call] + method: identifier + arguments?: argument_list + block?: block + + argument_list: + argument*: [identifier, integer, call] + + block: + parameters: block_parameters + body: block_body + + block_parameters: + parameter*: identifier + + block_body: + stmt*: [assignment, identifier, call] + + identifier: + integer: + + # Output-only kinds, used by tests of chained desugaring rules. + # Neither exists in the input tree-sitter-ruby grammar. + first_node: + left: [identifier, integer] + right: [identifier, integer] + + second_node: + left: [identifier, integer] + right: [identifier, integer] + +unnamed: + - "=" + - "," + - "(" + - ")" + - "for" + - "in" + - "do" + - "end" + - "|" + - "." diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs new file mode 100644 index 000000000000..ed4202493a46 --- /dev/null +++ b/shared/yeast/tests/test.rs @@ -0,0 +1,762 @@ +#![cfg(test)] + +use yeast::dump::dump_ast; +use yeast::*; + +const OUTPUT_SCHEMA_YAML: &str = include_str!("node-types.yml"); + +/// Helper: parse Ruby source with no rules, return dump. +fn parse_and_dump(input: &str) -> String { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run(input).unwrap(); + dump_ast(&ast, ast.get_root(), input) +} + +/// 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)]) +} + +/// Helper: parse Ruby source with a custom output schema and multiple +/// rule phases, return dump. +fn run_phased_and_dump(input: &str, phases: 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 runner = Runner::with_schema(lang, &schema, &phases); + let ast = runner.run(input).unwrap(); + dump_ast(&ast, ast.get_root(), input) +} + +/// Helper: like `run_and_dump`, but returns the runner error (if any) +/// instead of unwrapping. +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 runner = Runner::with_schema(lang, &schema, &phases); + runner + .run(input) + .expect_err("expected runner to return an error") +} + +/// 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 +/// line. This lets test assertions place the first line at the same +/// indentation as the rest of the body. +#[track_caller] +fn assert_dump_eq(actual: &str, expected: &str) { + let min_indent = expected + .lines() + .filter(|l| !l.trim().is_empty()) + .map(|l| l.len() - l.trim_start().len()) + .min() + .unwrap_or(0); + let dedented: String = expected + .lines() + .map(|l| { + if l.len() >= min_indent { + &l[min_indent..] + } else { + l + } + }) + .collect::>() + .join("\n"); + assert_eq!(actual.trim(), dedented.trim()); +} + +// ---- Parsing tests ---- + +#[test] +fn test_parse_assignment() { + let dump = parse_and_dump("x = 1"); + assert_dump_eq( + &dump, + r#" + program + assignment + left: identifier "x" + right: integer "1" + "#, + ); +} + +#[test] +fn test_parse_multiple_assignment() { + let dump = parse_and_dump("x, y = foo()"); + assert_dump_eq( + &dump, + r#" + program + assignment + left: + left_assignment_list + identifier "x" + identifier "y" + right: + call + arguments: + argument_list + method: identifier "foo" + "#, + ); +} + +#[test] +fn test_parse_for_loop() { + let dump = parse_and_dump("for x in list do\n y\nend"); + assert_dump_eq( + &dump, + r#" + program + for + body: + do + identifier "y" + pattern: identifier "x" + value: + in + identifier "list" + "#, + ); +} + +// ---- Query tests ---- + +#[test] +fn test_query_match() { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + + let query = yeast::query!( + (program + child: (assignment + left: (_) @left + right: (_) @right + ) + ) + ); + + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, ast.get_root(), &mut captures).unwrap(); + assert!(matched); + assert!(captures.get_var("left").is_ok()); + assert!(captures.get_var("right").is_ok()); +} + +#[test] +fn test_query_no_match() { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + + let query = yeast::query!( + (program + child: (call + method: (_) @m + ) + ) + ); + + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, ast.get_root(), &mut captures).unwrap(); + assert!(!matched); +} + +#[test] +fn test_query_repeated_capture() { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x, y, z = 1").unwrap(); + + let query = yeast::query!( + (assignment + left: (left_assignment_list + (identifier)* @names + ) + ) + ); + + // Match against the assignment node (first named child of program) + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + let assignment_id = cursor.node_id(); + + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, assignment_id, &mut captures).unwrap(); + assert!(matched); + assert_eq!(captures.get_all("names").len(), 3); +} + +#[test] +fn test_capture_unnamed_node_parenthesized() { + // `("=") @op` captures the unnamed `=` token between left and right. + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + + let query = yeast::query!( + (assignment + left: (_) @lhs + ("=") @op + right: (_) @rhs + ) + ); + + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + let assignment_id = cursor.node_id(); + + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, assignment_id, &mut captures).unwrap(); + assert!(matched); + let op_id = captures.get_var("op").unwrap(); + let op_node = ast.get_node(op_id).unwrap(); + assert_eq!(op_node.kind(), "="); + assert!(!op_node.is_named()); +} + +#[test] +fn test_capture_unnamed_node_bare_literal() { + // `"=" @op` (without surrounding parens) is the same as `("=") @op`. + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + + let query = yeast::query!( + (assignment + left: (_) @lhs + "=" @op + right: (_) @rhs + ) + ); + + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + let assignment_id = cursor.node_id(); + + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, assignment_id, &mut captures).unwrap(); + assert!(matched); + let op_id = captures.get_var("op").unwrap(); + let op_node = ast.get_node(op_id).unwrap(); + assert_eq!(op_node.kind(), "="); + assert!(!op_node.is_named()); +} + +#[test] +fn test_bare_underscore_matches_unnamed() { + // Bare `_` matches any node, including unnamed tokens, while `(_)` + // matches only named nodes. Demonstrate by matching the unnamed `=` + // token in the implicit `child` field of an `assignment`. + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + let assignment_id = cursor.node_id(); + + // `(_)` skips unnamed children, so a query containing a single `(_)` + // bare pattern fails to match the assignment (whose only unfielded + // child is the unnamed `=`). + let query_named = yeast::query!((assignment (_) @any)); + let mut captures = yeast::captures::Captures::new(); + let matched = query_named + .do_match(&ast, assignment_id, &mut captures) + .unwrap(); + assert!( + !matched, + "(_) should skip the unnamed `=` and fail to match" + ); + + // Bare `_` accepts the next child whatever it is, so it matches the + // unnamed `=` token. + let query_any = yeast::query!((assignment _ @any)); + let mut captures = yeast::captures::Captures::new(); + let matched = query_any + .do_match(&ast, assignment_id, &mut captures) + .unwrap(); + assert!(matched, "_ should match the unnamed `=`"); + let any_node = ast.get_node(captures.get_var("any").unwrap()).unwrap(); + assert_eq!(any_node.kind(), "="); + assert!(!any_node.is_named()); +} + +#[test] +fn test_bare_forms_in_field_position() { + // The bare `_` and bare-literal forms should be accepted as a + // field's value, not just in the bare-children position. This is + // syntactic sugar for `(_)` / `("…")` and goes through the same + // code paths. + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + let assignment_id = cursor.node_id(); + + // Bare `_` in field position. Captures the named `identifier "x"` + // child of the `left` field — bare `_` admits unnamed too, but the + // first child of `left` happens to be named. + let query = yeast::query!((assignment left: _ @lhs)); + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, assignment_id, &mut captures).unwrap(); + assert!(matched); + assert_eq!( + ast.get_node(captures.get_var("lhs").unwrap()) + .unwrap() + .kind(), + "identifier" + ); + + // Bare literal in field position. Equivalent to `("=") @op`. + let query = yeast::query!((assignment child: "=" @op)); + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, assignment_id, &mut captures).unwrap(); + assert!(matched); + let op = ast.get_node(captures.get_var("op").unwrap()).unwrap(); + assert_eq!(op.kind(), "="); + assert!(!op.is_named()); +} + +#[test] +fn test_forward_scan_finds_unnamed_token_late() { + // The `do` named-wrapper node has three children in its implicit + // `child` field, in source order: `do` (unnamed kw), the body + // identifier, and `end` (unnamed kw). Forward-scan semantics let a + // query for `("end")` skip past the first two and match the third. + // Without forward-scan, the matcher took the first child unconditionally + // and failed. + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("for x in list do\n y\nend").unwrap(); + + // Navigate: program > for > do (the body wrapper). + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); // for + cursor.goto_first_child(); // do (the body) + while cursor.node().kind() != "do" || !cursor.node().is_named() { + assert!(cursor.goto_next_sibling(), "expected to find named `do`"); + } + let do_id = cursor.node_id(); + + let query = yeast::query!((do ("end") @kw)); + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, do_id, &mut captures).unwrap(); + assert!(matched, "forward-scan should find the `end` keyword"); + let kw = ast.get_node(captures.get_var("kw").unwrap()).unwrap(); + assert_eq!(kw.kind(), "end"); + assert!(!kw.is_named()); +} + +#[test] +fn test_forward_scan_preserves_order() { + // Bare patterns are scanned left-to-right and consume positions in + // order. A query for ("end") then ("do") should fail because `do` + // appears before `end` in the source order; once forward-scan has + // consumed `end`, the iterator is exhausted. + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("for x in list do\n y\nend").unwrap(); + + let mut cursor = AstCursor::new(&ast); + cursor.goto_first_child(); + cursor.goto_first_child(); + while cursor.node().kind() != "do" || !cursor.node().is_named() { + assert!(cursor.goto_next_sibling(), "expected to find named `do`"); + } + let do_id = cursor.node_id(); + + let query = yeast::query!((do ("end") @first ("do") @second)); + let mut captures = yeast::captures::Captures::new(); + let matched = query.do_match(&ast, do_id, &mut captures).unwrap(); + assert!(!matched, "scan must not go backwards"); +} + +// ---- Tree builder tests ---- + +#[test] +fn test_tree_builder() { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let mut ast = runner.run("x = 1").unwrap(); + let input = "x = 1"; + + let query = yeast::query!( + (program + child: (assignment + left: (_) @left + right: (_) @right + ) + ) + ); + + let mut captures = yeast::captures::Captures::new(); + query.do_match(&ast, ast.get_root(), &mut captures).unwrap(); + + // Swap left and right + let fresh = yeast::tree_builder::FreshScope::new(); + let mut ctx = yeast::build::BuildCtx::new(&mut ast, &captures, &fresh); + let new_id = yeast::tree!(ctx, + (program + child: (assignment + left: {ctx.capture("right")} + right: {ctx.capture("left")} + ) + ) + ); + + let dump = dump_ast(ctx.ast, new_id, input); + assert_dump_eq( + &dump, + r#" + program + assignment + left: integer "1" + right: identifier "x" + "#, + ); +} + +// ---- Rule tests ---- + +// These rules use field names from node-types.yml, which extends the +// tree-sitter-ruby grammar with named fields for nodes that only have +// unnamed children in tree-sitter (e.g. block_body.stmt, block_parameters.parameter). +fn ruby_rules() -> Vec { + let assign_rule = yeast::rule!( + (assignment + left: (left_assignment_list + (identifier)* @left + ) + right: (_) @right + ) + => + (assignment + left: (identifier $tmp) + right: {right} + ) + {..left.iter().enumerate().map(|(i, &lhs)| + yeast::tree!( + (assignment + left: {lhs} + right: (element_reference + object: (identifier $tmp) + index: (integer #{i}) + ) + ) + ) + )} + ); + + let for_rule = yeast::rule!( + (for + pattern: (_) @pat + value: (in (_) @val) + body: (do (_)* @body) + ) + => + (call + receiver: {val} + method: (identifier "each") + block: (block + parameters: (block_parameters + parameter: (identifier $tmp) + ) + body: (block_body + stmt: (assignment + left: {pat} + right: (identifier $tmp) + ) + stmt: {..body} + ) + ) + ) + ); + + vec![assign_rule, for_rule] +} + +#[test] +fn test_desugar_multiple_assignment() { + let dump = run_and_dump("x, y = e", ruby_rules()); + assert_dump_eq( + &dump, + r#" + program + assignment + left: identifier "$tmp-0" + right: identifier "e" + assignment + left: identifier "x" + right: + element_reference + object: identifier "$tmp-0" + index: integer "0" + assignment + left: identifier "y" + right: + element_reference + object: identifier "$tmp-0" + index: integer "1" + "#, + ); +} + +#[test] +fn test_desugar_for_loop() { + let dump = run_and_dump("for x in list do\n y\nend", ruby_rules()); + assert_dump_eq( + &dump, + r#" + program + call + block: + block + body: + block_body + stmt: + assignment + left: identifier "x" + right: identifier "$tmp-0" + identifier "y" + parameters: + block_parameters + parameter: identifier "$tmp-0" + method: identifier "each" + receiver: identifier "list" + "#, + ); +} + +#[test] +fn test_shorthand_rule() { + let rule = yeast::rule!( + (assignment + left: (_) @method + right: (_) @receiver + ) + => call + ); + + let dump = run_and_dump("x = 1", vec![rule]); + assert_dump_eq( + &dump, + r#" + program + call + method: identifier "x" + receiver: integer "1" + "#, + ); +} + +#[test] +fn test_chained_rules_output_only_kind() { + // Exercise rule chaining where an intermediate kind exists only in the + // output schema (not in the input tree-sitter grammar): + // assignment → first_node (input → output-only) + // first_node → second_node (output-only → output-only) + // The matcher must look up `first_node` against the schema, which only + // knows about it via the YAML node-types file. + let assignment_to_first = yeast::rule!( + (assignment + left: (_) @left + right: (_) @right + ) + => first_node + ); + let first_to_second = yeast::rule!( + (first_node + left: (_) @left + right: (_) @right + ) + => second_node + ); + + let dump = run_and_dump("x = 1", vec![assignment_to_first, first_to_second]); + assert_dump_eq( + &dump, + r#" + program + second_node + left: identifier "x" + right: integer "1" + "#, + ); +} + +// A rule that swaps `assignment.left` and `assignment.right`. Each +// application produces another `assignment` whose query the rule +// matches again, so without the once-per-node default it would loop. +fn swap_assignment_rule() -> Rule { + yeast::rule!( + (assignment + left: (_) @left + right: (_) @right + ) + => + (assignment + left: {right} + right: {left} + ) + ) +} + +#[test] +fn test_repeated_rule_hits_depth_limit() { + // With `.repeated()` the rule is allowed to fire on its own output, + // which cycles forever and trips the rewrite-depth safety net. + let err = run_and_get_error("x = 1", vec![swap_assignment_rule().repeated()]); + assert!( + err.contains("exceeded maximum rewrite depth"), + "expected depth-limit error, got: {err}" + ); +} + +#[test] +fn test_default_rule_fires_at_most_once_per_node() { + // Without `.repeated()` (the default), a rule fires at most once on a + // given node. The swap therefore happens exactly once and the desugaring + // terminates cleanly. + let dump = run_and_dump("x = 1", vec![swap_assignment_rule()]); + assert_dump_eq( + &dump, + r#" + program + assignment + left: integer "1" + right: identifier "x" + "#, + ); +} + +// ---- Phase tests ---- + +#[test] +fn test_phased_desugaring() { + // Two phases that could equally have been a single one with chained + // rules. Splitting them makes the intent (cleanup, then desugar) + // explicit and provides per-phase error messages. + let cleanup = vec![yeast::rule!( + (assignment + left: (_) @left + right: (_) @right + ) + => first_node + )]; + let desugar = vec![yeast::rule!( + (first_node + left: (_) @left + right: (_) @right + ) + => second_node + )]; + + let dump = run_phased_and_dump( + "x = 1", + vec![ + Phase::new("cleanup", cleanup), + Phase::new("desugar", desugar), + ], + ); + assert_dump_eq( + &dump, + r#" + program + second_node + left: identifier "x" + right: integer "1" + "#, + ); +} + +#[test] +fn test_phase_error_includes_phase_name() { + // A repeated rule that loops; the error message should identify the + // phase that tripped the depth limit. + 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 runner = Runner::with_schema(lang, &schema, &phases); + let err = runner + .run("x = 1") + .expect_err("expected runner to return an error"); + assert!( + err.contains("Phase `buggy`"), + "error should mention the failing phase, got: {err}" + ); + assert!( + err.contains("exceeded maximum rewrite depth"), + "error should mention the depth limit, got: {err}" + ); +} + +// ---- Cursor tests ---- + +#[test] +fn test_cursor_navigation() { + let runner = Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run("x = 1").unwrap(); + let mut cursor = AstCursor::new(&ast); + + // Start at root + assert_eq!(cursor.node().kind(), "program"); + + // Go to first child (assignment) + assert!(cursor.goto_first_child()); + assert_eq!(cursor.node().kind(), "assignment"); + + // No sibling + assert!(!cursor.goto_next_sibling()); + + // Go to first child of assignment + assert!(cursor.goto_first_child()); + assert!(cursor.node().is_named()); + + // Go back up + assert!(cursor.goto_parent()); + assert_eq!(cursor.node().kind(), "assignment"); + + assert!(cursor.goto_parent()); + assert_eq!(cursor.node().kind(), "program"); + + // Can't go further up + assert!(!cursor.goto_parent()); +} + +#[test] +fn test_desugar_for_with_multiple_assignment() { + let dump = run_and_dump("for a, b in list do\n x\nend", ruby_rules()); + assert_dump_eq( + &dump, + r#" + program + call + block: + block + body: + block_body + stmt: + assignment + left: identifier "$tmp-1" + right: identifier "$tmp-0" + assignment + left: identifier "a" + right: + element_reference + object: identifier "$tmp-1" + index: integer "0" + assignment + left: identifier "b" + right: + element_reference + object: identifier "$tmp-1" + index: integer "1" + identifier "x" + parameters: + block_parameters + parameter: identifier "$tmp-0" + method: identifier "each" + receiver: identifier "list" + "#, + ); +} diff --git a/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/old.dbscheme b/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/old.dbscheme new file mode 100644 index 000000000000..1bb163e31d20 --- /dev/null +++ b/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/old.dbscheme @@ -0,0 +1,2892 @@ +// generated by codegen/codegen.py, do not edit + +// from prefix.dbscheme +/** + * The source location of the snapshot. + */ +sourceLocationPrefix( + string prefix: string ref +); + + +// from schema.py + +@element = + @file +| @generic_context +| @locatable +| @location +| @type +; + +#keyset[id] +element_is_unknown( + int id: @element ref +); + +@file = + @db_file +; + +#keyset[id] +files( + int id: @file ref, + string name: string ref +); + +#keyset[id] +file_is_successfully_extracted( + int id: @file ref +); + +@locatable = + @argument +| @ast_node +| @comment +| @diagnostics +| @error_element +; + +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_or_none ref +); + +@location = + @db_location +; + +#keyset[id] +locations( + int id: @location ref, + int file: @file_or_none ref, + int start_line: int ref, + int start_column: int ref, + int end_line: int ref, + int end_column: int ref +); + +@ast_node = + @availability_info +| @availability_spec +| @callable +| @case_label_item +| @condition_element +| @decl +| @expr +| @key_path_component +| @macro_role +| @pattern +| @stmt +| @stmt_condition +| @type_repr +; + +comments( + unique int id: @comment, + string text: string ref +); + +db_files( + unique int id: @db_file +); + +db_locations( + unique int id: @db_location +); + +diagnostics( + unique int id: @diagnostics, + string text: string ref, + int kind: int ref +); + +@error_element = + @error_expr +| @error_type +| @overloaded_decl_ref_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_chain_result_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @unresolved_type +| @unresolved_type_conversion_expr +| @unspecified_element +; + +availability_infos( + unique int id: @availability_info +); + +#keyset[id] +availability_info_is_unavailable( + int id: @availability_info ref +); + +#keyset[id, index] +availability_info_specs( + int id: @availability_info ref, + int index: int ref, + int spec: @availability_spec_or_none ref +); + +availability_specs( + unique int id: @availability_spec +); + +#keyset[id] +availability_spec_platforms( + int id: @availability_spec ref, + string platform: string ref +); + +#keyset[id] +availability_spec_versions( + int id: @availability_spec ref, + string version: string ref +); + +#keyset[id] +availability_spec_is_wildcard( + int id: @availability_spec ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_names( + int id: @callable ref, + string name: string ref +); + +#keyset[id] +callable_self_params( + int id: @callable ref, + int self_param: @param_decl_or_none ref +); + +#keyset[id, index] +callable_params( + int id: @callable ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +#keyset[id] +callable_bodies( + int id: @callable ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +callable_captures( + int id: @callable ref, + int index: int ref, + int capture: @captured_decl_or_none ref +); + +key_path_components( + unique int id: @key_path_component, + int kind: int ref, + int component_type: @type_or_none ref +); + +#keyset[id, index] +key_path_component_subscript_arguments( + int id: @key_path_component ref, + int index: int ref, + int subscript_argument: @argument_or_none ref +); + +#keyset[id] +key_path_component_tuple_indices( + int id: @key_path_component ref, + int tuple_index: int ref +); + +#keyset[id] +key_path_component_decl_refs( + int id: @key_path_component ref, + int decl_ref: @value_decl_or_none ref +); + +macro_roles( + unique int id: @macro_role, + int kind: int ref, + int macro_syntax: int ref +); + +#keyset[id, index] +macro_role_conformances( + int id: @macro_role ref, + int index: int ref, + int conformance: @expr_or_none ref +); + +#keyset[id, index] +macro_role_names( + int id: @macro_role ref, + int index: int ref, + string name: string ref +); + +unspecified_elements( + unique int id: @unspecified_element, + string property: string ref, + string error: string ref +); + +#keyset[id] +unspecified_element_parents( + int id: @unspecified_element ref, + int parent: @element ref +); + +#keyset[id] +unspecified_element_indices( + int id: @unspecified_element ref, + int index: int ref +); + +#keyset[id, index] +unspecified_element_children( + int id: @unspecified_element ref, + int index: int ref, + int child: @ast_node_or_none ref +); + +@decl = + @captured_decl +| @enum_case_decl +| @extension_decl +| @if_config_decl +| @import_decl +| @missing_member_decl +| @operator_decl +| @pattern_binding_decl +| @pound_diagnostic_decl +| @precedence_group_decl +| @top_level_code_decl +| @using_decl +| @value_decl +; + +#keyset[id] +decls( //dir=decl + int id: @decl ref, + int module: @module_decl_or_none ref +); + +#keyset[id, index] +decl_members( //dir=decl + int id: @decl ref, + int index: int ref, + int member: @decl_or_none ref +); + +@generic_context = + @extension_decl +| @function +| @generic_type_decl +| @macro_decl +| @subscript_decl +; + +#keyset[id, index] +generic_context_generic_type_params( //dir=decl + int id: @generic_context ref, + int index: int ref, + int generic_type_param: @generic_type_param_decl_or_none ref +); + +captured_decls( //dir=decl + unique int id: @captured_decl, + int decl: @value_decl_or_none ref +); + +#keyset[id] +captured_decl_is_direct( //dir=decl + int id: @captured_decl ref +); + +#keyset[id] +captured_decl_is_escaping( //dir=decl + int id: @captured_decl ref +); + +enum_case_decls( //dir=decl + unique int id: @enum_case_decl +); + +#keyset[id, index] +enum_case_decl_elements( //dir=decl + int id: @enum_case_decl ref, + int index: int ref, + int element: @enum_element_decl_or_none ref +); + +extension_decls( //dir=decl + unique int id: @extension_decl, + int extended_type_decl: @nominal_type_decl_or_none ref +); + +#keyset[id, index] +extension_decl_protocols( //dir=decl + int id: @extension_decl ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +if_config_decls( //dir=decl + unique int id: @if_config_decl +); + +#keyset[id, index] +if_config_decl_active_elements( //dir=decl + int id: @if_config_decl ref, + int index: int ref, + int active_element: @ast_node_or_none ref +); + +import_decls( //dir=decl + unique int id: @import_decl +); + +#keyset[id] +import_decl_is_exported( //dir=decl + int id: @import_decl ref +); + +#keyset[id] +import_decl_imported_modules( //dir=decl + int id: @import_decl ref, + int imported_module: @module_decl_or_none ref +); + +#keyset[id, index] +import_decl_declarations( //dir=decl + int id: @import_decl ref, + int index: int ref, + int declaration: @value_decl_or_none ref +); + +missing_member_decls( //dir=decl + unique int id: @missing_member_decl, + string name: string ref +); + +@operator_decl = + @infix_operator_decl +| @postfix_operator_decl +| @prefix_operator_decl +; + +#keyset[id] +operator_decls( //dir=decl + int id: @operator_decl ref, + string name: string ref +); + +pattern_binding_decls( //dir=decl + unique int id: @pattern_binding_decl +); + +#keyset[id, index] +pattern_binding_decl_inits( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int init: @expr_or_none ref +); + +#keyset[id, index] +pattern_binding_decl_patterns( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int pattern: @pattern_or_none ref +); + +pound_diagnostic_decls( //dir=decl + unique int id: @pound_diagnostic_decl, + int kind: int ref, + int message: @string_literal_expr_or_none ref +); + +precedence_group_decls( //dir=decl + unique int id: @precedence_group_decl +); + +top_level_code_decls( //dir=decl + unique int id: @top_level_code_decl, + int body: @brace_stmt_or_none ref +); + +using_decls( //dir=decl + unique int id: @using_decl +); + +#keyset[id] +using_decl_is_main_actor( //dir=decl + int id: @using_decl ref +); + +#keyset[id] +using_decl_is_nonisolated( //dir=decl + int id: @using_decl ref +); + +@value_decl = + @abstract_storage_decl +| @enum_element_decl +| @function +| @macro_decl +| @type_decl +; + +#keyset[id] +value_decls( //dir=decl + int id: @value_decl ref, + int interface_type: @type_or_none ref +); + +@abstract_storage_decl = + @subscript_decl +| @var_decl +; + +#keyset[id, index] +abstract_storage_decl_accessors( //dir=decl + int id: @abstract_storage_decl ref, + int index: int ref, + int accessor: @accessor_or_none ref +); + +enum_element_decls( //dir=decl + unique int id: @enum_element_decl, + string name: string ref +); + +#keyset[id, index] +enum_element_decl_params( //dir=decl + int id: @enum_element_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@function = + @accessor_or_named_function +| @deinitializer +| @initializer +; + +infix_operator_decls( //dir=decl + unique int id: @infix_operator_decl +); + +#keyset[id] +infix_operator_decl_precedence_groups( //dir=decl + int id: @infix_operator_decl ref, + int precedence_group: @precedence_group_decl_or_none ref +); + +macro_decls( //dir=decl + unique int id: @macro_decl, + string name: string ref +); + +#keyset[id, index] +macro_decl_parameters( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int parameter: @param_decl_or_none ref +); + +#keyset[id, index] +macro_decl_roles( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int role: @macro_role_or_none ref +); + +postfix_operator_decls( //dir=decl + unique int id: @postfix_operator_decl +); + +prefix_operator_decls( //dir=decl + unique int id: @prefix_operator_decl +); + +@type_decl = + @abstract_type_param_decl +| @generic_type_decl +| @module_decl +; + +#keyset[id] +type_decls( //dir=decl + int id: @type_decl ref, + string name: string ref, + int declared_interface_type: @type_or_none ref +); + +#keyset[id, index] +type_decl_inherited_types( //dir=decl + int id: @type_decl ref, + int index: int ref, + int inherited_type: @type_or_none ref +); + +@abstract_type_param_decl = + @associated_type_decl +| @generic_type_param_decl +; + +@accessor_or_named_function = + @accessor +| @named_function +; + +deinitializers( //dir=decl + unique int id: @deinitializer +); + +@generic_type_decl = + @nominal_type_decl +| @opaque_type_decl +| @type_alias_decl +; + +initializers( //dir=decl + unique int id: @initializer +); + +module_decls( //dir=decl + unique int id: @module_decl +); + +#keyset[id] +module_decl_is_builtin_module( //dir=decl + int id: @module_decl ref +); + +#keyset[id] +module_decl_is_system_module( //dir=decl + int id: @module_decl ref +); + +module_decl_imported_modules( //dir=decl + int id: @module_decl ref, + int imported_module: @module_decl_or_none ref +); + +module_decl_exported_modules( //dir=decl + int id: @module_decl ref, + int exported_module: @module_decl_or_none ref +); + +subscript_decls( //dir=decl + unique int id: @subscript_decl, + int element_type: @type_or_none ref +); + +#keyset[id, index] +subscript_decl_params( //dir=decl + int id: @subscript_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@var_decl = + @concrete_var_decl +| @param_decl +; + +#keyset[id] +var_decls( //dir=decl + int id: @var_decl ref, + string name: string ref, + int type_: @type_or_none ref +); + +#keyset[id] +var_decl_attached_property_wrapper_types( //dir=decl + int id: @var_decl ref, + int attached_property_wrapper_type: @type_or_none ref +); + +#keyset[id] +var_decl_parent_patterns( //dir=decl + int id: @var_decl ref, + int parent_pattern: @pattern_or_none ref +); + +#keyset[id] +var_decl_parent_initializers( //dir=decl + int id: @var_decl ref, + int parent_initializer: @expr_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var: @var_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var: @var_decl_or_none ref +); + +accessors( //dir=decl + unique int id: @accessor +); + +#keyset[id] +accessor_is_getter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_setter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_will_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_did_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_mutable_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_distributed_get( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_init( //dir=decl + int id: @accessor ref +); + +associated_type_decls( //dir=decl + unique int id: @associated_type_decl +); + +concrete_var_decls( //dir=decl + unique int id: @concrete_var_decl, + int introducer_int: int ref +); + +generic_type_param_decls( //dir=decl + unique int id: @generic_type_param_decl +); + +named_functions( //dir=decl + unique int id: @named_function +); + +@nominal_type_decl = + @class_decl +| @enum_decl +| @protocol_decl +| @struct_decl +; + +#keyset[id] +nominal_type_decls( //dir=decl + int id: @nominal_type_decl ref, + int type_: @type_or_none ref +); + +opaque_type_decls( //dir=decl + unique int id: @opaque_type_decl, + int naming_declaration: @value_decl_or_none ref +); + +#keyset[id, index] +opaque_type_decl_opaque_generic_params( //dir=decl + int id: @opaque_type_decl ref, + int index: int ref, + int opaque_generic_param: @generic_type_param_type_or_none ref +); + +param_decls( //dir=decl + unique int id: @param_decl +); + +#keyset[id] +param_decl_is_inout( //dir=decl + int id: @param_decl ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_var_bindings( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_vars( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var: @var_decl_or_none ref +); + +type_alias_decls( //dir=decl + unique int id: @type_alias_decl, + int aliased_type: @type_or_none ref +); + +class_decls( //dir=decl + unique int id: @class_decl +); + +enum_decls( //dir=decl + unique int id: @enum_decl +); + +protocol_decls( //dir=decl + unique int id: @protocol_decl +); + +struct_decls( //dir=decl + unique int id: @struct_decl +); + +arguments( //dir=expr + unique int id: @argument, + string label: string ref, + int expr: @expr_or_none ref +); + +@expr = + @any_try_expr +| @applied_property_wrapper_expr +| @apply_expr +| @assign_expr +| @bind_optional_expr +| @capture_list_expr +| @closure_expr +| @collection_expr +| @consume_expr +| @copy_expr +| @current_context_isolation_expr +| @decl_ref_expr +| @default_argument_expr +| @discard_assignment_expr +| @dot_syntax_base_ignored_expr +| @dynamic_type_expr +| @enum_is_case_expr +| @error_expr +| @explicit_cast_expr +| @extract_function_isolation_expr +| @force_value_expr +| @identity_expr +| @if_expr +| @implicit_conversion_expr +| @in_out_expr +| @key_path_application_expr +| @key_path_dot_expr +| @key_path_expr +| @lazy_initialization_expr +| @literal_expr +| @lookup_expr +| @make_temporarily_escapable_expr +| @materialize_pack_expr +| @obj_c_selector_expr +| @one_way_expr +| @opaque_value_expr +| @open_existential_expr +| @optional_evaluation_expr +| @other_initializer_ref_expr +| @overloaded_decl_ref_expr +| @pack_element_expr +| @pack_expansion_expr +| @property_wrapper_value_placeholder_expr +| @rebind_self_in_initializer_expr +| @sequence_expr +| @single_value_stmt_expr +| @super_ref_expr +| @tap_expr +| @tuple_element_expr +| @tuple_expr +| @type_expr +| @type_value_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @vararg_expansion_expr +; + +#keyset[id] +expr_types( //dir=expr + int id: @expr ref, + int type_: @type_or_none ref +); + +@any_try_expr = + @force_try_expr +| @optional_try_expr +| @try_expr +; + +#keyset[id] +any_try_exprs( //dir=expr + int id: @any_try_expr ref, + int sub_expr: @expr_or_none ref +); + +applied_property_wrapper_exprs( //dir=expr + unique int id: @applied_property_wrapper_expr, + int kind: int ref, + int value: @expr_or_none ref, + int param: @param_decl_or_none ref +); + +@apply_expr = + @binary_expr +| @call_expr +| @postfix_unary_expr +| @prefix_unary_expr +| @self_apply_expr +; + +#keyset[id] +apply_exprs( //dir=expr + int id: @apply_expr ref, + int function: @expr_or_none ref +); + +#keyset[id, index] +apply_expr_arguments( //dir=expr + int id: @apply_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +assign_exprs( //dir=expr + unique int id: @assign_expr, + int dest: @expr_or_none ref, + int source: @expr_or_none ref +); + +bind_optional_exprs( //dir=expr + unique int id: @bind_optional_expr, + int sub_expr: @expr_or_none ref +); + +capture_list_exprs( //dir=expr + unique int id: @capture_list_expr, + int closure_body: @closure_expr_or_none ref +); + +#keyset[id, index] +capture_list_expr_binding_decls( //dir=expr + int id: @capture_list_expr ref, + int index: int ref, + int binding_decl: @pattern_binding_decl_or_none ref +); + +@closure_expr = + @auto_closure_expr +| @explicit_closure_expr +; + +@collection_expr = + @array_expr +| @dictionary_expr +; + +consume_exprs( //dir=expr + unique int id: @consume_expr, + int sub_expr: @expr_or_none ref +); + +copy_exprs( //dir=expr + unique int id: @copy_expr, + int sub_expr: @expr_or_none ref +); + +current_context_isolation_exprs( //dir=expr + unique int id: @current_context_isolation_expr, + int actor: @expr_or_none ref +); + +decl_ref_exprs( //dir=expr + unique int id: @decl_ref_expr, + int decl: @decl_or_none ref +); + +#keyset[id, index] +decl_ref_expr_replacement_types( //dir=expr + int id: @decl_ref_expr ref, + int index: int ref, + int replacement_type: @type_or_none ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_ordinary_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +default_argument_exprs( //dir=expr + unique int id: @default_argument_expr, + int param_decl: @param_decl_or_none ref, + int param_index: int ref +); + +#keyset[id] +default_argument_expr_caller_side_defaults( //dir=expr + int id: @default_argument_expr ref, + int caller_side_default: @expr_or_none ref +); + +discard_assignment_exprs( //dir=expr + unique int id: @discard_assignment_expr +); + +dot_syntax_base_ignored_exprs( //dir=expr + unique int id: @dot_syntax_base_ignored_expr, + int qualifier: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +dynamic_type_exprs( //dir=expr + unique int id: @dynamic_type_expr, + int base: @expr_or_none ref +); + +enum_is_case_exprs( //dir=expr + unique int id: @enum_is_case_expr, + int sub_expr: @expr_or_none ref, + int element: @enum_element_decl_or_none ref +); + +error_exprs( //dir=expr + unique int id: @error_expr +); + +@explicit_cast_expr = + @checked_cast_expr +| @coerce_expr +; + +#keyset[id] +explicit_cast_exprs( //dir=expr + int id: @explicit_cast_expr ref, + int sub_expr: @expr_or_none ref +); + +extract_function_isolation_exprs( //dir=expr + unique int id: @extract_function_isolation_expr, + int function_expr: @expr_or_none ref +); + +force_value_exprs( //dir=expr + unique int id: @force_value_expr, + int sub_expr: @expr_or_none ref +); + +@identity_expr = + @await_expr +| @borrow_expr +| @dot_self_expr +| @paren_expr +| @unresolved_member_chain_result_expr +| @unsafe_expr +; + +#keyset[id] +identity_exprs( //dir=expr + int id: @identity_expr ref, + int sub_expr: @expr_or_none ref +); + +if_exprs( //dir=expr + unique int id: @if_expr, + int condition: @expr_or_none ref, + int then_expr: @expr_or_none ref, + int else_expr: @expr_or_none ref +); + +@implicit_conversion_expr = + @abi_safe_conversion_expr +| @actor_isolation_erasure_expr +| @any_hashable_erasure_expr +| @archetype_to_super_expr +| @array_to_pointer_expr +| @bridge_from_obj_c_expr +| @bridge_to_obj_c_expr +| @class_metatype_to_object_expr +| @collection_upcast_conversion_expr +| @conditional_bridge_from_obj_c_expr +| @covariant_function_conversion_expr +| @covariant_return_conversion_expr +| @derived_to_base_expr +| @destructure_tuple_expr +| @differentiable_function_expr +| @differentiable_function_extract_original_expr +| @erasure_expr +| @existential_metatype_to_object_expr +| @foreign_object_conversion_expr +| @function_conversion_expr +| @in_out_to_pointer_expr +| @inject_into_optional_expr +| @linear_function_expr +| @linear_function_extract_original_expr +| @linear_to_differentiable_function_expr +| @load_expr +| @metatype_conversion_expr +| @pointer_to_pointer_expr +| @protocol_metatype_to_object_expr +| @string_to_pointer_expr +| @underlying_to_opaque_expr +| @unevaluated_instance_expr +| @unreachable_expr +| @unresolved_type_conversion_expr +| @unsafe_cast_expr +; + +#keyset[id] +implicit_conversion_exprs( //dir=expr + int id: @implicit_conversion_expr ref, + int sub_expr: @expr_or_none ref +); + +in_out_exprs( //dir=expr + unique int id: @in_out_expr, + int sub_expr: @expr_or_none ref +); + +key_path_application_exprs( //dir=expr + unique int id: @key_path_application_expr, + int base: @expr_or_none ref, + int key_path: @expr_or_none ref +); + +key_path_dot_exprs( //dir=expr + unique int id: @key_path_dot_expr +); + +key_path_exprs( //dir=expr + unique int id: @key_path_expr +); + +#keyset[id] +key_path_expr_roots( //dir=expr + int id: @key_path_expr ref, + int root: @type_repr_or_none ref +); + +#keyset[id, index] +key_path_expr_components( //dir=expr + int id: @key_path_expr ref, + int index: int ref, + int component: @key_path_component_or_none ref +); + +lazy_initialization_exprs( //dir=expr + unique int id: @lazy_initialization_expr, + int sub_expr: @expr_or_none ref +); + +@literal_expr = + @builtin_literal_expr +| @interpolated_string_literal_expr +| @nil_literal_expr +| @object_literal_expr +| @regex_literal_expr +; + +@lookup_expr = + @dynamic_lookup_expr +| @member_ref_expr +| @subscript_expr +; + +#keyset[id] +lookup_exprs( //dir=expr + int id: @lookup_expr ref, + int base: @expr_or_none ref +); + +#keyset[id] +lookup_expr_members( //dir=expr + int id: @lookup_expr ref, + int member: @decl_or_none ref +); + +make_temporarily_escapable_exprs( //dir=expr + unique int id: @make_temporarily_escapable_expr, + int escaping_closure: @opaque_value_expr_or_none ref, + int nonescaping_closure: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +materialize_pack_exprs( //dir=expr + unique int id: @materialize_pack_expr, + int sub_expr: @expr_or_none ref +); + +obj_c_selector_exprs( //dir=expr + unique int id: @obj_c_selector_expr, + int sub_expr: @expr_or_none ref, + int method: @function_or_none ref +); + +one_way_exprs( //dir=expr + unique int id: @one_way_expr, + int sub_expr: @expr_or_none ref +); + +opaque_value_exprs( //dir=expr + unique int id: @opaque_value_expr +); + +open_existential_exprs( //dir=expr + unique int id: @open_existential_expr, + int sub_expr: @expr_or_none ref, + int existential: @expr_or_none ref, + int opaque_expr: @opaque_value_expr_or_none ref +); + +optional_evaluation_exprs( //dir=expr + unique int id: @optional_evaluation_expr, + int sub_expr: @expr_or_none ref +); + +other_initializer_ref_exprs( //dir=expr + unique int id: @other_initializer_ref_expr, + int initializer: @initializer_or_none ref +); + +overloaded_decl_ref_exprs( //dir=expr + unique int id: @overloaded_decl_ref_expr +); + +#keyset[id, index] +overloaded_decl_ref_expr_possible_declarations( //dir=expr + int id: @overloaded_decl_ref_expr ref, + int index: int ref, + int possible_declaration: @value_decl_or_none ref +); + +pack_element_exprs( //dir=expr + unique int id: @pack_element_expr, + int sub_expr: @expr_or_none ref +); + +pack_expansion_exprs( //dir=expr + unique int id: @pack_expansion_expr, + int pattern_expr: @expr_or_none ref +); + +property_wrapper_value_placeholder_exprs( //dir=expr + unique int id: @property_wrapper_value_placeholder_expr, + int placeholder: @opaque_value_expr_or_none ref +); + +#keyset[id] +property_wrapper_value_placeholder_expr_wrapped_values( //dir=expr + int id: @property_wrapper_value_placeholder_expr ref, + int wrapped_value: @expr_or_none ref +); + +rebind_self_in_initializer_exprs( //dir=expr + unique int id: @rebind_self_in_initializer_expr, + int sub_expr: @expr_or_none ref, + int self: @var_decl_or_none ref +); + +sequence_exprs( //dir=expr + unique int id: @sequence_expr +); + +#keyset[id, index] +sequence_expr_elements( //dir=expr + int id: @sequence_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +single_value_stmt_exprs( //dir=expr + unique int id: @single_value_stmt_expr, + int stmt: @stmt_or_none ref +); + +super_ref_exprs( //dir=expr + unique int id: @super_ref_expr, + int self: @var_decl_or_none ref +); + +tap_exprs( //dir=expr + unique int id: @tap_expr, + int body: @brace_stmt_or_none ref, + int var: @var_decl_or_none ref +); + +#keyset[id] +tap_expr_sub_exprs( //dir=expr + int id: @tap_expr ref, + int sub_expr: @expr_or_none ref +); + +tuple_element_exprs( //dir=expr + unique int id: @tuple_element_expr, + int sub_expr: @expr_or_none ref, + int index: int ref +); + +tuple_exprs( //dir=expr + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_elements( //dir=expr + int id: @tuple_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +type_exprs( //dir=expr + unique int id: @type_expr +); + +#keyset[id] +type_expr_type_reprs( //dir=expr + int id: @type_expr ref, + int type_repr: @type_repr_or_none ref +); + +type_value_exprs( //dir=expr + unique int id: @type_value_expr, + int type_repr: @type_repr_or_none ref +); + +unresolved_decl_ref_exprs( //dir=expr + unique int id: @unresolved_decl_ref_expr +); + +#keyset[id] +unresolved_decl_ref_expr_names( //dir=expr + int id: @unresolved_decl_ref_expr ref, + string name: string ref +); + +unresolved_dot_exprs( //dir=expr + unique int id: @unresolved_dot_expr, + int base: @expr_or_none ref, + string name: string ref +); + +unresolved_member_exprs( //dir=expr + unique int id: @unresolved_member_expr, + string name: string ref +); + +unresolved_pattern_exprs( //dir=expr + unique int id: @unresolved_pattern_expr, + int sub_pattern: @pattern_or_none ref +); + +unresolved_specialize_exprs( //dir=expr + unique int id: @unresolved_specialize_expr, + int sub_expr: @expr_or_none ref +); + +vararg_expansion_exprs( //dir=expr + unique int id: @vararg_expansion_expr, + int sub_expr: @expr_or_none ref +); + +abi_safe_conversion_exprs( //dir=expr + unique int id: @abi_safe_conversion_expr +); + +actor_isolation_erasure_exprs( //dir=expr + unique int id: @actor_isolation_erasure_expr +); + +any_hashable_erasure_exprs( //dir=expr + unique int id: @any_hashable_erasure_expr +); + +archetype_to_super_exprs( //dir=expr + unique int id: @archetype_to_super_expr +); + +array_exprs( //dir=expr + unique int id: @array_expr +); + +#keyset[id, index] +array_expr_elements( //dir=expr + int id: @array_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +array_to_pointer_exprs( //dir=expr + unique int id: @array_to_pointer_expr +); + +auto_closure_exprs( //dir=expr + unique int id: @auto_closure_expr +); + +await_exprs( //dir=expr + unique int id: @await_expr +); + +binary_exprs( //dir=expr + unique int id: @binary_expr +); + +borrow_exprs( //dir=expr + unique int id: @borrow_expr +); + +bridge_from_obj_c_exprs( //dir=expr + unique int id: @bridge_from_obj_c_expr +); + +bridge_to_obj_c_exprs( //dir=expr + unique int id: @bridge_to_obj_c_expr +); + +@builtin_literal_expr = + @boolean_literal_expr +| @magic_identifier_literal_expr +| @number_literal_expr +| @string_literal_expr +; + +call_exprs( //dir=expr + unique int id: @call_expr +); + +@checked_cast_expr = + @conditional_checked_cast_expr +| @forced_checked_cast_expr +| @is_expr +; + +class_metatype_to_object_exprs( //dir=expr + unique int id: @class_metatype_to_object_expr +); + +coerce_exprs( //dir=expr + unique int id: @coerce_expr +); + +collection_upcast_conversion_exprs( //dir=expr + unique int id: @collection_upcast_conversion_expr +); + +conditional_bridge_from_obj_c_exprs( //dir=expr + unique int id: @conditional_bridge_from_obj_c_expr +); + +covariant_function_conversion_exprs( //dir=expr + unique int id: @covariant_function_conversion_expr +); + +covariant_return_conversion_exprs( //dir=expr + unique int id: @covariant_return_conversion_expr +); + +derived_to_base_exprs( //dir=expr + unique int id: @derived_to_base_expr +); + +destructure_tuple_exprs( //dir=expr + unique int id: @destructure_tuple_expr +); + +dictionary_exprs( //dir=expr + unique int id: @dictionary_expr +); + +#keyset[id, index] +dictionary_expr_elements( //dir=expr + int id: @dictionary_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +differentiable_function_exprs( //dir=expr + unique int id: @differentiable_function_expr +); + +differentiable_function_extract_original_exprs( //dir=expr + unique int id: @differentiable_function_extract_original_expr +); + +dot_self_exprs( //dir=expr + unique int id: @dot_self_expr +); + +@dynamic_lookup_expr = + @dynamic_member_ref_expr +| @dynamic_subscript_expr +; + +erasure_exprs( //dir=expr + unique int id: @erasure_expr +); + +existential_metatype_to_object_exprs( //dir=expr + unique int id: @existential_metatype_to_object_expr +); + +explicit_closure_exprs( //dir=expr + unique int id: @explicit_closure_expr +); + +force_try_exprs( //dir=expr + unique int id: @force_try_expr +); + +foreign_object_conversion_exprs( //dir=expr + unique int id: @foreign_object_conversion_expr +); + +function_conversion_exprs( //dir=expr + unique int id: @function_conversion_expr +); + +in_out_to_pointer_exprs( //dir=expr + unique int id: @in_out_to_pointer_expr +); + +inject_into_optional_exprs( //dir=expr + unique int id: @inject_into_optional_expr +); + +interpolated_string_literal_exprs( //dir=expr + unique int id: @interpolated_string_literal_expr +); + +#keyset[id] +interpolated_string_literal_expr_interpolation_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int interpolation_expr: @opaque_value_expr_or_none ref +); + +#keyset[id] +interpolated_string_literal_expr_appending_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int appending_expr: @tap_expr_or_none ref +); + +linear_function_exprs( //dir=expr + unique int id: @linear_function_expr +); + +linear_function_extract_original_exprs( //dir=expr + unique int id: @linear_function_extract_original_expr +); + +linear_to_differentiable_function_exprs( //dir=expr + unique int id: @linear_to_differentiable_function_expr +); + +load_exprs( //dir=expr + unique int id: @load_expr +); + +member_ref_exprs( //dir=expr + unique int id: @member_ref_expr +); + +#keyset[id] +member_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_ordinary_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @member_ref_expr ref +); + +metatype_conversion_exprs( //dir=expr + unique int id: @metatype_conversion_expr +); + +nil_literal_exprs( //dir=expr + unique int id: @nil_literal_expr +); + +object_literal_exprs( //dir=expr + unique int id: @object_literal_expr, + int kind: int ref +); + +#keyset[id, index] +object_literal_expr_arguments( //dir=expr + int id: @object_literal_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +optional_try_exprs( //dir=expr + unique int id: @optional_try_expr +); + +paren_exprs( //dir=expr + unique int id: @paren_expr +); + +pointer_to_pointer_exprs( //dir=expr + unique int id: @pointer_to_pointer_expr +); + +postfix_unary_exprs( //dir=expr + unique int id: @postfix_unary_expr +); + +prefix_unary_exprs( //dir=expr + unique int id: @prefix_unary_expr +); + +protocol_metatype_to_object_exprs( //dir=expr + unique int id: @protocol_metatype_to_object_expr +); + +regex_literal_exprs( //dir=expr + unique int id: @regex_literal_expr, + string pattern: string ref, + int version: int ref +); + +@self_apply_expr = + @dot_syntax_call_expr +| @initializer_ref_call_expr +; + +#keyset[id] +self_apply_exprs( //dir=expr + int id: @self_apply_expr ref, + int base: @expr_or_none ref +); + +string_to_pointer_exprs( //dir=expr + unique int id: @string_to_pointer_expr +); + +subscript_exprs( //dir=expr + unique int id: @subscript_expr +); + +#keyset[id, index] +subscript_expr_arguments( //dir=expr + int id: @subscript_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +#keyset[id] +subscript_expr_has_direct_to_storage_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_ordinary_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_distributed_thunk_semantics( //dir=expr + int id: @subscript_expr ref +); + +try_exprs( //dir=expr + unique int id: @try_expr +); + +underlying_to_opaque_exprs( //dir=expr + unique int id: @underlying_to_opaque_expr +); + +unevaluated_instance_exprs( //dir=expr + unique int id: @unevaluated_instance_expr +); + +unreachable_exprs( //dir=expr + unique int id: @unreachable_expr +); + +unresolved_member_chain_result_exprs( //dir=expr + unique int id: @unresolved_member_chain_result_expr +); + +unresolved_type_conversion_exprs( //dir=expr + unique int id: @unresolved_type_conversion_expr +); + +unsafe_cast_exprs( //dir=expr + unique int id: @unsafe_cast_expr +); + +unsafe_exprs( //dir=expr + unique int id: @unsafe_expr +); + +boolean_literal_exprs( //dir=expr + unique int id: @boolean_literal_expr, + boolean value: boolean ref +); + +conditional_checked_cast_exprs( //dir=expr + unique int id: @conditional_checked_cast_expr +); + +dot_syntax_call_exprs( //dir=expr + unique int id: @dot_syntax_call_expr +); + +dynamic_member_ref_exprs( //dir=expr + unique int id: @dynamic_member_ref_expr +); + +dynamic_subscript_exprs( //dir=expr + unique int id: @dynamic_subscript_expr +); + +forced_checked_cast_exprs( //dir=expr + unique int id: @forced_checked_cast_expr +); + +initializer_ref_call_exprs( //dir=expr + unique int id: @initializer_ref_call_expr +); + +is_exprs( //dir=expr + unique int id: @is_expr +); + +magic_identifier_literal_exprs( //dir=expr + unique int id: @magic_identifier_literal_expr, + string kind: string ref +); + +@number_literal_expr = + @float_literal_expr +| @integer_literal_expr +; + +string_literal_exprs( //dir=expr + unique int id: @string_literal_expr, + string value: string ref +); + +float_literal_exprs( //dir=expr + unique int id: @float_literal_expr, + string string_value: string ref +); + +integer_literal_exprs( //dir=expr + unique int id: @integer_literal_expr, + string string_value: string ref +); + +@pattern = + @any_pattern +| @binding_pattern +| @bool_pattern +| @enum_element_pattern +| @expr_pattern +| @is_pattern +| @named_pattern +| @optional_some_pattern +| @paren_pattern +| @tuple_pattern +| @typed_pattern +; + +#keyset[id] +pattern_types( //dir=pattern + int id: @pattern ref, + int type_: @type_or_none ref +); + +any_patterns( //dir=pattern + unique int id: @any_pattern +); + +binding_patterns( //dir=pattern + unique int id: @binding_pattern, + int sub_pattern: @pattern_or_none ref +); + +bool_patterns( //dir=pattern + unique int id: @bool_pattern, + boolean value: boolean ref +); + +enum_element_patterns( //dir=pattern + unique int id: @enum_element_pattern, + int element: @enum_element_decl_or_none ref +); + +#keyset[id] +enum_element_pattern_sub_patterns( //dir=pattern + int id: @enum_element_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +expr_patterns( //dir=pattern + unique int id: @expr_pattern, + int sub_expr: @expr_or_none ref +); + +is_patterns( //dir=pattern + unique int id: @is_pattern +); + +#keyset[id] +is_pattern_cast_type_reprs( //dir=pattern + int id: @is_pattern ref, + int cast_type_repr: @type_repr_or_none ref +); + +#keyset[id] +is_pattern_sub_patterns( //dir=pattern + int id: @is_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +named_patterns( //dir=pattern + unique int id: @named_pattern, + int var_decl: @var_decl_or_none ref +); + +optional_some_patterns( //dir=pattern + unique int id: @optional_some_pattern, + int sub_pattern: @pattern_or_none ref +); + +paren_patterns( //dir=pattern + unique int id: @paren_pattern, + int sub_pattern: @pattern_or_none ref +); + +tuple_patterns( //dir=pattern + unique int id: @tuple_pattern +); + +#keyset[id, index] +tuple_pattern_elements( //dir=pattern + int id: @tuple_pattern ref, + int index: int ref, + int element: @pattern_or_none ref +); + +typed_patterns( //dir=pattern + unique int id: @typed_pattern, + int sub_pattern: @pattern_or_none ref +); + +#keyset[id] +typed_pattern_type_reprs( //dir=pattern + int id: @typed_pattern ref, + int type_repr: @type_repr_or_none ref +); + +case_label_items( //dir=stmt + unique int id: @case_label_item, + int pattern: @pattern_or_none ref +); + +#keyset[id] +case_label_item_guards( //dir=stmt + int id: @case_label_item ref, + int guard: @expr_or_none ref +); + +condition_elements( //dir=stmt + unique int id: @condition_element +); + +#keyset[id] +condition_element_booleans( //dir=stmt + int id: @condition_element ref, + int boolean_: @expr_or_none ref +); + +#keyset[id] +condition_element_patterns( //dir=stmt + int id: @condition_element ref, + int pattern: @pattern_or_none ref +); + +#keyset[id] +condition_element_initializers( //dir=stmt + int id: @condition_element ref, + int initializer: @expr_or_none ref +); + +#keyset[id] +condition_element_availabilities( //dir=stmt + int id: @condition_element ref, + int availability: @availability_info_or_none ref +); + +@stmt = + @brace_stmt +| @break_stmt +| @case_stmt +| @continue_stmt +| @defer_stmt +| @discard_stmt +| @fail_stmt +| @fallthrough_stmt +| @labeled_stmt +| @pound_assert_stmt +| @return_stmt +| @then_stmt +| @throw_stmt +| @yield_stmt +; + +stmt_conditions( //dir=stmt + unique int id: @stmt_condition +); + +#keyset[id, index] +stmt_condition_elements( //dir=stmt + int id: @stmt_condition ref, + int index: int ref, + int element: @condition_element_or_none ref +); + +brace_stmts( //dir=stmt + unique int id: @brace_stmt +); + +#keyset[id, index] +brace_stmt_elements( //dir=stmt + int id: @brace_stmt ref, + int index: int ref, + int element: @ast_node_or_none ref +); + +break_stmts( //dir=stmt + unique int id: @break_stmt +); + +#keyset[id] +break_stmt_target_names( //dir=stmt + int id: @break_stmt ref, + string target_name: string ref +); + +#keyset[id] +break_stmt_targets( //dir=stmt + int id: @break_stmt ref, + int target: @stmt_or_none ref +); + +case_stmts( //dir=stmt + unique int id: @case_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +case_stmt_labels( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int label: @case_label_item_or_none ref +); + +#keyset[id, index] +case_stmt_variables( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +continue_stmts( //dir=stmt + unique int id: @continue_stmt +); + +#keyset[id] +continue_stmt_target_names( //dir=stmt + int id: @continue_stmt ref, + string target_name: string ref +); + +#keyset[id] +continue_stmt_targets( //dir=stmt + int id: @continue_stmt ref, + int target: @stmt_or_none ref +); + +defer_stmts( //dir=stmt + unique int id: @defer_stmt, + int body: @brace_stmt_or_none ref +); + +discard_stmts( //dir=stmt + unique int id: @discard_stmt, + int sub_expr: @expr_or_none ref +); + +fail_stmts( //dir=stmt + unique int id: @fail_stmt +); + +fallthrough_stmts( //dir=stmt + unique int id: @fallthrough_stmt, + int fallthrough_source: @case_stmt_or_none ref, + int fallthrough_dest: @case_stmt_or_none ref +); + +@labeled_stmt = + @do_catch_stmt +| @do_stmt +| @for_each_stmt +| @labeled_conditional_stmt +| @repeat_while_stmt +| @switch_stmt +; + +#keyset[id] +labeled_stmt_labels( //dir=stmt + int id: @labeled_stmt ref, + string label: string ref +); + +pound_assert_stmts( //dir=stmt + unique int id: @pound_assert_stmt, + int condition: @expr_or_none ref, + string message: string ref +); + +return_stmts( //dir=stmt + unique int id: @return_stmt +); + +#keyset[id] +return_stmt_results( //dir=stmt + int id: @return_stmt ref, + int result: @expr_or_none ref +); + +then_stmts( //dir=stmt + unique int id: @then_stmt, + int result: @expr_or_none ref +); + +throw_stmts( //dir=stmt + unique int id: @throw_stmt, + int sub_expr: @expr_or_none ref +); + +yield_stmts( //dir=stmt + unique int id: @yield_stmt +); + +#keyset[id, index] +yield_stmt_results( //dir=stmt + int id: @yield_stmt ref, + int index: int ref, + int result: @expr_or_none ref +); + +do_catch_stmts( //dir=stmt + unique int id: @do_catch_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +do_catch_stmt_catches( //dir=stmt + int id: @do_catch_stmt ref, + int index: int ref, + int catch: @case_stmt_or_none ref +); + +do_stmts( //dir=stmt + unique int id: @do_stmt, + int body: @brace_stmt_or_none ref +); + +for_each_stmts( //dir=stmt + unique int id: @for_each_stmt, + int pattern: @pattern_or_none ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +for_each_stmt_variables( //dir=stmt + int id: @for_each_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +#keyset[id] +for_each_stmt_wheres( //dir=stmt + int id: @for_each_stmt ref, + int where: @expr_or_none ref +); + +#keyset[id] +for_each_stmt_iterator_vars( //dir=stmt + int id: @for_each_stmt ref, + int iteratorVar: @pattern_binding_decl_or_none ref +); + +#keyset[id] +for_each_stmt_next_calls( //dir=stmt + int id: @for_each_stmt ref, + int nextCall: @expr_or_none ref +); + +@labeled_conditional_stmt = + @guard_stmt +| @if_stmt +| @while_stmt +; + +#keyset[id] +labeled_conditional_stmts( //dir=stmt + int id: @labeled_conditional_stmt ref, + int condition: @stmt_condition_or_none ref +); + +repeat_while_stmts( //dir=stmt + unique int id: @repeat_while_stmt, + int condition: @expr_or_none ref, + int body: @stmt_or_none ref +); + +switch_stmts( //dir=stmt + unique int id: @switch_stmt, + int expr: @expr_or_none ref +); + +#keyset[id, index] +switch_stmt_cases( //dir=stmt + int id: @switch_stmt ref, + int index: int ref, + int case_: @case_stmt_or_none ref +); + +guard_stmts( //dir=stmt + unique int id: @guard_stmt, + int body: @brace_stmt_or_none ref +); + +if_stmts( //dir=stmt + unique int id: @if_stmt, + int then: @stmt_or_none ref +); + +#keyset[id] +if_stmt_elses( //dir=stmt + int id: @if_stmt ref, + int else: @stmt_or_none ref +); + +while_stmts( //dir=stmt + unique int id: @while_stmt, + int body: @stmt_or_none ref +); + +@type = + @any_function_type +| @any_generic_type +| @any_metatype_type +| @builtin_type +| @dependent_member_type +| @dynamic_self_type +| @error_type +| @existential_type +| @in_out_type +| @integer_type +| @l_value_type +| @module_type +| @pack_element_type +| @pack_expansion_type +| @pack_type +| @parameterized_protocol_type +| @protocol_composition_type +| @reference_storage_type +| @substitutable_type +| @sugar_type +| @tuple_type +| @unresolved_type +; + +#keyset[id] +types( //dir=type + int id: @type ref, + string name: string ref, + int canonical_type: @type_or_none ref +); + +type_reprs( //dir=type + unique int id: @type_repr, + int type_: @type_or_none ref +); + +@any_function_type = + @function_type +| @generic_function_type +; + +#keyset[id] +any_function_types( //dir=type + int id: @any_function_type ref, + int result: @type_or_none ref +); + +#keyset[id, index] +any_function_type_param_types( //dir=type + int id: @any_function_type ref, + int index: int ref, + int param_type: @type_or_none ref +); + +#keyset[id] +any_function_type_is_throwing( //dir=type + int id: @any_function_type ref +); + +#keyset[id] +any_function_type_is_async( //dir=type + int id: @any_function_type ref +); + +@any_generic_type = + @nominal_or_bound_generic_nominal_type +| @unbound_generic_type +; + +#keyset[id] +any_generic_types( //dir=type + int id: @any_generic_type ref, + int declaration: @generic_type_decl_or_none ref +); + +#keyset[id] +any_generic_type_parents( //dir=type + int id: @any_generic_type ref, + int parent: @type_or_none ref +); + +@any_metatype_type = + @existential_metatype_type +| @metatype_type +; + +@builtin_type = + @any_builtin_integer_type +| @builtin_bridge_object_type +| @builtin_default_actor_storage_type +| @builtin_executor_type +| @builtin_float_type +| @builtin_generic_type +| @builtin_job_type +| @builtin_native_object_type +| @builtin_raw_pointer_type +| @builtin_raw_unsafe_continuation_type +| @builtin_unsafe_value_buffer_type +| @builtin_vector_type +; + +dependent_member_types( //dir=type + unique int id: @dependent_member_type, + int base_type: @type_or_none ref, + int associated_type_decl: @associated_type_decl_or_none ref +); + +dynamic_self_types( //dir=type + unique int id: @dynamic_self_type, + int static_self_type: @type_or_none ref +); + +error_types( //dir=type + unique int id: @error_type +); + +existential_types( //dir=type + unique int id: @existential_type, + int constraint: @type_or_none ref +); + +in_out_types( //dir=type + unique int id: @in_out_type, + int object_type: @type_or_none ref +); + +integer_types( //dir=type + unique int id: @integer_type, + string value: string ref +); + +l_value_types( //dir=type + unique int id: @l_value_type, + int object_type: @type_or_none ref +); + +module_types( //dir=type + unique int id: @module_type, + int module: @module_decl_or_none ref +); + +pack_element_types( //dir=type + unique int id: @pack_element_type, + int pack_type: @type_or_none ref +); + +pack_expansion_types( //dir=type + unique int id: @pack_expansion_type, + int pattern_type: @type_or_none ref, + int count_type: @type_or_none ref +); + +pack_types( //dir=type + unique int id: @pack_type +); + +#keyset[id, index] +pack_type_elements( //dir=type + int id: @pack_type ref, + int index: int ref, + int element: @type_or_none ref +); + +parameterized_protocol_types( //dir=type + unique int id: @parameterized_protocol_type, + int base: @protocol_type_or_none ref +); + +#keyset[id, index] +parameterized_protocol_type_args( //dir=type + int id: @parameterized_protocol_type ref, + int index: int ref, + int arg: @type_or_none ref +); + +protocol_composition_types( //dir=type + unique int id: @protocol_composition_type +); + +#keyset[id, index] +protocol_composition_type_members( //dir=type + int id: @protocol_composition_type ref, + int index: int ref, + int member: @type_or_none ref +); + +@reference_storage_type = + @unmanaged_storage_type +| @unowned_storage_type +| @weak_storage_type +; + +#keyset[id] +reference_storage_types( //dir=type + int id: @reference_storage_type ref, + int referent_type: @type_or_none ref +); + +@substitutable_type = + @archetype_type +| @generic_type_param_type +; + +@sugar_type = + @paren_type +| @syntax_sugar_type +| @type_alias_type +; + +tuple_types( //dir=type + unique int id: @tuple_type +); + +#keyset[id, index] +tuple_type_types( //dir=type + int id: @tuple_type ref, + int index: int ref, + int type_: @type_or_none ref +); + +#keyset[id, index] +tuple_type_names( //dir=type + int id: @tuple_type ref, + int index: int ref, + string name: string ref +); + +unresolved_types( //dir=type + unique int id: @unresolved_type +); + +@any_builtin_integer_type = + @builtin_integer_literal_type +| @builtin_integer_type +; + +@archetype_type = + @local_archetype_type +| @opaque_type_archetype_type +| @pack_archetype_type +| @primary_archetype_type +; + +#keyset[id] +archetype_types( //dir=type + int id: @archetype_type ref, + int interface_type: @type_or_none ref +); + +#keyset[id] +archetype_type_superclasses( //dir=type + int id: @archetype_type ref, + int superclass: @type_or_none ref +); + +#keyset[id, index] +archetype_type_protocols( //dir=type + int id: @archetype_type ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +builtin_bridge_object_types( //dir=type + unique int id: @builtin_bridge_object_type +); + +builtin_default_actor_storage_types( //dir=type + unique int id: @builtin_default_actor_storage_type +); + +builtin_executor_types( //dir=type + unique int id: @builtin_executor_type +); + +builtin_float_types( //dir=type + unique int id: @builtin_float_type +); + +@builtin_generic_type = + @builtin_fixed_array_type +; + +builtin_job_types( //dir=type + unique int id: @builtin_job_type +); + +builtin_native_object_types( //dir=type + unique int id: @builtin_native_object_type +); + +builtin_raw_pointer_types( //dir=type + unique int id: @builtin_raw_pointer_type +); + +builtin_raw_unsafe_continuation_types( //dir=type + unique int id: @builtin_raw_unsafe_continuation_type +); + +builtin_unsafe_value_buffer_types( //dir=type + unique int id: @builtin_unsafe_value_buffer_type +); + +builtin_vector_types( //dir=type + unique int id: @builtin_vector_type +); + +existential_metatype_types( //dir=type + unique int id: @existential_metatype_type +); + +function_types( //dir=type + unique int id: @function_type +); + +generic_function_types( //dir=type + unique int id: @generic_function_type +); + +#keyset[id, index] +generic_function_type_generic_params( //dir=type + int id: @generic_function_type ref, + int index: int ref, + int generic_param: @generic_type_param_type_or_none ref +); + +generic_type_param_types( //dir=type + unique int id: @generic_type_param_type +); + +metatype_types( //dir=type + unique int id: @metatype_type +); + +@nominal_or_bound_generic_nominal_type = + @bound_generic_type +| @nominal_type +; + +paren_types( //dir=type + unique int id: @paren_type, + int type_: @type_or_none ref +); + +@syntax_sugar_type = + @dictionary_type +| @inline_array_type +| @unary_syntax_sugar_type +; + +type_alias_types( //dir=type + unique int id: @type_alias_type, + int decl: @type_alias_decl_or_none ref +); + +unbound_generic_types( //dir=type + unique int id: @unbound_generic_type +); + +unmanaged_storage_types( //dir=type + unique int id: @unmanaged_storage_type +); + +unowned_storage_types( //dir=type + unique int id: @unowned_storage_type +); + +weak_storage_types( //dir=type + unique int id: @weak_storage_type +); + +@bound_generic_type = + @bound_generic_class_type +| @bound_generic_enum_type +| @bound_generic_struct_type +; + +#keyset[id, index] +bound_generic_type_arg_types( //dir=type + int id: @bound_generic_type ref, + int index: int ref, + int arg_type: @type_or_none ref +); + +builtin_fixed_array_types( //dir=type + unique int id: @builtin_fixed_array_type, + int size: @type_or_none ref, + int element_type: @type_or_none ref +); + +builtin_integer_literal_types( //dir=type + unique int id: @builtin_integer_literal_type +); + +builtin_integer_types( //dir=type + unique int id: @builtin_integer_type +); + +#keyset[id] +builtin_integer_type_widths( //dir=type + int id: @builtin_integer_type ref, + int width: int ref +); + +dictionary_types( //dir=type + unique int id: @dictionary_type, + int key_type: @type_or_none ref, + int value_type: @type_or_none ref +); + +inline_array_types( //dir=type + unique int id: @inline_array_type, + int count_type: @type_or_none ref, + int element_type: @type_or_none ref +); + +@local_archetype_type = + @element_archetype_type +| @existential_archetype_type +; + +@nominal_type = + @class_type +| @enum_type +| @protocol_type +| @struct_type +; + +opaque_type_archetype_types( //dir=type + unique int id: @opaque_type_archetype_type, + int declaration: @opaque_type_decl_or_none ref +); + +pack_archetype_types( //dir=type + unique int id: @pack_archetype_type +); + +primary_archetype_types( //dir=type + unique int id: @primary_archetype_type +); + +@unary_syntax_sugar_type = + @array_slice_type +| @optional_type +| @variadic_sequence_type +; + +#keyset[id] +unary_syntax_sugar_types( //dir=type + int id: @unary_syntax_sugar_type ref, + int base_type: @type_or_none ref +); + +array_slice_types( //dir=type + unique int id: @array_slice_type +); + +bound_generic_class_types( //dir=type + unique int id: @bound_generic_class_type +); + +bound_generic_enum_types( //dir=type + unique int id: @bound_generic_enum_type +); + +bound_generic_struct_types( //dir=type + unique int id: @bound_generic_struct_type +); + +class_types( //dir=type + unique int id: @class_type +); + +element_archetype_types( //dir=type + unique int id: @element_archetype_type +); + +enum_types( //dir=type + unique int id: @enum_type +); + +existential_archetype_types( //dir=type + unique int id: @existential_archetype_type +); + +optional_types( //dir=type + unique int id: @optional_type +); + +protocol_types( //dir=type + unique int id: @protocol_type +); + +struct_types( //dir=type + unique int id: @struct_type +); + +variadic_sequence_types( //dir=type + unique int id: @variadic_sequence_type +); + +@accessor_or_none = + @accessor +| @unspecified_element +; + +@argument_or_none = + @argument +| @unspecified_element +; + +@associated_type_decl_or_none = + @associated_type_decl +| @unspecified_element +; + +@ast_node_or_none = + @ast_node +| @unspecified_element +; + +@availability_info_or_none = + @availability_info +| @unspecified_element +; + +@availability_spec_or_none = + @availability_spec +| @unspecified_element +; + +@brace_stmt_or_none = + @brace_stmt +| @unspecified_element +; + +@captured_decl_or_none = + @captured_decl +| @unspecified_element +; + +@case_label_item_or_none = + @case_label_item +| @unspecified_element +; + +@case_stmt_or_none = + @case_stmt +| @unspecified_element +; + +@closure_expr_or_none = + @closure_expr +| @unspecified_element +; + +@condition_element_or_none = + @condition_element +| @unspecified_element +; + +@decl_or_none = + @decl +| @unspecified_element +; + +@enum_element_decl_or_none = + @enum_element_decl +| @unspecified_element +; + +@expr_or_none = + @expr +| @unspecified_element +; + +@file_or_none = + @file +| @unspecified_element +; + +@function_or_none = + @function +| @unspecified_element +; + +@generic_type_decl_or_none = + @generic_type_decl +| @unspecified_element +; + +@generic_type_param_decl_or_none = + @generic_type_param_decl +| @unspecified_element +; + +@generic_type_param_type_or_none = + @generic_type_param_type +| @unspecified_element +; + +@initializer_or_none = + @initializer +| @unspecified_element +; + +@key_path_component_or_none = + @key_path_component +| @unspecified_element +; + +@location_or_none = + @location +| @unspecified_element +; + +@macro_role_or_none = + @macro_role +| @unspecified_element +; + +@module_decl_or_none = + @module_decl +| @unspecified_element +; + +@nominal_type_decl_or_none = + @nominal_type_decl +| @unspecified_element +; + +@opaque_type_decl_or_none = + @opaque_type_decl +| @unspecified_element +; + +@opaque_value_expr_or_none = + @opaque_value_expr +| @unspecified_element +; + +@param_decl_or_none = + @param_decl +| @unspecified_element +; + +@pattern_or_none = + @pattern +| @unspecified_element +; + +@pattern_binding_decl_or_none = + @pattern_binding_decl +| @unspecified_element +; + +@precedence_group_decl_or_none = + @precedence_group_decl +| @unspecified_element +; + +@protocol_decl_or_none = + @protocol_decl +| @unspecified_element +; + +@protocol_type_or_none = + @protocol_type +| @unspecified_element +; + +@stmt_or_none = + @stmt +| @unspecified_element +; + +@stmt_condition_or_none = + @stmt_condition +| @unspecified_element +; + +@string_literal_expr_or_none = + @string_literal_expr +| @unspecified_element +; + +@tap_expr_or_none = + @tap_expr +| @unspecified_element +; + +@type_or_none = + @type +| @unspecified_element +; + +@type_alias_decl_or_none = + @type_alias_decl +| @unspecified_element +; + +@type_repr_or_none = + @type_repr +| @unspecified_element +; + +@value_decl_or_none = + @unspecified_element +| @value_decl +; + +@var_decl_or_none = + @unspecified_element +| @var_decl +; diff --git a/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/swift.dbscheme b/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/swift.dbscheme new file mode 100644 index 000000000000..5738be6bb047 --- /dev/null +++ b/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/swift.dbscheme @@ -0,0 +1,2891 @@ +// generated by codegen/codegen.py, do not edit + +// from prefix.dbscheme +/** + * The source location of the snapshot. + */ +sourceLocationPrefix( + string prefix: string ref +); + + +// from schema.py + +@element = + @file +| @generic_context +| @locatable +| @location +| @type +; + +#keyset[id] +element_is_unknown( + int id: @element ref +); + +@file = + @db_file +; + +#keyset[id] +files( + int id: @file ref, + string name: string ref +); + +#keyset[id] +file_is_successfully_extracted( + int id: @file ref +); + +@locatable = + @argument +| @ast_node +| @comment +| @diagnostics +| @error_element +; + +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_or_none ref +); + +@location = + @db_location +; + +#keyset[id] +locations( + int id: @location ref, + int file: @file_or_none ref, + int start_line: int ref, + int start_column: int ref, + int end_line: int ref, + int end_column: int ref +); + +@ast_node = + @availability_info +| @availability_spec +| @callable +| @case_label_item +| @condition_element +| @decl +| @expr +| @key_path_component +| @macro_role +| @pattern +| @stmt +| @stmt_condition +| @type_repr +; + +comments( + unique int id: @comment, + string text: string ref +); + +db_files( + unique int id: @db_file +); + +db_locations( + unique int id: @db_location +); + +diagnostics( + unique int id: @diagnostics, + string text: string ref, + int kind: int ref +); + +@error_element = + @error_expr +| @error_type +| @overloaded_decl_ref_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_chain_result_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @unresolved_type +| @unresolved_type_conversion_expr +| @unspecified_element +; + +availability_infos( + unique int id: @availability_info +); + +#keyset[id] +availability_info_is_unavailable( + int id: @availability_info ref +); + +#keyset[id, index] +availability_info_specs( + int id: @availability_info ref, + int index: int ref, + int spec: @availability_spec_or_none ref +); + +availability_specs( + unique int id: @availability_spec +); + +#keyset[id] +availability_spec_platforms( + int id: @availability_spec ref, + string platform: string ref +); + +#keyset[id] +availability_spec_versions( + int id: @availability_spec ref, + string version: string ref +); + +#keyset[id] +availability_spec_is_wildcard( + int id: @availability_spec ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_names( + int id: @callable ref, + string name: string ref +); + +#keyset[id] +callable_self_params( + int id: @callable ref, + int self_param: @param_decl_or_none ref +); + +#keyset[id, index] +callable_params( + int id: @callable ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +#keyset[id] +callable_bodies( + int id: @callable ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +callable_captures( + int id: @callable ref, + int index: int ref, + int capture: @captured_decl_or_none ref +); + +key_path_components( + unique int id: @key_path_component, + int kind: int ref, + int component_type: @type_or_none ref +); + +#keyset[id, index] +key_path_component_subscript_arguments( + int id: @key_path_component ref, + int index: int ref, + int subscript_argument: @argument_or_none ref +); + +#keyset[id] +key_path_component_tuple_indices( + int id: @key_path_component ref, + int tuple_index: int ref +); + +#keyset[id] +key_path_component_decl_refs( + int id: @key_path_component ref, + int decl_ref: @value_decl_or_none ref +); + +macro_roles( + unique int id: @macro_role, + int kind: int ref, + int macro_syntax: int ref +); + +#keyset[id, index] +macro_role_conformances( + int id: @macro_role ref, + int index: int ref, + int conformance: @expr_or_none ref +); + +#keyset[id, index] +macro_role_names( + int id: @macro_role ref, + int index: int ref, + string name: string ref +); + +unspecified_elements( + unique int id: @unspecified_element, + string property: string ref, + string error: string ref +); + +#keyset[id] +unspecified_element_parents( + int id: @unspecified_element ref, + int parent: @element ref +); + +#keyset[id] +unspecified_element_indices( + int id: @unspecified_element ref, + int index: int ref +); + +#keyset[id, index] +unspecified_element_children( + int id: @unspecified_element ref, + int index: int ref, + int child: @ast_node_or_none ref +); + +@decl = + @captured_decl +| @enum_case_decl +| @extension_decl +| @if_config_decl +| @import_decl +| @missing_member_decl +| @operator_decl +| @pattern_binding_decl +| @pound_diagnostic_decl +| @precedence_group_decl +| @top_level_code_decl +| @using_decl +| @value_decl +; + +#keyset[id] +decls( //dir=decl + int id: @decl ref, + int module: @module_decl_or_none ref +); + +#keyset[id, index] +decl_members( //dir=decl + int id: @decl ref, + int index: int ref, + int member: @decl_or_none ref +); + +@generic_context = + @extension_decl +| @function +| @generic_type_decl +| @macro_decl +| @subscript_decl +; + +#keyset[id, index] +generic_context_generic_type_params( //dir=decl + int id: @generic_context ref, + int index: int ref, + int generic_type_param: @generic_type_param_decl_or_none ref +); + +captured_decls( //dir=decl + unique int id: @captured_decl, + int decl: @value_decl_or_none ref +); + +#keyset[id] +captured_decl_is_direct( //dir=decl + int id: @captured_decl ref +); + +#keyset[id] +captured_decl_is_escaping( //dir=decl + int id: @captured_decl ref +); + +enum_case_decls( //dir=decl + unique int id: @enum_case_decl +); + +#keyset[id, index] +enum_case_decl_elements( //dir=decl + int id: @enum_case_decl ref, + int index: int ref, + int element: @enum_element_decl_or_none ref +); + +extension_decls( //dir=decl + unique int id: @extension_decl, + int extended_type_decl: @nominal_type_decl_or_none ref +); + +#keyset[id, index] +extension_decl_protocols( //dir=decl + int id: @extension_decl ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +if_config_decls( //dir=decl + unique int id: @if_config_decl +); + +#keyset[id, index] +if_config_decl_active_elements( //dir=decl + int id: @if_config_decl ref, + int index: int ref, + int active_element: @ast_node_or_none ref +); + +import_decls( //dir=decl + unique int id: @import_decl +); + +#keyset[id] +import_decl_is_exported( //dir=decl + int id: @import_decl ref +); + +#keyset[id] +import_decl_imported_modules( //dir=decl + int id: @import_decl ref, + int imported_module: @module_decl_or_none ref +); + +#keyset[id, index] +import_decl_declarations( //dir=decl + int id: @import_decl ref, + int index: int ref, + int declaration: @value_decl_or_none ref +); + +missing_member_decls( //dir=decl + unique int id: @missing_member_decl, + string name: string ref +); + +@operator_decl = + @infix_operator_decl +| @postfix_operator_decl +| @prefix_operator_decl +; + +#keyset[id] +operator_decls( //dir=decl + int id: @operator_decl ref, + string name: string ref +); + +pattern_binding_decls( //dir=decl + unique int id: @pattern_binding_decl +); + +#keyset[id, index] +pattern_binding_decl_inits( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int init: @expr_or_none ref +); + +#keyset[id, index] +pattern_binding_decl_patterns( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int pattern: @pattern_or_none ref +); + +pound_diagnostic_decls( //dir=decl + unique int id: @pound_diagnostic_decl, + int kind: int ref, + int message: @string_literal_expr_or_none ref +); + +precedence_group_decls( //dir=decl + unique int id: @precedence_group_decl +); + +top_level_code_decls( //dir=decl + unique int id: @top_level_code_decl, + int body: @brace_stmt_or_none ref +); + +using_decls( //dir=decl + unique int id: @using_decl +); + +#keyset[id] +using_decl_is_main_actor( //dir=decl + int id: @using_decl ref +); + +#keyset[id] +using_decl_is_nonisolated( //dir=decl + int id: @using_decl ref +); + +@value_decl = + @abstract_storage_decl +| @enum_element_decl +| @function +| @macro_decl +| @type_decl +; + +#keyset[id] +value_decls( //dir=decl + int id: @value_decl ref, + int interface_type: @type_or_none ref +); + +@abstract_storage_decl = + @subscript_decl +| @var_decl +; + +#keyset[id, index] +abstract_storage_decl_accessors( //dir=decl + int id: @abstract_storage_decl ref, + int index: int ref, + int accessor: @accessor_or_none ref +); + +enum_element_decls( //dir=decl + unique int id: @enum_element_decl, + string name: string ref +); + +#keyset[id, index] +enum_element_decl_params( //dir=decl + int id: @enum_element_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@function = + @accessor_or_named_function +| @deinitializer +| @initializer +; + +infix_operator_decls( //dir=decl + unique int id: @infix_operator_decl +); + +#keyset[id] +infix_operator_decl_precedence_groups( //dir=decl + int id: @infix_operator_decl ref, + int precedence_group: @precedence_group_decl_or_none ref +); + +macro_decls( //dir=decl + unique int id: @macro_decl, + string name: string ref +); + +#keyset[id, index] +macro_decl_parameters( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int parameter: @param_decl_or_none ref +); + +#keyset[id, index] +macro_decl_roles( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int role: @macro_role_or_none ref +); + +postfix_operator_decls( //dir=decl + unique int id: @postfix_operator_decl +); + +prefix_operator_decls( //dir=decl + unique int id: @prefix_operator_decl +); + +@type_decl = + @abstract_type_param_decl +| @generic_type_decl +| @module_decl +; + +#keyset[id] +type_decls( //dir=decl + int id: @type_decl ref, + string name: string ref +); + +#keyset[id, index] +type_decl_inherited_types( //dir=decl + int id: @type_decl ref, + int index: int ref, + int inherited_type: @type_or_none ref +); + +@abstract_type_param_decl = + @associated_type_decl +| @generic_type_param_decl +; + +@accessor_or_named_function = + @accessor +| @named_function +; + +deinitializers( //dir=decl + unique int id: @deinitializer +); + +@generic_type_decl = + @nominal_type_decl +| @opaque_type_decl +| @type_alias_decl +; + +initializers( //dir=decl + unique int id: @initializer +); + +module_decls( //dir=decl + unique int id: @module_decl +); + +#keyset[id] +module_decl_is_builtin_module( //dir=decl + int id: @module_decl ref +); + +#keyset[id] +module_decl_is_system_module( //dir=decl + int id: @module_decl ref +); + +module_decl_imported_modules( //dir=decl + int id: @module_decl ref, + int imported_module: @module_decl_or_none ref +); + +module_decl_exported_modules( //dir=decl + int id: @module_decl ref, + int exported_module: @module_decl_or_none ref +); + +subscript_decls( //dir=decl + unique int id: @subscript_decl, + int element_type: @type_or_none ref +); + +#keyset[id, index] +subscript_decl_params( //dir=decl + int id: @subscript_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@var_decl = + @concrete_var_decl +| @param_decl +; + +#keyset[id] +var_decls( //dir=decl + int id: @var_decl ref, + string name: string ref, + int type_: @type_or_none ref +); + +#keyset[id] +var_decl_attached_property_wrapper_types( //dir=decl + int id: @var_decl ref, + int attached_property_wrapper_type: @type_or_none ref +); + +#keyset[id] +var_decl_parent_patterns( //dir=decl + int id: @var_decl ref, + int parent_pattern: @pattern_or_none ref +); + +#keyset[id] +var_decl_parent_initializers( //dir=decl + int id: @var_decl ref, + int parent_initializer: @expr_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var: @var_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var: @var_decl_or_none ref +); + +accessors( //dir=decl + unique int id: @accessor +); + +#keyset[id] +accessor_is_getter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_setter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_will_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_did_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_mutable_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_distributed_get( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_init( //dir=decl + int id: @accessor ref +); + +associated_type_decls( //dir=decl + unique int id: @associated_type_decl +); + +concrete_var_decls( //dir=decl + unique int id: @concrete_var_decl, + int introducer_int: int ref +); + +generic_type_param_decls( //dir=decl + unique int id: @generic_type_param_decl +); + +named_functions( //dir=decl + unique int id: @named_function +); + +@nominal_type_decl = + @class_decl +| @enum_decl +| @protocol_decl +| @struct_decl +; + +#keyset[id] +nominal_type_decls( //dir=decl + int id: @nominal_type_decl ref, + int type_: @type_or_none ref +); + +opaque_type_decls( //dir=decl + unique int id: @opaque_type_decl, + int naming_declaration: @value_decl_or_none ref +); + +#keyset[id, index] +opaque_type_decl_opaque_generic_params( //dir=decl + int id: @opaque_type_decl ref, + int index: int ref, + int opaque_generic_param: @generic_type_param_type_or_none ref +); + +param_decls( //dir=decl + unique int id: @param_decl +); + +#keyset[id] +param_decl_is_inout( //dir=decl + int id: @param_decl ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_var_bindings( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_vars( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var: @var_decl_or_none ref +); + +type_alias_decls( //dir=decl + unique int id: @type_alias_decl, + int aliased_type: @type_or_none ref +); + +class_decls( //dir=decl + unique int id: @class_decl +); + +enum_decls( //dir=decl + unique int id: @enum_decl +); + +protocol_decls( //dir=decl + unique int id: @protocol_decl +); + +struct_decls( //dir=decl + unique int id: @struct_decl +); + +arguments( //dir=expr + unique int id: @argument, + string label: string ref, + int expr: @expr_or_none ref +); + +@expr = + @any_try_expr +| @applied_property_wrapper_expr +| @apply_expr +| @assign_expr +| @bind_optional_expr +| @capture_list_expr +| @closure_expr +| @collection_expr +| @consume_expr +| @copy_expr +| @current_context_isolation_expr +| @decl_ref_expr +| @default_argument_expr +| @discard_assignment_expr +| @dot_syntax_base_ignored_expr +| @dynamic_type_expr +| @enum_is_case_expr +| @error_expr +| @explicit_cast_expr +| @extract_function_isolation_expr +| @force_value_expr +| @identity_expr +| @if_expr +| @implicit_conversion_expr +| @in_out_expr +| @key_path_application_expr +| @key_path_dot_expr +| @key_path_expr +| @lazy_initialization_expr +| @literal_expr +| @lookup_expr +| @make_temporarily_escapable_expr +| @materialize_pack_expr +| @obj_c_selector_expr +| @one_way_expr +| @opaque_value_expr +| @open_existential_expr +| @optional_evaluation_expr +| @other_initializer_ref_expr +| @overloaded_decl_ref_expr +| @pack_element_expr +| @pack_expansion_expr +| @property_wrapper_value_placeholder_expr +| @rebind_self_in_initializer_expr +| @sequence_expr +| @single_value_stmt_expr +| @super_ref_expr +| @tap_expr +| @tuple_element_expr +| @tuple_expr +| @type_expr +| @type_value_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @vararg_expansion_expr +; + +#keyset[id] +expr_types( //dir=expr + int id: @expr ref, + int type_: @type_or_none ref +); + +@any_try_expr = + @force_try_expr +| @optional_try_expr +| @try_expr +; + +#keyset[id] +any_try_exprs( //dir=expr + int id: @any_try_expr ref, + int sub_expr: @expr_or_none ref +); + +applied_property_wrapper_exprs( //dir=expr + unique int id: @applied_property_wrapper_expr, + int kind: int ref, + int value: @expr_or_none ref, + int param: @param_decl_or_none ref +); + +@apply_expr = + @binary_expr +| @call_expr +| @postfix_unary_expr +| @prefix_unary_expr +| @self_apply_expr +; + +#keyset[id] +apply_exprs( //dir=expr + int id: @apply_expr ref, + int function: @expr_or_none ref +); + +#keyset[id, index] +apply_expr_arguments( //dir=expr + int id: @apply_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +assign_exprs( //dir=expr + unique int id: @assign_expr, + int dest: @expr_or_none ref, + int source: @expr_or_none ref +); + +bind_optional_exprs( //dir=expr + unique int id: @bind_optional_expr, + int sub_expr: @expr_or_none ref +); + +capture_list_exprs( //dir=expr + unique int id: @capture_list_expr, + int closure_body: @closure_expr_or_none ref +); + +#keyset[id, index] +capture_list_expr_binding_decls( //dir=expr + int id: @capture_list_expr ref, + int index: int ref, + int binding_decl: @pattern_binding_decl_or_none ref +); + +@closure_expr = + @auto_closure_expr +| @explicit_closure_expr +; + +@collection_expr = + @array_expr +| @dictionary_expr +; + +consume_exprs( //dir=expr + unique int id: @consume_expr, + int sub_expr: @expr_or_none ref +); + +copy_exprs( //dir=expr + unique int id: @copy_expr, + int sub_expr: @expr_or_none ref +); + +current_context_isolation_exprs( //dir=expr + unique int id: @current_context_isolation_expr, + int actor: @expr_or_none ref +); + +decl_ref_exprs( //dir=expr + unique int id: @decl_ref_expr, + int decl: @decl_or_none ref +); + +#keyset[id, index] +decl_ref_expr_replacement_types( //dir=expr + int id: @decl_ref_expr ref, + int index: int ref, + int replacement_type: @type_or_none ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_ordinary_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +default_argument_exprs( //dir=expr + unique int id: @default_argument_expr, + int param_decl: @param_decl_or_none ref, + int param_index: int ref +); + +#keyset[id] +default_argument_expr_caller_side_defaults( //dir=expr + int id: @default_argument_expr ref, + int caller_side_default: @expr_or_none ref +); + +discard_assignment_exprs( //dir=expr + unique int id: @discard_assignment_expr +); + +dot_syntax_base_ignored_exprs( //dir=expr + unique int id: @dot_syntax_base_ignored_expr, + int qualifier: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +dynamic_type_exprs( //dir=expr + unique int id: @dynamic_type_expr, + int base: @expr_or_none ref +); + +enum_is_case_exprs( //dir=expr + unique int id: @enum_is_case_expr, + int sub_expr: @expr_or_none ref, + int element: @enum_element_decl_or_none ref +); + +error_exprs( //dir=expr + unique int id: @error_expr +); + +@explicit_cast_expr = + @checked_cast_expr +| @coerce_expr +; + +#keyset[id] +explicit_cast_exprs( //dir=expr + int id: @explicit_cast_expr ref, + int sub_expr: @expr_or_none ref +); + +extract_function_isolation_exprs( //dir=expr + unique int id: @extract_function_isolation_expr, + int function_expr: @expr_or_none ref +); + +force_value_exprs( //dir=expr + unique int id: @force_value_expr, + int sub_expr: @expr_or_none ref +); + +@identity_expr = + @await_expr +| @borrow_expr +| @dot_self_expr +| @paren_expr +| @unresolved_member_chain_result_expr +| @unsafe_expr +; + +#keyset[id] +identity_exprs( //dir=expr + int id: @identity_expr ref, + int sub_expr: @expr_or_none ref +); + +if_exprs( //dir=expr + unique int id: @if_expr, + int condition: @expr_or_none ref, + int then_expr: @expr_or_none ref, + int else_expr: @expr_or_none ref +); + +@implicit_conversion_expr = + @abi_safe_conversion_expr +| @actor_isolation_erasure_expr +| @any_hashable_erasure_expr +| @archetype_to_super_expr +| @array_to_pointer_expr +| @bridge_from_obj_c_expr +| @bridge_to_obj_c_expr +| @class_metatype_to_object_expr +| @collection_upcast_conversion_expr +| @conditional_bridge_from_obj_c_expr +| @covariant_function_conversion_expr +| @covariant_return_conversion_expr +| @derived_to_base_expr +| @destructure_tuple_expr +| @differentiable_function_expr +| @differentiable_function_extract_original_expr +| @erasure_expr +| @existential_metatype_to_object_expr +| @foreign_object_conversion_expr +| @function_conversion_expr +| @in_out_to_pointer_expr +| @inject_into_optional_expr +| @linear_function_expr +| @linear_function_extract_original_expr +| @linear_to_differentiable_function_expr +| @load_expr +| @metatype_conversion_expr +| @pointer_to_pointer_expr +| @protocol_metatype_to_object_expr +| @string_to_pointer_expr +| @underlying_to_opaque_expr +| @unevaluated_instance_expr +| @unreachable_expr +| @unresolved_type_conversion_expr +| @unsafe_cast_expr +; + +#keyset[id] +implicit_conversion_exprs( //dir=expr + int id: @implicit_conversion_expr ref, + int sub_expr: @expr_or_none ref +); + +in_out_exprs( //dir=expr + unique int id: @in_out_expr, + int sub_expr: @expr_or_none ref +); + +key_path_application_exprs( //dir=expr + unique int id: @key_path_application_expr, + int base: @expr_or_none ref, + int key_path: @expr_or_none ref +); + +key_path_dot_exprs( //dir=expr + unique int id: @key_path_dot_expr +); + +key_path_exprs( //dir=expr + unique int id: @key_path_expr +); + +#keyset[id] +key_path_expr_roots( //dir=expr + int id: @key_path_expr ref, + int root: @type_repr_or_none ref +); + +#keyset[id, index] +key_path_expr_components( //dir=expr + int id: @key_path_expr ref, + int index: int ref, + int component: @key_path_component_or_none ref +); + +lazy_initialization_exprs( //dir=expr + unique int id: @lazy_initialization_expr, + int sub_expr: @expr_or_none ref +); + +@literal_expr = + @builtin_literal_expr +| @interpolated_string_literal_expr +| @nil_literal_expr +| @object_literal_expr +| @regex_literal_expr +; + +@lookup_expr = + @dynamic_lookup_expr +| @member_ref_expr +| @subscript_expr +; + +#keyset[id] +lookup_exprs( //dir=expr + int id: @lookup_expr ref, + int base: @expr_or_none ref +); + +#keyset[id] +lookup_expr_members( //dir=expr + int id: @lookup_expr ref, + int member: @decl_or_none ref +); + +make_temporarily_escapable_exprs( //dir=expr + unique int id: @make_temporarily_escapable_expr, + int escaping_closure: @opaque_value_expr_or_none ref, + int nonescaping_closure: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +materialize_pack_exprs( //dir=expr + unique int id: @materialize_pack_expr, + int sub_expr: @expr_or_none ref +); + +obj_c_selector_exprs( //dir=expr + unique int id: @obj_c_selector_expr, + int sub_expr: @expr_or_none ref, + int method: @function_or_none ref +); + +one_way_exprs( //dir=expr + unique int id: @one_way_expr, + int sub_expr: @expr_or_none ref +); + +opaque_value_exprs( //dir=expr + unique int id: @opaque_value_expr +); + +open_existential_exprs( //dir=expr + unique int id: @open_existential_expr, + int sub_expr: @expr_or_none ref, + int existential: @expr_or_none ref, + int opaque_expr: @opaque_value_expr_or_none ref +); + +optional_evaluation_exprs( //dir=expr + unique int id: @optional_evaluation_expr, + int sub_expr: @expr_or_none ref +); + +other_initializer_ref_exprs( //dir=expr + unique int id: @other_initializer_ref_expr, + int initializer: @initializer_or_none ref +); + +overloaded_decl_ref_exprs( //dir=expr + unique int id: @overloaded_decl_ref_expr +); + +#keyset[id, index] +overloaded_decl_ref_expr_possible_declarations( //dir=expr + int id: @overloaded_decl_ref_expr ref, + int index: int ref, + int possible_declaration: @value_decl_or_none ref +); + +pack_element_exprs( //dir=expr + unique int id: @pack_element_expr, + int sub_expr: @expr_or_none ref +); + +pack_expansion_exprs( //dir=expr + unique int id: @pack_expansion_expr, + int pattern_expr: @expr_or_none ref +); + +property_wrapper_value_placeholder_exprs( //dir=expr + unique int id: @property_wrapper_value_placeholder_expr, + int placeholder: @opaque_value_expr_or_none ref +); + +#keyset[id] +property_wrapper_value_placeholder_expr_wrapped_values( //dir=expr + int id: @property_wrapper_value_placeholder_expr ref, + int wrapped_value: @expr_or_none ref +); + +rebind_self_in_initializer_exprs( //dir=expr + unique int id: @rebind_self_in_initializer_expr, + int sub_expr: @expr_or_none ref, + int self: @var_decl_or_none ref +); + +sequence_exprs( //dir=expr + unique int id: @sequence_expr +); + +#keyset[id, index] +sequence_expr_elements( //dir=expr + int id: @sequence_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +single_value_stmt_exprs( //dir=expr + unique int id: @single_value_stmt_expr, + int stmt: @stmt_or_none ref +); + +super_ref_exprs( //dir=expr + unique int id: @super_ref_expr, + int self: @var_decl_or_none ref +); + +tap_exprs( //dir=expr + unique int id: @tap_expr, + int body: @brace_stmt_or_none ref, + int var: @var_decl_or_none ref +); + +#keyset[id] +tap_expr_sub_exprs( //dir=expr + int id: @tap_expr ref, + int sub_expr: @expr_or_none ref +); + +tuple_element_exprs( //dir=expr + unique int id: @tuple_element_expr, + int sub_expr: @expr_or_none ref, + int index: int ref +); + +tuple_exprs( //dir=expr + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_elements( //dir=expr + int id: @tuple_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +type_exprs( //dir=expr + unique int id: @type_expr +); + +#keyset[id] +type_expr_type_reprs( //dir=expr + int id: @type_expr ref, + int type_repr: @type_repr_or_none ref +); + +type_value_exprs( //dir=expr + unique int id: @type_value_expr, + int type_repr: @type_repr_or_none ref +); + +unresolved_decl_ref_exprs( //dir=expr + unique int id: @unresolved_decl_ref_expr +); + +#keyset[id] +unresolved_decl_ref_expr_names( //dir=expr + int id: @unresolved_decl_ref_expr ref, + string name: string ref +); + +unresolved_dot_exprs( //dir=expr + unique int id: @unresolved_dot_expr, + int base: @expr_or_none ref, + string name: string ref +); + +unresolved_member_exprs( //dir=expr + unique int id: @unresolved_member_expr, + string name: string ref +); + +unresolved_pattern_exprs( //dir=expr + unique int id: @unresolved_pattern_expr, + int sub_pattern: @pattern_or_none ref +); + +unresolved_specialize_exprs( //dir=expr + unique int id: @unresolved_specialize_expr, + int sub_expr: @expr_or_none ref +); + +vararg_expansion_exprs( //dir=expr + unique int id: @vararg_expansion_expr, + int sub_expr: @expr_or_none ref +); + +abi_safe_conversion_exprs( //dir=expr + unique int id: @abi_safe_conversion_expr +); + +actor_isolation_erasure_exprs( //dir=expr + unique int id: @actor_isolation_erasure_expr +); + +any_hashable_erasure_exprs( //dir=expr + unique int id: @any_hashable_erasure_expr +); + +archetype_to_super_exprs( //dir=expr + unique int id: @archetype_to_super_expr +); + +array_exprs( //dir=expr + unique int id: @array_expr +); + +#keyset[id, index] +array_expr_elements( //dir=expr + int id: @array_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +array_to_pointer_exprs( //dir=expr + unique int id: @array_to_pointer_expr +); + +auto_closure_exprs( //dir=expr + unique int id: @auto_closure_expr +); + +await_exprs( //dir=expr + unique int id: @await_expr +); + +binary_exprs( //dir=expr + unique int id: @binary_expr +); + +borrow_exprs( //dir=expr + unique int id: @borrow_expr +); + +bridge_from_obj_c_exprs( //dir=expr + unique int id: @bridge_from_obj_c_expr +); + +bridge_to_obj_c_exprs( //dir=expr + unique int id: @bridge_to_obj_c_expr +); + +@builtin_literal_expr = + @boolean_literal_expr +| @magic_identifier_literal_expr +| @number_literal_expr +| @string_literal_expr +; + +call_exprs( //dir=expr + unique int id: @call_expr +); + +@checked_cast_expr = + @conditional_checked_cast_expr +| @forced_checked_cast_expr +| @is_expr +; + +class_metatype_to_object_exprs( //dir=expr + unique int id: @class_metatype_to_object_expr +); + +coerce_exprs( //dir=expr + unique int id: @coerce_expr +); + +collection_upcast_conversion_exprs( //dir=expr + unique int id: @collection_upcast_conversion_expr +); + +conditional_bridge_from_obj_c_exprs( //dir=expr + unique int id: @conditional_bridge_from_obj_c_expr +); + +covariant_function_conversion_exprs( //dir=expr + unique int id: @covariant_function_conversion_expr +); + +covariant_return_conversion_exprs( //dir=expr + unique int id: @covariant_return_conversion_expr +); + +derived_to_base_exprs( //dir=expr + unique int id: @derived_to_base_expr +); + +destructure_tuple_exprs( //dir=expr + unique int id: @destructure_tuple_expr +); + +dictionary_exprs( //dir=expr + unique int id: @dictionary_expr +); + +#keyset[id, index] +dictionary_expr_elements( //dir=expr + int id: @dictionary_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +differentiable_function_exprs( //dir=expr + unique int id: @differentiable_function_expr +); + +differentiable_function_extract_original_exprs( //dir=expr + unique int id: @differentiable_function_extract_original_expr +); + +dot_self_exprs( //dir=expr + unique int id: @dot_self_expr +); + +@dynamic_lookup_expr = + @dynamic_member_ref_expr +| @dynamic_subscript_expr +; + +erasure_exprs( //dir=expr + unique int id: @erasure_expr +); + +existential_metatype_to_object_exprs( //dir=expr + unique int id: @existential_metatype_to_object_expr +); + +explicit_closure_exprs( //dir=expr + unique int id: @explicit_closure_expr +); + +force_try_exprs( //dir=expr + unique int id: @force_try_expr +); + +foreign_object_conversion_exprs( //dir=expr + unique int id: @foreign_object_conversion_expr +); + +function_conversion_exprs( //dir=expr + unique int id: @function_conversion_expr +); + +in_out_to_pointer_exprs( //dir=expr + unique int id: @in_out_to_pointer_expr +); + +inject_into_optional_exprs( //dir=expr + unique int id: @inject_into_optional_expr +); + +interpolated_string_literal_exprs( //dir=expr + unique int id: @interpolated_string_literal_expr +); + +#keyset[id] +interpolated_string_literal_expr_interpolation_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int interpolation_expr: @opaque_value_expr_or_none ref +); + +#keyset[id] +interpolated_string_literal_expr_appending_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int appending_expr: @tap_expr_or_none ref +); + +linear_function_exprs( //dir=expr + unique int id: @linear_function_expr +); + +linear_function_extract_original_exprs( //dir=expr + unique int id: @linear_function_extract_original_expr +); + +linear_to_differentiable_function_exprs( //dir=expr + unique int id: @linear_to_differentiable_function_expr +); + +load_exprs( //dir=expr + unique int id: @load_expr +); + +member_ref_exprs( //dir=expr + unique int id: @member_ref_expr +); + +#keyset[id] +member_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_ordinary_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @member_ref_expr ref +); + +metatype_conversion_exprs( //dir=expr + unique int id: @metatype_conversion_expr +); + +nil_literal_exprs( //dir=expr + unique int id: @nil_literal_expr +); + +object_literal_exprs( //dir=expr + unique int id: @object_literal_expr, + int kind: int ref +); + +#keyset[id, index] +object_literal_expr_arguments( //dir=expr + int id: @object_literal_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +optional_try_exprs( //dir=expr + unique int id: @optional_try_expr +); + +paren_exprs( //dir=expr + unique int id: @paren_expr +); + +pointer_to_pointer_exprs( //dir=expr + unique int id: @pointer_to_pointer_expr +); + +postfix_unary_exprs( //dir=expr + unique int id: @postfix_unary_expr +); + +prefix_unary_exprs( //dir=expr + unique int id: @prefix_unary_expr +); + +protocol_metatype_to_object_exprs( //dir=expr + unique int id: @protocol_metatype_to_object_expr +); + +regex_literal_exprs( //dir=expr + unique int id: @regex_literal_expr, + string pattern: string ref, + int version: int ref +); + +@self_apply_expr = + @dot_syntax_call_expr +| @initializer_ref_call_expr +; + +#keyset[id] +self_apply_exprs( //dir=expr + int id: @self_apply_expr ref, + int base: @expr_or_none ref +); + +string_to_pointer_exprs( //dir=expr + unique int id: @string_to_pointer_expr +); + +subscript_exprs( //dir=expr + unique int id: @subscript_expr +); + +#keyset[id, index] +subscript_expr_arguments( //dir=expr + int id: @subscript_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +#keyset[id] +subscript_expr_has_direct_to_storage_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_ordinary_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_distributed_thunk_semantics( //dir=expr + int id: @subscript_expr ref +); + +try_exprs( //dir=expr + unique int id: @try_expr +); + +underlying_to_opaque_exprs( //dir=expr + unique int id: @underlying_to_opaque_expr +); + +unevaluated_instance_exprs( //dir=expr + unique int id: @unevaluated_instance_expr +); + +unreachable_exprs( //dir=expr + unique int id: @unreachable_expr +); + +unresolved_member_chain_result_exprs( //dir=expr + unique int id: @unresolved_member_chain_result_expr +); + +unresolved_type_conversion_exprs( //dir=expr + unique int id: @unresolved_type_conversion_expr +); + +unsafe_cast_exprs( //dir=expr + unique int id: @unsafe_cast_expr +); + +unsafe_exprs( //dir=expr + unique int id: @unsafe_expr +); + +boolean_literal_exprs( //dir=expr + unique int id: @boolean_literal_expr, + boolean value: boolean ref +); + +conditional_checked_cast_exprs( //dir=expr + unique int id: @conditional_checked_cast_expr +); + +dot_syntax_call_exprs( //dir=expr + unique int id: @dot_syntax_call_expr +); + +dynamic_member_ref_exprs( //dir=expr + unique int id: @dynamic_member_ref_expr +); + +dynamic_subscript_exprs( //dir=expr + unique int id: @dynamic_subscript_expr +); + +forced_checked_cast_exprs( //dir=expr + unique int id: @forced_checked_cast_expr +); + +initializer_ref_call_exprs( //dir=expr + unique int id: @initializer_ref_call_expr +); + +is_exprs( //dir=expr + unique int id: @is_expr +); + +magic_identifier_literal_exprs( //dir=expr + unique int id: @magic_identifier_literal_expr, + string kind: string ref +); + +@number_literal_expr = + @float_literal_expr +| @integer_literal_expr +; + +string_literal_exprs( //dir=expr + unique int id: @string_literal_expr, + string value: string ref +); + +float_literal_exprs( //dir=expr + unique int id: @float_literal_expr, + string string_value: string ref +); + +integer_literal_exprs( //dir=expr + unique int id: @integer_literal_expr, + string string_value: string ref +); + +@pattern = + @any_pattern +| @binding_pattern +| @bool_pattern +| @enum_element_pattern +| @expr_pattern +| @is_pattern +| @named_pattern +| @optional_some_pattern +| @paren_pattern +| @tuple_pattern +| @typed_pattern +; + +#keyset[id] +pattern_types( //dir=pattern + int id: @pattern ref, + int type_: @type_or_none ref +); + +any_patterns( //dir=pattern + unique int id: @any_pattern +); + +binding_patterns( //dir=pattern + unique int id: @binding_pattern, + int sub_pattern: @pattern_or_none ref +); + +bool_patterns( //dir=pattern + unique int id: @bool_pattern, + boolean value: boolean ref +); + +enum_element_patterns( //dir=pattern + unique int id: @enum_element_pattern, + int element: @enum_element_decl_or_none ref +); + +#keyset[id] +enum_element_pattern_sub_patterns( //dir=pattern + int id: @enum_element_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +expr_patterns( //dir=pattern + unique int id: @expr_pattern, + int sub_expr: @expr_or_none ref +); + +is_patterns( //dir=pattern + unique int id: @is_pattern +); + +#keyset[id] +is_pattern_cast_type_reprs( //dir=pattern + int id: @is_pattern ref, + int cast_type_repr: @type_repr_or_none ref +); + +#keyset[id] +is_pattern_sub_patterns( //dir=pattern + int id: @is_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +named_patterns( //dir=pattern + unique int id: @named_pattern, + int var_decl: @var_decl_or_none ref +); + +optional_some_patterns( //dir=pattern + unique int id: @optional_some_pattern, + int sub_pattern: @pattern_or_none ref +); + +paren_patterns( //dir=pattern + unique int id: @paren_pattern, + int sub_pattern: @pattern_or_none ref +); + +tuple_patterns( //dir=pattern + unique int id: @tuple_pattern +); + +#keyset[id, index] +tuple_pattern_elements( //dir=pattern + int id: @tuple_pattern ref, + int index: int ref, + int element: @pattern_or_none ref +); + +typed_patterns( //dir=pattern + unique int id: @typed_pattern, + int sub_pattern: @pattern_or_none ref +); + +#keyset[id] +typed_pattern_type_reprs( //dir=pattern + int id: @typed_pattern ref, + int type_repr: @type_repr_or_none ref +); + +case_label_items( //dir=stmt + unique int id: @case_label_item, + int pattern: @pattern_or_none ref +); + +#keyset[id] +case_label_item_guards( //dir=stmt + int id: @case_label_item ref, + int guard: @expr_or_none ref +); + +condition_elements( //dir=stmt + unique int id: @condition_element +); + +#keyset[id] +condition_element_booleans( //dir=stmt + int id: @condition_element ref, + int boolean_: @expr_or_none ref +); + +#keyset[id] +condition_element_patterns( //dir=stmt + int id: @condition_element ref, + int pattern: @pattern_or_none ref +); + +#keyset[id] +condition_element_initializers( //dir=stmt + int id: @condition_element ref, + int initializer: @expr_or_none ref +); + +#keyset[id] +condition_element_availabilities( //dir=stmt + int id: @condition_element ref, + int availability: @availability_info_or_none ref +); + +@stmt = + @brace_stmt +| @break_stmt +| @case_stmt +| @continue_stmt +| @defer_stmt +| @discard_stmt +| @fail_stmt +| @fallthrough_stmt +| @labeled_stmt +| @pound_assert_stmt +| @return_stmt +| @then_stmt +| @throw_stmt +| @yield_stmt +; + +stmt_conditions( //dir=stmt + unique int id: @stmt_condition +); + +#keyset[id, index] +stmt_condition_elements( //dir=stmt + int id: @stmt_condition ref, + int index: int ref, + int element: @condition_element_or_none ref +); + +brace_stmts( //dir=stmt + unique int id: @brace_stmt +); + +#keyset[id, index] +brace_stmt_elements( //dir=stmt + int id: @brace_stmt ref, + int index: int ref, + int element: @ast_node_or_none ref +); + +break_stmts( //dir=stmt + unique int id: @break_stmt +); + +#keyset[id] +break_stmt_target_names( //dir=stmt + int id: @break_stmt ref, + string target_name: string ref +); + +#keyset[id] +break_stmt_targets( //dir=stmt + int id: @break_stmt ref, + int target: @stmt_or_none ref +); + +case_stmts( //dir=stmt + unique int id: @case_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +case_stmt_labels( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int label: @case_label_item_or_none ref +); + +#keyset[id, index] +case_stmt_variables( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +continue_stmts( //dir=stmt + unique int id: @continue_stmt +); + +#keyset[id] +continue_stmt_target_names( //dir=stmt + int id: @continue_stmt ref, + string target_name: string ref +); + +#keyset[id] +continue_stmt_targets( //dir=stmt + int id: @continue_stmt ref, + int target: @stmt_or_none ref +); + +defer_stmts( //dir=stmt + unique int id: @defer_stmt, + int body: @brace_stmt_or_none ref +); + +discard_stmts( //dir=stmt + unique int id: @discard_stmt, + int sub_expr: @expr_or_none ref +); + +fail_stmts( //dir=stmt + unique int id: @fail_stmt +); + +fallthrough_stmts( //dir=stmt + unique int id: @fallthrough_stmt, + int fallthrough_source: @case_stmt_or_none ref, + int fallthrough_dest: @case_stmt_or_none ref +); + +@labeled_stmt = + @do_catch_stmt +| @do_stmt +| @for_each_stmt +| @labeled_conditional_stmt +| @repeat_while_stmt +| @switch_stmt +; + +#keyset[id] +labeled_stmt_labels( //dir=stmt + int id: @labeled_stmt ref, + string label: string ref +); + +pound_assert_stmts( //dir=stmt + unique int id: @pound_assert_stmt, + int condition: @expr_or_none ref, + string message: string ref +); + +return_stmts( //dir=stmt + unique int id: @return_stmt +); + +#keyset[id] +return_stmt_results( //dir=stmt + int id: @return_stmt ref, + int result: @expr_or_none ref +); + +then_stmts( //dir=stmt + unique int id: @then_stmt, + int result: @expr_or_none ref +); + +throw_stmts( //dir=stmt + unique int id: @throw_stmt, + int sub_expr: @expr_or_none ref +); + +yield_stmts( //dir=stmt + unique int id: @yield_stmt +); + +#keyset[id, index] +yield_stmt_results( //dir=stmt + int id: @yield_stmt ref, + int index: int ref, + int result: @expr_or_none ref +); + +do_catch_stmts( //dir=stmt + unique int id: @do_catch_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +do_catch_stmt_catches( //dir=stmt + int id: @do_catch_stmt ref, + int index: int ref, + int catch: @case_stmt_or_none ref +); + +do_stmts( //dir=stmt + unique int id: @do_stmt, + int body: @brace_stmt_or_none ref +); + +for_each_stmts( //dir=stmt + unique int id: @for_each_stmt, + int pattern: @pattern_or_none ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +for_each_stmt_variables( //dir=stmt + int id: @for_each_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +#keyset[id] +for_each_stmt_wheres( //dir=stmt + int id: @for_each_stmt ref, + int where: @expr_or_none ref +); + +#keyset[id] +for_each_stmt_iterator_vars( //dir=stmt + int id: @for_each_stmt ref, + int iteratorVar: @pattern_binding_decl_or_none ref +); + +#keyset[id] +for_each_stmt_next_calls( //dir=stmt + int id: @for_each_stmt ref, + int nextCall: @expr_or_none ref +); + +@labeled_conditional_stmt = + @guard_stmt +| @if_stmt +| @while_stmt +; + +#keyset[id] +labeled_conditional_stmts( //dir=stmt + int id: @labeled_conditional_stmt ref, + int condition: @stmt_condition_or_none ref +); + +repeat_while_stmts( //dir=stmt + unique int id: @repeat_while_stmt, + int condition: @expr_or_none ref, + int body: @stmt_or_none ref +); + +switch_stmts( //dir=stmt + unique int id: @switch_stmt, + int expr: @expr_or_none ref +); + +#keyset[id, index] +switch_stmt_cases( //dir=stmt + int id: @switch_stmt ref, + int index: int ref, + int case_: @case_stmt_or_none ref +); + +guard_stmts( //dir=stmt + unique int id: @guard_stmt, + int body: @brace_stmt_or_none ref +); + +if_stmts( //dir=stmt + unique int id: @if_stmt, + int then: @stmt_or_none ref +); + +#keyset[id] +if_stmt_elses( //dir=stmt + int id: @if_stmt ref, + int else: @stmt_or_none ref +); + +while_stmts( //dir=stmt + unique int id: @while_stmt, + int body: @stmt_or_none ref +); + +@type = + @any_function_type +| @any_generic_type +| @any_metatype_type +| @builtin_type +| @dependent_member_type +| @dynamic_self_type +| @error_type +| @existential_type +| @in_out_type +| @integer_type +| @l_value_type +| @module_type +| @pack_element_type +| @pack_expansion_type +| @pack_type +| @parameterized_protocol_type +| @protocol_composition_type +| @reference_storage_type +| @substitutable_type +| @sugar_type +| @tuple_type +| @unresolved_type +; + +#keyset[id] +types( //dir=type + int id: @type ref, + string name: string ref, + int canonical_type: @type_or_none ref +); + +type_reprs( //dir=type + unique int id: @type_repr, + int type_: @type_or_none ref +); + +@any_function_type = + @function_type +| @generic_function_type +; + +#keyset[id] +any_function_types( //dir=type + int id: @any_function_type ref, + int result: @type_or_none ref +); + +#keyset[id, index] +any_function_type_param_types( //dir=type + int id: @any_function_type ref, + int index: int ref, + int param_type: @type_or_none ref +); + +#keyset[id] +any_function_type_is_throwing( //dir=type + int id: @any_function_type ref +); + +#keyset[id] +any_function_type_is_async( //dir=type + int id: @any_function_type ref +); + +@any_generic_type = + @nominal_or_bound_generic_nominal_type +| @unbound_generic_type +; + +#keyset[id] +any_generic_types( //dir=type + int id: @any_generic_type ref, + int declaration: @generic_type_decl_or_none ref +); + +#keyset[id] +any_generic_type_parents( //dir=type + int id: @any_generic_type ref, + int parent: @type_or_none ref +); + +@any_metatype_type = + @existential_metatype_type +| @metatype_type +; + +@builtin_type = + @any_builtin_integer_type +| @builtin_bridge_object_type +| @builtin_default_actor_storage_type +| @builtin_executor_type +| @builtin_float_type +| @builtin_generic_type +| @builtin_job_type +| @builtin_native_object_type +| @builtin_raw_pointer_type +| @builtin_raw_unsafe_continuation_type +| @builtin_unsafe_value_buffer_type +| @builtin_vector_type +; + +dependent_member_types( //dir=type + unique int id: @dependent_member_type, + int base_type: @type_or_none ref, + int associated_type_decl: @associated_type_decl_or_none ref +); + +dynamic_self_types( //dir=type + unique int id: @dynamic_self_type, + int static_self_type: @type_or_none ref +); + +error_types( //dir=type + unique int id: @error_type +); + +existential_types( //dir=type + unique int id: @existential_type, + int constraint: @type_or_none ref +); + +in_out_types( //dir=type + unique int id: @in_out_type, + int object_type: @type_or_none ref +); + +integer_types( //dir=type + unique int id: @integer_type, + string value: string ref +); + +l_value_types( //dir=type + unique int id: @l_value_type, + int object_type: @type_or_none ref +); + +module_types( //dir=type + unique int id: @module_type, + int module: @module_decl_or_none ref +); + +pack_element_types( //dir=type + unique int id: @pack_element_type, + int pack_type: @type_or_none ref +); + +pack_expansion_types( //dir=type + unique int id: @pack_expansion_type, + int pattern_type: @type_or_none ref, + int count_type: @type_or_none ref +); + +pack_types( //dir=type + unique int id: @pack_type +); + +#keyset[id, index] +pack_type_elements( //dir=type + int id: @pack_type ref, + int index: int ref, + int element: @type_or_none ref +); + +parameterized_protocol_types( //dir=type + unique int id: @parameterized_protocol_type, + int base: @protocol_type_or_none ref +); + +#keyset[id, index] +parameterized_protocol_type_args( //dir=type + int id: @parameterized_protocol_type ref, + int index: int ref, + int arg: @type_or_none ref +); + +protocol_composition_types( //dir=type + unique int id: @protocol_composition_type +); + +#keyset[id, index] +protocol_composition_type_members( //dir=type + int id: @protocol_composition_type ref, + int index: int ref, + int member: @type_or_none ref +); + +@reference_storage_type = + @unmanaged_storage_type +| @unowned_storage_type +| @weak_storage_type +; + +#keyset[id] +reference_storage_types( //dir=type + int id: @reference_storage_type ref, + int referent_type: @type_or_none ref +); + +@substitutable_type = + @archetype_type +| @generic_type_param_type +; + +@sugar_type = + @paren_type +| @syntax_sugar_type +| @type_alias_type +; + +tuple_types( //dir=type + unique int id: @tuple_type +); + +#keyset[id, index] +tuple_type_types( //dir=type + int id: @tuple_type ref, + int index: int ref, + int type_: @type_or_none ref +); + +#keyset[id, index] +tuple_type_names( //dir=type + int id: @tuple_type ref, + int index: int ref, + string name: string ref +); + +unresolved_types( //dir=type + unique int id: @unresolved_type +); + +@any_builtin_integer_type = + @builtin_integer_literal_type +| @builtin_integer_type +; + +@archetype_type = + @local_archetype_type +| @opaque_type_archetype_type +| @pack_archetype_type +| @primary_archetype_type +; + +#keyset[id] +archetype_types( //dir=type + int id: @archetype_type ref, + int interface_type: @type_or_none ref +); + +#keyset[id] +archetype_type_superclasses( //dir=type + int id: @archetype_type ref, + int superclass: @type_or_none ref +); + +#keyset[id, index] +archetype_type_protocols( //dir=type + int id: @archetype_type ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +builtin_bridge_object_types( //dir=type + unique int id: @builtin_bridge_object_type +); + +builtin_default_actor_storage_types( //dir=type + unique int id: @builtin_default_actor_storage_type +); + +builtin_executor_types( //dir=type + unique int id: @builtin_executor_type +); + +builtin_float_types( //dir=type + unique int id: @builtin_float_type +); + +@builtin_generic_type = + @builtin_fixed_array_type +; + +builtin_job_types( //dir=type + unique int id: @builtin_job_type +); + +builtin_native_object_types( //dir=type + unique int id: @builtin_native_object_type +); + +builtin_raw_pointer_types( //dir=type + unique int id: @builtin_raw_pointer_type +); + +builtin_raw_unsafe_continuation_types( //dir=type + unique int id: @builtin_raw_unsafe_continuation_type +); + +builtin_unsafe_value_buffer_types( //dir=type + unique int id: @builtin_unsafe_value_buffer_type +); + +builtin_vector_types( //dir=type + unique int id: @builtin_vector_type +); + +existential_metatype_types( //dir=type + unique int id: @existential_metatype_type +); + +function_types( //dir=type + unique int id: @function_type +); + +generic_function_types( //dir=type + unique int id: @generic_function_type +); + +#keyset[id, index] +generic_function_type_generic_params( //dir=type + int id: @generic_function_type ref, + int index: int ref, + int generic_param: @generic_type_param_type_or_none ref +); + +generic_type_param_types( //dir=type + unique int id: @generic_type_param_type +); + +metatype_types( //dir=type + unique int id: @metatype_type +); + +@nominal_or_bound_generic_nominal_type = + @bound_generic_type +| @nominal_type +; + +paren_types( //dir=type + unique int id: @paren_type, + int type_: @type_or_none ref +); + +@syntax_sugar_type = + @dictionary_type +| @inline_array_type +| @unary_syntax_sugar_type +; + +type_alias_types( //dir=type + unique int id: @type_alias_type, + int decl: @type_alias_decl_or_none ref +); + +unbound_generic_types( //dir=type + unique int id: @unbound_generic_type +); + +unmanaged_storage_types( //dir=type + unique int id: @unmanaged_storage_type +); + +unowned_storage_types( //dir=type + unique int id: @unowned_storage_type +); + +weak_storage_types( //dir=type + unique int id: @weak_storage_type +); + +@bound_generic_type = + @bound_generic_class_type +| @bound_generic_enum_type +| @bound_generic_struct_type +; + +#keyset[id, index] +bound_generic_type_arg_types( //dir=type + int id: @bound_generic_type ref, + int index: int ref, + int arg_type: @type_or_none ref +); + +builtin_fixed_array_types( //dir=type + unique int id: @builtin_fixed_array_type, + int size: @type_or_none ref, + int element_type: @type_or_none ref +); + +builtin_integer_literal_types( //dir=type + unique int id: @builtin_integer_literal_type +); + +builtin_integer_types( //dir=type + unique int id: @builtin_integer_type +); + +#keyset[id] +builtin_integer_type_widths( //dir=type + int id: @builtin_integer_type ref, + int width: int ref +); + +dictionary_types( //dir=type + unique int id: @dictionary_type, + int key_type: @type_or_none ref, + int value_type: @type_or_none ref +); + +inline_array_types( //dir=type + unique int id: @inline_array_type, + int count_type: @type_or_none ref, + int element_type: @type_or_none ref +); + +@local_archetype_type = + @element_archetype_type +| @existential_archetype_type +; + +@nominal_type = + @class_type +| @enum_type +| @protocol_type +| @struct_type +; + +opaque_type_archetype_types( //dir=type + unique int id: @opaque_type_archetype_type, + int declaration: @opaque_type_decl_or_none ref +); + +pack_archetype_types( //dir=type + unique int id: @pack_archetype_type +); + +primary_archetype_types( //dir=type + unique int id: @primary_archetype_type +); + +@unary_syntax_sugar_type = + @array_slice_type +| @optional_type +| @variadic_sequence_type +; + +#keyset[id] +unary_syntax_sugar_types( //dir=type + int id: @unary_syntax_sugar_type ref, + int base_type: @type_or_none ref +); + +array_slice_types( //dir=type + unique int id: @array_slice_type +); + +bound_generic_class_types( //dir=type + unique int id: @bound_generic_class_type +); + +bound_generic_enum_types( //dir=type + unique int id: @bound_generic_enum_type +); + +bound_generic_struct_types( //dir=type + unique int id: @bound_generic_struct_type +); + +class_types( //dir=type + unique int id: @class_type +); + +element_archetype_types( //dir=type + unique int id: @element_archetype_type +); + +enum_types( //dir=type + unique int id: @enum_type +); + +existential_archetype_types( //dir=type + unique int id: @existential_archetype_type +); + +optional_types( //dir=type + unique int id: @optional_type +); + +protocol_types( //dir=type + unique int id: @protocol_type +); + +struct_types( //dir=type + unique int id: @struct_type +); + +variadic_sequence_types( //dir=type + unique int id: @variadic_sequence_type +); + +@accessor_or_none = + @accessor +| @unspecified_element +; + +@argument_or_none = + @argument +| @unspecified_element +; + +@associated_type_decl_or_none = + @associated_type_decl +| @unspecified_element +; + +@ast_node_or_none = + @ast_node +| @unspecified_element +; + +@availability_info_or_none = + @availability_info +| @unspecified_element +; + +@availability_spec_or_none = + @availability_spec +| @unspecified_element +; + +@brace_stmt_or_none = + @brace_stmt +| @unspecified_element +; + +@captured_decl_or_none = + @captured_decl +| @unspecified_element +; + +@case_label_item_or_none = + @case_label_item +| @unspecified_element +; + +@case_stmt_or_none = + @case_stmt +| @unspecified_element +; + +@closure_expr_or_none = + @closure_expr +| @unspecified_element +; + +@condition_element_or_none = + @condition_element +| @unspecified_element +; + +@decl_or_none = + @decl +| @unspecified_element +; + +@enum_element_decl_or_none = + @enum_element_decl +| @unspecified_element +; + +@expr_or_none = + @expr +| @unspecified_element +; + +@file_or_none = + @file +| @unspecified_element +; + +@function_or_none = + @function +| @unspecified_element +; + +@generic_type_decl_or_none = + @generic_type_decl +| @unspecified_element +; + +@generic_type_param_decl_or_none = + @generic_type_param_decl +| @unspecified_element +; + +@generic_type_param_type_or_none = + @generic_type_param_type +| @unspecified_element +; + +@initializer_or_none = + @initializer +| @unspecified_element +; + +@key_path_component_or_none = + @key_path_component +| @unspecified_element +; + +@location_or_none = + @location +| @unspecified_element +; + +@macro_role_or_none = + @macro_role +| @unspecified_element +; + +@module_decl_or_none = + @module_decl +| @unspecified_element +; + +@nominal_type_decl_or_none = + @nominal_type_decl +| @unspecified_element +; + +@opaque_type_decl_or_none = + @opaque_type_decl +| @unspecified_element +; + +@opaque_value_expr_or_none = + @opaque_value_expr +| @unspecified_element +; + +@param_decl_or_none = + @param_decl +| @unspecified_element +; + +@pattern_or_none = + @pattern +| @unspecified_element +; + +@pattern_binding_decl_or_none = + @pattern_binding_decl +| @unspecified_element +; + +@precedence_group_decl_or_none = + @precedence_group_decl +| @unspecified_element +; + +@protocol_decl_or_none = + @protocol_decl +| @unspecified_element +; + +@protocol_type_or_none = + @protocol_type +| @unspecified_element +; + +@stmt_or_none = + @stmt +| @unspecified_element +; + +@stmt_condition_or_none = + @stmt_condition +| @unspecified_element +; + +@string_literal_expr_or_none = + @string_literal_expr +| @unspecified_element +; + +@tap_expr_or_none = + @tap_expr +| @unspecified_element +; + +@type_or_none = + @type +| @unspecified_element +; + +@type_alias_decl_or_none = + @type_alias_decl +| @unspecified_element +; + +@type_repr_or_none = + @type_repr +| @unspecified_element +; + +@value_decl_or_none = + @unspecified_element +| @value_decl +; + +@var_decl_or_none = + @unspecified_element +| @var_decl +; diff --git a/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/upgrade.properties b/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/upgrade.properties new file mode 100644 index 000000000000..1dd157e51bec --- /dev/null +++ b/swift/downgrades/1bb163e31d206f30146738adcd93def10fdabefa/upgrade.properties @@ -0,0 +1,3 @@ +description: Expose declared interface types +compatibility: full +type_decls.rel: reorder type_decls.rel (@type_decl id, string name, @type_or_none declared_interface_type) id name diff --git a/swift/extractor/translators/DeclTranslator.cpp b/swift/extractor/translators/DeclTranslator.cpp index 4a89d571c41d..f7ea94e36648 100644 --- a/swift/extractor/translators/DeclTranslator.cpp +++ b/swift/extractor/translators/DeclTranslator.cpp @@ -299,6 +299,7 @@ void DeclTranslator::fillTypeDecl(const swift::TypeDecl& decl, codeql::TypeDecl& entry.inherited_types.push_back(dispatcher.fetchLabel(type)); } } + entry.declared_interface_type = dispatcher.fetchLabel(decl.getDeclaredInterfaceType()); fillValueDecl(decl, entry); } diff --git a/swift/ql/.generated.list b/swift/ql/.generated.list index ea1cb6f571b2..f178f2bc4b3f 100644 --- a/swift/ql/.generated.list +++ b/swift/ql/.generated.list @@ -741,7 +741,7 @@ lib/codeql/swift/generated/Location.qll 5e20316c3e480ddfe632b7e88e016c19f10a67df lib/codeql/swift/generated/MacroRole.qll facf907e75490d69cd401c491215e4719324d751f40ea46c86ccf24cf3663c1f 969d8d4b44e3f1a9c193a152a4d83a303e56d2dbb871fc920c47a33f699cf018 lib/codeql/swift/generated/ParentChild.qll 669d39245f2cb735cfd4bcebdb551ef8f334fef5297c5834a8b09ebfa655856e 59b283c8a30b6b364c853302ab919ea713e0289e7b793b08b46fc87178d14a6a lib/codeql/swift/generated/PureSynthConstructors.qll bc31a6c4d142fa3fbdcae69d5ba6f1cec00eb9ad92b46c8d7b91ebfa7ef6c1f4 bc31a6c4d142fa3fbdcae69d5ba6f1cec00eb9ad92b46c8d7b91ebfa7ef6c1f4 -lib/codeql/swift/generated/Raw.qll 0090c6509cb3fa5a67c996a2fc22e6338caef19701ca19463965b55b3c63096f 578329fa3abbabbadbff5e364e9c8d7ad76b41d4c17ad76e0660d41f48746659 +lib/codeql/swift/generated/Raw.qll a21e4f931d2bfcd9d964a7b930a81e7c169dc7ed7611f195087ea664745f90ea 3594391128bf4f3fb387ce386ab0f1ef070b7fa046425b6b4152f13b21d0a754 lib/codeql/swift/generated/Synth.qll e30b50d2645d9c36719d81f1be70712c7c6e89a3f5b4a5ae894411e045d05bff 9bd0c9c90532db97cde9553dde4089b7cf12c462c690d853fa40cb36ea112c21 lib/codeql/swift/generated/SynthConstructors.qll c40f01e1331bdbe238620a41d17409cefe34a6b23066708ef5d74f8631b54f48 c40f01e1331bdbe238620a41d17409cefe34a6b23066708ef5d74f8631b54f48 lib/codeql/swift/generated/UnknownFile.qll 247ddf2ebb49ce5ed4bf7bf91a969ddff37de6c78d43d8affccaf7eb586e06f2 452b29f0465ef45e978ef8b647b75e5a2a1e53f2a568fc003bc8f52f73b3fa4d @@ -787,7 +787,7 @@ lib/codeql/swift/generated/decl/StructDecl.qll baa06ebff9619339b461342828f952693 lib/codeql/swift/generated/decl/SubscriptDecl.qll 18d84b4ef27ecb732ac4350b8b01cb8c48db5182680f6893d392d5994919ca97 fcb5fe713326957a5bdf9bb9098f979c77778c02252dcb9c6d915a8d15eb65cf lib/codeql/swift/generated/decl/TopLevelCodeDecl.qll b327da6de5b1e40f5eea5893f4fcb01803cfdd78bd757ec93daadedb7169bf8d 2d316fff198707fae5a43e6b24d2a547ee9502fd278468846495d1b2f4ea62b1 lib/codeql/swift/generated/decl/TypeAliasDecl.qll 041c098c276bc7369049e9a11540e99b061d50977338cceca47488f82b21694e 06deed614cbe77031fdbf3f9591780e80b9f545adec8b7831a2b5329ee49bc5f -lib/codeql/swift/generated/decl/TypeDecl.qll 92f74709cce7e9f0f713598d3b20b730475c312957c518b8096206f8744419a2 305bda46c8bef48b7e30392698e724093ab2984ffed74cae3361f818cbf8c77a +lib/codeql/swift/generated/decl/TypeDecl.qll f8382cfd5800b1165b11fe927b35b2406826f0d1239114376656352039249b56 0247872a700e15c9243dd36e564e93c8b2aeec9cdd26ee675eaaf01525787111 lib/codeql/swift/generated/decl/UsingDecl.qll 3bb697961f5699ec9ed1b87511714eac4ee69f5d82e1fd8c6598f121e23a2f7b 4e72b98a84f796d3e0e556ae6b84bf7b7f08adc225dcdc00fd120461e287b472 lib/codeql/swift/generated/decl/ValueDecl.qll d3b9c241fd6cb1ce8274435c0242775c28c08f6a47caae01ad1ecd38897b2cd5 bc81291b1394b47972d7b75b6a767ed847f881932a7d9345d28d161a55b66bd1 lib/codeql/swift/generated/decl/VarDecl.qll 8978a73fa2d7a9f952b68a2638788eda857e62502311a33fa6de1dad49a6cb1c b8b6c8cf6773056c3a90494754b0a257dcae494c03d933f138ece7f531fb9158 @@ -1048,13 +1048,13 @@ test/extractor-tests/generated/Diagnostics/Diagnostics.ql c1f8be2c283e13c1a4dada test/extractor-tests/generated/File/File.ql a1385ef2080e04e8757f61b8e1d0129df9f955edf03fbb3b83cc9cb5498b4e95 0364d8c7f108d01b2641f996efedab7084956307e875e6bc078ea677d04267e0 test/extractor-tests/generated/KeyPathComponent/KeyPathComponent.ql 3fa617f8ed1b308d0c56f429ee8abe6d33ef60bf57d87f6dc89fdc8fe969a102 c2fa3153077dbe9e0fc608524dc03c82ff4ed460364d341ee6a817b0d75291c3 test/extractor-tests/generated/decl/Accessor/Accessor.ql 3d4301ec9ec6284b547f8cccf94c3077f0baf70778f458bc21bebc5de55c86e5 2f263e79ecd1ac8da56c17caff400fd3c40d83b6aa3d501830f1d2eeb48a57cd -test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.ql 55a78a6b96a17532178a39bd39aa4df23295f98019bb00de041ba15dfd4f84d9 51dbcd86203d5d031d748f77943a81c2c50de4ff559af20a4a1a682a19978d4f +test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.ql b7ad6073733906adbffae03a0a227beea7b5ddeb46e31c81fa9c98d6688abd5c b9b9b01e358d37a154bd3e4d7e59765c5c0ef36cc1a3110718ec9d35946d1ab6 test/extractor-tests/generated/decl/CapturedDecl/CapturedDecl.ql fd62be6c38d39f371c20e8c2f233e37a9da5aa234588920634f5db67e8beb3bd d51d35d4fd6a21cd596e064e0221d0c86e36312412a9bd4e64f431c123f3019a -test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql d5fa7f68307e2e3e7ad060a125bda148e4a28f6acbef08a1a975bbf9ba947641 46d1e4f801414f1c869601dc706e41393e5fcd399e51da593c1e58737f6ff427 +test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql 28e453c11069b0266d950da1f32361863d10d870de0f6d11512a0bb686af2ec1 2524ee149a48902346b81bfac6f50c832f83680aed4a850e8ea15504253865be test/extractor-tests/generated/decl/ConcreteVarDecl/ConcreteVarDecl.ql 936ac4aa52a55bd5bb4c75c117fffcc00208b9f502ff7ee05acbaad7d48a52fb d80346fe34d40910f5ecdb33d7266b6e4d1ec79f8d767c7da5e2ab780f201457 test/extractor-tests/generated/decl/Deinitializer/MISSING_SOURCE.txt 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d test/extractor-tests/generated/decl/EnumDecl/EnumCaseDecl.ql 7436bb7dfaa471f5a21ea2e3faba97d61bf53f930720999abdcc6745a65f0a1a 0241b2bb07c17136f6099185f65ea1266cd912296dfe481dce30eb9e3d1dd23f -test/extractor-tests/generated/decl/EnumDecl/EnumDecl.ql 47f20279f49388a4850df4f5ee61634e30beed58567eff891688c09942862ec2 8e11af1ceb07cab9738ffb25ac877ced712d1883a6514de5e8895cd1809a7bd8 +test/extractor-tests/generated/decl/EnumDecl/EnumDecl.ql 329c3f6255ef3ed5441110291d40c4e409ad520d92504d8778aadf21e1359a27 ebda0c8f81c6c8383c8ecb68be66a14cc351a9b5f21d44f9a815ff8e149d74b8 test/extractor-tests/generated/decl/EnumDecl/EnumElementDecl.ql 16caf5b014dea42a36b23eee6932c0818d94b1416e151ce46ba06a1fd2fb73ba cac704575b50613c8f8f297ce37c6d09ef943c94df4289643a4496103ac8388e test/extractor-tests/generated/decl/ExtensionDecl/ExtensionDecl.ql 04529ad447b7b0c529a54b0e0d009183c00cb1dcd7eb16378a7c4c7bc86bca4d 86379270a15fa014dc127607b720bb4d39b24b70d1c0f72ef8563c4144423ced test/extractor-tests/generated/decl/GenericTypeParamDecl/MISSING_SOURCE.txt 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d @@ -1064,9 +1064,9 @@ test/extractor-tests/generated/decl/InfixOperatorDecl/MISSING_SOURCE.txt 35fb32e test/extractor-tests/generated/decl/Initializer/MISSING_SOURCE.txt 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d test/extractor-tests/generated/decl/MacroDecl/MacroDecl.ql 61f092d4ed5972283b3eb0eeec81c8f299496dc548a98dca56a1aadaf8248d1d b9cd637cb0f6f34d8d0a4473f2c212a0534d49891d55593758bb03f8d225f32a test/extractor-tests/generated/decl/MacroDecl/MacroRole.ql 7ab0dc211663c1b09a54ccbee7d6be94ffa45f420b383d2e2f22b7ccfb8d7a48 92296b89fccf6aebe877e67796885bedd809ebb470f23f48f98b27c2922c4ba2 -test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql 63a41a3b393b29d19752379fe29f26fe649dad2927836e24832e07c503d092a6 927fa4056a5d7c65803f7baa1216e6bef9b3b6a223c4a2bb50f2a6a31580db6a +test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql 814ec8b4d9947ff8a49e1c4726015d8a0a35b22851dd50eb516f7c91994481e8 d01548746991d765b8c508c88cfe5ff2e39b499dd177abafcd94e226e0efa016 test/extractor-tests/generated/decl/NamedFunction/NamedFunction.ql c6be4c1314ffed2a8a91af2e08ea14ce721195ec993d18ebd4d7b90f4a60dac3 767fc36b64291ab7ecccd63bf74856983830267c992d1347236da314fca73d57 -test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.ql 85b041e1f791b40ff3d3c58c79e017cebf9ef535ea3d576984b7c093f25aa95b 9fcf314b02ac95fbd2c0e5fc95dc48c16522c74def57f5647dd5ad7e80f7c2c1 +test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.ql d764ddd50ee6faff51bee3a00349d660c32fd5548c7bda3a19866925688e96b0 e6534ba21371aef4d99a6206187d69cda77cd613606d7cb297192f21532fdcab test/extractor-tests/generated/decl/ParamDecl/ParamDecl.ql cc9d89731f7a5ecc2267923268e2d8046aa3f0eb9556c6a12e53b541347f45a4 6d06279172ff2c04be0f39293a2e9a9de5e41ff1efffd41a67d5a921e1afe9ea test/extractor-tests/generated/decl/PatternBindingDecl/MISSING_SOURCE.txt 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d test/extractor-tests/generated/decl/PostfixOperatorDecl/MISSING_SOURCE.txt 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d 35fb32ea5393152eb7a875b20b4e3e4b8c7a997a8959c32417140d57a16a052d diff --git a/swift/ql/lib/change-notes/2026-05-11-declared-interface-type.md b/swift/ql/lib/change-notes/2026-05-11-declared-interface-type.md new file mode 100644 index 000000000000..c62130ee099a --- /dev/null +++ b/swift/ql/lib/change-notes/2026-05-11-declared-interface-type.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* The `TypeDecl` class now defines a `getDeclaredInterfaceType` predicate, which yields the declared interface type of the type declaration. diff --git a/swift/ql/lib/change-notes/2026-05-14-sensitive-data.md b/swift/ql/lib/change-notes/2026-05-14-sensitive-data.md new file mode 100644 index 000000000000..70e96a3469c4 --- /dev/null +++ b/swift/ql/lib/change-notes/2026-05-14-sensitive-data.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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/change-notes/2026-05-19-swift-6.3.2.md b/swift/ql/lib/change-notes/2026-05-19-swift-6.3.2.md new file mode 100644 index 000000000000..530b7187e7a0 --- /dev/null +++ b/swift/ql/lib/change-notes/2026-05-19-swift-6.3.2.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Upgraded to allow analysis of Swift 6.3.2. diff --git a/swift/ql/lib/codeql/swift/generated/Raw.qll b/swift/ql/lib/codeql/swift/generated/Raw.qll index 3e0fa95a327a..71858b8854cd 100644 --- a/swift/ql/lib/codeql/swift/generated/Raw.qll +++ b/swift/ql/lib/codeql/swift/generated/Raw.qll @@ -1008,7 +1008,7 @@ module Raw { /** * Gets the name of this type declaration. */ - string getName() { type_decls(this, result) } + string getName() { type_decls(this, result, _) } /** * Gets the `index`th inherited type of this type declaration (0-based). @@ -1024,6 +1024,11 @@ module Raw { int getNumberOfInheritedTypes() { result = count(int i | type_decl_inherited_types(this, i, _)) } + + /** + * Gets the declared interface type of this type declaration. + */ + Type getDeclaredInterfaceType() { type_decls(this, _, result) } } /** diff --git a/swift/ql/lib/codeql/swift/generated/decl/TypeDecl.qll b/swift/ql/lib/codeql/swift/generated/decl/TypeDecl.qll index c1cb0c15f73c..f77355da6323 100644 --- a/swift/ql/lib/codeql/swift/generated/decl/TypeDecl.qll +++ b/swift/ql/lib/codeql/swift/generated/decl/TypeDecl.qll @@ -61,5 +61,28 @@ module Generated { final int getNumberOfInheritedTypes() { result = count(int i | exists(this.getInheritedType(i))) } + + /** + * Gets the declared interface type of this type declaration. + * + * This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the + * behavior of both the `Immediate` and non-`Immediate` versions. + */ + Type getImmediateDeclaredInterfaceType() { + result = + Synth::convertTypeFromRaw(Synth::convertTypeDeclToRaw(this) + .(Raw::TypeDecl) + .getDeclaredInterfaceType()) + } + + /** + * Gets the declared interface type of this type declaration. + */ + final Type getDeclaredInterfaceType() { + exists(Type immediate | + immediate = this.getImmediateDeclaredInterfaceType() and + result = immediate.resolve() + ) + } } } diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index ff088e209fa8..921af77ca70c 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.5.0 +version: 6.5.1-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/lib/swift.dbscheme b/swift/ql/lib/swift.dbscheme index 5738be6bb047..1bb163e31d20 100644 --- a/swift/ql/lib/swift.dbscheme +++ b/swift/ql/lib/swift.dbscheme @@ -530,7 +530,8 @@ prefix_operator_decls( //dir=decl #keyset[id] type_decls( //dir=decl int id: @type_decl ref, - string name: string ref + string name: string ref, + int declared_interface_type: @type_or_none ref ); #keyset[id, index] diff --git a/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/old.dbscheme b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/old.dbscheme new file mode 100644 index 000000000000..5738be6bb047 --- /dev/null +++ b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/old.dbscheme @@ -0,0 +1,2891 @@ +// generated by codegen/codegen.py, do not edit + +// from prefix.dbscheme +/** + * The source location of the snapshot. + */ +sourceLocationPrefix( + string prefix: string ref +); + + +// from schema.py + +@element = + @file +| @generic_context +| @locatable +| @location +| @type +; + +#keyset[id] +element_is_unknown( + int id: @element ref +); + +@file = + @db_file +; + +#keyset[id] +files( + int id: @file ref, + string name: string ref +); + +#keyset[id] +file_is_successfully_extracted( + int id: @file ref +); + +@locatable = + @argument +| @ast_node +| @comment +| @diagnostics +| @error_element +; + +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_or_none ref +); + +@location = + @db_location +; + +#keyset[id] +locations( + int id: @location ref, + int file: @file_or_none ref, + int start_line: int ref, + int start_column: int ref, + int end_line: int ref, + int end_column: int ref +); + +@ast_node = + @availability_info +| @availability_spec +| @callable +| @case_label_item +| @condition_element +| @decl +| @expr +| @key_path_component +| @macro_role +| @pattern +| @stmt +| @stmt_condition +| @type_repr +; + +comments( + unique int id: @comment, + string text: string ref +); + +db_files( + unique int id: @db_file +); + +db_locations( + unique int id: @db_location +); + +diagnostics( + unique int id: @diagnostics, + string text: string ref, + int kind: int ref +); + +@error_element = + @error_expr +| @error_type +| @overloaded_decl_ref_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_chain_result_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @unresolved_type +| @unresolved_type_conversion_expr +| @unspecified_element +; + +availability_infos( + unique int id: @availability_info +); + +#keyset[id] +availability_info_is_unavailable( + int id: @availability_info ref +); + +#keyset[id, index] +availability_info_specs( + int id: @availability_info ref, + int index: int ref, + int spec: @availability_spec_or_none ref +); + +availability_specs( + unique int id: @availability_spec +); + +#keyset[id] +availability_spec_platforms( + int id: @availability_spec ref, + string platform: string ref +); + +#keyset[id] +availability_spec_versions( + int id: @availability_spec ref, + string version: string ref +); + +#keyset[id] +availability_spec_is_wildcard( + int id: @availability_spec ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_names( + int id: @callable ref, + string name: string ref +); + +#keyset[id] +callable_self_params( + int id: @callable ref, + int self_param: @param_decl_or_none ref +); + +#keyset[id, index] +callable_params( + int id: @callable ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +#keyset[id] +callable_bodies( + int id: @callable ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +callable_captures( + int id: @callable ref, + int index: int ref, + int capture: @captured_decl_or_none ref +); + +key_path_components( + unique int id: @key_path_component, + int kind: int ref, + int component_type: @type_or_none ref +); + +#keyset[id, index] +key_path_component_subscript_arguments( + int id: @key_path_component ref, + int index: int ref, + int subscript_argument: @argument_or_none ref +); + +#keyset[id] +key_path_component_tuple_indices( + int id: @key_path_component ref, + int tuple_index: int ref +); + +#keyset[id] +key_path_component_decl_refs( + int id: @key_path_component ref, + int decl_ref: @value_decl_or_none ref +); + +macro_roles( + unique int id: @macro_role, + int kind: int ref, + int macro_syntax: int ref +); + +#keyset[id, index] +macro_role_conformances( + int id: @macro_role ref, + int index: int ref, + int conformance: @expr_or_none ref +); + +#keyset[id, index] +macro_role_names( + int id: @macro_role ref, + int index: int ref, + string name: string ref +); + +unspecified_elements( + unique int id: @unspecified_element, + string property: string ref, + string error: string ref +); + +#keyset[id] +unspecified_element_parents( + int id: @unspecified_element ref, + int parent: @element ref +); + +#keyset[id] +unspecified_element_indices( + int id: @unspecified_element ref, + int index: int ref +); + +#keyset[id, index] +unspecified_element_children( + int id: @unspecified_element ref, + int index: int ref, + int child: @ast_node_or_none ref +); + +@decl = + @captured_decl +| @enum_case_decl +| @extension_decl +| @if_config_decl +| @import_decl +| @missing_member_decl +| @operator_decl +| @pattern_binding_decl +| @pound_diagnostic_decl +| @precedence_group_decl +| @top_level_code_decl +| @using_decl +| @value_decl +; + +#keyset[id] +decls( //dir=decl + int id: @decl ref, + int module: @module_decl_or_none ref +); + +#keyset[id, index] +decl_members( //dir=decl + int id: @decl ref, + int index: int ref, + int member: @decl_or_none ref +); + +@generic_context = + @extension_decl +| @function +| @generic_type_decl +| @macro_decl +| @subscript_decl +; + +#keyset[id, index] +generic_context_generic_type_params( //dir=decl + int id: @generic_context ref, + int index: int ref, + int generic_type_param: @generic_type_param_decl_or_none ref +); + +captured_decls( //dir=decl + unique int id: @captured_decl, + int decl: @value_decl_or_none ref +); + +#keyset[id] +captured_decl_is_direct( //dir=decl + int id: @captured_decl ref +); + +#keyset[id] +captured_decl_is_escaping( //dir=decl + int id: @captured_decl ref +); + +enum_case_decls( //dir=decl + unique int id: @enum_case_decl +); + +#keyset[id, index] +enum_case_decl_elements( //dir=decl + int id: @enum_case_decl ref, + int index: int ref, + int element: @enum_element_decl_or_none ref +); + +extension_decls( //dir=decl + unique int id: @extension_decl, + int extended_type_decl: @nominal_type_decl_or_none ref +); + +#keyset[id, index] +extension_decl_protocols( //dir=decl + int id: @extension_decl ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +if_config_decls( //dir=decl + unique int id: @if_config_decl +); + +#keyset[id, index] +if_config_decl_active_elements( //dir=decl + int id: @if_config_decl ref, + int index: int ref, + int active_element: @ast_node_or_none ref +); + +import_decls( //dir=decl + unique int id: @import_decl +); + +#keyset[id] +import_decl_is_exported( //dir=decl + int id: @import_decl ref +); + +#keyset[id] +import_decl_imported_modules( //dir=decl + int id: @import_decl ref, + int imported_module: @module_decl_or_none ref +); + +#keyset[id, index] +import_decl_declarations( //dir=decl + int id: @import_decl ref, + int index: int ref, + int declaration: @value_decl_or_none ref +); + +missing_member_decls( //dir=decl + unique int id: @missing_member_decl, + string name: string ref +); + +@operator_decl = + @infix_operator_decl +| @postfix_operator_decl +| @prefix_operator_decl +; + +#keyset[id] +operator_decls( //dir=decl + int id: @operator_decl ref, + string name: string ref +); + +pattern_binding_decls( //dir=decl + unique int id: @pattern_binding_decl +); + +#keyset[id, index] +pattern_binding_decl_inits( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int init: @expr_or_none ref +); + +#keyset[id, index] +pattern_binding_decl_patterns( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int pattern: @pattern_or_none ref +); + +pound_diagnostic_decls( //dir=decl + unique int id: @pound_diagnostic_decl, + int kind: int ref, + int message: @string_literal_expr_or_none ref +); + +precedence_group_decls( //dir=decl + unique int id: @precedence_group_decl +); + +top_level_code_decls( //dir=decl + unique int id: @top_level_code_decl, + int body: @brace_stmt_or_none ref +); + +using_decls( //dir=decl + unique int id: @using_decl +); + +#keyset[id] +using_decl_is_main_actor( //dir=decl + int id: @using_decl ref +); + +#keyset[id] +using_decl_is_nonisolated( //dir=decl + int id: @using_decl ref +); + +@value_decl = + @abstract_storage_decl +| @enum_element_decl +| @function +| @macro_decl +| @type_decl +; + +#keyset[id] +value_decls( //dir=decl + int id: @value_decl ref, + int interface_type: @type_or_none ref +); + +@abstract_storage_decl = + @subscript_decl +| @var_decl +; + +#keyset[id, index] +abstract_storage_decl_accessors( //dir=decl + int id: @abstract_storage_decl ref, + int index: int ref, + int accessor: @accessor_or_none ref +); + +enum_element_decls( //dir=decl + unique int id: @enum_element_decl, + string name: string ref +); + +#keyset[id, index] +enum_element_decl_params( //dir=decl + int id: @enum_element_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@function = + @accessor_or_named_function +| @deinitializer +| @initializer +; + +infix_operator_decls( //dir=decl + unique int id: @infix_operator_decl +); + +#keyset[id] +infix_operator_decl_precedence_groups( //dir=decl + int id: @infix_operator_decl ref, + int precedence_group: @precedence_group_decl_or_none ref +); + +macro_decls( //dir=decl + unique int id: @macro_decl, + string name: string ref +); + +#keyset[id, index] +macro_decl_parameters( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int parameter: @param_decl_or_none ref +); + +#keyset[id, index] +macro_decl_roles( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int role: @macro_role_or_none ref +); + +postfix_operator_decls( //dir=decl + unique int id: @postfix_operator_decl +); + +prefix_operator_decls( //dir=decl + unique int id: @prefix_operator_decl +); + +@type_decl = + @abstract_type_param_decl +| @generic_type_decl +| @module_decl +; + +#keyset[id] +type_decls( //dir=decl + int id: @type_decl ref, + string name: string ref +); + +#keyset[id, index] +type_decl_inherited_types( //dir=decl + int id: @type_decl ref, + int index: int ref, + int inherited_type: @type_or_none ref +); + +@abstract_type_param_decl = + @associated_type_decl +| @generic_type_param_decl +; + +@accessor_or_named_function = + @accessor +| @named_function +; + +deinitializers( //dir=decl + unique int id: @deinitializer +); + +@generic_type_decl = + @nominal_type_decl +| @opaque_type_decl +| @type_alias_decl +; + +initializers( //dir=decl + unique int id: @initializer +); + +module_decls( //dir=decl + unique int id: @module_decl +); + +#keyset[id] +module_decl_is_builtin_module( //dir=decl + int id: @module_decl ref +); + +#keyset[id] +module_decl_is_system_module( //dir=decl + int id: @module_decl ref +); + +module_decl_imported_modules( //dir=decl + int id: @module_decl ref, + int imported_module: @module_decl_or_none ref +); + +module_decl_exported_modules( //dir=decl + int id: @module_decl ref, + int exported_module: @module_decl_or_none ref +); + +subscript_decls( //dir=decl + unique int id: @subscript_decl, + int element_type: @type_or_none ref +); + +#keyset[id, index] +subscript_decl_params( //dir=decl + int id: @subscript_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@var_decl = + @concrete_var_decl +| @param_decl +; + +#keyset[id] +var_decls( //dir=decl + int id: @var_decl ref, + string name: string ref, + int type_: @type_or_none ref +); + +#keyset[id] +var_decl_attached_property_wrapper_types( //dir=decl + int id: @var_decl ref, + int attached_property_wrapper_type: @type_or_none ref +); + +#keyset[id] +var_decl_parent_patterns( //dir=decl + int id: @var_decl ref, + int parent_pattern: @pattern_or_none ref +); + +#keyset[id] +var_decl_parent_initializers( //dir=decl + int id: @var_decl ref, + int parent_initializer: @expr_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var: @var_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var: @var_decl_or_none ref +); + +accessors( //dir=decl + unique int id: @accessor +); + +#keyset[id] +accessor_is_getter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_setter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_will_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_did_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_mutable_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_distributed_get( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_init( //dir=decl + int id: @accessor ref +); + +associated_type_decls( //dir=decl + unique int id: @associated_type_decl +); + +concrete_var_decls( //dir=decl + unique int id: @concrete_var_decl, + int introducer_int: int ref +); + +generic_type_param_decls( //dir=decl + unique int id: @generic_type_param_decl +); + +named_functions( //dir=decl + unique int id: @named_function +); + +@nominal_type_decl = + @class_decl +| @enum_decl +| @protocol_decl +| @struct_decl +; + +#keyset[id] +nominal_type_decls( //dir=decl + int id: @nominal_type_decl ref, + int type_: @type_or_none ref +); + +opaque_type_decls( //dir=decl + unique int id: @opaque_type_decl, + int naming_declaration: @value_decl_or_none ref +); + +#keyset[id, index] +opaque_type_decl_opaque_generic_params( //dir=decl + int id: @opaque_type_decl ref, + int index: int ref, + int opaque_generic_param: @generic_type_param_type_or_none ref +); + +param_decls( //dir=decl + unique int id: @param_decl +); + +#keyset[id] +param_decl_is_inout( //dir=decl + int id: @param_decl ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_var_bindings( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_vars( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var: @var_decl_or_none ref +); + +type_alias_decls( //dir=decl + unique int id: @type_alias_decl, + int aliased_type: @type_or_none ref +); + +class_decls( //dir=decl + unique int id: @class_decl +); + +enum_decls( //dir=decl + unique int id: @enum_decl +); + +protocol_decls( //dir=decl + unique int id: @protocol_decl +); + +struct_decls( //dir=decl + unique int id: @struct_decl +); + +arguments( //dir=expr + unique int id: @argument, + string label: string ref, + int expr: @expr_or_none ref +); + +@expr = + @any_try_expr +| @applied_property_wrapper_expr +| @apply_expr +| @assign_expr +| @bind_optional_expr +| @capture_list_expr +| @closure_expr +| @collection_expr +| @consume_expr +| @copy_expr +| @current_context_isolation_expr +| @decl_ref_expr +| @default_argument_expr +| @discard_assignment_expr +| @dot_syntax_base_ignored_expr +| @dynamic_type_expr +| @enum_is_case_expr +| @error_expr +| @explicit_cast_expr +| @extract_function_isolation_expr +| @force_value_expr +| @identity_expr +| @if_expr +| @implicit_conversion_expr +| @in_out_expr +| @key_path_application_expr +| @key_path_dot_expr +| @key_path_expr +| @lazy_initialization_expr +| @literal_expr +| @lookup_expr +| @make_temporarily_escapable_expr +| @materialize_pack_expr +| @obj_c_selector_expr +| @one_way_expr +| @opaque_value_expr +| @open_existential_expr +| @optional_evaluation_expr +| @other_initializer_ref_expr +| @overloaded_decl_ref_expr +| @pack_element_expr +| @pack_expansion_expr +| @property_wrapper_value_placeholder_expr +| @rebind_self_in_initializer_expr +| @sequence_expr +| @single_value_stmt_expr +| @super_ref_expr +| @tap_expr +| @tuple_element_expr +| @tuple_expr +| @type_expr +| @type_value_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @vararg_expansion_expr +; + +#keyset[id] +expr_types( //dir=expr + int id: @expr ref, + int type_: @type_or_none ref +); + +@any_try_expr = + @force_try_expr +| @optional_try_expr +| @try_expr +; + +#keyset[id] +any_try_exprs( //dir=expr + int id: @any_try_expr ref, + int sub_expr: @expr_or_none ref +); + +applied_property_wrapper_exprs( //dir=expr + unique int id: @applied_property_wrapper_expr, + int kind: int ref, + int value: @expr_or_none ref, + int param: @param_decl_or_none ref +); + +@apply_expr = + @binary_expr +| @call_expr +| @postfix_unary_expr +| @prefix_unary_expr +| @self_apply_expr +; + +#keyset[id] +apply_exprs( //dir=expr + int id: @apply_expr ref, + int function: @expr_or_none ref +); + +#keyset[id, index] +apply_expr_arguments( //dir=expr + int id: @apply_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +assign_exprs( //dir=expr + unique int id: @assign_expr, + int dest: @expr_or_none ref, + int source: @expr_or_none ref +); + +bind_optional_exprs( //dir=expr + unique int id: @bind_optional_expr, + int sub_expr: @expr_or_none ref +); + +capture_list_exprs( //dir=expr + unique int id: @capture_list_expr, + int closure_body: @closure_expr_or_none ref +); + +#keyset[id, index] +capture_list_expr_binding_decls( //dir=expr + int id: @capture_list_expr ref, + int index: int ref, + int binding_decl: @pattern_binding_decl_or_none ref +); + +@closure_expr = + @auto_closure_expr +| @explicit_closure_expr +; + +@collection_expr = + @array_expr +| @dictionary_expr +; + +consume_exprs( //dir=expr + unique int id: @consume_expr, + int sub_expr: @expr_or_none ref +); + +copy_exprs( //dir=expr + unique int id: @copy_expr, + int sub_expr: @expr_or_none ref +); + +current_context_isolation_exprs( //dir=expr + unique int id: @current_context_isolation_expr, + int actor: @expr_or_none ref +); + +decl_ref_exprs( //dir=expr + unique int id: @decl_ref_expr, + int decl: @decl_or_none ref +); + +#keyset[id, index] +decl_ref_expr_replacement_types( //dir=expr + int id: @decl_ref_expr ref, + int index: int ref, + int replacement_type: @type_or_none ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_ordinary_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +default_argument_exprs( //dir=expr + unique int id: @default_argument_expr, + int param_decl: @param_decl_or_none ref, + int param_index: int ref +); + +#keyset[id] +default_argument_expr_caller_side_defaults( //dir=expr + int id: @default_argument_expr ref, + int caller_side_default: @expr_or_none ref +); + +discard_assignment_exprs( //dir=expr + unique int id: @discard_assignment_expr +); + +dot_syntax_base_ignored_exprs( //dir=expr + unique int id: @dot_syntax_base_ignored_expr, + int qualifier: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +dynamic_type_exprs( //dir=expr + unique int id: @dynamic_type_expr, + int base: @expr_or_none ref +); + +enum_is_case_exprs( //dir=expr + unique int id: @enum_is_case_expr, + int sub_expr: @expr_or_none ref, + int element: @enum_element_decl_or_none ref +); + +error_exprs( //dir=expr + unique int id: @error_expr +); + +@explicit_cast_expr = + @checked_cast_expr +| @coerce_expr +; + +#keyset[id] +explicit_cast_exprs( //dir=expr + int id: @explicit_cast_expr ref, + int sub_expr: @expr_or_none ref +); + +extract_function_isolation_exprs( //dir=expr + unique int id: @extract_function_isolation_expr, + int function_expr: @expr_or_none ref +); + +force_value_exprs( //dir=expr + unique int id: @force_value_expr, + int sub_expr: @expr_or_none ref +); + +@identity_expr = + @await_expr +| @borrow_expr +| @dot_self_expr +| @paren_expr +| @unresolved_member_chain_result_expr +| @unsafe_expr +; + +#keyset[id] +identity_exprs( //dir=expr + int id: @identity_expr ref, + int sub_expr: @expr_or_none ref +); + +if_exprs( //dir=expr + unique int id: @if_expr, + int condition: @expr_or_none ref, + int then_expr: @expr_or_none ref, + int else_expr: @expr_or_none ref +); + +@implicit_conversion_expr = + @abi_safe_conversion_expr +| @actor_isolation_erasure_expr +| @any_hashable_erasure_expr +| @archetype_to_super_expr +| @array_to_pointer_expr +| @bridge_from_obj_c_expr +| @bridge_to_obj_c_expr +| @class_metatype_to_object_expr +| @collection_upcast_conversion_expr +| @conditional_bridge_from_obj_c_expr +| @covariant_function_conversion_expr +| @covariant_return_conversion_expr +| @derived_to_base_expr +| @destructure_tuple_expr +| @differentiable_function_expr +| @differentiable_function_extract_original_expr +| @erasure_expr +| @existential_metatype_to_object_expr +| @foreign_object_conversion_expr +| @function_conversion_expr +| @in_out_to_pointer_expr +| @inject_into_optional_expr +| @linear_function_expr +| @linear_function_extract_original_expr +| @linear_to_differentiable_function_expr +| @load_expr +| @metatype_conversion_expr +| @pointer_to_pointer_expr +| @protocol_metatype_to_object_expr +| @string_to_pointer_expr +| @underlying_to_opaque_expr +| @unevaluated_instance_expr +| @unreachable_expr +| @unresolved_type_conversion_expr +| @unsafe_cast_expr +; + +#keyset[id] +implicit_conversion_exprs( //dir=expr + int id: @implicit_conversion_expr ref, + int sub_expr: @expr_or_none ref +); + +in_out_exprs( //dir=expr + unique int id: @in_out_expr, + int sub_expr: @expr_or_none ref +); + +key_path_application_exprs( //dir=expr + unique int id: @key_path_application_expr, + int base: @expr_or_none ref, + int key_path: @expr_or_none ref +); + +key_path_dot_exprs( //dir=expr + unique int id: @key_path_dot_expr +); + +key_path_exprs( //dir=expr + unique int id: @key_path_expr +); + +#keyset[id] +key_path_expr_roots( //dir=expr + int id: @key_path_expr ref, + int root: @type_repr_or_none ref +); + +#keyset[id, index] +key_path_expr_components( //dir=expr + int id: @key_path_expr ref, + int index: int ref, + int component: @key_path_component_or_none ref +); + +lazy_initialization_exprs( //dir=expr + unique int id: @lazy_initialization_expr, + int sub_expr: @expr_or_none ref +); + +@literal_expr = + @builtin_literal_expr +| @interpolated_string_literal_expr +| @nil_literal_expr +| @object_literal_expr +| @regex_literal_expr +; + +@lookup_expr = + @dynamic_lookup_expr +| @member_ref_expr +| @subscript_expr +; + +#keyset[id] +lookup_exprs( //dir=expr + int id: @lookup_expr ref, + int base: @expr_or_none ref +); + +#keyset[id] +lookup_expr_members( //dir=expr + int id: @lookup_expr ref, + int member: @decl_or_none ref +); + +make_temporarily_escapable_exprs( //dir=expr + unique int id: @make_temporarily_escapable_expr, + int escaping_closure: @opaque_value_expr_or_none ref, + int nonescaping_closure: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +materialize_pack_exprs( //dir=expr + unique int id: @materialize_pack_expr, + int sub_expr: @expr_or_none ref +); + +obj_c_selector_exprs( //dir=expr + unique int id: @obj_c_selector_expr, + int sub_expr: @expr_or_none ref, + int method: @function_or_none ref +); + +one_way_exprs( //dir=expr + unique int id: @one_way_expr, + int sub_expr: @expr_or_none ref +); + +opaque_value_exprs( //dir=expr + unique int id: @opaque_value_expr +); + +open_existential_exprs( //dir=expr + unique int id: @open_existential_expr, + int sub_expr: @expr_or_none ref, + int existential: @expr_or_none ref, + int opaque_expr: @opaque_value_expr_or_none ref +); + +optional_evaluation_exprs( //dir=expr + unique int id: @optional_evaluation_expr, + int sub_expr: @expr_or_none ref +); + +other_initializer_ref_exprs( //dir=expr + unique int id: @other_initializer_ref_expr, + int initializer: @initializer_or_none ref +); + +overloaded_decl_ref_exprs( //dir=expr + unique int id: @overloaded_decl_ref_expr +); + +#keyset[id, index] +overloaded_decl_ref_expr_possible_declarations( //dir=expr + int id: @overloaded_decl_ref_expr ref, + int index: int ref, + int possible_declaration: @value_decl_or_none ref +); + +pack_element_exprs( //dir=expr + unique int id: @pack_element_expr, + int sub_expr: @expr_or_none ref +); + +pack_expansion_exprs( //dir=expr + unique int id: @pack_expansion_expr, + int pattern_expr: @expr_or_none ref +); + +property_wrapper_value_placeholder_exprs( //dir=expr + unique int id: @property_wrapper_value_placeholder_expr, + int placeholder: @opaque_value_expr_or_none ref +); + +#keyset[id] +property_wrapper_value_placeholder_expr_wrapped_values( //dir=expr + int id: @property_wrapper_value_placeholder_expr ref, + int wrapped_value: @expr_or_none ref +); + +rebind_self_in_initializer_exprs( //dir=expr + unique int id: @rebind_self_in_initializer_expr, + int sub_expr: @expr_or_none ref, + int self: @var_decl_or_none ref +); + +sequence_exprs( //dir=expr + unique int id: @sequence_expr +); + +#keyset[id, index] +sequence_expr_elements( //dir=expr + int id: @sequence_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +single_value_stmt_exprs( //dir=expr + unique int id: @single_value_stmt_expr, + int stmt: @stmt_or_none ref +); + +super_ref_exprs( //dir=expr + unique int id: @super_ref_expr, + int self: @var_decl_or_none ref +); + +tap_exprs( //dir=expr + unique int id: @tap_expr, + int body: @brace_stmt_or_none ref, + int var: @var_decl_or_none ref +); + +#keyset[id] +tap_expr_sub_exprs( //dir=expr + int id: @tap_expr ref, + int sub_expr: @expr_or_none ref +); + +tuple_element_exprs( //dir=expr + unique int id: @tuple_element_expr, + int sub_expr: @expr_or_none ref, + int index: int ref +); + +tuple_exprs( //dir=expr + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_elements( //dir=expr + int id: @tuple_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +type_exprs( //dir=expr + unique int id: @type_expr +); + +#keyset[id] +type_expr_type_reprs( //dir=expr + int id: @type_expr ref, + int type_repr: @type_repr_or_none ref +); + +type_value_exprs( //dir=expr + unique int id: @type_value_expr, + int type_repr: @type_repr_or_none ref +); + +unresolved_decl_ref_exprs( //dir=expr + unique int id: @unresolved_decl_ref_expr +); + +#keyset[id] +unresolved_decl_ref_expr_names( //dir=expr + int id: @unresolved_decl_ref_expr ref, + string name: string ref +); + +unresolved_dot_exprs( //dir=expr + unique int id: @unresolved_dot_expr, + int base: @expr_or_none ref, + string name: string ref +); + +unresolved_member_exprs( //dir=expr + unique int id: @unresolved_member_expr, + string name: string ref +); + +unresolved_pattern_exprs( //dir=expr + unique int id: @unresolved_pattern_expr, + int sub_pattern: @pattern_or_none ref +); + +unresolved_specialize_exprs( //dir=expr + unique int id: @unresolved_specialize_expr, + int sub_expr: @expr_or_none ref +); + +vararg_expansion_exprs( //dir=expr + unique int id: @vararg_expansion_expr, + int sub_expr: @expr_or_none ref +); + +abi_safe_conversion_exprs( //dir=expr + unique int id: @abi_safe_conversion_expr +); + +actor_isolation_erasure_exprs( //dir=expr + unique int id: @actor_isolation_erasure_expr +); + +any_hashable_erasure_exprs( //dir=expr + unique int id: @any_hashable_erasure_expr +); + +archetype_to_super_exprs( //dir=expr + unique int id: @archetype_to_super_expr +); + +array_exprs( //dir=expr + unique int id: @array_expr +); + +#keyset[id, index] +array_expr_elements( //dir=expr + int id: @array_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +array_to_pointer_exprs( //dir=expr + unique int id: @array_to_pointer_expr +); + +auto_closure_exprs( //dir=expr + unique int id: @auto_closure_expr +); + +await_exprs( //dir=expr + unique int id: @await_expr +); + +binary_exprs( //dir=expr + unique int id: @binary_expr +); + +borrow_exprs( //dir=expr + unique int id: @borrow_expr +); + +bridge_from_obj_c_exprs( //dir=expr + unique int id: @bridge_from_obj_c_expr +); + +bridge_to_obj_c_exprs( //dir=expr + unique int id: @bridge_to_obj_c_expr +); + +@builtin_literal_expr = + @boolean_literal_expr +| @magic_identifier_literal_expr +| @number_literal_expr +| @string_literal_expr +; + +call_exprs( //dir=expr + unique int id: @call_expr +); + +@checked_cast_expr = + @conditional_checked_cast_expr +| @forced_checked_cast_expr +| @is_expr +; + +class_metatype_to_object_exprs( //dir=expr + unique int id: @class_metatype_to_object_expr +); + +coerce_exprs( //dir=expr + unique int id: @coerce_expr +); + +collection_upcast_conversion_exprs( //dir=expr + unique int id: @collection_upcast_conversion_expr +); + +conditional_bridge_from_obj_c_exprs( //dir=expr + unique int id: @conditional_bridge_from_obj_c_expr +); + +covariant_function_conversion_exprs( //dir=expr + unique int id: @covariant_function_conversion_expr +); + +covariant_return_conversion_exprs( //dir=expr + unique int id: @covariant_return_conversion_expr +); + +derived_to_base_exprs( //dir=expr + unique int id: @derived_to_base_expr +); + +destructure_tuple_exprs( //dir=expr + unique int id: @destructure_tuple_expr +); + +dictionary_exprs( //dir=expr + unique int id: @dictionary_expr +); + +#keyset[id, index] +dictionary_expr_elements( //dir=expr + int id: @dictionary_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +differentiable_function_exprs( //dir=expr + unique int id: @differentiable_function_expr +); + +differentiable_function_extract_original_exprs( //dir=expr + unique int id: @differentiable_function_extract_original_expr +); + +dot_self_exprs( //dir=expr + unique int id: @dot_self_expr +); + +@dynamic_lookup_expr = + @dynamic_member_ref_expr +| @dynamic_subscript_expr +; + +erasure_exprs( //dir=expr + unique int id: @erasure_expr +); + +existential_metatype_to_object_exprs( //dir=expr + unique int id: @existential_metatype_to_object_expr +); + +explicit_closure_exprs( //dir=expr + unique int id: @explicit_closure_expr +); + +force_try_exprs( //dir=expr + unique int id: @force_try_expr +); + +foreign_object_conversion_exprs( //dir=expr + unique int id: @foreign_object_conversion_expr +); + +function_conversion_exprs( //dir=expr + unique int id: @function_conversion_expr +); + +in_out_to_pointer_exprs( //dir=expr + unique int id: @in_out_to_pointer_expr +); + +inject_into_optional_exprs( //dir=expr + unique int id: @inject_into_optional_expr +); + +interpolated_string_literal_exprs( //dir=expr + unique int id: @interpolated_string_literal_expr +); + +#keyset[id] +interpolated_string_literal_expr_interpolation_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int interpolation_expr: @opaque_value_expr_or_none ref +); + +#keyset[id] +interpolated_string_literal_expr_appending_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int appending_expr: @tap_expr_or_none ref +); + +linear_function_exprs( //dir=expr + unique int id: @linear_function_expr +); + +linear_function_extract_original_exprs( //dir=expr + unique int id: @linear_function_extract_original_expr +); + +linear_to_differentiable_function_exprs( //dir=expr + unique int id: @linear_to_differentiable_function_expr +); + +load_exprs( //dir=expr + unique int id: @load_expr +); + +member_ref_exprs( //dir=expr + unique int id: @member_ref_expr +); + +#keyset[id] +member_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_ordinary_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @member_ref_expr ref +); + +metatype_conversion_exprs( //dir=expr + unique int id: @metatype_conversion_expr +); + +nil_literal_exprs( //dir=expr + unique int id: @nil_literal_expr +); + +object_literal_exprs( //dir=expr + unique int id: @object_literal_expr, + int kind: int ref +); + +#keyset[id, index] +object_literal_expr_arguments( //dir=expr + int id: @object_literal_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +optional_try_exprs( //dir=expr + unique int id: @optional_try_expr +); + +paren_exprs( //dir=expr + unique int id: @paren_expr +); + +pointer_to_pointer_exprs( //dir=expr + unique int id: @pointer_to_pointer_expr +); + +postfix_unary_exprs( //dir=expr + unique int id: @postfix_unary_expr +); + +prefix_unary_exprs( //dir=expr + unique int id: @prefix_unary_expr +); + +protocol_metatype_to_object_exprs( //dir=expr + unique int id: @protocol_metatype_to_object_expr +); + +regex_literal_exprs( //dir=expr + unique int id: @regex_literal_expr, + string pattern: string ref, + int version: int ref +); + +@self_apply_expr = + @dot_syntax_call_expr +| @initializer_ref_call_expr +; + +#keyset[id] +self_apply_exprs( //dir=expr + int id: @self_apply_expr ref, + int base: @expr_or_none ref +); + +string_to_pointer_exprs( //dir=expr + unique int id: @string_to_pointer_expr +); + +subscript_exprs( //dir=expr + unique int id: @subscript_expr +); + +#keyset[id, index] +subscript_expr_arguments( //dir=expr + int id: @subscript_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +#keyset[id] +subscript_expr_has_direct_to_storage_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_ordinary_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_distributed_thunk_semantics( //dir=expr + int id: @subscript_expr ref +); + +try_exprs( //dir=expr + unique int id: @try_expr +); + +underlying_to_opaque_exprs( //dir=expr + unique int id: @underlying_to_opaque_expr +); + +unevaluated_instance_exprs( //dir=expr + unique int id: @unevaluated_instance_expr +); + +unreachable_exprs( //dir=expr + unique int id: @unreachable_expr +); + +unresolved_member_chain_result_exprs( //dir=expr + unique int id: @unresolved_member_chain_result_expr +); + +unresolved_type_conversion_exprs( //dir=expr + unique int id: @unresolved_type_conversion_expr +); + +unsafe_cast_exprs( //dir=expr + unique int id: @unsafe_cast_expr +); + +unsafe_exprs( //dir=expr + unique int id: @unsafe_expr +); + +boolean_literal_exprs( //dir=expr + unique int id: @boolean_literal_expr, + boolean value: boolean ref +); + +conditional_checked_cast_exprs( //dir=expr + unique int id: @conditional_checked_cast_expr +); + +dot_syntax_call_exprs( //dir=expr + unique int id: @dot_syntax_call_expr +); + +dynamic_member_ref_exprs( //dir=expr + unique int id: @dynamic_member_ref_expr +); + +dynamic_subscript_exprs( //dir=expr + unique int id: @dynamic_subscript_expr +); + +forced_checked_cast_exprs( //dir=expr + unique int id: @forced_checked_cast_expr +); + +initializer_ref_call_exprs( //dir=expr + unique int id: @initializer_ref_call_expr +); + +is_exprs( //dir=expr + unique int id: @is_expr +); + +magic_identifier_literal_exprs( //dir=expr + unique int id: @magic_identifier_literal_expr, + string kind: string ref +); + +@number_literal_expr = + @float_literal_expr +| @integer_literal_expr +; + +string_literal_exprs( //dir=expr + unique int id: @string_literal_expr, + string value: string ref +); + +float_literal_exprs( //dir=expr + unique int id: @float_literal_expr, + string string_value: string ref +); + +integer_literal_exprs( //dir=expr + unique int id: @integer_literal_expr, + string string_value: string ref +); + +@pattern = + @any_pattern +| @binding_pattern +| @bool_pattern +| @enum_element_pattern +| @expr_pattern +| @is_pattern +| @named_pattern +| @optional_some_pattern +| @paren_pattern +| @tuple_pattern +| @typed_pattern +; + +#keyset[id] +pattern_types( //dir=pattern + int id: @pattern ref, + int type_: @type_or_none ref +); + +any_patterns( //dir=pattern + unique int id: @any_pattern +); + +binding_patterns( //dir=pattern + unique int id: @binding_pattern, + int sub_pattern: @pattern_or_none ref +); + +bool_patterns( //dir=pattern + unique int id: @bool_pattern, + boolean value: boolean ref +); + +enum_element_patterns( //dir=pattern + unique int id: @enum_element_pattern, + int element: @enum_element_decl_or_none ref +); + +#keyset[id] +enum_element_pattern_sub_patterns( //dir=pattern + int id: @enum_element_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +expr_patterns( //dir=pattern + unique int id: @expr_pattern, + int sub_expr: @expr_or_none ref +); + +is_patterns( //dir=pattern + unique int id: @is_pattern +); + +#keyset[id] +is_pattern_cast_type_reprs( //dir=pattern + int id: @is_pattern ref, + int cast_type_repr: @type_repr_or_none ref +); + +#keyset[id] +is_pattern_sub_patterns( //dir=pattern + int id: @is_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +named_patterns( //dir=pattern + unique int id: @named_pattern, + int var_decl: @var_decl_or_none ref +); + +optional_some_patterns( //dir=pattern + unique int id: @optional_some_pattern, + int sub_pattern: @pattern_or_none ref +); + +paren_patterns( //dir=pattern + unique int id: @paren_pattern, + int sub_pattern: @pattern_or_none ref +); + +tuple_patterns( //dir=pattern + unique int id: @tuple_pattern +); + +#keyset[id, index] +tuple_pattern_elements( //dir=pattern + int id: @tuple_pattern ref, + int index: int ref, + int element: @pattern_or_none ref +); + +typed_patterns( //dir=pattern + unique int id: @typed_pattern, + int sub_pattern: @pattern_or_none ref +); + +#keyset[id] +typed_pattern_type_reprs( //dir=pattern + int id: @typed_pattern ref, + int type_repr: @type_repr_or_none ref +); + +case_label_items( //dir=stmt + unique int id: @case_label_item, + int pattern: @pattern_or_none ref +); + +#keyset[id] +case_label_item_guards( //dir=stmt + int id: @case_label_item ref, + int guard: @expr_or_none ref +); + +condition_elements( //dir=stmt + unique int id: @condition_element +); + +#keyset[id] +condition_element_booleans( //dir=stmt + int id: @condition_element ref, + int boolean_: @expr_or_none ref +); + +#keyset[id] +condition_element_patterns( //dir=stmt + int id: @condition_element ref, + int pattern: @pattern_or_none ref +); + +#keyset[id] +condition_element_initializers( //dir=stmt + int id: @condition_element ref, + int initializer: @expr_or_none ref +); + +#keyset[id] +condition_element_availabilities( //dir=stmt + int id: @condition_element ref, + int availability: @availability_info_or_none ref +); + +@stmt = + @brace_stmt +| @break_stmt +| @case_stmt +| @continue_stmt +| @defer_stmt +| @discard_stmt +| @fail_stmt +| @fallthrough_stmt +| @labeled_stmt +| @pound_assert_stmt +| @return_stmt +| @then_stmt +| @throw_stmt +| @yield_stmt +; + +stmt_conditions( //dir=stmt + unique int id: @stmt_condition +); + +#keyset[id, index] +stmt_condition_elements( //dir=stmt + int id: @stmt_condition ref, + int index: int ref, + int element: @condition_element_or_none ref +); + +brace_stmts( //dir=stmt + unique int id: @brace_stmt +); + +#keyset[id, index] +brace_stmt_elements( //dir=stmt + int id: @brace_stmt ref, + int index: int ref, + int element: @ast_node_or_none ref +); + +break_stmts( //dir=stmt + unique int id: @break_stmt +); + +#keyset[id] +break_stmt_target_names( //dir=stmt + int id: @break_stmt ref, + string target_name: string ref +); + +#keyset[id] +break_stmt_targets( //dir=stmt + int id: @break_stmt ref, + int target: @stmt_or_none ref +); + +case_stmts( //dir=stmt + unique int id: @case_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +case_stmt_labels( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int label: @case_label_item_or_none ref +); + +#keyset[id, index] +case_stmt_variables( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +continue_stmts( //dir=stmt + unique int id: @continue_stmt +); + +#keyset[id] +continue_stmt_target_names( //dir=stmt + int id: @continue_stmt ref, + string target_name: string ref +); + +#keyset[id] +continue_stmt_targets( //dir=stmt + int id: @continue_stmt ref, + int target: @stmt_or_none ref +); + +defer_stmts( //dir=stmt + unique int id: @defer_stmt, + int body: @brace_stmt_or_none ref +); + +discard_stmts( //dir=stmt + unique int id: @discard_stmt, + int sub_expr: @expr_or_none ref +); + +fail_stmts( //dir=stmt + unique int id: @fail_stmt +); + +fallthrough_stmts( //dir=stmt + unique int id: @fallthrough_stmt, + int fallthrough_source: @case_stmt_or_none ref, + int fallthrough_dest: @case_stmt_or_none ref +); + +@labeled_stmt = + @do_catch_stmt +| @do_stmt +| @for_each_stmt +| @labeled_conditional_stmt +| @repeat_while_stmt +| @switch_stmt +; + +#keyset[id] +labeled_stmt_labels( //dir=stmt + int id: @labeled_stmt ref, + string label: string ref +); + +pound_assert_stmts( //dir=stmt + unique int id: @pound_assert_stmt, + int condition: @expr_or_none ref, + string message: string ref +); + +return_stmts( //dir=stmt + unique int id: @return_stmt +); + +#keyset[id] +return_stmt_results( //dir=stmt + int id: @return_stmt ref, + int result: @expr_or_none ref +); + +then_stmts( //dir=stmt + unique int id: @then_stmt, + int result: @expr_or_none ref +); + +throw_stmts( //dir=stmt + unique int id: @throw_stmt, + int sub_expr: @expr_or_none ref +); + +yield_stmts( //dir=stmt + unique int id: @yield_stmt +); + +#keyset[id, index] +yield_stmt_results( //dir=stmt + int id: @yield_stmt ref, + int index: int ref, + int result: @expr_or_none ref +); + +do_catch_stmts( //dir=stmt + unique int id: @do_catch_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +do_catch_stmt_catches( //dir=stmt + int id: @do_catch_stmt ref, + int index: int ref, + int catch: @case_stmt_or_none ref +); + +do_stmts( //dir=stmt + unique int id: @do_stmt, + int body: @brace_stmt_or_none ref +); + +for_each_stmts( //dir=stmt + unique int id: @for_each_stmt, + int pattern: @pattern_or_none ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +for_each_stmt_variables( //dir=stmt + int id: @for_each_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +#keyset[id] +for_each_stmt_wheres( //dir=stmt + int id: @for_each_stmt ref, + int where: @expr_or_none ref +); + +#keyset[id] +for_each_stmt_iterator_vars( //dir=stmt + int id: @for_each_stmt ref, + int iteratorVar: @pattern_binding_decl_or_none ref +); + +#keyset[id] +for_each_stmt_next_calls( //dir=stmt + int id: @for_each_stmt ref, + int nextCall: @expr_or_none ref +); + +@labeled_conditional_stmt = + @guard_stmt +| @if_stmt +| @while_stmt +; + +#keyset[id] +labeled_conditional_stmts( //dir=stmt + int id: @labeled_conditional_stmt ref, + int condition: @stmt_condition_or_none ref +); + +repeat_while_stmts( //dir=stmt + unique int id: @repeat_while_stmt, + int condition: @expr_or_none ref, + int body: @stmt_or_none ref +); + +switch_stmts( //dir=stmt + unique int id: @switch_stmt, + int expr: @expr_or_none ref +); + +#keyset[id, index] +switch_stmt_cases( //dir=stmt + int id: @switch_stmt ref, + int index: int ref, + int case_: @case_stmt_or_none ref +); + +guard_stmts( //dir=stmt + unique int id: @guard_stmt, + int body: @brace_stmt_or_none ref +); + +if_stmts( //dir=stmt + unique int id: @if_stmt, + int then: @stmt_or_none ref +); + +#keyset[id] +if_stmt_elses( //dir=stmt + int id: @if_stmt ref, + int else: @stmt_or_none ref +); + +while_stmts( //dir=stmt + unique int id: @while_stmt, + int body: @stmt_or_none ref +); + +@type = + @any_function_type +| @any_generic_type +| @any_metatype_type +| @builtin_type +| @dependent_member_type +| @dynamic_self_type +| @error_type +| @existential_type +| @in_out_type +| @integer_type +| @l_value_type +| @module_type +| @pack_element_type +| @pack_expansion_type +| @pack_type +| @parameterized_protocol_type +| @protocol_composition_type +| @reference_storage_type +| @substitutable_type +| @sugar_type +| @tuple_type +| @unresolved_type +; + +#keyset[id] +types( //dir=type + int id: @type ref, + string name: string ref, + int canonical_type: @type_or_none ref +); + +type_reprs( //dir=type + unique int id: @type_repr, + int type_: @type_or_none ref +); + +@any_function_type = + @function_type +| @generic_function_type +; + +#keyset[id] +any_function_types( //dir=type + int id: @any_function_type ref, + int result: @type_or_none ref +); + +#keyset[id, index] +any_function_type_param_types( //dir=type + int id: @any_function_type ref, + int index: int ref, + int param_type: @type_or_none ref +); + +#keyset[id] +any_function_type_is_throwing( //dir=type + int id: @any_function_type ref +); + +#keyset[id] +any_function_type_is_async( //dir=type + int id: @any_function_type ref +); + +@any_generic_type = + @nominal_or_bound_generic_nominal_type +| @unbound_generic_type +; + +#keyset[id] +any_generic_types( //dir=type + int id: @any_generic_type ref, + int declaration: @generic_type_decl_or_none ref +); + +#keyset[id] +any_generic_type_parents( //dir=type + int id: @any_generic_type ref, + int parent: @type_or_none ref +); + +@any_metatype_type = + @existential_metatype_type +| @metatype_type +; + +@builtin_type = + @any_builtin_integer_type +| @builtin_bridge_object_type +| @builtin_default_actor_storage_type +| @builtin_executor_type +| @builtin_float_type +| @builtin_generic_type +| @builtin_job_type +| @builtin_native_object_type +| @builtin_raw_pointer_type +| @builtin_raw_unsafe_continuation_type +| @builtin_unsafe_value_buffer_type +| @builtin_vector_type +; + +dependent_member_types( //dir=type + unique int id: @dependent_member_type, + int base_type: @type_or_none ref, + int associated_type_decl: @associated_type_decl_or_none ref +); + +dynamic_self_types( //dir=type + unique int id: @dynamic_self_type, + int static_self_type: @type_or_none ref +); + +error_types( //dir=type + unique int id: @error_type +); + +existential_types( //dir=type + unique int id: @existential_type, + int constraint: @type_or_none ref +); + +in_out_types( //dir=type + unique int id: @in_out_type, + int object_type: @type_or_none ref +); + +integer_types( //dir=type + unique int id: @integer_type, + string value: string ref +); + +l_value_types( //dir=type + unique int id: @l_value_type, + int object_type: @type_or_none ref +); + +module_types( //dir=type + unique int id: @module_type, + int module: @module_decl_or_none ref +); + +pack_element_types( //dir=type + unique int id: @pack_element_type, + int pack_type: @type_or_none ref +); + +pack_expansion_types( //dir=type + unique int id: @pack_expansion_type, + int pattern_type: @type_or_none ref, + int count_type: @type_or_none ref +); + +pack_types( //dir=type + unique int id: @pack_type +); + +#keyset[id, index] +pack_type_elements( //dir=type + int id: @pack_type ref, + int index: int ref, + int element: @type_or_none ref +); + +parameterized_protocol_types( //dir=type + unique int id: @parameterized_protocol_type, + int base: @protocol_type_or_none ref +); + +#keyset[id, index] +parameterized_protocol_type_args( //dir=type + int id: @parameterized_protocol_type ref, + int index: int ref, + int arg: @type_or_none ref +); + +protocol_composition_types( //dir=type + unique int id: @protocol_composition_type +); + +#keyset[id, index] +protocol_composition_type_members( //dir=type + int id: @protocol_composition_type ref, + int index: int ref, + int member: @type_or_none ref +); + +@reference_storage_type = + @unmanaged_storage_type +| @unowned_storage_type +| @weak_storage_type +; + +#keyset[id] +reference_storage_types( //dir=type + int id: @reference_storage_type ref, + int referent_type: @type_or_none ref +); + +@substitutable_type = + @archetype_type +| @generic_type_param_type +; + +@sugar_type = + @paren_type +| @syntax_sugar_type +| @type_alias_type +; + +tuple_types( //dir=type + unique int id: @tuple_type +); + +#keyset[id, index] +tuple_type_types( //dir=type + int id: @tuple_type ref, + int index: int ref, + int type_: @type_or_none ref +); + +#keyset[id, index] +tuple_type_names( //dir=type + int id: @tuple_type ref, + int index: int ref, + string name: string ref +); + +unresolved_types( //dir=type + unique int id: @unresolved_type +); + +@any_builtin_integer_type = + @builtin_integer_literal_type +| @builtin_integer_type +; + +@archetype_type = + @local_archetype_type +| @opaque_type_archetype_type +| @pack_archetype_type +| @primary_archetype_type +; + +#keyset[id] +archetype_types( //dir=type + int id: @archetype_type ref, + int interface_type: @type_or_none ref +); + +#keyset[id] +archetype_type_superclasses( //dir=type + int id: @archetype_type ref, + int superclass: @type_or_none ref +); + +#keyset[id, index] +archetype_type_protocols( //dir=type + int id: @archetype_type ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +builtin_bridge_object_types( //dir=type + unique int id: @builtin_bridge_object_type +); + +builtin_default_actor_storage_types( //dir=type + unique int id: @builtin_default_actor_storage_type +); + +builtin_executor_types( //dir=type + unique int id: @builtin_executor_type +); + +builtin_float_types( //dir=type + unique int id: @builtin_float_type +); + +@builtin_generic_type = + @builtin_fixed_array_type +; + +builtin_job_types( //dir=type + unique int id: @builtin_job_type +); + +builtin_native_object_types( //dir=type + unique int id: @builtin_native_object_type +); + +builtin_raw_pointer_types( //dir=type + unique int id: @builtin_raw_pointer_type +); + +builtin_raw_unsafe_continuation_types( //dir=type + unique int id: @builtin_raw_unsafe_continuation_type +); + +builtin_unsafe_value_buffer_types( //dir=type + unique int id: @builtin_unsafe_value_buffer_type +); + +builtin_vector_types( //dir=type + unique int id: @builtin_vector_type +); + +existential_metatype_types( //dir=type + unique int id: @existential_metatype_type +); + +function_types( //dir=type + unique int id: @function_type +); + +generic_function_types( //dir=type + unique int id: @generic_function_type +); + +#keyset[id, index] +generic_function_type_generic_params( //dir=type + int id: @generic_function_type ref, + int index: int ref, + int generic_param: @generic_type_param_type_or_none ref +); + +generic_type_param_types( //dir=type + unique int id: @generic_type_param_type +); + +metatype_types( //dir=type + unique int id: @metatype_type +); + +@nominal_or_bound_generic_nominal_type = + @bound_generic_type +| @nominal_type +; + +paren_types( //dir=type + unique int id: @paren_type, + int type_: @type_or_none ref +); + +@syntax_sugar_type = + @dictionary_type +| @inline_array_type +| @unary_syntax_sugar_type +; + +type_alias_types( //dir=type + unique int id: @type_alias_type, + int decl: @type_alias_decl_or_none ref +); + +unbound_generic_types( //dir=type + unique int id: @unbound_generic_type +); + +unmanaged_storage_types( //dir=type + unique int id: @unmanaged_storage_type +); + +unowned_storage_types( //dir=type + unique int id: @unowned_storage_type +); + +weak_storage_types( //dir=type + unique int id: @weak_storage_type +); + +@bound_generic_type = + @bound_generic_class_type +| @bound_generic_enum_type +| @bound_generic_struct_type +; + +#keyset[id, index] +bound_generic_type_arg_types( //dir=type + int id: @bound_generic_type ref, + int index: int ref, + int arg_type: @type_or_none ref +); + +builtin_fixed_array_types( //dir=type + unique int id: @builtin_fixed_array_type, + int size: @type_or_none ref, + int element_type: @type_or_none ref +); + +builtin_integer_literal_types( //dir=type + unique int id: @builtin_integer_literal_type +); + +builtin_integer_types( //dir=type + unique int id: @builtin_integer_type +); + +#keyset[id] +builtin_integer_type_widths( //dir=type + int id: @builtin_integer_type ref, + int width: int ref +); + +dictionary_types( //dir=type + unique int id: @dictionary_type, + int key_type: @type_or_none ref, + int value_type: @type_or_none ref +); + +inline_array_types( //dir=type + unique int id: @inline_array_type, + int count_type: @type_or_none ref, + int element_type: @type_or_none ref +); + +@local_archetype_type = + @element_archetype_type +| @existential_archetype_type +; + +@nominal_type = + @class_type +| @enum_type +| @protocol_type +| @struct_type +; + +opaque_type_archetype_types( //dir=type + unique int id: @opaque_type_archetype_type, + int declaration: @opaque_type_decl_or_none ref +); + +pack_archetype_types( //dir=type + unique int id: @pack_archetype_type +); + +primary_archetype_types( //dir=type + unique int id: @primary_archetype_type +); + +@unary_syntax_sugar_type = + @array_slice_type +| @optional_type +| @variadic_sequence_type +; + +#keyset[id] +unary_syntax_sugar_types( //dir=type + int id: @unary_syntax_sugar_type ref, + int base_type: @type_or_none ref +); + +array_slice_types( //dir=type + unique int id: @array_slice_type +); + +bound_generic_class_types( //dir=type + unique int id: @bound_generic_class_type +); + +bound_generic_enum_types( //dir=type + unique int id: @bound_generic_enum_type +); + +bound_generic_struct_types( //dir=type + unique int id: @bound_generic_struct_type +); + +class_types( //dir=type + unique int id: @class_type +); + +element_archetype_types( //dir=type + unique int id: @element_archetype_type +); + +enum_types( //dir=type + unique int id: @enum_type +); + +existential_archetype_types( //dir=type + unique int id: @existential_archetype_type +); + +optional_types( //dir=type + unique int id: @optional_type +); + +protocol_types( //dir=type + unique int id: @protocol_type +); + +struct_types( //dir=type + unique int id: @struct_type +); + +variadic_sequence_types( //dir=type + unique int id: @variadic_sequence_type +); + +@accessor_or_none = + @accessor +| @unspecified_element +; + +@argument_or_none = + @argument +| @unspecified_element +; + +@associated_type_decl_or_none = + @associated_type_decl +| @unspecified_element +; + +@ast_node_or_none = + @ast_node +| @unspecified_element +; + +@availability_info_or_none = + @availability_info +| @unspecified_element +; + +@availability_spec_or_none = + @availability_spec +| @unspecified_element +; + +@brace_stmt_or_none = + @brace_stmt +| @unspecified_element +; + +@captured_decl_or_none = + @captured_decl +| @unspecified_element +; + +@case_label_item_or_none = + @case_label_item +| @unspecified_element +; + +@case_stmt_or_none = + @case_stmt +| @unspecified_element +; + +@closure_expr_or_none = + @closure_expr +| @unspecified_element +; + +@condition_element_or_none = + @condition_element +| @unspecified_element +; + +@decl_or_none = + @decl +| @unspecified_element +; + +@enum_element_decl_or_none = + @enum_element_decl +| @unspecified_element +; + +@expr_or_none = + @expr +| @unspecified_element +; + +@file_or_none = + @file +| @unspecified_element +; + +@function_or_none = + @function +| @unspecified_element +; + +@generic_type_decl_or_none = + @generic_type_decl +| @unspecified_element +; + +@generic_type_param_decl_or_none = + @generic_type_param_decl +| @unspecified_element +; + +@generic_type_param_type_or_none = + @generic_type_param_type +| @unspecified_element +; + +@initializer_or_none = + @initializer +| @unspecified_element +; + +@key_path_component_or_none = + @key_path_component +| @unspecified_element +; + +@location_or_none = + @location +| @unspecified_element +; + +@macro_role_or_none = + @macro_role +| @unspecified_element +; + +@module_decl_or_none = + @module_decl +| @unspecified_element +; + +@nominal_type_decl_or_none = + @nominal_type_decl +| @unspecified_element +; + +@opaque_type_decl_or_none = + @opaque_type_decl +| @unspecified_element +; + +@opaque_value_expr_or_none = + @opaque_value_expr +| @unspecified_element +; + +@param_decl_or_none = + @param_decl +| @unspecified_element +; + +@pattern_or_none = + @pattern +| @unspecified_element +; + +@pattern_binding_decl_or_none = + @pattern_binding_decl +| @unspecified_element +; + +@precedence_group_decl_or_none = + @precedence_group_decl +| @unspecified_element +; + +@protocol_decl_or_none = + @protocol_decl +| @unspecified_element +; + +@protocol_type_or_none = + @protocol_type +| @unspecified_element +; + +@stmt_or_none = + @stmt +| @unspecified_element +; + +@stmt_condition_or_none = + @stmt_condition +| @unspecified_element +; + +@string_literal_expr_or_none = + @string_literal_expr +| @unspecified_element +; + +@tap_expr_or_none = + @tap_expr +| @unspecified_element +; + +@type_or_none = + @type +| @unspecified_element +; + +@type_alias_decl_or_none = + @type_alias_decl +| @unspecified_element +; + +@type_repr_or_none = + @type_repr +| @unspecified_element +; + +@value_decl_or_none = + @unspecified_element +| @value_decl +; + +@var_decl_or_none = + @unspecified_element +| @var_decl +; diff --git a/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/swift.dbscheme b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/swift.dbscheme new file mode 100644 index 000000000000..1bb163e31d20 --- /dev/null +++ b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/swift.dbscheme @@ -0,0 +1,2892 @@ +// generated by codegen/codegen.py, do not edit + +// from prefix.dbscheme +/** + * The source location of the snapshot. + */ +sourceLocationPrefix( + string prefix: string ref +); + + +// from schema.py + +@element = + @file +| @generic_context +| @locatable +| @location +| @type +; + +#keyset[id] +element_is_unknown( + int id: @element ref +); + +@file = + @db_file +; + +#keyset[id] +files( + int id: @file ref, + string name: string ref +); + +#keyset[id] +file_is_successfully_extracted( + int id: @file ref +); + +@locatable = + @argument +| @ast_node +| @comment +| @diagnostics +| @error_element +; + +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_or_none ref +); + +@location = + @db_location +; + +#keyset[id] +locations( + int id: @location ref, + int file: @file_or_none ref, + int start_line: int ref, + int start_column: int ref, + int end_line: int ref, + int end_column: int ref +); + +@ast_node = + @availability_info +| @availability_spec +| @callable +| @case_label_item +| @condition_element +| @decl +| @expr +| @key_path_component +| @macro_role +| @pattern +| @stmt +| @stmt_condition +| @type_repr +; + +comments( + unique int id: @comment, + string text: string ref +); + +db_files( + unique int id: @db_file +); + +db_locations( + unique int id: @db_location +); + +diagnostics( + unique int id: @diagnostics, + string text: string ref, + int kind: int ref +); + +@error_element = + @error_expr +| @error_type +| @overloaded_decl_ref_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_chain_result_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @unresolved_type +| @unresolved_type_conversion_expr +| @unspecified_element +; + +availability_infos( + unique int id: @availability_info +); + +#keyset[id] +availability_info_is_unavailable( + int id: @availability_info ref +); + +#keyset[id, index] +availability_info_specs( + int id: @availability_info ref, + int index: int ref, + int spec: @availability_spec_or_none ref +); + +availability_specs( + unique int id: @availability_spec +); + +#keyset[id] +availability_spec_platforms( + int id: @availability_spec ref, + string platform: string ref +); + +#keyset[id] +availability_spec_versions( + int id: @availability_spec ref, + string version: string ref +); + +#keyset[id] +availability_spec_is_wildcard( + int id: @availability_spec ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_names( + int id: @callable ref, + string name: string ref +); + +#keyset[id] +callable_self_params( + int id: @callable ref, + int self_param: @param_decl_or_none ref +); + +#keyset[id, index] +callable_params( + int id: @callable ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +#keyset[id] +callable_bodies( + int id: @callable ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +callable_captures( + int id: @callable ref, + int index: int ref, + int capture: @captured_decl_or_none ref +); + +key_path_components( + unique int id: @key_path_component, + int kind: int ref, + int component_type: @type_or_none ref +); + +#keyset[id, index] +key_path_component_subscript_arguments( + int id: @key_path_component ref, + int index: int ref, + int subscript_argument: @argument_or_none ref +); + +#keyset[id] +key_path_component_tuple_indices( + int id: @key_path_component ref, + int tuple_index: int ref +); + +#keyset[id] +key_path_component_decl_refs( + int id: @key_path_component ref, + int decl_ref: @value_decl_or_none ref +); + +macro_roles( + unique int id: @macro_role, + int kind: int ref, + int macro_syntax: int ref +); + +#keyset[id, index] +macro_role_conformances( + int id: @macro_role ref, + int index: int ref, + int conformance: @expr_or_none ref +); + +#keyset[id, index] +macro_role_names( + int id: @macro_role ref, + int index: int ref, + string name: string ref +); + +unspecified_elements( + unique int id: @unspecified_element, + string property: string ref, + string error: string ref +); + +#keyset[id] +unspecified_element_parents( + int id: @unspecified_element ref, + int parent: @element ref +); + +#keyset[id] +unspecified_element_indices( + int id: @unspecified_element ref, + int index: int ref +); + +#keyset[id, index] +unspecified_element_children( + int id: @unspecified_element ref, + int index: int ref, + int child: @ast_node_or_none ref +); + +@decl = + @captured_decl +| @enum_case_decl +| @extension_decl +| @if_config_decl +| @import_decl +| @missing_member_decl +| @operator_decl +| @pattern_binding_decl +| @pound_diagnostic_decl +| @precedence_group_decl +| @top_level_code_decl +| @using_decl +| @value_decl +; + +#keyset[id] +decls( //dir=decl + int id: @decl ref, + int module: @module_decl_or_none ref +); + +#keyset[id, index] +decl_members( //dir=decl + int id: @decl ref, + int index: int ref, + int member: @decl_or_none ref +); + +@generic_context = + @extension_decl +| @function +| @generic_type_decl +| @macro_decl +| @subscript_decl +; + +#keyset[id, index] +generic_context_generic_type_params( //dir=decl + int id: @generic_context ref, + int index: int ref, + int generic_type_param: @generic_type_param_decl_or_none ref +); + +captured_decls( //dir=decl + unique int id: @captured_decl, + int decl: @value_decl_or_none ref +); + +#keyset[id] +captured_decl_is_direct( //dir=decl + int id: @captured_decl ref +); + +#keyset[id] +captured_decl_is_escaping( //dir=decl + int id: @captured_decl ref +); + +enum_case_decls( //dir=decl + unique int id: @enum_case_decl +); + +#keyset[id, index] +enum_case_decl_elements( //dir=decl + int id: @enum_case_decl ref, + int index: int ref, + int element: @enum_element_decl_or_none ref +); + +extension_decls( //dir=decl + unique int id: @extension_decl, + int extended_type_decl: @nominal_type_decl_or_none ref +); + +#keyset[id, index] +extension_decl_protocols( //dir=decl + int id: @extension_decl ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +if_config_decls( //dir=decl + unique int id: @if_config_decl +); + +#keyset[id, index] +if_config_decl_active_elements( //dir=decl + int id: @if_config_decl ref, + int index: int ref, + int active_element: @ast_node_or_none ref +); + +import_decls( //dir=decl + unique int id: @import_decl +); + +#keyset[id] +import_decl_is_exported( //dir=decl + int id: @import_decl ref +); + +#keyset[id] +import_decl_imported_modules( //dir=decl + int id: @import_decl ref, + int imported_module: @module_decl_or_none ref +); + +#keyset[id, index] +import_decl_declarations( //dir=decl + int id: @import_decl ref, + int index: int ref, + int declaration: @value_decl_or_none ref +); + +missing_member_decls( //dir=decl + unique int id: @missing_member_decl, + string name: string ref +); + +@operator_decl = + @infix_operator_decl +| @postfix_operator_decl +| @prefix_operator_decl +; + +#keyset[id] +operator_decls( //dir=decl + int id: @operator_decl ref, + string name: string ref +); + +pattern_binding_decls( //dir=decl + unique int id: @pattern_binding_decl +); + +#keyset[id, index] +pattern_binding_decl_inits( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int init: @expr_or_none ref +); + +#keyset[id, index] +pattern_binding_decl_patterns( //dir=decl + int id: @pattern_binding_decl ref, + int index: int ref, + int pattern: @pattern_or_none ref +); + +pound_diagnostic_decls( //dir=decl + unique int id: @pound_diagnostic_decl, + int kind: int ref, + int message: @string_literal_expr_or_none ref +); + +precedence_group_decls( //dir=decl + unique int id: @precedence_group_decl +); + +top_level_code_decls( //dir=decl + unique int id: @top_level_code_decl, + int body: @brace_stmt_or_none ref +); + +using_decls( //dir=decl + unique int id: @using_decl +); + +#keyset[id] +using_decl_is_main_actor( //dir=decl + int id: @using_decl ref +); + +#keyset[id] +using_decl_is_nonisolated( //dir=decl + int id: @using_decl ref +); + +@value_decl = + @abstract_storage_decl +| @enum_element_decl +| @function +| @macro_decl +| @type_decl +; + +#keyset[id] +value_decls( //dir=decl + int id: @value_decl ref, + int interface_type: @type_or_none ref +); + +@abstract_storage_decl = + @subscript_decl +| @var_decl +; + +#keyset[id, index] +abstract_storage_decl_accessors( //dir=decl + int id: @abstract_storage_decl ref, + int index: int ref, + int accessor: @accessor_or_none ref +); + +enum_element_decls( //dir=decl + unique int id: @enum_element_decl, + string name: string ref +); + +#keyset[id, index] +enum_element_decl_params( //dir=decl + int id: @enum_element_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@function = + @accessor_or_named_function +| @deinitializer +| @initializer +; + +infix_operator_decls( //dir=decl + unique int id: @infix_operator_decl +); + +#keyset[id] +infix_operator_decl_precedence_groups( //dir=decl + int id: @infix_operator_decl ref, + int precedence_group: @precedence_group_decl_or_none ref +); + +macro_decls( //dir=decl + unique int id: @macro_decl, + string name: string ref +); + +#keyset[id, index] +macro_decl_parameters( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int parameter: @param_decl_or_none ref +); + +#keyset[id, index] +macro_decl_roles( //dir=decl + int id: @macro_decl ref, + int index: int ref, + int role: @macro_role_or_none ref +); + +postfix_operator_decls( //dir=decl + unique int id: @postfix_operator_decl +); + +prefix_operator_decls( //dir=decl + unique int id: @prefix_operator_decl +); + +@type_decl = + @abstract_type_param_decl +| @generic_type_decl +| @module_decl +; + +#keyset[id] +type_decls( //dir=decl + int id: @type_decl ref, + string name: string ref, + int declared_interface_type: @type_or_none ref +); + +#keyset[id, index] +type_decl_inherited_types( //dir=decl + int id: @type_decl ref, + int index: int ref, + int inherited_type: @type_or_none ref +); + +@abstract_type_param_decl = + @associated_type_decl +| @generic_type_param_decl +; + +@accessor_or_named_function = + @accessor +| @named_function +; + +deinitializers( //dir=decl + unique int id: @deinitializer +); + +@generic_type_decl = + @nominal_type_decl +| @opaque_type_decl +| @type_alias_decl +; + +initializers( //dir=decl + unique int id: @initializer +); + +module_decls( //dir=decl + unique int id: @module_decl +); + +#keyset[id] +module_decl_is_builtin_module( //dir=decl + int id: @module_decl ref +); + +#keyset[id] +module_decl_is_system_module( //dir=decl + int id: @module_decl ref +); + +module_decl_imported_modules( //dir=decl + int id: @module_decl ref, + int imported_module: @module_decl_or_none ref +); + +module_decl_exported_modules( //dir=decl + int id: @module_decl ref, + int exported_module: @module_decl_or_none ref +); + +subscript_decls( //dir=decl + unique int id: @subscript_decl, + int element_type: @type_or_none ref +); + +#keyset[id, index] +subscript_decl_params( //dir=decl + int id: @subscript_decl ref, + int index: int ref, + int param: @param_decl_or_none ref +); + +@var_decl = + @concrete_var_decl +| @param_decl +; + +#keyset[id] +var_decls( //dir=decl + int id: @var_decl ref, + string name: string ref, + int type_: @type_or_none ref +); + +#keyset[id] +var_decl_attached_property_wrapper_types( //dir=decl + int id: @var_decl ref, + int attached_property_wrapper_type: @type_or_none ref +); + +#keyset[id] +var_decl_parent_patterns( //dir=decl + int id: @var_decl ref, + int parent_pattern: @pattern_or_none ref +); + +#keyset[id] +var_decl_parent_initializers( //dir=decl + int id: @var_decl ref, + int parent_initializer: @expr_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_backing_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_backing_var: @var_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_var_bindings( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +var_decl_property_wrapper_projection_vars( //dir=decl + int id: @var_decl ref, + int property_wrapper_projection_var: @var_decl_or_none ref +); + +accessors( //dir=decl + unique int id: @accessor +); + +#keyset[id] +accessor_is_getter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_setter( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_will_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_did_set( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_unsafe_mutable_address( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_distributed_get( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_read2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_modify2( //dir=decl + int id: @accessor ref +); + +#keyset[id] +accessor_is_init( //dir=decl + int id: @accessor ref +); + +associated_type_decls( //dir=decl + unique int id: @associated_type_decl +); + +concrete_var_decls( //dir=decl + unique int id: @concrete_var_decl, + int introducer_int: int ref +); + +generic_type_param_decls( //dir=decl + unique int id: @generic_type_param_decl +); + +named_functions( //dir=decl + unique int id: @named_function +); + +@nominal_type_decl = + @class_decl +| @enum_decl +| @protocol_decl +| @struct_decl +; + +#keyset[id] +nominal_type_decls( //dir=decl + int id: @nominal_type_decl ref, + int type_: @type_or_none ref +); + +opaque_type_decls( //dir=decl + unique int id: @opaque_type_decl, + int naming_declaration: @value_decl_or_none ref +); + +#keyset[id, index] +opaque_type_decl_opaque_generic_params( //dir=decl + int id: @opaque_type_decl ref, + int index: int ref, + int opaque_generic_param: @generic_type_param_type_or_none ref +); + +param_decls( //dir=decl + unique int id: @param_decl +); + +#keyset[id] +param_decl_is_inout( //dir=decl + int id: @param_decl ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_var_bindings( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var_binding: @pattern_binding_decl_or_none ref +); + +#keyset[id] +param_decl_property_wrapper_local_wrapped_vars( //dir=decl + int id: @param_decl ref, + int property_wrapper_local_wrapped_var: @var_decl_or_none ref +); + +type_alias_decls( //dir=decl + unique int id: @type_alias_decl, + int aliased_type: @type_or_none ref +); + +class_decls( //dir=decl + unique int id: @class_decl +); + +enum_decls( //dir=decl + unique int id: @enum_decl +); + +protocol_decls( //dir=decl + unique int id: @protocol_decl +); + +struct_decls( //dir=decl + unique int id: @struct_decl +); + +arguments( //dir=expr + unique int id: @argument, + string label: string ref, + int expr: @expr_or_none ref +); + +@expr = + @any_try_expr +| @applied_property_wrapper_expr +| @apply_expr +| @assign_expr +| @bind_optional_expr +| @capture_list_expr +| @closure_expr +| @collection_expr +| @consume_expr +| @copy_expr +| @current_context_isolation_expr +| @decl_ref_expr +| @default_argument_expr +| @discard_assignment_expr +| @dot_syntax_base_ignored_expr +| @dynamic_type_expr +| @enum_is_case_expr +| @error_expr +| @explicit_cast_expr +| @extract_function_isolation_expr +| @force_value_expr +| @identity_expr +| @if_expr +| @implicit_conversion_expr +| @in_out_expr +| @key_path_application_expr +| @key_path_dot_expr +| @key_path_expr +| @lazy_initialization_expr +| @literal_expr +| @lookup_expr +| @make_temporarily_escapable_expr +| @materialize_pack_expr +| @obj_c_selector_expr +| @one_way_expr +| @opaque_value_expr +| @open_existential_expr +| @optional_evaluation_expr +| @other_initializer_ref_expr +| @overloaded_decl_ref_expr +| @pack_element_expr +| @pack_expansion_expr +| @property_wrapper_value_placeholder_expr +| @rebind_self_in_initializer_expr +| @sequence_expr +| @single_value_stmt_expr +| @super_ref_expr +| @tap_expr +| @tuple_element_expr +| @tuple_expr +| @type_expr +| @type_value_expr +| @unresolved_decl_ref_expr +| @unresolved_dot_expr +| @unresolved_member_expr +| @unresolved_pattern_expr +| @unresolved_specialize_expr +| @vararg_expansion_expr +; + +#keyset[id] +expr_types( //dir=expr + int id: @expr ref, + int type_: @type_or_none ref +); + +@any_try_expr = + @force_try_expr +| @optional_try_expr +| @try_expr +; + +#keyset[id] +any_try_exprs( //dir=expr + int id: @any_try_expr ref, + int sub_expr: @expr_or_none ref +); + +applied_property_wrapper_exprs( //dir=expr + unique int id: @applied_property_wrapper_expr, + int kind: int ref, + int value: @expr_or_none ref, + int param: @param_decl_or_none ref +); + +@apply_expr = + @binary_expr +| @call_expr +| @postfix_unary_expr +| @prefix_unary_expr +| @self_apply_expr +; + +#keyset[id] +apply_exprs( //dir=expr + int id: @apply_expr ref, + int function: @expr_or_none ref +); + +#keyset[id, index] +apply_expr_arguments( //dir=expr + int id: @apply_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +assign_exprs( //dir=expr + unique int id: @assign_expr, + int dest: @expr_or_none ref, + int source: @expr_or_none ref +); + +bind_optional_exprs( //dir=expr + unique int id: @bind_optional_expr, + int sub_expr: @expr_or_none ref +); + +capture_list_exprs( //dir=expr + unique int id: @capture_list_expr, + int closure_body: @closure_expr_or_none ref +); + +#keyset[id, index] +capture_list_expr_binding_decls( //dir=expr + int id: @capture_list_expr ref, + int index: int ref, + int binding_decl: @pattern_binding_decl_or_none ref +); + +@closure_expr = + @auto_closure_expr +| @explicit_closure_expr +; + +@collection_expr = + @array_expr +| @dictionary_expr +; + +consume_exprs( //dir=expr + unique int id: @consume_expr, + int sub_expr: @expr_or_none ref +); + +copy_exprs( //dir=expr + unique int id: @copy_expr, + int sub_expr: @expr_or_none ref +); + +current_context_isolation_exprs( //dir=expr + unique int id: @current_context_isolation_expr, + int actor: @expr_or_none ref +); + +decl_ref_exprs( //dir=expr + unique int id: @decl_ref_expr, + int decl: @decl_or_none ref +); + +#keyset[id, index] +decl_ref_expr_replacement_types( //dir=expr + int id: @decl_ref_expr ref, + int index: int ref, + int replacement_type: @type_or_none ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_ordinary_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +#keyset[id] +decl_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @decl_ref_expr ref +); + +default_argument_exprs( //dir=expr + unique int id: @default_argument_expr, + int param_decl: @param_decl_or_none ref, + int param_index: int ref +); + +#keyset[id] +default_argument_expr_caller_side_defaults( //dir=expr + int id: @default_argument_expr ref, + int caller_side_default: @expr_or_none ref +); + +discard_assignment_exprs( //dir=expr + unique int id: @discard_assignment_expr +); + +dot_syntax_base_ignored_exprs( //dir=expr + unique int id: @dot_syntax_base_ignored_expr, + int qualifier: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +dynamic_type_exprs( //dir=expr + unique int id: @dynamic_type_expr, + int base: @expr_or_none ref +); + +enum_is_case_exprs( //dir=expr + unique int id: @enum_is_case_expr, + int sub_expr: @expr_or_none ref, + int element: @enum_element_decl_or_none ref +); + +error_exprs( //dir=expr + unique int id: @error_expr +); + +@explicit_cast_expr = + @checked_cast_expr +| @coerce_expr +; + +#keyset[id] +explicit_cast_exprs( //dir=expr + int id: @explicit_cast_expr ref, + int sub_expr: @expr_or_none ref +); + +extract_function_isolation_exprs( //dir=expr + unique int id: @extract_function_isolation_expr, + int function_expr: @expr_or_none ref +); + +force_value_exprs( //dir=expr + unique int id: @force_value_expr, + int sub_expr: @expr_or_none ref +); + +@identity_expr = + @await_expr +| @borrow_expr +| @dot_self_expr +| @paren_expr +| @unresolved_member_chain_result_expr +| @unsafe_expr +; + +#keyset[id] +identity_exprs( //dir=expr + int id: @identity_expr ref, + int sub_expr: @expr_or_none ref +); + +if_exprs( //dir=expr + unique int id: @if_expr, + int condition: @expr_or_none ref, + int then_expr: @expr_or_none ref, + int else_expr: @expr_or_none ref +); + +@implicit_conversion_expr = + @abi_safe_conversion_expr +| @actor_isolation_erasure_expr +| @any_hashable_erasure_expr +| @archetype_to_super_expr +| @array_to_pointer_expr +| @bridge_from_obj_c_expr +| @bridge_to_obj_c_expr +| @class_metatype_to_object_expr +| @collection_upcast_conversion_expr +| @conditional_bridge_from_obj_c_expr +| @covariant_function_conversion_expr +| @covariant_return_conversion_expr +| @derived_to_base_expr +| @destructure_tuple_expr +| @differentiable_function_expr +| @differentiable_function_extract_original_expr +| @erasure_expr +| @existential_metatype_to_object_expr +| @foreign_object_conversion_expr +| @function_conversion_expr +| @in_out_to_pointer_expr +| @inject_into_optional_expr +| @linear_function_expr +| @linear_function_extract_original_expr +| @linear_to_differentiable_function_expr +| @load_expr +| @metatype_conversion_expr +| @pointer_to_pointer_expr +| @protocol_metatype_to_object_expr +| @string_to_pointer_expr +| @underlying_to_opaque_expr +| @unevaluated_instance_expr +| @unreachable_expr +| @unresolved_type_conversion_expr +| @unsafe_cast_expr +; + +#keyset[id] +implicit_conversion_exprs( //dir=expr + int id: @implicit_conversion_expr ref, + int sub_expr: @expr_or_none ref +); + +in_out_exprs( //dir=expr + unique int id: @in_out_expr, + int sub_expr: @expr_or_none ref +); + +key_path_application_exprs( //dir=expr + unique int id: @key_path_application_expr, + int base: @expr_or_none ref, + int key_path: @expr_or_none ref +); + +key_path_dot_exprs( //dir=expr + unique int id: @key_path_dot_expr +); + +key_path_exprs( //dir=expr + unique int id: @key_path_expr +); + +#keyset[id] +key_path_expr_roots( //dir=expr + int id: @key_path_expr ref, + int root: @type_repr_or_none ref +); + +#keyset[id, index] +key_path_expr_components( //dir=expr + int id: @key_path_expr ref, + int index: int ref, + int component: @key_path_component_or_none ref +); + +lazy_initialization_exprs( //dir=expr + unique int id: @lazy_initialization_expr, + int sub_expr: @expr_or_none ref +); + +@literal_expr = + @builtin_literal_expr +| @interpolated_string_literal_expr +| @nil_literal_expr +| @object_literal_expr +| @regex_literal_expr +; + +@lookup_expr = + @dynamic_lookup_expr +| @member_ref_expr +| @subscript_expr +; + +#keyset[id] +lookup_exprs( //dir=expr + int id: @lookup_expr ref, + int base: @expr_or_none ref +); + +#keyset[id] +lookup_expr_members( //dir=expr + int id: @lookup_expr ref, + int member: @decl_or_none ref +); + +make_temporarily_escapable_exprs( //dir=expr + unique int id: @make_temporarily_escapable_expr, + int escaping_closure: @opaque_value_expr_or_none ref, + int nonescaping_closure: @expr_or_none ref, + int sub_expr: @expr_or_none ref +); + +materialize_pack_exprs( //dir=expr + unique int id: @materialize_pack_expr, + int sub_expr: @expr_or_none ref +); + +obj_c_selector_exprs( //dir=expr + unique int id: @obj_c_selector_expr, + int sub_expr: @expr_or_none ref, + int method: @function_or_none ref +); + +one_way_exprs( //dir=expr + unique int id: @one_way_expr, + int sub_expr: @expr_or_none ref +); + +opaque_value_exprs( //dir=expr + unique int id: @opaque_value_expr +); + +open_existential_exprs( //dir=expr + unique int id: @open_existential_expr, + int sub_expr: @expr_or_none ref, + int existential: @expr_or_none ref, + int opaque_expr: @opaque_value_expr_or_none ref +); + +optional_evaluation_exprs( //dir=expr + unique int id: @optional_evaluation_expr, + int sub_expr: @expr_or_none ref +); + +other_initializer_ref_exprs( //dir=expr + unique int id: @other_initializer_ref_expr, + int initializer: @initializer_or_none ref +); + +overloaded_decl_ref_exprs( //dir=expr + unique int id: @overloaded_decl_ref_expr +); + +#keyset[id, index] +overloaded_decl_ref_expr_possible_declarations( //dir=expr + int id: @overloaded_decl_ref_expr ref, + int index: int ref, + int possible_declaration: @value_decl_or_none ref +); + +pack_element_exprs( //dir=expr + unique int id: @pack_element_expr, + int sub_expr: @expr_or_none ref +); + +pack_expansion_exprs( //dir=expr + unique int id: @pack_expansion_expr, + int pattern_expr: @expr_or_none ref +); + +property_wrapper_value_placeholder_exprs( //dir=expr + unique int id: @property_wrapper_value_placeholder_expr, + int placeholder: @opaque_value_expr_or_none ref +); + +#keyset[id] +property_wrapper_value_placeholder_expr_wrapped_values( //dir=expr + int id: @property_wrapper_value_placeholder_expr ref, + int wrapped_value: @expr_or_none ref +); + +rebind_self_in_initializer_exprs( //dir=expr + unique int id: @rebind_self_in_initializer_expr, + int sub_expr: @expr_or_none ref, + int self: @var_decl_or_none ref +); + +sequence_exprs( //dir=expr + unique int id: @sequence_expr +); + +#keyset[id, index] +sequence_expr_elements( //dir=expr + int id: @sequence_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +single_value_stmt_exprs( //dir=expr + unique int id: @single_value_stmt_expr, + int stmt: @stmt_or_none ref +); + +super_ref_exprs( //dir=expr + unique int id: @super_ref_expr, + int self: @var_decl_or_none ref +); + +tap_exprs( //dir=expr + unique int id: @tap_expr, + int body: @brace_stmt_or_none ref, + int var: @var_decl_or_none ref +); + +#keyset[id] +tap_expr_sub_exprs( //dir=expr + int id: @tap_expr ref, + int sub_expr: @expr_or_none ref +); + +tuple_element_exprs( //dir=expr + unique int id: @tuple_element_expr, + int sub_expr: @expr_or_none ref, + int index: int ref +); + +tuple_exprs( //dir=expr + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_elements( //dir=expr + int id: @tuple_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +type_exprs( //dir=expr + unique int id: @type_expr +); + +#keyset[id] +type_expr_type_reprs( //dir=expr + int id: @type_expr ref, + int type_repr: @type_repr_or_none ref +); + +type_value_exprs( //dir=expr + unique int id: @type_value_expr, + int type_repr: @type_repr_or_none ref +); + +unresolved_decl_ref_exprs( //dir=expr + unique int id: @unresolved_decl_ref_expr +); + +#keyset[id] +unresolved_decl_ref_expr_names( //dir=expr + int id: @unresolved_decl_ref_expr ref, + string name: string ref +); + +unresolved_dot_exprs( //dir=expr + unique int id: @unresolved_dot_expr, + int base: @expr_or_none ref, + string name: string ref +); + +unresolved_member_exprs( //dir=expr + unique int id: @unresolved_member_expr, + string name: string ref +); + +unresolved_pattern_exprs( //dir=expr + unique int id: @unresolved_pattern_expr, + int sub_pattern: @pattern_or_none ref +); + +unresolved_specialize_exprs( //dir=expr + unique int id: @unresolved_specialize_expr, + int sub_expr: @expr_or_none ref +); + +vararg_expansion_exprs( //dir=expr + unique int id: @vararg_expansion_expr, + int sub_expr: @expr_or_none ref +); + +abi_safe_conversion_exprs( //dir=expr + unique int id: @abi_safe_conversion_expr +); + +actor_isolation_erasure_exprs( //dir=expr + unique int id: @actor_isolation_erasure_expr +); + +any_hashable_erasure_exprs( //dir=expr + unique int id: @any_hashable_erasure_expr +); + +archetype_to_super_exprs( //dir=expr + unique int id: @archetype_to_super_expr +); + +array_exprs( //dir=expr + unique int id: @array_expr +); + +#keyset[id, index] +array_expr_elements( //dir=expr + int id: @array_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +array_to_pointer_exprs( //dir=expr + unique int id: @array_to_pointer_expr +); + +auto_closure_exprs( //dir=expr + unique int id: @auto_closure_expr +); + +await_exprs( //dir=expr + unique int id: @await_expr +); + +binary_exprs( //dir=expr + unique int id: @binary_expr +); + +borrow_exprs( //dir=expr + unique int id: @borrow_expr +); + +bridge_from_obj_c_exprs( //dir=expr + unique int id: @bridge_from_obj_c_expr +); + +bridge_to_obj_c_exprs( //dir=expr + unique int id: @bridge_to_obj_c_expr +); + +@builtin_literal_expr = + @boolean_literal_expr +| @magic_identifier_literal_expr +| @number_literal_expr +| @string_literal_expr +; + +call_exprs( //dir=expr + unique int id: @call_expr +); + +@checked_cast_expr = + @conditional_checked_cast_expr +| @forced_checked_cast_expr +| @is_expr +; + +class_metatype_to_object_exprs( //dir=expr + unique int id: @class_metatype_to_object_expr +); + +coerce_exprs( //dir=expr + unique int id: @coerce_expr +); + +collection_upcast_conversion_exprs( //dir=expr + unique int id: @collection_upcast_conversion_expr +); + +conditional_bridge_from_obj_c_exprs( //dir=expr + unique int id: @conditional_bridge_from_obj_c_expr +); + +covariant_function_conversion_exprs( //dir=expr + unique int id: @covariant_function_conversion_expr +); + +covariant_return_conversion_exprs( //dir=expr + unique int id: @covariant_return_conversion_expr +); + +derived_to_base_exprs( //dir=expr + unique int id: @derived_to_base_expr +); + +destructure_tuple_exprs( //dir=expr + unique int id: @destructure_tuple_expr +); + +dictionary_exprs( //dir=expr + unique int id: @dictionary_expr +); + +#keyset[id, index] +dictionary_expr_elements( //dir=expr + int id: @dictionary_expr ref, + int index: int ref, + int element: @expr_or_none ref +); + +differentiable_function_exprs( //dir=expr + unique int id: @differentiable_function_expr +); + +differentiable_function_extract_original_exprs( //dir=expr + unique int id: @differentiable_function_extract_original_expr +); + +dot_self_exprs( //dir=expr + unique int id: @dot_self_expr +); + +@dynamic_lookup_expr = + @dynamic_member_ref_expr +| @dynamic_subscript_expr +; + +erasure_exprs( //dir=expr + unique int id: @erasure_expr +); + +existential_metatype_to_object_exprs( //dir=expr + unique int id: @existential_metatype_to_object_expr +); + +explicit_closure_exprs( //dir=expr + unique int id: @explicit_closure_expr +); + +force_try_exprs( //dir=expr + unique int id: @force_try_expr +); + +foreign_object_conversion_exprs( //dir=expr + unique int id: @foreign_object_conversion_expr +); + +function_conversion_exprs( //dir=expr + unique int id: @function_conversion_expr +); + +in_out_to_pointer_exprs( //dir=expr + unique int id: @in_out_to_pointer_expr +); + +inject_into_optional_exprs( //dir=expr + unique int id: @inject_into_optional_expr +); + +interpolated_string_literal_exprs( //dir=expr + unique int id: @interpolated_string_literal_expr +); + +#keyset[id] +interpolated_string_literal_expr_interpolation_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int interpolation_expr: @opaque_value_expr_or_none ref +); + +#keyset[id] +interpolated_string_literal_expr_appending_exprs( //dir=expr + int id: @interpolated_string_literal_expr ref, + int appending_expr: @tap_expr_or_none ref +); + +linear_function_exprs( //dir=expr + unique int id: @linear_function_expr +); + +linear_function_extract_original_exprs( //dir=expr + unique int id: @linear_function_extract_original_expr +); + +linear_to_differentiable_function_exprs( //dir=expr + unique int id: @linear_to_differentiable_function_expr +); + +load_exprs( //dir=expr + unique int id: @load_expr +); + +member_ref_exprs( //dir=expr + unique int id: @member_ref_expr +); + +#keyset[id] +member_ref_expr_has_direct_to_storage_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_ordinary_semantics( //dir=expr + int id: @member_ref_expr ref +); + +#keyset[id] +member_ref_expr_has_distributed_thunk_semantics( //dir=expr + int id: @member_ref_expr ref +); + +metatype_conversion_exprs( //dir=expr + unique int id: @metatype_conversion_expr +); + +nil_literal_exprs( //dir=expr + unique int id: @nil_literal_expr +); + +object_literal_exprs( //dir=expr + unique int id: @object_literal_expr, + int kind: int ref +); + +#keyset[id, index] +object_literal_expr_arguments( //dir=expr + int id: @object_literal_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +optional_try_exprs( //dir=expr + unique int id: @optional_try_expr +); + +paren_exprs( //dir=expr + unique int id: @paren_expr +); + +pointer_to_pointer_exprs( //dir=expr + unique int id: @pointer_to_pointer_expr +); + +postfix_unary_exprs( //dir=expr + unique int id: @postfix_unary_expr +); + +prefix_unary_exprs( //dir=expr + unique int id: @prefix_unary_expr +); + +protocol_metatype_to_object_exprs( //dir=expr + unique int id: @protocol_metatype_to_object_expr +); + +regex_literal_exprs( //dir=expr + unique int id: @regex_literal_expr, + string pattern: string ref, + int version: int ref +); + +@self_apply_expr = + @dot_syntax_call_expr +| @initializer_ref_call_expr +; + +#keyset[id] +self_apply_exprs( //dir=expr + int id: @self_apply_expr ref, + int base: @expr_or_none ref +); + +string_to_pointer_exprs( //dir=expr + unique int id: @string_to_pointer_expr +); + +subscript_exprs( //dir=expr + unique int id: @subscript_expr +); + +#keyset[id, index] +subscript_expr_arguments( //dir=expr + int id: @subscript_expr ref, + int index: int ref, + int argument: @argument_or_none ref +); + +#keyset[id] +subscript_expr_has_direct_to_storage_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_direct_to_implementation_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_ordinary_semantics( //dir=expr + int id: @subscript_expr ref +); + +#keyset[id] +subscript_expr_has_distributed_thunk_semantics( //dir=expr + int id: @subscript_expr ref +); + +try_exprs( //dir=expr + unique int id: @try_expr +); + +underlying_to_opaque_exprs( //dir=expr + unique int id: @underlying_to_opaque_expr +); + +unevaluated_instance_exprs( //dir=expr + unique int id: @unevaluated_instance_expr +); + +unreachable_exprs( //dir=expr + unique int id: @unreachable_expr +); + +unresolved_member_chain_result_exprs( //dir=expr + unique int id: @unresolved_member_chain_result_expr +); + +unresolved_type_conversion_exprs( //dir=expr + unique int id: @unresolved_type_conversion_expr +); + +unsafe_cast_exprs( //dir=expr + unique int id: @unsafe_cast_expr +); + +unsafe_exprs( //dir=expr + unique int id: @unsafe_expr +); + +boolean_literal_exprs( //dir=expr + unique int id: @boolean_literal_expr, + boolean value: boolean ref +); + +conditional_checked_cast_exprs( //dir=expr + unique int id: @conditional_checked_cast_expr +); + +dot_syntax_call_exprs( //dir=expr + unique int id: @dot_syntax_call_expr +); + +dynamic_member_ref_exprs( //dir=expr + unique int id: @dynamic_member_ref_expr +); + +dynamic_subscript_exprs( //dir=expr + unique int id: @dynamic_subscript_expr +); + +forced_checked_cast_exprs( //dir=expr + unique int id: @forced_checked_cast_expr +); + +initializer_ref_call_exprs( //dir=expr + unique int id: @initializer_ref_call_expr +); + +is_exprs( //dir=expr + unique int id: @is_expr +); + +magic_identifier_literal_exprs( //dir=expr + unique int id: @magic_identifier_literal_expr, + string kind: string ref +); + +@number_literal_expr = + @float_literal_expr +| @integer_literal_expr +; + +string_literal_exprs( //dir=expr + unique int id: @string_literal_expr, + string value: string ref +); + +float_literal_exprs( //dir=expr + unique int id: @float_literal_expr, + string string_value: string ref +); + +integer_literal_exprs( //dir=expr + unique int id: @integer_literal_expr, + string string_value: string ref +); + +@pattern = + @any_pattern +| @binding_pattern +| @bool_pattern +| @enum_element_pattern +| @expr_pattern +| @is_pattern +| @named_pattern +| @optional_some_pattern +| @paren_pattern +| @tuple_pattern +| @typed_pattern +; + +#keyset[id] +pattern_types( //dir=pattern + int id: @pattern ref, + int type_: @type_or_none ref +); + +any_patterns( //dir=pattern + unique int id: @any_pattern +); + +binding_patterns( //dir=pattern + unique int id: @binding_pattern, + int sub_pattern: @pattern_or_none ref +); + +bool_patterns( //dir=pattern + unique int id: @bool_pattern, + boolean value: boolean ref +); + +enum_element_patterns( //dir=pattern + unique int id: @enum_element_pattern, + int element: @enum_element_decl_or_none ref +); + +#keyset[id] +enum_element_pattern_sub_patterns( //dir=pattern + int id: @enum_element_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +expr_patterns( //dir=pattern + unique int id: @expr_pattern, + int sub_expr: @expr_or_none ref +); + +is_patterns( //dir=pattern + unique int id: @is_pattern +); + +#keyset[id] +is_pattern_cast_type_reprs( //dir=pattern + int id: @is_pattern ref, + int cast_type_repr: @type_repr_or_none ref +); + +#keyset[id] +is_pattern_sub_patterns( //dir=pattern + int id: @is_pattern ref, + int sub_pattern: @pattern_or_none ref +); + +named_patterns( //dir=pattern + unique int id: @named_pattern, + int var_decl: @var_decl_or_none ref +); + +optional_some_patterns( //dir=pattern + unique int id: @optional_some_pattern, + int sub_pattern: @pattern_or_none ref +); + +paren_patterns( //dir=pattern + unique int id: @paren_pattern, + int sub_pattern: @pattern_or_none ref +); + +tuple_patterns( //dir=pattern + unique int id: @tuple_pattern +); + +#keyset[id, index] +tuple_pattern_elements( //dir=pattern + int id: @tuple_pattern ref, + int index: int ref, + int element: @pattern_or_none ref +); + +typed_patterns( //dir=pattern + unique int id: @typed_pattern, + int sub_pattern: @pattern_or_none ref +); + +#keyset[id] +typed_pattern_type_reprs( //dir=pattern + int id: @typed_pattern ref, + int type_repr: @type_repr_or_none ref +); + +case_label_items( //dir=stmt + unique int id: @case_label_item, + int pattern: @pattern_or_none ref +); + +#keyset[id] +case_label_item_guards( //dir=stmt + int id: @case_label_item ref, + int guard: @expr_or_none ref +); + +condition_elements( //dir=stmt + unique int id: @condition_element +); + +#keyset[id] +condition_element_booleans( //dir=stmt + int id: @condition_element ref, + int boolean_: @expr_or_none ref +); + +#keyset[id] +condition_element_patterns( //dir=stmt + int id: @condition_element ref, + int pattern: @pattern_or_none ref +); + +#keyset[id] +condition_element_initializers( //dir=stmt + int id: @condition_element ref, + int initializer: @expr_or_none ref +); + +#keyset[id] +condition_element_availabilities( //dir=stmt + int id: @condition_element ref, + int availability: @availability_info_or_none ref +); + +@stmt = + @brace_stmt +| @break_stmt +| @case_stmt +| @continue_stmt +| @defer_stmt +| @discard_stmt +| @fail_stmt +| @fallthrough_stmt +| @labeled_stmt +| @pound_assert_stmt +| @return_stmt +| @then_stmt +| @throw_stmt +| @yield_stmt +; + +stmt_conditions( //dir=stmt + unique int id: @stmt_condition +); + +#keyset[id, index] +stmt_condition_elements( //dir=stmt + int id: @stmt_condition ref, + int index: int ref, + int element: @condition_element_or_none ref +); + +brace_stmts( //dir=stmt + unique int id: @brace_stmt +); + +#keyset[id, index] +brace_stmt_elements( //dir=stmt + int id: @brace_stmt ref, + int index: int ref, + int element: @ast_node_or_none ref +); + +break_stmts( //dir=stmt + unique int id: @break_stmt +); + +#keyset[id] +break_stmt_target_names( //dir=stmt + int id: @break_stmt ref, + string target_name: string ref +); + +#keyset[id] +break_stmt_targets( //dir=stmt + int id: @break_stmt ref, + int target: @stmt_or_none ref +); + +case_stmts( //dir=stmt + unique int id: @case_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +case_stmt_labels( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int label: @case_label_item_or_none ref +); + +#keyset[id, index] +case_stmt_variables( //dir=stmt + int id: @case_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +continue_stmts( //dir=stmt + unique int id: @continue_stmt +); + +#keyset[id] +continue_stmt_target_names( //dir=stmt + int id: @continue_stmt ref, + string target_name: string ref +); + +#keyset[id] +continue_stmt_targets( //dir=stmt + int id: @continue_stmt ref, + int target: @stmt_or_none ref +); + +defer_stmts( //dir=stmt + unique int id: @defer_stmt, + int body: @brace_stmt_or_none ref +); + +discard_stmts( //dir=stmt + unique int id: @discard_stmt, + int sub_expr: @expr_or_none ref +); + +fail_stmts( //dir=stmt + unique int id: @fail_stmt +); + +fallthrough_stmts( //dir=stmt + unique int id: @fallthrough_stmt, + int fallthrough_source: @case_stmt_or_none ref, + int fallthrough_dest: @case_stmt_or_none ref +); + +@labeled_stmt = + @do_catch_stmt +| @do_stmt +| @for_each_stmt +| @labeled_conditional_stmt +| @repeat_while_stmt +| @switch_stmt +; + +#keyset[id] +labeled_stmt_labels( //dir=stmt + int id: @labeled_stmt ref, + string label: string ref +); + +pound_assert_stmts( //dir=stmt + unique int id: @pound_assert_stmt, + int condition: @expr_or_none ref, + string message: string ref +); + +return_stmts( //dir=stmt + unique int id: @return_stmt +); + +#keyset[id] +return_stmt_results( //dir=stmt + int id: @return_stmt ref, + int result: @expr_or_none ref +); + +then_stmts( //dir=stmt + unique int id: @then_stmt, + int result: @expr_or_none ref +); + +throw_stmts( //dir=stmt + unique int id: @throw_stmt, + int sub_expr: @expr_or_none ref +); + +yield_stmts( //dir=stmt + unique int id: @yield_stmt +); + +#keyset[id, index] +yield_stmt_results( //dir=stmt + int id: @yield_stmt ref, + int index: int ref, + int result: @expr_or_none ref +); + +do_catch_stmts( //dir=stmt + unique int id: @do_catch_stmt, + int body: @stmt_or_none ref +); + +#keyset[id, index] +do_catch_stmt_catches( //dir=stmt + int id: @do_catch_stmt ref, + int index: int ref, + int catch: @case_stmt_or_none ref +); + +do_stmts( //dir=stmt + unique int id: @do_stmt, + int body: @brace_stmt_or_none ref +); + +for_each_stmts( //dir=stmt + unique int id: @for_each_stmt, + int pattern: @pattern_or_none ref, + int body: @brace_stmt_or_none ref +); + +#keyset[id, index] +for_each_stmt_variables( //dir=stmt + int id: @for_each_stmt ref, + int index: int ref, + int variable: @var_decl_or_none ref +); + +#keyset[id] +for_each_stmt_wheres( //dir=stmt + int id: @for_each_stmt ref, + int where: @expr_or_none ref +); + +#keyset[id] +for_each_stmt_iterator_vars( //dir=stmt + int id: @for_each_stmt ref, + int iteratorVar: @pattern_binding_decl_or_none ref +); + +#keyset[id] +for_each_stmt_next_calls( //dir=stmt + int id: @for_each_stmt ref, + int nextCall: @expr_or_none ref +); + +@labeled_conditional_stmt = + @guard_stmt +| @if_stmt +| @while_stmt +; + +#keyset[id] +labeled_conditional_stmts( //dir=stmt + int id: @labeled_conditional_stmt ref, + int condition: @stmt_condition_or_none ref +); + +repeat_while_stmts( //dir=stmt + unique int id: @repeat_while_stmt, + int condition: @expr_or_none ref, + int body: @stmt_or_none ref +); + +switch_stmts( //dir=stmt + unique int id: @switch_stmt, + int expr: @expr_or_none ref +); + +#keyset[id, index] +switch_stmt_cases( //dir=stmt + int id: @switch_stmt ref, + int index: int ref, + int case_: @case_stmt_or_none ref +); + +guard_stmts( //dir=stmt + unique int id: @guard_stmt, + int body: @brace_stmt_or_none ref +); + +if_stmts( //dir=stmt + unique int id: @if_stmt, + int then: @stmt_or_none ref +); + +#keyset[id] +if_stmt_elses( //dir=stmt + int id: @if_stmt ref, + int else: @stmt_or_none ref +); + +while_stmts( //dir=stmt + unique int id: @while_stmt, + int body: @stmt_or_none ref +); + +@type = + @any_function_type +| @any_generic_type +| @any_metatype_type +| @builtin_type +| @dependent_member_type +| @dynamic_self_type +| @error_type +| @existential_type +| @in_out_type +| @integer_type +| @l_value_type +| @module_type +| @pack_element_type +| @pack_expansion_type +| @pack_type +| @parameterized_protocol_type +| @protocol_composition_type +| @reference_storage_type +| @substitutable_type +| @sugar_type +| @tuple_type +| @unresolved_type +; + +#keyset[id] +types( //dir=type + int id: @type ref, + string name: string ref, + int canonical_type: @type_or_none ref +); + +type_reprs( //dir=type + unique int id: @type_repr, + int type_: @type_or_none ref +); + +@any_function_type = + @function_type +| @generic_function_type +; + +#keyset[id] +any_function_types( //dir=type + int id: @any_function_type ref, + int result: @type_or_none ref +); + +#keyset[id, index] +any_function_type_param_types( //dir=type + int id: @any_function_type ref, + int index: int ref, + int param_type: @type_or_none ref +); + +#keyset[id] +any_function_type_is_throwing( //dir=type + int id: @any_function_type ref +); + +#keyset[id] +any_function_type_is_async( //dir=type + int id: @any_function_type ref +); + +@any_generic_type = + @nominal_or_bound_generic_nominal_type +| @unbound_generic_type +; + +#keyset[id] +any_generic_types( //dir=type + int id: @any_generic_type ref, + int declaration: @generic_type_decl_or_none ref +); + +#keyset[id] +any_generic_type_parents( //dir=type + int id: @any_generic_type ref, + int parent: @type_or_none ref +); + +@any_metatype_type = + @existential_metatype_type +| @metatype_type +; + +@builtin_type = + @any_builtin_integer_type +| @builtin_bridge_object_type +| @builtin_default_actor_storage_type +| @builtin_executor_type +| @builtin_float_type +| @builtin_generic_type +| @builtin_job_type +| @builtin_native_object_type +| @builtin_raw_pointer_type +| @builtin_raw_unsafe_continuation_type +| @builtin_unsafe_value_buffer_type +| @builtin_vector_type +; + +dependent_member_types( //dir=type + unique int id: @dependent_member_type, + int base_type: @type_or_none ref, + int associated_type_decl: @associated_type_decl_or_none ref +); + +dynamic_self_types( //dir=type + unique int id: @dynamic_self_type, + int static_self_type: @type_or_none ref +); + +error_types( //dir=type + unique int id: @error_type +); + +existential_types( //dir=type + unique int id: @existential_type, + int constraint: @type_or_none ref +); + +in_out_types( //dir=type + unique int id: @in_out_type, + int object_type: @type_or_none ref +); + +integer_types( //dir=type + unique int id: @integer_type, + string value: string ref +); + +l_value_types( //dir=type + unique int id: @l_value_type, + int object_type: @type_or_none ref +); + +module_types( //dir=type + unique int id: @module_type, + int module: @module_decl_or_none ref +); + +pack_element_types( //dir=type + unique int id: @pack_element_type, + int pack_type: @type_or_none ref +); + +pack_expansion_types( //dir=type + unique int id: @pack_expansion_type, + int pattern_type: @type_or_none ref, + int count_type: @type_or_none ref +); + +pack_types( //dir=type + unique int id: @pack_type +); + +#keyset[id, index] +pack_type_elements( //dir=type + int id: @pack_type ref, + int index: int ref, + int element: @type_or_none ref +); + +parameterized_protocol_types( //dir=type + unique int id: @parameterized_protocol_type, + int base: @protocol_type_or_none ref +); + +#keyset[id, index] +parameterized_protocol_type_args( //dir=type + int id: @parameterized_protocol_type ref, + int index: int ref, + int arg: @type_or_none ref +); + +protocol_composition_types( //dir=type + unique int id: @protocol_composition_type +); + +#keyset[id, index] +protocol_composition_type_members( //dir=type + int id: @protocol_composition_type ref, + int index: int ref, + int member: @type_or_none ref +); + +@reference_storage_type = + @unmanaged_storage_type +| @unowned_storage_type +| @weak_storage_type +; + +#keyset[id] +reference_storage_types( //dir=type + int id: @reference_storage_type ref, + int referent_type: @type_or_none ref +); + +@substitutable_type = + @archetype_type +| @generic_type_param_type +; + +@sugar_type = + @paren_type +| @syntax_sugar_type +| @type_alias_type +; + +tuple_types( //dir=type + unique int id: @tuple_type +); + +#keyset[id, index] +tuple_type_types( //dir=type + int id: @tuple_type ref, + int index: int ref, + int type_: @type_or_none ref +); + +#keyset[id, index] +tuple_type_names( //dir=type + int id: @tuple_type ref, + int index: int ref, + string name: string ref +); + +unresolved_types( //dir=type + unique int id: @unresolved_type +); + +@any_builtin_integer_type = + @builtin_integer_literal_type +| @builtin_integer_type +; + +@archetype_type = + @local_archetype_type +| @opaque_type_archetype_type +| @pack_archetype_type +| @primary_archetype_type +; + +#keyset[id] +archetype_types( //dir=type + int id: @archetype_type ref, + int interface_type: @type_or_none ref +); + +#keyset[id] +archetype_type_superclasses( //dir=type + int id: @archetype_type ref, + int superclass: @type_or_none ref +); + +#keyset[id, index] +archetype_type_protocols( //dir=type + int id: @archetype_type ref, + int index: int ref, + int protocol: @protocol_decl_or_none ref +); + +builtin_bridge_object_types( //dir=type + unique int id: @builtin_bridge_object_type +); + +builtin_default_actor_storage_types( //dir=type + unique int id: @builtin_default_actor_storage_type +); + +builtin_executor_types( //dir=type + unique int id: @builtin_executor_type +); + +builtin_float_types( //dir=type + unique int id: @builtin_float_type +); + +@builtin_generic_type = + @builtin_fixed_array_type +; + +builtin_job_types( //dir=type + unique int id: @builtin_job_type +); + +builtin_native_object_types( //dir=type + unique int id: @builtin_native_object_type +); + +builtin_raw_pointer_types( //dir=type + unique int id: @builtin_raw_pointer_type +); + +builtin_raw_unsafe_continuation_types( //dir=type + unique int id: @builtin_raw_unsafe_continuation_type +); + +builtin_unsafe_value_buffer_types( //dir=type + unique int id: @builtin_unsafe_value_buffer_type +); + +builtin_vector_types( //dir=type + unique int id: @builtin_vector_type +); + +existential_metatype_types( //dir=type + unique int id: @existential_metatype_type +); + +function_types( //dir=type + unique int id: @function_type +); + +generic_function_types( //dir=type + unique int id: @generic_function_type +); + +#keyset[id, index] +generic_function_type_generic_params( //dir=type + int id: @generic_function_type ref, + int index: int ref, + int generic_param: @generic_type_param_type_or_none ref +); + +generic_type_param_types( //dir=type + unique int id: @generic_type_param_type +); + +metatype_types( //dir=type + unique int id: @metatype_type +); + +@nominal_or_bound_generic_nominal_type = + @bound_generic_type +| @nominal_type +; + +paren_types( //dir=type + unique int id: @paren_type, + int type_: @type_or_none ref +); + +@syntax_sugar_type = + @dictionary_type +| @inline_array_type +| @unary_syntax_sugar_type +; + +type_alias_types( //dir=type + unique int id: @type_alias_type, + int decl: @type_alias_decl_or_none ref +); + +unbound_generic_types( //dir=type + unique int id: @unbound_generic_type +); + +unmanaged_storage_types( //dir=type + unique int id: @unmanaged_storage_type +); + +unowned_storage_types( //dir=type + unique int id: @unowned_storage_type +); + +weak_storage_types( //dir=type + unique int id: @weak_storage_type +); + +@bound_generic_type = + @bound_generic_class_type +| @bound_generic_enum_type +| @bound_generic_struct_type +; + +#keyset[id, index] +bound_generic_type_arg_types( //dir=type + int id: @bound_generic_type ref, + int index: int ref, + int arg_type: @type_or_none ref +); + +builtin_fixed_array_types( //dir=type + unique int id: @builtin_fixed_array_type, + int size: @type_or_none ref, + int element_type: @type_or_none ref +); + +builtin_integer_literal_types( //dir=type + unique int id: @builtin_integer_literal_type +); + +builtin_integer_types( //dir=type + unique int id: @builtin_integer_type +); + +#keyset[id] +builtin_integer_type_widths( //dir=type + int id: @builtin_integer_type ref, + int width: int ref +); + +dictionary_types( //dir=type + unique int id: @dictionary_type, + int key_type: @type_or_none ref, + int value_type: @type_or_none ref +); + +inline_array_types( //dir=type + unique int id: @inline_array_type, + int count_type: @type_or_none ref, + int element_type: @type_or_none ref +); + +@local_archetype_type = + @element_archetype_type +| @existential_archetype_type +; + +@nominal_type = + @class_type +| @enum_type +| @protocol_type +| @struct_type +; + +opaque_type_archetype_types( //dir=type + unique int id: @opaque_type_archetype_type, + int declaration: @opaque_type_decl_or_none ref +); + +pack_archetype_types( //dir=type + unique int id: @pack_archetype_type +); + +primary_archetype_types( //dir=type + unique int id: @primary_archetype_type +); + +@unary_syntax_sugar_type = + @array_slice_type +| @optional_type +| @variadic_sequence_type +; + +#keyset[id] +unary_syntax_sugar_types( //dir=type + int id: @unary_syntax_sugar_type ref, + int base_type: @type_or_none ref +); + +array_slice_types( //dir=type + unique int id: @array_slice_type +); + +bound_generic_class_types( //dir=type + unique int id: @bound_generic_class_type +); + +bound_generic_enum_types( //dir=type + unique int id: @bound_generic_enum_type +); + +bound_generic_struct_types( //dir=type + unique int id: @bound_generic_struct_type +); + +class_types( //dir=type + unique int id: @class_type +); + +element_archetype_types( //dir=type + unique int id: @element_archetype_type +); + +enum_types( //dir=type + unique int id: @enum_type +); + +existential_archetype_types( //dir=type + unique int id: @existential_archetype_type +); + +optional_types( //dir=type + unique int id: @optional_type +); + +protocol_types( //dir=type + unique int id: @protocol_type +); + +struct_types( //dir=type + unique int id: @struct_type +); + +variadic_sequence_types( //dir=type + unique int id: @variadic_sequence_type +); + +@accessor_or_none = + @accessor +| @unspecified_element +; + +@argument_or_none = + @argument +| @unspecified_element +; + +@associated_type_decl_or_none = + @associated_type_decl +| @unspecified_element +; + +@ast_node_or_none = + @ast_node +| @unspecified_element +; + +@availability_info_or_none = + @availability_info +| @unspecified_element +; + +@availability_spec_or_none = + @availability_spec +| @unspecified_element +; + +@brace_stmt_or_none = + @brace_stmt +| @unspecified_element +; + +@captured_decl_or_none = + @captured_decl +| @unspecified_element +; + +@case_label_item_or_none = + @case_label_item +| @unspecified_element +; + +@case_stmt_or_none = + @case_stmt +| @unspecified_element +; + +@closure_expr_or_none = + @closure_expr +| @unspecified_element +; + +@condition_element_or_none = + @condition_element +| @unspecified_element +; + +@decl_or_none = + @decl +| @unspecified_element +; + +@enum_element_decl_or_none = + @enum_element_decl +| @unspecified_element +; + +@expr_or_none = + @expr +| @unspecified_element +; + +@file_or_none = + @file +| @unspecified_element +; + +@function_or_none = + @function +| @unspecified_element +; + +@generic_type_decl_or_none = + @generic_type_decl +| @unspecified_element +; + +@generic_type_param_decl_or_none = + @generic_type_param_decl +| @unspecified_element +; + +@generic_type_param_type_or_none = + @generic_type_param_type +| @unspecified_element +; + +@initializer_or_none = + @initializer +| @unspecified_element +; + +@key_path_component_or_none = + @key_path_component +| @unspecified_element +; + +@location_or_none = + @location +| @unspecified_element +; + +@macro_role_or_none = + @macro_role +| @unspecified_element +; + +@module_decl_or_none = + @module_decl +| @unspecified_element +; + +@nominal_type_decl_or_none = + @nominal_type_decl +| @unspecified_element +; + +@opaque_type_decl_or_none = + @opaque_type_decl +| @unspecified_element +; + +@opaque_value_expr_or_none = + @opaque_value_expr +| @unspecified_element +; + +@param_decl_or_none = + @param_decl +| @unspecified_element +; + +@pattern_or_none = + @pattern +| @unspecified_element +; + +@pattern_binding_decl_or_none = + @pattern_binding_decl +| @unspecified_element +; + +@precedence_group_decl_or_none = + @precedence_group_decl +| @unspecified_element +; + +@protocol_decl_or_none = + @protocol_decl +| @unspecified_element +; + +@protocol_type_or_none = + @protocol_type +| @unspecified_element +; + +@stmt_or_none = + @stmt +| @unspecified_element +; + +@stmt_condition_or_none = + @stmt_condition +| @unspecified_element +; + +@string_literal_expr_or_none = + @string_literal_expr +| @unspecified_element +; + +@tap_expr_or_none = + @tap_expr +| @unspecified_element +; + +@type_or_none = + @type +| @unspecified_element +; + +@type_alias_decl_or_none = + @type_alias_decl +| @unspecified_element +; + +@type_repr_or_none = + @type_repr +| @unspecified_element +; + +@value_decl_or_none = + @unspecified_element +| @value_decl +; + +@var_decl_or_none = + @unspecified_element +| @var_decl +; diff --git a/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/upgrade.properties b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/upgrade.properties new file mode 100644 index 000000000000..270852cf8512 --- /dev/null +++ b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/upgrade.properties @@ -0,0 +1,4 @@ +description: Expose declared interface types +compatibility: backwards +type_decls.rel: run upgrade.ql new_type_decls +unspecified_elements.rel: run upgrade.ql new_unspecified_elements diff --git a/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/upgrade.ql b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/upgrade.ql new file mode 100644 index 000000000000..3ecfd00badbb --- /dev/null +++ b/swift/ql/lib/upgrades/5738be6bb04742c424efdbf9f4de11f0b10fa37d/upgrade.ql @@ -0,0 +1,29 @@ +class TypeDecl extends @type_decl { + string toString() { none() } +} + +newtype TAddedElement = TType(TypeDecl t) + +module Fresh = QlBuiltins::NewEntity; + +class TNewElement = @element or Fresh::EntityId; + +class NewElement extends TNewElement { + string toString() { none() } +} + +query predicate new_type_decls(TypeDecl typeDecl, string name, NewElement elementType) { + type_decls(typeDecl, name) and + Fresh::map(TType(typeDecl)) = elementType +} + +query predicate new_unspecified_elements(NewElement id, string property, string error) { + unspecified_elements(id, property, error) + or + exists(TypeDecl typeDecl | type_decls(typeDecl, _) | + id = Fresh::map(TType(typeDecl)) and + error = + "TypeDecl declared interface type missing after upgrade. Please update your CodeQL code." and + property = "" + ) +} diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 26d9123f0501..5354c5ee4d5f 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.2 +version: 1.3.3-dev groups: - swift - queries diff --git a/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.expected b/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.expected index 9daa87b09ccd..474fb0ab2e6f 100644 --- a/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.expected @@ -1,6 +1,6 @@ instances -| associated_type.swift:2:5:2:20 | Bar | getModule: | file://:0:0:0:0 | associated_type | getInterfaceType: | Self.Bar.Type | getName: | Bar | -| associated_type.swift:3:5:3:25 | Baz | getModule: | file://:0:0:0:0 | associated_type | getInterfaceType: | Self.Baz.Type | getName: | Baz | +| associated_type.swift:2:5:2:20 | Bar | getModule: | file://:0:0:0:0 | associated_type | getInterfaceType: | Self.Bar.Type | getName: | Bar | getDeclaredInterfaceType: | Self.Bar | +| associated_type.swift:3:5:3:25 | Baz | getModule: | file://:0:0:0:0 | associated_type | getInterfaceType: | Self.Baz.Type | getName: | Baz | getDeclaredInterfaceType: | Self.Baz | getMember getInheritedType | associated_type.swift:3:5:3:25 | Baz | 0 | Equatable | diff --git a/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.ql b/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.ql index 41cc9d349a43..8788784b044d 100644 --- a/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.ql +++ b/swift/ql/test/extractor-tests/generated/decl/AssociatedTypeDecl/AssociatedTypeDecl.ql @@ -4,7 +4,8 @@ import TestUtils query predicate instances( AssociatedTypeDecl x, string getModule__label, ModuleDecl getModule, - string getInterfaceType__label, Type getInterfaceType, string getName__label, string getName + string getInterfaceType__label, Type getInterfaceType, string getName__label, string getName, + string getDeclaredInterfaceType__label, Type getDeclaredInterfaceType ) { toBeTested(x) and not x.isUnknown() and @@ -13,7 +14,9 @@ query predicate instances( getInterfaceType__label = "getInterfaceType:" and getInterfaceType = x.getInterfaceType() and getName__label = "getName:" and - getName = x.getName() + getName = x.getName() and + getDeclaredInterfaceType__label = "getDeclaredInterfaceType:" and + getDeclaredInterfaceType = x.getDeclaredInterfaceType() } query predicate getMember(AssociatedTypeDecl x, int index, Decl getMember) { diff --git a/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.expected b/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.expected index b15a1cc649df..a9054efb302b 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.expected @@ -1,7 +1,7 @@ instances -| class.swift:1:1:7:1 | Foo | getModule: | file://:0:0:0:0 | class | getInterfaceType: | Foo.Type | getName: | Foo | getType: | Foo | -| class.swift:11:1:14:1 | Generic | getModule: | file://:0:0:0:0 | class | getInterfaceType: | Generic.Type | getName: | Generic | getType: | Generic | -| class.swift:16:1:17:1 | Baz | getModule: | file://:0:0:0:0 | class | getInterfaceType: | Baz.Type | getName: | Baz | getType: | Baz | +| class.swift:1:1:7:1 | Foo | getModule: | file://:0:0:0:0 | class | getInterfaceType: | Foo.Type | getName: | Foo | getDeclaredInterfaceType: | Foo | getType: | Foo | +| class.swift:11:1:14:1 | Generic | getModule: | file://:0:0:0:0 | class | getInterfaceType: | Generic.Type | getName: | Generic | getDeclaredInterfaceType: | Generic | getType: | Generic | +| class.swift:16:1:17:1 | Baz | getModule: | file://:0:0:0:0 | class | getInterfaceType: | Baz.Type | getName: | Baz | getDeclaredInterfaceType: | Baz | getType: | Baz | getGenericTypeParam | class.swift:11:1:14:1 | Generic | 0 | class.swift:11:15:11:15 | X | | class.swift:11:1:14:1 | Generic | 1 | class.swift:11:18:11:18 | Y | diff --git a/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql b/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql index e32a98ca2bc0..620a77295d9f 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql +++ b/swift/ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql @@ -4,7 +4,9 @@ import TestUtils query predicate instances( ClassDecl x, string getModule__label, ModuleDecl getModule, string getInterfaceType__label, - Type getInterfaceType, string getName__label, string getName, string getType__label, Type getType + Type getInterfaceType, string getName__label, string getName, + string getDeclaredInterfaceType__label, Type getDeclaredInterfaceType, string getType__label, + Type getType ) { toBeTested(x) and not x.isUnknown() and @@ -14,6 +16,8 @@ query predicate instances( getInterfaceType = x.getInterfaceType() and getName__label = "getName:" and getName = x.getName() and + getDeclaredInterfaceType__label = "getDeclaredInterfaceType:" and + getDeclaredInterfaceType = x.getDeclaredInterfaceType() and getType__label = "getType:" and getType = x.getType() } diff --git a/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.expected b/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.expected index 06c1789b3bcc..2b71460a07c5 100644 --- a/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.expected @@ -1,9 +1,9 @@ instances -| enums.swift:1:1:4:1 | EnumValues | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumValues.Type | getName: | EnumValues | getType: | EnumValues | -| enums.swift:7:1:10:1 | EnumValuesWithBase | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumValuesWithBase.Type | getName: | EnumValuesWithBase | getType: | EnumValuesWithBase | -| enums.swift:12:1:16:1 | EnumWithParams | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumWithParams.Type | getName: | EnumWithParams | getType: | EnumWithParams | -| enums.swift:18:1:21:1 | GenericEnum | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | GenericEnum.Type | getName: | GenericEnum | getType: | GenericEnum | -| enums.swift:23:1:27:1 | EnumWithNamedParams | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumWithNamedParams.Type | getName: | EnumWithNamedParams | getType: | EnumWithNamedParams | +| enums.swift:1:1:4:1 | EnumValues | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumValues.Type | getName: | EnumValues | getDeclaredInterfaceType: | EnumValues | getType: | EnumValues | +| enums.swift:7:1:10:1 | EnumValuesWithBase | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumValuesWithBase.Type | getName: | EnumValuesWithBase | getDeclaredInterfaceType: | EnumValuesWithBase | getType: | EnumValuesWithBase | +| enums.swift:12:1:16:1 | EnumWithParams | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumWithParams.Type | getName: | EnumWithParams | getDeclaredInterfaceType: | EnumWithParams | getType: | EnumWithParams | +| enums.swift:18:1:21:1 | GenericEnum | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | GenericEnum.Type | getName: | GenericEnum | getDeclaredInterfaceType: | GenericEnum | getType: | GenericEnum | +| enums.swift:23:1:27:1 | EnumWithNamedParams | getModule: | file://:0:0:0:0 | enums | getInterfaceType: | EnumWithNamedParams.Type | getName: | EnumWithNamedParams | getDeclaredInterfaceType: | EnumWithNamedParams | getType: | EnumWithNamedParams | getGenericTypeParam | enums.swift:18:1:21:1 | GenericEnum | 0 | enums.swift:18:18:18:18 | T | getMember diff --git a/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.ql b/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.ql index dabf9078cea0..f5d9540c0f76 100644 --- a/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.ql +++ b/swift/ql/test/extractor-tests/generated/decl/EnumDecl/EnumDecl.ql @@ -4,7 +4,9 @@ import TestUtils query predicate instances( EnumDecl x, string getModule__label, ModuleDecl getModule, string getInterfaceType__label, - Type getInterfaceType, string getName__label, string getName, string getType__label, Type getType + Type getInterfaceType, string getName__label, string getName, + string getDeclaredInterfaceType__label, Type getDeclaredInterfaceType, string getType__label, + Type getType ) { toBeTested(x) and not x.isUnknown() and @@ -14,6 +16,8 @@ query predicate instances( getInterfaceType = x.getInterfaceType() and getName__label = "getName:" and getName = x.getName() and + getDeclaredInterfaceType__label = "getDeclaredInterfaceType:" and + getDeclaredInterfaceType = x.getDeclaredInterfaceType() and getType__label = "getType:" and getType = x.getType() } diff --git a/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.expected b/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.expected index 42d051d0a4ff..3c06d59b026b 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.expected @@ -1,7 +1,7 @@ instances -| file://:0:0:0:0 | Foo | getModule: | file://:0:0:0:0 | Foo | getInterfaceType: | module | getName: | Foo | isBuiltinModule: | no | isSystemModule: | no | -| file://:0:0:0:0 | __ObjC | getModule: | file://:0:0:0:0 | __ObjC | getInterfaceType: | module<__ObjC> | getName: | __ObjC | isBuiltinModule: | no | isSystemModule: | no | -| file://:0:0:0:0 | default_module_name | getModule: | file://:0:0:0:0 | default_module_name | getInterfaceType: | module | getName: | default_module_name | isBuiltinModule: | no | isSystemModule: | no | +| file://:0:0:0:0 | Foo | getModule: | file://:0:0:0:0 | Foo | getInterfaceType: | module | getName: | Foo | getDeclaredInterfaceType: | module | isBuiltinModule: | no | isSystemModule: | no | +| file://:0:0:0:0 | __ObjC | getModule: | file://:0:0:0:0 | __ObjC | getInterfaceType: | module<__ObjC> | getName: | __ObjC | getDeclaredInterfaceType: | module<__ObjC> | isBuiltinModule: | no | isSystemModule: | no | +| file://:0:0:0:0 | default_module_name | getModule: | file://:0:0:0:0 | default_module_name | getInterfaceType: | module | getName: | default_module_name | getDeclaredInterfaceType: | module | isBuiltinModule: | no | isSystemModule: | no | getMember getInheritedType getAnImportedModule diff --git a/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql b/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql index 911474839d40..89d5438e07cd 100644 --- a/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql +++ b/swift/ql/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql @@ -4,8 +4,10 @@ import TestUtils query predicate instances( ModuleDecl x, string getModule__label, ModuleDecl getModule, string getInterfaceType__label, - Type getInterfaceType, string getName__label, string getName, string isBuiltinModule__label, - string isBuiltinModule, string isSystemModule__label, string isSystemModule + Type getInterfaceType, string getName__label, string getName, + string getDeclaredInterfaceType__label, Type getDeclaredInterfaceType, + string isBuiltinModule__label, string isBuiltinModule, string isSystemModule__label, + string isSystemModule ) { toBeTested(x) and not x.isUnknown() and @@ -15,6 +17,8 @@ query predicate instances( getInterfaceType = x.getInterfaceType() and getName__label = "getName:" and getName = x.getName() and + getDeclaredInterfaceType__label = "getDeclaredInterfaceType:" and + getDeclaredInterfaceType = x.getDeclaredInterfaceType() and isBuiltinModule__label = "isBuiltinModule:" and (if x.isBuiltinModule() then isBuiltinModule = "yes" else isBuiltinModule = "no") and isSystemModule__label = "isSystemModule:" and diff --git a/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.expected b/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.expected index 8a5d39063f54..846aeea5bae7 100644 --- a/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.expected +++ b/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.expected @@ -1,8 +1,8 @@ instances -| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some Base).Type | getName: | _ | getNamingDeclaration: | opaque_types.swift:9:1:9:51 | baz(_:) | -| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some P).Type | getName: | _ | getNamingDeclaration: | opaque_types.swift:5:1:5:45 | bar(_:) | -| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some P).Type | getName: | _ | getNamingDeclaration: | opaque_types.swift:13:1:13:59 | bazz() | -| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some SignedInteger).Type | getName: | _ | getNamingDeclaration: | opaque_types.swift:1:1:1:45 | foo() | +| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some Base).Type | getName: | _ | getDeclaredInterfaceType: | some Base | getNamingDeclaration: | opaque_types.swift:9:1:9:51 | baz(_:) | +| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some P).Type | getName: | _ | getDeclaredInterfaceType: | some P | getNamingDeclaration: | opaque_types.swift:5:1:5:45 | bar(_:) | +| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some P).Type | getName: | _ | getDeclaredInterfaceType: | some P | getNamingDeclaration: | opaque_types.swift:13:1:13:59 | bazz() | +| file://:0:0:0:0 | _ | getModule: | file://:0:0:0:0 | opaque_types | getInterfaceType: | (some SignedInteger).Type | getName: | _ | getDeclaredInterfaceType: | some SignedInteger | getNamingDeclaration: | opaque_types.swift:1:1:1:45 | foo() | getGenericTypeParam getMember getInheritedType diff --git a/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.ql b/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.ql index 64b9149c1d00..aa34537f7ae8 100644 --- a/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.ql +++ b/swift/ql/test/extractor-tests/generated/decl/OpaqueTypeDecl/OpaqueTypeDecl.ql @@ -4,8 +4,9 @@ import TestUtils query predicate instances( OpaqueTypeDecl x, string getModule__label, ModuleDecl getModule, string getInterfaceType__label, - Type getInterfaceType, string getName__label, string getName, string getNamingDeclaration__label, - ValueDecl getNamingDeclaration + Type getInterfaceType, string getName__label, string getName, + string getDeclaredInterfaceType__label, Type getDeclaredInterfaceType, + string getNamingDeclaration__label, ValueDecl getNamingDeclaration ) { toBeTested(x) and not x.isUnknown() and @@ -15,6 +16,8 @@ query predicate instances( getInterfaceType = x.getInterfaceType() and getName__label = "getName:" and getName = x.getName() and + getDeclaredInterfaceType__label = "getDeclaredInterfaceType:" and + getDeclaredInterfaceType = x.getDeclaredInterfaceType() and getNamingDeclaration__label = "getNamingDeclaration:" and getNamingDeclaration = x.getNamingDeclaration() } 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..f8db62cedbc6 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,27 @@ 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:199:38:199:38 | passwordString | testCryptoKit.swift:199:38:199:53 | .utf8 | provenance | | +| testCryptoKit.swift:199:38:199:53 | .utf8 | testCryptoKit.swift:199:33:199: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:71:36:71:36 | passwd | semmle.label | passwd | +| testCryptoKit.swift:77:44:77:44 | 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:95:37:95:37 | passwd | semmle.label | passwd | +| testCryptoKit.swift:104:23:104:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:113:23:113:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:122:23:122:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:131:23:131:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:140:23:140:23 | passwd | semmle.label | passwd | +| testCryptoKit.swift:149:32:149:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:158:32:158:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:167:32:167:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:176:32:176:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:185:32:185:32 | passwd | semmle.label | passwd | +| testCryptoKit.swift:195:49:195:49 | passwordData | semmle.label | passwordData | +| testCryptoKit.swift:199:33:199:57 | call to Data.init(_:) | semmle.label | call to Data.init(_:) | +| testCryptoKit.swift:199:38:199:38 | passwordString | semmle.label | passwordString | +| testCryptoKit.swift:199:38:199: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 | @@ -48,22 +49,23 @@ nodes 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:71:36:71:36 | passwd | testCryptoKit.swift:71:36:71:36 | passwd | testCryptoKit.swift:71:36:71:36 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:71:36:71:36 | passwd | password (passwd) | +| testCryptoKit.swift:77:44:77:44 | passwd | testCryptoKit.swift:77:44:77:44 | passwd | testCryptoKit.swift:77:44:77:44 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:77:44:77:44 | 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 (SHA256) 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 (SHA384) depends on $@. | testCryptoKit.swift:89:37:89:37 | passwd | password (passwd) | +| testCryptoKit.swift:95:37:95:37 | passwd | testCryptoKit.swift:95:37:95:37 | passwd | testCryptoKit.swift:95:37:95:37 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:95:37:95:37 | passwd | password (passwd) | +| testCryptoKit.swift:104:23:104:23 | passwd | testCryptoKit.swift:104:23:104:23 | passwd | testCryptoKit.swift:104:23:104:23 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:104:23:104:23 | passwd | password (passwd) | +| testCryptoKit.swift:113:23:113:23 | passwd | testCryptoKit.swift:113:23:113:23 | passwd | testCryptoKit.swift:113:23:113:23 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:113:23:113:23 | passwd | password (passwd) | +| testCryptoKit.swift:122:23:122:23 | passwd | testCryptoKit.swift:122:23:122:23 | passwd | testCryptoKit.swift:122:23:122:23 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:122:23:122:23 | passwd | password (passwd) | +| testCryptoKit.swift:131:23:131:23 | passwd | testCryptoKit.swift:131:23:131:23 | passwd | testCryptoKit.swift:131:23:131:23 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:131:23:131:23 | passwd | password (passwd) | +| testCryptoKit.swift:140:23:140:23 | passwd | testCryptoKit.swift:140:23:140:23 | passwd | testCryptoKit.swift:140:23:140:23 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:140:23:140:23 | passwd | password (passwd) | +| testCryptoKit.swift:149:32:149:32 | passwd | testCryptoKit.swift:149:32:149:32 | passwd | testCryptoKit.swift:149:32:149:32 | passwd | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:149:32:149:32 | passwd | password (passwd) | +| testCryptoKit.swift:158:32:158:32 | passwd | testCryptoKit.swift:158:32:158:32 | passwd | testCryptoKit.swift:158:32:158:32 | passwd | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:158:32:158:32 | passwd | password (passwd) | +| testCryptoKit.swift:167:32:167:32 | passwd | testCryptoKit.swift:167:32:167:32 | passwd | testCryptoKit.swift:167:32:167:32 | passwd | Insecure hashing algorithm (SHA256) depends on $@. | testCryptoKit.swift:167:32:167:32 | passwd | password (passwd) | +| testCryptoKit.swift:176:32:176:32 | passwd | testCryptoKit.swift:176:32:176:32 | passwd | testCryptoKit.swift:176:32:176:32 | passwd | Insecure hashing algorithm (SHA384) depends on $@. | testCryptoKit.swift:176:32:176:32 | passwd | password (passwd) | +| testCryptoKit.swift:185:32:185:32 | passwd | testCryptoKit.swift:185:32:185:32 | passwd | testCryptoKit.swift:185:32:185:32 | passwd | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:185:32:185:32 | passwd | password (passwd) | +| testCryptoKit.swift:195:49:195:49 | passwordData | testCryptoKit.swift:195:49:195:49 | passwordData | testCryptoKit.swift:195:49:195:49 | passwordData | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:195:49:195:49 | passwordData | password (passwordData) | +| testCryptoKit.swift:199:33:199:57 | call to Data.init(_:) | testCryptoKit.swift:199:38:199:38 | passwordString | testCryptoKit.swift:199:33:199:57 | call to Data.init(_:) | Insecure hashing algorithm (SHA512) depends on $@. | testCryptoKit.swift:199:38:199: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..5da99db8068c 100644 --- a/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected +++ b/swift/ql/test/query-tests/Security/CWE-328/WeakSensitiveDataHashing.expected @@ -3,21 +3,24 @@ 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:72:36:72:36 | cert | semmle.label | cert | +| testCryptoKit.swift:74:36:74:36 | account_no | semmle.label | account_no | +| testCryptoKit.swift:75:36:75:36 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:78:44:78:44 | cert | semmle.label | cert | +| testCryptoKit.swift:80:44:80:44 | account_no | semmle.label | account_no | +| testCryptoKit.swift:81:44:81:44 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:105:23:105:23 | cert | semmle.label | cert | +| testCryptoKit.swift:107:23:107:23 | account_no | semmle.label | account_no | +| testCryptoKit.swift:108:23:108:23 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:114:23:114:23 | cert | semmle.label | cert | +| testCryptoKit.swift:116:23:116:23 | account_no | semmle.label | account_no | +| testCryptoKit.swift:117:23:117:23 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:150:32:150:32 | cert | semmle.label | cert | +| testCryptoKit.swift:152:32:152:32 | account_no | semmle.label | account_no | +| testCryptoKit.swift:153:32:153:32 | credit_card_no | semmle.label | credit_card_no | +| testCryptoKit.swift:159:32:159:32 | cert | semmle.label | cert | +| testCryptoKit.swift:161:32:161:32 | account_no | semmle.label | account_no | +| testCryptoKit.swift:162:32:162:32 | credit_card_no | semmle.label | credit_card_no | | 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 | @@ -33,21 +36,24 @@ subpaths | 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:72:36:72:36 | cert | testCryptoKit.swift:72:36:72:36 | cert | testCryptoKit.swift:72:36:72:36 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:72:36:72:36 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:74:36:74:36 | account_no | testCryptoKit.swift:74:36:74:36 | account_no | testCryptoKit.swift:74:36:74:36 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:74:36:74:36 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:75:36:75:36 | credit_card_no | testCryptoKit.swift:75:36:75:36 | credit_card_no | testCryptoKit.swift:75:36:75:36 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:75:36:75:36 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:78:44:78:44 | cert | testCryptoKit.swift:78:44:78:44 | cert | testCryptoKit.swift:78:44:78:44 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:78:44:78:44 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:80:44:80:44 | account_no | testCryptoKit.swift:80:44:80:44 | account_no | testCryptoKit.swift:80:44:80:44 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:80:44:80:44 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:81:44:81:44 | credit_card_no | testCryptoKit.swift:81:44:81:44 | credit_card_no | testCryptoKit.swift:81:44:81:44 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:81:44:81:44 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:105:23:105:23 | cert | testCryptoKit.swift:105:23:105:23 | cert | testCryptoKit.swift:105:23:105:23 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:105:23:105:23 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:107:23:107:23 | account_no | testCryptoKit.swift:107:23:107:23 | account_no | testCryptoKit.swift:107:23:107:23 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:107:23:107:23 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:108:23:108:23 | credit_card_no | testCryptoKit.swift:108:23:108:23 | credit_card_no | testCryptoKit.swift:108:23:108:23 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:108:23:108:23 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:114:23:114:23 | cert | testCryptoKit.swift:114:23:114:23 | cert | testCryptoKit.swift:114:23:114:23 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:114:23:114:23 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:116:23:116:23 | account_no | testCryptoKit.swift:116:23:116:23 | account_no | testCryptoKit.swift:116:23:116:23 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:116:23:116:23 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:117:23:117:23 | credit_card_no | testCryptoKit.swift:117:23:117:23 | credit_card_no | testCryptoKit.swift:117:23:117:23 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:117:23:117:23 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:150:32:150:32 | cert | testCryptoKit.swift:150:32:150:32 | cert | testCryptoKit.swift:150:32:150:32 | cert | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:150:32:150:32 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:152:32:152:32 | account_no | testCryptoKit.swift:152:32:152:32 | account_no | testCryptoKit.swift:152:32:152:32 | account_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:152:32:152:32 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:153:32:153:32 | credit_card_no | testCryptoKit.swift:153:32:153:32 | credit_card_no | testCryptoKit.swift:153:32:153:32 | credit_card_no | Insecure hashing algorithm (MD5) depends on $@. | testCryptoKit.swift:153:32:153:32 | credit_card_no | sensitive data (private information credit_card_no) | +| testCryptoKit.swift:159:32:159:32 | cert | testCryptoKit.swift:159:32:159:32 | cert | testCryptoKit.swift:159:32:159:32 | cert | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:159:32:159:32 | cert | sensitive data (credential cert) | +| testCryptoKit.swift:161:32:161:32 | account_no | testCryptoKit.swift:161:32:161:32 | account_no | testCryptoKit.swift:161:32:161:32 | account_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:161:32:161:32 | account_no | sensitive data (private information account_no) | +| testCryptoKit.swift:162:32:162:32 | credit_card_no | testCryptoKit.swift:162:32:162:32 | credit_card_no | testCryptoKit.swift:162:32:162:32 | credit_card_no | Insecure hashing algorithm (SHA1) depends on $@. | testCryptoKit.swift:162:32:162:32 | credit_card_no | sensitive data (private information credit_card_no) | | 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..755bd27e3c73 100644 --- a/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift +++ b/swift/ql/test/query-tests/Security/CWE-328/testCryptoKit.swift @@ -68,6 +68,12 @@ func testHashMethods(passwd : UnsafeRawBufferPointer, cert: String, encrypted_pa 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(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(data: cert) // BAD hash = Crypto.Insecure.SHA1.hash(data: encrypted_passwd) // GOOD (not sensitive) diff --git a/swift/schema.py b/swift/schema.py index febbf1ae2f47..31be5ee7d24c 100644 --- a/swift/schema.py +++ b/swift/schema.py @@ -278,6 +278,7 @@ class TypeDecl(ValueDecl): This only returns the types effectively appearing in the declaration. In particular it will not resolve `TypeAliasDecl`s or consider base types added by extensions. """) + declared_interface_type: Type class AbstractTypeParamDecl(TypeDecl): pass 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/.gitignore b/unified/.gitignore new file mode 100644 index 000000000000..5878737805f2 --- /dev/null +++ b/unified/.gitignore @@ -0,0 +1,6 @@ +target +.vscode/launch.json +.cache +ql/test/**/*.testproj +ql/test/**/*.actual +.codeql diff --git a/unified/AGENTS.md b/unified/AGENTS.md new file mode 100644 index 000000000000..488a94f44bd4 --- /dev/null +++ b/unified/AGENTS.md @@ -0,0 +1,30 @@ +# Agent instructions + +This is a CodeQL extractor based on tree-sitter. + +## Building +To build the extractor, run `scripts/create-extractor-pack.sh` + +## Editing the Swift grammar +The vendored tree-sitter-swift grammar lives at +`extractor/tree-sitter-swift/`. After editing `grammar.js` (or any other +grammar source), run `scripts/regenerate-grammar.sh` to: +- regenerate `extractor/tree-sitter-swift/src/{parser.c, grammar.json, + node-types.json}` (and the `src/tree_sitter/*.h` headers) via + `tree-sitter generate`; and +- refresh `extractor/tree-sitter-swift/node-types.yml`, the + human-readable companion to `src/node-types.json` produced by yeast's + `node_types_yaml` binary. + +`node-types.yml` is the recommended review surface for grammar changes — +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. + +- To run all 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. + +- To run a specific test, pass the specific directory to the `codeql test run` command instead of `ql/test`. diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel new file mode 100644 index 000000000000..e702fd251594 --- /dev/null +++ b/unified/BUILD.bazel @@ -0,0 +1,57 @@ +load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup") +load("//misc/bazel:pkg.bzl", "codeql_pack", "codeql_pkg_files") + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "dbscheme", + actual = "//unified/ql/lib:dbscheme", +) + +alias( + name = "dbscheme-stats", + actual = "//unified/ql/lib:dbscheme-stats", +) + +codeql_pkg_files( + name = "dbscheme-group", + srcs = [ + ":dbscheme", + ":dbscheme-stats", + ], + strip_prefix = None, +) + +pkg_filegroup( + name = "db-files", + srcs = [ + ":dbscheme-group", + ], +) + +codeql_pkg_files( + name = "codeql-extractor-yml", + srcs = [ + "codeql-extractor.yml", + "//:LICENSE", + ], + strip_prefix = None, +) + +codeql_pkg_files( + name = "extractor-arch", + exes = [ + "//unified/extractor", + ], + prefix = "tools/{CODEQL_PLATFORM}", +) + +codeql_pack( + name = "unified", + srcs = [ + ":codeql-extractor-yml", + ":dbscheme-group", + ":extractor-arch", + "//unified/tools", + ], +) diff --git a/unified/codeql-extractor.yml b/unified/codeql-extractor.yml new file mode 100644 index 000000000000..388566c09f11 --- /dev/null +++ b/unified/codeql-extractor.yml @@ -0,0 +1,17 @@ +name: "unified" +display_name: "Unified Language" +version: 0.0.1 +column_kind: "utf8" +legacy_qltest_extraction: true +build_modes: + - none +github_api_languages: + - Swift +scc_languages: + - Swift +file_types: + - name: swift + display_name: Swift files + extensions: + - .swift + - .swiftinterface diff --git a/unified/extractor/BUILD.bazel b/unified/extractor/BUILD.bazel new file mode 100644 index 000000000000..80ca1c0057b3 --- /dev/null +++ b/unified/extractor/BUILD.bazel @@ -0,0 +1,21 @@ +load("//misc/bazel:rust.bzl", "codeql_rust_binary") +load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") + +exports_files(["Cargo.toml"]) + +codeql_rust_binary( + name = "extractor", + srcs = glob(["src/**/*.rs"]), + aliases = aliases(), + proc_macro_deps = all_crate_deps( + proc_macro = True, + ), + visibility = ["//visibility:public"], + deps = all_crate_deps( + normal = True, + ) + [ + "//shared/tree-sitter-extractor", + "//shared/yeast", + "//unified/extractor/tree-sitter-swift", + ], +) diff --git a/unified/extractor/Cargo.toml b/unified/extractor/Cargo.toml new file mode 100644 index 000000000000..39c20598b1ff --- /dev/null +++ b/unified/extractor/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "codeql-extractor-unified" +description = "CodeQL Unified extractor" +version = "0.1.0" +authors = ["GitHub"] +edition = "2024" + +# When updating these dependencies, run `misc/bazel/3rdparty/update_cargo_deps.sh` +[dependencies] +tree-sitter = ">= 0.23.0" +tree-sitter-embedded-template = "0.25.0" +tree-sitter-swift = { path = "tree-sitter-swift" } +clap = { version = "4.5", features = ["derive"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } +rayon = "1.11.0" +regex = "1.11.3" +encoding = "0.2" +lazy_static = "1.5.0" +serde_json = "1.0.145" + +codeql-extractor = { path = "../../shared/tree-sitter-extractor" } +yeast = { path = "../../shared/yeast" } diff --git a/unified/extractor/src/autobuilder.rs b/unified/extractor/src/autobuilder.rs new file mode 100644 index 000000000000..3bcb87aedd83 --- /dev/null +++ b/unified/extractor/src/autobuilder.rs @@ -0,0 +1,20 @@ +use std::env; +use std::path::PathBuf; + +use clap::Args; + +use codeql_extractor::autobuilder; + +#[derive(Args)] +// The autobuilder takes no command-line options, but this may change in the future. +pub struct Options {} + +pub fn run(_: Options) -> std::io::Result<()> { + let database = env::var("CODEQL_EXTRACTOR_UNIFIED_WIP_DATABASE") + .expect("CODEQL_EXTRACTOR_UNIFIED_WIP_DATABASE not set"); + + autobuilder::Autobuilder::new("unified", PathBuf::from(database)) + .include_extensions(&[".swift", ".swiftinterface"]) + .size_limit("10m") + .run() +} diff --git a/unified/extractor/src/extractor.rs b/unified/extractor/src/extractor.rs new file mode 100644 index 000000000000..eb6f06eb259b --- /dev/null +++ b/unified/extractor/src/extractor.rs @@ -0,0 +1,40 @@ +use clap::Args; +use std::path::PathBuf; + +use codeql_extractor::extractor::simple; +use codeql_extractor::trap; + +#[path = "languages/swift/swift.rs"] +mod swift; + +#[derive(Args)] +pub struct Options { + /// Sets a custom source archive folder + #[arg(long)] + source_archive_dir: PathBuf, + + /// Sets a custom trap folder + #[arg(long)] + output_dir: PathBuf, + + /// A text file containing the paths of the files to extract + #[arg(long)] + file_list: PathBuf, +} + +pub fn run(options: Options) -> std::io::Result<()> { + codeql_extractor::extractor::set_tracing_level("unified"); + + let extractor = simple::Extractor { + prefix: "unified".to_string(), + languages: vec![ + swift::language_spec(), + ], + trap_dir: options.output_dir, + trap_compression: trap::Compression::from_env("CODEQL_EXTRACTOR_UNIFIED_OPTION_TRAP_COMPRESSION"), + source_archive_dir: options.source_archive_dir, + file_lists: vec![options.file_list], + }; + + extractor.run() +} diff --git a/unified/extractor/src/generator.rs b/unified/extractor/src/generator.rs new file mode 100644 index 000000000000..ce1f37144a4e --- /dev/null +++ b/unified/extractor/src/generator.rs @@ -0,0 +1,27 @@ +use clap::Args; +use std::path::PathBuf; + +use codeql_extractor::generator::{generate, language::Language}; + +#[derive(Args)] +pub struct Options { + /// Path of the generated dbscheme file + #[arg(long)] + dbscheme: PathBuf, + + /// Path of the generated QLL file + #[arg(long)] + library: PathBuf, +} + +pub fn run(options: Options) -> std::io::Result<()> { + codeql_extractor::extractor::set_tracing_level("unified"); + + let languages = vec![Language { + name: "Swift".to_owned(), + node_types: tree_sitter_swift::NODE_TYPES, + desugar: None, + }]; + + generate(languages, options.dbscheme, options.library, "run unified/scripts/create-extractor-pack.sh") +} diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs new file mode 100644 index 000000000000..c3843a5979c5 --- /dev/null +++ b/unified/extractor/src/languages/swift/swift.rs @@ -0,0 +1,23 @@ +use codeql_extractor::extractor::simple; +use yeast::{rule, DesugaringConfig}; + +fn desugaring_rules() -> Vec { + vec![ + rule!( + (additive_expression) + => + (simple_identifier "blah") + ), + ] +} + +pub fn language_spec() -> simple::LanguageSpec { + let desugar = DesugaringConfig::new().add_phase("desugar", desugaring_rules()); + simple::LanguageSpec { + prefix: "swift", + ts_language: tree_sitter_swift::LANGUAGE.into(), + node_types: tree_sitter_swift::NODE_TYPES, + file_globs: vec!["*.swift".into(), "*.swiftinterface".into()], + desugar: Some(desugar), + } +} diff --git a/unified/extractor/src/main.rs b/unified/extractor/src/main.rs new file mode 100644 index 000000000000..e6721d4e2243 --- /dev/null +++ b/unified/extractor/src/main.rs @@ -0,0 +1,23 @@ +use clap::Parser; + +mod autobuilder; +mod extractor; +mod generator; + +#[derive(Parser)] +#[command(author, version, about)] +enum Cli { + Extract(extractor::Options), + Generate(generator::Options), + Autobuild(autobuilder::Options), +} + +fn main() -> std::io::Result<()> { + let cli = Cli::parse(); + + match cli { + Cli::Extract(options) => extractor::run(options), + Cli::Generate(options) => generator::run(options), + Cli::Autobuild(options) => autobuilder::run(options), + } +} diff --git a/unified/extractor/tree-sitter-swift/.gitignore b/unified/extractor/tree-sitter-swift/.gitignore new file mode 100644 index 000000000000..53796875297e --- /dev/null +++ b/unified/extractor/tree-sitter-swift/.gitignore @@ -0,0 +1,9 @@ +# Generated by tree-sitter from grammar.js. The Cargo build script +# (bindings/rust/build.rs) and Bazel's cargo_build_script regenerate them into +# OUT_DIR. The tree-sitter CLI (parse, test, playground, etc.) expects them in +# src/, so contributors can run `tree-sitter generate` locally to populate +# these — they are intentionally untracked. +src/parser.c +src/grammar.json +src/node-types.json +src/tree_sitter/ diff --git a/unified/extractor/tree-sitter-swift/BUILD.bazel b/unified/extractor/tree-sitter-swift/BUILD.bazel new file mode 100644 index 000000000000..f865f22a1420 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/BUILD.bazel @@ -0,0 +1,42 @@ +load("@rules_rust//cargo:defs.bzl", "cargo_build_script") +load("@rules_rust//rust:defs.bzl", "rust_library") +load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") + +package(default_visibility = ["//visibility:public"]) + +# This will run the build script from the root of the workspace, and +# collect the outputs. +cargo_build_script( + name = "tree-sitter-swift-build", + srcs = ["bindings/rust/build.rs"], + data = glob([ + "src/scanner.c", + ]) + [ + "grammar.js", + ], + deps = all_crate_deps( + build = True, + ), +) + +rust_library( + name = "tree-sitter-swift", + srcs = [ + "bindings/rust/lib.rs", + ], + aliases = aliases(), + compile_data = glob([ + "src/**", + "queries/**", + ]) + [ + "grammar.js", + ], + proc_macro_deps = all_crate_deps( + proc_macro = True, + ), + deps = [":tree-sitter-swift-build"] + all_crate_deps( + normal = True, + ), +) + +exports_files(["Cargo.toml"]) diff --git a/unified/extractor/tree-sitter-swift/Cargo.toml b/unified/extractor/tree-sitter-swift/Cargo.toml new file mode 100644 index 000000000000..8cec03889a83 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "tree-sitter-swift" +description = "Swift grammar for the tree-sitter parsing library (vendored copy for the unified extractor)" +version = "0.7.2" +keywords = ["incremental", "parsing", "swift"] +categories = ["parsing", "text-editors"] +repository = "https://github.com/alex-pinkus/tree-sitter-swift" +edition = "2024" +license = "MIT" + +build = "bindings/rust/build.rs" + +[lib] +path = "bindings/rust/lib.rs" + +# When updating these dependencies, run `misc/bazel/3rdparty/update_cargo_deps.sh` +[dependencies] +tree-sitter-language = "0.1" + +[build-dependencies] +cc = "1.2" +tree-sitter-generate = "0.26.8" diff --git a/unified/extractor/tree-sitter-swift/LICENSE b/unified/extractor/tree-sitter-swift/LICENSE new file mode 100644 index 000000000000..f158d7005311 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 alex-pinkus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/unified/extractor/tree-sitter-swift/README.md b/unified/extractor/tree-sitter-swift/README.md new file mode 100644 index 000000000000..5b54f4b617f6 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/README.md @@ -0,0 +1,127 @@ +![Parse rate badge](https://byob.yarr.is/alex-pinkus/tree-sitter-swift/parse_rate) +[![Crates.io badge](https://byob.yarr.is/alex-pinkus/tree-sitter-swift/crates_io_version)](https://crates.io/crates/tree-sitter-swift) +[![NPM badge](https://byob.yarr.is/alex-pinkus/tree-sitter-swift/npm_version)](https://www.npmjs.com/package/tree-sitter-swift) +[![Build](https://github.com/alex-pinkus/tree-sitter-swift/actions/workflows/top-repos.yml/badge.svg)](https://github.com/alex-pinkus/tree-sitter-swift/actions/workflows/top-repos.yml) + +# tree-sitter-swift + +This contains a [`tree-sitter`](https://tree-sitter.github.io/tree-sitter) grammar for the Swift programming language. + +## Getting started + +To use this parser to parse Swift code, you'll want to depend on either the Rust crate or the NPM package. + +### Rust + +To use the Rust crate, you'll add this to your `Cargo.toml`: + +``` +tree-sitter = "0.23.0" +tree-sitter-swift = "=0.7.0" +``` + +Then you can use a `tree-sitter` parser with the language declared here: + +``` +let mut parser = tree_sitter::Parser::new(); +parser.set_language(tree_sitter_swift::language())?; + +// ... + +let tree = parser.parse(&my_source_code, None) + .ok_or_else(|| /* error handling code */)?; +``` + +### Javascript + +To use this from NPM, you'll add similar dependencies to `package.json`: + +``` +"dependencies: { + "tree-sitter-swift": "0.7.0", + "tree-sitter": "^0.22.1" +} +``` + +Your usage of the parser will look like: + +``` +const Parser = require("tree-sitter"); +const Swift = require("tree-sitter-swift"); + +const parser = new Parser(); +parser.setLanguage(Swift); + +// ... + +const tree = parser.parse(mySourceCode); +``` + +### Editing the grammar + +With this package checked out, a common workflow for editing the grammar will look something like: + +1. Make a change to `grammar.ts`. +2. Run `npm install && npm test` to see whether the change has had impact on existing parsing behavior. The default + `npm test` target requires `valgrind` to be installed; if you do not have it installed, and do not wish to, you can + substitute `tree-sitter test` directly. +3. Run `tree-sitter parse` on some real Swift codebase and see whether (or where) it fails. +4. Use any failures to create new corpus test cases. + +## Contributions + +All contributions to this repository are welcome. + +If said contribution is to check generated files (e.g., `parser.c`) into the repository, be aware that your contribution will not be accepted. Make sure to read the [FAQ entry](https://github.com/alex-pinkus/tree-sitter-swift?tab=readme-ov-file#where-is-your-parserc) and the [prior](https://github.com/alex-pinkus/tree-sitter-swift/issues/362) [discussions](https://github.com/alex-pinkus/tree-sitter-swift/pull/315) and [compromises](https://github.com/alex-pinkus/tree-sitter-swift/issues/149) that have occurred already on this topic. + +## Using tree-sitter-swift in Web Assembly + +To use tree-sitter-swift as a language for the web bindings version tree-sitter, which will likely be a more modern version than the published node +module. [see](https://github.com/tree-sitter/tree-sitter/blob/master/lib/binding_web/README.md). Follow the instructions below + +1. Install the node modules `npm install web-tree-sitter tree-sitter-swift` +2. Run the tree-sitter cli to create the wasm bundle + ```sh + $ npx tree-sitter build-asm ./node_modules/tree-sitter + ``` +3. Boot tree-sitter wasm like this. + +```js +const Parser = require("web-tree-sitter"); +async function run() { + //needs to happen first + await Parser.init(); + //wait for the load of swift + const Swift = await Parser.Language.load("./tree-sitter-swift.wasm"); + + const parser = new Parser(); + parser.setLanguage(Swift); + + //Parse your swift code here. + const tree = parser.parse('print("Hello, World!")'); +} +//if you want to run this +run().then(console.log, console.error); +``` + +## Frequently asked questions + +### Where is your `parser.c`? + +This repository currently omits most of the code that is autogenerated during a build. This means, for instance, that +`grammar.json` and `parser.c` are both only available following a build. It also significantly reduces noise during +diffs. + +The side benefit of not checking in `parser.c` is that you can guarantee backwards compatibility. Parsers generated by +the tree-sitter CLI aren't always backwards compatible. If you need a parser, generate it yourself using the CLI; all +the information to do so is available in this package. By doing that, you'll also know for sure that your parser version +and your library version are compatible. + +If you need a `parser.c`, and you don't care about the tree-sitter version, but you don't have a local setup that would +allow you to obtain the parser, you can just download one from a recent workflow run in this package. To do so: + +- Go to the [GitHub actions page](https://github.com/alex-pinkus/tree-sitter-swift/actions) for this + repository. +- Click on the "Publish `grammar.json` and `parser.c`" action for the appropriate commit. +- Go down to `Artifacts` and click on `generated-parser-src`. All the relevant parser files will be available in your + download. diff --git a/unified/extractor/tree-sitter-swift/binding.gyp b/unified/extractor/tree-sitter-swift/binding.gyp new file mode 100644 index 000000000000..4d9270af7d47 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/binding.gyp @@ -0,0 +1,44 @@ +{ + "targets": [ + { + "target_name": "tree_sitter_swift_binding", + "dependencies": [ + " + +typedef struct TSLanguage TSLanguage; + +extern "C" TSLanguage *tree_sitter_swift(); + +// "tree-sitter", "language" hashed with BLAKE2 +const napi_type_tag LANGUAGE_TYPE_TAG = { + 0x8AF2E5212AD58ABF, 0xD5006CAD83ABBA16 +}; + +Napi::Object Init(Napi::Env env, Napi::Object exports) { + exports["name"] = Napi::String::New(env, "swift"); + auto language = Napi::External::New(env, tree_sitter_swift()); + language.TypeTag(&LANGUAGE_TYPE_TAG); + exports["language"] = language; + return exports; +} + +NODE_API_MODULE(tree_sitter_swift_binding, Init) diff --git a/unified/extractor/tree-sitter-swift/bindings/node/index.js b/unified/extractor/tree-sitter-swift/bindings/node/index.js new file mode 100644 index 000000000000..6657bcf42dec --- /dev/null +++ b/unified/extractor/tree-sitter-swift/bindings/node/index.js @@ -0,0 +1,7 @@ +const root = require("path").join(__dirname, "..", ".."); + +module.exports = require("node-gyp-build")(root); + +try { + module.exports.nodeTypeInfo = require("../../src/node-types.json"); +} catch (_) {} diff --git a/unified/extractor/tree-sitter-swift/bindings/rust/build.rs b/unified/extractor/tree-sitter-swift/bindings/rust/build.rs new file mode 100644 index 000000000000..6b939358ed4b --- /dev/null +++ b/unified/extractor/tree-sitter-swift/bindings/rust/build.rs @@ -0,0 +1,49 @@ +use std::env; +use std::path::PathBuf; + +fn main() { + // tree-sitter-generate produces parser.c, grammar.json, node-types.json, + // and src/tree_sitter/*.h headers from grammar.js. We write them into + // OUT_DIR so the build is sandbox-friendly and we don't litter the source + // tree. + let crate_dir: PathBuf = env::var("CARGO_MANIFEST_DIR").unwrap().into(); + let out_dir: PathBuf = env::var("OUT_DIR").unwrap().into(); + let grammar_js = crate_dir.join("grammar.js"); + + tree_sitter_generate::generate_parser_in_directory( + &crate_dir, + Some(&out_dir), + Some(&grammar_js), + tree_sitter_generate::ABI_VERSION_MAX, + None, + None, + true, + tree_sitter_generate::OptLevel::default(), + ) + .expect("failed to generate tree-sitter-swift parser"); + + let mut c_config = cc::Build::new(); + c_config + .std("c11") + .include(&out_dir) + .include(out_dir.join("tree_sitter")); + + #[cfg(target_env = "msvc")] + c_config.flag("-utf-8"); + + c_config.file(out_dir.join("parser.c")); + + // scanner.c is hand-written and lives in the source tree. + let scanner_path = crate_dir.join("src").join("scanner.c"); + c_config.include(crate_dir.join("src")).file(&scanner_path); + + println!("cargo:rerun-if-changed={}", grammar_js.to_str().unwrap()); + println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); + // Re-export OUT_DIR so consumers can include_str! the generated files. + println!( + "cargo:rustc-env=TREE_SITTER_SWIFT_OUT_DIR={}", + out_dir.to_str().unwrap() + ); + + c_config.compile("tree-sitter-swift"); +} diff --git a/unified/extractor/tree-sitter-swift/bindings/rust/lib.rs b/unified/extractor/tree-sitter-swift/bindings/rust/lib.rs new file mode 100644 index 000000000000..891df87778f0 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/bindings/rust/lib.rs @@ -0,0 +1,68 @@ +//! This crate provides Swift language support for the [tree-sitter][] parsing library. +//! +//! Typically, you will use the [language][language func] function to add this language to a +//! tree-sitter [Parser][], and then use the parser to parse some code: +//! +//! ``` +//! let code = r#" +//! "#; +//! let mut parser = tree_sitter::Parser::new(); +//! let language = tree_sitter_swift::LANGUAGE; +//! parser +//! .set_language(&language.into()) +//! .expect("Error loading Swift parser"); +//! let tree = parser.parse(code, None).unwrap(); +//! assert!(!tree.root_node().has_error()); +//! ``` +//! +//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html +//! [language func]: fn.language.html +//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html +//! [tree-sitter]: https://tree-sitter.github.io/ + +use tree_sitter_language::LanguageFn; + +unsafe extern "C" { + fn tree_sitter_swift() -> *const (); +} + +/// The tree-sitter [`LanguageFn`] for this grammar. +pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_swift) }; + +/// The content of the [`node-types.json`][] file for this grammar. +/// +/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types +pub const NODE_TYPES: &str = include_str!(concat!(env!("TREE_SITTER_SWIFT_OUT_DIR"), "/node-types.json")); + +pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); +pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); +pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); +pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); + +#[cfg(test)] +mod tests { + #[test] + fn test_can_load_grammar() { + let mut parser = tree_sitter::Parser::new(); + parser + .set_language(&super::LANGUAGE.into()) + .expect("Error loading Swift parser"); + } + + #[test] + fn test_can_parse_basic_file() { + let mut parser = tree_sitter::Parser::new(); + parser + .set_language(&super::LANGUAGE.into()) + .expect("Error loading Swift parser"); + + let tree = parser + .parse("_ = \"Hello!\"\n", None) + .expect("Unable to parse!"); + + assert_eq!( + "(source_file (assignment target: (directly_assignable_expression (simple_identifier)) result: (line_string_literal text: (line_str_text))))", + tree.root_node().to_sexp(), + ); + } +} diff --git a/unified/extractor/tree-sitter-swift/grammar.js b/unified/extractor/tree-sitter-swift/grammar.js new file mode 100644 index 000000000000..5dbfd7fdbbf2 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/grammar.js @@ -0,0 +1,2114 @@ +"use strict"; +/* + * MIT License + * + * Copyright (c) 2021 alex-pinkus + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +const PRECS = { + multiplication: 11, + addition: 10, + infix_operations: 9, + nil_coalescing: 8, + check: 7, + prefix_operations: 7, + comparison: 6, + postfix_operations: 6, + equality: 5, + conjunction: 4, + disjunction: 3, + block: 2, + loop: 1, + keypath: 1, + parameter_pack: 1, + control_transfer: 0, + as: -1, + tuple: -1, + if: -1, + switch: -1, + do: -1, + fully_open_range: -1, + range: -1, + navigation: -1, + expr: -1, + ty: -1, + call: -2, + ternary: -2, + try: -2, + call_suffix: -2, + range_suffix: -2, + ternary_binary_suffix: -2, + await: -2, + assignment: -3, + comment: -3, + lambda: -3, + regex: -4, +}; + +const DYNAMIC_PRECS = { + call: 1, +}; + +const DEC_DIGITS = token(sep1(/[0-9]+/, /_+/)); +const HEX_DIGITS = token(sep1(/[0-9a-fA-F]+/, /_+/)); +const OCT_DIGITS = token(sep1(/[0-7]+/, /_+/)); +const BIN_DIGITS = token(sep1(/[01]+/, /_+/)); +const REAL_EXPONENT = token(seq(/[eE]/, optional(/[+-]/), DEC_DIGITS)); +const HEX_REAL_EXPONENT = token(seq(/[pP]/, optional(/[+-]/), DEC_DIGITS)); + +var LEXICAL_IDENTIFIER; + +if (tree_sitter_version_supports_emoji()) { + LEXICAL_IDENTIFIER = + /[_\p{XID_Start}\p{Emoji}&&[^0-9#*]](\p{EMod}|\x{FE0F}\x{20E3}?)?([_\p{XID_Continue}\p{Emoji}\x{200D}](\p{EMod}|\x{FE0F}\x{20E3}?)?)*/; +} else { + LEXICAL_IDENTIFIER = /[_\p{XID_Start}][_\p{XID_Continue}]*/; +} + +module.exports = grammar({ + name: "swift", + supertypes: ($) => [ + $.expression, + $.unannotated_type, + $.global_declaration, + $.type_level_declaration, + $.local_declaration, + $.protocol_member_declaration, + ], + conflicts: ($) => [ + // @Type(... could either be an annotation constructor invocation or an annotated expression + [$.attribute], + [$._attribute_argument], + // Is `foo { ... }` a constructor invocation or function invocation? + [$._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 + [$.value_argument], + // { (foo, bar) ... + [$.expression, $.lambda_parameter], + [$._primary_expression, $.lambda_parameter], + // (start: start, end: end) + [$._tuple_type_item_identifier, $.tuple_expression], + // 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], + // `+(...)` is ambigously either "call the function produced by a reference to the operator `+`" or "use the unary + // operator `+` on the result of the parenthetical expression." + [$._additive_operator, $._prefix_unary_operator], + [$.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], + [$._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 + // conflict. + [$.call_suffix, $.expr_hack_at_ternary_binary_call_suffix], + // try {expression} is a bit magic and applies quite broadly: `try foo()` and `try foo { }` show that this is right + // associative, and `try foo ? bar() : baz` even more so. But it doesn't always win: something like + // `if try foo { } ...` should award its braces to the `if`. In order to make this actually happen, we need to parse + // all the options and pick the best one that doesn't error out. + [$.try_expression, $._unary_expression], + [$.try_expression, $.expression], + // await {expression} has the same special cases as `try`. + [$.await_expression, $._unary_expression], + [$.await_expression, $.expression], + // In a computed property, when you see an @attribute, it's not yet clear if that's going to be for a + // locally-declared class or a getter / setter specifier. + [ + $._local_property_declaration, + $._local_typealias_declaration, + $._local_function_declaration, + $._local_class_declaration, + $.computed_getter, + $.computed_modify, + $.computed_setter, + ], + // The `class` modifier is legal in many of the same positions that a class declaration itself would be. + [$._bodyless_function_declaration, $.property_modifier], + [$.init_declaration, $.property_modifier], + // Patterns, man + [$._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 + // type or to a declaration within the closure. What a mess! We just have to hope that if we keep going, only one of + // those will parse (because there will be an `in` or a `let`). + [ + $._lambda_type_declaration, + $._local_property_declaration, + $._local_typealias_declaration, + $._local_function_declaration, + $._local_class_declaration, + ], + + // We want `foo() { }` to be treated as one function call, but we _also_ want `if foo() { ... }` to be treated as a + // full if-statement. This means we have to treat it as a conflict rather than purely a left or right associative + // construct, and let the parser realize that the second expression won't parse properly with the `{ ... }` as a + // lambda. + [$.constructor_suffix], + [$.call_suffix], + + // `actor` is allowed to be an identifier, even though it is also a locally permitted declaration. If we encounter + // it, the only way to know what it's meant to be is to keep going. + [$._modifierless_class_declaration, $.property_modifier], + [$._fn_call_lambda_arguments], + + // `borrowing` and `consuming` are legal as identifiers, but are also legal modifiers + [$.parameter_modifiers], + + // These are keywords sometimes, but simple identifiers other times, and it just depends on the rest of their usage. + [$._contextual_simple_identifier, $._modifierless_class_declaration], + [$._contextual_simple_identifier, $.property_behavior_modifier], + [$._contextual_simple_identifier, $.parameter_modifier], + [$._contextual_simple_identifier, $.type_parameter_pack], + [$._contextual_simple_identifier, $.type_pack_expansion], + [$._contextual_simple_identifier, $.visibility_modifier], + ], + extras: ($) => [ + $.comment, + $.multiline_comment, + /\s+/, // Whitespace + ], + externals: ($) => [ + // Comments and raw strings are parsed in a custom scanner because they require us to carry forward state to + // maintain symmetry. For instance, parsing a multiline comment requires us to increment a counter whenever we see + // `/*`, 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, + $.raw_str_part, + $.raw_str_continuing_indicator, + $.raw_str_end_part, + // Because Swift doesn't have explicit semicolons, we also do some whitespace handling in a custom scanner. Line + // breaks are _sometimes_ meaningful as the end of a statement: try to write `let foo: Foo let bar: Bar`, for + // instance and the compiler will complain, but add either a newline or a semicolon and it's fine. We borrow the + // idea from the Kotlin grammar that a newline is sometimes a "semicolon". By including `\n` in both `_semi` and + // an anonymous `whitespace` extras, we _should_ be able to let the parser decide if a newline is meaningful. If the + // parser sees something like `foo.bar(1\n)`, it knows that a "semicolon" would not be valid there, so it parses + // that as whitespace. On the other hand, `let foo: Foo\n let bar: Bar` has a meaningful newline. + // Unfortunately, we can't simply stop at that. There are some expressions and statements that remain valid if you + // end them early, but are expected to be parsed across multiple lines. One particular nefarious example is a + // function declaration, where you might have something like `func foo(args: A) -> Foo throws where A: Hashable`. + // This would still be a valid declaration even if it ended after the `)`, the `Foo`, or the `throws`, so a grammar + // that simply interprets a newline as "sometimes a semi" would parse those incorrectly. + // To solve that case, our custom scanner must do a bit of extra lookahead itself. If we're about to generate a + // `_semi`, we advance a bit further to see if the next non-whitespace token would be one of these other operators. + // If so, we ignore the `_semi` and just produce the operator; if not, we produce the `_semi` and let the rest of + // the grammar sort it out. This isn't perfect, but it works well enough most of the time. + $._implicit_semi, + $._explicit_semi, + // Every one of the below operators will suppress a `_semi` if we encounter it after a newline. + $._arrow_operator_custom, + $._dot_custom, + $._conjunction_operator_custom, + $._disjunction_operator_custom, + $._nil_coalescing_operator_custom, + $._eq_custom, + $._eq_eq_custom, + $._plus_then_ws, + $._minus_then_ws, + $._bang_custom, + $._throws_keyword, + $._rethrows_keyword, + $.default_keyword, + $.where_keyword, + $["else"], + $.catch_keyword, + $._as_custom, + $._as_quest_custom, + $._as_bang_custom, + $._async_keyword_custom, + $._custom_operator, + $._hash_symbol_custom, + $._directive_if, + $._directive_elseif, + $._directive_else, + $._directive_endif, + + // Fake operator that will never get triggered, but follows the sequence of characters for `try!`. Tracked by the + // custom scanner so that it can avoid triggering `$.bang` for that case. + $._fake_try_bang, + ], + inline: ($) => [$._locally_permitted_modifiers], + rules: { + //////////////////////////////// + // File Structure + //////////////////////////////// + source_file: ($) => + seq( + optional($.shebang_line), + optional( + seq( + $._top_level_statement, + repeat(seq($._semi, $._top_level_statement)), + optional($._semi) + ) + ) + ), + _semi: ($) => choice($._implicit_semi, $._explicit_semi), + shebang_line: ($) => seq($._hash_symbol, "!", /[^\r\n]*/), + //////////////////////////////// + // Lexical Structure - https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html + //////////////////////////////// + comment: ($) => token(prec(PRECS.comment, seq("//", /.*/))), + // Identifiers + simple_identifier: ($) => + choice( + LEXICAL_IDENTIFIER, + /`[^\r\n` ]*`/, + /\$[0-9]+/, + token(seq("$", LEXICAL_IDENTIFIER)), + $._contextual_simple_identifier + ), + // Keywords that were added after they were already legal as identifiers. `tree-sitter` will prefer exact matches + // when parsing so unless we explicitly say that these are legal, the parser will interpret them as their keyword. + _contextual_simple_identifier: ($) => + choice( + "actor", + "async", + "each", + "lazy", + "repeat", + "package", + $._parameter_ownership_modifier + ), + identifier: ($) => sep1($.simple_identifier, $._dot), + // Literals + _basic_literal: ($) => + choice( + $.integer_literal, + $.hex_literal, + $.oct_literal, + $.bin_literal, + $.real_literal, + $.boolean_literal, + $._string_literal, + $.regex_literal, + "nil" + ), + real_literal: ($) => + token( + choice( + seq(DEC_DIGITS, REAL_EXPONENT), + seq(optional(DEC_DIGITS), ".", DEC_DIGITS, optional(REAL_EXPONENT)), + seq( + "0x", + HEX_DIGITS, + optional(seq(".", HEX_DIGITS)), + HEX_REAL_EXPONENT + ) + ) + ), + integer_literal: ($) => token(seq(optional(/[1-9]/), DEC_DIGITS)), + hex_literal: ($) => token(seq("0", /[xX]/, HEX_DIGITS)), + oct_literal: ($) => token(seq("0", /[oO]/, OCT_DIGITS)), + bin_literal: ($) => token(seq("0", /[bB]/, BIN_DIGITS)), + boolean_literal: ($) => choice("true", "false"), + // String literals + _string_literal: ($) => + choice( + $.line_string_literal, + $.multi_line_string_literal, + $.raw_string_literal + ), + line_string_literal: ($) => + seq( + '"', + repeat(choice(field("text", $._line_string_content), $._interpolation)), + '"' + ), + _line_string_content: ($) => choice($.line_str_text, $.str_escaped_char), + line_str_text: ($) => /[^\\"]+/, + str_escaped_char: ($) => + choice($._escaped_identifier, $._uni_character_literal), + _uni_character_literal: ($) => seq("\\", "u", /\{[0-9a-fA-F]+\}/), + multi_line_string_literal: ($) => + seq( + '"""', + repeat( + choice(field("text", $._multi_line_string_content), $._interpolation) + ), + '"""' + ), + raw_string_literal: ($) => + seq( + repeat( + seq( + field("text", $.raw_str_part), + field("interpolation", $.raw_str_interpolation), + optional($.raw_str_continuing_indicator) + ) + ), + field("text", $.raw_str_end_part) + ), + raw_str_interpolation: ($) => + seq($.raw_str_interpolation_start, $._interpolation_contents, ")"), + raw_str_interpolation_start: ($) => /\\#*\(/, + _multi_line_string_content: ($) => + choice($.multi_line_str_text, $.str_escaped_char, '"'), + _interpolation: ($) => seq("\\(", $._interpolation_contents, ")"), + _interpolation_contents: ($) => + sep1Opt( + field( + "interpolation", + alias($.value_argument, $.interpolated_expression) + ), + "," + ), + _escaped_identifier: ($) => /\\[0\\tnr"'\n]/, + multi_line_str_text: ($) => /[^\\"]+/, + // Based on https://gitlab.com/woolsweater/tree-sitter-swifter/-/blob/3d47c85bd47ce54cdf2023a9c0e01eb90adfcc1d/grammar.js#L1019 + // But required modifications to hit all of the cases in SE-354 + regex_literal: ($) => + choice( + $._extended_regex_literal, + $._multiline_regex_literal, + $._oneline_regex_literal + ), + + _extended_regex_literal: ($) => + seq($._hash_symbol, /\/((\/[^#])|[^\n])+\/#/), + + _multiline_regex_literal: ($) => + seq($._hash_symbol, /\/\n/, /(\/[^#]|[^/])*?\n\/#/), + + _oneline_regex_literal: ($) => + token( + prec( + PRECS.regex, + seq( + "/", + token.immediate(/[^ \t\n]?[^/\n]*[^ \t\n/]/), + token.immediate("/") + ) + ) + ), + //////////////////////////////// + // Types - https://docs.swift.org/swift-book/ReferenceManual/Types.html + //////////////////////////////// + type_annotation: ($) => + seq(":", field("type", $._possibly_implicitly_unwrapped_type)), + _possibly_implicitly_unwrapped_type: ($) => + choice($.type, $.implicitly_unwrapped_type), + implicitly_unwrapped_type: ($) => + seq($.type, token.immediate("!")), + type: ($) => + prec.right( + PRECS.ty, + seq(field("modifiers", optional($.type_modifiers)), field("name", $.unannotated_type)) + ), + unannotated_type: ($) => + prec.right( + PRECS.ty, + choice( + $.user_type, + $.tuple_type, + $.function_type, + $.array_type, + $.dictionary_type, + $.optional_type, + $.metatype, + $.opaque_type, + $.existential_type, + $.protocol_composition_type, + $.type_parameter_pack, + $.type_pack_expansion, + $.suppressed_constraint + ) + ), + // 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: ($) => + prec.right( + PRECS.ty, + seq( + alias($.simple_identifier, $.type_identifier), + optional($.type_arguments) + ) + ), + tuple_type: ($) => + choice( + seq( + "(", + optional(sep1Opt(field("element", $.tuple_type_item), ",")), + ")" + ), + alias($._parenthesized_type, $.tuple_type_item) + ), + tuple_type_item: ($) => + prec( + PRECS.expr, + seq( + optional($._tuple_type_item_identifier), + optional($.parameter_modifiers), + field("type", $.type) + ) + ), + _tuple_type_item_identifier: ($) => + prec( + PRECS.expr, + seq( + optional($.wildcard_pattern), + field("name", $.simple_identifier), + ":" + ) + ), + function_type: ($) => + seq( + field("params", choice($.tuple_type, $.unannotated_type)), + optional($._async_keyword), + optional(choice($.throws_clause, $.throws)), + $._arrow_operator, + field("return_type", $.type) + ), + array_type: ($) => seq("[", field("element", $.type), "]"), + dictionary_type: ($) => + seq("[", field("key", $.type), ":", field("value", $.type), "]"), + optional_type: ($) => + prec.left( + seq( + field( + "wrapped", + choice($.user_type, $.tuple_type, $.array_type, $.dictionary_type) + ), + repeat1(alias($._immediate_quest, "?")) + ) + ), + metatype: ($) => seq($.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)), + protocol_composition_type: ($) => + prec.left( + seq( + $.unannotated_type, + repeat1(seq("&", prec.right($.unannotated_type))) + ) + ), + suppressed_constraint: ($) => + prec.right( + seq( + "~", + field("suppressed", alias($.simple_identifier, $.type_identifier)) + ) + ), + //////////////////////////////// + // Expressions - https://docs.swift.org/swift-book/ReferenceManual/Expressions.html + //////////////////////////////// + expression: ($) => + prec( + PRECS.expr, + choice( + $.simple_identifier, + $._unary_expression, + $._binary_expression, + $.ternary_expression, + $._primary_expression, + $.if_statement, + $.switch_statement, + $.assignment, + $.value_parameter_pack, + $.value_pack_expansion, + $.optional_chain_marker + ) + ), + optional_chain_marker: ($) => + seq($.expression, alias($._immediate_quest, "?")), + // Unary expressions + _unary_expression: ($) => + choice( + $.postfix_expression, + $.call_expression, + $.macro_invocation, + $.constructor_expression, + $.navigation_expression, + $.prefix_expression, + $.as_expression, + $.selector_expression, + $.open_start_range_expression, + $.open_end_range_expression, + $.directive, + $.diagnostic + ), + postfix_expression: ($) => + prec.left( + PRECS.postfix_operations, + seq( + field("target", $.expression), + field("operation", $._postfix_unary_operator) + ) + ), + constructor_expression: ($) => + prec( + PRECS.call, + seq( + field( + "constructed_type", + choice($.array_type, $.dictionary_type, $.user_type) + ), + $.constructor_suffix + ) + ), + _parenthesized_type: ($) => + seq( + "(", + choice($.opaque_type, $.existential_type, $.dictionary_type), + ")" + ), + navigation_expression: ($) => + prec.left( + PRECS.navigation, + seq( + field( + "target", + choice( + $._navigable_type_expression, + $.expression, + $._parenthesized_type + ) + ), + field("suffix", $.navigation_suffix) + ) + ), + _navigable_type_expression: ($) => + choice($.user_type, $.array_type, $.dictionary_type), + open_start_range_expression: ($) => + prec.right( + PRECS.range, + seq( + $._range_operator, + prec.right(PRECS.range_suffix, field("end", $.expression)) + ) + ), + _range_operator: ($) => + choice($._open_ended_range_operator, $._three_dot_operator), + open_end_range_expression: ($) => + prec.right( + PRECS.range, + seq(field("start", $.expression), $._three_dot_operator) + ), + prefix_expression: ($) => + prec.left( + PRECS.prefix_operations, + seq( + field("operation", $._prefix_unary_operator), + field( + "target", + choice( + $.expression, + alias(choice("async", "if", "switch"), $.expression) + ) + ) + ) + ), + as_expression: ($) => + prec.left( + PRECS.as, + seq(field("expr", $.expression), $.as_operator, field("type", $.type)) + ), + selector_expression: ($) => + seq( + $._hash_symbol, + "selector", + "(", + optional(choice("getter:", "setter:")), + $.expression, + ")" + ), + // Binary expressions + _binary_expression: ($) => + choice( + $.multiplicative_expression, + $.additive_expression, + $.range_expression, + $.infix_expression, + $.nil_coalescing_expression, + $.check_expression, + $.equality_expression, + $.comparison_expression, + $.conjunction_expression, + $.disjunction_expression, + $.bitwise_operation + ), + multiplicative_expression: ($) => + prec.left( + PRECS.multiplication, + seq( + field("lhs", $.expression), + field("op", $._multiplicative_operator), + field("rhs", $.expression) + ) + ), + additive_expression: ($) => + prec.left( + PRECS.addition, + seq( + field("lhs", $.expression), + field("op", $._additive_operator), + field("rhs", $.expression) + ) + ), + range_expression: ($) => + prec.right( + PRECS.range, + seq( + field("start", $.expression), + field("op", $._range_operator), + field("end", $._expr_hack_at_ternary_binary_suffix) + ) + ), + infix_expression: ($) => + prec.left( + PRECS.infix_operations, + seq( + field("lhs", $.expression), + field("op", $.custom_operator), + field("rhs", $._expr_hack_at_ternary_binary_suffix) + ) + ), + nil_coalescing_expression: ($) => + prec.right( + PRECS.nil_coalescing, + seq( + field("value", $.expression), + $._nil_coalescing_operator, + field("if_nil", $._expr_hack_at_ternary_binary_suffix) + ) + ), + check_expression: ($) => + prec.left( + PRECS.check, + seq( + field("target", $.expression), + field("op", $._is_operator), + field("type", $.type) + ) + ), + comparison_expression: ($) => + prec.left( + seq( + field("lhs", $.expression), + field("op", $._comparison_operator), + field("rhs", $._expr_hack_at_ternary_binary_suffix) + ) + ), + equality_expression: ($) => + prec.left( + PRECS.equality, + seq( + field("lhs", $.expression), + field("op", $._equality_operator), + field("rhs", $._expr_hack_at_ternary_binary_suffix) + ) + ), + conjunction_expression: ($) => + prec.left( + PRECS.conjunction, + seq( + field("lhs", $.expression), + field("op", $._conjunction_operator), + field("rhs", $._expr_hack_at_ternary_binary_suffix) + ) + ), + disjunction_expression: ($) => + prec.left( + PRECS.disjunction, + seq( + field("lhs", $.expression), + field("op", $._disjunction_operator), + field("rhs", $._expr_hack_at_ternary_binary_suffix) + ) + ), + bitwise_operation: ($) => + prec.left( + seq( + field("lhs", $.expression), + field("op", $._bitwise_binary_operator), + field("rhs", $._expr_hack_at_ternary_binary_suffix) + ) + ), + custom_operator: ($) => choice(token(/[\/]+[*]+/), $._custom_operator), + // Suffixes + navigation_suffix: ($) => + seq( + $._dot, + field("suffix", choice($.simple_identifier, $.integer_literal)) + ), + call_suffix: ($) => + prec( + PRECS.call_suffix, + choice( + $.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) + ) + ), + constructor_suffix: ($) => + prec( + PRECS.call_suffix, + choice( + alias($._constructor_value_arguments, $.value_arguments), + prec.dynamic(-1, $._fn_call_lambda_arguments), // As above + seq( + alias($._constructor_value_arguments, $.value_arguments), + $._fn_call_lambda_arguments + ) + ) + ), + _constructor_value_arguments: ($) => + seq("(", optional(sep1Opt($.value_argument, ",")), ")"), + _fn_call_lambda_arguments: ($) => + sep1($.lambda_literal, seq(field("name", $.simple_identifier), ":")), + type_arguments: ($) => prec.left(seq("<", sep1Opt($.type, ","), ">")), + value_arguments: ($) => + seq( + choice( + seq("(", optional(sep1Opt($.value_argument, ",")), ")"), + seq("[", optional(sep1Opt($.value_argument, ",")), "]") + ) + ), + value_argument_label: ($) => + prec.left( + 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), + choice( + repeat1( + seq(field("reference_specifier", $.value_argument_label), ":") + ), + seq( + optional(seq(field("name", $.value_argument_label), ":")), + field("value", $.expression) + ) + ) + ) + ), + try_expression: ($) => + prec.right( + PRECS["try"], + seq( + $.try_operator, + field( + "expr", + choice( + // Prefer direct calls, e.g. `try foo()`, over indirect like `try a ? b() : c`. This allows us to have + // left associativity for the direct calls, which is technically wrong but is the only way to resolve the + // ambiguity of `if foo { ... }` in the correct direction. + prec.right(-2, $.expression), + prec.left(0, $._binary_expression), + prec.left(0, $.call_expression), + // Similarly special case the ternary expression, where `try` may come earlier than it is actually needed. + // When the parser just encounters some identifier after a `try`, it should prefer the `call_expression` (so + // this should be lower in priority than that), but when we encounter an ambiguous expression that might be + // either `try (foo() ? ...)` or `(try foo()) ? ...`, we should prefer the former. We accomplish that by + // giving it a _static precedence_ of -1 but a _dynamic precedence_ of 1. + prec.dynamic(1, prec.left(-1, $.ternary_expression)) + ) + ) + ) + ), + await_expression: ($) => + prec.right( + PRECS.await, + seq( + $._await_operator, + field( + "expr", + choice( + // Prefer direct calls over indirect (same as with `try`). + prec.right(-2, $.expression), + prec.left(0, $.call_expression), + // Special case ternary to `await` the whole thing (same as with `try`). + prec.dynamic(1, prec.left(-1, $.ternary_expression)) + ) + ) + ) + ), + _await_operator: ($) => alias("await", "await"), + ternary_expression: ($) => + prec.right( + PRECS.ternary, + seq( + field("condition", $.expression), + $._quest, + field("if_true", $.expression), + ":", + field("if_false", $._expr_hack_at_ternary_binary_suffix) + ) + ), + _expr_hack_at_ternary_binary_suffix: ($) => + prec.left( + PRECS.ternary_binary_suffix, + choice( + $.expression, + alias($.expr_hack_at_ternary_binary_call, $.call_expression) + ) + ), + expr_hack_at_ternary_binary_call: ($) => + seq( + $.expression, + alias($.expr_hack_at_ternary_binary_call_suffix, $.call_suffix) + ), + expr_hack_at_ternary_binary_call_suffix: ($) => + prec(PRECS.call_suffix, $.value_arguments), + call_expression: ($) => + prec( + PRECS.call, + prec.dynamic(DYNAMIC_PRECS.call, seq($.expression, $.call_suffix)) + ), + macro_invocation: ($) => + prec( + PRECS.call, + prec.dynamic( + DYNAMIC_PRECS.call, + seq( + $._hash_symbol, + $.simple_identifier, + optional($.type_parameters), + $.call_suffix + ) + ) + ), + _primary_expression: ($) => + choice( + $.tuple_expression, + $._basic_literal, + $.lambda_literal, + $.special_literal, + $.playground_literal, + $.array_literal, + $.dictionary_literal, + $.self_expression, + $.super_expression, + $.try_expression, + $.await_expression, + $.referenceable_operator, + $.key_path_expression, + $.key_path_string_expression, + prec.right( + PRECS.fully_open_range, + alias($._three_dot_operator, $.fully_open_range) + ) + ), + tuple_expression: ($) => + prec.right( + PRECS.tuple, + seq( + "(", + sep1Opt( + 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, ",")), + optional(","), + "]" + ), + _dictionary_literal_item: ($) => + seq(field("key", $.expression), ":", field("value", $.expression)), + special_literal: ($) => + seq( + $._hash_symbol, + choice( + "file", + "fileID", + "filePath", + "line", + "column", + "function", + "dsohandle" + ) + ), + playground_literal: ($) => + seq( + $._hash_symbol, + choice("colorLiteral", "fileLiteral", "imageLiteral"), + "(", + sep1Opt(seq($.simple_identifier, ":", $.expression), ","), + ")" + ), + lambda_literal: ($) => + prec.left( + PRECS.lambda, + seq( + choice("{", "^{"), + optional($._lambda_type_declaration), + optional($.statements), + "}" + ) + ), + _lambda_type_declaration: ($) => + seq( + repeat($.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_item: ($) => + choice( + field("name", $.self_expression), + prec( + PRECS.expr, + seq( + optional($.ownership_modifier), + field("name", $.simple_identifier), + optional(seq($._equal_sign, field("value", $.expression))) + ) + ) + ), + lambda_function_type: ($) => + prec( + PRECS.expr, + seq( + choice( + $.lambda_function_type_parameters, + seq("(", optional($.lambda_function_type_parameters), ")") + ), + optional($._async_keyword), + optional(choice($.throws_clause, $.throws)), + optional( + seq( + $._arrow_operator, + field("return_type", $._possibly_implicitly_unwrapped_type) + ) + ) + ) + ), + lambda_function_type_parameters: ($) => sep1Opt($.lambda_parameter, ","), + lambda_parameter: ($) => + seq( + choice( + $.self_expression, + prec(PRECS.expr, field("name", $.simple_identifier)), + prec( + PRECS.expr, + seq( + optional(field("external_name", $.simple_identifier)), + field("name", $.simple_identifier), + ":", + optional($.parameter_modifiers), + field("type", $._possibly_implicitly_unwrapped_type) + ) + ) + ) + ), + self_expression: ($) => "self", + super_expression: ($) => seq("super"), + _else_options: ($) => choice($._block, $.if_statement), + if_statement: ($) => + prec.right( + PRECS["if"], + seq( + "if", + sep1(field("condition", $.if_condition), ","), + $._block, + optional(seq($["else"], $._else_options)) + ) + ), + if_condition: ($) => + choice($.if_let_binding, $.expression, $.availability_condition), + if_let_binding: ($) => + seq( + $._direct_or_indirect_binding, + optional(seq($._equal_sign, $.expression)), + optional($.where_clause) + ), + guard_statement: ($) => + prec.right( + PRECS["if"], + seq( + "guard", + sep1(field("condition", $.if_condition), ","), + $["else"], + $._block + ) + ), + switch_statement: ($) => + prec.right( + PRECS["switch"], + seq( + "switch", + field("expr", $.expression), + "{", + repeat($.switch_entry), + "}" + ) + ), + switch_entry: ($) => + seq( + optional($.modifiers), + choice( + seq( + "case", + seq( + $.switch_pattern, + optional(seq($.where_keyword, $.expression)) + ), + repeat(seq(",", $.switch_pattern)) + ), + $.default_keyword + ), + ":", + $.statements, + optional("fallthrough") + ), + switch_pattern: ($) => alias($._binding_pattern_with_expr, $.pattern), + do_statement: ($) => + prec.right(PRECS["do"], seq("do", $._block, repeat($.catch_block))), + catch_block: ($) => + seq( + $.catch_keyword, + field("error", optional(alias($._binding_pattern_no_expr, $.pattern))), + optional($.where_clause), + $._block + ), + where_clause: ($) => prec.left(seq($.where_keyword, $.expression)), + key_path_expression: ($) => + prec.right( + PRECS.keypath, + seq( + "\\", + optional( + choice($._simple_user_type, $.array_type, $.dictionary_type) + ), + repeat(seq(".", $._key_path_component)) + ) + ), + key_path_string_expression: ($) => + prec.left(seq($._hash_symbol, "keyPath", "(", $.expression, ")")), + _key_path_component: ($) => + prec.left( + choice( + seq($.simple_identifier, repeat($._key_path_postfixes)), + repeat1($._key_path_postfixes) + ) + ), + _key_path_postfixes: ($) => + choice( + "?", + $.bang, + "self", + seq("[", optional(sep1($.value_argument, ",")), "]") + ), + try_operator: ($) => + prec.right( + seq("try", choice(optional($._try_operator_type), $._fake_try_bang)) + ), + _try_operator_type: ($) => + choice(token.immediate("!"), token.immediate("?")), + _assignment_and_operator: ($) => + choice("+=", "-=", "*=", "/=", "%=", $._equal_sign), + _equality_operator: ($) => choice("!=", "!==", $._eq_eq, "==="), + _comparison_operator: ($) => choice("<", ">", "<=", ">="), + _three_dot_operator: ($) => alias("...", "..."), // Weird alias to satisfy highlight queries + _open_ended_range_operator: ($) => alias("..<", "..<"), + _is_operator: ($) => "is", + _additive_operator: ($) => + choice( + alias($._plus_then_ws, "+"), + alias($._minus_then_ws, "-"), + "+", + "-" + ), + // The `/` operator conflicts with a regex literal (which itself appears to conflict with a + // comment, for some reason), so we must give it equivalent token precedence. + _multiplicative_operator: ($) => + choice("*", alias(token(prec(PRECS.regex, "/")), "/"), "%"), + as_operator: ($) => choice($._as, $._as_quest, $._as_bang), + _prefix_unary_operator: ($) => + prec.right( + choice( + "++", + "--", + "-", + "+", + $.bang, + "&", + "~", + $._dot, + $.custom_operator + ) + ), + _bitwise_binary_operator: ($) => choice("&", "|", "^", "<<", ">>"), + _postfix_unary_operator: ($) => choice("++", "--", $.bang), + directly_assignable_expression: ($) => $.expression, + + //////////////////////////////// + // Statements - https://docs.swift.org/swift-book/ReferenceManual/Statements.html + //////////////////////////////// + statements: ($) => + prec.left( + // Left precedence is required in switch statements + seq( + $._local_statement, + repeat(seq($._semi, $._local_statement)), + optional($._semi) + ) + ), + _local_statement: ($) => + choice( + $.expression, + $.local_declaration, + $._labeled_statement, + $.control_transfer_statement + ), + _top_level_statement: ($) => + choice( + $.expression, + $.global_declaration, + $._labeled_statement, + $._throw_statement + ), + _block: ($) => prec(PRECS.block, seq("{", optional($.statements), "}")), + _labeled_statement: ($) => + seq( + optional($.statement_label), + choice( + $.for_statement, + $.while_statement, + $.repeat_while_statement, + $.do_statement, + $.if_statement, + $.guard_statement, + $.switch_statement + ) + ), + statement_label: ($) => token(/[a-zA-Z_][a-zA-Z_0-9]*:/), + for_statement: ($) => + prec( + PRECS.loop, + seq( + "for", + optional($.try_operator), + optional($._await_operator), + field("item", alias($._binding_pattern_no_expr, $.pattern)), + optional($.type_annotation), + "in", + field("collection", $._for_statement_collection), + optional($.where_clause), + $._block + ) + ), + _for_statement_collection: ($) => + // If this expression has "await", this triggers some special-cased logic to prefer function calls. We prefer + // the opposite, though, since function calls may contain trailing code blocks, which are undesirable here. + // + // 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), + + while_statement: ($) => + prec( + PRECS.loop, + seq( + "while", + sep1(field("condition", $.if_condition), ","), + "{", + optional($.statements), + "}" + ) + ), + repeat_while_statement: ($) => + prec( + PRECS.loop, + seq( + "repeat", + "{", + optional($.statements), + "}", + // Make sure we make it to the `while` before assuming this is a parameter pack. + repeat($._implicit_semi), + "while", + sep1(field("condition", $.if_condition), ",") + ) + ), + control_transfer_statement: ($) => + choice( + prec.right(PRECS.control_transfer, $._throw_statement), + prec.right( + PRECS.control_transfer, + seq( + $._optionally_valueful_control_keyword, + field("result", optional($.expression)) + ) + ) + ), + _throw_statement: ($) => seq($.throw_keyword, $.expression), + throw_keyword: ($) => "throw", + _optionally_valueful_control_keyword: ($) => + choice("return", "continue", "break", "yield"), + assignment: ($) => + prec.left( + PRECS.assignment, + seq( + field("target", $.directly_assignable_expression), + field("operator", $._assignment_and_operator), + field("result", $.expression) + ) + ), + value_parameter_pack: ($) => + prec.left(PRECS.parameter_pack, seq("each", $.expression)), + value_pack_expansion: ($) => + prec.left(PRECS.parameter_pack, seq("repeat", $.expression)), + availability_condition: ($) => + seq( + $._hash_symbol, + choice("available", "unavailable"), + "(", + sep1Opt($._availability_argument, ","), + ")" + ), + _availability_argument: ($) => + choice(seq($.identifier, sep1($.integer_literal, ".")), "*"), + //////////////////////////////// + // Declarations - https://docs.swift.org/swift-book/ReferenceManual/Declarations.html + //////////////////////////////// + global_declaration: ($) => + choice( + $.import_declaration, + $.property_declaration, + $.typealias_declaration, + $.function_declaration, + $.init_declaration, + $.class_declaration, + $.protocol_declaration, + $.operator_declaration, + $.precedence_group_declaration, + $.associatedtype_declaration, + $.macro_declaration + ), + type_level_declaration: ($) => + choice( + $.import_declaration, + $.property_declaration, + $.typealias_declaration, + $.function_declaration, + $.init_declaration, + $.class_declaration, + $.protocol_declaration, + $.deinit_declaration, + $.subscript_declaration, + $.operator_declaration, + $.precedence_group_declaration, + $.associatedtype_declaration + ), + local_declaration: ($) => + choice( + alias($._local_property_declaration, $.property_declaration), + alias($._local_typealias_declaration, $.typealias_declaration), + alias($._local_function_declaration, $.function_declaration), + alias($._local_class_declaration, $.class_declaration) + ), + _local_property_declaration: ($) => + seq( + optional($._locally_permitted_modifiers), + $._modifierless_property_declaration + ), + _local_typealias_declaration: ($) => + seq( + optional($._locally_permitted_modifiers), + $._modifierless_typealias_declaration + ), + _local_function_declaration: ($) => + seq( + optional($._locally_permitted_modifiers), + $._modifierless_function_declaration + ), + _local_class_declaration: ($) => + seq( + optional($._locally_permitted_modifiers), + $._modifierless_class_declaration + ), + import_declaration: ($) => + seq( + optional($.modifiers), + "import", + optional($._import_kind), + $.identifier + ), + _import_kind: ($) => + choice( + "typealias", + "struct", + "class", + "enum", + "protocol", + "let", + "var", + "func" + ), + protocol_property_declaration: ($) => + prec.right( + seq( + optional($.modifiers), + field("name", alias($._binding_kind_and_pattern, $.pattern)), + optional($.type_annotation), + optional($.type_constraints), + $.protocol_property_requirements + ) + ), + protocol_property_requirements: ($) => + seq("{", repeat(choice($.getter_specifier, $.setter_specifier)), "}"), + property_declaration: ($) => + seq(optional($.modifiers), $._modifierless_property_declaration), + _modifierless_property_declaration: ($) => + prec.right( + seq( + $._possibly_async_binding_pattern_kind, + sep1($._single_modifierless_property_declaration, ",") + ) + ), + _single_modifierless_property_declaration: ($) => + prec.left( + seq( + field("name", alias($._no_expr_pattern_already_bound, $.pattern)), + optional($.type_annotation), + optional($.type_constraints), + optional( + choice( + $._expression_with_willset_didset, + $._expression_without_willset_didset, + $.willset_didset_block, + field("computed_value", $.computed_property) + ) + ) + ) + ), + _expression_with_willset_didset: ($) => + prec.dynamic( + 1, + seq( + $._equal_sign, + field("value", $.expression), + $.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), "}") + ), + willset_clause: ($) => + seq( + optional($.modifiers), + "willSet", + optional(seq("(", $.simple_identifier, ")")), + $._block + ), + didset_clause: ($) => + seq( + optional($.modifiers), + "didSet", + optional(seq("(", $.simple_identifier, ")")), + $._block + ), + typealias_declaration: ($) => + seq(optional($.modifiers), $._modifierless_typealias_declaration), + _modifierless_typealias_declaration: ($) => + seq( + "typealias", + field("name", alias($.simple_identifier, $.type_identifier)), + optional($.type_parameters), + $._equal_sign, + field("value", $.type) + ), + function_declaration: ($) => + prec.right( + seq($._bodyless_function_declaration, field("body", $.function_body)) + ), + _modifierless_function_declaration: ($) => + prec.right( + seq( + $._modifierless_function_declaration_no_body, + field("body", $.function_body) + ) + ), + _bodyless_function_declaration: ($) => + seq( + optional($.modifiers), + optional("class"), // XXX: This should be possible in non-last position, but that creates parsing ambiguity + $._modifierless_function_declaration_no_body + ), + _modifierless_function_declaration_no_body: ($) => + prec.right( + seq( + $._non_constructor_function_decl, + optional($.type_parameters), + $._function_value_parameters, + optional($._async_keyword), + optional(choice($.throws_clause, $.throws)), + optional( + seq( + $._arrow_operator, + field("return_type", $._possibly_implicitly_unwrapped_type) + ) + ), + optional($.type_constraints) + ) + ), + function_body: ($) => $._block, + macro_declaration: ($) => + seq( + $._macro_head, + $.simple_identifier, + optional($.type_parameters), + $._macro_signature, + optional(field("definition", $.macro_definition)), + optional($.type_constraints) + ), + _macro_head: ($) => seq(optional($.modifiers), "macro"), + _macro_signature: ($) => + seq( + $._function_value_parameters, + optional(seq($._arrow_operator, $.unannotated_type)) + ), + macro_definition: ($) => + seq( + $._equal_sign, + field("body", choice($.expression, $.external_macro_definition)) + ), + + external_macro_definition: ($) => + seq($._hash_symbol, "externalMacro", $.value_arguments), + + class_declaration: ($) => + seq(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), + optional(seq(":", $._inheritance_specifiers)), + optional($.type_constraints), + field("body", $.class_body) + ), + seq( + field("declaration_kind", "extension"), + field("name", $.unannotated_type), + optional($.type_parameters), + optional(seq(":", $._inheritance_specifiers)), + optional($.type_constraints), + field("body", $.class_body) + ), + seq( + optional("indirect"), + field("declaration_kind", "enum"), + field("name", alias($.simple_identifier, $.type_identifier)), + optional($.type_parameters), + optional(seq(":", $._inheritance_specifiers)), + optional($.type_constraints), + field("body", $.enum_class_body) + ) + ) + ), + class_body: ($) => seq("{", optional($._class_member_declarations), "}"), + _inheritance_specifiers: ($) => + prec.left(sep1($._annotated_inheritance_specifier, choice(",", "&"))), + inheritance_specifier: ($) => + prec.left( + field( + "inherits_from", + choice($.user_type, $.function_type, $.suppressed_constraint) + ) + ), + _annotated_inheritance_specifier: ($) => + seq(repeat($.attribute), $.inheritance_specifier), + type_parameters: ($) => + seq( + "<", + sep1Opt($.type_parameter, ","), + optional($.type_constraints), + ">" + ), + type_parameter: ($) => + seq( + optional($.type_parameter_modifiers), + $._type_parameter_possibly_packed, + optional(seq(":", $.type)) + ), + _type_parameter_possibly_packed: ($) => + choice( + alias($.simple_identifier, $.type_identifier), + $.type_parameter_pack + ), + + type_constraints: ($) => + prec.right(seq($.where_keyword, sep1Opt($.type_constraint, ","))), + type_constraint: ($) => + choice($.inheritance_constraint, $.equality_constraint), + inheritance_constraint: ($) => + seq( + repeat($.attribute), + field("constrained_type", $._constrained_type), + ":", + field("inherits_from", $._possibly_implicitly_unwrapped_type) + ), + equality_constraint: ($) => + seq( + repeat($.attribute), + field("constrained_type", $._constrained_type), + choice($._equal_sign, $._eq_eq), + field("must_equal", $.type) + ), + _constrained_type: ($) => choice($.identifier, $.nested_type_identifier), + nested_type_identifier: ($) => + seq( + $.unannotated_type, + optional(seq(".", sep1($.simple_identifier, "."))) + ), + _class_member_separator: ($) => choice($._semi, $.multiline_comment), + _class_member_declarations: ($) => + seq( + sep1($.type_level_declaration, $._class_member_separator), + optional($._class_member_separator) + ), + _function_value_parameters: ($) => + repeat1( + seq("(", optional(sep1Opt($._function_value_parameter, ",")), ")") + ), + _function_value_parameter: ($) => + seq( + optional($.attribute), + $.parameter, + optional(seq($._equal_sign, field("default_value", $.expression))) + ), + parameter: ($) => + seq( + optional(field("external_name", $.simple_identifier)), + field("name", $.simple_identifier), + ":", + optional($.parameter_modifiers), + field("type", $._possibly_implicitly_unwrapped_type), + optional($._three_dot_operator) + ), + _non_constructor_function_decl: ($) => + seq( + "func", + field("name", choice($.simple_identifier, $.referenceable_operator)) + ), + referenceable_operator: ($) => + choice( + $.custom_operator, + $._comparison_operator, + $._additive_operator, + $._multiplicative_operator, + $._equality_operator, + $._assignment_and_operator, + "++", + "--", + $.bang, + "~", + "|", + "^", + "<<", + ">>", + "&" + ), + // 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 + // operator. + _equal_sign: ($) => alias($._eq_custom, "="), + _eq_eq: ($) => alias($._eq_eq_custom, "=="), + _dot: ($) => alias($._dot_custom, "."), + _arrow_operator: ($) => alias($._arrow_operator_custom, "->"), + _conjunction_operator: ($) => alias($._conjunction_operator_custom, "&&"), + _disjunction_operator: ($) => alias($._disjunction_operator_custom, "||"), + _nil_coalescing_operator: ($) => + alias($._nil_coalescing_operator_custom, "??"), + _as: ($) => alias($._as_custom, "as"), + _as_quest: ($) => alias($._as_quest_custom, "as?"), + _as_bang: ($) => alias($._as_bang_custom, "as!"), + _hash_symbol: ($) => alias($._hash_symbol_custom, "#"), + bang: ($) => choice($._bang_custom, "!"), + _async_keyword: ($) => alias($._async_keyword_custom, "async"), + _async_modifier: ($) => token("async"), + throws: ($) => choice($._throws_keyword, $._rethrows_keyword), + throws_clause: ($) => + seq($._throws_keyword, "(", field("type", $.unannotated_type), ")"), + enum_class_body: ($) => + seq("{", repeat(choice($.enum_entry, $.type_level_declaration)), "}"), + enum_entry: ($) => + seq( + optional($.modifiers), + optional("indirect"), + "case", + sep1( + seq( + field("name", $.simple_identifier), + optional($._enum_entry_suffix) + ), + "," + ), + optional(";") + ), + _enum_entry_suffix: ($) => + choice( + field("data_contents", $.enum_type_parameters), + seq($._equal_sign, field("raw_value", $.expression)) + ), + enum_type_parameters: ($) => + seq( + "(", + optional( + sep1( + seq( + optional( + seq(optional($.wildcard_pattern), $.simple_identifier, ":") + ), + $.type, + optional(seq($._equal_sign, $.expression)) + ), + "," + ) + ), + ")" + ), + protocol_declaration: ($) => + prec.right( + seq( + optional($.modifiers), + field("declaration_kind", "protocol"), + field("name", alias($.simple_identifier, $.type_identifier)), + optional($.type_parameters), + optional(seq(":", $._inheritance_specifiers)), + 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)), + protocol_member_declaration: ($) => + choice( + $.protocol_function_declaration, + $.init_declaration, + $.deinit_declaration, + $.protocol_property_declaration, + $.typealias_declaration, + $.associatedtype_declaration, + $.subscript_declaration + ), + protocol_function_declaration: ($) => + seq( + $._bodyless_function_declaration, + optional(field("body", $.function_body)) + ), + init_declaration: ($) => + prec.right( + seq( + optional($.modifiers), + optional("class"), + field("name", "init"), + optional(choice($._quest, $.bang)), + optional($.type_parameters), + $._function_value_parameters, + optional($._async_keyword), + optional(choice($.throws_clause, $.throws)), + optional($.type_constraints), + optional(field("body", $.function_body)) + ) + ), + deinit_declaration: ($) => + prec.right( + seq(optional($.modifiers), "deinit", field("body", $.function_body)) + ), + subscript_declaration: ($) => + prec.right( + seq( + optional($.modifiers), + "subscript", + optional($.type_parameters), + $._function_value_parameters, + optional( + seq( + $._arrow_operator, + field("return_type", $._possibly_implicitly_unwrapped_type) + ) + ), + optional($.type_constraints), + $.computed_property + ) + ), + computed_property: ($) => + seq( + "{", + choice( + optional($.statements), + repeat( + choice($.computed_getter, $.computed_setter, $.computed_modify) + ) + ), + "}" + ), + computed_getter: ($) => + seq(repeat($.attribute), $.getter_specifier, optional($._block)), + computed_modify: ($) => + seq(repeat($.attribute), $.modify_specifier, optional($._block)), + computed_setter: ($) => + seq( + repeat($.attribute), + $.setter_specifier, + optional(seq("(", $.simple_identifier, ")")), + optional($._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"), + _getter_effects: ($) => + repeat1(choice($._async_keyword, $.throws_clause, $.throws)), + operator_declaration: ($) => + seq( + choice("prefix", "infix", "postfix"), + "operator", + $.referenceable_operator, + optional(seq(":", $.simple_identifier)), + 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)), "}"), + precedence_group_declaration: ($) => + seq( + "precedencegroup", + $.simple_identifier, + "{", + optional($.precedence_group_attributes), + "}" + ), + precedence_group_attributes: ($) => repeat1($.precedence_group_attribute), + precedence_group_attribute: ($) => + seq( + $.simple_identifier, + ":", + choice($.simple_identifier, $.boolean_literal) + ), + associatedtype_declaration: ($) => + seq( + optional($.modifiers), + "associatedtype", + field("name", alias($.simple_identifier, $.type_identifier)), + optional(seq(":", field("must_inherit", $.type))), + optional($.type_constraints), + optional(seq($._equal_sign, field("default_value", $.type))) + ), + //////////////////////////////// + // Attributes - https://docs.swift.org/swift-book/ReferenceManual/Attributes.html + //////////////////////////////// + attribute: ($) => + seq( + "@", + $.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), + // Unlabeled function parameters, simple identifiers, or `*` + $.expression, + // References to param names (used in `@objc(foo:bar:)`) + repeat1(seq($.simple_identifier, ":")), + // Version restrictions (iOS 3.4.5, Swift 5.0.0) + seq(repeat1($.simple_identifier), sep1($.integer_literal, ".")) + ), + //////////////////////////////// + // Patterns - https://docs.swift.org/swift-book/ReferenceManual/Patterns.html + //////////////////////////////// + _universally_allowed_pattern: ($) => + choice( + $.wildcard_pattern, + $._tuple_pattern, + $._type_casting_pattern, + $._case_pattern + ), + _bound_identifier: ($) => field("bound_identifier", $.simple_identifier), + + _binding_pattern_no_expr: ($) => + seq( + choice( + $._universally_allowed_pattern, + $._binding_pattern, + $._bound_identifier + ), + optional($._quest) + ), + _no_expr_pattern_already_bound: ($) => + seq( + choice($._universally_allowed_pattern, $._bound_identifier), + optional($._quest) + ), + _binding_pattern_with_expr: ($) => + seq( + choice( + $._universally_allowed_pattern, + $._binding_pattern, + $.expression + ), + optional($._quest) + ), + _non_binding_pattern_with_expr: ($) => + seq( + choice($._universally_allowed_pattern, $.expression), + optional($._quest) + ), + _direct_or_indirect_binding: ($) => + seq( + choice( + $._binding_kind_and_pattern, + seq("case", $._binding_pattern_no_expr) + ), + optional($.type_annotation) + ), + value_binding_pattern: ($) => field("mutability", choice("var", "let")), + _possibly_async_binding_pattern_kind: ($) => + seq(optional($._async_modifier), $.value_binding_pattern), + _binding_kind_and_pattern: ($) => + seq( + $._possibly_async_binding_pattern_kind, + $._no_expr_pattern_already_bound + ), + wildcard_pattern: ($) => "_", + _tuple_pattern_item: ($) => + choice( + seq( + $.simple_identifier, + seq(":", alias($._binding_pattern_with_expr, $.pattern)) + ), + alias($._binding_pattern_with_expr, $.pattern) + ), + _tuple_pattern: ($) => seq("(", sep1Opt($._tuple_pattern_item, ","), ")"), + _case_pattern: ($) => + seq( + optional("case"), + optional($.user_type), // XXX this should just be _type but that creates ambiguity + $._dot, + $.simple_identifier, + optional($._tuple_pattern) + ), + _type_casting_pattern: ($) => + choice( + seq("is", $.type), + seq(alias($._binding_pattern_no_expr, $.pattern), $._as, $.type) + ), + _binding_pattern: ($) => + seq( + seq(optional("case"), $.value_binding_pattern), + $._no_expr_pattern_already_bound + ), + + // ========== + // Modifiers + // ========== + modifiers: ($) => + repeat1( + prec.left( + choice($._non_local_scope_modifier, $._locally_permitted_modifiers) + ) + ), + _locally_permitted_modifiers: ($) => + repeat1(choice($.attribute, $._locally_permitted_modifier)), + parameter_modifiers: ($) => repeat1($.parameter_modifier), + _modifier: ($) => + choice($._non_local_scope_modifier, $._locally_permitted_modifier), + _non_local_scope_modifier: ($) => + choice( + $.member_modifier, + $.visibility_modifier, + $.function_modifier, + $.mutation_modifier, + $.property_modifier, + $.parameter_modifier + ), + _locally_permitted_modifier: ($) => + choice( + $.ownership_modifier, + $.inheritance_modifier, + $.property_behavior_modifier + ), + property_behavior_modifier: ($) => "lazy", + type_modifiers: ($) => repeat1($.attribute), + member_modifier: ($) => + choice("override", "convenience", "required", "nonisolated"), + visibility_modifier: ($) => + seq( + choice( + "public", + "private", + "internal", + "fileprivate", + "open", + "package" + ), + optional(seq("(", "set", ")")) + ), + type_parameter_modifiers: ($) => repeat1($.attribute), + function_modifier: ($) => choice("infix", "postfix", "prefix"), + mutation_modifier: ($) => choice("mutating", "nonmutating"), + property_modifier: ($) => + choice("static", "dynamic", "optional", "class", "distributed"), + inheritance_modifier: ($) => choice("final"), + parameter_modifier: ($) => + choice( + "inout", + "@escaping", + "@autoclosure", + $._parameter_ownership_modifier + ), + ownership_modifier: ($) => + choice("weak", "unowned", "unowned(safe)", "unowned(unsafe)"), + _parameter_ownership_modifier: ($) => choice("borrowing", "consuming"), + use_site_target: ($) => + seq( + choice( + "property", + "get", + "set", + "receiver", + "param", + "setparam", + "delegate" + ), + ":" + ), + directive: ($) => + prec.right( + PRECS.comment, + choice( + seq(alias($._directive_if, "#if"), $._compilation_condition), + seq(alias($._directive_elseif, "#elseif"), $._compilation_condition), + seq(alias($._directive_else, "#else")), + seq(alias($._directive_endif, "#endif")) + ) + ), + _compilation_condition: ($) => + prec.right( + choice( + seq("os", "(", $.simple_identifier, ")"), + seq("arch", "(", $.simple_identifier, ")"), + seq( + "swift", + "(", + $._comparison_operator, + sep1($.integer_literal, "."), + ")" + ), + seq( + "compiler", + "(", + $._comparison_operator, + sep1($.integer_literal, "."), + ")" + ), + seq("canImport", "(", sep1($.simple_identifier, "."), ")"), + seq("targetEnvironment", "(", $.simple_identifier, ")"), + $.boolean_literal, + $.simple_identifier, + seq("(", $._compilation_condition, ")"), + seq("!", $._compilation_condition), + seq( + $._compilation_condition, + $._conjunction_operator, + $._compilation_condition + ), + seq( + $._compilation_condition, + $._disjunction_operator, + $._compilation_condition + ) + ) + ), + diagnostic: ($) => + prec( + PRECS.comment, + seq( + $._hash_symbol, + choice( + // Using regexes here, rather than actually validating the string literal, because complex string literals + // cannot be used inside `token()` and we need that to ensure we get the right precedence. + seq(/error([^\r\n]*)/), + seq(/warning([^\r\n]*)/), + seq(/sourceLocation([^\r\n]*)/) + ) + ) + ), + // Dumping ground for any nodes that used to exist in the grammar, but have since been removed for whatever + // reason. + // Neovim applies updates non-atomically to the parser and the queries. Meanwhile, `tree-sitter` rejects any query + // that contains any unrecognized nodes. Putting those two facts together, we see that we must never remove nodes + // that once existed. + unused_for_backward_compatibility: ($) => + choice(alias("unused1", "try?"), alias("unused2", "try!")), + }, +}); +function sep1(rule, separator) { + return seq(rule, repeat(seq(separator, rule))); +} +function sep1Opt(rule, separator) { + return seq(rule, repeat(seq(separator, rule)), optional(separator)); +} + +function tree_sitter_version_supports_emoji() { + try { + return ( + TREE_SITTER_CLI_VERSION_MAJOR > 0 || + TREE_SITTER_CLI_VERSION_MINOR > 20 || + TREE_SITTER_CLI_VERSION_PATCH >= 5 + ); + } catch (err) { + if (err instanceof ReferenceError) { + return false; + } else { + throw err; + } + } +} diff --git a/unified/extractor/tree-sitter-swift/node-types.yml b/unified/extractor/tree-sitter-swift/node-types.yml new file mode 100644 index 000000000000..c4bf650944b2 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/node-types.yml @@ -0,0 +1,728 @@ +supertypes: + expression: + - additive_expression + - array_literal + - as_expression + - assignment + - await_expression + - bin_literal + - bitwise_operation + - boolean_literal + - call_expression + - check_expression + - comparison_expression + - conjunction_expression + - constructor_expression + - diagnostic + - dictionary_literal + - directive + - disjunction_expression + - equality_expression + - fully_open_range + - hex_literal + - if_statement + - infix_expression + - integer_literal + - key_path_expression + - key_path_string_expression + - lambda_literal + - line_string_literal + - macro_invocation + - multi_line_string_literal + - multiplicative_expression + - navigation_expression + - "nil" + - nil_coalescing_expression + - oct_literal + - open_end_range_expression + - open_start_range_expression + - optional_chain_marker + - playground_literal + - postfix_expression + - prefix_expression + - range_expression + - raw_string_literal + - real_literal + - referenceable_operator + - regex_literal + - selector_expression + - self_expression + - simple_identifier + - special_literal + - super_expression + - switch_statement + - ternary_expression + - try_expression + - tuple_expression + - value_pack_expansion + - value_parameter_pack + global_declaration: + - associatedtype_declaration + - class_declaration + - function_declaration + - import_declaration + - init_declaration + - macro_declaration + - operator_declaration + - precedence_group_declaration + - property_declaration + - protocol_declaration + - typealias_declaration + local_declaration: + - class_declaration + - function_declaration + - property_declaration + - typealias_declaration + protocol_member_declaration: + - associatedtype_declaration + - deinit_declaration + - init_declaration + - protocol_function_declaration + - protocol_property_declaration + - subscript_declaration + - typealias_declaration + type_level_declaration: + - associatedtype_declaration + - class_declaration + - deinit_declaration + - function_declaration + - import_declaration + - init_declaration + - operator_declaration + - precedence_group_declaration + - property_declaration + - protocol_declaration + - subscript_declaration + - typealias_declaration + unannotated_type: + - array_type + - dictionary_type + - existential_type + - function_type + - metatype + - opaque_type + - optional_type + - protocol_composition_type + - suppressed_constraint + - tuple_type + - type_pack_expansion + - type_parameter_pack + - user_type + +named: + additive_expression: + lhs: expression + op: ["+", "-"] + rhs: expression + array_literal: + element*: expression + array_type: + element: type + as_expression: + $children: as_operator + expr: expression + type: type + as_operator: + assignment: + operator: ["%=", "*=", "+=", "-=", "/=", "="] + result: expression + target: directly_assignable_expression + associatedtype_declaration: + $children*: [modifiers, type_constraints] + default_value?: type + must_inherit?: type + name: type_identifier + attribute: + $children+: [expression, user_type] + availability_condition: + $children*: [identifier, integer_literal] + await_expression: + $children?: expression + expr?: expression + bang: + bin_literal: + bitwise_operation: + lhs: expression + op: ["&", "<<", ">>", "^", "|"] + rhs: expression + boolean_literal: + call_expression: + $children+: [call_suffix, expression] + call_suffix: + $children+: [lambda_literal, value_arguments] + name*: simple_identifier + capture_list: + $children+: capture_list_item + capture_list_item: + $children?: ownership_modifier + name: [self_expression, simple_identifier] + value?: expression + catch_block: + $children+: [catch_keyword, statements, where_clause] + error?: pattern + catch_keyword: + check_expression: + op: "is" + target: expression + type: type + class_body: + $children*: [multiline_comment, type_level_declaration] + class_declaration: + $children*: [attribute, inheritance_modifier, inheritance_specifier, modifiers, ownership_modifier, property_behavior_modifier, type_constraints, type_parameters] + body: [class_body, enum_class_body] + declaration_kind: ["actor", "class", "enum", "extension", "struct"] + name: [type_identifier, unannotated_type] + comment: + comparison_expression: + lhs: expression + op: ["<", "<=", ">", ">="] + rhs: expression + computed_getter: + $children+: [attribute, getter_specifier, statements] + computed_modify: + $children+: [attribute, modify_specifier, statements] + computed_property: + $children*: [computed_getter, computed_modify, computed_setter, statements] + computed_setter: + $children+: [attribute, setter_specifier, simple_identifier, statements] + conjunction_expression: + lhs: expression + op: "&&" + rhs: expression + constructor_expression: + $children: constructor_suffix + constructed_type: [array_type, dictionary_type, user_type] + constructor_suffix: + $children+: [lambda_literal, value_arguments] + name*: simple_identifier + control_transfer_statement: + $children*: [expression, throw_keyword] + result?: expression + custom_operator: + default_keyword: + deinit_declaration: + $children?: modifiers + body: function_body + 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] + diagnostic: + dictionary_literal: + key*: expression + value*: expression + dictionary_type: + key: type + value: type + didset_clause: + $children*: [modifiers, simple_identifier, statements] + directive: + $children*: [boolean_literal, integer_literal, simple_identifier] + directly_assignable_expression: + $children: expression + disjunction_expression: + lhs: expression + op: "||" + rhs: expression + do_statement: + $children*: [catch_block, statements] + else: + enum_class_body: + $children*: [enum_entry, type_level_declaration] + enum_entry: + $children?: modifiers + data_contents*: enum_type_parameters + name+: simple_identifier + raw_value*: expression + enum_type_parameters: + $children*: [expression, type, wildcard_pattern] + equality_constraint: + $children*: attribute + constrained_type: [identifier, nested_type_identifier] + must_equal: type + equality_expression: + lhs: expression + op: ["!=", "!==", "==", "==="] + rhs: expression + existential_type: + $children: unannotated_type + external_macro_definition: + $children: value_arguments + for_statement: + $children*: [statements, try_operator, type_annotation, where_clause] + collection: expression + item: pattern + 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 + name: [referenceable_operator, simple_identifier] + return_type?: [implicitly_unwrapped_type, type] + function_modifier: + function_type: + $children?: [throws, throws_clause] + params: unannotated_type + return_type: type + getter_specifier: + $children*: [mutation_modifier, throws, throws_clause] + guard_statement: + $children+: [else, statements] + condition+: if_condition + hex_literal: + identifier: + $children+: simple_identifier + if_condition: + $children: [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 + if_statement: + $children*: [else, if_statement, statements] + condition+: if_condition + implicitly_unwrapped_type: + $children: type + import_declaration: + $children+: [identifier, modifiers] + infix_expression: + lhs: expression + op: custom_operator + rhs: expression + inheritance_constraint: + $children*: 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" + integer_literal: + interpolated_expression: + $children?: type_modifiers + name?: value_argument_label + reference_specifier*: value_argument_label + value?: expression + key_path_expression: + $children*: [array_type, bang, dictionary_type, simple_identifier, type_arguments, type_identifier, value_argument] + key_path_string_expression: + $children: expression + lambda_function_type: + $children*: [lambda_function_type_parameters, throws, throws_clause] + return_type?: [implicitly_unwrapped_type, type] + lambda_function_type_parameters: + $children+: lambda_parameter + lambda_literal: + $children*: [attribute, statements] + captures?: capture_list + type?: lambda_function_type + lambda_parameter: + $children?: [parameter_modifiers, self_expression] + external_name?: simple_identifier + name?: 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 + macro_definition: + body: [expression, external_macro_definition] + macro_invocation: + $children+: [call_suffix, simple_identifier, type_parameters] + member_modifier: + metatype: + $children: unannotated_type + modifiers: + $children+: [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 + multi_line_str_text: + multi_line_string_literal: + interpolation*: interpolated_expression + text*: ["\"", multi_line_str_text, str_escaped_char] + multiline_comment: + multiplicative_expression: + lhs: expression + op: ["%", "*", "/"] + rhs: expression + mutation_modifier: + navigation_expression: + suffix: navigation_suffix + target+: ["(", ")", array_type, dictionary_type, existential_type, expression, opaque_type, user_type] + navigation_suffix: + suffix: [integer_literal, simple_identifier] + nested_type_identifier: + $children+: [simple_identifier, unannotated_type] + nil_coalescing_expression: + if_nil: expression + value: expression + oct_literal: + opaque_type: + $children: 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] + optional_chain_marker: + $children: expression + optional_type: + wrapped: [array_type, dictionary_type, tuple_type, user_type] + ownership_modifier: + parameter: + $children?: parameter_modifiers + external_name?: simple_identifier + name: simple_identifier + type: [implicitly_unwrapped_type, type] + parameter_modifier: + parameter_modifiers: + $children+: parameter_modifier + pattern: + $children*: [expression, pattern, type, user_type, value_binding_pattern, wildcard_pattern] + bound_identifier?: simple_identifier + playground_literal: + $children+: expression + postfix_expression: + operation: ["++", "--", bang] + target: expression + precedence_group_attribute: + $children+: [boolean_literal, simple_identifier] + precedence_group_attributes: + $children+: precedence_group_attribute + precedence_group_declaration: + $children+: [precedence_group_attributes, simple_identifier] + prefix_expression: + operation: ["&", "+", "++", "-", "--", ".", bang, custom_operator, "~"] + target: expression + property_behavior_modifier: + 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 + property_modifier: + protocol_body: + $children*: protocol_member_declaration + protocol_composition_type: + $children+: unannotated_type + protocol_declaration: + $children*: [attribute, inheritance_specifier, modifiers, type_constraints, type_parameters] + body: protocol_body + declaration_kind: "protocol" + name: type_identifier + protocol_function_declaration: + $children*: [attribute, modifiers, parameter, throws, throws_clause, type_constraints, type_parameters] + body?: function_body + default_value*: expression + name: [referenceable_operator, simple_identifier] + return_type?: [implicitly_unwrapped_type, type] + protocol_property_declaration: + $children+: [modifiers, protocol_property_requirements, type_annotation, type_constraints] + name: pattern + protocol_property_requirements: + $children*: [getter_specifier, setter_specifier] + range_expression: + end: expression + op: ["...", "..<"] + start: expression + raw_str_continuing_indicator: + raw_str_end_part: + raw_str_interpolation: + $children: raw_str_interpolation_start + interpolation+: interpolated_expression + raw_str_interpolation_start: + raw_str_part: + raw_string_literal: + $children*: raw_str_continuing_indicator + interpolation*: raw_str_interpolation + text+: [raw_str_end_part, raw_str_part] + real_literal: + referenceable_operator: + $children?: [bang, custom_operator] + regex_literal: + repeat_while_statement: + $children?: statements + condition+: if_condition + selector_expression: + $children: expression + self_expression: + setter_specifier: + $children?: mutation_modifier + shebang_line: + simple_identifier: + source_file: + $children*: [do_statement, expression, for_statement, global_declaration, guard_statement, repeat_while_statement, shebang_line, 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 + return_type?: [implicitly_unwrapped_type, type] + super_expression: + suppressed_constraint: + suppressed: type_identifier + switch_entry: + $children+: [default_keyword, expression, modifiers, statements, switch_pattern, where_keyword] + switch_pattern: + $children: pattern + switch_statement: + $children*: switch_entry + expr: expression + ternary_expression: + condition: expression + if_false: expression + if_true: expression + throw_keyword: + throws: + throws_clause: + type: unannotated_type + try_expression: + $children: try_operator + expr: expression + try_operator: + tuple_expression: + name*: simple_identifier + value+: expression + tuple_type: + $children?: tuple_type_item + element*: tuple_type_item + tuple_type_item: + $children*: [dictionary_type, existential_type, opaque_type, parameter_modifiers, wildcard_pattern] + name?: simple_identifier + type?: type + type: + modifiers?: type_modifiers + name: unannotated_type + type_annotation: + type: [implicitly_unwrapped_type, type] + type_arguments: + $children+: type + type_constraint: + $children: [equality_constraint, inheritance_constraint] + type_constraints: + $children+: [type_constraint, where_keyword] + type_identifier: + type_modifiers: + $children+: attribute + type_pack_expansion: + $children: unannotated_type + type_parameter: + $children+: [type, type_identifier, type_parameter_modifiers, type_parameter_pack] + type_parameter_modifiers: + $children+: attribute + type_parameter_pack: + $children: unannotated_type + type_parameters: + $children+: [type_constraints, type_parameter] + typealias_declaration: + $children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier, type_parameters] + name: type_identifier + value: type + user_type: + $children+: [type_arguments, type_identifier] + value_argument: + $children?: type_modifiers + name?: value_argument_label + reference_specifier*: value_argument_label + value?: expression + value_argument_label: + $children: simple_identifier + value_arguments: + $children*: value_argument + value_binding_pattern: + mutability: ["let", "var"] + value_pack_expansion: + $children: expression + value_parameter_pack: + $children: expression + visibility_modifier: + where_clause: + $children+: [expression, where_keyword] + where_keyword: + while_statement: + $children?: statements + condition+: if_condition + wildcard_pattern: + willset_clause: + $children*: [modifiers, simple_identifier, statements] + willset_didset_block: + $children+: [didset_clause, willset_clause] + +unnamed: + - "?" + - "!" + - "!=" + - "!==" + - "\"" + - "\"\"\"" + - "#" + - "#else" + - "#elseif" + - "#endif" + - "#if" + - "%" + - "%=" + - "&" + - "&&" + - "(" + - ")" + - "*" + - "*=" + - "+" + - "++" + - "+=" + - "," + - "-" + - "--" + - "-=" + - "->" + - "." + - "..." + - "..<" + - "/" + - "/=" + - ":" + - ";" + - "<" + - "<<" + - "<=" + - "=" + - "==" + - "===" + - ">" + - ">=" + - ">>" + - "?" + - "??" + - "@" + - "@autoclosure" + - "@escaping" + - "Protocol" + - "Type" + - "[" + - "\\" + - "\\(" + - "]" + - "^" + - "^{" + - "_modify" + - "actor" + - "any" + - "arch" + - "as" + - "as!" + - "as?" + - "associatedtype" + - "async" + - "available" + - "await" + - "borrowing" + - "break" + - "canImport" + - "case" + - "class" + - "colorLiteral" + - "column" + - "compiler" + - "consuming" + - "continue" + - "convenience" + - "deinit" + - "didSet" + - "distributed" + - "do" + - "dsohandle" + - "dynamic" + - "each" + - "enum" + - "extension" + - "externalMacro" + - "fallthrough" + - "false" + - "file" + - "fileID" + - "fileLiteral" + - "filePath" + - "fileprivate" + - "final" + - "for" + - "func" + - "function" + - "get" + - "getter:" + - "guard" + - "if" + - "imageLiteral" + - "import" + - "in" + - "indirect" + - "infix" + - "init" + - "inout" + - "internal" + - "is" + - "keyPath" + - "lazy" + - "let" + - "line" + - "macro" + - "mutating" + - "nil" + - "nonisolated" + - "nonmutating" + - "open" + - "operator" + - "optional" + - "os" + - "override" + - "package" + - "postfix" + - "precedencegroup" + - "prefix" + - "private" + - "protocol" + - "public" + - "repeat" + - "required" + - "return" + - "selector" + - "self" + - "set" + - "setter:" + - "some" + - "static" + - "struct" + - "subscript" + - "super" + - "swift" + - "switch" + - "targetEnvironment" + - "true" + - "try" + - "typealias" + - "u" + - "unavailable" + - "unowned" + - "unowned(safe)" + - "unowned(unsafe)" + - "var" + - "weak" + - "while" + - "willSet" + - "yield" + - "{" + - "|" + - "||" + - "}" + - "~" diff --git a/unified/extractor/tree-sitter-swift/package.json b/unified/extractor/tree-sitter-swift/package.json new file mode 100644 index 000000000000..68dcf7cc42fc --- /dev/null +++ b/unified/extractor/tree-sitter-swift/package.json @@ -0,0 +1,68 @@ +{ + "name": "tree-sitter-swift", + "version": "0.7.2", + "description": "A tree-sitter grammar for the Swift programming language.", + "main": "bindings/node/index.js", + "types": "bindings/node", + "scripts": { + "install": "node-gyp-build", + "prestart": "tree-sitter build --wasm", + "start": "tree-sitter playground", + "test": "node --test bindings/node/*_test.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/alex-pinkus/tree-sitter-swift.git" + }, + "tree-sitter": [ + { + "scope": "source.swift", + "file-types": [ + "swift" + ], + "injection-regex": "swift", + "highlights": "queries/highlights.scm", + "locals": "queries/locals.scm", + "injections": "queries/injections.scm" + } + ], + "keywords": [ + "parser", + "swift" + ], + "files": [ + "grammar.js", + "tree-sitter.json", + "binding.gyp", + "prebuilds/**", + "bindings/node/*", + "queries/*", + "scripts/*", + "src/**" + ], + "author": "Alex Pinkus ", + "license": "MIT", + "bugs": { + "url": "https://github.com/alex-pinkus/tree-sitter-swift/issues" + }, + "homepage": "https://github.com/alex-pinkus/tree-sitter-swift#readme", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0", + "tree-sitter-cli": "^0.23", + "which": "2.0.2" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + }, + "devDependencies": { + "node-gyp": "^10.0.1", + "prebuildify": "^6.0.0", + "prettier": "2.3.2" + } +} diff --git a/unified/extractor/tree-sitter-swift/queries/folds.scm b/unified/extractor/tree-sitter-swift/queries/folds.scm new file mode 100644 index 000000000000..ca7f72593aa8 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/folds.scm @@ -0,0 +1,35 @@ +; format-ignore +[ + (protocol_body) ; protocol Foo { ... } + (class_body) ; class Foo { ... } + (enum_class_body) ; enum Foo { ... } + (function_body) ; func Foo (...) {...} + (computed_property) ; { ... } + + (computed_getter) ; get { ... } + (computed_setter) ; set { ... } + + (do_statement) + (if_statement) + (for_statement) + (switch_statement) + (while_statement) + (guard_statement) + (switch_entry) + + (type_parameters) ; x + (tuple_type) ; (...) + (array_type) ; [String] + (dictionary_type) ; [Foo: Bar] + + (call_expression) ; callFunc(...) + (tuple_expression) ; ( foo + bar ) + (array_literal) ; [ foo, bar ] + (dictionary_literal) ; [ foo: bar, x: y ] + (lambda_literal) + (willset_didset_block) + (willset_clause) + (didset_clause) + + (import_declaration)+ +] @fold diff --git a/unified/extractor/tree-sitter-swift/queries/highlights.scm b/unified/extractor/tree-sitter-swift/queries/highlights.scm new file mode 100644 index 000000000000..82ad68d4ed1c --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/highlights.scm @@ -0,0 +1,336 @@ +[ + "." + ";" + ":" + "," +] @punctuation.delimiter + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + +; Identifiers +(type_identifier) @type + +[ + (self_expression) + (super_expression) +] @variable.builtin + +; Declarations +[ + "func" + "deinit" +] @keyword.function + +[ + (visibility_modifier) + (member_modifier) + (function_modifier) + (property_modifier) + (parameter_modifier) + (inheritance_modifier) + (mutation_modifier) +] @keyword.modifier + +(simple_identifier) @variable + +(function_declaration + (simple_identifier) @function.method) + +(protocol_function_declaration + name: (simple_identifier) @function.method) + +(init_declaration + "init" @constructor) + +(parameter + external_name: (simple_identifier) @variable.parameter) + +(parameter + name: (simple_identifier) @variable.parameter) + +(type_parameter + (type_identifier) @variable.parameter) + +(inheritance_constraint + (identifier + (simple_identifier) @variable.parameter)) + +(equality_constraint + (identifier + (simple_identifier) @variable.parameter)) + +[ + "protocol" + "extension" + "indirect" + "nonisolated" + "override" + "convenience" + "required" + "some" + "any" + "weak" + "unowned" + "didSet" + "willSet" + "subscript" + "let" + "var" + (throws) + (where_keyword) + (getter_specifier) + (setter_specifier) + (modify_specifier) + (else) + (as_operator) +] @keyword + +[ + "enum" + "struct" + "class" + "typealias" +] @keyword.type + +[ + "async" + "await" +] @keyword.coroutine + +(shebang_line) @keyword.directive + +(class_body + (property_declaration + (pattern + (simple_identifier) @variable.member))) + +(protocol_property_declaration + (pattern + (simple_identifier) @variable.member)) + +(navigation_expression + (navigation_suffix + (simple_identifier) @variable.member)) + +(value_argument + name: (value_argument_label + (simple_identifier) @variable.member)) + +(import_declaration + "import" @keyword.import) + +(enum_entry + "case" @keyword) + +(modifiers + (attribute + "@" @attribute + (user_type + (type_identifier) @attribute))) + +; Function calls +(call_expression + (simple_identifier) @function.call) ; foo() + +(call_expression + ; foo.bar.baz(): highlight the baz() + (navigation_expression + (navigation_suffix + (simple_identifier) @function.call))) + +(call_expression + (prefix_expression + (simple_identifier) @function.call)) ; .foo() + +((navigation_expression + (simple_identifier) @type) ; SomeType.method(): highlight SomeType as a type + (#match? @type "^[A-Z]")) + +(directive) @keyword.directive + +; See https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/#Keywords-and-Punctuation +[ + (diagnostic) + (availability_condition) + (playground_literal) + (key_path_string_expression) + (selector_expression) + (external_macro_definition) +] @function.macro + +(special_literal) @constant.macro + +; Statements +(for_statement + "for" @keyword.repeat) + +(for_statement + "in" @keyword.repeat) + +[ + "while" + "repeat" + "continue" + "break" +] @keyword.repeat + +(guard_statement + "guard" @keyword.conditional) + +(if_statement + "if" @keyword.conditional) + +(switch_statement + "switch" @keyword.conditional) + +(switch_entry + "case" @keyword) + +(switch_entry + "fallthrough" @keyword) + +(switch_entry + (default_keyword) @keyword) + +"return" @keyword.return + +(ternary_expression + [ + "?" + ":" + ] @keyword.conditional.ternary) + +[ + (try_operator) + "do" + (throw_keyword) + (catch_keyword) +] @keyword.exception + +(statement_label) @label + +; Comments +[ + (comment) + (multiline_comment) +] @comment @spell + +((comment) @comment.documentation + (#match? @comment.documentation "^///[^/]")) + +((comment) @comment.documentation + (#match? @comment.documentation "^///$")) + +((multiline_comment) @comment.documentation + (#match? @comment.documentation "^/[*][*][^*].*[*]/$")) + +; String literals +(line_str_text) @string + +(str_escaped_char) @string.escape + +(multi_line_str_text) @string + +(raw_str_part) @string + +(raw_str_end_part) @string + +(line_string_literal + [ + "\\(" + ")" + ] @punctuation.special) + +(multi_line_string_literal + [ + "\\(" + ")" + ] @punctuation.special) + +(raw_str_interpolation + [ + (raw_str_interpolation_start) + ")" + ] @punctuation.special) + +[ + "\"" + "\"\"\"" +] @string + +; Lambda literals +(lambda_literal + "in" @keyword.operator) + +; Basic literals +[ + (integer_literal) + (hex_literal) + (oct_literal) + (bin_literal) +] @number + +(real_literal) @number.float + +(boolean_literal) @boolean + +"nil" @constant.builtin + +(wildcard_pattern) @character.special + +; Regex literals +(regex_literal) @string.regexp + +; Operators +(custom_operator) @operator + +[ + "+" + "-" + "*" + "/" + "%" + "=" + "+=" + "-=" + "*=" + "/=" + "<" + ">" + "<<" + ">>" + "<=" + ">=" + "++" + "--" + "^" + "&" + "&&" + "|" + "||" + "~" + "%=" + "!=" + "!==" + "==" + "===" + "?" + "??" + "->" + "..<" + "..." + (bang) +] @operator + +(type_arguments + [ + "<" + ">" + ] @punctuation.bracket) diff --git a/unified/extractor/tree-sitter-swift/queries/indents.scm b/unified/extractor/tree-sitter-swift/queries/indents.scm new file mode 100644 index 000000000000..ec8f8af95c6f --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/indents.scm @@ -0,0 +1,123 @@ +; format-ignore +[ + ; ... refers to the section that will get affected by this indent.begin capture + (protocol_body) ; protocol Foo { ... } + (class_body) ; class Foo { ... } + (enum_class_body) ; enum Foo { ... } + (function_declaration) ; func Foo (...) {...} + (init_declaration) ; init(...) {...} + (deinit_declaration) ; deinit {...} + (computed_property) ; { ... } + (subscript_declaration) ; subscript Foo(...) { ... } + + (computed_getter) ; get { ... } + (computed_setter) ; set { ... } + + (assignment) ; a = b + + (control_transfer_statement) ; return ... + (for_statement) + (while_statement) + (repeat_while_statement) + (do_statement) + (if_statement) + (switch_statement) + (guard_statement) + + (type_parameters) ; x + (tuple_type) ; (...) + (array_type) ; [String] + (dictionary_type) ; [Foo: Bar] + + (call_expression) ; callFunc(...) + (tuple_expression) ; ( foo + bar ) + (array_literal) ; [ foo, bar ] + (dictionary_literal) ; [ foo: bar, x: y ] + (lambda_literal) + (willset_didset_block) + (willset_clause) + (didset_clause) +] @indent.begin + +(init_declaration) @indent.begin + +(init_declaration + [ + "init" + "(" + ] @indent.branch) + +; indentation for init parameters +(init_declaration + ")" @indent.branch @indent.end) + +(init_declaration + (parameter) @indent.begin + (#set! indent.immediate)) + +; @something(...) +(modifiers + (attribute) @indent.begin) + +(function_declaration + (modifiers + . + (attribute) + (_)* @indent.branch) + . + _ @indent.branch + (#not-kind-eq? @indent.branch "type_parameters" "parameter")) + +(ERROR + [ + "<" + "{" + "(" + "[" + ]) @indent.begin + +; if-elseif +(if_statement + (if_statement) @indent.dedent) + +; case Foo: +; default Foo: +; @attribute default Foo: +(switch_entry + . + _ @indent.branch) + +(function_declaration + ")" @indent.branch) + +(type_parameters + ">" @indent.branch @indent.end .) + +(tuple_expression + ")" @indent.branch @indent.end) + +(value_arguments + ")" @indent.branch @indent.end) + +(tuple_type + ")" @indent.branch @indent.end) + +(modifiers + (attribute + ")" @indent.branch @indent.end)) + +[ + "}" + "]" +] @indent.branch @indent.end + +[ + ; (ERROR) + (comment) + (multiline_comment) + (raw_str_part) + (multi_line_string_literal) +] @indent.auto + +(directive) @indent.ignore + diff --git a/unified/extractor/tree-sitter-swift/queries/injections.scm b/unified/extractor/tree-sitter-swift/queries/injections.scm new file mode 100644 index 000000000000..512cfa0d5223 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/injections.scm @@ -0,0 +1,10 @@ +; Parse regex syntax within regex literals + +((regex_literal) @injection.content + (#set! injection.language "regex")) + +([ + (comment) + (multiline_comment) +] @injection.content + (#set! injection.language "comment")) diff --git a/unified/extractor/tree-sitter-swift/queries/locals.scm b/unified/extractor/tree-sitter-swift/queries/locals.scm new file mode 100644 index 000000000000..78032a81810b --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/locals.scm @@ -0,0 +1,23 @@ +(import_declaration + (identifier) @local.definition.import) + +(function_declaration + name: (simple_identifier) @local.definition.function) + +; Scopes +[ + (statements) + (for_statement) + (while_statement) + (repeat_while_statement) + (do_statement) + (if_statement) + (guard_statement) + (switch_statement) + (property_declaration) + (function_declaration) + (class_declaration) + (protocol_declaration) +] @local.scope + + diff --git a/unified/extractor/tree-sitter-swift/queries/outline.scm b/unified/extractor/tree-sitter-swift/queries/outline.scm new file mode 100644 index 000000000000..31fe5d9d4a43 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/outline.scm @@ -0,0 +1,66 @@ +(protocol_declaration + declaration_kind: "protocol" @name + . + _ * @name + . + body: (protocol_body) +) @item + +(class_declaration + declaration_kind: ( + [ + "actor" + "class" + "extension" + "enum" + "struct" + ] + ) @name + . + _ * @name + . + body: (_) +) @item + +(init_declaration + name: "init" @name + . + _ * @name + . + body: (function_body) +) @item + +(deinit_declaration + "deinit" @name) @item + +(function_declaration + "func" @name + . + _ * @name + . + body: (function_body) +) @item + +(class_body + (property_declaration + (value_binding_pattern) @name + name: (pattern) @name + (type_annotation)? @name + ) @item +) + +(enum_class_body + (property_declaration + (value_binding_pattern) @name + name: (pattern) @name + (type_annotation)? @name + ) @item +) + +( + (protocol_function_declaration) @name +) @item + +( + (protocol_property_declaration) @name +) @item diff --git a/unified/extractor/tree-sitter-swift/queries/tags.scm b/unified/extractor/tree-sitter-swift/queries/tags.scm new file mode 100644 index 000000000000..0038571e5d72 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/tags.scm @@ -0,0 +1,51 @@ +(class_declaration + name: (type_identifier) @name) @definition.class + +(protocol_declaration + name: (type_identifier) @name) @definition.interface + +(class_declaration + (class_body + [ + (function_declaration + name: (simple_identifier) @name + ) + (subscript_declaration + (parameter (simple_identifier) @name) + ) + (init_declaration "init" @name) + (deinit_declaration "deinit" @name) + ] + ) +) @definition.method + +(protocol_declaration + (protocol_body + [ + (protocol_function_declaration + name: (simple_identifier) @name + ) + (subscript_declaration + (parameter (simple_identifier) @name) + ) + (init_declaration "init" @name) + ] + ) +) @definition.method + +(class_declaration + (class_body + [ + (property_declaration + (pattern (simple_identifier) @name) + ) + ] + ) +) @definition.property + +(property_declaration + (pattern (simple_identifier) @name) +) @definition.property + +(function_declaration + name: (simple_identifier) @name) @definition.function \ No newline at end of file diff --git a/unified/extractor/tree-sitter-swift/queries/textobjects.scm b/unified/extractor/tree-sitter-swift/queries/textobjects.scm new file mode 100644 index 000000000000..da689a1b29f6 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/queries/textobjects.scm @@ -0,0 +1,19 @@ + + +; MARK: Structure + +(function_declaration + body: (_) @function.inside) @function.around + +; TODO: Classes/structs/enums + + +; MARK: Tests + +; Only matches prefix test. Other conventions +; might be nice to add! +(function_declaration + name: (simple_identifier) @_name + (#match? @_name "^test") +) + diff --git a/unified/extractor/tree-sitter-swift/src/scanner.c b/unified/extractor/tree-sitter-swift/src/scanner.c new file mode 100644 index 000000000000..bb2dcac58b28 --- /dev/null +++ b/unified/extractor/tree-sitter-swift/src/scanner.c @@ -0,0 +1,929 @@ +#include "tree_sitter/parser.h" +#include +#include + +#define TOKEN_COUNT 33 + +enum TokenType { + BLOCK_COMMENT, + RAW_STR_PART, + RAW_STR_CONTINUING_INDICATOR, + RAW_STR_END_PART, + IMPLICIT_SEMI, + EXPLICIT_SEMI, + ARROW_OPERATOR, + DOT_OPERATOR, + CONJUNCTION_OPERATOR, + DISJUNCTION_OPERATOR, + NIL_COALESCING_OPERATOR, + EQUAL_SIGN, + EQ_EQ, + PLUS_THEN_WS, + MINUS_THEN_WS, + BANG, + THROWS_KEYWORD, + RETHROWS_KEYWORD, + DEFAULT_KEYWORD, + WHERE_KEYWORD, + ELSE_KEYWORD, + CATCH_KEYWORD, + AS_KEYWORD, + AS_QUEST, + AS_BANG, + ASYNC_KEYWORD, + CUSTOM_OPERATOR, + HASH_SYMBOL, + DIRECTIVE_IF, + DIRECTIVE_ELSEIF, + DIRECTIVE_ELSE, + DIRECTIVE_ENDIF, + FAKE_TRY_BANG +}; + +#define OPERATOR_COUNT 20 + +const char* OPERATORS[OPERATOR_COUNT] = { + "->", + ".", + "&&", + "||", + "??", + "=", + "==", + "+", + "-", + "!", + "throws", + "rethrows", + "default", + "where", + "else", + "catch", + "as", + "as?", + "as!", + "async" +}; + +enum IllegalTerminatorGroup { + ALPHANUMERIC, + OPERATOR_SYMBOLS, + OPERATOR_OR_DOT, + NON_WHITESPACE +}; + +const enum IllegalTerminatorGroup OP_ILLEGAL_TERMINATORS[OPERATOR_COUNT] = { + OPERATOR_SYMBOLS, // -> + OPERATOR_OR_DOT, // . + OPERATOR_SYMBOLS, // && + OPERATOR_SYMBOLS, // || + OPERATOR_SYMBOLS, // ?? + OPERATOR_SYMBOLS, // = + OPERATOR_SYMBOLS, // == + NON_WHITESPACE, // + + NON_WHITESPACE, // - + OPERATOR_SYMBOLS, // ! + ALPHANUMERIC, // throws + ALPHANUMERIC, // rethrows + ALPHANUMERIC, // default + ALPHANUMERIC, // where + ALPHANUMERIC, // else + ALPHANUMERIC, // catch + ALPHANUMERIC, // as + OPERATOR_SYMBOLS, // as? + OPERATOR_SYMBOLS, // as! + ALPHANUMERIC // async +}; + +const enum TokenType OP_SYMBOLS[OPERATOR_COUNT] = { + ARROW_OPERATOR, + DOT_OPERATOR, + CONJUNCTION_OPERATOR, + DISJUNCTION_OPERATOR, + NIL_COALESCING_OPERATOR, + EQUAL_SIGN, + EQ_EQ, + PLUS_THEN_WS, + MINUS_THEN_WS, + BANG, + THROWS_KEYWORD, + RETHROWS_KEYWORD, + DEFAULT_KEYWORD, + WHERE_KEYWORD, + ELSE_KEYWORD, + CATCH_KEYWORD, + AS_KEYWORD, + AS_QUEST, + AS_BANG, + ASYNC_KEYWORD +}; + +const uint64_t OP_SYMBOL_SUPPRESSOR[OPERATOR_COUNT] = { + 0, // ARROW_OPERATOR, + 0, // DOT_OPERATOR, + 0, // CONJUNCTION_OPERATOR, + 0, // DISJUNCTION_OPERATOR, + 0, // NIL_COALESCING_OPERATOR, + 0, // EQUAL_SIGN, + 0, // EQ_EQ, + 0, // PLUS_THEN_WS, + 0, // MINUS_THEN_WS, + 1UL << FAKE_TRY_BANG, // BANG, + 0, // THROWS_KEYWORD, + 0, // RETHROWS_KEYWORD, + 0, // DEFAULT_KEYWORD, + 0, // WHERE_KEYWORD, + 0, // ELSE_KEYWORD, + 0, // CATCH_KEYWORD, + 0, // AS_KEYWORD, + 0, // AS_QUEST, + 0, // AS_BANG, + 0, // ASYNC_KEYWORD +}; + +#define RESERVED_OP_COUNT 31 + +const char* RESERVED_OPS[RESERVED_OP_COUNT] = { + "/", + "=", + "-", + "+", + "!", + "*", + "%", + "<", + ">", + "&", + "|", + "^", + "?", + "~", + ".", + "..", + "->", + "/*", + "*/", + "+=", + "-=", + "*=", + "/=", + "%=", + ">>", + "<<", + "++", + "--", + "===", + "...", + "..<" +}; + +static bool is_cross_semi_token(enum TokenType op) { + switch(op) { + case ARROW_OPERATOR: + case DOT_OPERATOR: + case CONJUNCTION_OPERATOR: + case DISJUNCTION_OPERATOR: + case NIL_COALESCING_OPERATOR: + case EQUAL_SIGN: + case EQ_EQ: + case PLUS_THEN_WS: + case MINUS_THEN_WS: + case THROWS_KEYWORD: + case RETHROWS_KEYWORD: + case DEFAULT_KEYWORD: + case WHERE_KEYWORD: + case ELSE_KEYWORD: + case CATCH_KEYWORD: + case AS_KEYWORD: + case AS_QUEST: + case AS_BANG: + case ASYNC_KEYWORD: + case CUSTOM_OPERATOR: + return true; + case BANG: + default: + return false; + } +} + +#define NON_CONSUMING_CROSS_SEMI_CHAR_COUNT 3 +const uint32_t NON_CONSUMING_CROSS_SEMI_CHARS[NON_CONSUMING_CROSS_SEMI_CHAR_COUNT] = { '?', ':', '{' }; + +/** + * All possible results of having performed some sort of parsing. + * + * A parser can return a result along two dimensions: + * 1. Should the scanner continue trying to find another result? + * 2. Was some result produced by this parsing attempt? + * + * These are flattened into a single enum together. When the function returns one of the `TOKEN_FOUND` cases, it + * will always populate its `symbol_result` field. When it returns one of the `STOP_PARSING` cases, callers should + * immediately return (with the value, if there is one). + */ +enum ParseDirective { + CONTINUE_PARSING_NOTHING_FOUND, + CONTINUE_PARSING_TOKEN_FOUND, + CONTINUE_PARSING_SLASH_CONSUMED, + STOP_PARSING_NOTHING_FOUND, + STOP_PARSING_TOKEN_FOUND, + STOP_PARSING_END_OF_FILE +}; + +struct ScannerState { + uint32_t ongoing_raw_str_hash_count; +}; + +void *tree_sitter_swift_external_scanner_create() { + return calloc(1, sizeof(struct ScannerState)); +} + +void tree_sitter_swift_external_scanner_destroy(void *payload) { + free(payload); +} + +void tree_sitter_swift_external_scanner_reset(void *payload) { + struct ScannerState *state = (struct ScannerState *)payload; + state->ongoing_raw_str_hash_count = 0; +} + +unsigned tree_sitter_swift_external_scanner_serialize(void *payload, char *buffer) { + struct ScannerState *state = (struct ScannerState *)payload; + uint32_t hash_count = state->ongoing_raw_str_hash_count; + buffer[0] = (hash_count >> 24) & 0xff; + buffer[1] = (hash_count >> 16) & 0xff; + buffer[2] = (hash_count >> 8) & 0xff; + buffer[3] = (hash_count) & 0xff; + return 4; +} + +void tree_sitter_swift_external_scanner_deserialize( + void *payload, + const char *buffer, + unsigned length +) { + if (length < 4) { + return; + } + + uint32_t hash_count = ( + (((uint32_t) buffer[0]) << 24) | + (((uint32_t) buffer[1]) << 16) | + (((uint32_t) buffer[2]) << 8) | + (((uint32_t) buffer[3])) + ); + struct ScannerState *state = (struct ScannerState *)payload; + state->ongoing_raw_str_hash_count = hash_count; +} + +static void advance(TSLexer *lexer) { + lexer->advance(lexer, false); +} + +static bool should_treat_as_wspace(int32_t character) { + return iswspace(character) || (((int32_t) ';') == character); +} + +static int32_t encountered_op_count(bool *encountered_operator) { + int32_t encountered = 0; + for (int op_idx = 0; op_idx < OPERATOR_COUNT; op_idx++) { + if (encountered_operator[op_idx]) { + encountered++; + } + } + + return encountered; +} + +static bool any_reserved_ops(uint8_t *encountered_reserved_ops) { + for (int op_idx = 0; op_idx < RESERVED_OP_COUNT; op_idx++) { + if (encountered_reserved_ops[op_idx] == 2) { + return true; + } + } + + return false; +} + +static bool is_legal_custom_operator( + int32_t char_idx, + int32_t first_char, + int32_t cur_char +) { + bool is_first_char = !char_idx; + switch (cur_char) { + case '=': + case '-': + case '+': + case '!': + case '%': + case '<': + case '>': + case '&': + case '|': + case '^': + case '?': + case '~': + return true; + case '.': + // Grammar allows `.` for any operator that starts with `.` + return is_first_char || first_char == '.'; + case '*': + case '/': + // Not listed in the grammar, but `/*` and `//` can't be the start of an operator since they start comments + return char_idx != 1 || first_char != '/'; + default: + if ( + (cur_char >= 0x00A1 && cur_char <= 0x00A7) || + (cur_char == 0x00A9) || + (cur_char == 0x00AB) || + (cur_char == 0x00AC) || + (cur_char == 0x00AE) || + (cur_char >= 0x00B0 && cur_char <= 0x00B1) || + (cur_char == 0x00B6) || + (cur_char == 0x00BB) || + (cur_char == 0x00BF) || + (cur_char == 0x00D7) || + (cur_char == 0x00F7) || + (cur_char >= 0x2016 && cur_char <= 0x2017) || + (cur_char >= 0x2020 && cur_char <= 0x2027) || + (cur_char >= 0x2030 && cur_char <= 0x203E) || + (cur_char >= 0x2041 && cur_char <= 0x2053) || + (cur_char >= 0x2055 && cur_char <= 0x205E) || + (cur_char >= 0x2190 && cur_char <= 0x23FF) || + (cur_char >= 0x2500 && cur_char <= 0x2775) || + (cur_char >= 0x2794 && cur_char <= 0x2BFF) || + (cur_char >= 0x2E00 && cur_char <= 0x2E7F) || + (cur_char >= 0x3001 && cur_char <= 0x3003) || + (cur_char >= 0x3008 && cur_char <= 0x3020) || + (cur_char == 0x3030) + ) { + return true; + } else if ( + (cur_char >= 0x0300 && cur_char <= 0x036f) || + (cur_char >= 0x1DC0 && cur_char <= 0x1DFF) || + (cur_char >= 0x20D0 && cur_char <= 0x20FF) || + (cur_char >= 0xFE00 && cur_char <= 0xFE0F) || + (cur_char >= 0xFE20 && cur_char <= 0xFE2F) || + (cur_char >= 0xE0100 && cur_char <= 0xE01EF) + ) { + return !is_first_char; + } else { + return false; + } + } +} + +static bool eat_operators( + TSLexer *lexer, + const bool *valid_symbols, + bool mark_end, + const int32_t prior_char, + enum TokenType *symbol_result +) { + bool possible_operators[OPERATOR_COUNT]; + uint8_t reserved_operators[RESERVED_OP_COUNT]; + for (int op_idx = 0; op_idx < OPERATOR_COUNT; op_idx++) { + possible_operators[op_idx] = valid_symbols[OP_SYMBOLS[op_idx]] && (!prior_char || OPERATORS[op_idx][0] == prior_char); + } + for (int op_idx = 0; op_idx < RESERVED_OP_COUNT; op_idx++) { + reserved_operators[op_idx] = !prior_char || RESERVED_OPS[op_idx][0] == prior_char; + } + + bool possible_custom_operator = valid_symbols[CUSTOM_OPERATOR]; + int32_t first_char = prior_char ? prior_char : lexer->lookahead; + int32_t last_examined_char = first_char; + + int32_t str_idx = prior_char ? 1 : 0; + int32_t full_match = -1; + while(true) { + for (int op_idx = 0; op_idx < OPERATOR_COUNT; op_idx++) { + if (!possible_operators[op_idx]) { + continue; + } + + if (OPERATORS[op_idx][str_idx] == '\0') { + // Make sure that the operator is allowed to have the next character as its lookahead. + enum IllegalTerminatorGroup illegal_terminators = OP_ILLEGAL_TERMINATORS[op_idx]; + switch (lexer->lookahead) { + // See "Operators": + // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID418 + case '/': + case '=': + case '-': + case '+': + case '!': + case '*': + case '%': + case '<': + case '>': + case '&': + case '|': + case '^': + case '?': + case '~': + if (illegal_terminators == OPERATOR_SYMBOLS) { + break; + } // Otherwise, intentionally fall through to the OPERATOR_OR_DOT case + // fall through + case '.': + if (illegal_terminators == OPERATOR_OR_DOT) { + break; + } // Otherwise, fall through to DEFAULT which checks its groups directly + // fall through + default: + if (iswalnum(lexer->lookahead) && illegal_terminators == ALPHANUMERIC) { + break; + } + + if (!iswspace(lexer->lookahead) && illegal_terminators == NON_WHITESPACE) { + break; + } + + full_match = op_idx; + if (mark_end) { + lexer->mark_end(lexer); + } + } + + possible_operators[op_idx] = false; + continue; + } + + if (OPERATORS[op_idx][str_idx] != lexer->lookahead) { + possible_operators[op_idx] = false; + continue; + } + } + + for (int op_idx = 0; op_idx < RESERVED_OP_COUNT; op_idx++) { + if (!reserved_operators[op_idx]) { + continue; + } + + if (RESERVED_OPS[op_idx][str_idx] == '\0') { + reserved_operators[op_idx] = 0; + continue; + } + + if (RESERVED_OPS[op_idx][str_idx] != lexer->lookahead) { + reserved_operators[op_idx] = 0; + continue; + } + + if (RESERVED_OPS[op_idx][str_idx + 1] == '\0') { + reserved_operators[op_idx] = 2; + continue; + } + } + + possible_custom_operator = possible_custom_operator && is_legal_custom_operator( + str_idx, + first_char, + lexer->lookahead + ); + + uint32_t encountered_ops = encountered_op_count(possible_operators); + if (encountered_ops == 0) { + if (!possible_custom_operator) { + break; + } else if (mark_end && full_match == -1) { + lexer->mark_end(lexer); + } + } + + last_examined_char = lexer->lookahead; + lexer->advance(lexer, false); + str_idx += 1; + + if (encountered_ops == 0 && !is_legal_custom_operator( + str_idx, + first_char, + lexer->lookahead + )) { + break; + } + } + + if (full_match != -1) { + // We have a match -- first see if that match has a symbol that suppresses it. For example, in `try!`, we do not + // want to emit the `!` as a symbol in our scanner, because we want the parser to have the chance to parse it as + // an immediate token. + uint64_t suppressing_symbols = OP_SYMBOL_SUPPRESSOR[full_match]; + if (suppressing_symbols) { + for (uint64_t suppressor = 0; suppressor < TOKEN_COUNT; suppressor++) { + if (!(suppressing_symbols & 1ULL << suppressor)) { + continue; + } + + // The suppressing symbol is valid in this position, so skip it. + if (valid_symbols[suppressor]) { + return false; + } + } + } + *symbol_result = OP_SYMBOLS[full_match]; + return true; + } + + if (possible_custom_operator && !any_reserved_ops(reserved_operators)) { + if ((last_examined_char != '<' || iswspace(lexer->lookahead)) && mark_end) { + lexer->mark_end(lexer); + } + *symbol_result = CUSTOM_OPERATOR; + return true; + } + + return false; +} + +static enum ParseDirective eat_comment( + TSLexer *lexer, + const bool *valid_symbols, + bool mark_end, + enum TokenType *symbol_result +) { + if (lexer->lookahead != '/') { + return CONTINUE_PARSING_NOTHING_FOUND; + } + + advance(lexer); + + if (lexer->lookahead != '*') { + return CONTINUE_PARSING_SLASH_CONSUMED; + } + + advance(lexer); + + bool after_star = false; + unsigned nesting_depth = 1; + for (;;) { + switch (lexer->lookahead) { + case '\0': + return STOP_PARSING_END_OF_FILE; + case '*': + advance(lexer); + after_star = true; + break; + case '/': + if (after_star) { + advance(lexer); + after_star = false; + nesting_depth--; + if (nesting_depth == 0) { + if (mark_end) { + lexer->mark_end(lexer); + } + *symbol_result = BLOCK_COMMENT; + return STOP_PARSING_TOKEN_FOUND; + } + } else { + advance(lexer); + after_star = false; + if (lexer->lookahead == '*') { + nesting_depth++; + advance(lexer); + } + } + break; + default: + advance(lexer); + after_star = false; + break; + } + } +} + +static enum ParseDirective eat_whitespace( + TSLexer *lexer, + const bool *valid_symbols, + enum TokenType *symbol_result +) { + enum ParseDirective ws_directive = CONTINUE_PARSING_NOTHING_FOUND; + bool semi_is_valid = valid_symbols[IMPLICIT_SEMI] && valid_symbols[EXPLICIT_SEMI]; + uint32_t lookahead; + while (should_treat_as_wspace(lookahead = lexer->lookahead)) { + if (lookahead == ';') { + if (semi_is_valid) { + ws_directive = STOP_PARSING_TOKEN_FOUND; + lexer->advance(lexer, false); + } + + break; + } + + lexer->advance(lexer, true); + + lexer->mark_end(lexer); + + if (ws_directive == CONTINUE_PARSING_NOTHING_FOUND && (lookahead == '\n' || lookahead == '\r')) { + ws_directive = CONTINUE_PARSING_TOKEN_FOUND; + } + } + + enum ParseDirective any_comment = CONTINUE_PARSING_NOTHING_FOUND; + if (ws_directive == CONTINUE_PARSING_TOKEN_FOUND && lookahead == '/') { + bool has_seen_single_comment = false; + while (lexer->lookahead == '/') { + // It's possible that this is a comment - start an exploratory mission to find out, and if it is, look for what + // comes after it. We care about what comes after it for the purpose of suppressing the newline. + + enum TokenType multiline_comment_result; + any_comment = eat_comment(lexer, valid_symbols, /* mark_end */ false, &multiline_comment_result); + if (any_comment == STOP_PARSING_TOKEN_FOUND) { + // This is a multiline comment. This scanner should be parsing those, so we might want to bail out and + // emit it instead. However, we only want to do that if we haven't advanced through a _single_ line + // comment on the way - otherwise that will get lumped into this. + if (!has_seen_single_comment) { + lexer->mark_end(lexer); + *symbol_result = multiline_comment_result; + return STOP_PARSING_TOKEN_FOUND; + } + } else if (any_comment == STOP_PARSING_END_OF_FILE) { + return STOP_PARSING_END_OF_FILE; + } else if (any_comment == CONTINUE_PARSING_SLASH_CONSUMED) { + // We accidentally ate a slash -- we should actually bail out, say we saw nothing, and let the next pass + // take it from after the newline. + return CONTINUE_PARSING_SLASH_CONSUMED; + } else if (lexer->lookahead == '/') { + // There wasn't a multiline comment, which we know means that the comment parser ate its `/` and then + // bailed out. If it had seen anything comment-like after that first `/` it would have continued going + // and eventually had a well-formed comment or an EOF. Thus, if we're currently looking at a `/`, it's + // the second one of those and it means we have a single-line comment. + has_seen_single_comment = true; + while (lexer->lookahead != '\n' && lexer->lookahead != '\0') { + lexer->advance(lexer, true); + } + } else if (iswspace(lexer->lookahead)) { + // We didn't see any type of comment - in fact, we saw an operator that we don't normally treat as an + // operator. Still, this is a reason to stop parsing. + return STOP_PARSING_NOTHING_FOUND; + } + + // If we skipped through some comment, we're at whitespace now, so advance. + while(iswspace(lexer->lookahead)) { + any_comment = CONTINUE_PARSING_NOTHING_FOUND; // We're advancing, so clear out the comment + lexer->advance(lexer, true); + } + } + + enum TokenType operator_result; + bool saw_operator = eat_operators( + lexer, + valid_symbols, + /* mark_end */ false, + '\0', + &operator_result + ); + if (saw_operator) { + // The operator we saw should suppress the newline, so bail out. + return STOP_PARSING_NOTHING_FOUND; + } else { + // Promote the implicit newline to an explicit one so we don't check for operators again. + *symbol_result = IMPLICIT_SEMI; + ws_directive = STOP_PARSING_TOKEN_FOUND; + } + } + + // Let's consume operators that can live after a "semicolon" style newline. Before we do that, though, we want to + // check for a set of characters that we do not consume, but that still suppress the semi. + if (ws_directive == CONTINUE_PARSING_TOKEN_FOUND) { + for (int i = 0; i < NON_CONSUMING_CROSS_SEMI_CHAR_COUNT; i++) { + if (NON_CONSUMING_CROSS_SEMI_CHARS[i] == lookahead) { + return CONTINUE_PARSING_NOTHING_FOUND; + } + } + } + + if (semi_is_valid && ws_directive != CONTINUE_PARSING_NOTHING_FOUND) { + *symbol_result = lookahead == ';' ? EXPLICIT_SEMI : IMPLICIT_SEMI; + return ws_directive; + } + + return CONTINUE_PARSING_NOTHING_FOUND; +} + +#define DIRECTIVE_COUNT 4 +const char* DIRECTIVES[OPERATOR_COUNT] = { + "if", + "elseif", + "else", + "endif" +}; + +const enum TokenType DIRECTIVE_SYMBOLS[DIRECTIVE_COUNT] = { + DIRECTIVE_IF, + DIRECTIVE_ELSEIF, + DIRECTIVE_ELSE, + DIRECTIVE_ENDIF +}; + +static enum TokenType find_possible_compiler_directive(TSLexer *lexer) { + bool possible_directives[DIRECTIVE_COUNT]; + for (int dir_idx = 0; dir_idx < DIRECTIVE_COUNT; dir_idx++) { + possible_directives[dir_idx] = true; + } + + int32_t str_idx = 0; + int32_t full_match = -1; + while(true) { + for (int dir_idx = 0; dir_idx < DIRECTIVE_COUNT; dir_idx++) { + if (!possible_directives[dir_idx]) { + continue; + } + + uint8_t expected_char = DIRECTIVES[dir_idx][str_idx]; + if (expected_char == '\0') { + full_match = dir_idx; + lexer->mark_end(lexer); + } + + if (expected_char != lexer->lookahead) { + possible_directives[dir_idx] = false; + continue; + } + } + + uint8_t match_count = 0; + for (int dir_idx = 0; dir_idx < DIRECTIVE_COUNT; dir_idx += 1) { + if (possible_directives[dir_idx]) { + match_count += 1; + } + } + + if (match_count == 0) { + break; + } + + lexer->advance(lexer, false); + str_idx += 1; + } + + if (full_match == -1) { + // No compiler directive found, so just match the starting symbol + return HASH_SYMBOL; + } + + return DIRECTIVE_SYMBOLS[full_match]; +} + +static bool eat_raw_str_part( + struct ScannerState *state, + TSLexer *lexer, + const bool *valid_symbols, + enum TokenType *symbol_result +) { + uint32_t hash_count = state->ongoing_raw_str_hash_count; + if (!valid_symbols[RAW_STR_PART]) { + return false; + } else if (hash_count == 0) { + // If this is a raw_str_part, it's the first one - look for hashes + while (lexer->lookahead == '#') { + hash_count += 1; + advance(lexer); + } + + if (hash_count == 0) { + return false; + } + + if (lexer->lookahead == '"') { + advance(lexer); + } else if (hash_count == 1) { + lexer->mark_end(lexer); + *symbol_result = find_possible_compiler_directive(lexer); + return true; + } else { + return false; + } + + } else if (valid_symbols[RAW_STR_CONTINUING_INDICATOR]) { + // This is the end of an interpolation - now it's another raw_str_part. This is a synthetic + // marker to tell us that the grammar just consumed a `(` symbol to close a raw + // interpolation (since we don't want to fire on every `(` in existence). We don't have + // anything to do except continue. + } else { + return false; + } + + // We're in a state where anything other than `hash_count` hash symbols in a row should be eaten + // and is part of a string. + // The last character _before_ the hashes will tell us what happens next. + // Matters are also complicated by the fact that we don't want to consume every character we + // visit; if we see a `\#(`, for instance, with the appropriate number of hash symbols, we want + // to end our parsing _before_ that sequence. This allows highlighting tools to treat that as a + // separate token. + while (lexer->lookahead != '\0') { + uint8_t last_char = '\0'; + lexer->mark_end(lexer); // We always want to parse thru the start of the string so far + // Advance through anything that isn't a hash symbol, because we want to count those. + while (lexer->lookahead != '#' && lexer->lookahead != '\0') { + last_char = lexer->lookahead; + advance(lexer); + if (last_char != '\\' || lexer->lookahead == '\\') { + // Mark a new end, but only if we didn't just advance past a `\` symbol, since we + // don't want to consume that. Exception: if this is a `\` that happens _right + // after_ another `\`, we for some reason _do_ want to consume that, because + // apparently that is parsed as a literal `\` followed by something escaped. + lexer->mark_end(lexer); + } + } + + // We hit at least one hash - count them and see if they match. + uint32_t current_hash_count = 0; + while (lexer->lookahead == '#' && current_hash_count < hash_count) { + current_hash_count += 1; + advance(lexer); + } + + // If we saw exactly the right number of hashes, one of three things is true: + // 1. We're trying to interpolate into this string. + // 2. The string just ended. + // 3. This was just some hash characters doing nothing important. + if (current_hash_count == hash_count) { + if (last_char == '\\' && lexer->lookahead == '(') { + // Interpolation case! Don't consume those chars; they get saved for grammar.js. + *symbol_result = RAW_STR_PART; + state->ongoing_raw_str_hash_count = hash_count; + return true; + } else if (last_char == '"') { + // The string is finished! Mark the end here, on the very last hash symbol. + lexer->mark_end(lexer); + *symbol_result = RAW_STR_END_PART; + state->ongoing_raw_str_hash_count = 0; + return true; + } + // Nothing special happened - let the string continue. + } + } + + return false; +} + +bool tree_sitter_swift_external_scanner_scan( + void *payload, + TSLexer *lexer, + const bool *valid_symbols +) { + // Figure out our scanner state + struct ScannerState *state = (struct ScannerState *)payload; + + // Consume any whitespace at the start. + enum TokenType ws_result; + enum ParseDirective ws_directive = eat_whitespace(lexer, valid_symbols, &ws_result); + if (ws_directive == STOP_PARSING_TOKEN_FOUND) { + lexer->result_symbol = ws_result; + return true; + } + + if (ws_directive == STOP_PARSING_NOTHING_FOUND || ws_directive == STOP_PARSING_END_OF_FILE) { + return false; + } + + bool has_ws_result = (ws_directive == CONTINUE_PARSING_TOKEN_FOUND); + + // Now consume comments (before custom operators so that those aren't treated as comments) + enum TokenType comment_result; + enum ParseDirective comment = ws_directive == CONTINUE_PARSING_SLASH_CONSUMED ? ws_directive : eat_comment(lexer, valid_symbols, /* mark_end */ true, &comment_result); + if (comment == STOP_PARSING_TOKEN_FOUND) { + lexer->mark_end(lexer); + lexer->result_symbol = comment_result; + return true; + } + + if (comment == STOP_PARSING_END_OF_FILE) { + return false; + } + // Now consume any operators that might cause our whitespace to be suppressed. + enum TokenType operator_result; + bool saw_operator = eat_operators( + lexer, + valid_symbols, + /* mark_end */ !has_ws_result, + comment == CONTINUE_PARSING_SLASH_CONSUMED ? '/' : '\0', + &operator_result + ); + + if (saw_operator && (!has_ws_result || is_cross_semi_token(operator_result))) { + lexer->result_symbol = operator_result; + if (has_ws_result) lexer->mark_end(lexer); + return true; + } + + if (has_ws_result) { + // Don't `mark_end`, since we may have advanced through some operators. + lexer->result_symbol = ws_result; + return true; + } + + // NOTE: this will consume any `#` characters it sees, even if it does not find a result. Keep + // it at the end so that it doesn't interfere with special literals or selectors! + enum TokenType raw_str_result; + bool saw_raw_str_part = eat_raw_str_part(state, lexer, valid_symbols, &raw_str_result); + if (saw_raw_str_part) { + lexer->result_symbol = raw_str_result; + return true; + } + + return false; +} + diff --git a/unified/extractor/tree-sitter-swift/tree-sitter.json b/unified/extractor/tree-sitter-swift/tree-sitter.json new file mode 100644 index 000000000000..3cd49a28a38f --- /dev/null +++ b/unified/extractor/tree-sitter-swift/tree-sitter.json @@ -0,0 +1,39 @@ +{ + "grammars": [ + { + "name": "swift", + "camelcase": "Swift", + "scope": "source.swift", + "path": ".", + "file-types": [ + "swift" + ], + "highlights": "queries/highlights.scm", + "injections": "queries/injections.scm", + "locals": "queries/locals.scm", + "injection-regex": "swift" + } + ], + "metadata": { + "version": "0.7.2", + "license": "MIT", + "description": "A tree-sitter grammar for the Swift programming language.", + "authors": [ + { + "name": "Alex Pinkus", + "email": "alex.pinkus@gmail.com" + } + ], + "links": { + "repository": "git+https://github.com/alex-pinkus/tree-sitter-swift.git" + } + }, + "bindings": { + "c": true, + "go": true, + "node": true, + "python": true, + "rust": true, + "swift": true + } +} diff --git a/unified/ql/lib/BUILD.bazel b/unified/ql/lib/BUILD.bazel new file mode 100644 index 000000000000..3636225ba533 --- /dev/null +++ b/unified/ql/lib/BUILD.bazel @@ -0,0 +1,13 @@ +load("@rules_pkg//pkg:mappings.bzl", "pkg_files") + +package(default_visibility = ["//unified:__pkg__"]) + +pkg_files( + name = "dbscheme", + srcs = ["unified.dbscheme"], +) + +pkg_files( + name = "dbscheme-stats", + srcs = ["unified.dbscheme.stats"], +) diff --git a/unified/ql/lib/codeql/Locations.qll b/unified/ql/lib/codeql/Locations.qll new file mode 100644 index 000000000000..df52d6822a2e --- /dev/null +++ b/unified/ql/lib/codeql/Locations.qll @@ -0,0 +1,70 @@ +/** Provides classes for working with locations. */ +overlay[local] +module; + +import files.FileSystem + +/** + * A location as given by a file, a start line, a start column, + * an end line, and an end column. + * + * For more information about locations see [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +class Location extends @location_default { + /** Gets the file for this location. */ + File getFile() { locations_default(this, result, _, _, _, _) } + + /** Gets the 1-based line number (inclusive) where this location starts. */ + int getStartLine() { locations_default(this, _, result, _, _, _) } + + /** Gets the 1-based column number (inclusive) where this location starts. */ + int getStartColumn() { locations_default(this, _, _, result, _, _) } + + /** Gets the 1-based line number (inclusive) where this location ends. */ + int getEndLine() { locations_default(this, _, _, _, result, _) } + + /** Gets the 1-based column number (inclusive) where this location ends. */ + int getEndColumn() { locations_default(this, _, _, _, _, result) } + + /** Gets the number of lines covered by this location. */ + int getNumLines() { result = this.getEndLine() - this.getStartLine() + 1 } + + /** Gets a textual representation of this element. */ + bindingset[this] + pragma[inline_late] + string toString() { + exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | + this.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and + result = filepath + "@" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } + + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Providing locations in CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exists(File f | + locations_default(this, f, startline, startcolumn, endline, endcolumn) and + filepath = f.getAbsolutePath() + ) + } + + /** Holds if this location starts strictly before the specified location. */ + pragma[inline] + predicate strictlyBefore(Location other) { + this.getStartLine() < other.getStartLine() + or + this.getStartLine() = other.getStartLine() and this.getStartColumn() < other.getStartColumn() + } +} + +/** An entity representing an empty location. */ +class EmptyLocation extends Location { + EmptyLocation() { empty_location(this) } +} diff --git a/unified/ql/lib/codeql/files/FileSystem.qll b/unified/ql/lib/codeql/files/FileSystem.qll new file mode 100644 index 000000000000..6cc771fad9d2 --- /dev/null +++ b/unified/ql/lib/codeql/files/FileSystem.qll @@ -0,0 +1,38 @@ +/** Provides classes for working with files and folders. */ +overlay[local] +module; + +private import codeql.Locations +private import codeql.util.FileSystem + +private module Input implements InputSig { + abstract class ContainerBase extends @container { + abstract string getAbsolutePath(); + + ContainerBase getParentContainer() { containerparent(result, this) } + + string toString() { result = this.getAbsolutePath() } + } + + class FolderBase extends ContainerBase, @folder { + override string getAbsolutePath() { folders(this, result) } + } + + class FileBase extends ContainerBase, @file { + override string getAbsolutePath() { files(this, result) } + } + + predicate hasSourceLocationPrefix = sourceLocationPrefix/1; +} + +private module Impl = Make; + +class Container = Impl::Container; + +class Folder = Impl::Folder; + +/** A file. */ +class File extends Container, Impl::File { + /** Holds if this file was extracted from ordinary source code. */ + predicate fromSource() { any() } +} diff --git a/unified/ql/lib/codeql/unified/Ast.qll b/unified/ql/lib/codeql/unified/Ast.qll new file mode 100644 index 000000000000..5b9491fdb9fe --- /dev/null +++ b/unified/ql/lib/codeql/unified/Ast.qll @@ -0,0 +1,2826 @@ +/** + * CodeQL library for Swift + * Automatically generated from the tree-sitter grammar; do not edit + */ + +import codeql.Locations as L + +/** Holds if the database is an overlay. */ +overlay[local] +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +/** Holds if `loc` is in the `file` and is part of the overlay base database. */ +overlay[local] +private predicate discardableLocation(@file file, @location_default loc) { + not isOverlay() and locations_default(loc, file, _, _, _, _) +} + +/** Holds if `loc` 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 discardLocation(@location_default loc) { + exists(@file file, string path | files(file, path) | + discardableLocation(file, loc) and overlayChangedFiles(path) + ) +} + +overlay[local] +module Swift { + /** The base class for all AST nodes */ + class AstNode extends @swift_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) } + + /** Gets the parent of this element. */ + final AstNode getParent() { swift_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) } + + /** Gets a field or child node of this node. */ + AstNode getAFieldOrChild() { none() } + + /** Gets the name of the primary QL class for this element. */ + string getAPrimaryQlClass() { result = "???" } + + /** Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs. */ + string getPrimaryQlClasses() { result = concat(this.getAPrimaryQlClass(), ",") } + } + + /** A token. */ + class Token extends @swift_token, AstNode { + /** Gets the value of this token. */ + final string getValue() { swift_tokeninfo(this, _, result) } + + /** Gets a string representation of this element. */ + final override string toString() { result = this.getValue() } + + /** Gets the name of the primary QL class for this element. */ + 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) | + 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) { + 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) { + 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 { + /** 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, _, _) } + + /** Gets the node corresponding to the field `type`. */ + final Type getType() { swift_as_expression_def(this, _, result, _) } + + /** Gets the child of this node. */ + final AsOperator getChild() { swift_as_expression_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) + } + } + + /** A class representing `as_operator` tokens. */ + class AsOperator extends @swift_token_as_operator, Token { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "AsOperator" } + } + + /** 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 `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, _) } + + /** Gets the node corresponding to the field `target`. */ + final DirectlyAssignableExpression getTarget() { swift_assignment_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) + } + } + + /** A class representing `associatedtype_declaration` nodes. */ + class AssociatedtypeDeclaration extends @swift_associatedtype_declaration, 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) } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_associatedtype_declaration_child(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) + } + } + + /** A class representing `attribute` nodes. */ + class Attribute extends @swift_attribute, 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) } + + /** 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 `i`th child of this node. */ + final AstNode getChild(int i) { swift_availability_condition_child(this, i, result) } + + /** Gets a field or child node of this node. */ + final override AstNode getAFieldOrChild() { + swift_availability_condition_child(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) } + + /** 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 { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "Bang" } + } + + /** 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" } + } + + /** A class representing `bitwise_operation` nodes. */ + class BitwiseOperation extends @swift_bitwise_operation, 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 + ) + } + + /** Gets the node corresponding to the field `rhs`. */ + final Expression getRhs() { swift_bitwise_operation_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" } + } + + /** A class representing `call_expression` nodes. */ + class CallExpression extends @swift_call_expression, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "CallExpression" } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_call_expression_child(this, i, result) } + + /** Gets a field or child node of this node. */ + final override AstNode getAFieldOrChild() { swift_call_expression_child(this, _, result) } + } + + /** A class representing `call_suffix` nodes. */ + class CallSuffix extends @swift_call_suffix, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "CallSuffix" } + + /** Gets the node corresponding to the field `name`. */ + final SimpleIdentifier getName(int i) { swift_call_suffix_name(this, i, result) } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_call_suffix_child(this, i, 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) + } + } + + /** A class representing `capture_list` nodes. */ + class CaptureList extends @swift_capture_list, AstNode { + /** 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) } + } + + /** A class representing `capture_list_item` nodes. */ + class CaptureListItem extends @swift_capture_list_item, 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) } + + /** 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 `error`. */ + final Pattern getError() { swift_catch_block_error(this, result) } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_catch_block_child(this, i, 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) + } + } + + /** 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 { + /** 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) + } + } + + /** A class representing `class_body` nodes. */ + class ClassBody extends @swift_class_body, AstNode { + /** 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) } + } + + /** A class representing `class_declaration` nodes. */ + class ClassDeclaration extends @swift_class_declaration, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "ClassDeclaration" } + + /** 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" } + + /** 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 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) + } + } + + /** A class representing `constructor_expression` nodes. */ + class ConstructorExpression extends @swift_constructor_expression, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "ConstructorExpression" } + + /** Gets the node corresponding to the field `constructed_type`. */ + final AstNode getConstructedType() { swift_constructor_expression_def(this, result, _) } + + /** Gets the child of this node. */ + final ConstructorSuffix getChild() { swift_constructor_expression_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) + } + } + + /** A class representing `constructor_suffix` nodes. */ + class ConstructorSuffix extends @swift_constructor_suffix, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "ConstructorSuffix" } + + /** Gets the node corresponding to the field `name`. */ + final SimpleIdentifier getName(int i) { swift_constructor_suffix_name(this, i, result) } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_constructor_suffix_child(this, i, 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) + } + } + + /** A class representing `control_transfer_statement` nodes. */ + class ControlTransferStatement extends @swift_control_transfer_statement, 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) } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_control_transfer_statement_child(this, i, 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" } + } + + /** A class representing `deinit_declaration` nodes. */ + class DeinitDeclaration extends @swift_deinit_declaration, AstNode { + /** 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) + } + } + + /** A class representing `deprecated_operator_declaration_body` nodes. */ + class DeprecatedOperatorDeclarationBody extends @swift_deprecated_operator_declaration_body, + AstNode + { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "DeprecatedOperatorDeclarationBody" } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { + swift_deprecated_operator_declaration_body_child(this, i, result) + } + + /** Gets a field or child node of this node. */ + final override AstNode getAFieldOrChild() { + swift_deprecated_operator_declaration_body_child(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" } + } + + /** A class representing `dictionary_literal` nodes. */ + class DictionaryLiteral extends @swift_dictionary_literal, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "DictionaryLiteral" } + + /** 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 `value`. */ + final Expression getValue(int i) { swift_dictionary_literal_value(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) + } + } + + /** 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) + } + } + + /** A class representing `didset_clause` nodes. */ + class DidsetClause extends @swift_didset_clause, AstNode { + /** 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) } + } + + /** A class representing `directive` nodes. */ + class Directive extends @swift_directive, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "Directive" } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_directive_child(this, i, result) } + + /** Gets a field or child node of this node. */ + final override AstNode getAFieldOrChild() { swift_directive_child(this, _, result) } + } + + /** A class representing `directly_assignable_expression` nodes. */ + class DirectlyAssignableExpression extends @swift_directly_assignable_expression, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "DirectlyAssignableExpression" } + + /** Gets the child of this node. */ + final Expression getChild() { swift_directly_assignable_expression_def(this, result) } + + /** Gets a field or child node of this node. */ + final override AstNode getAFieldOrChild() { + swift_directly_assignable_expression_def(this, result) + } + } + + /** A class representing `disjunction_expression` nodes. */ + class DisjunctionExpression extends @swift_disjunction_expression, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "DisjunctionExpression" } + + /** 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 `rhs`. */ + final Expression getRhs() { swift_disjunction_expression_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) + } + } + + /** 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 { + /** 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) + } + } + + /** A class representing `enum_type_parameters` nodes. */ + class EnumTypeParameters extends @swift_enum_type_parameters, AstNode { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "EnumTypeParameters" } + + /** Gets the `i`th child of this node. */ + final AstNode getChild(int i) { swift_enum_type_parameters_child(this, i, result) } + + /** Gets a field or child node of this node. */ + final override AstNode getAFieldOrChild() { swift_enum_type_parameters_child(this, _, result) } + } + + /** A class representing `equality_constraint` nodes. */ + class EqualityConstraint extends @swift_equality_constraint, 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) } + + /** 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 `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) + } + } + + /** 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 { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "ForStatement" } + + /** Gets the node corresponding to the field `collection`. */ + final Expression getCollection() { swift_for_statement_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 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) + } + + /** 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/qlpack.lock.yml b/unified/ql/lib/qlpack.lock.yml new file mode 100644 index 000000000000..06dd07fc7dc7 --- /dev/null +++ b/unified/ql/lib/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/unified/ql/lib/qlpack.yml b/unified/ql/lib/qlpack.yml new file mode 100644 index 000000000000..896bf37ac5e5 --- /dev/null +++ b/unified/ql/lib/qlpack.yml @@ -0,0 +1,11 @@ +name: codeql/unified-all +version: 0.0.1-dev +groups: unified +dbscheme: unified.dbscheme +extractor: unified +library: true +upgrades: upgrades +dependencies: + codeql/util: ${workspace} +warnOnImplicitThis: true +compileForOverlayEval: true diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme new file mode 100644 index 000000000000..b50bc56eaa2a --- /dev/null +++ b/unified/ql/lib/unified.dbscheme @@ -0,0 +1,2133 @@ +// CodeQL database schema for Swift +// Automatically generated from the tree-sitter grammar; do not edit +// To regenerate, run unified/scripts/create-extractor-pack.sh + +/*- 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 +); + +/*- 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, + 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 +); + +swift_type_modifiers( + unique int swift_type__: @swift_type__ ref, + unique int modifiers: @swift_type_modifiers ref +); + +swift_type_def( + unique int id: @swift_type__, + int name: @swift_unannotated_type 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, + int index: int ref, + unique int child: @swift_type__ ref +); + +swift_type_arguments_def( + unique int id: @swift_type_arguments +); + +@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 +); + +@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, + int index: int ref, + unique int child: @swift_type_constraints_child_type ref +); + +swift_type_constraints_def( + unique int id: @swift_type_constraints +); + +@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 +); + +swift_type_modifiers_def( + unique int id: @swift_type_modifiers +); + +swift_type_pack_expansion_def( + unique int id: @swift_type_pack_expansion, + int child: @swift_unannotated_type 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 +); + +swift_type_parameter_def( + unique int id: @swift_type_parameter +); + +#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 +); + +swift_type_parameter_modifiers_def( + unique int id: @swift_type_parameter_modifiers +); + +swift_type_parameter_pack_def( + unique int id: @swift_type_parameter_pack, + int child: @swift_unannotated_type ref +); + +@swift_type_parameters_child_type = @swift_type_constraints | @swift_type_parameter + +#keyset[swift_type_parameters, index] +swift_type_parameters_child( + int swift_type_parameters: @swift_type_parameters ref, + int index: int ref, + unique int child: @swift_type_parameters_child_type ref +); + +swift_type_parameters_def( + unique int id: @swift_type_parameters +); + +@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 +); + +swift_typealias_declaration_def( + unique int id: @swift_typealias_declaration, + int name: @swift_token_type_identifier ref, + int value: @swift_type__ 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 +); + +swift_user_type_def( + unique int id: @swift_user_type +); + +swift_value_argument_name( + unique int swift_value_argument: @swift_value_argument ref, + unique int name: @swift_value_argument_label ref +); + +#keyset[swift_value_argument, index] +swift_value_argument_reference_specifier( + int swift_value_argument: @swift_value_argument ref, + int index: int ref, + unique int reference_specifier: @swift_value_argument_label ref +); + +swift_value_argument_value( + unique int swift_value_argument: @swift_value_argument ref, + unique int value: @swift_expression 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 +); + +swift_value_argument_label_def( + unique int id: @swift_value_argument_label, + int child: @swift_token_simple_identifier ref +); + +#keyset[swift_value_arguments, index] +swift_value_arguments_child( + int swift_value_arguments: @swift_value_arguments ref, + int index: int ref, + unique int child: @swift_value_argument ref +); + +swift_value_arguments_def( + unique int id: @swift_value_arguments +); + +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, + int index: int ref, + unique int child: @swift_where_clause_child_type ref +); + +swift_where_clause_def( + unique int id: @swift_where_clause +); + +#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 +); + +swift_while_statement_child( + unique int swift_while_statement: @swift_while_statement ref, + unique int child: @swift_statements ref +); + +swift_while_statement_def( + unique int id: @swift_while_statement +); + +@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, + int index: int ref, + unique int child: @swift_willset_clause_child_type ref +); + +swift_willset_clause_def( + unique int id: @swift_willset_clause +); + +@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 +); + +swift_willset_didset_block_def( + unique int id: @swift_willset_didset_block +); + +swift_tokeninfo( + unique int id: @swift_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 +; + + +@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 + +swift_ast_node_location( + unique int node: @swift_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, + int parent_index: int ref +); + diff --git a/unified/ql/lib/unified.dbscheme.stats b/unified/ql/lib/unified.dbscheme.stats new file mode 100644 index 000000000000..82714bfe1d07 --- /dev/null +++ b/unified/ql/lib/unified.dbscheme.stats @@ -0,0 +1,4 @@ + + + + diff --git a/unified/ql/src/qlpack.lock.yml b/unified/ql/src/qlpack.lock.yml new file mode 100644 index 000000000000..06dd07fc7dc7 --- /dev/null +++ b/unified/ql/src/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/unified/ql/src/qlpack.yml b/unified/ql/src/qlpack.yml new file mode 100644 index 000000000000..2de97863ddaf --- /dev/null +++ b/unified/ql/src/qlpack.yml @@ -0,0 +1,11 @@ +name: codeql/unified-queries +version: 0.0.1-dev +groups: + - unified + - queries +suites: codeql-suites +dependencies: + codeql/unified-all: ${workspace} + codeql/suite-helpers: ${workspace} + codeql/util: ${workspace} +warnOnImplicitThis: true diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected new file mode 100644 index 000000000000..62b8146bf040 --- /dev/null +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -0,0 +1,101 @@ +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 diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql new file mode 100644 index 000000000000..3a5ee2f1c157 --- /dev/null +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -0,0 +1,9 @@ +import codeql.unified.Ast + +query predicate identifier(Swift::SimpleIdentifier node, string name) { name = node.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) +} diff --git a/unified/ql/test/library-tests/BasicTest/test.swift b/unified/ql/test/library-tests/BasicTest/test.swift new file mode 100644 index 000000000000..158ef26f598b --- /dev/null +++ b/unified/ql/test/library-tests/BasicTest/test.swift @@ -0,0 +1,88 @@ +import Foundation + +// Generic struct with type constraint +struct Container { + var items: [T] = [] + + mutating func add(_ item: T) { + items.append(item) + } + + func contains(_ item: T) -> Bool { + return items.contains(item) + } +} + +// Protocol with associated type +protocol DataSource { + associatedtype Element + var count: Int { get } + func item(at index: Int) -> Element? +} + +// Generic function with where clause +func merge(_ first: T, _ second: T) -> [T.Element] where T.Element: Equatable { + var result = Array(first) + for item in second { + if !result.contains(item) { + result.append(item) + } + } + return result +} + +// Class with inheritance and computed properties +class DataManager: DataSource { + typealias Element = T + private var data: [T] = [] + + var count: Int { + return data.count + } + + var isEmpty: Bool { + data.isEmpty + } + + func item(at index: Int) -> T? { + guard index >= 0 && index < data.count else { return nil } + return data[index] + } + + func add(_ item: T) { + data.append(item) + } +} + +// Enum with associated values +enum Result { + case success(Success) + case failure(Failure) + + func map(_ transform: (Success) -> U) -> Result { + switch self { + case .success(let value): + return .success(transform(value)) + case .failure(let error): + return .failure(error) + } + } +} + +// Extension with generic constraints +extension Array where Element: Comparable { + func isSorted() -> Bool { + for i in 0..<(count - 1) { + if self[i] > self[i + 1] { + return false + } + } + return true + } +} + +// Higher-order function +func combine(_ values: [T], transform: (T, T) -> T) -> T? { + guard !values.isEmpty else { return nil } + return values.dropFirst().reduce(values[0], transform) +} diff --git a/unified/ql/test/qlpack.lock.yml b/unified/ql/test/qlpack.lock.yml new file mode 100644 index 000000000000..06dd07fc7dc7 --- /dev/null +++ b/unified/ql/test/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/unified/ql/test/qlpack.yml b/unified/ql/test/qlpack.yml new file mode 100644 index 000000000000..8c567d531c91 --- /dev/null +++ b/unified/ql/test/qlpack.yml @@ -0,0 +1,8 @@ +name: codeql/unified-tests +groups: [unified, test] +dependencies: + codeql/unified-queries: ${workspace} + codeql/unified-all: ${workspace} +extractor: unified +tests: . +warnOnImplicitThis: true diff --git a/unified/scripts/create-extractor-pack.sh b/unified/scripts/create-extractor-pack.sh new file mode 100755 index 000000000000..7a41092e4a74 --- /dev/null +++ b/unified/scripts/create-extractor-pack.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -eux +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + platform="linux64" +elif [[ "$OSTYPE" == "darwin"* ]]; then + platform="osx64" +else + echo "Unknown OS" + exit 1 +fi +cd "$(dirname "$0")/.." + +(cd extractor && cargo build --release) + +# we are in a cargo workspace rooted at the git checkout +BIN_DIR=../target/release +"$BIN_DIR/codeql-extractor-unified" generate --dbscheme ql/lib/unified.dbscheme --library ql/lib/codeql/unified/Ast.qll + +codeql query format -i ql/lib/codeql/unified/Ast.qll + +rm -rf extractor-pack +mkdir -p extractor-pack +cp -r codeql-extractor.yml tools ql/lib/unified.dbscheme ql/lib/unified.dbscheme.stats extractor-pack/ +mkdir -p extractor-pack/tools/${platform} +cp "$BIN_DIR/codeql-extractor-unified" extractor-pack/tools/${platform}/extractor diff --git a/unified/scripts/regenerate-grammar.sh b/unified/scripts/regenerate-grammar.sh new file mode 100755 index 000000000000..b7a5ce263fb8 --- /dev/null +++ b/unified/scripts/regenerate-grammar.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Regenerate the vendored tree-sitter-swift parser tables from grammar.js, +# then refresh the human-readable node-types.yml companion file. +# +# Run this after editing +# unified/extractor/tree-sitter-swift/grammar.js so that: +# * src/parser.c, src/grammar.json, src/node-types.json (and the +# src/tree_sitter/*.h headers) reflect the current grammar; and +# * node-types.yml shows the same information in a form that's +# pleasant to review in PR diffs. +# +# Requirements: tree-sitter CLI on PATH, and a working cargo toolchain. +set -euo pipefail + +cd "$(dirname "$0")/.." +SWIFT_DIR="extractor/tree-sitter-swift" + +( + cd "$SWIFT_DIR" + tree-sitter generate +) + +# Build yeast's node_types_yaml binary and use it to convert the freshly +# generated src/node-types.json into the human-readable node-types.yml. +cargo run --release --quiet -p yeast --bin node_types_yaml -- \ + --from-json "$SWIFT_DIR/src/node-types.json" > "$SWIFT_DIR/node-types.yml" + +echo "Regenerated $SWIFT_DIR/{src/parser.c,src/grammar.json,src/node-types.json,node-types.yml}" diff --git a/unified/tools/BUILD.bazel b/unified/tools/BUILD.bazel new file mode 100644 index 000000000000..a4b4baed225c --- /dev/null +++ b/unified/tools/BUILD.bazel @@ -0,0 +1,11 @@ +load("//misc/bazel:pkg.bzl", "codeql_pkg_files") + +codeql_pkg_files( + name = "tools", + excludes = [ + "BUILD.bazel", + ], + exes = glob(["**/*"]), + prefix = "tools", + visibility = ["//unified:__pkg__"], +) diff --git a/unified/tools/autobuild.cmd b/unified/tools/autobuild.cmd new file mode 100644 index 000000000000..05b59eca1191 --- /dev/null +++ b/unified/tools/autobuild.cmd @@ -0,0 +1,5 @@ +@echo off + +type NUL && "%CODEQL_EXTRACTOR_UNIFIED_ROOT%\tools\%CODEQL_PLATFORM%\extractor" autobuild + +exit /b %ERRORLEVEL% diff --git a/unified/tools/autobuild.sh b/unified/tools/autobuild.sh new file mode 100755 index 000000000000..2b35f39e917f --- /dev/null +++ b/unified/tools/autobuild.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +exec "${CODEQL_EXTRACTOR_UNIFIED_ROOT}/tools/${CODEQL_PLATFORM}/extractor" autobuild diff --git a/unified/tools/index-files.cmd b/unified/tools/index-files.cmd new file mode 100644 index 000000000000..3b9fca08ea03 --- /dev/null +++ b/unified/tools/index-files.cmd @@ -0,0 +1,9 @@ +@echo off + +type NUL && "%CODEQL_EXTRACTOR_UNIFIED_ROOT%\tools\win64\extractor.exe" ^ + extract ^ + --file-list "%1" ^ + --source-archive-dir "%CODEQL_EXTRACTOR_UNIFIED_SOURCE_ARCHIVE_DIR%" ^ + --output-dir "%CODEQL_EXTRACTOR_UNIFIED_TRAP_DIR%" + +exit /b %ERRORLEVEL% diff --git a/unified/tools/index-files.sh b/unified/tools/index-files.sh new file mode 100755 index 000000000000..ddf98907e837 --- /dev/null +++ b/unified/tools/index-files.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -eu + +exec "${CODEQL_EXTRACTOR_UNIFIED_ROOT}/tools/${CODEQL_PLATFORM}/extractor" \ + extract \ + --file-list "$1" \ + --source-archive-dir "$CODEQL_EXTRACTOR_UNIFIED_SOURCE_ARCHIVE_DIR" \ + --output-dir "$CODEQL_EXTRACTOR_UNIFIED_TRAP_DIR" diff --git a/unified/tools/qltest.cmd b/unified/tools/qltest.cmd new file mode 100644 index 000000000000..3db89dcc1b98 --- /dev/null +++ b/unified/tools/qltest.cmd @@ -0,0 +1,14 @@ +@echo off + +type NUL && "%CODEQL_DIST%\codeql.exe" database index-files ^ + --prune=**/*.testproj ^ + --include-extension=.swift ^ + --include-extension=.swiftinterface ^ + --size-limit=5m ^ + --language=unified ^ + --working-dir=. ^ + "%CODEQL_EXTRACTOR_UNIFIED_WIP_DATABASE%" + +IF %ERRORLEVEL% NEQ 0 exit /b %ERRORLEVEL% + +exit /b %ERRORLEVEL% diff --git a/unified/tools/qltest.sh b/unified/tools/qltest.sh new file mode 100755 index 000000000000..7dcbb9e81f48 --- /dev/null +++ b/unified/tools/qltest.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +set -eu + +"${CODEQL_DIST}/codeql" database index-files \ + --prune="**/*.testproj" \ + --include-extension=.swift \ + --include-extension=.swiftinterface \ + --size-limit=5m \ + --language=unified \ + --working-dir=.\ + "$CODEQL_EXTRACTOR_UNIFIED_WIP_DATABASE"