diff --git a/Cargo.lock b/Cargo.lock index 934cae590c1a..80417917020d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -426,6 +426,7 @@ dependencies = [ "figment", "glob", "itertools 0.14.0", + "mustache", "num-traits", "ra_ap_base_db", "ra_ap_cfg", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index 0247ee36d9f5..547a1e476069 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -334,6 +334,7 @@ _NORMAL_DEPENDENCIES = { "figment": Label("@vendor_ts__figment-0.10.19//:figment"), "glob": Label("@vendor_ts__glob-0.3.2//:glob"), "itertools": Label("@vendor_ts__itertools-0.14.0//:itertools"), + "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), "num-traits": Label("@vendor_ts__num-traits-0.2.19//:num_traits"), "ra_ap_base_db": Label("@vendor_ts__ra_ap_base_db-0.0.273//:ra_ap_base_db"), "ra_ap_cfg": Label("@vendor_ts__ra_ap_cfg-0.0.273//:ra_ap_cfg"), diff --git a/rust/extractor/BUILD.bazel b/rust/extractor/BUILD.bazel index 124895b149c6..fe5d8e50859c 100644 --- a/rust/extractor/BUILD.bazel +++ b/rust/extractor/BUILD.bazel @@ -7,6 +7,7 @@ codeql_rust_binary( name = "extractor", srcs = glob(["src/**/*.rs"]), aliases = aliases(), + compile_data = ["src/qltest_cargo.mustache"], proc_macro_deps = all_crate_deps( proc_macro = True, ) + [ diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index bdbe7c969eeb..fa3f6171bf86 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -41,3 +41,4 @@ tracing = "0.1.41" tracing-flame = "0.2.0" tracing-subscriber = "0.3.19" chalk-ir = "0.100.0" +mustache = "0.9.0" diff --git a/rust/extractor/src/qltest.rs b/rust/extractor/src/qltest.rs index b127c2b388d8..d21e1d816f2c 100644 --- a/rust/extractor/src/qltest.rs +++ b/rust/extractor/src/qltest.rs @@ -4,6 +4,7 @@ use glob::glob; use itertools::Itertools; use std::ffi::OsStr; use std::fs; +use std::path::Path; use std::process::Command; use tracing::info; @@ -15,39 +16,54 @@ fn dump_lib() -> anyhow::Result<()> { let lib = paths .iter() .map(|p| p.file_stem().expect("results of glob must have a name")) - .filter(|&p| !["main", "lib"].map(OsStr::new).contains(&p)) + .filter(|&p| !["main", "lib", "proc_macro"].map(OsStr::new).contains(&p)) .map(|p| format!("mod {};", p.to_string_lossy())) .join("\n"); fs::write("lib.rs", lib).context("writing lib.rs") } -fn dump_cargo_manifest(dependencies: &[String]) -> anyhow::Result<()> { - let mut manifest = String::from( - r#"[workspace] -[package] -name = "test" -version="0.0.1" -edition="2021" -[lib] -path="lib.rs" -"#, - ); - if fs::exists("main.rs").context("checking existence of main.rs")? { - manifest.push_str( - r#"[[bin]] -name = "main" -path = "main.rs" -"#, - ); +#[derive(serde::Serialize)] +enum TestCargoManifest<'a> { + Workspace {}, + Lib { + uses_proc_macro: bool, + uses_main: bool, + dependencies: &'a [String], + }, + Macro {}, +} + +impl TestCargoManifest<'_> { + pub fn dump(&self, path: impl AsRef) -> anyhow::Result<()> { + static TEMPLATE: std::sync::LazyLock = std::sync::LazyLock::new(|| { + mustache::compile_str(include_str!("qltest_cargo.mustache")) + .expect("compiling template") + }); + + let path = path.as_ref(); + fs::create_dir_all(path).with_context(|| format!("creating {}", path.display()))?; + let path = path.join("Cargo.toml"); + let rendered = TEMPLATE + .render_to_string(&self) + .with_context(|| format!("rendering {}", path.display()))?; + fs::write(&path, rendered).with_context(|| format!("writing {}", path.display())) } - if !dependencies.is_empty() { - manifest.push_str("[dependencies]\n"); - for dep in dependencies { - manifest.push_str(dep); - manifest.push('\n'); - } +} +fn dump_cargo_manifest(dependencies: &[String]) -> anyhow::Result<()> { + let uses_proc_macro = + fs::exists("proc_macro.rs").context("checking existence of proc_macro.rs")?; + let lib_manifest = TestCargoManifest::Lib { + uses_proc_macro, + uses_main: fs::exists("main.rs").context("checking existence of main.rs")?, + dependencies, + }; + if uses_proc_macro { + TestCargoManifest::Workspace {}.dump("")?; + lib_manifest.dump(".lib")?; + TestCargoManifest::Macro {}.dump(".proc_macro") + } else { + lib_manifest.dump("") } - fs::write("Cargo.toml", manifest).context("writing Cargo.toml") } fn set_sources(config: &mut Config) -> anyhow::Result<()> { @@ -75,6 +91,6 @@ pub(crate) fn prepare(config: &mut Config) -> anyhow::Result<()> { } else { anyhow::bail!("requested cargo check failed"); } - } + }; Ok(()) } diff --git a/rust/extractor/src/qltest_cargo.mustache b/rust/extractor/src/qltest_cargo.mustache new file mode 100644 index 000000000000..38db2ca02bf1 --- /dev/null +++ b/rust/extractor/src/qltest_cargo.mustache @@ -0,0 +1,42 @@ +{{#Workspace}} +[workspace] +resolver = "2" +members = [".lib", ".proc_macro"] +{{/Workspace}} + +{{#Lib}} +{{^uses_proc_macro}} +[workspace] +{{/uses_proc_macro}} +[package] +name = "test" +version = "0.0.1" +edition = "2021" +[lib] +path = "{{#uses_proc_macro}}../{{/uses_proc_macro}}lib.rs" +{{#uses_main}} +[[bin]] +name = "main" +path = "{{#uses_proc_macro}}../{{/uses_proc_macro}}main.rs" +{{/uses_main}} +[dependencies] +{{#uses_proc_macro}} +proc_macro = { path = "../.proc_macro" } +{{/uses_proc_macro}} +{{#dependencies}} +{{{.}}} +{{/dependencies}} +{{/Lib}} + +{{#Macro}} +[package] +name = "proc_macro" +version = "0.0.1" +edition = "2021" +[lib] +path = "../proc_macro.rs" +proc_macro = true +[dependencies] +quote = "1.0.40" +syn = { version = "2.0.100", features = ["full"] } +{{/Macro}} diff --git a/rust/ql/integration-tests/macro-expansion/Cargo.toml b/rust/ql/integration-tests/macro-expansion/Cargo.toml deleted file mode 100644 index 9be2ec64b578..000000000000 --- a/rust/ql/integration-tests/macro-expansion/Cargo.toml +++ /dev/null @@ -1,3 +0,0 @@ -[workspace] -members = [ "attributes", "calls", "proc_macros"] -resolver = "2" diff --git a/rust/ql/integration-tests/macro-expansion/attributes/Cargo.toml b/rust/ql/integration-tests/macro-expansion/attributes/Cargo.toml deleted file mode 100644 index b475ead960af..000000000000 --- a/rust/ql/integration-tests/macro-expansion/attributes/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "attributes" -version = "0.1.0" -edition = "2024" - -[dependencies] -proc_macros = { path = "../proc_macros" } diff --git a/rust/ql/integration-tests/macro-expansion/attributes/src/lib.rs b/rust/ql/integration-tests/macro-expansion/attributes/src/lib.rs deleted file mode 100644 index 682083aa10ae..000000000000 --- a/rust/ql/integration-tests/macro-expansion/attributes/src/lib.rs +++ /dev/null @@ -1,16 +0,0 @@ -use proc_macros::repeat; - -#[repeat(3)] -fn foo() { - _ = concat!("Hello ", "world!"); - - #[repeat(2)] - fn inner() {} -} - -#[repeat(2)] -#[repeat(3)] -fn bar() {} - -#[repeat(0)] -fn baz() {} diff --git a/rust/ql/integration-tests/macro-expansion/calls/Cargo.toml b/rust/ql/integration-tests/macro-expansion/calls/Cargo.toml deleted file mode 100644 index d38cf944489e..000000000000 --- a/rust/ql/integration-tests/macro-expansion/calls/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "calls" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/rust/ql/integration-tests/macro-expansion/calls/src/lib.rs b/rust/ql/integration-tests/macro-expansion/calls/src/lib.rs deleted file mode 100644 index df3fccb7c40a..000000000000 --- a/rust/ql/integration-tests/macro-expansion/calls/src/lib.rs +++ /dev/null @@ -1,30 +0,0 @@ -struct S; - -macro_rules! def_x { - () => { - fn x() {} - }; -} - -impl S { - def_x!(); // this doesn't expand since 0.0.274 -} - -macro_rules! my_macro { - ($head:expr, $($tail:tt)*) => { format!($head, $($tail)*) }; -} - - -fn test() { - _ = concat!("x", "y"); - - _ = my_macro!( - concat!("<", "{}", ">"), // this doesn't expand since 0.0.274 - "hi", - ); -} - -include!("included.rs"); - -#[doc = include_str!("some.txt")] // this doesn't expand since 0.0.274 -fn documented() {} diff --git a/rust/ql/integration-tests/macro-expansion/diagnostics.expected b/rust/ql/integration-tests/macro-expansion/diagnostics.expected deleted file mode 100644 index 511bd49f1a51..000000000000 --- a/rust/ql/integration-tests/macro-expansion/diagnostics.expected +++ /dev/null @@ -1,55 +0,0 @@ -{ - "attributes": { - "durations": { - "crateGraph": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "extract": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "extractLibrary": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "findManifests": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "loadManifest": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "loadSource": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "parse": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "parseLibrary": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - }, - "total": { - "ms": "__REDACTED__", - "pretty": "__REDACTED__" - } - }, - "numberOfFiles": 4, - "numberOfManifests": 1 - }, - "severity": "note", - "source": { - "extractorName": "rust", - "id": "rust/extractor/telemetry", - "name": "telemetry" - }, - "visibility": { - "cliSummaryTable": false, - "statusPage": false, - "telemetry": true - } -} diff --git a/rust/ql/integration-tests/macro-expansion/proc_macros/Cargo.toml b/rust/ql/integration-tests/macro-expansion/proc_macros/Cargo.toml deleted file mode 100644 index 712f7ba33933..000000000000 --- a/rust/ql/integration-tests/macro-expansion/proc_macros/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "proc_macros" -version = "0.1.0" -edition = "2024" - -[lib] -proc-macro = true - -[dependencies] -quote = "1.0.40" -syn = { version = "2.0.100", features = ["full"] } diff --git a/rust/ql/integration-tests/macro-expansion/source_archive.expected b/rust/ql/integration-tests/macro-expansion/source_archive.expected deleted file mode 100644 index c1700a0a3003..000000000000 --- a/rust/ql/integration-tests/macro-expansion/source_archive.expected +++ /dev/null @@ -1,4 +0,0 @@ -attributes/src/lib.rs -calls/src/included.rs -calls/src/lib.rs -proc_macros/src/lib.rs diff --git a/rust/ql/integration-tests/macro-expansion/test.expected b/rust/ql/integration-tests/macro-expansion/test.expected deleted file mode 100644 index 24d95c99b351..000000000000 --- a/rust/ql/integration-tests/macro-expansion/test.expected +++ /dev/null @@ -1,34 +0,0 @@ -attribute_macros -| attributes/src/lib.rs:3:1:9:1 | fn foo | 0 | attributes/src/lib.rs:4:1:8:16 | fn foo_0 | -| attributes/src/lib.rs:3:1:9:1 | fn foo | 1 | attributes/src/lib.rs:4:1:8:16 | fn foo_1 | -| attributes/src/lib.rs:3:1:9:1 | fn foo | 2 | attributes/src/lib.rs:4:1:8:16 | fn foo_2 | -| attributes/src/lib.rs:7:5:8:16 | fn inner | 0 | attributes/src/lib.rs:8:5:8:16 | fn inner_0 | -| attributes/src/lib.rs:7:5:8:16 | fn inner | 0 | attributes/src/lib.rs:8:5:8:16 | fn inner_0 | -| attributes/src/lib.rs:7:5:8:16 | fn inner | 0 | attributes/src/lib.rs:8:5:8:16 | fn inner_0 | -| attributes/src/lib.rs:7:5:8:16 | fn inner | 1 | attributes/src/lib.rs:8:5:8:16 | fn inner_1 | -| attributes/src/lib.rs:7:5:8:16 | fn inner | 1 | attributes/src/lib.rs:8:5:8:16 | fn inner_1 | -| attributes/src/lib.rs:7:5:8:16 | fn inner | 1 | attributes/src/lib.rs:8:5:8:16 | fn inner_1 | -| attributes/src/lib.rs:11:1:13:11 | fn bar | 0 | attributes/src/lib.rs:12:1:13:10 | fn bar_0 | -| attributes/src/lib.rs:11:1:13:11 | fn bar | 1 | attributes/src/lib.rs:12:1:13:10 | fn bar_1 | -| attributes/src/lib.rs:12:1:13:10 | fn bar_0 | 0 | attributes/src/lib.rs:13:1:13:10 | fn bar_0_0 | -| attributes/src/lib.rs:12:1:13:10 | fn bar_0 | 1 | attributes/src/lib.rs:13:1:13:10 | fn bar_0_1 | -| attributes/src/lib.rs:12:1:13:10 | fn bar_0 | 2 | attributes/src/lib.rs:13:1:13:10 | fn bar_0_2 | -| attributes/src/lib.rs:12:1:13:10 | fn bar_1 | 0 | attributes/src/lib.rs:13:1:13:10 | fn bar_1_0 | -| attributes/src/lib.rs:12:1:13:10 | fn bar_1 | 1 | attributes/src/lib.rs:13:1:13:10 | fn bar_1_1 | -| attributes/src/lib.rs:12:1:13:10 | fn bar_1 | 2 | attributes/src/lib.rs:13:1:13:10 | fn bar_1_2 | -macro_calls -| attributes/src/lib.rs:5:9:5:34 | concat!... | attributes/src/lib.rs:5:17:5:34 | "Hello world!" | -| attributes/src/lib.rs:5:9:5:34 | concat!... | attributes/src/lib.rs:5:17:5:34 | "Hello world!" | -| attributes/src/lib.rs:5:9:5:34 | concat!... | attributes/src/lib.rs:5:17:5:34 | "Hello world!" | -| calls/src/included.rs:2:9:2:39 | concat!... | calls/src/included.rs:2:17:2:38 | "Hello world!" | -| calls/src/lib.rs:10:5:10:13 | def_x!... | calls/src/lib.rs:10:5:10:13 | MacroItems | -| calls/src/lib.rs:19:9:19:25 | concat!... | calls/src/lib.rs:19:17:19:24 | "xy" | -| calls/src/lib.rs:21:9:24:5 | my_macro!... | calls/src/lib.rs:22:9:23:13 | MacroExpr | -| calls/src/lib.rs:22:9:22:31 | concat!... | calls/src/lib.rs:22:17:22:30 | "<{}>" | -| calls/src/lib.rs:22:9:23:13 | ...::format_args!... | calls/src/lib.rs:22:9:23:13 | FormatArgsExpr | -| calls/src/lib.rs:22:9:23:13 | format!... | calls/src/lib.rs:22:9:23:13 | ...::must_use(...) | -| calls/src/lib.rs:27:1:27:24 | concat!... | calls/src/lib.rs:27:1:27:24 | "Hello world!" | -| calls/src/lib.rs:27:1:27:24 | include!... | calls/src/lib.rs:27:1:27:24 | MacroItems | -| calls/src/lib.rs:29:9:29:32 | include_str!... | calls/src/lib.rs:29:22:29:31 | "" | -unexpanded_macro_calls -| attributes/src/lib.rs:5:9:5:35 | concat!... | diff --git a/rust/ql/integration-tests/macro-expansion/test_macro_expansion.py b/rust/ql/integration-tests/macro-expansion/test_macro_expansion.py deleted file mode 100644 index 0d20cc2e27da..000000000000 --- a/rust/ql/integration-tests/macro-expansion/test_macro_expansion.py +++ /dev/null @@ -1,2 +0,0 @@ -def test_macro_expansion(codeql, rust, check_source_archive, rust_check_diagnostics): - codeql.database.create() diff --git a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll index e6cf20da84dc..c5a95ac90389 100644 --- a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll +++ b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll @@ -37,6 +37,7 @@ private module ResolveTest implements TestSig { not n = any(Path parent).getQualifier() and location = n.getLocation() and n.fromSource() and + not location.getFile().getAbsolutePath().matches("%proc_macro.rs") and not n.isFromMacroExpansion() and element = n.toString() and tag = "item" diff --git a/rust/ql/test/.gitignore b/rust/ql/test/.gitignore index bbbb5decae25..3c36d8c77974 100644 --- a/rust/ql/test/.gitignore +++ b/rust/ql/test/.gitignore @@ -1,3 +1,6 @@ Cargo.toml lib.rs target/ +.proc_macro/ +.lib/ + diff --git a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..fcaa6dda1dc7 --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multiplePathResolutions +| macro_expansion.rs:1:5:1:14 | proc_macro | file://:0:0:0:0 | Crate(proc_macro@0.0.0) | +| macro_expansion.rs:1:5:1:14 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | diff --git a/rust/ql/test/extractor-tests/macro_expansion/Cargo.lock b/rust/ql/test/extractor-tests/macro-expansion/Cargo.lock similarity index 85% rename from rust/ql/test/extractor-tests/macro_expansion/Cargo.lock rename to rust/ql/test/extractor-tests/macro-expansion/Cargo.lock index 05d957e53f27..3ed3f289c886 100644 --- a/rust/ql/test/extractor-tests/macro_expansion/Cargo.lock +++ b/rust/ql/test/extractor-tests/macro-expansion/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.95" @@ -21,6 +11,14 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc_macro" +version = "0.0.1" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.40" @@ -45,7 +43,7 @@ dependencies = [ name = "test" version = "0.0.1" dependencies = [ - "ctor", + "proc_macro", ] [[package]] diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected new file mode 100644 index 000000000000..092c26051d65 --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -0,0 +1,2174 @@ +call.rs: +# 1| [SourceFile] SourceFile +# 1| getItem(0): [Use] use ...::macro_expansion +# 1| getUseTree(): [UseTree] ...::macro_expansion +# 1| getPath(): [Path] ...::macro_expansion +# 1| getQualifier(): [Path] crate +# 1| getSegment(): [PathSegment] crate +# 1| getIdentifier(): [NameRef] crate +# 1| getSegment(): [PathSegment] macro_expansion +# 1| getIdentifier(): [NameRef] macro_expansion +# 3| getItem(1): [Function] fn call_some_functions +# 3| getParamList(): [ParamList] ParamList +# 3| getBody(): [BlockExpr] { ... } +# 3| getStmtList(): [StmtList] StmtList +# 4| getStatement(0): [ExprStmt] ExprStmt +# 4| getExpr(): [CallExpr] ...::foo(...) +# 4| getArgList(): [ArgList] ArgList +# 4| getFunction(): [PathExpr] ...::foo +# 4| getPath(): [Path] ...::foo +# 4| getQualifier(): [Path] macro_expansion +# 4| getSegment(): [PathSegment] macro_expansion +# 4| getIdentifier(): [NameRef] macro_expansion +# 4| getSegment(): [PathSegment] foo +# 4| getIdentifier(): [NameRef] foo +# 5| getStatement(1): [ExprStmt] ExprStmt +# 5| getExpr(): [CallExpr] ...::foo_new(...) +# 5| getArgList(): [ArgList] ArgList +# 5| getFunction(): [PathExpr] ...::foo_new +# 5| getPath(): [Path] ...::foo_new +# 5| getQualifier(): [Path] macro_expansion +# 5| getSegment(): [PathSegment] macro_expansion +# 5| getIdentifier(): [NameRef] macro_expansion +# 5| getSegment(): [PathSegment] foo_new +# 5| getIdentifier(): [NameRef] foo_new +# 6| getStatement(2): [ExprStmt] ExprStmt +# 6| getExpr(): [CallExpr] ...::bar_0(...) +# 6| getArgList(): [ArgList] ArgList +# 6| getFunction(): [PathExpr] ...::bar_0 +# 6| getPath(): [Path] ...::bar_0 +# 6| getQualifier(): [Path] macro_expansion +# 6| getSegment(): [PathSegment] macro_expansion +# 6| getIdentifier(): [NameRef] macro_expansion +# 6| getSegment(): [PathSegment] bar_0 +# 6| getIdentifier(): [NameRef] bar_0 +# 7| getStatement(3): [ExprStmt] ExprStmt +# 7| getExpr(): [CallExpr] ...::bar_1(...) +# 7| getArgList(): [ArgList] ArgList +# 7| getFunction(): [PathExpr] ...::bar_1 +# 7| getPath(): [Path] ...::bar_1 +# 7| getQualifier(): [Path] macro_expansion +# 7| getSegment(): [PathSegment] macro_expansion +# 7| getIdentifier(): [NameRef] macro_expansion +# 7| getSegment(): [PathSegment] bar_1 +# 7| getIdentifier(): [NameRef] bar_1 +# 8| getStatement(4): [ExprStmt] ExprStmt +# 8| getExpr(): [CallExpr] ...::bar_0_new(...) +# 8| getArgList(): [ArgList] ArgList +# 8| getFunction(): [PathExpr] ...::bar_0_new +# 8| getPath(): [Path] ...::bar_0_new +# 8| getQualifier(): [Path] macro_expansion +# 8| getSegment(): [PathSegment] macro_expansion +# 8| getIdentifier(): [NameRef] macro_expansion +# 8| getSegment(): [PathSegment] bar_0_new +# 8| getIdentifier(): [NameRef] bar_0_new +# 9| getStatement(5): [ExprStmt] ExprStmt +# 9| getExpr(): [CallExpr] ...::bar_1_new(...) +# 9| getArgList(): [ArgList] ArgList +# 9| getFunction(): [PathExpr] ...::bar_1_new +# 9| getPath(): [Path] ...::bar_1_new +# 9| getQualifier(): [Path] macro_expansion +# 9| getSegment(): [PathSegment] macro_expansion +# 9| getIdentifier(): [NameRef] macro_expansion +# 9| getSegment(): [PathSegment] bar_1_new +# 9| getIdentifier(): [NameRef] bar_1_new +# 10| getStatement(6): [ExprStmt] ExprStmt +# 10| getExpr(): [CallExpr] ...::bzz_0(...) +# 10| getArgList(): [ArgList] ArgList +# 10| getFunction(): [PathExpr] ...::bzz_0 +# 10| getPath(): [Path] ...::bzz_0 +# 10| getQualifier(): [Path] ...::S +# 10| getQualifier(): [Path] macro_expansion +# 10| getSegment(): [PathSegment] macro_expansion +# 10| getIdentifier(): [NameRef] macro_expansion +# 10| getSegment(): [PathSegment] S +# 10| getIdentifier(): [NameRef] S +# 10| getSegment(): [PathSegment] bzz_0 +# 10| getIdentifier(): [NameRef] bzz_0 +# 11| getStatement(7): [ExprStmt] ExprStmt +# 11| getExpr(): [CallExpr] ...::bzz_1(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getFunction(): [PathExpr] ...::bzz_1 +# 11| getPath(): [Path] ...::bzz_1 +# 11| getQualifier(): [Path] ...::S +# 11| getQualifier(): [Path] macro_expansion +# 11| getSegment(): [PathSegment] macro_expansion +# 11| getIdentifier(): [NameRef] macro_expansion +# 11| getSegment(): [PathSegment] S +# 11| getIdentifier(): [NameRef] S +# 11| getSegment(): [PathSegment] bzz_1 +# 11| getIdentifier(): [NameRef] bzz_1 +# 12| getStatement(8): [ExprStmt] ExprStmt +# 12| getExpr(): [CallExpr] ...::bzz_2(...) +# 12| getArgList(): [ArgList] ArgList +# 12| getFunction(): [PathExpr] ...::bzz_2 +# 12| getPath(): [Path] ...::bzz_2 +# 12| getQualifier(): [Path] ...::S +# 12| getQualifier(): [Path] macro_expansion +# 12| getSegment(): [PathSegment] macro_expansion +# 12| getIdentifier(): [NameRef] macro_expansion +# 12| getSegment(): [PathSegment] S +# 12| getIdentifier(): [NameRef] S +# 12| getSegment(): [PathSegment] bzz_2 +# 12| getIdentifier(): [NameRef] bzz_2 +# 13| getStatement(9): [ExprStmt] ExprStmt +# 13| getExpr(): [CallExpr] ...::x(...) +# 13| getArgList(): [ArgList] ArgList +# 13| getFunction(): [PathExpr] ...::x +# 13| getPath(): [Path] ...::x +# 13| getQualifier(): [Path] ...::S +# 13| getQualifier(): [Path] macro_expansion +# 13| getSegment(): [PathSegment] macro_expansion +# 13| getIdentifier(): [NameRef] macro_expansion +# 13| getSegment(): [PathSegment] S +# 13| getIdentifier(): [NameRef] S +# 13| getSegment(): [PathSegment] x +# 13| getIdentifier(): [NameRef] x +# 3| getName(): [Name] call_some_functions +included/included.rs: +# 1| [SourceFile] SourceFile +# 1| getItem(0): [Function] fn included +# 1| getParamList(): [ParamList] ParamList +# 1| getBody(): [BlockExpr] { ... } +# 1| getStmtList(): [StmtList] StmtList +# 2| getStatement(0): [ExprStmt] ExprStmt +# 2| getExpr(): [AssignmentExpr] ... = ... +# 2| getLhs(): [UnderscoreExpr] _ +# 2| getRhs(): [MacroExpr] MacroExpr +# 2| getMacroCall(): [MacroCall] concat!... +# 2| getPath(): [Path] concat +# 2| getSegment(): [PathSegment] concat +# 2| getIdentifier(): [NameRef] concat +# 2| getTokenTree(): [TokenTree] TokenTree +# 2| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" +# 1| getName(): [Name] included +# 2| [Comment] //... +lib.rs: +# 1| [SourceFile] SourceFile +# 1| getItem(0): [Module] mod call +# 1| getName(): [Name] call +# 2| getItem(1): [Module] mod macro_expansion +# 2| getName(): [Name] macro_expansion +macro_expansion.rs: +# 1| [SourceFile] SourceFile +# 1| getItem(0): [Use] use proc_macro::{...} +# 1| getUseTree(): [UseTree] proc_macro::{...} +# 1| getPath(): [Path] proc_macro +# 1| getSegment(): [PathSegment] proc_macro +# 1| getIdentifier(): [NameRef] proc_macro +# 1| getUseTreeList(): [UseTreeList] UseTreeList +# 1| getUseTree(0): [UseTree] repeat +# 1| getPath(): [Path] repeat +# 1| getSegment(): [PathSegment] repeat +# 1| getIdentifier(): [NameRef] repeat +# 1| getUseTree(1): [UseTree] add_one +# 1| getPath(): [Path] add_one +# 1| getSegment(): [PathSegment] add_one +# 1| getIdentifier(): [NameRef] add_one +# 1| getUseTree(2): [UseTree] erase +# 1| getPath(): [Path] erase +# 1| getSegment(): [PathSegment] erase +# 1| getIdentifier(): [NameRef] erase +# 3| getItem(1): [Function] fn foo +# 4| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 4| getItem(0): [Function] fn foo +# 4| getParamList(): [ParamList] ParamList +# 4| getBody(): [BlockExpr] { ... } +# 4| getStmtList(): [StmtList] StmtList +# 5| getStatement(0): [ExprStmt] ExprStmt +# 5| getExpr(): [AssignmentExpr] ... = ... +# 5| getLhs(): [UnderscoreExpr] _ +# 5| getRhs(): [MacroExpr] MacroExpr +# 5| getMacroCall(): [MacroCall] concat!... +# 5| getPath(): [Path] concat +# 5| getSegment(): [PathSegment] concat +# 5| getIdentifier(): [NameRef] concat +# 5| getTokenTree(): [TokenTree] TokenTree +# 5| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" +# 7| getStatement(1): [Function] fn inner +# 8| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 8| getItem(0): [Function] fn inner_0 +# 8| getParamList(): [ParamList] ParamList +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner_0 +# 8| getItem(1): [Function] fn inner_1 +# 8| getParamList(): [ParamList] ParamList +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner_1 +# 8| getParamList(): [ParamList] ParamList +# 7| getAttr(0): [Attr] Attr +# 7| getMeta(): [Meta] Meta +# 7| getPath(): [Path] repeat +# 7| getSegment(): [PathSegment] repeat +# 7| getIdentifier(): [NameRef] repeat +# 7| getTokenTree(): [TokenTree] TokenTree +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner +# 10| getStatement(2): [ExprStmt] ExprStmt +# 10| getExpr(): [CallExpr] inner_0(...) +# 10| getArgList(): [ArgList] ArgList +# 10| getFunction(): [PathExpr] inner_0 +# 10| getPath(): [Path] inner_0 +# 10| getSegment(): [PathSegment] inner_0 +# 10| getIdentifier(): [NameRef] inner_0 +# 11| getStatement(3): [ExprStmt] ExprStmt +# 11| getExpr(): [CallExpr] inner_1(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getFunction(): [PathExpr] inner_1 +# 11| getPath(): [Path] inner_1 +# 11| getSegment(): [PathSegment] inner_1 +# 11| getIdentifier(): [NameRef] inner_1 +# 4| getName(): [Name] foo +# 4| getVisibility(): [Visibility] Visibility +# 4| getItem(1): [Function] fn foo_new +# 4| getParamList(): [ParamList] ParamList +# 4| getBody(): [BlockExpr] { ... } +# 4| getStmtList(): [StmtList] StmtList +# 5| getStatement(0): [ExprStmt] ExprStmt +# 5| getExpr(): [AssignmentExpr] ... = ... +# 5| getLhs(): [UnderscoreExpr] _ +# 5| getRhs(): [MacroExpr] MacroExpr +# 5| getMacroCall(): [MacroCall] concat!... +# 5| getPath(): [Path] concat +# 5| getSegment(): [PathSegment] concat +# 5| getIdentifier(): [NameRef] concat +# 5| getTokenTree(): [TokenTree] TokenTree +# 5| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" +# 7| getStatement(1): [Function] fn inner +# 8| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 8| getItem(0): [Function] fn inner_0 +# 8| getParamList(): [ParamList] ParamList +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner_0 +# 8| getItem(1): [Function] fn inner_1 +# 8| getParamList(): [ParamList] ParamList +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner_1 +# 8| getParamList(): [ParamList] ParamList +# 7| getAttr(0): [Attr] Attr +# 7| getMeta(): [Meta] Meta +# 7| getPath(): [Path] repeat +# 7| getSegment(): [PathSegment] repeat +# 7| getIdentifier(): [NameRef] repeat +# 7| getTokenTree(): [TokenTree] TokenTree +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner +# 10| getStatement(2): [ExprStmt] ExprStmt +# 10| getExpr(): [CallExpr] inner_0(...) +# 10| getArgList(): [ArgList] ArgList +# 10| getFunction(): [PathExpr] inner_0 +# 10| getPath(): [Path] inner_0 +# 10| getSegment(): [PathSegment] inner_0 +# 10| getIdentifier(): [NameRef] inner_0 +# 11| getStatement(3): [ExprStmt] ExprStmt +# 11| getExpr(): [CallExpr] inner_1(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getFunction(): [PathExpr] inner_1 +# 11| getPath(): [Path] inner_1 +# 11| getSegment(): [PathSegment] inner_1 +# 11| getIdentifier(): [NameRef] inner_1 +# 4| getName(): [Name] foo_new +# 4| getVisibility(): [Visibility] Visibility +# 4| getParamList(): [ParamList] ParamList +# 3| getAttr(0): [Attr] Attr +# 3| getMeta(): [Meta] Meta +# 3| getPath(): [Path] add_one +# 3| getSegment(): [PathSegment] add_one +# 3| getIdentifier(): [NameRef] add_one +# 4| getBody(): [BlockExpr] { ... } +# 4| getStmtList(): [StmtList] StmtList +# 5| getStatement(0): [ExprStmt] ExprStmt +# 5| getExpr(): [AssignmentExpr] ... = ... +# 5| getLhs(): [UnderscoreExpr] _ +# 5| getRhs(): [MacroExpr] MacroExpr +# 5| getMacroCall(): [MacroCall] concat!... +# 5| getPath(): [Path] concat +# 5| getSegment(): [PathSegment] concat +# 5| getIdentifier(): [NameRef] concat +# 5| getTokenTree(): [TokenTree] TokenTree +# 7| getStatement(1): [Function] fn inner +# 8| getParamList(): [ParamList] ParamList +# 7| getAttr(0): [Attr] Attr +# 7| getMeta(): [Meta] Meta +# 7| getPath(): [Path] repeat +# 7| getSegment(): [PathSegment] repeat +# 7| getIdentifier(): [NameRef] repeat +# 7| getTokenTree(): [TokenTree] TokenTree +# 8| getBody(): [BlockExpr] { ... } +# 8| getStmtList(): [StmtList] StmtList +# 8| getName(): [Name] inner +# 10| getStatement(2): [ExprStmt] ExprStmt +# 10| getExpr(): [CallExpr] inner_0(...) +# 10| getArgList(): [ArgList] ArgList +# 10| getFunction(): [PathExpr] inner_0 +# 10| getPath(): [Path] inner_0 +# 10| getSegment(): [PathSegment] inner_0 +# 10| getIdentifier(): [NameRef] inner_0 +# 11| getStatement(3): [ExprStmt] ExprStmt +# 11| getExpr(): [CallExpr] inner_1(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getFunction(): [PathExpr] inner_1 +# 11| getPath(): [Path] inner_1 +# 11| getSegment(): [PathSegment] inner_1 +# 11| getIdentifier(): [NameRef] inner_1 +# 4| getName(): [Name] foo +# 4| getVisibility(): [Visibility] Visibility +# 14| getItem(2): [Function] fn bar +# 15| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 15| getItem(0): [Function] fn bar_0 +# 16| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 16| getItem(0): [Function] fn bar_0 +# 16| getParamList(): [ParamList] ParamList +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar_0 +# 16| getVisibility(): [Visibility] Visibility +# 16| getItem(1): [Function] fn bar_0_new +# 16| getParamList(): [ParamList] ParamList +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar_0_new +# 16| getVisibility(): [Visibility] Visibility +# 16| getParamList(): [ParamList] ParamList +# 15| getAttr(0): [Attr] Attr +# 15| getMeta(): [Meta] Meta +# 15| getPath(): [Path] add_one +# 15| getSegment(): [PathSegment] add_one +# 15| getIdentifier(): [NameRef] add_one +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar_0 +# 16| getVisibility(): [Visibility] Visibility +# 15| getItem(1): [Function] fn bar_1 +# 16| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 16| getItem(0): [Function] fn bar_1 +# 16| getParamList(): [ParamList] ParamList +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar_1 +# 16| getVisibility(): [Visibility] Visibility +# 16| getItem(1): [Function] fn bar_1_new +# 16| getParamList(): [ParamList] ParamList +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar_1_new +# 16| getVisibility(): [Visibility] Visibility +# 16| getParamList(): [ParamList] ParamList +# 15| getAttr(0): [Attr] Attr +# 15| getMeta(): [Meta] Meta +# 15| getPath(): [Path] add_one +# 15| getSegment(): [PathSegment] add_one +# 15| getIdentifier(): [NameRef] add_one +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar_1 +# 16| getVisibility(): [Visibility] Visibility +# 16| getParamList(): [ParamList] ParamList +# 14| getAttr(0): [Attr] Attr +# 14| getMeta(): [Meta] Meta +# 14| getPath(): [Path] repeat +# 14| getSegment(): [PathSegment] repeat +# 14| getIdentifier(): [NameRef] repeat +# 14| getTokenTree(): [TokenTree] TokenTree +# 15| getAttr(1): [Attr] Attr +# 15| getMeta(): [Meta] Meta +# 15| getPath(): [Path] add_one +# 15| getSegment(): [PathSegment] add_one +# 15| getIdentifier(): [NameRef] add_one +# 16| getBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getName(): [Name] bar +# 16| getVisibility(): [Visibility] Visibility +# 18| getItem(3): [Function] fn baz +# 18| getAttributeMacroExpansion(): [MacroItems] MacroItems +# 19| getParamList(): [ParamList] ParamList +# 18| getAttr(0): [Attr] Attr +# 18| getMeta(): [Meta] Meta +# 18| getPath(): [Path] erase +# 18| getSegment(): [PathSegment] erase +# 18| getIdentifier(): [NameRef] erase +# 19| getBody(): [BlockExpr] { ... } +# 19| getStmtList(): [StmtList] StmtList +# 19| getName(): [Name] baz +# 19| getVisibility(): [Visibility] Visibility +# 22| getItem(4): [MacroRules] MacroRules +# 22| getName(): [Name] hello +# 22| getTokenTree(): [TokenTree] TokenTree +# 28| getItem(5): [Struct] struct S +# 28| getName(): [Name] S +# 28| getVisibility(): [Visibility] Visibility +# 30| getItem(6): [Impl] impl S { ... } +# 30| getAssocItemList(): [AssocItemList] AssocItemList +# 31| getAssocItem(0): [Function] fn bzz +# 32| getParamList(): [ParamList] ParamList +# 31| getAttr(0): [Attr] Attr +# 31| getMeta(): [Meta] Meta +# 31| getPath(): [Path] repeat +# 31| getSegment(): [PathSegment] repeat +# 31| getIdentifier(): [NameRef] repeat +# 31| getTokenTree(): [TokenTree] TokenTree +# 32| getBody(): [BlockExpr] { ... } +# 32| getStmtList(): [StmtList] StmtList +# 33| getStatement(0): [ExprStmt] ExprStmt +# 33| getExpr(): [MacroExpr] MacroExpr +# 33| getMacroCall(): [MacroCall] hello!... +# 33| getPath(): [Path] hello +# 33| getSegment(): [PathSegment] hello +# 33| getIdentifier(): [NameRef] hello +# 33| getTokenTree(): [TokenTree] TokenTree +# 33| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 33| getStatement(0): [ExprStmt] ExprStmt +# 33| getExpr(): [MacroExpr] MacroExpr +# 33| getMacroCall(): [MacroCall] println!... +# 33| getPath(): [Path] println +# 33| getSegment(): [PathSegment] println +# 33| getIdentifier(): [NameRef] println +# 33| getTokenTree(): [TokenTree] TokenTree +# 33| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 33| getTailExpr(): [BlockExpr] { ... } +# 33| getStmtList(): [StmtList] StmtList +# 33| getStatement(0): [ExprStmt] ExprStmt +# 33| getExpr(): [CallExpr] ...::_print(...) +# 33| getArgList(): [ArgList] ArgList +# 33| getArg(0): [MacroExpr] MacroExpr +# 33| getMacroCall(): [MacroCall] ...::format_args_nl!... +# 33| getPath(): [Path] ...::format_args_nl +# 33| getQualifier(): [Path] $crate +# 33| getSegment(): [PathSegment] $crate +# 33| getIdentifier(): [NameRef] $crate +# 33| getSegment(): [PathSegment] format_args_nl +# 33| getIdentifier(): [NameRef] format_args_nl +# 33| getTokenTree(): [TokenTree] TokenTree +# 33| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr +# 33| getTemplate(): [StringLiteralExpr] "hello!\n" +# 33| getFunction(): [PathExpr] ...::_print +# 33| getPath(): [Path] ...::_print +# 33| getQualifier(): [Path] ...::io +# 33| getQualifier(): [Path] $crate +# 33| getSegment(): [PathSegment] $crate +# 33| getIdentifier(): [NameRef] $crate +# 33| getSegment(): [PathSegment] io +# 33| getIdentifier(): [NameRef] io +# 33| getSegment(): [PathSegment] _print +# 33| getIdentifier(): [NameRef] _print +# 32| getName(): [Name] bzz +# 32| getVisibility(): [Visibility] Visibility +# 30| getSelfTy(): [PathTypeRepr] S +# 30| getPath(): [Path] S +# 30| getSegment(): [PathSegment] S +# 30| getIdentifier(): [NameRef] S +# 37| getItem(7): [MacroRules] MacroRules +# 37| getName(): [Name] def_x +# 37| getTokenTree(): [TokenTree] TokenTree +# 43| getItem(8): [Impl] impl S { ... } +# 43| getAssocItemList(): [AssocItemList] AssocItemList +# 44| getAssocItem(0): [MacroCall] def_x!... +# 44| getPath(): [Path] def_x +# 44| getSegment(): [PathSegment] def_x +# 44| getIdentifier(): [NameRef] def_x +# 44| getTokenTree(): [TokenTree] TokenTree +# 44| getMacroCallExpansion(): [MacroItems] MacroItems +# 44| getItem(0): [Function] fn x +# 44| getParamList(): [ParamList] ParamList +# 44| getBody(): [BlockExpr] { ... } +# 44| getStmtList(): [StmtList] StmtList +# 44| getName(): [Name] x +# 44| getVisibility(): [Visibility] Visibility +# 43| getSelfTy(): [PathTypeRepr] S +# 43| getPath(): [Path] S +# 43| getSegment(): [PathSegment] S +# 43| getIdentifier(): [NameRef] S +# 47| getItem(9): [MacroRules] MacroRules +# 47| getName(): [Name] my_macro +# 47| getTokenTree(): [TokenTree] TokenTree +# 52| getItem(10): [Function] fn test +# 52| getParamList(): [ParamList] ParamList +# 52| getBody(): [BlockExpr] { ... } +# 52| getStmtList(): [StmtList] StmtList +# 53| getStatement(0): [ExprStmt] ExprStmt +# 53| getExpr(): [AssignmentExpr] ... = ... +# 53| getLhs(): [UnderscoreExpr] _ +# 53| getRhs(): [MacroExpr] MacroExpr +# 53| getMacroCall(): [MacroCall] concat!... +# 53| getPath(): [Path] concat +# 53| getSegment(): [PathSegment] concat +# 53| getIdentifier(): [NameRef] concat +# 53| getTokenTree(): [TokenTree] TokenTree +# 53| getMacroCallExpansion(): [StringLiteralExpr] "xy" +# 55| getStatement(1): [ExprStmt] ExprStmt +# 55| getExpr(): [AssignmentExpr] ... = ... +# 55| getLhs(): [UnderscoreExpr] _ +# 55| getRhs(): [MacroExpr] MacroExpr +# 55| getMacroCall(): [MacroCall] my_macro!... +# 55| getPath(): [Path] my_macro +# 55| getSegment(): [PathSegment] my_macro +# 55| getIdentifier(): [NameRef] my_macro +# 55| getTokenTree(): [TokenTree] TokenTree +# 56| getMacroCallExpansion(): [MacroExpr] MacroExpr +# 56| getMacroCall(): [MacroCall] format!... +# 55| getPath(): [Path] format +# 55| getSegment(): [PathSegment] format +# 55| getIdentifier(): [NameRef] format +# 56| getTokenTree(): [TokenTree] TokenTree +# 56| getMacroCallExpansion(): [CallExpr] ...::must_use(...) +# 56| getArgList(): [ArgList] ArgList +# 56| getArg(0): [BlockExpr] { ... } +# 56| getStmtList(): [StmtList] StmtList +# 56| getStatement(0): [LetStmt] let ... = ... +# 56| getInitializer(): [CallExpr] ...::format(...) +# 56| getArgList(): [ArgList] ArgList +# 56| getArg(0): [MacroExpr] MacroExpr +# 56| getMacroCall(): [MacroCall] ...::format_args!... +# 55| getPath(): [Path] ...::format_args +# 55| getQualifier(): [Path] ...::__export +# 55| getQualifier(): [Path] $crate +# 55| getSegment(): [PathSegment] $crate +# 55| getIdentifier(): [NameRef] $crate +# 55| getSegment(): [PathSegment] __export +# 55| getIdentifier(): [NameRef] __export +# 55| getSegment(): [PathSegment] format_args +# 55| getIdentifier(): [NameRef] format_args +# 56| getTokenTree(): [TokenTree] TokenTree +# 56| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr +# 57| getArg(0): [FormatArgsArg] FormatArgsArg +# 57| getExpr(): [StringLiteralExpr] "hi" +# 56| getTemplate(): [ParenExpr] (...) +# 56| getExpr(): [MacroExpr] MacroExpr +# 56| getMacroCall(): [MacroCall] concat!... +# 56| getPath(): [Path] concat +# 56| getSegment(): [PathSegment] concat +# 56| getIdentifier(): [NameRef] concat +# 56| getTokenTree(): [TokenTree] TokenTree +# 56| getMacroCallExpansion(): [StringLiteralExpr] "<{}>" +# 55| getFunction(): [PathExpr] ...::format +# 55| getPath(): [Path] ...::format +# 55| getQualifier(): [Path] ...::fmt +# 55| getQualifier(): [Path] $crate +# 55| getSegment(): [PathSegment] $crate +# 55| getIdentifier(): [NameRef] $crate +# 55| getSegment(): [PathSegment] fmt +# 55| getIdentifier(): [NameRef] fmt +# 55| getSegment(): [PathSegment] format +# 55| getIdentifier(): [NameRef] format +# 55| getPat(): [IdentPat] res +# 55| getName(): [Name] res +# 55| getTailExpr(): [PathExpr,VariableAccess] res +# 55| getPath(): [Path] res +# 55| getSegment(): [PathSegment] res +# 55| getIdentifier(): [NameRef] res +# 55| getFunction(): [PathExpr] ...::must_use +# 55| getPath(): [Path] ...::must_use +# 55| getQualifier(): [Path] ...::__export +# 55| getQualifier(): [Path] $crate +# 55| getSegment(): [PathSegment] $crate +# 55| getIdentifier(): [NameRef] $crate +# 55| getSegment(): [PathSegment] __export +# 55| getIdentifier(): [NameRef] __export +# 55| getSegment(): [PathSegment] must_use +# 55| getIdentifier(): [NameRef] must_use +# 52| getName(): [Name] test +# 61| getItem(11): [MacroCall] include!... +# 61| getPath(): [Path] include +# 61| getSegment(): [PathSegment] include +# 61| getIdentifier(): [NameRef] include +# 61| getTokenTree(): [TokenTree] TokenTree +# 61| getMacroCallExpansion(): [MacroItems] MacroItems +# 61| getItem(0): [Function] fn included +# 61| getParamList(): [ParamList] ParamList +# 61| getBody(): [BlockExpr] { ... } +# 61| getStmtList(): [StmtList] StmtList +# 61| getStatement(0): [ExprStmt] ExprStmt +# 61| getExpr(): [AssignmentExpr] ... = ... +# 61| getLhs(): [UnderscoreExpr] _ +# 61| getRhs(): [MacroExpr] MacroExpr +# 61| getMacroCall(): [MacroCall] concat!... +# 61| getPath(): [Path] concat +# 61| getSegment(): [PathSegment] concat +# 61| getIdentifier(): [NameRef] concat +# 61| getTokenTree(): [TokenTree] TokenTree +# 61| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" +# 61| getName(): [Name] included +# 63| getItem(12): [Function] fn documented +# 64| getParamList(): [ParamList] ParamList +# 63| getAttr(0): [Attr] Attr +# 63| getMeta(): [Meta] Meta +# 63| getExpr(): [MacroExpr] MacroExpr +# 63| getMacroCall(): [MacroCall] include_str!... +# 63| getPath(): [Path] include_str +# 63| getSegment(): [PathSegment] include_str +# 63| getIdentifier(): [NameRef] include_str +# 63| getTokenTree(): [TokenTree] TokenTree +# 63| getMacroCallExpansion(): [StringLiteralExpr] "" +# 63| getPath(): [Path] doc +# 63| getSegment(): [PathSegment] doc +# 63| getIdentifier(): [NameRef] doc +# 64| getBody(): [BlockExpr] { ... } +# 64| getStmtList(): [StmtList] StmtList +# 64| getName(): [Name] documented +# 66| getItem(13): [MacroRules] MacroRules +# 66| getName(): [Name] my_int +# 66| getTokenTree(): [TokenTree] TokenTree +# 70| getItem(14): [Function] fn answer +# 70| getParamList(): [ParamList] ParamList +# 70| getBody(): [BlockExpr] { ... } +# 70| getStmtList(): [StmtList] StmtList +# 71| getStatement(0): [LetStmt] let ... = 42 +# 71| getInitializer(): [IntegerLiteralExpr] 42 +# 71| getPat(): [IdentPat] a +# 71| getName(): [Name] a +# 71| getTypeRepr(): [MacroTypeRepr] MacroTypeRepr +# 71| getMacroCall(): [MacroCall] my_int!... +# 71| getPath(): [Path] my_int +# 71| getSegment(): [PathSegment] my_int +# 71| getIdentifier(): [NameRef] my_int +# 71| getTokenTree(): [TokenTree] TokenTree +# 71| getMacroCallExpansion(): [PathTypeRepr] i32 +# 71| getPath(): [Path] i32 +# 71| getSegment(): [PathSegment] i32 +# 71| getIdentifier(): [NameRef] i32 +# 72| getTailExpr(): [CastExpr] a as ... +# 72| getExpr(): [PathExpr,VariableAccess] a +# 72| getPath(): [Path] a +# 72| getSegment(): [PathSegment] a +# 72| getIdentifier(): [NameRef] a +# 72| getTypeRepr(): [MacroTypeRepr] MacroTypeRepr +# 72| getMacroCall(): [MacroCall] my_int!... +# 72| getPath(): [Path] my_int +# 72| getSegment(): [PathSegment] my_int +# 72| getIdentifier(): [NameRef] my_int +# 72| getTokenTree(): [TokenTree] TokenTree +# 72| getMacroCallExpansion(): [PathTypeRepr] i32 +# 72| getPath(): [Path] i32 +# 72| getSegment(): [PathSegment] i32 +# 72| getIdentifier(): [NameRef] i32 +# 70| getName(): [Name] answer +# 70| getRetType(): [RetTypeRepr] RetTypeRepr +# 70| getTypeRepr(): [MacroTypeRepr] MacroTypeRepr +# 70| getMacroCall(): [MacroCall] my_int!... +# 70| getPath(): [Path] my_int +# 70| getSegment(): [PathSegment] my_int +# 70| getIdentifier(): [NameRef] my_int +# 70| getTokenTree(): [TokenTree] TokenTree +# 70| getMacroCallExpansion(): [PathTypeRepr] i32 +# 70| getPath(): [Path] i32 +# 70| getSegment(): [PathSegment] i32 +# 70| getIdentifier(): [NameRef] i32 +# 76| getItem(15): [TypeAlias] type MyInt +# 76| getName(): [Name] MyInt +# 76| getTypeRepr(): [MacroTypeRepr] MacroTypeRepr +# 76| getMacroCall(): [MacroCall] my_int!... +# 76| getPath(): [Path] my_int +# 76| getSegment(): [PathSegment] my_int +# 76| getIdentifier(): [NameRef] my_int +# 76| getTokenTree(): [TokenTree] TokenTree +# 76| getMacroCallExpansion(): [PathTypeRepr] i32 +# 76| getPath(): [Path] i32 +# 76| getSegment(): [PathSegment] i32 +# 76| getIdentifier(): [NameRef] i32 +# 78| getItem(16): [Struct] struct MyStruct +# 78| getFieldList(): [StructFieldList] StructFieldList +# 79| getField(0): [StructField] StructField +# 79| getName(): [Name] field +# 79| getTypeRepr(): [MacroTypeRepr] MacroTypeRepr +# 79| getMacroCall(): [MacroCall] my_int!... +# 79| getPath(): [Path] my_int +# 79| getSegment(): [PathSegment] my_int +# 79| getIdentifier(): [NameRef] my_int +# 79| getTokenTree(): [TokenTree] TokenTree +# 79| getMacroCallExpansion(): [PathTypeRepr] i32 +# 79| getPath(): [Path] i32 +# 79| getSegment(): [PathSegment] i32 +# 79| getIdentifier(): [NameRef] i32 +# 78| getName(): [Name] MyStruct +# 44| [Comment] //... +# 56| [Comment] //... +# 63| [Comment] //... +# 70| [Comment] //... +# 71| [Comment] //... +# 72| [Comment] //... +# 76| [Comment] //... +# 79| [Comment] //... +proc_macro.rs: +# 1| [SourceFile] SourceFile +# 1| getItem(0): [Use] use ...::TokenStream +# 1| getUseTree(): [UseTree] ...::TokenStream +# 1| getPath(): [Path] ...::TokenStream +# 1| getQualifier(): [Path] proc_macro +# 1| getSegment(): [PathSegment] proc_macro +# 1| getIdentifier(): [NameRef] proc_macro +# 1| getSegment(): [PathSegment] TokenStream +# 1| getIdentifier(): [NameRef] TokenStream +# 2| getItem(1): [Use] use ...::quote +# 2| getUseTree(): [UseTree] ...::quote +# 2| getPath(): [Path] ...::quote +# 2| getQualifier(): [Path] quote +# 2| getSegment(): [PathSegment] quote +# 2| getIdentifier(): [NameRef] quote +# 2| getSegment(): [PathSegment] quote +# 2| getIdentifier(): [NameRef] quote +# 4| getItem(2): [Function] fn repeat +# 5| getParamList(): [ParamList] ParamList +# 5| getParam(0): [Param] ...: TokenStream +# 5| getTypeRepr(): [PathTypeRepr] TokenStream +# 5| getPath(): [Path] TokenStream +# 5| getSegment(): [PathSegment] TokenStream +# 5| getIdentifier(): [NameRef] TokenStream +# 5| getPat(): [IdentPat] attr +# 5| getName(): [Name] attr +# 5| getParam(1): [Param] ...: TokenStream +# 5| getTypeRepr(): [PathTypeRepr] TokenStream +# 5| getPath(): [Path] TokenStream +# 5| getSegment(): [PathSegment] TokenStream +# 5| getIdentifier(): [NameRef] TokenStream +# 5| getPat(): [IdentPat] item +# 5| getName(): [Name] item +# 4| getAttr(0): [Attr] Attr +# 4| getMeta(): [Meta] Meta +# 4| getPath(): [Path] proc_macro_attribute +# 4| getSegment(): [PathSegment] proc_macro_attribute +# 4| getIdentifier(): [NameRef] proc_macro_attribute +# 5| getBody(): [BlockExpr] { ... } +# 5| getStmtList(): [StmtList] StmtList +# 6| getStatement(0): [LetStmt] let ... = ... +# 6| getInitializer(): [MethodCallExpr] ... .unwrap() +# 6| getArgList(): [ArgList] ArgList +# 6| getIdentifier(): [NameRef] unwrap +# 6| getReceiver(): [MethodCallExpr] ... .base10_parse() +# 6| getArgList(): [ArgList] ArgList +# 6| getGenericArgList(): [GenericArgList] <...> +# 6| getGenericArg(0): [TypeArg] TypeArg +# 6| getTypeRepr(): [PathTypeRepr] usize +# 6| getPath(): [Path] usize +# 6| getSegment(): [PathSegment] usize +# 6| getIdentifier(): [NameRef] usize +# 6| getIdentifier(): [NameRef] base10_parse +# 6| getReceiver(): [MacroExpr] MacroExpr +# 6| getMacroCall(): [MacroCall] ...::parse_macro_input!... +# 6| getPath(): [Path] ...::parse_macro_input +# 6| getQualifier(): [Path] syn +# 6| getSegment(): [PathSegment] syn +# 6| getIdentifier(): [NameRef] syn +# 6| getSegment(): [PathSegment] parse_macro_input +# 6| getIdentifier(): [NameRef] parse_macro_input +# 6| getTokenTree(): [TokenTree] TokenTree +# 6| getMacroCallExpansion(): [MatchExpr] match ... { ... } +# 6| getScrutinee(): [CallExpr] ...::parse::<...>(...) +# 6| getArgList(): [ArgList] ArgList +# 6| getArg(0): [PathExpr,VariableAccess] attr +# 6| getPath(): [Path] attr +# 6| getSegment(): [PathSegment] attr +# 6| getIdentifier(): [NameRef] attr +# 6| getFunction(): [PathExpr] ...::parse::<...> +# 6| getPath(): [Path] ...::parse::<...> +# 6| getQualifier(): [Path] $crate +# 6| getSegment(): [PathSegment] $crate +# 6| getIdentifier(): [NameRef] $crate +# 6| getSegment(): [PathSegment] parse::<...> +# 6| getGenericArgList(): [GenericArgList] <...> +# 6| getGenericArg(0): [TypeArg] TypeArg +# 6| getTypeRepr(): [PathTypeRepr] ...::LitInt +# 6| getPath(): [Path] ...::LitInt +# 6| getQualifier(): [Path] syn +# 6| getSegment(): [PathSegment] syn +# 6| getIdentifier(): [NameRef] syn +# 6| getSegment(): [PathSegment] LitInt +# 6| getIdentifier(): [NameRef] LitInt +# 6| getIdentifier(): [NameRef] parse +# 6| getMatchArmList(): [MatchArmList] MatchArmList +# 6| getArm(0): [MatchArm] ... => data +# 6| getExpr(): [PathExpr,VariableAccess] data +# 6| getPath(): [Path] data +# 6| getSegment(): [PathSegment] data +# 6| getIdentifier(): [NameRef] data +# 6| getPat(): [TupleStructPat] ...::Ok(...) +# 6| getPath(): [Path] ...::Ok +# 6| getQualifier(): [Path] ...::__private +# 6| getQualifier(): [Path] $crate +# 6| getSegment(): [PathSegment] $crate +# 6| getIdentifier(): [NameRef] $crate +# 6| getSegment(): [PathSegment] __private +# 6| getIdentifier(): [NameRef] __private +# 6| getSegment(): [PathSegment] Ok +# 6| getIdentifier(): [NameRef] Ok +# 6| getField(0): [IdentPat] data +# 6| getName(): [Name] data +# 6| getArm(1): [MatchArm] ... => ... +# 6| getExpr(): [BlockExpr] { ... } +# 6| getStmtList(): [StmtList] StmtList +# 6| getStatement(0): [ExprStmt] ExprStmt +# 6| getExpr(): [ReturnExpr] return ... +# 6| getExpr(): [CallExpr] ...::from(...) +# 6| getArgList(): [ArgList] ArgList +# 6| getArg(0): [MethodCallExpr] err.to_compile_error() +# 6| getArgList(): [ArgList] ArgList +# 6| getIdentifier(): [NameRef] to_compile_error +# 6| getReceiver(): [PathExpr,VariableAccess] err +# 6| getPath(): [Path] err +# 6| getSegment(): [PathSegment] err +# 6| getIdentifier(): [NameRef] err +# 6| getFunction(): [PathExpr] ...::from +# 6| getPath(): [Path] ...::from +# 6| getQualifier(): [Path] ...::TokenStream +# 6| getQualifier(): [Path] ...::__private +# 6| getQualifier(): [Path] $crate +# 6| getSegment(): [PathSegment] $crate +# 6| getIdentifier(): [NameRef] $crate +# 6| getSegment(): [PathSegment] __private +# 6| getIdentifier(): [NameRef] __private +# 6| getSegment(): [PathSegment] TokenStream +# 6| getIdentifier(): [NameRef] TokenStream +# 6| getSegment(): [PathSegment] from +# 6| getIdentifier(): [NameRef] from +# 6| getPat(): [TupleStructPat] ...::Err(...) +# 6| getPath(): [Path] ...::Err +# 6| getQualifier(): [Path] ...::__private +# 6| getQualifier(): [Path] $crate +# 6| getSegment(): [PathSegment] $crate +# 6| getIdentifier(): [NameRef] $crate +# 6| getSegment(): [PathSegment] __private +# 6| getIdentifier(): [NameRef] __private +# 6| getSegment(): [PathSegment] Err +# 6| getIdentifier(): [NameRef] Err +# 6| getField(0): [IdentPat] err +# 6| getName(): [Name] err +# 6| getPat(): [IdentPat] number +# 6| getName(): [Name] number +# 7| getStatement(1): [LetStmt] let ... = ... +# 7| getInitializer(): [MacroExpr] MacroExpr +# 7| getMacroCall(): [MacroCall] ...::parse_macro_input!... +# 7| getPath(): [Path] ...::parse_macro_input +# 7| getQualifier(): [Path] syn +# 7| getSegment(): [PathSegment] syn +# 7| getIdentifier(): [NameRef] syn +# 7| getSegment(): [PathSegment] parse_macro_input +# 7| getIdentifier(): [NameRef] parse_macro_input +# 7| getTokenTree(): [TokenTree] TokenTree +# 7| getMacroCallExpansion(): [MatchExpr] match ... { ... } +# 7| getScrutinee(): [CallExpr] ...::parse::<...>(...) +# 7| getArgList(): [ArgList] ArgList +# 7| getArg(0): [PathExpr,VariableAccess] item +# 7| getPath(): [Path] item +# 7| getSegment(): [PathSegment] item +# 7| getIdentifier(): [NameRef] item +# 7| getFunction(): [PathExpr] ...::parse::<...> +# 7| getPath(): [Path] ...::parse::<...> +# 7| getQualifier(): [Path] $crate +# 7| getSegment(): [PathSegment] $crate +# 7| getIdentifier(): [NameRef] $crate +# 7| getSegment(): [PathSegment] parse::<...> +# 7| getGenericArgList(): [GenericArgList] <...> +# 7| getGenericArg(0): [TypeArg] TypeArg +# 7| getTypeRepr(): [PathTypeRepr] ...::ItemFn +# 7| getPath(): [Path] ...::ItemFn +# 7| getQualifier(): [Path] syn +# 7| getSegment(): [PathSegment] syn +# 7| getIdentifier(): [NameRef] syn +# 7| getSegment(): [PathSegment] ItemFn +# 7| getIdentifier(): [NameRef] ItemFn +# 7| getIdentifier(): [NameRef] parse +# 7| getMatchArmList(): [MatchArmList] MatchArmList +# 7| getArm(0): [MatchArm] ... => data +# 7| getExpr(): [PathExpr,VariableAccess] data +# 7| getPath(): [Path] data +# 7| getSegment(): [PathSegment] data +# 7| getIdentifier(): [NameRef] data +# 7| getPat(): [TupleStructPat] ...::Ok(...) +# 7| getPath(): [Path] ...::Ok +# 7| getQualifier(): [Path] ...::__private +# 7| getQualifier(): [Path] $crate +# 7| getSegment(): [PathSegment] $crate +# 7| getIdentifier(): [NameRef] $crate +# 7| getSegment(): [PathSegment] __private +# 7| getIdentifier(): [NameRef] __private +# 7| getSegment(): [PathSegment] Ok +# 7| getIdentifier(): [NameRef] Ok +# 7| getField(0): [IdentPat] data +# 7| getName(): [Name] data +# 7| getArm(1): [MatchArm] ... => ... +# 7| getExpr(): [BlockExpr] { ... } +# 7| getStmtList(): [StmtList] StmtList +# 7| getStatement(0): [ExprStmt] ExprStmt +# 7| getExpr(): [ReturnExpr] return ... +# 7| getExpr(): [CallExpr] ...::from(...) +# 7| getArgList(): [ArgList] ArgList +# 7| getArg(0): [MethodCallExpr] err.to_compile_error() +# 7| getArgList(): [ArgList] ArgList +# 7| getIdentifier(): [NameRef] to_compile_error +# 7| getReceiver(): [PathExpr,VariableAccess] err +# 7| getPath(): [Path] err +# 7| getSegment(): [PathSegment] err +# 7| getIdentifier(): [NameRef] err +# 7| getFunction(): [PathExpr] ...::from +# 7| getPath(): [Path] ...::from +# 7| getQualifier(): [Path] ...::TokenStream +# 7| getQualifier(): [Path] ...::__private +# 7| getQualifier(): [Path] $crate +# 7| getSegment(): [PathSegment] $crate +# 7| getIdentifier(): [NameRef] $crate +# 7| getSegment(): [PathSegment] __private +# 7| getIdentifier(): [NameRef] __private +# 7| getSegment(): [PathSegment] TokenStream +# 7| getIdentifier(): [NameRef] TokenStream +# 7| getSegment(): [PathSegment] from +# 7| getIdentifier(): [NameRef] from +# 7| getPat(): [TupleStructPat] ...::Err(...) +# 7| getPath(): [Path] ...::Err +# 7| getQualifier(): [Path] ...::__private +# 7| getQualifier(): [Path] $crate +# 7| getSegment(): [PathSegment] $crate +# 7| getIdentifier(): [NameRef] $crate +# 7| getSegment(): [PathSegment] __private +# 7| getIdentifier(): [NameRef] __private +# 7| getSegment(): [PathSegment] Err +# 7| getIdentifier(): [NameRef] Err +# 7| getField(0): [IdentPat] err +# 7| getName(): [Name] err +# 7| getPat(): [IdentPat] ast +# 7| getName(): [Name] ast +# 8| getStatement(2): [LetStmt] let ... = ... +# 8| getInitializer(): [MethodCallExpr] ... .collect() +# 14| getArgList(): [ArgList] ArgList +# 14| getGenericArgList(): [GenericArgList] <...> +# 14| getGenericArg(0): [TypeArg] TypeArg +# 14| getTypeRepr(): [PathTypeRepr] Vec::<...> +# 14| getPath(): [Path] Vec::<...> +# 14| getSegment(): [PathSegment] Vec::<...> +# 14| getGenericArgList(): [GenericArgList] <...> +# 14| getGenericArg(0): [TypeArg] TypeArg +# 14| getTypeRepr(): [InferTypeRepr] _ +# 14| getIdentifier(): [NameRef] Vec +# 14| getIdentifier(): [NameRef] collect +# 8| getReceiver(): [MethodCallExpr] ... .map(...) +# 9| getArgList(): [ArgList] ArgList +# 9| getArg(0): [ClosureExpr] |...| ... +# 9| getParamList(): [ParamList] ParamList +# 9| getParam(0): [Param] ... +# 9| getPat(): [IdentPat] i +# 9| getName(): [Name] i +# 9| getBody(): [BlockExpr] { ... } +# 9| getStmtList(): [StmtList] StmtList +# 10| getStatement(0): [LetStmt] let ... = ... +# 10| getInitializer(): [MethodCallExpr] ast.clone() +# 10| getArgList(): [ArgList] ArgList +# 10| getIdentifier(): [NameRef] clone +# 10| getReceiver(): [PathExpr,VariableAccess] ast +# 10| getPath(): [Path] ast +# 10| getSegment(): [PathSegment] ast +# 10| getIdentifier(): [NameRef] ast +# 10| getPat(): [IdentPat] mut new_ast +# 10| getName(): [Name] new_ast +# 11| getStatement(1): [ExprStmt] ExprStmt +# 11| getExpr(): [AssignmentExpr] ... = ... +# 11| getLhs(): [FieldExpr] ... .ident +# 11| getContainer(): [FieldExpr] new_ast.sig +# 11| getContainer(): [PathExpr,VariableAccess] new_ast +# 11| getPath(): [Path] new_ast +# 11| getSegment(): [PathSegment] new_ast +# 11| getIdentifier(): [NameRef] new_ast +# 11| getIdentifier(): [NameRef] sig +# 11| getIdentifier(): [NameRef] ident +# 11| getRhs(): [CallExpr] ...::new(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getArg(0): [RefExpr] &... +# 11| getExpr(): [MacroExpr] MacroExpr +# 11| getMacroCall(): [MacroCall] format!... +# 11| getPath(): [Path] format +# 11| getSegment(): [PathSegment] format +# 11| getIdentifier(): [NameRef] format +# 11| getTokenTree(): [TokenTree] TokenTree +# 11| getMacroCallExpansion(): [CallExpr] ...::must_use(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getArg(0): [BlockExpr] { ... } +# 11| getStmtList(): [StmtList] StmtList +# 11| getStatement(0): [LetStmt] let ... = ... +# 11| getInitializer(): [CallExpr] ...::format(...) +# 11| getArgList(): [ArgList] ArgList +# 11| getArg(0): [MacroExpr] MacroExpr +# 11| getMacroCall(): [MacroCall] ...::format_args!... +# 11| getPath(): [Path] ...::format_args +# 11| getQualifier(): [Path] ...::__export +# 11| getQualifier(): [Path] $crate +# 11| getSegment(): [PathSegment] $crate +# 11| getIdentifier(): [NameRef] $crate +# 11| getSegment(): [PathSegment] __export +# 11| getIdentifier(): [NameRef] __export +# 11| getSegment(): [PathSegment] format_args +# 11| getIdentifier(): [NameRef] format_args +# 11| getTokenTree(): [TokenTree] TokenTree +# 11| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr +# 11| getArg(0): [FormatArgsArg] FormatArgsArg +# 11| getExpr(): [FieldExpr] ... .ident +# 11| getContainer(): [FieldExpr] ast.sig +# 11| getContainer(): [PathExpr,VariableAccess] ast +# 11| getPath(): [Path] ast +# 11| getSegment(): [PathSegment] ast +# 11| getIdentifier(): [NameRef] ast +# 11| getIdentifier(): [NameRef] sig +# 11| getIdentifier(): [NameRef] ident +# 11| getArg(1): [FormatArgsArg] FormatArgsArg +# 11| getExpr(): [PathExpr,VariableAccess] i +# 11| getPath(): [Path] i +# 11| getSegment(): [PathSegment] i +# 11| getIdentifier(): [NameRef] i +# 11| getTemplate(): [StringLiteralExpr] "{}_{}" +# 11| getFormat(0): [Format] {} +# 11| getFormat(1): [Format] {} +# 11| getFunction(): [PathExpr] ...::format +# 11| getPath(): [Path] ...::format +# 11| getQualifier(): [Path] ...::fmt +# 11| getQualifier(): [Path] $crate +# 11| getSegment(): [PathSegment] $crate +# 11| getIdentifier(): [NameRef] $crate +# 11| getSegment(): [PathSegment] fmt +# 11| getIdentifier(): [NameRef] fmt +# 11| getSegment(): [PathSegment] format +# 11| getIdentifier(): [NameRef] format +# 11| getPat(): [IdentPat] res +# 11| getName(): [Name] res +# 11| getTailExpr(): [PathExpr,VariableAccess] res +# 11| getPath(): [Path] res +# 11| getSegment(): [PathSegment] res +# 11| getIdentifier(): [NameRef] res +# 11| getFunction(): [PathExpr] ...::must_use +# 11| getPath(): [Path] ...::must_use +# 11| getQualifier(): [Path] ...::__export +# 11| getQualifier(): [Path] $crate +# 11| getSegment(): [PathSegment] $crate +# 11| getIdentifier(): [NameRef] $crate +# 11| getSegment(): [PathSegment] __export +# 11| getIdentifier(): [NameRef] __export +# 11| getSegment(): [PathSegment] must_use +# 11| getIdentifier(): [NameRef] must_use +# 11| getArg(1): [MethodCallExpr] ... .span() +# 11| getArgList(): [ArgList] ArgList +# 11| getIdentifier(): [NameRef] span +# 11| getReceiver(): [FieldExpr] ... .ident +# 11| getContainer(): [FieldExpr] ast.sig +# 11| getContainer(): [PathExpr,VariableAccess] ast +# 11| getPath(): [Path] ast +# 11| getSegment(): [PathSegment] ast +# 11| getIdentifier(): [NameRef] ast +# 11| getIdentifier(): [NameRef] sig +# 11| getIdentifier(): [NameRef] ident +# 11| getFunction(): [PathExpr] ...::new +# 11| getPath(): [Path] ...::new +# 11| getQualifier(): [Path] ...::Ident +# 11| getQualifier(): [Path] syn +# 11| getSegment(): [PathSegment] syn +# 11| getIdentifier(): [NameRef] syn +# 11| getSegment(): [PathSegment] Ident +# 11| getIdentifier(): [NameRef] Ident +# 11| getSegment(): [PathSegment] new +# 11| getIdentifier(): [NameRef] new +# 12| getTailExpr(): [PathExpr,VariableAccess] new_ast +# 12| getPath(): [Path] new_ast +# 12| getSegment(): [PathSegment] new_ast +# 12| getIdentifier(): [NameRef] new_ast +# 9| getIdentifier(): [NameRef] map +# 8| getReceiver(): [ParenExpr] (...) +# 8| getExpr(): [RangeExpr] 0..number +# 8| getEnd(): [PathExpr,VariableAccess] number +# 8| getPath(): [Path] number +# 8| getSegment(): [PathSegment] number +# 8| getIdentifier(): [NameRef] number +# 8| getStart(): [IntegerLiteralExpr] 0 +# 8| getPat(): [IdentPat] items +# 8| getName(): [Name] items +# 15| getTailExpr(): [MethodCallExpr] ... .into() +# 17| getArgList(): [ArgList] ArgList +# 17| getIdentifier(): [NameRef] into +# 15| getReceiver(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] quote!... +# 15| getPath(): [Path] quote +# 15| getSegment(): [PathSegment] quote +# 15| getIdentifier(): [NameRef] quote +# 15| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 15| getStatement(0): [LetStmt] let ... = ... +# 15| getInitializer(): [CallExpr] ...::new(...) +# 15| getArgList(): [ArgList] ArgList +# 15| getFunction(): [PathExpr] ...::new +# 15| getPath(): [Path] ...::new +# 15| getQualifier(): [Path] ...::TokenStream +# 15| getQualifier(): [Path] ...::__private +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] __private +# 15| getIdentifier(): [NameRef] __private +# 15| getSegment(): [PathSegment] TokenStream +# 15| getIdentifier(): [NameRef] TokenStream +# 15| getSegment(): [PathSegment] new +# 15| getIdentifier(): [NameRef] new +# 15| getPat(): [IdentPat] mut _s +# 15| getName(): [Name] _s +# 16| getStatement(1): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_each_token!... +# 15| getPath(): [Path] ...::quote_each_token +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_each_token +# 15| getIdentifier(): [NameRef] quote_each_token +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_tokens_with_context!... +# 15| getPath(): [Path] ...::quote_tokens_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_tokens_with_context +# 15| getIdentifier(): [NameRef] quote_tokens_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(1): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(2): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(3): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 15| getStatement(0): [Use] use ...::ext::* +# 15| getUseTree(): [UseTree] ...::ext::* +# 15| getPath(): [Path] ...::ext +# 15| getQualifier(): [Path] ...::__private +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] __private +# 15| getIdentifier(): [NameRef] __private +# 15| getSegment(): [PathSegment] ext +# 15| getIdentifier(): [NameRef] ext +# 15| getStatement(1): [LetStmt] let ... = ...::ThereIsNoIteratorInRepetition +# 15| getInitializer(): [PathExpr] ...::ThereIsNoIteratorInRepetition +# 15| getPath(): [Path] ...::ThereIsNoIteratorInRepetition +# 15| getQualifier(): [Path] ...::__private +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] __private +# 15| getIdentifier(): [NameRef] __private +# 15| getSegment(): [PathSegment] ThereIsNoIteratorInRepetition +# 15| getIdentifier(): [NameRef] ThereIsNoIteratorInRepetition +# 15| getPat(): [IdentPat] has_iter +# 15| getName(): [Name] has_iter +# 16| getStatement(2): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_names!... +# 15| getPath(): [Path] ...::pounded_var_names +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names +# 15| getIdentifier(): [NameRef] pounded_var_names +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_names_with_context!... +# 15| getPath(): [Path] ...::pounded_var_names_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names_with_context +# 15| getIdentifier(): [NameRef] pounded_var_names_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getStatement(0): [ExprStmt] ExprStmt +# 15| getExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_names!... +# 15| getPath(): [Path] ...::pounded_var_names +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names +# 15| getIdentifier(): [NameRef] pounded_var_names +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_names_with_context!... +# 15| getPath(): [Path] ...::pounded_var_names_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names_with_context +# 15| getIdentifier(): [NameRef] pounded_var_names_with_context +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(1): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(2): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_bind_into_iter!... +# 15| getPath(): [Path] ...::quote_bind_into_iter +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_bind_into_iter +# 15| getIdentifier(): [NameRef] quote_bind_into_iter +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [LetStmt] let ... = ... +# 15| getAttr(0): [Attr] Attr +# 15| getMeta(): [Meta] Meta +# 15| getPath(): [Path] allow +# 15| getSegment(): [PathSegment] allow +# 15| getIdentifier(): [NameRef] allow +# 15| getTokenTree(): [TokenTree] TokenTree +# 16| getInitializer(): [MethodCallExpr] items.quote_into_iter() +# 15| getArgList(): [ArgList] ArgList +# 15| getIdentifier(): [NameRef] quote_into_iter +# 16| getReceiver(): [PathExpr,VariableAccess] items +# 16| getPath(): [Path] items +# 16| getSegment(): [PathSegment] items +# 16| getIdentifier(): [NameRef] items +# 16| getPat(): [TuplePat] TuplePat +# 16| getField(0): [IdentPat] mut items +# 16| getName(): [Name] items +# 15| getField(1): [IdentPat] i +# 15| getName(): [Name] i +# 15| getStatement(1): [LetStmt] let ... = ... +# 15| getInitializer(): [BinaryExpr] ... | ... +# 15| getLhs(): [PathExpr,VariableAccess] has_iter +# 15| getPath(): [Path] has_iter +# 15| getSegment(): [PathSegment] has_iter +# 15| getIdentifier(): [NameRef] has_iter +# 15| getRhs(): [PathExpr,VariableAccess] i +# 15| getPath(): [Path] i +# 15| getSegment(): [PathSegment] i +# 15| getIdentifier(): [NameRef] i +# 15| getPat(): [IdentPat] has_iter +# 15| getName(): [Name] has_iter +# 15| getStatement(3): [LetStmt] let _ = has_iter +# 15| getInitializer(): [PathExpr,VariableAccess] has_iter +# 15| getPath(): [Path] has_iter +# 15| getSegment(): [PathSegment] has_iter +# 15| getIdentifier(): [NameRef] has_iter +# 15| getPat(): [WildcardPat] _ +# 15| getTypeRepr(): [PathTypeRepr] ...::HasIterator +# 15| getPath(): [Path] ...::HasIterator +# 15| getQualifier(): [Path] ...::__private +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] __private +# 15| getIdentifier(): [NameRef] __private +# 15| getSegment(): [PathSegment] HasIterator +# 15| getIdentifier(): [NameRef] HasIterator +# 16| getTailExpr(): [WhileExpr] while true { ... } +# 16| getLoopBody(): [BlockExpr] { ... } +# 16| getStmtList(): [StmtList] StmtList +# 16| getStatement(0): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_names!... +# 15| getPath(): [Path] ...::pounded_var_names +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names +# 15| getIdentifier(): [NameRef] pounded_var_names +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_names_with_context!... +# 15| getPath(): [Path] ...::pounded_var_names_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names_with_context +# 15| getIdentifier(): [NameRef] pounded_var_names_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getStatement(0): [ExprStmt] ExprStmt +# 15| getExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_names!... +# 15| getPath(): [Path] ...::pounded_var_names +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names +# 15| getIdentifier(): [NameRef] pounded_var_names +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_names_with_context!... +# 15| getPath(): [Path] ...::pounded_var_names_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_names_with_context +# 15| getIdentifier(): [NameRef] pounded_var_names_with_context +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [MacroExpr] MacroExpr +# 15| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 15| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(1): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(2): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::pounded_var_with_context!... +# 15| getPath(): [Path] ...::pounded_var_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] pounded_var_with_context +# 15| getIdentifier(): [NameRef] pounded_var_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_bind_next_or_break!... +# 15| getPath(): [Path] ...::quote_bind_next_or_break +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_bind_next_or_break +# 15| getIdentifier(): [NameRef] quote_bind_next_or_break +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [LetStmt] let ... = ... +# 16| getInitializer(): [MatchExpr] match ... { ... } +# 16| getScrutinee(): [MethodCallExpr] items.next() +# 15| getArgList(): [ArgList] ArgList +# 15| getIdentifier(): [NameRef] next +# 16| getReceiver(): [PathExpr,VariableAccess] items +# 16| getPath(): [Path] items +# 16| getSegment(): [PathSegment] items +# 16| getIdentifier(): [NameRef] items +# 15| getMatchArmList(): [MatchArmList] MatchArmList +# 15| getArm(0): [MatchArm] ... => ... +# 15| getExpr(): [CallExpr] ...::RepInterp(...) +# 15| getArgList(): [ArgList] ArgList +# 15| getArg(0): [PathExpr] _x +# 15| getPath(): [Path] _x +# 15| getSegment(): [PathSegment] _x +# 15| getIdentifier(): [NameRef] _x +# 15| getFunction(): [PathExpr] ...::RepInterp +# 15| getPath(): [Path] ...::RepInterp +# 15| getQualifier(): [Path] ...::__private +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] __private +# 15| getIdentifier(): [NameRef] __private +# 15| getSegment(): [PathSegment] RepInterp +# 15| getIdentifier(): [NameRef] RepInterp +# 15| getPat(): [TupleStructPat] Some(...) +# 15| getPath(): [Path] Some +# 15| getSegment(): [PathSegment] Some +# 15| getIdentifier(): [NameRef] Some +# 15| getField(0): [IdentPat] _x +# 15| getName(): [Name] _x +# 15| getArm(1): [MatchArm] ... => ... +# 15| getExpr(): [BreakExpr] break +# 15| getPat(): [IdentPat] None +# 15| getName(): [Name] None +# 16| getPat(): [IdentPat] items +# 16| getName(): [Name] items +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_each_token!... +# 15| getPath(): [Path] ...::quote_each_token +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_each_token +# 15| getIdentifier(): [NameRef] quote_each_token +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_tokens_with_context!... +# 15| getPath(): [Path] ...::quote_tokens_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_tokens_with_context +# 15| getIdentifier(): [NameRef] quote_tokens_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getTailExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(1): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(2): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(3): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 16| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(0): [ExprStmt] ExprStmt +# 16| getExpr(): [CallExpr] ...::to_tokens(...) +# 16| getArgList(): [ArgList] ArgList +# 16| getArg(0): [RefExpr] &items +# 16| getExpr(): [PathExpr,VariableAccess] items +# 16| getPath(): [Path] items +# 16| getSegment(): [PathSegment] items +# 16| getIdentifier(): [NameRef] items +# 15| getArg(1): [RefExpr] &mut _s +# 15| getExpr(): [PathExpr] _s +# 15| getPath(): [Path] _s +# 15| getSegment(): [PathSegment] _s +# 15| getIdentifier(): [NameRef] _s +# 15| getFunction(): [PathExpr] ...::to_tokens +# 15| getPath(): [Path] ...::to_tokens +# 15| getQualifier(): [Path] ...::ToTokens +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] ToTokens +# 15| getIdentifier(): [NameRef] ToTokens +# 15| getSegment(): [PathSegment] to_tokens +# 15| getIdentifier(): [NameRef] to_tokens +# 16| getStatement(4): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(5): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(6): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getCondition(): [BooleanLiteralExpr] true +# 16| getStatement(4): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(5): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(6): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 16| getStatement(7): [ExprStmt] ExprStmt +# 16| getExpr(): [MacroExpr] MacroExpr +# 16| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 15| getPath(): [Path] ...::quote_token_with_context +# 15| getQualifier(): [Path] $crate +# 15| getSegment(): [PathSegment] $crate +# 15| getIdentifier(): [NameRef] $crate +# 15| getSegment(): [PathSegment] quote_token_with_context +# 15| getIdentifier(): [NameRef] quote_token_with_context +# 16| getTokenTree(): [TokenTree] TokenTree +# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 15| getTailExpr(): [PathExpr] _s +# 15| getPath(): [Path] _s +# 15| getSegment(): [PathSegment] _s +# 15| getIdentifier(): [NameRef] _s +# 5| getName(): [Name] repeat +# 5| getRetType(): [RetTypeRepr] RetTypeRepr +# 5| getTypeRepr(): [PathTypeRepr] TokenStream +# 5| getPath(): [Path] TokenStream +# 5| getSegment(): [PathSegment] TokenStream +# 5| getIdentifier(): [NameRef] TokenStream +# 5| getVisibility(): [Visibility] Visibility +# 20| getItem(3): [Function] fn add_one +# 21| getParamList(): [ParamList] ParamList +# 21| getParam(0): [Param] ...: TokenStream +# 21| getTypeRepr(): [PathTypeRepr] TokenStream +# 21| getPath(): [Path] TokenStream +# 21| getSegment(): [PathSegment] TokenStream +# 21| getIdentifier(): [NameRef] TokenStream +# 21| getPat(): [IdentPat] _attr +# 21| getName(): [Name] _attr +# 21| getParam(1): [Param] ...: TokenStream +# 21| getTypeRepr(): [PathTypeRepr] TokenStream +# 21| getPath(): [Path] TokenStream +# 21| getSegment(): [PathSegment] TokenStream +# 21| getIdentifier(): [NameRef] TokenStream +# 21| getPat(): [IdentPat] item +# 21| getName(): [Name] item +# 20| getAttr(0): [Attr] Attr +# 20| getMeta(): [Meta] Meta +# 20| getPath(): [Path] proc_macro_attribute +# 20| getSegment(): [PathSegment] proc_macro_attribute +# 20| getIdentifier(): [NameRef] proc_macro_attribute +# 21| getBody(): [BlockExpr] { ... } +# 21| getStmtList(): [StmtList] StmtList +# 22| getStatement(0): [LetStmt] let ... = ... +# 22| getInitializer(): [MacroExpr] MacroExpr +# 22| getMacroCall(): [MacroCall] ...::parse_macro_input!... +# 22| getPath(): [Path] ...::parse_macro_input +# 22| getQualifier(): [Path] syn +# 22| getSegment(): [PathSegment] syn +# 22| getIdentifier(): [NameRef] syn +# 22| getSegment(): [PathSegment] parse_macro_input +# 22| getIdentifier(): [NameRef] parse_macro_input +# 22| getTokenTree(): [TokenTree] TokenTree +# 22| getMacroCallExpansion(): [MatchExpr] match ... { ... } +# 22| getScrutinee(): [CallExpr] ...::parse::<...>(...) +# 22| getArgList(): [ArgList] ArgList +# 22| getArg(0): [PathExpr,VariableAccess] item +# 22| getPath(): [Path] item +# 22| getSegment(): [PathSegment] item +# 22| getIdentifier(): [NameRef] item +# 22| getFunction(): [PathExpr] ...::parse::<...> +# 22| getPath(): [Path] ...::parse::<...> +# 22| getQualifier(): [Path] $crate +# 22| getSegment(): [PathSegment] $crate +# 22| getIdentifier(): [NameRef] $crate +# 22| getSegment(): [PathSegment] parse::<...> +# 22| getGenericArgList(): [GenericArgList] <...> +# 22| getGenericArg(0): [TypeArg] TypeArg +# 22| getTypeRepr(): [PathTypeRepr] ...::ItemFn +# 22| getPath(): [Path] ...::ItemFn +# 22| getQualifier(): [Path] syn +# 22| getSegment(): [PathSegment] syn +# 22| getIdentifier(): [NameRef] syn +# 22| getSegment(): [PathSegment] ItemFn +# 22| getIdentifier(): [NameRef] ItemFn +# 22| getIdentifier(): [NameRef] parse +# 22| getMatchArmList(): [MatchArmList] MatchArmList +# 22| getArm(0): [MatchArm] ... => data +# 22| getExpr(): [PathExpr,VariableAccess] data +# 22| getPath(): [Path] data +# 22| getSegment(): [PathSegment] data +# 22| getIdentifier(): [NameRef] data +# 22| getPat(): [TupleStructPat] ...::Ok(...) +# 22| getPath(): [Path] ...::Ok +# 22| getQualifier(): [Path] ...::__private +# 22| getQualifier(): [Path] $crate +# 22| getSegment(): [PathSegment] $crate +# 22| getIdentifier(): [NameRef] $crate +# 22| getSegment(): [PathSegment] __private +# 22| getIdentifier(): [NameRef] __private +# 22| getSegment(): [PathSegment] Ok +# 22| getIdentifier(): [NameRef] Ok +# 22| getField(0): [IdentPat] data +# 22| getName(): [Name] data +# 22| getArm(1): [MatchArm] ... => ... +# 22| getExpr(): [BlockExpr] { ... } +# 22| getStmtList(): [StmtList] StmtList +# 22| getStatement(0): [ExprStmt] ExprStmt +# 22| getExpr(): [ReturnExpr] return ... +# 22| getExpr(): [CallExpr] ...::from(...) +# 22| getArgList(): [ArgList] ArgList +# 22| getArg(0): [MethodCallExpr] err.to_compile_error() +# 22| getArgList(): [ArgList] ArgList +# 22| getIdentifier(): [NameRef] to_compile_error +# 22| getReceiver(): [PathExpr,VariableAccess] err +# 22| getPath(): [Path] err +# 22| getSegment(): [PathSegment] err +# 22| getIdentifier(): [NameRef] err +# 22| getFunction(): [PathExpr] ...::from +# 22| getPath(): [Path] ...::from +# 22| getQualifier(): [Path] ...::TokenStream +# 22| getQualifier(): [Path] ...::__private +# 22| getQualifier(): [Path] $crate +# 22| getSegment(): [PathSegment] $crate +# 22| getIdentifier(): [NameRef] $crate +# 22| getSegment(): [PathSegment] __private +# 22| getIdentifier(): [NameRef] __private +# 22| getSegment(): [PathSegment] TokenStream +# 22| getIdentifier(): [NameRef] TokenStream +# 22| getSegment(): [PathSegment] from +# 22| getIdentifier(): [NameRef] from +# 22| getPat(): [TupleStructPat] ...::Err(...) +# 22| getPath(): [Path] ...::Err +# 22| getQualifier(): [Path] ...::__private +# 22| getQualifier(): [Path] $crate +# 22| getSegment(): [PathSegment] $crate +# 22| getIdentifier(): [NameRef] $crate +# 22| getSegment(): [PathSegment] __private +# 22| getIdentifier(): [NameRef] __private +# 22| getSegment(): [PathSegment] Err +# 22| getIdentifier(): [NameRef] Err +# 22| getField(0): [IdentPat] err +# 22| getName(): [Name] err +# 22| getPat(): [IdentPat] ast +# 22| getName(): [Name] ast +# 23| getStatement(1): [LetStmt] let ... = ... +# 23| getInitializer(): [MethodCallExpr] ast.clone() +# 23| getArgList(): [ArgList] ArgList +# 23| getIdentifier(): [NameRef] clone +# 23| getReceiver(): [PathExpr,VariableAccess] ast +# 23| getPath(): [Path] ast +# 23| getSegment(): [PathSegment] ast +# 23| getIdentifier(): [NameRef] ast +# 23| getPat(): [IdentPat] mut new_ast +# 23| getName(): [Name] new_ast +# 24| getStatement(2): [ExprStmt] ExprStmt +# 24| getExpr(): [AssignmentExpr] ... = ... +# 24| getLhs(): [FieldExpr] ... .ident +# 24| getContainer(): [FieldExpr] new_ast.sig +# 24| getContainer(): [PathExpr,VariableAccess] new_ast +# 24| getPath(): [Path] new_ast +# 24| getSegment(): [PathSegment] new_ast +# 24| getIdentifier(): [NameRef] new_ast +# 24| getIdentifier(): [NameRef] sig +# 24| getIdentifier(): [NameRef] ident +# 24| getRhs(): [CallExpr] ...::new(...) +# 24| getArgList(): [ArgList] ArgList +# 24| getArg(0): [RefExpr] &... +# 24| getExpr(): [MacroExpr] MacroExpr +# 24| getMacroCall(): [MacroCall] format!... +# 24| getPath(): [Path] format +# 24| getSegment(): [PathSegment] format +# 24| getIdentifier(): [NameRef] format +# 24| getTokenTree(): [TokenTree] TokenTree +# 24| getMacroCallExpansion(): [CallExpr] ...::must_use(...) +# 24| getArgList(): [ArgList] ArgList +# 24| getArg(0): [BlockExpr] { ... } +# 24| getStmtList(): [StmtList] StmtList +# 24| getStatement(0): [LetStmt] let ... = ... +# 24| getInitializer(): [CallExpr] ...::format(...) +# 24| getArgList(): [ArgList] ArgList +# 24| getArg(0): [MacroExpr] MacroExpr +# 24| getMacroCall(): [MacroCall] ...::format_args!... +# 24| getPath(): [Path] ...::format_args +# 24| getQualifier(): [Path] ...::__export +# 24| getQualifier(): [Path] $crate +# 24| getSegment(): [PathSegment] $crate +# 24| getIdentifier(): [NameRef] $crate +# 24| getSegment(): [PathSegment] __export +# 24| getIdentifier(): [NameRef] __export +# 24| getSegment(): [PathSegment] format_args +# 24| getIdentifier(): [NameRef] format_args +# 24| getTokenTree(): [TokenTree] TokenTree +# 24| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr +# 24| getArg(0): [FormatArgsArg] FormatArgsArg +# 24| getExpr(): [FieldExpr] ... .ident +# 24| getContainer(): [FieldExpr] ast.sig +# 24| getContainer(): [PathExpr,VariableAccess] ast +# 24| getPath(): [Path] ast +# 24| getSegment(): [PathSegment] ast +# 24| getIdentifier(): [NameRef] ast +# 24| getIdentifier(): [NameRef] sig +# 24| getIdentifier(): [NameRef] ident +# 24| getTemplate(): [StringLiteralExpr] "{}_new" +# 24| getFormat(0): [Format] {} +# 24| getFunction(): [PathExpr] ...::format +# 24| getPath(): [Path] ...::format +# 24| getQualifier(): [Path] ...::fmt +# 24| getQualifier(): [Path] $crate +# 24| getSegment(): [PathSegment] $crate +# 24| getIdentifier(): [NameRef] $crate +# 24| getSegment(): [PathSegment] fmt +# 24| getIdentifier(): [NameRef] fmt +# 24| getSegment(): [PathSegment] format +# 24| getIdentifier(): [NameRef] format +# 24| getPat(): [IdentPat] res +# 24| getName(): [Name] res +# 24| getTailExpr(): [PathExpr,VariableAccess] res +# 24| getPath(): [Path] res +# 24| getSegment(): [PathSegment] res +# 24| getIdentifier(): [NameRef] res +# 24| getFunction(): [PathExpr] ...::must_use +# 24| getPath(): [Path] ...::must_use +# 24| getQualifier(): [Path] ...::__export +# 24| getQualifier(): [Path] $crate +# 24| getSegment(): [PathSegment] $crate +# 24| getIdentifier(): [NameRef] $crate +# 24| getSegment(): [PathSegment] __export +# 24| getIdentifier(): [NameRef] __export +# 24| getSegment(): [PathSegment] must_use +# 24| getIdentifier(): [NameRef] must_use +# 24| getArg(1): [MethodCallExpr] ... .span() +# 24| getArgList(): [ArgList] ArgList +# 24| getIdentifier(): [NameRef] span +# 24| getReceiver(): [FieldExpr] ... .ident +# 24| getContainer(): [FieldExpr] ast.sig +# 24| getContainer(): [PathExpr,VariableAccess] ast +# 24| getPath(): [Path] ast +# 24| getSegment(): [PathSegment] ast +# 24| getIdentifier(): [NameRef] ast +# 24| getIdentifier(): [NameRef] sig +# 24| getIdentifier(): [NameRef] ident +# 24| getFunction(): [PathExpr] ...::new +# 24| getPath(): [Path] ...::new +# 24| getQualifier(): [Path] ...::Ident +# 24| getQualifier(): [Path] syn +# 24| getSegment(): [PathSegment] syn +# 24| getIdentifier(): [NameRef] syn +# 24| getSegment(): [PathSegment] Ident +# 24| getIdentifier(): [NameRef] Ident +# 24| getSegment(): [PathSegment] new +# 24| getIdentifier(): [NameRef] new +# 25| getTailExpr(): [MethodCallExpr] ... .into() +# 28| getArgList(): [ArgList] ArgList +# 28| getIdentifier(): [NameRef] into +# 25| getReceiver(): [MacroExpr] MacroExpr +# 25| getMacroCall(): [MacroCall] quote!... +# 25| getPath(): [Path] quote +# 25| getSegment(): [PathSegment] quote +# 25| getIdentifier(): [NameRef] quote +# 25| getTokenTree(): [TokenTree] TokenTree +# 26| getMacroCallExpansion(): [BlockExpr] { ... } +# 26| getStmtList(): [StmtList] StmtList +# 25| getStatement(0): [LetStmt] let ... = ... +# 25| getInitializer(): [CallExpr] ...::new(...) +# 25| getArgList(): [ArgList] ArgList +# 25| getFunction(): [PathExpr] ...::new +# 25| getPath(): [Path] ...::new +# 25| getQualifier(): [Path] ...::TokenStream +# 25| getQualifier(): [Path] ...::__private +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] __private +# 25| getIdentifier(): [NameRef] __private +# 25| getSegment(): [PathSegment] TokenStream +# 25| getIdentifier(): [NameRef] TokenStream +# 25| getSegment(): [PathSegment] new +# 25| getIdentifier(): [NameRef] new +# 25| getPat(): [IdentPat] mut _s +# 25| getName(): [Name] _s +# 26| getStatement(1): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_each_token!... +# 25| getPath(): [Path] ...::quote_each_token +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_each_token +# 25| getIdentifier(): [NameRef] quote_each_token +# 26| getTokenTree(): [TokenTree] TokenTree +# 26| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getTailExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_tokens_with_context!... +# 25| getPath(): [Path] ...::quote_tokens_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_tokens_with_context +# 25| getIdentifier(): [NameRef] quote_tokens_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 26| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 27| getTailExpr(): [MacroExpr] MacroExpr +# 27| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 27| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(0): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(1): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(2): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(3): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 26| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(0): [ExprStmt] ExprStmt +# 26| getExpr(): [CallExpr] ...::to_tokens(...) +# 26| getArgList(): [ArgList] ArgList +# 26| getArg(0): [RefExpr] &ast +# 26| getExpr(): [PathExpr,VariableAccess] ast +# 26| getPath(): [Path] ast +# 26| getSegment(): [PathSegment] ast +# 26| getIdentifier(): [NameRef] ast +# 25| getArg(1): [RefExpr] &mut _s +# 25| getExpr(): [PathExpr] _s +# 25| getPath(): [Path] _s +# 25| getSegment(): [PathSegment] _s +# 25| getIdentifier(): [NameRef] _s +# 25| getFunction(): [PathExpr] ...::to_tokens +# 25| getPath(): [Path] ...::to_tokens +# 25| getQualifier(): [Path] ...::ToTokens +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] ToTokens +# 25| getIdentifier(): [NameRef] ToTokens +# 25| getSegment(): [PathSegment] to_tokens +# 25| getIdentifier(): [NameRef] to_tokens +# 26| getStatement(4): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(5): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 27| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 27| getStatement(0): [ExprStmt] ExprStmt +# 27| getExpr(): [CallExpr] ...::to_tokens(...) +# 27| getArgList(): [ArgList] ArgList +# 27| getArg(0): [RefExpr] &new_ast +# 27| getExpr(): [PathExpr,VariableAccess] new_ast +# 27| getPath(): [Path] new_ast +# 27| getSegment(): [PathSegment] new_ast +# 27| getIdentifier(): [NameRef] new_ast +# 25| getArg(1): [RefExpr] &mut _s +# 25| getExpr(): [PathExpr] _s +# 25| getPath(): [Path] _s +# 25| getSegment(): [PathSegment] _s +# 25| getIdentifier(): [NameRef] _s +# 25| getFunction(): [PathExpr] ...::to_tokens +# 25| getPath(): [Path] ...::to_tokens +# 25| getQualifier(): [Path] ...::ToTokens +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] ToTokens +# 25| getIdentifier(): [NameRef] ToTokens +# 25| getSegment(): [PathSegment] to_tokens +# 25| getIdentifier(): [NameRef] to_tokens +# 26| getStatement(6): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 26| getStatement(7): [ExprStmt] ExprStmt +# 26| getExpr(): [MacroExpr] MacroExpr +# 26| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 26| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 27| getStatement(8): [ExprStmt] ExprStmt +# 27| getExpr(): [MacroExpr] MacroExpr +# 27| getMacroCall(): [MacroCall] ...::quote_token_with_context!... +# 25| getPath(): [Path] ...::quote_token_with_context +# 25| getQualifier(): [Path] $crate +# 25| getSegment(): [PathSegment] $crate +# 25| getIdentifier(): [NameRef] $crate +# 25| getSegment(): [PathSegment] quote_token_with_context +# 25| getIdentifier(): [NameRef] quote_token_with_context +# 27| getTokenTree(): [TokenTree] TokenTree +# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr +# 25| getTailExpr(): [PathExpr] _s +# 25| getPath(): [Path] _s +# 25| getSegment(): [PathSegment] _s +# 25| getIdentifier(): [NameRef] _s +# 21| getName(): [Name] add_one +# 21| getRetType(): [RetTypeRepr] RetTypeRepr +# 21| getTypeRepr(): [PathTypeRepr] TokenStream +# 21| getPath(): [Path] TokenStream +# 21| getSegment(): [PathSegment] TokenStream +# 21| getIdentifier(): [NameRef] TokenStream +# 21| getVisibility(): [Visibility] Visibility +# 31| getItem(4): [Function] fn erase +# 32| getParamList(): [ParamList] ParamList +# 32| getParam(0): [Param] ...: TokenStream +# 32| getTypeRepr(): [PathTypeRepr] TokenStream +# 32| getPath(): [Path] TokenStream +# 32| getSegment(): [PathSegment] TokenStream +# 32| getIdentifier(): [NameRef] TokenStream +# 32| getPat(): [IdentPat] _attr +# 32| getName(): [Name] _attr +# 32| getParam(1): [Param] ...: TokenStream +# 32| getTypeRepr(): [PathTypeRepr] TokenStream +# 32| getPath(): [Path] TokenStream +# 32| getSegment(): [PathSegment] TokenStream +# 32| getIdentifier(): [NameRef] TokenStream +# 32| getPat(): [IdentPat] _item +# 32| getName(): [Name] _item +# 31| getAttr(0): [Attr] Attr +# 31| getMeta(): [Meta] Meta +# 31| getPath(): [Path] proc_macro_attribute +# 31| getSegment(): [PathSegment] proc_macro_attribute +# 31| getIdentifier(): [NameRef] proc_macro_attribute +# 32| getBody(): [BlockExpr] { ... } +# 32| getStmtList(): [StmtList] StmtList +# 33| getTailExpr(): [CallExpr] ...::new(...) +# 33| getArgList(): [ArgList] ArgList +# 33| getFunction(): [PathExpr] ...::new +# 33| getPath(): [Path] ...::new +# 33| getQualifier(): [Path] TokenStream +# 33| getSegment(): [PathSegment] TokenStream +# 33| getIdentifier(): [NameRef] TokenStream +# 33| getSegment(): [PathSegment] new +# 33| getIdentifier(): [NameRef] new +# 32| getName(): [Name] erase +# 32| getRetType(): [RetTypeRepr] RetTypeRepr +# 32| getTypeRepr(): [PathTypeRepr] TokenStream +# 32| getPath(): [Path] TokenStream +# 32| getSegment(): [PathSegment] TokenStream +# 32| getIdentifier(): [NameRef] TokenStream +# 32| getVisibility(): [Visibility] Visibility diff --git a/rust/ql/test/extractor-tests/macro_expansion/PrintAst.qlref b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.qlref similarity index 100% rename from rust/ql/test/extractor-tests/macro_expansion/PrintAst.qlref rename to rust/ql/test/extractor-tests/macro-expansion/PrintAst.qlref diff --git a/rust/ql/test/extractor-tests/macro-expansion/call.rs b/rust/ql/test/extractor-tests/macro-expansion/call.rs new file mode 100644 index 000000000000..974f4b57051b --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion/call.rs @@ -0,0 +1,14 @@ +use crate::macro_expansion; + +fn call_some_functions() { + macro_expansion::foo(); + macro_expansion::foo_new(); + macro_expansion::bar_0(); + macro_expansion::bar_1(); + macro_expansion::bar_0_new(); + macro_expansion::bar_1_new(); + macro_expansion::S::bzz_0(); + macro_expansion::S::bzz_1(); + macro_expansion::S::bzz_2(); + macro_expansion::S::x(); +} \ No newline at end of file diff --git a/rust/ql/integration-tests/macro-expansion/calls/src/included.rs b/rust/ql/test/extractor-tests/macro-expansion/included/included.rs similarity index 100% rename from rust/ql/integration-tests/macro-expansion/calls/src/included.rs rename to rust/ql/test/extractor-tests/macro-expansion/included/included.rs diff --git a/rust/ql/test/extractor-tests/macro-expansion/macro_expansion.rs b/rust/ql/test/extractor-tests/macro-expansion/macro_expansion.rs new file mode 100644 index 000000000000..419105547a1e --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion/macro_expansion.rs @@ -0,0 +1,80 @@ +use proc_macro::{repeat, add_one, erase}; + +#[add_one] +pub fn foo() { + _ = concat!("Hello ", "world!"); + + #[repeat(2)] + fn inner() {} + + inner_0(); + inner_1(); +} + +#[repeat(2)] +#[add_one] +pub fn bar() {} + +#[erase] +pub fn baz() {} + + +macro_rules! hello { + () => { + println!("hello!"); + }; +} + +pub struct S; + +impl S { + #[repeat(3)] + pub fn bzz() { + hello!(); + } +} + +macro_rules! def_x { + () => { + pub fn x() {} + }; +} + +impl S { + def_x!(); // this doesn't expand since 0.0.274 +} + +macro_rules! my_macro { + ($head:expr, $($tail:tt)*) => { format!($head, $($tail)*) }; +} + + +fn test() { + _ = concat!("x", "y"); + + _ = my_macro!( + concat!("<", "{}", ">"), // this doesn't expand since 0.0.274 + "hi", + ); +} + +include!("included/included.rs"); + +#[doc = include_str!("some.txt")] // this doesn't expand since 0.0.274 +fn documented() {} + +macro_rules! my_int { + () => { i32 }; +} + +fn answer() -> my_int!() { // this didn't expand in 0.0.274..0.0.287 + let a: my_int!() = 42; // this is fine + a as my_int!() // this is fine too +} + + +type MyInt = my_int!(); // this didn't expand in 0.0.274..0.0.287 + +struct MyStruct { + field: my_int!(), // this didn't expand in 0.0.274..0.0.287 +} diff --git a/rust/ql/integration-tests/macro-expansion/proc_macros/src/lib.rs b/rust/ql/test/extractor-tests/macro-expansion/proc_macro.rs similarity index 56% rename from rust/ql/integration-tests/macro-expansion/proc_macros/src/lib.rs rename to rust/ql/test/extractor-tests/macro-expansion/proc_macro.rs index 8d1f3be0e4ef..3e9e7ccd1cf1 100644 --- a/rust/ql/integration-tests/macro-expansion/proc_macros/src/lib.rs +++ b/rust/ql/test/extractor-tests/macro-expansion/proc_macro.rs @@ -16,3 +16,19 @@ pub fn repeat(attr: TokenStream, item: TokenStream) -> TokenStream { #(#items)* }.into() } + +#[proc_macro_attribute] +pub fn add_one(_attr: TokenStream, item: TokenStream) -> TokenStream { + let ast = syn::parse_macro_input!(item as syn::ItemFn); + let mut new_ast = ast.clone(); + new_ast.sig.ident = syn::Ident::new(&format!("{}_new", ast.sig.ident), ast.sig.ident.span()); + quote! { + #ast + #new_ast + }.into() +} + +#[proc_macro_attribute] +pub fn erase(_attr: TokenStream, _item: TokenStream) -> TokenStream { + TokenStream::new() +} diff --git a/rust/ql/integration-tests/macro-expansion/calls/src/some.txt b/rust/ql/test/extractor-tests/macro-expansion/some.txt similarity index 100% rename from rust/ql/integration-tests/macro-expansion/calls/src/some.txt rename to rust/ql/test/extractor-tests/macro-expansion/some.txt diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.expected b/rust/ql/test/extractor-tests/macro-expansion/test.expected new file mode 100644 index 000000000000..10a73fd947c8 --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion/test.expected @@ -0,0 +1,37 @@ +attribute_macros +| macro_expansion.rs:3:1:12:1 | fn foo | 0 | macro_expansion.rs:4:1:11:14 | fn foo | +| macro_expansion.rs:3:1:12:1 | fn foo | 1 | macro_expansion.rs:4:1:11:14 | fn foo_new | +| macro_expansion.rs:7:5:8:16 | fn inner | 0 | macro_expansion.rs:8:5:8:16 | fn inner_0 | +| macro_expansion.rs:7:5:8:16 | fn inner | 0 | macro_expansion.rs:8:5:8:16 | fn inner_0 | +| macro_expansion.rs:7:5:8:16 | fn inner | 1 | macro_expansion.rs:8:5:8:16 | fn inner_1 | +| macro_expansion.rs:7:5:8:16 | fn inner | 1 | macro_expansion.rs:8:5:8:16 | fn inner_1 | +| macro_expansion.rs:14:1:16:15 | fn bar | 0 | macro_expansion.rs:15:1:16:14 | fn bar_0 | +| macro_expansion.rs:14:1:16:15 | fn bar | 1 | macro_expansion.rs:15:1:16:14 | fn bar_1 | +| macro_expansion.rs:15:1:16:14 | fn bar_0 | 0 | macro_expansion.rs:16:1:16:14 | fn bar_0 | +| macro_expansion.rs:15:1:16:14 | fn bar_0 | 1 | macro_expansion.rs:16:1:16:14 | fn bar_0_new | +| macro_expansion.rs:15:1:16:14 | fn bar_1 | 0 | macro_expansion.rs:16:1:16:14 | fn bar_1 | +| macro_expansion.rs:15:1:16:14 | fn bar_1 | 1 | macro_expansion.rs:16:1:16:14 | fn bar_1_new | +macro_calls +| included/included.rs:2:9:2:39 | concat!... | included/included.rs:2:17:2:38 | "Hello world!" | +| macro_expansion.rs:5:9:5:34 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | +| macro_expansion.rs:5:9:5:34 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | +| macro_expansion.rs:33:9:33:16 | ...::format_args_nl!... | macro_expansion.rs:33:9:33:16 | FormatArgsExpr | +| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:33:9:33:16 | MacroBlockExpr | +| macro_expansion.rs:33:9:33:16 | println!... | macro_expansion.rs:33:9:33:16 | MacroBlockExpr | +| macro_expansion.rs:44:5:44:13 | def_x!... | macro_expansion.rs:44:5:44:13 | MacroItems | +| macro_expansion.rs:53:9:53:25 | concat!... | macro_expansion.rs:53:17:53:24 | "xy" | +| macro_expansion.rs:55:9:58:5 | my_macro!... | macro_expansion.rs:56:9:57:13 | MacroExpr | +| macro_expansion.rs:56:9:56:31 | concat!... | macro_expansion.rs:56:17:56:30 | "<{}>" | +| macro_expansion.rs:56:9:57:13 | ...::format_args!... | macro_expansion.rs:56:9:57:13 | FormatArgsExpr | +| macro_expansion.rs:56:9:57:13 | format!... | macro_expansion.rs:56:9:57:13 | ...::must_use(...) | +| macro_expansion.rs:61:1:61:33 | concat!... | macro_expansion.rs:61:1:61:33 | "Hello world!" | +| macro_expansion.rs:61:1:61:33 | include!... | macro_expansion.rs:61:1:61:33 | MacroItems | +| macro_expansion.rs:63:9:63:32 | include_str!... | macro_expansion.rs:63:22:63:31 | "" | +| macro_expansion.rs:70:16:70:24 | my_int!... | macro_expansion.rs:70:16:70:24 | i32 | +| macro_expansion.rs:71:12:71:20 | my_int!... | macro_expansion.rs:71:12:71:20 | i32 | +| macro_expansion.rs:72:10:72:18 | my_int!... | macro_expansion.rs:72:10:72:18 | i32 | +| macro_expansion.rs:76:14:76:22 | my_int!... | macro_expansion.rs:76:14:76:22 | i32 | +| macro_expansion.rs:79:12:79:20 | my_int!... | macro_expansion.rs:79:12:79:20 | i32 | +unexpanded_macro_calls +| macro_expansion.rs:5:9:5:35 | concat!... | +warnings diff --git a/rust/ql/integration-tests/macro-expansion/test.ql b/rust/ql/test/extractor-tests/macro-expansion/test.ql similarity index 81% rename from rust/ql/integration-tests/macro-expansion/test.ql rename to rust/ql/test/extractor-tests/macro-expansion/test.ql index 439ffab9a293..1952dff3041f 100644 --- a/rust/ql/integration-tests/macro-expansion/test.ql +++ b/rust/ql/test/extractor-tests/macro-expansion/test.ql @@ -1,4 +1,5 @@ import rust +import codeql.rust.Diagnostics query predicate attribute_macros(Item i, int index, Item expanded) { i.fromSource() and expanded = i.getAttributeMacroExpansion().getItem(index) @@ -6,10 +7,12 @@ query predicate attribute_macros(Item i, int index, Item expanded) { query predicate macro_calls(MacroCall c, AstNode expansion) { c.fromSource() and - not c.getLocation().getFile().getAbsolutePath().matches("%proc_macros%") and + not c.getLocation().getFile().getAbsolutePath().matches("%proc_macro.rs") and expansion = c.getMacroCallExpansion() } query predicate unexpanded_macro_calls(MacroCall c) { c.fromSource() and not c.hasMacroCallExpansion() } + +query predicate warnings(ExtractionWarning w) { any() } diff --git a/rust/ql/test/extractor-tests/macro_expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro_expansion/PrintAst.expected deleted file mode 100644 index 3881faafeac4..000000000000 --- a/rust/ql/test/extractor-tests/macro_expansion/PrintAst.expected +++ /dev/null @@ -1,155 +0,0 @@ -lib.rs: -# 1| [SourceFile] SourceFile -# 1| getItem(0): [Module] mod macro_expansion -# 1| getName(): [Name] macro_expansion -macro_expansion.rs: -# 1| [SourceFile] SourceFile -# 1| getItem(0): [Function] fn foo -# 2| getAttributeMacroExpansion(): [MacroItems] MacroItems -# 2| getItem(0): [Function] fn foo -# 1| getParamList(): [ParamList] ParamList -# 1| getAbi(): [Abi] Abi -# 2| getBody(): [BlockExpr] { ... } -# 2| getStmtList(): [StmtList] StmtList -# 2| getName(): [Name] foo -# 2| getItem(1): [Static] Static -# 1| getAttr(0): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] used -# 1| getSegment(): [PathSegment] used -# 1| getIdentifier(): [NameRef] used -# 1| getAttr(1): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] allow -# 1| getSegment(): [PathSegment] allow -# 1| getIdentifier(): [NameRef] allow -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(2): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] doc -# 1| getSegment(): [PathSegment] doc -# 1| getIdentifier(): [NameRef] doc -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(3): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(4): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(5): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(6): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(7): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(8): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(9): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(10): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(11): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 2| getBody(): [BlockExpr] { ... } -# 2| getStmtList(): [StmtList] StmtList -# 2| getStatement(0): [Function] fn foo___rust_ctor___ctor -# 1| getParamList(): [ParamList] ParamList -# 1| getAttr(0): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] allow -# 1| getSegment(): [PathSegment] allow -# 1| getIdentifier(): [NameRef] allow -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAttr(1): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] cfg_attr -# 1| getSegment(): [PathSegment] cfg_attr -# 1| getIdentifier(): [NameRef] cfg_attr -# 1| getTokenTree(): [TokenTree] TokenTree -# 1| getAbi(): [Abi] Abi -# 2| getBody(): [BlockExpr] { ... } -# 2| getStmtList(): [StmtList] StmtList -# 2| getStatement(0): [ExprStmt] ExprStmt -# 2| getExpr(): [CallExpr] foo(...) -# 1| getArgList(): [ArgList] ArgList -# 2| getFunction(): [PathExpr] foo -# 2| getPath(): [Path] foo -# 2| getSegment(): [PathSegment] foo -# 2| getIdentifier(): [NameRef] foo -# 1| getTailExpr(): [IntegerLiteralExpr] 0 -# 1| getName(): [Name] foo___rust_ctor___ctor -# 1| getRetType(): [RetTypeRepr] RetTypeRepr -# 1| getTypeRepr(): [PathTypeRepr] usize -# 1| getPath(): [Path] usize -# 1| getSegment(): [PathSegment] usize -# 1| getIdentifier(): [NameRef] usize -# 1| getTailExpr(): [PathExpr] foo___rust_ctor___ctor -# 1| getPath(): [Path] foo___rust_ctor___ctor -# 1| getSegment(): [PathSegment] foo___rust_ctor___ctor -# 1| getIdentifier(): [NameRef] foo___rust_ctor___ctor -# 1| getName(): [Name] foo___rust_ctor___ctor -# 1| getTypeRepr(): [FnPtrTypeRepr] FnPtrTypeRepr -# 1| getAbi(): [Abi] Abi -# 1| getParamList(): [ParamList] ParamList -# 1| getRetType(): [RetTypeRepr] RetTypeRepr -# 1| getTypeRepr(): [PathTypeRepr] usize -# 1| getPath(): [Path] usize -# 1| getSegment(): [PathSegment] usize -# 1| getIdentifier(): [NameRef] usize -# 2| getParamList(): [ParamList] ParamList -# 1| getAttr(0): [Attr] Attr -# 1| getMeta(): [Meta] Meta -# 1| getPath(): [Path] ...::ctor -# 1| getQualifier(): [Path] ctor -# 1| getSegment(): [PathSegment] ctor -# 1| getIdentifier(): [NameRef] ctor -# 1| getSegment(): [PathSegment] ctor -# 1| getIdentifier(): [NameRef] ctor -# 2| getBody(): [BlockExpr] { ... } -# 2| getStmtList(): [StmtList] StmtList -# 2| getName(): [Name] foo -# 4| getItem(1): [Function] fn bar -# 5| getParamList(): [ParamList] ParamList -# 4| getAttr(0): [Attr] Attr -# 4| getMeta(): [Meta] Meta -# 4| getPath(): [Path] cfg -# 4| getSegment(): [PathSegment] cfg -# 4| getIdentifier(): [NameRef] cfg -# 4| getTokenTree(): [TokenTree] TokenTree -# 5| getBody(): [BlockExpr] { ... } -# 5| getStmtList(): [StmtList] StmtList -# 5| getName(): [Name] bar diff --git a/rust/ql/test/extractor-tests/macro_expansion/macro_expansion.rs b/rust/ql/test/extractor-tests/macro_expansion/macro_expansion.rs deleted file mode 100644 index 1825f1056e35..000000000000 --- a/rust/ql/test/extractor-tests/macro_expansion/macro_expansion.rs +++ /dev/null @@ -1,8 +0,0 @@ -#[ctor::ctor] -fn foo() {} - -#[cfg(any(linux, not(linux)))] -fn bar() {} - -#[cfg(all(linux, not(linux)))] -fn baz() {} diff --git a/rust/ql/test/extractor-tests/macro_expansion/options.yml b/rust/ql/test/extractor-tests/macro_expansion/options.yml deleted file mode 100644 index 07ec8d1b4eb3..000000000000 --- a/rust/ql/test/extractor-tests/macro_expansion/options.yml +++ /dev/null @@ -1,2 +0,0 @@ -qltest_dependencies: - - ctor = { version = "0.2.9" } diff --git a/rust/ql/test/extractor-tests/macro_expansion/test.expected b/rust/ql/test/extractor-tests/macro_expansion/test.expected deleted file mode 100644 index 26a02ec82527..000000000000 --- a/rust/ql/test/extractor-tests/macro_expansion/test.expected +++ /dev/null @@ -1,2 +0,0 @@ -| macro_expansion.rs:1:1:2:11 | fn foo | 0 | macro_expansion.rs:2:4:2:10 | fn foo | -| macro_expansion.rs:1:1:2:11 | fn foo | 1 | macro_expansion.rs:2:4:2:6 | Static | diff --git a/rust/ql/test/extractor-tests/macro_expansion/test.ql b/rust/ql/test/extractor-tests/macro_expansion/test.ql deleted file mode 100644 index 17bc7d47b1d6..000000000000 --- a/rust/ql/test/extractor-tests/macro_expansion/test.ql +++ /dev/null @@ -1,6 +0,0 @@ -import rust -import TestUtils - -from Item i, MacroItems items, int index, Item expanded -where toBeTested(i) and i.getAttributeMacroExpansion() = items and items.getItem(index) = expanded -select i, index, expanded diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 9d4e175192b4..d242a227c11d 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -1,3 +1,9 @@ multiplePathResolutions | main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f | | main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f | +| main.rs:626:3:626:12 | proc_macro | file://:0:0:0:0 | Crate(proc_macro@0.0.0) | +| main.rs:626:3:626:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:631:7:631:16 | proc_macro | file://:0:0:0:0 | Crate(proc_macro@0.0.0) | +| main.rs:631:7:631:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:634:7:634:16 | proc_macro | file://:0:0:0:0 | Crate(proc_macro@0.0.0) | +| main.rs:634:7:634:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | diff --git a/rust/ql/test/library-tests/path-resolution/Cargo.lock b/rust/ql/test/library-tests/path-resolution/Cargo.lock index b9856cfaf77d..3ed3f289c886 100644 --- a/rust/ql/test/library-tests/path-resolution/Cargo.lock +++ b/rust/ql/test/library-tests/path-resolution/Cargo.lock @@ -2,6 +2,52 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc_macro" +version = "0.0.1" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "test" version = "0.0.1" +dependencies = [ + "proc_macro", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 3b68cff897a0..c8c6f36ac3f0 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -623,6 +623,18 @@ mod m24 { extern crate self as zelf; +#[proc_macro::add_suffix("changed")] // $ item=add_suffix +fn z() {} // I122 + +struct AStruct {} //I123 +impl AStruct { // $ item=I123 + #[proc_macro::add_suffix("on_type")] // $ item=add_suffix + pub fn z() {} // I124 + + #[proc_macro::add_suffix("on_instance")] // $ item=add_suffix + pub fn z(&self) {} // I125 +} + fn main() { my::nested::nested1::nested2::f(); // $ item=I4 my::f(); // $ item=I38 @@ -653,4 +665,8 @@ fn main() { m23::f(); // $ item=I108 m24::f(); // $ item=I121 zelf::h(); // $ item=I25 + z_changed(); // $ MISSING: item=I122 + AStruct::z_on_type(); // $ MISSING: item=I124 + AStruct{} // $ item=I123 + .z_on_instance(); // MISSING: item=I125 } diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index 666c80dae774..fd712596821b 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -61,7 +61,7 @@ resolvePath | main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 | | main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f | | main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f | -| main.rs:40:9:40:13 | super | main.rs:1:1:656:2 | SourceFile | +| main.rs:40:9:40:13 | super | main.rs:1:1:672:2 | SourceFile | | main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 | | main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 | | main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g | @@ -73,7 +73,7 @@ resolvePath | main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo | | main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo | | main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f | -| main.rs:68:5:68:8 | self | main.rs:1:1:656:2 | SourceFile | +| main.rs:68:5:68:8 | self | main.rs:1:1:672:2 | SourceFile | | main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i | | main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo | | main.rs:78:16:78:18 | i32 | {EXTERNAL LOCATION} | struct i32 | @@ -88,7 +88,7 @@ resolvePath | main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | | main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | | main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro | -| main.rs:117:13:117:17 | super | main.rs:1:1:656:2 | SourceFile | +| main.rs:117:13:117:17 | super | main.rs:1:1:672:2 | SourceFile | | main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 | | main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f | | main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f | @@ -266,67 +266,79 @@ resolvePath | main.rs:620:9:620:36 | GenericStruct::<...> | main.rs:563:5:566:5 | struct GenericStruct | | main.rs:620:9:620:47 | ...::call_both | main.rs:586:9:589:9 | fn call_both | | main.rs:620:25:620:35 | Implementor | main.rs:592:5:592:23 | struct Implementor | -| main.rs:627:5:627:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:627:5:627:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:627:5:627:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:627:5:627:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:627:5:627:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:628:5:628:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:628:5:628:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:629:5:629:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:629:5:629:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:629:5:629:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:629:5:629:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:630:5:630:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:631:5:631:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:632:5:632:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:632:5:632:12 | ...::h | main.rs:50:1:69:1 | fn h | -| main.rs:633:5:633:6 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:633:5:633:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:633:5:633:13 | ...::g | main.rs:23:9:27:9 | fn g | -| main.rs:634:5:634:6 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:634:5:634:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:634:5:634:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 | -| main.rs:634:5:634:17 | ...::h | main.rs:30:27:34:13 | fn h | -| main.rs:635:5:635:6 | m4 | main.rs:39:1:46:1 | mod m4 | -| main.rs:635:5:635:9 | ...::i | main.rs:42:5:45:5 | fn i | -| main.rs:636:5:636:5 | h | main.rs:50:1:69:1 | fn h | -| main.rs:637:5:637:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:638:5:638:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:639:5:639:5 | j | main.rs:97:1:101:1 | fn j | -| main.rs:640:5:640:6 | m6 | main.rs:109:1:120:1 | mod m6 | -| main.rs:640:5:640:9 | ...::g | main.rs:114:5:119:5 | fn g | -| main.rs:641:5:641:6 | m7 | main.rs:122:1:141:1 | mod m7 | -| main.rs:641:5:641:9 | ...::f | main.rs:133:5:140:5 | fn f | -| main.rs:642:5:642:6 | m8 | main.rs:143:1:197:1 | mod m8 | -| main.rs:642:5:642:9 | ...::g | main.rs:181:5:196:5 | fn g | -| main.rs:643:5:643:6 | m9 | main.rs:199:1:207:1 | mod m9 | -| main.rs:643:5:643:9 | ...::f | main.rs:202:5:206:5 | fn f | -| main.rs:644:5:644:7 | m11 | main.rs:230:1:267:1 | mod m11 | -| main.rs:644:5:644:10 | ...::f | main.rs:235:5:238:5 | fn f | -| main.rs:645:5:645:7 | m15 | main.rs:298:1:352:1 | mod m15 | -| main.rs:645:5:645:10 | ...::f | main.rs:339:5:351:5 | fn f | -| main.rs:646:5:646:7 | m16 | main.rs:354:1:446:1 | mod m16 | -| main.rs:646:5:646:10 | ...::f | main.rs:421:5:445:5 | fn f | -| main.rs:647:5:647:7 | m17 | main.rs:448:1:478:1 | mod m17 | -| main.rs:647:5:647:10 | ...::f | main.rs:472:5:477:5 | fn f | -| main.rs:648:5:648:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:648:5:648:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:649:5:649:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:649:5:649:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:650:5:650:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 | -| main.rs:650:5:650:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:651:5:651:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:652:5:652:7 | m18 | main.rs:480:1:498:1 | mod m18 | -| main.rs:652:5:652:12 | ...::m19 | main.rs:485:5:497:5 | mod m19 | -| main.rs:652:5:652:17 | ...::m20 | main.rs:490:9:496:9 | mod m20 | -| main.rs:652:5:652:20 | ...::g | main.rs:491:13:495:13 | fn g | -| main.rs:653:5:653:7 | m23 | main.rs:527:1:552:1 | mod m23 | -| main.rs:653:5:653:10 | ...::f | main.rs:547:5:551:5 | fn f | -| main.rs:654:5:654:7 | m24 | main.rs:554:1:622:1 | mod m24 | -| main.rs:654:5:654:10 | ...::f | main.rs:608:5:621:5 | fn f | -| main.rs:655:5:655:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:655:5:655:11 | ...::h | main.rs:50:1:69:1 | fn h | +| main.rs:626:3:626:12 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| main.rs:626:3:626:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:626:3:626:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:630:6:630:12 | AStruct | main.rs:629:1:629:17 | struct AStruct | +| main.rs:631:7:631:16 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| main.rs:631:7:631:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:631:7:631:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:634:7:634:16 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| main.rs:634:7:634:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:634:7:634:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:639:5:639:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:639:5:639:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:639:5:639:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:639:5:639:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:639:5:639:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:640:5:640:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:640:5:640:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:641:5:641:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:641:5:641:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:641:5:641:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:641:5:641:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:642:5:642:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:643:5:643:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:644:5:644:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:644:5:644:12 | ...::h | main.rs:50:1:69:1 | fn h | +| main.rs:645:5:645:6 | m1 | main.rs:13:1:37:1 | mod m1 | +| main.rs:645:5:645:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | +| main.rs:645:5:645:13 | ...::g | main.rs:23:9:27:9 | fn g | +| main.rs:646:5:646:6 | m1 | main.rs:13:1:37:1 | mod m1 | +| main.rs:646:5:646:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | +| main.rs:646:5:646:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 | +| main.rs:646:5:646:17 | ...::h | main.rs:30:27:34:13 | fn h | +| main.rs:647:5:647:6 | m4 | main.rs:39:1:46:1 | mod m4 | +| main.rs:647:5:647:9 | ...::i | main.rs:42:5:45:5 | fn i | +| main.rs:648:5:648:5 | h | main.rs:50:1:69:1 | fn h | +| main.rs:649:5:649:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:650:5:650:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:651:5:651:5 | j | main.rs:97:1:101:1 | fn j | +| main.rs:652:5:652:6 | m6 | main.rs:109:1:120:1 | mod m6 | +| main.rs:652:5:652:9 | ...::g | main.rs:114:5:119:5 | fn g | +| main.rs:653:5:653:6 | m7 | main.rs:122:1:141:1 | mod m7 | +| main.rs:653:5:653:9 | ...::f | main.rs:133:5:140:5 | fn f | +| main.rs:654:5:654:6 | m8 | main.rs:143:1:197:1 | mod m8 | +| main.rs:654:5:654:9 | ...::g | main.rs:181:5:196:5 | fn g | +| main.rs:655:5:655:6 | m9 | main.rs:199:1:207:1 | mod m9 | +| main.rs:655:5:655:9 | ...::f | main.rs:202:5:206:5 | fn f | +| main.rs:656:5:656:7 | m11 | main.rs:230:1:267:1 | mod m11 | +| main.rs:656:5:656:10 | ...::f | main.rs:235:5:238:5 | fn f | +| main.rs:657:5:657:7 | m15 | main.rs:298:1:352:1 | mod m15 | +| main.rs:657:5:657:10 | ...::f | main.rs:339:5:351:5 | fn f | +| main.rs:658:5:658:7 | m16 | main.rs:354:1:446:1 | mod m16 | +| main.rs:658:5:658:10 | ...::f | main.rs:421:5:445:5 | fn f | +| main.rs:659:5:659:7 | m17 | main.rs:448:1:478:1 | mod m17 | +| main.rs:659:5:659:10 | ...::f | main.rs:472:5:477:5 | fn f | +| main.rs:660:5:660:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:660:5:660:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:661:5:661:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:661:5:661:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:662:5:662:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 | +| main.rs:662:5:662:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:663:5:663:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:664:5:664:7 | m18 | main.rs:480:1:498:1 | mod m18 | +| main.rs:664:5:664:12 | ...::m19 | main.rs:485:5:497:5 | mod m19 | +| main.rs:664:5:664:17 | ...::m20 | main.rs:490:9:496:9 | mod m20 | +| main.rs:664:5:664:20 | ...::g | main.rs:491:13:495:13 | fn g | +| main.rs:665:5:665:7 | m23 | main.rs:527:1:552:1 | mod m23 | +| main.rs:665:5:665:10 | ...::f | main.rs:547:5:551:5 | fn f | +| main.rs:666:5:666:7 | m24 | main.rs:554:1:622:1 | mod m24 | +| main.rs:666:5:666:10 | ...::f | main.rs:608:5:621:5 | fn f | +| main.rs:667:5:667:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:667:5:667:11 | ...::h | main.rs:50:1:69:1 | fn h | +| main.rs:669:5:669:11 | AStruct | main.rs:629:1:629:17 | struct AStruct | +| main.rs:670:5:670:11 | AStruct | main.rs:629:1:629:17 | struct AStruct | | my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | | my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | @@ -342,7 +354,7 @@ resolvePath | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:17:30 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:656:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:672:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:17:30 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | @@ -369,4 +381,21 @@ resolvePath | my/nested.rs:21:5:21:11 | nested1 | my/nested.rs:1:1:17:1 | mod nested1 | | my/nested.rs:21:5:21:20 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | | my/nested.rs:21:5:21:23 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| proc_macro.rs:1:5:1:14 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| proc_macro.rs:1:5:1:27 | ...::TokenStream | {EXTERNAL LOCATION} | struct TokenStream | +| proc_macro.rs:2:5:2:9 | quote | {EXTERNAL LOCATION} | Crate(quote@1.0.40) | +| proc_macro.rs:5:25:5:35 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream | +| proc_macro.rs:5:44:5:54 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream | +| proc_macro.rs:5:60:5:70 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream | +| proc_macro.rs:6:16:6:18 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) | +| proc_macro.rs:6:48:6:50 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) | +| proc_macro.rs:6:48:6:58 | ...::LitStr | {EXTERNAL LOCATION} | struct LitStr | +| proc_macro.rs:6:48:6:58 | ...::parse::<...> | {EXTERNAL LOCATION} | fn parse | +| proc_macro.rs:7:19:7:21 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) | +| proc_macro.rs:7:51:7:53 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) | +| proc_macro.rs:7:51:7:61 | ...::ItemFn | {EXTERNAL LOCATION} | struct ItemFn | +| proc_macro.rs:7:51:7:61 | ...::parse::<...> | {EXTERNAL LOCATION} | fn parse | +| proc_macro.rs:8:21:8:23 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) | +| proc_macro.rs:8:21:8:30 | ...::Ident | {EXTERNAL LOCATION} | struct Ident | +| proc_macro.rs:8:21:8:35 | ...::new | {EXTERNAL LOCATION} | fn new | testFailures diff --git a/rust/ql/test/library-tests/path-resolution/proc_macro.rs b/rust/ql/test/library-tests/path-resolution/proc_macro.rs new file mode 100644 index 000000000000..c95fc6fe6401 --- /dev/null +++ b/rust/ql/test/library-tests/path-resolution/proc_macro.rs @@ -0,0 +1,12 @@ +use proc_macro::TokenStream; +use quote::quote; + +#[proc_macro_attribute] +pub fn add_suffix(attr: TokenStream, item: TokenStream) -> TokenStream { + let suff = syn::parse_macro_input!(attr as syn::LitStr).value(); + let mut ast = syn::parse_macro_input!(item as syn::ItemFn); + ast.sig.ident = syn::Ident::new(&format!("{}_{}", ast.sig.ident, suff), ast.sig.ident.span()); + quote! { + #ast + }.into() +}