diff --git a/Cargo.lock b/Cargo.lock index 7a84fdf..474a74d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -299,6 +299,7 @@ dependencies = [ "codegen-sdk-macros", "codegen-sdk-markdown", "codegen-sdk-python", + "codegen-sdk-resolution", "codegen-sdk-ruby", "codegen-sdk-rust", "codegen-sdk-toml", @@ -340,13 +341,13 @@ dependencies = [ "codegen-sdk-cst", "codegen-sdk-cst-generator", "codegen-sdk-ts_query", - "codegen-sdk-typescript", "convert_case 0.7.1", "derive_more", "insta", "log", "proc-macro2", "quote", + "rstest", "salsa", "syn 2.0.98", "test-log", @@ -400,6 +401,7 @@ dependencies = [ "codegen-sdk-analyzer", "codegen-sdk-ast", "codegen-sdk-common", + "codegen-sdk-resolution", "codegen-sdk-typescript", "env_logger", "log", @@ -584,15 +586,25 @@ dependencies = [ "codegen-sdk-common", "codegen-sdk-cst", "codegen-sdk-cst-generator", + "codegen-sdk-resolution", "derive_generic_visitor", "derive_more", "env_logger", "log", "salsa", "subenum", + "tempfile", + "test-log", "tree-sitter", ] +[[package]] +name = "codegen-sdk-resolution" +version = "0.1.0" +dependencies = [ + "salsa", +] + [[package]] name = "codegen-sdk-ruby" version = "0.1.0" @@ -1037,6 +1049,49 @@ dependencies = [ "libc", ] +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "generator" version = "0.8.4" @@ -1603,6 +1658,12 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.31" @@ -1651,6 +1712,15 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -1786,6 +1856,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "rend" version = "0.5.2" @@ -1825,6 +1901,36 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "rstest" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fc39292f8613e913f7df8fa892b8944ceb47c247b78e1b1ae2f09e019be789d" +dependencies = [ + "futures-timer", + "futures-util", + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f168d99749d307be9de54d23fd226628d99768225ef08f6ffb52e0182a27746" +dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.98", + "unicode-ident", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -1837,6 +1943,15 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.44" @@ -1924,6 +2039,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + [[package]] name = "serde" version = "1.0.217" @@ -2001,6 +2122,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.13.2" @@ -2164,6 +2294,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + [[package]] name = "tracing" version = "0.1.41" @@ -2739,6 +2886,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.33.0" diff --git a/Cargo.toml b/Cargo.toml index 7099a55..e759856 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ salsa = { workspace = true} codegen-sdk-typescript = { workspace = true} env_logger = { workspace = true } log = { workspace = true } +codegen-sdk-resolution = { workspace = true} sysinfo = "0.33.1" rkyv.workspace = true [features] @@ -57,7 +58,7 @@ members = [ "languages/codegen-sdk-yaml", "languages/codegen-sdk-toml", "languages/codegen-sdk-ts_query", - "languages/codegen-sdk-typescript", + "languages/codegen-sdk-typescript", "codegen-sdk-resolution", ] resolver = "2" [workspace.dependencies] @@ -88,6 +89,7 @@ mockall = "0.13.1" codegen-sdk-common = { path = "codegen-sdk-common" } codegen-sdk-cst = { path = "codegen-sdk-cst"} codegen-sdk-ast = { path = "codegen-sdk-ast" } +codegen-sdk-resolution = { path = "codegen-sdk-resolution" } codegen-sdk-cst-generator = { path = "codegen-sdk-cst-generator" } codegen-sdk-ast-generator = { path = "codegen-sdk-ast-generator" } codegen-sdk-ts_query = { path = "languages/codegen-sdk-ts_query" } @@ -117,6 +119,7 @@ subenum = {git = "https://github.com/mrenow/subenum", branch = "main"} indicatif-log-bridge = "0.2.3" indicatif = { version = "0.17.11", features = ["rayon"] } crossbeam-channel = "0.5.11" +rstest = "0.25.0" [profile.dev] # codegen-backend = "cranelift" split-debuginfo = "unpacked" diff --git a/codegen-sdk-analyzer/Cargo.toml b/codegen-sdk-analyzer/Cargo.toml index 6589df1..76f6172 100644 --- a/codegen-sdk-analyzer/Cargo.toml +++ b/codegen-sdk-analyzer/Cargo.toml @@ -8,6 +8,7 @@ salsa = { workspace = true } codegen-sdk-common = { workspace = true } codegen-sdk-ast = { workspace = true } codegen-sdk-cst = { workspace = true } +codegen-sdk-resolution = { workspace = true } codegen-sdk-python = { workspace = true, optional = true} codegen-sdk-typescript = { workspace = true, optional = true} codegen-sdk-tsx = { workspace = true, optional = true} diff --git a/codegen-sdk-analyzer/src/codebase.rs b/codegen-sdk-analyzer/src/codebase.rs index 3a933fb..01b56e6 100644 --- a/codegen-sdk-analyzer/src/codebase.rs +++ b/codegen-sdk-analyzer/src/codebase.rs @@ -4,6 +4,7 @@ use anyhow::Context; use codegen_sdk_ast::Input; #[cfg(feature = "serialization")] use codegen_sdk_common::serialization::Cache; +use codegen_sdk_resolution::CodebaseContext; use discovery::FilesToParse; use notify_debouncer_mini::DebounceEventResult; use salsa::Setter; @@ -60,25 +61,11 @@ impl Codebase { } Ok(()) } - pub fn get_file(&self, path: PathBuf) -> Option<&ParsedFile<'_>> { - let file = self.db.files.get(&path); - if let Some(file) = file { - return parse_file(&self.db, file.clone()).file(&self.db).as_ref(); - } - None - } + fn discover(&self) -> FilesToParse { discovery::collect_files(&self.db, &self.root) } - pub fn files(&self) -> Vec<&ParsedFile<'_>> { - let mut files = Vec::new(); - for file in self.discover().files(&self.db) { - if let Some(file) = self.get_file(file.path(&self.db)) { - files.push(file); - } - } - files - } + pub fn errors(&self) -> Vec<()> { let mut errors = Vec::new(); for file in self.discover().files(&self.db) { @@ -97,7 +84,26 @@ impl Codebase { files, ) } - pub fn db(&self) -> &CodegenDatabase { +} +impl CodebaseContext for Codebase { + type File<'a> = ParsedFile<'a>; + fn files<'a>(&'a self) -> Vec<&'a Self::File<'a>> { + let mut files = Vec::new(); + for file in self.discover().files(&self.db) { + if let Some(file) = self.get_file(file.path(&self.db)) { + files.push(file); + } + } + files + } + fn db(&self) -> &dyn salsa::Database { &self.db } + fn get_file<'a>(&'a self, path: PathBuf) -> Option<&'a Self::File<'a>> { + let file = self.db.files.get(&path); + if let Some(file) = file { + return parse_file(&self.db, file.clone()).file(&self.db).as_ref(); + } + None + } } diff --git a/codegen-sdk-analyzer/src/codebase/parser.rs b/codegen-sdk-analyzer/src/codebase/parser.rs index 75f3502..a1f86e0 100644 --- a/codegen-sdk-analyzer/src/codebase/parser.rs +++ b/codegen-sdk-analyzer/src/codebase/parser.rs @@ -45,15 +45,15 @@ fn execute_op_with_progress( multi.remove(&pg); results } -#[salsa::tracked] -fn parse_files_par(db: &dyn Db, files: FilesToParse) { - let _: Vec<_> = execute_op_with_progress(db, files, "Parsing Files", |db, file| { - parse_file(db, file); - }); -} +// #[salsa::tracked] +// fn parse_files_par(db: &dyn Db, files: FilesToParse) { +// let _: Vec<_> = execute_op_with_progress(db, files, "Parsing Files", |db, file| { +// parse_file(db, file); +// }); +// } #[salsa::tracked] fn parse_files_definitions_par(db: &dyn Db, files: FilesToParse) { - let _: Vec<_> = execute_op_with_progress(db, files, "Parsing Definitions", |db, file| { + let _: Vec<_> = execute_op_with_progress(db, files, "Parsing Files", |db, file| { let file = parse_file(db, file); if let Some(parsed) = file.file(db) { #[cfg(feature = "typescript")] @@ -61,6 +61,11 @@ fn parse_files_definitions_par(db: &dyn Db, files: FilesToParse) { parsed.definitions(db); parsed.references(db); } + #[cfg(feature = "python")] + if let ParsedFile::Python(parsed) = parsed { + parsed.definitions(db); + parsed.references(db); + } } () }); @@ -80,13 +85,6 @@ pub fn parse_files<'db>( #[cfg(feature = "serialization")] let cached = get_cached_count(&cache, &files_to_parse); log::info!("Parsing {} files", files_to_parse.files(db).len()); - parse_files_par( - db, - #[cfg(feature = "serialization")] - &cache, - files_to_parse, - ); - log::info!("Parsing definitions"); parse_files_definitions_par( db, #[cfg(feature = "serialization")] diff --git a/codegen-sdk-analyzer/src/parser.rs b/codegen-sdk-analyzer/src/parser.rs index d1dc107..fae30f8 100644 --- a/codegen-sdk-analyzer/src/parser.rs +++ b/codegen-sdk-analyzer/src/parser.rs @@ -1,14 +1,18 @@ +use std::path::PathBuf; + use codegen_sdk_cst::CSTLanguage; use codegen_sdk_macros::{languages_ast, parse_language}; languages_ast!(); #[salsa::tracked] pub struct Parsed<'db> { + #[id] + path: PathBuf, #[return_ref] pub file: Option>, } #[salsa::tracked] pub fn parse_file(db: &dyn salsa::Database, file: codegen_sdk_ast::input::File) -> Parsed<'_> { parse_language!(); - Parsed::new(db, None) + Parsed::new(db, file.path(db), None) } diff --git a/codegen-sdk-ast-generator/Cargo.toml b/codegen-sdk-ast-generator/Cargo.toml index 3c68177..574d4b3 100644 --- a/codegen-sdk-ast-generator/Cargo.toml +++ b/codegen-sdk-ast-generator/Cargo.toml @@ -19,4 +19,4 @@ syn = { workspace = true } [dev-dependencies] test-log = { workspace = true } insta = { workspace = true } -codegen-sdk-typescript = {workspace = true} +rstest = { workspace = true } diff --git a/codegen-sdk-ast-generator/src/generator.rs b/codegen-sdk-ast-generator/src/generator.rs index 8e7c660..fe0df99 100644 --- a/codegen-sdk-ast-generator/src/generator.rs +++ b/codegen-sdk-ast-generator/src/generator.rs @@ -18,6 +18,7 @@ fn get_definitions_impl(language: &Language) -> TokenStream { #[salsa::tracked] impl<'db> codegen_sdk_ast::Definitions<'db> for #language_struct_name<'db> { type Definitions = Definitions<'db>; + #[salsa::tracked] fn definitions(self, db: &'db dyn salsa::Database) -> Self::Definitions { let mut definitions = Definitions::default(); if let Some(program) = self.node(db) { @@ -44,6 +45,7 @@ fn get_references_impl(language: &Language) -> TokenStream { #[salsa::tracked] impl<'db> codegen_sdk_ast::References<'db> for #language_struct_name<'db> { type References = References<'db>; + #[salsa::tracked] fn references(self, db: &'db dyn salsa::Database) -> Self::References { let mut references = References::default(); if let Some(program) = self.node(db) { diff --git a/codegen-sdk-ast-generator/src/lib.rs b/codegen-sdk-ast-generator/src/lib.rs index b7e858e..c0f50c6 100644 --- a/codegen-sdk-ast-generator/src/lib.rs +++ b/codegen-sdk-ast-generator/src/lib.rs @@ -14,6 +14,7 @@ pub fn generate_ast(language: &Language) -> anyhow::Result<()> { use codegen_sdk_common::*; use std::path::PathBuf; use codegen_sdk_cst::CSTLanguage; + use std::collections::BTreeMap; }; let ast = generator::generate_ast(language)?; let definition_visitor = visitor::generate_visitor(&db, language, "definition"); diff --git a/codegen-sdk-ast-generator/src/query.rs b/codegen-sdk-ast-generator/src/query.rs index 08bb120..db2664f 100644 --- a/codegen-sdk-ast-generator/src/query.rs +++ b/codegen-sdk-ast-generator/src/query.rs @@ -71,7 +71,11 @@ impl<'a> Query<'a> { queries.insert(query.name(), query); } node => { - println!("Unhandled query: {:#?}", node); + log::warn!( + "Unhandled query: {:#?}. Source: {:#?}", + node.kind(), + node.source() + ); } } } @@ -199,6 +203,7 @@ impl<'a> Query<'a> { field: &ts_query::FieldDefinition, struct_name: &str, current_node: &Ident, + name_value: Option, ) -> TokenStream { let other_child: ts_query::NodeTypes = field.children().into_iter().skip(2).next().unwrap().into(); @@ -212,14 +217,15 @@ impl<'a> Query<'a> { &normalized_struct_name, other_child.clone(), &field_name, + name_value, ); - assert!( - wrapped.to_string().len() > 0, - "Wrapped is empty, {} {} {}", - normalized_struct_name, - other_child.source(), - other_child.kind() - ); + // assert!( + // wrapped.to_string().len() > 0, + // "Wrapped is empty, {} {} {}", + // normalized_struct_name, + // other_child.source(), + // other_child.kind() + // ); if !field.is_optional() { return quote! { let #field_name = &*#current_node.#field_name; @@ -254,10 +260,16 @@ impl<'a> Query<'a> { node: &ts_query::Grouping, struct_name: &str, current_node: &Ident, + name_value: Option, ) -> TokenStream { let mut matchers = TokenStream::new(); for group in node.children() { - let result = self.get_matcher_for_definition(struct_name, group.into(), current_node); + let result = self.get_matcher_for_definition( + struct_name, + group.into(), + current_node, + name_value.clone(), + ); matchers.extend_one(result); } matchers @@ -269,6 +281,7 @@ impl<'a> Query<'a> { target_kind: &str, current_node: &Ident, remaining_nodes: Vec>, + name_value: Option, ) -> TokenStream { let mut matchers = TokenStream::new(); let mut field_matchers = TokenStream::new(); @@ -291,12 +304,14 @@ impl<'a> Query<'a> { &target_name, child.into(), current_node, + name_value.clone(), )); } else { let result = self.get_matcher_for_definition( &target_name, child.into(), &format_ident!("child"), + name_value.clone(), ); if let Some(ref variant) = comment_variant { @@ -352,24 +367,86 @@ impl<'a> Query<'a> { }; } } - + fn group_children<'b>( + &self, + node: &ts_query::NamedNode<'b>, + first_node: &ts_query::NamedNodeChildren<'_>, + mut name_value: Option, + current_node: &Ident, + ) -> (Option, Vec>) { + let mut prev = first_node.clone(); + let mut remaining_nodes = Vec::new(); + for child in node.children().into_iter().skip(1) { + if child.kind() == "capture" { + if child.source() == "@name" { + log::info!( + "Found @name! prev: {:#?}, {:#?}", + prev.source(), + prev.kind() + ); + match prev { + ts_query::NamedNodeChildren::FieldDefinition(field) => { + let field_name = field + .name + .iter() + .filter(|c| c.is_named()) + .map(|c| format_ident!("{}", c.source())) + .next() + .unwrap(); + name_value = Some(quote! { + #current_node.#field_name.source() + }); + } + ts_query::NamedNodeChildren::Identifier(named) => { + log::info!( + "Found @name! prev: {:#?}, {:#?}", + named.source(), + named.kind() + ); + name_value = Some(quote! { + #current_node.source() + }); + } + ts_query::NamedNodeChildren::AnonymousUnderscore(_) => { + name_value = Some(quote! { + #current_node.source() + }); + } + _ => panic!( + "Unexpected prev: {:#?}, source: {:#?}. Query: {:#?}", + prev.kind(), + prev.source(), + self.node().source() + ), + } + break; + } + continue; + } + prev = child.clone(); + remaining_nodes.push(child); + } + (name_value, remaining_nodes) + } fn get_matcher_for_named_node( &self, node: &ts_query::NamedNode, struct_name: &str, current_node: &Ident, + name_value: Option, ) -> TokenStream { let mut matchers = TokenStream::new(); let first_node = node.children().into_iter().next().unwrap(); - let remaining_nodes = node - .children() - .into_iter() - .skip(1) - .filter(|child| child.kind() != "capture") - .collect::>(); + let (name_value, remaining_nodes) = + self.group_children(node, &first_node, name_value, current_node); if remaining_nodes.len() == 0 { log::info!("single node, {}", first_node.source()); - return self.get_matcher_for_definition(struct_name, first_node.into(), current_node); + return self.get_matcher_for_definition( + struct_name, + first_node.into(), + current_node, + name_value, + ); } let name_node = self.state.get_node_for_raw_name(&first_node.source()); @@ -381,6 +458,7 @@ impl<'a> Query<'a> { name_node.kind(), current_node, remaining_nodes, + name_value, ); matchers.extend_one(matcher); } else { @@ -400,6 +478,7 @@ impl<'a> Query<'a> { variant.kind(), current_node, remaining_nodes.clone(), + name_value.clone(), ); matchers.extend_one(matcher); } @@ -408,10 +487,50 @@ impl<'a> Query<'a> { #matchers } } - fn get_default_matcher(&self) -> TokenStream { + fn get_default_matcher(&self, name_value: Option) -> TokenStream { let to_append = self.executor_id(); + if let Some(name_value) = name_value { + return quote! { + self.#to_append.entry(#name_value).or_insert(Vec::new()).push( + node.clone() + ); + }; + } + log::warn!("No name value found for: {}", self.node().source()); + quote! {} + } + fn get_matcher_for_identifier( + &self, + identifier: &ts_query::Identifier, + struct_name: &str, + current_node: &Ident, + name_value: Option, + ) -> TokenStream { + // We have 2 nodes, the parent node and the identifier node + let to_append = self.get_default_matcher(name_value); + let children; + // Case 1: The identifier is the same as the struct name (IE: we know this is the corrent node) + if normalize_type_name(&identifier.source(), true) == struct_name { + return to_append; + } + // Case 2: We have a node for the parent struct + if let Some(node) = self.state.get_node_for_struct_name(struct_name) { + children = format_ident!("{}Children", struct_name); + // When there is only 1 possible child, we can use the default matcher + if node.children_struct_name() != children.to_string() { + return to_append; + } + } else { + // Case 3: This is a subenum + // If this is a field, we may be dealing with multiple types and can't operate over all of them + return to_append; // TODO: Handle this case + } + let struct_name = format_ident!("{}", normalize_type_name(&identifier.source(), true)); quote! { - self.#to_append.push(node.clone()); + if let crate::cst::#children::#struct_name(child) = #current_node { + #to_append + } + } } fn get_matcher_for_definition( @@ -419,64 +538,43 @@ impl<'a> Query<'a> { struct_name: &str, node: ts_query::NodeTypes, current_node: &Ident, + name_value: Option, ) -> TokenStream { if !node.is_named() { - return self.get_default_matcher(); + return self.get_default_matcher(name_value); } match node { ts_query::NodeTypes::FieldDefinition(field) => { - self.get_matcher_for_field(&field, struct_name, current_node) + self.get_matcher_for_field(&field, struct_name, current_node, name_value) } ts_query::NodeTypes::Capture(named) => { info!("Capture: {:#?}", named.source()); quote! {} } ts_query::NodeTypes::NamedNode(named) => { - self.get_matcher_for_named_node(&named, struct_name, current_node) + self.get_matcher_for_named_node(&named, struct_name, current_node, name_value) } ts_query::NodeTypes::Comment(_) => { quote! {} } ts_query::NodeTypes::List(subenum) => { for child in subenum.children() { - let result = - self.get_matcher_for_definition(struct_name, child.into(), current_node); + let result = self.get_matcher_for_definition( + struct_name, + child.into(), + current_node, + name_value.clone(), + ); // Currently just returns the first child return result; // TODO: properly handle list } quote! {} } ts_query::NodeTypes::Grouping(grouping) => { - self.get_matchers_for_grouping(&grouping, struct_name, current_node) + self.get_matchers_for_grouping(&grouping, struct_name, current_node, name_value) } ts_query::NodeTypes::Identifier(identifier) => { - // We have 2 nodes, the parent node and the identifier node - let to_append = self.get_default_matcher(); - let children; - // Case 1: The identifier is the same as the struct name (IE: we know this is the corrent node) - if normalize_type_name(&identifier.source(), true) == struct_name { - return to_append; - } - // Case 2: We have a node for the parent struct - if let Some(node) = self.state.get_node_for_struct_name(struct_name) { - children = format_ident!("{}Children", struct_name); - // When there is only 1 possible child, we can use the default matcher - if node.children_struct_name() != children.to_string() { - return to_append; - } - } else { - // Case 3: This is a subenum - // If this is a field, we may be dealing with multiple types and can't operate over all of them - return self.get_default_matcher(); // TODO: Handle this case - } - let struct_name = - format_ident!("{}", normalize_type_name(&identifier.source(), true)); - quote! { - if let crate::cst::#children::#struct_name(child) = #current_node { - #to_append - } - - } + self.get_matcher_for_identifier(&identifier, struct_name, current_node, name_value) } unhandled => { log::warn!( @@ -485,29 +583,32 @@ impl<'a> Query<'a> { unhandled.kind(), unhandled.source() ); - self.get_default_matcher() + self.get_default_matcher(name_value) } } } pub fn matcher(&self, struct_name: &str) -> TokenStream { - info!( - "Generating matcher for: {:#?}. Has children: {:#?}", - self.node().source(), - self.node().children() - ); let node = self.state.get_node_for_struct_name(struct_name); let kind = if let Some(node) = node { node.kind() } else { struct_name }; + let starting_node = format_ident!("node"); + let (name_value, remaining_nodes) = self.group_children( + &self.node(), + &self.node().children().into_iter().next().unwrap(), + None, + &starting_node, + ); return self._get_matcher_for_named_node( struct_name, &struct_name, kind, - &format_ident!("node"), - self.node().children().into_iter().skip(1).collect(), + &starting_node, + remaining_nodes, + name_value, ); } } diff --git a/codegen-sdk-ast-generator/src/snapshots/codegen_sdk_ast_generator__visitor__tests__python.snap b/codegen-sdk-ast-generator/src/snapshots/codegen_sdk_ast_generator__visitor__tests__python.snap new file mode 100644 index 0000000..c2a1131 --- /dev/null +++ b/codegen-sdk-ast-generator/src/snapshots/codegen_sdk_ast_generator__visitor__tests__python.snap @@ -0,0 +1,744 @@ +--- +source: codegen-sdk-ast-generator/src/visitor.rs +expression: "codegen_sdk_common::generator::format_code_string(&visitor.to_string()).unwrap()" +--- +#[derive(Visitor, Visit, Debug, Clone, Eq, PartialEq, salsa::Update, Hash, Default)] +#[visit(drive(&crate::cst::AliasedImport<'db>))] +#[visit(drive(&crate::cst::AliasedImportChildren<'db>))] +#[visit(drive(&crate::cst::AnonymousAmpersand<'db>))] +#[visit(drive(&crate::cst::AnonymousAmpersandEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAnd<'db>))] +#[visit(drive(&crate::cst::AnonymousAs<'db>))] +#[visit(drive(&crate::cst::AnonymousAssert<'db>))] +#[visit(drive(&crate::cst::AnonymousAsterisk<'db>))] +#[visit(drive(&crate::cst::AnonymousAsteriskAsterisk<'db>))] +#[visit(drive(&crate::cst::AnonymousAsteriskAsteriskEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAsteriskEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAsync<'db>))] +#[visit(drive(&crate::cst::AnonymousAt<'db>))] +#[visit(drive(&crate::cst::AnonymousAtEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAwait<'db>))] +#[visit(drive(&crate::cst::AnonymousBackslash<'db>))] +#[visit(drive(&crate::cst::AnonymousBangEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousBreak<'db>))] +#[visit(drive(&crate::cst::AnonymousCaret<'db>))] +#[visit(drive(&crate::cst::AnonymousCaretEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousCase<'db>))] +#[visit(drive(&crate::cst::AnonymousClass<'db>))] +#[visit(drive(&crate::cst::AnonymousCloseBrace<'db>))] +#[visit(drive(&crate::cst::AnonymousCloseBracket<'db>))] +#[visit(drive(&crate::cst::AnonymousCloseParen<'db>))] +#[visit(drive(&crate::cst::AnonymousColon<'db>))] +#[visit(drive(&crate::cst::AnonymousColonEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousComma<'db>))] +#[visit(drive(&crate::cst::AnonymousContinue<'db>))] +#[visit(drive(&crate::cst::AnonymousDef<'db>))] +#[visit(drive(&crate::cst::AnonymousDel<'db>))] +#[visit(drive(&crate::cst::AnonymousDot<'db>))] +#[visit(drive(&crate::cst::AnonymousElif<'db>))] +#[visit(drive(&crate::cst::AnonymousElse<'db>))] +#[visit(drive(&crate::cst::AnonymousEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousEqualsEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousExcept<'db>))] +#[visit(drive(&crate::cst::AnonymousExceptAsterisk<'db>))] +#[visit(drive(&crate::cst::AnonymousExec<'db>))] +#[visit(drive(&crate::cst::AnonymousFinally<'db>))] +#[visit(drive(&crate::cst::AnonymousFor<'db>))] +#[visit(drive(&crate::cst::AnonymousFrom<'db>))] +#[visit(drive(&crate::cst::AnonymousFuture<'db>))] +#[visit(drive(&crate::cst::AnonymousGlobal<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanGreaterThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousIf<'db>))] +#[visit(drive(&crate::cst::AnonymousImport<'db>))] +#[visit(drive(&crate::cst::AnonymousIn<'db>))] +#[visit(drive(&crate::cst::AnonymousIs<'db>))] +#[visit(drive(&crate::cst::AnonymousIsNot<'db>))] +#[visit(drive(&crate::cst::AnonymousLambda<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThan<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanLessThan<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanLessThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousMatch<'db>))] +#[visit(drive(&crate::cst::AnonymousMinus<'db>))] +#[visit(drive(&crate::cst::AnonymousMinusEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousMinusGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousNonlocal<'db>))] +#[visit(drive(&crate::cst::AnonymousNot<'db>))] +#[visit(drive(&crate::cst::AnonymousNotIn<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenBrace<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenBracket<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenParen<'db>))] +#[visit(drive(&crate::cst::AnonymousOr<'db>))] +#[visit(drive(&crate::cst::AnonymousPass<'db>))] +#[visit(drive(&crate::cst::AnonymousPercent<'db>))] +#[visit(drive(&crate::cst::AnonymousPercentEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPipe<'db>))] +#[visit(drive(&crate::cst::AnonymousPipeEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPlus<'db>))] +#[visit(drive(&crate::cst::AnonymousPlusEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPrint<'db>))] +#[visit(drive(&crate::cst::AnonymousRaise<'db>))] +#[visit(drive(&crate::cst::AnonymousReturn<'db>))] +#[visit(drive(&crate::cst::AnonymousSemicolon<'db>))] +#[visit(drive(&crate::cst::AnonymousSlash<'db>))] +#[visit(drive(&crate::cst::AnonymousSlashEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousSlashSlash<'db>))] +#[visit(drive(&crate::cst::AnonymousSlashSlashEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousTilde<'db>))] +#[visit(drive(&crate::cst::AnonymousTry<'db>))] +#[visit(drive(&crate::cst::AnonymousType<'db>))] +#[visit(drive(&crate::cst::AnonymousUnderscore<'db>))] +#[visit(drive(&crate::cst::AnonymousWhile<'db>))] +#[visit(drive(&crate::cst::AnonymousWith<'db>))] +#[visit(drive(&crate::cst::AnonymousYield<'db>))] +#[visit(drive(&crate::cst::ArgumentList<'db>))] +#[visit(drive(&crate::cst::ArgumentListChildren<'db>))] +#[visit(drive(&crate::cst::AsPattern<'db>))] +#[visit(drive(&crate::cst::AsPatternChildren<'db>))] +#[visit(drive(&crate::cst::AsPatternTarget<'db>))] +#[visit(drive(&crate::cst::AssertStatement<'db>))] +#[visit(drive(&crate::cst::AssertStatementChildren<'db>))] +#[visit(drive(&crate::cst::Assignment<'db>))] +#[visit(drive(&crate::cst::AssignmentChildren<'db>))] +#[visit(drive(&crate::cst::AssignmentLeft<'db>))] +#[visit(drive(&crate::cst::AssignmentRight<'db>))] +#[visit(drive(&crate::cst::Attribute<'db>))] +#[visit(drive(&crate::cst::AttributeChildren<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignment<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentChildren<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentLeft<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentOperator<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentRight<'db>))] +#[visit(drive(&crate::cst::Await<'db>))] +#[visit(drive(&crate::cst::AwaitChildren<'db>))] +#[visit(drive(&crate::cst::BinaryOperator<'db>))] +#[visit(drive(&crate::cst::BinaryOperatorChildren<'db>))] +#[visit(drive(&crate::cst::BinaryOperatorOperator<'db>))] +#[visit(drive(&crate::cst::Block<'db>))] +#[visit(drive(&crate::cst::BlockChildren<'db>))] +#[visit(drive(&crate::cst::BooleanOperator<'db>))] +#[visit(drive(&crate::cst::BooleanOperatorChildren<'db>))] +#[visit(drive(&crate::cst::BooleanOperatorOperator<'db>))] +#[visit(drive(&crate::cst::BreakStatement<'db>))] +#[visit(drive(&crate::cst::Call<'db>))] +#[visit(drive(&crate::cst::CallArguments<'db>))] +#[visit(drive(&crate::cst::CallChildren<'db>))] +#[visit(drive(&crate::cst::CaseClause<'db>))] +#[visit(drive(&crate::cst::CaseClauseChildren<'db>))] +#[visit(drive(&crate::cst::CasePattern<'db>))] +#[visit(drive(&crate::cst::CasePatternChildren<'db>))] +#[visit(drive(&crate::cst::Chevron<'db>))] +#[visit(drive(&crate::cst::ChevronChildren<'db>))] +#[visit(drive(&crate::cst::ClassDefinitionChildren<'db>))] +#[visit(drive(&crate::cst::ClassPattern<'db>))] +#[visit(drive(&crate::cst::ClassPatternChildren<'db>))] +#[visit(drive(&crate::cst::Comment<'db>))] +#[visit(drive(&crate::cst::ComparisonOperator<'db>))] +#[visit(drive(&crate::cst::ComparisonOperatorChildren<'db>))] +#[visit(drive(&crate::cst::ComparisonOperatorOperators<'db>))] +#[visit(drive(&crate::cst::ComplexPattern<'db>))] +#[visit(drive(&crate::cst::ComplexPatternChildren<'db>))] +#[visit(drive(&crate::cst::CompoundStatement<'db>))] +#[visit(drive(&crate::cst::ConcatenatedString<'db>))] +#[visit(drive(&crate::cst::ConcatenatedStringChildren<'db>))] +#[visit(drive(&crate::cst::ConditionalExpression<'db>))] +#[visit(drive(&crate::cst::ConditionalExpressionChildren<'db>))] +#[visit(drive(&crate::cst::ConstrainedType<'db>))] +#[visit(drive(&crate::cst::ConstrainedTypeChildren<'db>))] +#[visit(drive(&crate::cst::ContinueStatement<'db>))] +#[visit(drive(&crate::cst::DecoratedDefinition<'db>))] +#[visit(drive(&crate::cst::DecoratedDefinitionChildren<'db>))] +#[visit(drive(&crate::cst::DecoratedDefinitionDefinition<'db>))] +#[visit(drive(&crate::cst::Decorator<'db>))] +#[visit(drive(&crate::cst::DecoratorChildren<'db>))] +#[visit(drive(&crate::cst::DefaultParameter<'db>))] +#[visit(drive(&crate::cst::DefaultParameterChildren<'db>))] +#[visit(drive(&crate::cst::DefaultParameterName<'db>))] +#[visit(drive(&crate::cst::DeleteStatement<'db>))] +#[visit(drive(&crate::cst::DeleteStatementChildren<'db>))] +#[visit(drive(&crate::cst::DictPattern<'db>))] +#[visit(drive(&crate::cst::DictPatternChildren<'db>))] +#[visit(drive(&crate::cst::DictPatternKey<'db>))] +#[visit(drive(&crate::cst::Dictionary<'db>))] +#[visit(drive(&crate::cst::DictionaryChildren<'db>))] +#[visit(drive(&crate::cst::DictionaryComprehension<'db>))] +#[visit(drive(&crate::cst::DictionaryComprehensionChildren<'db>))] +#[visit(drive(&crate::cst::DictionarySplat<'db>))] +#[visit(drive(&crate::cst::DictionarySplatChildren<'db>))] +#[visit(drive(&crate::cst::DictionarySplatPattern<'db>))] +#[visit(drive(&crate::cst::DictionarySplatPatternChildren<'db>))] +#[visit(drive(&crate::cst::DottedName<'db>))] +#[visit(drive(&crate::cst::DottedNameChildren<'db>))] +#[visit(drive(&crate::cst::ElifClause<'db>))] +#[visit(drive(&crate::cst::ElifClauseChildren<'db>))] +#[visit(drive(&crate::cst::Ellipsis<'db>))] +#[visit(drive(&crate::cst::ElseClause<'db>))] +#[visit(drive(&crate::cst::ElseClauseChildren<'db>))] +#[visit(drive(&crate::cst::EscapeInterpolation<'db>))] +#[visit(drive(&crate::cst::EscapeSequence<'db>))] +#[visit(drive(&crate::cst::ExceptClause<'db>))] +#[visit(drive(&crate::cst::ExceptClauseChildren<'db>))] +#[visit(drive(&crate::cst::ExceptGroupClause<'db>))] +#[visit(drive(&crate::cst::ExceptGroupClauseChildren<'db>))] +#[visit(drive(&crate::cst::ExecStatement<'db>))] +#[visit(drive(&crate::cst::ExecStatementChildren<'db>))] +#[visit(drive(&crate::cst::ExecStatementCode<'db>))] +#[visit(drive(&crate::cst::Expression<'db>))] +#[visit(drive(&crate::cst::ExpressionList<'db>))] +#[visit(drive(&crate::cst::ExpressionListChildren<'db>))] +#[visit(drive(&crate::cst::ExpressionStatement<'db>))] +#[visit(drive(&crate::cst::ExpressionStatementChildren<'db>))] +#[visit(drive(&crate::cst::False<'db>))] +#[visit(drive(&crate::cst::FinallyClause<'db>))] +#[visit(drive(&crate::cst::FinallyClauseChildren<'db>))] +#[visit(drive(&crate::cst::Float<'db>))] +#[visit(drive(&crate::cst::ForInClause<'db>))] +#[visit(drive(&crate::cst::ForInClauseChildren<'db>))] +#[visit(drive(&crate::cst::ForInClauseLeft<'db>))] +#[visit(drive(&crate::cst::ForInClauseRight<'db>))] +#[visit(drive(&crate::cst::ForStatement<'db>))] +#[visit(drive(&crate::cst::ForStatementChildren<'db>))] +#[visit(drive(&crate::cst::ForStatementLeft<'db>))] +#[visit(drive(&crate::cst::ForStatementRight<'db>))] +#[visit(drive(&crate::cst::FormatExpression<'db>))] +#[visit(drive(&crate::cst::FormatExpressionChildren<'db>))] +#[visit(drive(&crate::cst::FormatExpressionExpression<'db>))] +#[visit(drive(&crate::cst::FormatSpecifier<'db>))] +#[visit(drive(&crate::cst::FormatSpecifierChildren<'db>))] +#[visit(drive(&crate::cst::FunctionDefinitionChildren<'db>))] +#[visit(drive(&crate::cst::FutureImportStatement<'db>))] +#[visit(drive(&crate::cst::FutureImportStatementChildren<'db>))] +#[visit(drive(&crate::cst::FutureImportStatementName<'db>))] +#[visit(drive(&crate::cst::GeneratorExpression<'db>))] +#[visit(drive(&crate::cst::GeneratorExpressionChildren<'db>))] +#[visit(drive(&crate::cst::GenericType<'db>))] +#[visit(drive(&crate::cst::GenericTypeChildren<'db>))] +#[visit(drive(&crate::cst::GlobalStatement<'db>))] +#[visit(drive(&crate::cst::GlobalStatementChildren<'db>))] +#[visit(drive(&crate::cst::Identifier<'db>))] +#[visit(drive(&crate::cst::IfClause<'db>))] +#[visit(drive(&crate::cst::IfClauseChildren<'db>))] +#[visit(drive(&crate::cst::IfStatement<'db>))] +#[visit(drive(&crate::cst::IfStatementAlternative<'db>))] +#[visit(drive(&crate::cst::IfStatementChildren<'db>))] +#[visit(drive(&crate::cst::ImportFromStatement<'db>))] +#[visit(drive(&crate::cst::ImportFromStatementChildren<'db>))] +#[visit(drive(&crate::cst::ImportFromStatementModuleName<'db>))] +#[visit(drive(&crate::cst::ImportFromStatementName<'db>))] +#[visit(drive(&crate::cst::ImportPrefix<'db>))] +#[visit(drive(&crate::cst::ImportStatement<'db>))] +#[visit(drive(&crate::cst::ImportStatementChildren<'db>))] +#[visit(drive(&crate::cst::ImportStatementName<'db>))] +#[visit(drive(&crate::cst::Integer<'db>))] +#[visit(drive(&crate::cst::Interpolation<'db>))] +#[visit(drive(&crate::cst::InterpolationChildren<'db>))] +#[visit(drive(&crate::cst::InterpolationExpression<'db>))] +#[visit(drive(&crate::cst::KeywordArgument<'db>))] +#[visit(drive(&crate::cst::KeywordArgumentChildren<'db>))] +#[visit(drive(&crate::cst::KeywordPattern<'db>))] +#[visit(drive(&crate::cst::KeywordPatternChildren<'db>))] +#[visit(drive(&crate::cst::KeywordSeparator<'db>))] +#[visit(drive(&crate::cst::Lambda<'db>))] +#[visit(drive(&crate::cst::LambdaChildren<'db>))] +#[visit(drive(&crate::cst::LambdaParameters<'db>))] +#[visit(drive(&crate::cst::LambdaParametersChildren<'db>))] +#[visit(drive(&crate::cst::LineContinuation<'db>))] +#[visit(drive(&crate::cst::List<'db>))] +#[visit(drive(&crate::cst::ListChildren<'db>))] +#[visit(drive(&crate::cst::ListComprehension<'db>))] +#[visit(drive(&crate::cst::ListComprehensionChildren<'db>))] +#[visit(drive(&crate::cst::ListPattern<'db>))] +#[visit(drive(&crate::cst::ListPatternChildren<'db>))] +#[visit(drive(&crate::cst::ListSplat<'db>))] +#[visit(drive(&crate::cst::ListSplatChildren<'db>))] +#[visit(drive(&crate::cst::ListSplatPattern<'db>))] +#[visit(drive(&crate::cst::ListSplatPatternChildren<'db>))] +#[visit(drive(&crate::cst::MatchStatement<'db>))] +#[visit(drive(&crate::cst::MatchStatementChildren<'db>))] +#[visit(drive(&crate::cst::MemberType<'db>))] +#[visit(drive(&crate::cst::MemberTypeChildren<'db>))] +#[visit(drive(&crate::cst::ModuleChildren<'db>))] +#[visit(drive(&crate::cst::NamedExpression<'db>))] +#[visit(drive(&crate::cst::NamedExpressionChildren<'db>))] +#[visit(drive(&crate::cst::None<'db>))] +#[visit(drive(&crate::cst::NonlocalStatement<'db>))] +#[visit(drive(&crate::cst::NonlocalStatementChildren<'db>))] +#[visit(drive(&crate::cst::NotOperator<'db>))] +#[visit(drive(&crate::cst::NotOperatorChildren<'db>))] +#[visit(drive(&crate::cst::Pair<'db>))] +#[visit(drive(&crate::cst::PairChildren<'db>))] +#[visit(drive(&crate::cst::Parameter<'db>))] +#[visit(drive(&crate::cst::Parameters<'db>))] +#[visit(drive(&crate::cst::ParametersChildren<'db>))] +#[visit(drive(&crate::cst::ParenthesizedExpression<'db>))] +#[visit(drive(&crate::cst::ParenthesizedExpressionChildren<'db>))] +#[visit(drive(&crate::cst::ParenthesizedListSplat<'db>))] +#[visit(drive(&crate::cst::ParenthesizedListSplatChildren<'db>))] +#[visit(drive(&crate::cst::PassStatement<'db>))] +#[visit(drive(&crate::cst::Pattern<'db>))] +#[visit(drive(&crate::cst::PatternList<'db>))] +#[visit(drive(&crate::cst::PatternListChildren<'db>))] +#[visit(drive(&crate::cst::PositionalSeparator<'db>))] +#[visit(drive(&crate::cst::PrimaryExpression<'db>))] +#[visit(drive(&crate::cst::PrintStatement<'db>))] +#[visit(drive(&crate::cst::PrintStatementChildren<'db>))] +#[visit(drive(&crate::cst::RaiseStatement<'db>))] +#[visit(drive(&crate::cst::RaiseStatementChildren<'db>))] +#[visit(drive(&crate::cst::RelativeImport<'db>))] +#[visit(drive(&crate::cst::RelativeImportChildren<'db>))] +#[visit(drive(&crate::cst::ReturnStatement<'db>))] +#[visit(drive(&crate::cst::ReturnStatementChildren<'db>))] +#[visit(drive(&crate::cst::Set<'db>))] +#[visit(drive(&crate::cst::SetChildren<'db>))] +#[visit(drive(&crate::cst::SetComprehension<'db>))] +#[visit(drive(&crate::cst::SetComprehensionChildren<'db>))] +#[visit(drive(&crate::cst::SimpleStatement<'db>))] +#[visit(drive(&crate::cst::Slice<'db>))] +#[visit(drive(&crate::cst::SliceChildren<'db>))] +#[visit(drive(&crate::cst::SplatPattern<'db>))] +#[visit(drive(&crate::cst::SplatPatternChildren<'db>))] +#[visit(drive(&crate::cst::SplatType<'db>))] +#[visit(drive(&crate::cst::SplatTypeChildren<'db>))] +#[visit(drive(&crate::cst::String<'db>))] +#[visit(drive(&crate::cst::StringChildren<'db>))] +#[visit(drive(&crate::cst::StringContent<'db>))] +#[visit(drive(&crate::cst::StringContentChildren<'db>))] +#[visit(drive(&crate::cst::StringEnd<'db>))] +#[visit(drive(&crate::cst::StringStart<'db>))] +#[visit(drive(&crate::cst::Subscript<'db>))] +#[visit(drive(&crate::cst::SubscriptChildren<'db>))] +#[visit(drive(&crate::cst::SubscriptSubscript<'db>))] +#[visit(drive(&crate::cst::True<'db>))] +#[visit(drive(&crate::cst::TryStatement<'db>))] +#[visit(drive(&crate::cst::TryStatementChildren<'db>))] +#[visit(drive(&crate::cst::Tuple<'db>))] +#[visit(drive(&crate::cst::TupleChildren<'db>))] +#[visit(drive(&crate::cst::TuplePattern<'db>))] +#[visit(drive(&crate::cst::TuplePatternChildren<'db>))] +#[visit(drive(&crate::cst::Type<'db>))] +#[visit(drive(&crate::cst::TypeAliasStatement<'db>))] +#[visit(drive(&crate::cst::TypeAliasStatementChildren<'db>))] +#[visit(drive(&crate::cst::TypeChildren<'db>))] +#[visit(drive(&crate::cst::TypeConversion<'db>))] +#[visit(drive(&crate::cst::TypeParameter<'db>))] +#[visit(drive(&crate::cst::TypeParameterChildren<'db>))] +#[visit(drive(&crate::cst::TypedDefaultParameter<'db>))] +#[visit(drive(&crate::cst::TypedDefaultParameterChildren<'db>))] +#[visit(drive(&crate::cst::TypedParameter<'db>))] +#[visit(drive(&crate::cst::TypedParameterChildren<'db>))] +#[visit(drive(&crate::cst::UnaryOperator<'db>))] +#[visit(drive(&crate::cst::UnaryOperatorChildren<'db>))] +#[visit(drive(&crate::cst::UnaryOperatorOperator<'db>))] +#[visit(drive(&crate::cst::UnionPattern<'db>))] +#[visit(drive(&crate::cst::UnionPatternChildren<'db>))] +#[visit(drive(&crate::cst::UnionType<'db>))] +#[visit(drive(&crate::cst::UnionTypeChildren<'db>))] +#[visit(drive(&crate::cst::WhileStatement<'db>))] +#[visit(drive(&crate::cst::WhileStatementChildren<'db>))] +#[visit(drive(&crate::cst::WildcardImport<'db>))] +#[visit(drive(&crate::cst::WithClause<'db>))] +#[visit(drive(&crate::cst::WithClauseChildren<'db>))] +#[visit(drive(&crate::cst::WithItem<'db>))] +#[visit(drive(&crate::cst::WithItemChildren<'db>))] +#[visit(drive(&crate::cst::WithStatement<'db>))] +#[visit(drive(&crate::cst::WithStatementChildren<'db>))] +#[visit(drive(&crate::cst::Yield<'db>))] +#[visit(drive(&crate::cst::YieldChildren<'db>))] +#[visit(drive(&crate::cst::ClassDefinition<'db>))] +#[visit(drive(&crate::cst::FunctionDefinition<'db>))] +#[visit(drive(&crate::cst::Module<'db>))] +#[visit(drive(crate::cst::AliasedImport<'db>))] +#[visit(drive(crate::cst::AliasedImportChildren<'db>))] +#[visit(drive(crate::cst::AnonymousAmpersand<'db>))] +#[visit(drive(crate::cst::AnonymousAmpersandEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAnd<'db>))] +#[visit(drive(crate::cst::AnonymousAs<'db>))] +#[visit(drive(crate::cst::AnonymousAssert<'db>))] +#[visit(drive(crate::cst::AnonymousAsterisk<'db>))] +#[visit(drive(crate::cst::AnonymousAsteriskAsterisk<'db>))] +#[visit(drive(crate::cst::AnonymousAsteriskAsteriskEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAsteriskEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAsync<'db>))] +#[visit(drive(crate::cst::AnonymousAt<'db>))] +#[visit(drive(crate::cst::AnonymousAtEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAwait<'db>))] +#[visit(drive(crate::cst::AnonymousBackslash<'db>))] +#[visit(drive(crate::cst::AnonymousBangEquals<'db>))] +#[visit(drive(crate::cst::AnonymousBreak<'db>))] +#[visit(drive(crate::cst::AnonymousCaret<'db>))] +#[visit(drive(crate::cst::AnonymousCaretEquals<'db>))] +#[visit(drive(crate::cst::AnonymousCase<'db>))] +#[visit(drive(crate::cst::AnonymousClass<'db>))] +#[visit(drive(crate::cst::AnonymousCloseBrace<'db>))] +#[visit(drive(crate::cst::AnonymousCloseBracket<'db>))] +#[visit(drive(crate::cst::AnonymousCloseParen<'db>))] +#[visit(drive(crate::cst::AnonymousColon<'db>))] +#[visit(drive(crate::cst::AnonymousColonEquals<'db>))] +#[visit(drive(crate::cst::AnonymousComma<'db>))] +#[visit(drive(crate::cst::AnonymousContinue<'db>))] +#[visit(drive(crate::cst::AnonymousDef<'db>))] +#[visit(drive(crate::cst::AnonymousDel<'db>))] +#[visit(drive(crate::cst::AnonymousDot<'db>))] +#[visit(drive(crate::cst::AnonymousElif<'db>))] +#[visit(drive(crate::cst::AnonymousElse<'db>))] +#[visit(drive(crate::cst::AnonymousEquals<'db>))] +#[visit(drive(crate::cst::AnonymousEqualsEquals<'db>))] +#[visit(drive(crate::cst::AnonymousExcept<'db>))] +#[visit(drive(crate::cst::AnonymousExceptAsterisk<'db>))] +#[visit(drive(crate::cst::AnonymousExec<'db>))] +#[visit(drive(crate::cst::AnonymousFinally<'db>))] +#[visit(drive(crate::cst::AnonymousFor<'db>))] +#[visit(drive(crate::cst::AnonymousFrom<'db>))] +#[visit(drive(crate::cst::AnonymousFuture<'db>))] +#[visit(drive(crate::cst::AnonymousGlobal<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanGreaterThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousIf<'db>))] +#[visit(drive(crate::cst::AnonymousImport<'db>))] +#[visit(drive(crate::cst::AnonymousIn<'db>))] +#[visit(drive(crate::cst::AnonymousIs<'db>))] +#[visit(drive(crate::cst::AnonymousIsNot<'db>))] +#[visit(drive(crate::cst::AnonymousLambda<'db>))] +#[visit(drive(crate::cst::AnonymousLessThan<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanLessThan<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanLessThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousMatch<'db>))] +#[visit(drive(crate::cst::AnonymousMinus<'db>))] +#[visit(drive(crate::cst::AnonymousMinusEquals<'db>))] +#[visit(drive(crate::cst::AnonymousMinusGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousNonlocal<'db>))] +#[visit(drive(crate::cst::AnonymousNot<'db>))] +#[visit(drive(crate::cst::AnonymousNotIn<'db>))] +#[visit(drive(crate::cst::AnonymousOpenBrace<'db>))] +#[visit(drive(crate::cst::AnonymousOpenBracket<'db>))] +#[visit(drive(crate::cst::AnonymousOpenParen<'db>))] +#[visit(drive(crate::cst::AnonymousOr<'db>))] +#[visit(drive(crate::cst::AnonymousPass<'db>))] +#[visit(drive(crate::cst::AnonymousPercent<'db>))] +#[visit(drive(crate::cst::AnonymousPercentEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPipe<'db>))] +#[visit(drive(crate::cst::AnonymousPipeEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPlus<'db>))] +#[visit(drive(crate::cst::AnonymousPlusEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPrint<'db>))] +#[visit(drive(crate::cst::AnonymousRaise<'db>))] +#[visit(drive(crate::cst::AnonymousReturn<'db>))] +#[visit(drive(crate::cst::AnonymousSemicolon<'db>))] +#[visit(drive(crate::cst::AnonymousSlash<'db>))] +#[visit(drive(crate::cst::AnonymousSlashEquals<'db>))] +#[visit(drive(crate::cst::AnonymousSlashSlash<'db>))] +#[visit(drive(crate::cst::AnonymousSlashSlashEquals<'db>))] +#[visit(drive(crate::cst::AnonymousTilde<'db>))] +#[visit(drive(crate::cst::AnonymousTry<'db>))] +#[visit(drive(crate::cst::AnonymousType<'db>))] +#[visit(drive(crate::cst::AnonymousUnderscore<'db>))] +#[visit(drive(crate::cst::AnonymousWhile<'db>))] +#[visit(drive(crate::cst::AnonymousWith<'db>))] +#[visit(drive(crate::cst::AnonymousYield<'db>))] +#[visit(drive(crate::cst::ArgumentList<'db>))] +#[visit(drive(crate::cst::ArgumentListChildren<'db>))] +#[visit(drive(crate::cst::AsPattern<'db>))] +#[visit(drive(crate::cst::AsPatternChildren<'db>))] +#[visit(drive(crate::cst::AsPatternTarget<'db>))] +#[visit(drive(crate::cst::AssertStatement<'db>))] +#[visit(drive(crate::cst::AssertStatementChildren<'db>))] +#[visit(drive(crate::cst::Assignment<'db>))] +#[visit(drive(crate::cst::AssignmentChildren<'db>))] +#[visit(drive(crate::cst::AssignmentLeft<'db>))] +#[visit(drive(crate::cst::AssignmentRight<'db>))] +#[visit(drive(crate::cst::Attribute<'db>))] +#[visit(drive(crate::cst::AttributeChildren<'db>))] +#[visit(drive(crate::cst::AugmentedAssignment<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentChildren<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentLeft<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentOperator<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentRight<'db>))] +#[visit(drive(crate::cst::Await<'db>))] +#[visit(drive(crate::cst::AwaitChildren<'db>))] +#[visit(drive(crate::cst::BinaryOperator<'db>))] +#[visit(drive(crate::cst::BinaryOperatorChildren<'db>))] +#[visit(drive(crate::cst::BinaryOperatorOperator<'db>))] +#[visit(drive(crate::cst::Block<'db>))] +#[visit(drive(crate::cst::BlockChildren<'db>))] +#[visit(drive(crate::cst::BooleanOperator<'db>))] +#[visit(drive(crate::cst::BooleanOperatorChildren<'db>))] +#[visit(drive(crate::cst::BooleanOperatorOperator<'db>))] +#[visit(drive(crate::cst::BreakStatement<'db>))] +#[visit(drive(crate::cst::Call<'db>))] +#[visit(drive(crate::cst::CallArguments<'db>))] +#[visit(drive(crate::cst::CallChildren<'db>))] +#[visit(drive(crate::cst::CaseClause<'db>))] +#[visit(drive(crate::cst::CaseClauseChildren<'db>))] +#[visit(drive(crate::cst::CasePattern<'db>))] +#[visit(drive(crate::cst::CasePatternChildren<'db>))] +#[visit(drive(crate::cst::Chevron<'db>))] +#[visit(drive(crate::cst::ChevronChildren<'db>))] +#[visit(drive(crate::cst::ClassDefinitionChildren<'db>))] +#[visit(drive(crate::cst::ClassPattern<'db>))] +#[visit(drive(crate::cst::ClassPatternChildren<'db>))] +#[visit(drive(crate::cst::Comment<'db>))] +#[visit(drive(crate::cst::ComparisonOperator<'db>))] +#[visit(drive(crate::cst::ComparisonOperatorChildren<'db>))] +#[visit(drive(crate::cst::ComparisonOperatorOperators<'db>))] +#[visit(drive(crate::cst::ComplexPattern<'db>))] +#[visit(drive(crate::cst::ComplexPatternChildren<'db>))] +#[visit(drive(crate::cst::CompoundStatement<'db>))] +#[visit(drive(crate::cst::ConcatenatedString<'db>))] +#[visit(drive(crate::cst::ConcatenatedStringChildren<'db>))] +#[visit(drive(crate::cst::ConditionalExpression<'db>))] +#[visit(drive(crate::cst::ConditionalExpressionChildren<'db>))] +#[visit(drive(crate::cst::ConstrainedType<'db>))] +#[visit(drive(crate::cst::ConstrainedTypeChildren<'db>))] +#[visit(drive(crate::cst::ContinueStatement<'db>))] +#[visit(drive(crate::cst::DecoratedDefinition<'db>))] +#[visit(drive(crate::cst::DecoratedDefinitionChildren<'db>))] +#[visit(drive(crate::cst::DecoratedDefinitionDefinition<'db>))] +#[visit(drive(crate::cst::Decorator<'db>))] +#[visit(drive(crate::cst::DecoratorChildren<'db>))] +#[visit(drive(crate::cst::DefaultParameter<'db>))] +#[visit(drive(crate::cst::DefaultParameterChildren<'db>))] +#[visit(drive(crate::cst::DefaultParameterName<'db>))] +#[visit(drive(crate::cst::DeleteStatement<'db>))] +#[visit(drive(crate::cst::DeleteStatementChildren<'db>))] +#[visit(drive(crate::cst::DictPattern<'db>))] +#[visit(drive(crate::cst::DictPatternChildren<'db>))] +#[visit(drive(crate::cst::DictPatternKey<'db>))] +#[visit(drive(crate::cst::Dictionary<'db>))] +#[visit(drive(crate::cst::DictionaryChildren<'db>))] +#[visit(drive(crate::cst::DictionaryComprehension<'db>))] +#[visit(drive(crate::cst::DictionaryComprehensionChildren<'db>))] +#[visit(drive(crate::cst::DictionarySplat<'db>))] +#[visit(drive(crate::cst::DictionarySplatChildren<'db>))] +#[visit(drive(crate::cst::DictionarySplatPattern<'db>))] +#[visit(drive(crate::cst::DictionarySplatPatternChildren<'db>))] +#[visit(drive(crate::cst::DottedName<'db>))] +#[visit(drive(crate::cst::DottedNameChildren<'db>))] +#[visit(drive(crate::cst::ElifClause<'db>))] +#[visit(drive(crate::cst::ElifClauseChildren<'db>))] +#[visit(drive(crate::cst::Ellipsis<'db>))] +#[visit(drive(crate::cst::ElseClause<'db>))] +#[visit(drive(crate::cst::ElseClauseChildren<'db>))] +#[visit(drive(crate::cst::EscapeInterpolation<'db>))] +#[visit(drive(crate::cst::EscapeSequence<'db>))] +#[visit(drive(crate::cst::ExceptClause<'db>))] +#[visit(drive(crate::cst::ExceptClauseChildren<'db>))] +#[visit(drive(crate::cst::ExceptGroupClause<'db>))] +#[visit(drive(crate::cst::ExceptGroupClauseChildren<'db>))] +#[visit(drive(crate::cst::ExecStatement<'db>))] +#[visit(drive(crate::cst::ExecStatementChildren<'db>))] +#[visit(drive(crate::cst::ExecStatementCode<'db>))] +#[visit(drive(crate::cst::Expression<'db>))] +#[visit(drive(crate::cst::ExpressionList<'db>))] +#[visit(drive(crate::cst::ExpressionListChildren<'db>))] +#[visit(drive(crate::cst::ExpressionStatement<'db>))] +#[visit(drive(crate::cst::ExpressionStatementChildren<'db>))] +#[visit(drive(crate::cst::False<'db>))] +#[visit(drive(crate::cst::FinallyClause<'db>))] +#[visit(drive(crate::cst::FinallyClauseChildren<'db>))] +#[visit(drive(crate::cst::Float<'db>))] +#[visit(drive(crate::cst::ForInClause<'db>))] +#[visit(drive(crate::cst::ForInClauseChildren<'db>))] +#[visit(drive(crate::cst::ForInClauseLeft<'db>))] +#[visit(drive(crate::cst::ForInClauseRight<'db>))] +#[visit(drive(crate::cst::ForStatement<'db>))] +#[visit(drive(crate::cst::ForStatementChildren<'db>))] +#[visit(drive(crate::cst::ForStatementLeft<'db>))] +#[visit(drive(crate::cst::ForStatementRight<'db>))] +#[visit(drive(crate::cst::FormatExpression<'db>))] +#[visit(drive(crate::cst::FormatExpressionChildren<'db>))] +#[visit(drive(crate::cst::FormatExpressionExpression<'db>))] +#[visit(drive(crate::cst::FormatSpecifier<'db>))] +#[visit(drive(crate::cst::FormatSpecifierChildren<'db>))] +#[visit(drive(crate::cst::FunctionDefinitionChildren<'db>))] +#[visit(drive(crate::cst::FutureImportStatement<'db>))] +#[visit(drive(crate::cst::FutureImportStatementChildren<'db>))] +#[visit(drive(crate::cst::FutureImportStatementName<'db>))] +#[visit(drive(crate::cst::GeneratorExpression<'db>))] +#[visit(drive(crate::cst::GeneratorExpressionChildren<'db>))] +#[visit(drive(crate::cst::GenericType<'db>))] +#[visit(drive(crate::cst::GenericTypeChildren<'db>))] +#[visit(drive(crate::cst::GlobalStatement<'db>))] +#[visit(drive(crate::cst::GlobalStatementChildren<'db>))] +#[visit(drive(crate::cst::Identifier<'db>))] +#[visit(drive(crate::cst::IfClause<'db>))] +#[visit(drive(crate::cst::IfClauseChildren<'db>))] +#[visit(drive(crate::cst::IfStatement<'db>))] +#[visit(drive(crate::cst::IfStatementAlternative<'db>))] +#[visit(drive(crate::cst::IfStatementChildren<'db>))] +#[visit(drive(crate::cst::ImportFromStatement<'db>))] +#[visit(drive(crate::cst::ImportFromStatementChildren<'db>))] +#[visit(drive(crate::cst::ImportFromStatementModuleName<'db>))] +#[visit(drive(crate::cst::ImportFromStatementName<'db>))] +#[visit(drive(crate::cst::ImportPrefix<'db>))] +#[visit(drive(crate::cst::ImportStatement<'db>))] +#[visit(drive(crate::cst::ImportStatementChildren<'db>))] +#[visit(drive(crate::cst::ImportStatementName<'db>))] +#[visit(drive(crate::cst::Integer<'db>))] +#[visit(drive(crate::cst::Interpolation<'db>))] +#[visit(drive(crate::cst::InterpolationChildren<'db>))] +#[visit(drive(crate::cst::InterpolationExpression<'db>))] +#[visit(drive(crate::cst::KeywordArgument<'db>))] +#[visit(drive(crate::cst::KeywordArgumentChildren<'db>))] +#[visit(drive(crate::cst::KeywordPattern<'db>))] +#[visit(drive(crate::cst::KeywordPatternChildren<'db>))] +#[visit(drive(crate::cst::KeywordSeparator<'db>))] +#[visit(drive(crate::cst::Lambda<'db>))] +#[visit(drive(crate::cst::LambdaChildren<'db>))] +#[visit(drive(crate::cst::LambdaParameters<'db>))] +#[visit(drive(crate::cst::LambdaParametersChildren<'db>))] +#[visit(drive(crate::cst::LineContinuation<'db>))] +#[visit(drive(crate::cst::List<'db>))] +#[visit(drive(crate::cst::ListChildren<'db>))] +#[visit(drive(crate::cst::ListComprehension<'db>))] +#[visit(drive(crate::cst::ListComprehensionChildren<'db>))] +#[visit(drive(crate::cst::ListPattern<'db>))] +#[visit(drive(crate::cst::ListPatternChildren<'db>))] +#[visit(drive(crate::cst::ListSplat<'db>))] +#[visit(drive(crate::cst::ListSplatChildren<'db>))] +#[visit(drive(crate::cst::ListSplatPattern<'db>))] +#[visit(drive(crate::cst::ListSplatPatternChildren<'db>))] +#[visit(drive(crate::cst::MatchStatement<'db>))] +#[visit(drive(crate::cst::MatchStatementChildren<'db>))] +#[visit(drive(crate::cst::MemberType<'db>))] +#[visit(drive(crate::cst::MemberTypeChildren<'db>))] +#[visit(drive(crate::cst::ModuleChildren<'db>))] +#[visit(drive(crate::cst::NamedExpression<'db>))] +#[visit(drive(crate::cst::NamedExpressionChildren<'db>))] +#[visit(drive(crate::cst::None<'db>))] +#[visit(drive(crate::cst::NonlocalStatement<'db>))] +#[visit(drive(crate::cst::NonlocalStatementChildren<'db>))] +#[visit(drive(crate::cst::NotOperator<'db>))] +#[visit(drive(crate::cst::NotOperatorChildren<'db>))] +#[visit(drive(crate::cst::Pair<'db>))] +#[visit(drive(crate::cst::PairChildren<'db>))] +#[visit(drive(crate::cst::Parameter<'db>))] +#[visit(drive(crate::cst::Parameters<'db>))] +#[visit(drive(crate::cst::ParametersChildren<'db>))] +#[visit(drive(crate::cst::ParenthesizedExpression<'db>))] +#[visit(drive(crate::cst::ParenthesizedExpressionChildren<'db>))] +#[visit(drive(crate::cst::ParenthesizedListSplat<'db>))] +#[visit(drive(crate::cst::ParenthesizedListSplatChildren<'db>))] +#[visit(drive(crate::cst::PassStatement<'db>))] +#[visit(drive(crate::cst::Pattern<'db>))] +#[visit(drive(crate::cst::PatternList<'db>))] +#[visit(drive(crate::cst::PatternListChildren<'db>))] +#[visit(drive(crate::cst::PositionalSeparator<'db>))] +#[visit(drive(crate::cst::PrimaryExpression<'db>))] +#[visit(drive(crate::cst::PrintStatement<'db>))] +#[visit(drive(crate::cst::PrintStatementChildren<'db>))] +#[visit(drive(crate::cst::RaiseStatement<'db>))] +#[visit(drive(crate::cst::RaiseStatementChildren<'db>))] +#[visit(drive(crate::cst::RelativeImport<'db>))] +#[visit(drive(crate::cst::RelativeImportChildren<'db>))] +#[visit(drive(crate::cst::ReturnStatement<'db>))] +#[visit(drive(crate::cst::ReturnStatementChildren<'db>))] +#[visit(drive(crate::cst::Set<'db>))] +#[visit(drive(crate::cst::SetChildren<'db>))] +#[visit(drive(crate::cst::SetComprehension<'db>))] +#[visit(drive(crate::cst::SetComprehensionChildren<'db>))] +#[visit(drive(crate::cst::SimpleStatement<'db>))] +#[visit(drive(crate::cst::Slice<'db>))] +#[visit(drive(crate::cst::SliceChildren<'db>))] +#[visit(drive(crate::cst::SplatPattern<'db>))] +#[visit(drive(crate::cst::SplatPatternChildren<'db>))] +#[visit(drive(crate::cst::SplatType<'db>))] +#[visit(drive(crate::cst::SplatTypeChildren<'db>))] +#[visit(drive(crate::cst::String<'db>))] +#[visit(drive(crate::cst::StringChildren<'db>))] +#[visit(drive(crate::cst::StringContent<'db>))] +#[visit(drive(crate::cst::StringContentChildren<'db>))] +#[visit(drive(crate::cst::StringEnd<'db>))] +#[visit(drive(crate::cst::StringStart<'db>))] +#[visit(drive(crate::cst::Subscript<'db>))] +#[visit(drive(crate::cst::SubscriptChildren<'db>))] +#[visit(drive(crate::cst::SubscriptSubscript<'db>))] +#[visit(drive(crate::cst::True<'db>))] +#[visit(drive(crate::cst::TryStatement<'db>))] +#[visit(drive(crate::cst::TryStatementChildren<'db>))] +#[visit(drive(crate::cst::Tuple<'db>))] +#[visit(drive(crate::cst::TupleChildren<'db>))] +#[visit(drive(crate::cst::TuplePattern<'db>))] +#[visit(drive(crate::cst::TuplePatternChildren<'db>))] +#[visit(drive(crate::cst::Type<'db>))] +#[visit(drive(crate::cst::TypeAliasStatement<'db>))] +#[visit(drive(crate::cst::TypeAliasStatementChildren<'db>))] +#[visit(drive(crate::cst::TypeChildren<'db>))] +#[visit(drive(crate::cst::TypeConversion<'db>))] +#[visit(drive(crate::cst::TypeParameter<'db>))] +#[visit(drive(crate::cst::TypeParameterChildren<'db>))] +#[visit(drive(crate::cst::TypedDefaultParameter<'db>))] +#[visit(drive(crate::cst::TypedDefaultParameterChildren<'db>))] +#[visit(drive(crate::cst::TypedParameter<'db>))] +#[visit(drive(crate::cst::TypedParameterChildren<'db>))] +#[visit(drive(crate::cst::UnaryOperator<'db>))] +#[visit(drive(crate::cst::UnaryOperatorChildren<'db>))] +#[visit(drive(crate::cst::UnaryOperatorOperator<'db>))] +#[visit(drive(crate::cst::UnionPattern<'db>))] +#[visit(drive(crate::cst::UnionPatternChildren<'db>))] +#[visit(drive(crate::cst::UnionType<'db>))] +#[visit(drive(crate::cst::UnionTypeChildren<'db>))] +#[visit(drive(crate::cst::WhileStatement<'db>))] +#[visit(drive(crate::cst::WhileStatementChildren<'db>))] +#[visit(drive(crate::cst::WildcardImport<'db>))] +#[visit(drive(crate::cst::WithClause<'db>))] +#[visit(drive(crate::cst::WithClauseChildren<'db>))] +#[visit(drive(crate::cst::WithItem<'db>))] +#[visit(drive(crate::cst::WithItemChildren<'db>))] +#[visit(drive(crate::cst::WithStatement<'db>))] +#[visit(drive(crate::cst::WithStatementChildren<'db>))] +#[visit(drive(crate::cst::Yield<'db>))] +#[visit(drive(crate::cst::YieldChildren<'db>))] +#[visit(drive(forBox))] +#[visit(drive(forVec))] +#[visit(drive(forOption))] +#[visit( + enter(ClassDefinition:crate::cst::ClassDefinition<'db>), + enter(FunctionDefinition:crate::cst::FunctionDefinition<'db>), + enter(Module:crate::cst::Module<'db>) +)] +pub struct Definitions<'db> { + pub classes: BTreeMap>>, + pub constants: BTreeMap>>, + pub functions: BTreeMap>>, + phantom: std::marker::PhantomData<&'db ()>, +} +impl<'db> Definitions<'db> { + fn enter_ClassDefinition(&mut self, node: &crate::cst::ClassDefinition<'db>) { + ///Code for query: (class_definition name: (identifier) @name) @definition.class + let name = &*node.name; + self.classes.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } + fn enter_FunctionDefinition(&mut self, node: &crate::cst::FunctionDefinition<'db>) { + ///Code for query: (function_definition name: (identifier) @name) @definition.function + let name = &*node.name; + self.functions.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } + fn enter_Module(&mut self, node: &crate::cst::Module<'db>) { + ///Code for query: (module (expression_statement (assignment left: (identifier) @name) @definition.constant)) + for child in node.children().into_iter() { + if let crate::cst::ModuleChildren::ExpressionStatement(child) = child { + ///Code for query: (module (expression_statement (assignment left: (identifier) @name) @definition.constant)) + for child in child.children().into_iter() { + if let crate::cst::ExpressionStatementChildren::Assignment(child) = child { + ///Code for query: (module (expression_statement (assignment left: (identifier) @name) @definition.constant)) + let left = &*child.left; + self.constants + .entry(left.source()) + .or_insert(Vec::new()) + .push(node.clone()); + } + break; + } + } + break; + } + } +} diff --git a/codegen-sdk-ast-generator/src/snapshots/codegen_sdk_ast_generator__visitor__tests__typescript.snap b/codegen-sdk-ast-generator/src/snapshots/codegen_sdk_ast_generator__visitor__tests__typescript.snap new file mode 100644 index 0000000..ed0a100 --- /dev/null +++ b/codegen-sdk-ast-generator/src/snapshots/codegen_sdk_ast_generator__visitor__tests__typescript.snap @@ -0,0 +1,1118 @@ +--- +source: codegen-sdk-ast-generator/src/visitor.rs +expression: "codegen_sdk_common::generator::format_code_string(&visitor.to_string()).unwrap()" +--- +#[derive(Visitor, Visit, Debug, Clone, Eq, PartialEq, salsa::Update, Hash, Default)] +#[visit(drive(&crate::cst::AbstractClassDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::AbstractMethodSignatureChildren<'db>))] +#[visit(drive(&crate::cst::AbstractMethodSignatureName<'db>))] +#[visit(drive(&crate::cst::AbstractMethodSignatureReturnType<'db>))] +#[visit(drive(&crate::cst::AccessibilityModifier<'db>))] +#[visit(drive(&crate::cst::AddingTypeAnnotation<'db>))] +#[visit(drive(&crate::cst::AddingTypeAnnotationChildren<'db>))] +#[visit(drive(&crate::cst::AmbientDeclaration<'db>))] +#[visit(drive(&crate::cst::AmbientDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::AnonymousAbstract<'db>))] +#[visit(drive(&crate::cst::AnonymousAccessor<'db>))] +#[visit(drive(&crate::cst::AnonymousAmpersand<'db>))] +#[visit(drive(&crate::cst::AnonymousAmpersandAmpersand<'db>))] +#[visit(drive(&crate::cst::AnonymousAmpersandAmpersandEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAmpersandEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAny<'db>))] +#[visit(drive(&crate::cst::AnonymousAs<'db>))] +#[visit(drive(&crate::cst::AnonymousAssert<'db>))] +#[visit(drive(&crate::cst::AnonymousAsserts<'db>))] +#[visit(drive(&crate::cst::AnonymousAsterisk<'db>))] +#[visit(drive(&crate::cst::AnonymousAsteriskAsterisk<'db>))] +#[visit(drive(&crate::cst::AnonymousAsteriskAsteriskEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAsteriskEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousAsync<'db>))] +#[visit(drive(&crate::cst::AnonymousAt<'db>))] +#[visit(drive(&crate::cst::AnonymousAwait<'db>))] +#[visit(drive(&crate::cst::AnonymousBacktick<'db>))] +#[visit(drive(&crate::cst::AnonymousBang<'db>))] +#[visit(drive(&crate::cst::AnonymousBangEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousBangEqualsEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousBoolean<'db>))] +#[visit(drive(&crate::cst::AnonymousBreak<'db>))] +#[visit(drive(&crate::cst::AnonymousCaret<'db>))] +#[visit(drive(&crate::cst::AnonymousCaretEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousCase<'db>))] +#[visit(drive(&crate::cst::AnonymousCatch<'db>))] +#[visit(drive(&crate::cst::AnonymousClass<'db>))] +#[visit(drive(&crate::cst::AnonymousCloseBrace<'db>))] +#[visit(drive(&crate::cst::AnonymousCloseBracket<'db>))] +#[visit(drive(&crate::cst::AnonymousCloseParen<'db>))] +#[visit(drive(&crate::cst::AnonymousColon<'db>))] +#[visit(drive(&crate::cst::AnonymousComma<'db>))] +#[visit(drive(&crate::cst::AnonymousConst<'db>))] +#[visit(drive(&crate::cst::AnonymousContinue<'db>))] +#[visit(drive(&crate::cst::AnonymousDebugger<'db>))] +#[visit(drive(&crate::cst::AnonymousDeclare<'db>))] +#[visit(drive(&crate::cst::AnonymousDefault<'db>))] +#[visit(drive(&crate::cst::AnonymousDelete<'db>))] +#[visit(drive(&crate::cst::AnonymousDo<'db>))] +#[visit(drive(&crate::cst::AnonymousDollarOpenBrace<'db>))] +#[visit(drive(&crate::cst::AnonymousDot<'db>))] +#[visit(drive(&crate::cst::AnonymousDotDotDot<'db>))] +#[visit(drive(&crate::cst::AnonymousDoubleQuote<'db>))] +#[visit(drive(&crate::cst::AnonymousElse<'db>))] +#[visit(drive(&crate::cst::AnonymousEnum<'db>))] +#[visit(drive(&crate::cst::AnonymousEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousEqualsEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousEqualsEqualsEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousEqualsGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousExport<'db>))] +#[visit(drive(&crate::cst::AnonymousExtends<'db>))] +#[visit(drive(&crate::cst::AnonymousFinally<'db>))] +#[visit(drive(&crate::cst::AnonymousFor<'db>))] +#[visit(drive(&crate::cst::AnonymousFrom<'db>))] +#[visit(drive(&crate::cst::AnonymousFunction<'db>))] +#[visit(drive(&crate::cst::AnonymousGet<'db>))] +#[visit(drive(&crate::cst::AnonymousGlobal<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanGreaterThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanGreaterThanGreaterThan<'db>))] +#[visit(drive(&crate::cst::AnonymousGreaterThanGreaterThanGreaterThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousIf<'db>))] +#[visit(drive(&crate::cst::AnonymousImplements<'db>))] +#[visit(drive(&crate::cst::AnonymousImport<'db>))] +#[visit(drive(&crate::cst::AnonymousIn<'db>))] +#[visit(drive(&crate::cst::AnonymousInfer<'db>))] +#[visit(drive(&crate::cst::AnonymousInstanceof<'db>))] +#[visit(drive(&crate::cst::AnonymousInterface<'db>))] +#[visit(drive(&crate::cst::AnonymousIs<'db>))] +#[visit(drive(&crate::cst::AnonymousKeyof<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThan<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanLessThan<'db>))] +#[visit(drive(&crate::cst::AnonymousLessThanLessThanEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousLet<'db>))] +#[visit(drive(&crate::cst::AnonymousMeta<'db>))] +#[visit(drive(&crate::cst::AnonymousMinus<'db>))] +#[visit(drive(&crate::cst::AnonymousMinusEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousMinusMinus<'db>))] +#[visit(drive(&crate::cst::AnonymousMinusQuestionMarkColon<'db>))] +#[visit(drive(&crate::cst::AnonymousModule<'db>))] +#[visit(drive(&crate::cst::AnonymousNamespace<'db>))] +#[visit(drive(&crate::cst::AnonymousNever<'db>))] +#[visit(drive(&crate::cst::AnonymousNew<'db>))] +#[visit(drive(&crate::cst::AnonymousNumber<'db>))] +#[visit(drive(&crate::cst::AnonymousObject<'db>))] +#[visit(drive(&crate::cst::AnonymousOf<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenBrace<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenBracePipe<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenBracket<'db>))] +#[visit(drive(&crate::cst::AnonymousOpenParen<'db>))] +#[visit(drive(&crate::cst::AnonymousOverride<'db>))] +#[visit(drive(&crate::cst::AnonymousPercent<'db>))] +#[visit(drive(&crate::cst::AnonymousPercentEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPipe<'db>))] +#[visit(drive(&crate::cst::AnonymousPipeCloseBrace<'db>))] +#[visit(drive(&crate::cst::AnonymousPipeEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPipePipe<'db>))] +#[visit(drive(&crate::cst::AnonymousPipePipeEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPlus<'db>))] +#[visit(drive(&crate::cst::AnonymousPlusEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousPlusPlus<'db>))] +#[visit(drive(&crate::cst::AnonymousPlusQuestionMarkColon<'db>))] +#[visit(drive(&crate::cst::AnonymousPrivate<'db>))] +#[visit(drive(&crate::cst::AnonymousProtected<'db>))] +#[visit(drive(&crate::cst::AnonymousPublic<'db>))] +#[visit(drive(&crate::cst::AnonymousQuestionMark<'db>))] +#[visit(drive(&crate::cst::AnonymousQuestionMarkColon<'db>))] +#[visit(drive(&crate::cst::AnonymousQuestionMarkDot<'db>))] +#[visit(drive(&crate::cst::AnonymousQuestionMarkQuestionMark<'db>))] +#[visit(drive(&crate::cst::AnonymousQuestionMarkQuestionMarkEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousReadonly<'db>))] +#[visit(drive(&crate::cst::AnonymousRequire<'db>))] +#[visit(drive(&crate::cst::AnonymousReturn<'db>))] +#[visit(drive(&crate::cst::AnonymousSatisfies<'db>))] +#[visit(drive(&crate::cst::AnonymousSemicolon<'db>))] +#[visit(drive(&crate::cst::AnonymousSet<'db>))] +#[visit(drive(&crate::cst::AnonymousSingleQuote<'db>))] +#[visit(drive(&crate::cst::AnonymousSlash<'db>))] +#[visit(drive(&crate::cst::AnonymousSlashEquals<'db>))] +#[visit(drive(&crate::cst::AnonymousStatic<'db>))] +#[visit(drive(&crate::cst::AnonymousString<'db>))] +#[visit(drive(&crate::cst::AnonymousSwitch<'db>))] +#[visit(drive(&crate::cst::AnonymousSymbol<'db>))] +#[visit(drive(&crate::cst::AnonymousTarget<'db>))] +#[visit(drive(&crate::cst::AnonymousThrow<'db>))] +#[visit(drive(&crate::cst::AnonymousTilde<'db>))] +#[visit(drive(&crate::cst::AnonymousTry<'db>))] +#[visit(drive(&crate::cst::AnonymousType<'db>))] +#[visit(drive(&crate::cst::AnonymousTypeof<'db>))] +#[visit(drive(&crate::cst::AnonymousUniqueSymbol<'db>))] +#[visit(drive(&crate::cst::AnonymousUnknown<'db>))] +#[visit(drive(&crate::cst::AnonymousUsing<'db>))] +#[visit(drive(&crate::cst::AnonymousVar<'db>))] +#[visit(drive(&crate::cst::AnonymousVoid<'db>))] +#[visit(drive(&crate::cst::AnonymousWhile<'db>))] +#[visit(drive(&crate::cst::AnonymousWith<'db>))] +#[visit(drive(&crate::cst::AnonymousYield<'db>))] +#[visit(drive(&crate::cst::Arguments<'db>))] +#[visit(drive(&crate::cst::ArgumentsChildren<'db>))] +#[visit(drive(&crate::cst::Array<'db>))] +#[visit(drive(&crate::cst::ArrayChildren<'db>))] +#[visit(drive(&crate::cst::ArrayPattern<'db>))] +#[visit(drive(&crate::cst::ArrayPatternChildren<'db>))] +#[visit(drive(&crate::cst::ArrayType<'db>))] +#[visit(drive(&crate::cst::ArrayTypeChildren<'db>))] +#[visit(drive(&crate::cst::ArrowFunction<'db>))] +#[visit(drive(&crate::cst::ArrowFunctionBody<'db>))] +#[visit(drive(&crate::cst::ArrowFunctionChildren<'db>))] +#[visit(drive(&crate::cst::ArrowFunctionReturnType<'db>))] +#[visit(drive(&crate::cst::AsExpression<'db>))] +#[visit(drive(&crate::cst::AsExpressionChildren<'db>))] +#[visit(drive(&crate::cst::Asserts<'db>))] +#[visit(drive(&crate::cst::AssertsAnnotation<'db>))] +#[visit(drive(&crate::cst::AssertsAnnotationChildren<'db>))] +#[visit(drive(&crate::cst::AssertsChildren<'db>))] +#[visit(drive(&crate::cst::AssignmentExpression<'db>))] +#[visit(drive(&crate::cst::AssignmentExpressionChildren<'db>))] +#[visit(drive(&crate::cst::AssignmentExpressionLeft<'db>))] +#[visit(drive(&crate::cst::AssignmentPattern<'db>))] +#[visit(drive(&crate::cst::AssignmentPatternChildren<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentExpression<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentExpressionChildren<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentExpressionLeft<'db>))] +#[visit(drive(&crate::cst::AugmentedAssignmentExpressionOperator<'db>))] +#[visit(drive(&crate::cst::AwaitExpression<'db>))] +#[visit(drive(&crate::cst::AwaitExpressionChildren<'db>))] +#[visit(drive(&crate::cst::BinaryExpression<'db>))] +#[visit(drive(&crate::cst::BinaryExpressionChildren<'db>))] +#[visit(drive(&crate::cst::BinaryExpressionLeft<'db>))] +#[visit(drive(&crate::cst::BinaryExpressionOperator<'db>))] +#[visit(drive(&crate::cst::BreakStatement<'db>))] +#[visit(drive(&crate::cst::BreakStatementChildren<'db>))] +#[visit(drive(&crate::cst::CallExpression<'db>))] +#[visit(drive(&crate::cst::CallExpressionArguments<'db>))] +#[visit(drive(&crate::cst::CallExpressionChildren<'db>))] +#[visit(drive(&crate::cst::CallExpressionFunction<'db>))] +#[visit(drive(&crate::cst::CallSignature<'db>))] +#[visit(drive(&crate::cst::CallSignatureChildren<'db>))] +#[visit(drive(&crate::cst::CallSignatureReturnType<'db>))] +#[visit(drive(&crate::cst::CatchClause<'db>))] +#[visit(drive(&crate::cst::CatchClauseChildren<'db>))] +#[visit(drive(&crate::cst::CatchClauseParameter<'db>))] +#[visit(drive(&crate::cst::Class<'db>))] +#[visit(drive(&crate::cst::ClassBody<'db>))] +#[visit(drive(&crate::cst::ClassBodyChildren<'db>))] +#[visit(drive(&crate::cst::ClassChildren<'db>))] +#[visit(drive(&crate::cst::ClassDeclaration<'db>))] +#[visit(drive(&crate::cst::ClassDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::ClassHeritage<'db>))] +#[visit(drive(&crate::cst::ClassHeritageChildren<'db>))] +#[visit(drive(&crate::cst::ClassStaticBlock<'db>))] +#[visit(drive(&crate::cst::ClassStaticBlockChildren<'db>))] +#[visit(drive(&crate::cst::Comment<'db>))] +#[visit(drive(&crate::cst::ComputedPropertyName<'db>))] +#[visit(drive(&crate::cst::ComputedPropertyNameChildren<'db>))] +#[visit(drive(&crate::cst::ConditionalType<'db>))] +#[visit(drive(&crate::cst::ConditionalTypeChildren<'db>))] +#[visit(drive(&crate::cst::Constraint<'db>))] +#[visit(drive(&crate::cst::ConstraintChildren<'db>))] +#[visit(drive(&crate::cst::ConstructSignature<'db>))] +#[visit(drive(&crate::cst::ConstructSignatureChildren<'db>))] +#[visit(drive(&crate::cst::ConstructorType<'db>))] +#[visit(drive(&crate::cst::ConstructorTypeChildren<'db>))] +#[visit(drive(&crate::cst::ContinueStatement<'db>))] +#[visit(drive(&crate::cst::ContinueStatementChildren<'db>))] +#[visit(drive(&crate::cst::DebuggerStatement<'db>))] +#[visit(drive(&crate::cst::Declaration<'db>))] +#[visit(drive(&crate::cst::Decorator<'db>))] +#[visit(drive(&crate::cst::DecoratorChildren<'db>))] +#[visit(drive(&crate::cst::DefaultType<'db>))] +#[visit(drive(&crate::cst::DefaultTypeChildren<'db>))] +#[visit(drive(&crate::cst::DoStatement<'db>))] +#[visit(drive(&crate::cst::DoStatementChildren<'db>))] +#[visit(drive(&crate::cst::ElseClause<'db>))] +#[visit(drive(&crate::cst::ElseClauseChildren<'db>))] +#[visit(drive(&crate::cst::EmptyStatement<'db>))] +#[visit(drive(&crate::cst::EnumAssignment<'db>))] +#[visit(drive(&crate::cst::EnumAssignmentChildren<'db>))] +#[visit(drive(&crate::cst::EnumAssignmentName<'db>))] +#[visit(drive(&crate::cst::EnumBody<'db>))] +#[visit(drive(&crate::cst::EnumBodyChildren<'db>))] +#[visit(drive(&crate::cst::EnumBodyName<'db>))] +#[visit(drive(&crate::cst::EnumDeclaration<'db>))] +#[visit(drive(&crate::cst::EnumDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::EscapeSequence<'db>))] +#[visit(drive(&crate::cst::ExistentialType<'db>))] +#[visit(drive(&crate::cst::ExportClause<'db>))] +#[visit(drive(&crate::cst::ExportClauseChildren<'db>))] +#[visit(drive(&crate::cst::ExportSpecifier<'db>))] +#[visit(drive(&crate::cst::ExportSpecifierAlias<'db>))] +#[visit(drive(&crate::cst::ExportSpecifierChildren<'db>))] +#[visit(drive(&crate::cst::ExportSpecifierName<'db>))] +#[visit(drive(&crate::cst::ExportStatement<'db>))] +#[visit(drive(&crate::cst::ExportStatementChildren<'db>))] +#[visit(drive(&crate::cst::Expression<'db>))] +#[visit(drive(&crate::cst::ExpressionStatement<'db>))] +#[visit(drive(&crate::cst::ExpressionStatementChildren<'db>))] +#[visit(drive(&crate::cst::ExtendsClause<'db>))] +#[visit(drive(&crate::cst::ExtendsClauseChildren<'db>))] +#[visit(drive(&crate::cst::ExtendsTypeClause<'db>))] +#[visit(drive(&crate::cst::ExtendsTypeClauseChildren<'db>))] +#[visit(drive(&crate::cst::ExtendsTypeClauseType<'db>))] +#[visit(drive(&crate::cst::False<'db>))] +#[visit(drive(&crate::cst::FinallyClause<'db>))] +#[visit(drive(&crate::cst::FinallyClauseChildren<'db>))] +#[visit(drive(&crate::cst::FlowMaybeType<'db>))] +#[visit(drive(&crate::cst::FlowMaybeTypeChildren<'db>))] +#[visit(drive(&crate::cst::ForInStatement<'db>))] +#[visit(drive(&crate::cst::ForInStatementChildren<'db>))] +#[visit(drive(&crate::cst::ForInStatementKind<'db>))] +#[visit(drive(&crate::cst::ForInStatementLeft<'db>))] +#[visit(drive(&crate::cst::ForInStatementOperator<'db>))] +#[visit(drive(&crate::cst::ForInStatementRight<'db>))] +#[visit(drive(&crate::cst::ForStatement<'db>))] +#[visit(drive(&crate::cst::ForStatementChildren<'db>))] +#[visit(drive(&crate::cst::ForStatementCondition<'db>))] +#[visit(drive(&crate::cst::ForStatementIncrement<'db>))] +#[visit(drive(&crate::cst::ForStatementInitializer<'db>))] +#[visit(drive(&crate::cst::FormalParameters<'db>))] +#[visit(drive(&crate::cst::FormalParametersChildren<'db>))] +#[visit(drive(&crate::cst::FunctionDeclaration<'db>))] +#[visit(drive(&crate::cst::FunctionDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::FunctionDeclarationReturnType<'db>))] +#[visit(drive(&crate::cst::FunctionExpression<'db>))] +#[visit(drive(&crate::cst::FunctionExpressionChildren<'db>))] +#[visit(drive(&crate::cst::FunctionExpressionReturnType<'db>))] +#[visit(drive(&crate::cst::FunctionSignatureChildren<'db>))] +#[visit(drive(&crate::cst::FunctionSignatureReturnType<'db>))] +#[visit(drive(&crate::cst::FunctionType<'db>))] +#[visit(drive(&crate::cst::FunctionTypeChildren<'db>))] +#[visit(drive(&crate::cst::FunctionTypeReturnType<'db>))] +#[visit(drive(&crate::cst::GeneratorFunction<'db>))] +#[visit(drive(&crate::cst::GeneratorFunctionChildren<'db>))] +#[visit(drive(&crate::cst::GeneratorFunctionDeclaration<'db>))] +#[visit(drive(&crate::cst::GeneratorFunctionDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::GeneratorFunctionDeclarationReturnType<'db>))] +#[visit(drive(&crate::cst::GeneratorFunctionReturnType<'db>))] +#[visit(drive(&crate::cst::GenericType<'db>))] +#[visit(drive(&crate::cst::GenericTypeChildren<'db>))] +#[visit(drive(&crate::cst::GenericTypeName<'db>))] +#[visit(drive(&crate::cst::HashBangLine<'db>))] +#[visit(drive(&crate::cst::HtmlComment<'db>))] +#[visit(drive(&crate::cst::Identifier<'db>))] +#[visit(drive(&crate::cst::IfStatement<'db>))] +#[visit(drive(&crate::cst::IfStatementChildren<'db>))] +#[visit(drive(&crate::cst::ImplementsClause<'db>))] +#[visit(drive(&crate::cst::ImplementsClauseChildren<'db>))] +#[visit(drive(&crate::cst::Import<'db>))] +#[visit(drive(&crate::cst::ImportAlias<'db>))] +#[visit(drive(&crate::cst::ImportAliasChildren<'db>))] +#[visit(drive(&crate::cst::ImportAttribute<'db>))] +#[visit(drive(&crate::cst::ImportAttributeChildren<'db>))] +#[visit(drive(&crate::cst::ImportClause<'db>))] +#[visit(drive(&crate::cst::ImportClauseChildren<'db>))] +#[visit(drive(&crate::cst::ImportRequireClause<'db>))] +#[visit(drive(&crate::cst::ImportRequireClauseChildren<'db>))] +#[visit(drive(&crate::cst::ImportSpecifier<'db>))] +#[visit(drive(&crate::cst::ImportSpecifierChildren<'db>))] +#[visit(drive(&crate::cst::ImportSpecifierName<'db>))] +#[visit(drive(&crate::cst::ImportStatement<'db>))] +#[visit(drive(&crate::cst::ImportStatementChildren<'db>))] +#[visit(drive(&crate::cst::IndexSignature<'db>))] +#[visit(drive(&crate::cst::IndexSignatureChildren<'db>))] +#[visit(drive(&crate::cst::IndexSignatureSign<'db>))] +#[visit(drive(&crate::cst::IndexSignatureType<'db>))] +#[visit(drive(&crate::cst::IndexTypeQuery<'db>))] +#[visit(drive(&crate::cst::IndexTypeQueryChildren<'db>))] +#[visit(drive(&crate::cst::InferType<'db>))] +#[visit(drive(&crate::cst::InferTypeChildren<'db>))] +#[visit(drive(&crate::cst::InstantiationExpression<'db>))] +#[visit(drive(&crate::cst::InstantiationExpressionChildren<'db>))] +#[visit(drive(&crate::cst::InstantiationExpressionFunction<'db>))] +#[visit(drive(&crate::cst::InterfaceBody<'db>))] +#[visit(drive(&crate::cst::InterfaceBodyChildren<'db>))] +#[visit(drive(&crate::cst::InterfaceDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::InternalModule<'db>))] +#[visit(drive(&crate::cst::InternalModuleChildren<'db>))] +#[visit(drive(&crate::cst::InternalModuleName<'db>))] +#[visit(drive(&crate::cst::IntersectionType<'db>))] +#[visit(drive(&crate::cst::IntersectionTypeChildren<'db>))] +#[visit(drive(&crate::cst::LabeledStatement<'db>))] +#[visit(drive(&crate::cst::LabeledStatementChildren<'db>))] +#[visit(drive(&crate::cst::LexicalDeclaration<'db>))] +#[visit(drive(&crate::cst::LexicalDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::LexicalDeclarationKind<'db>))] +#[visit(drive(&crate::cst::LiteralType<'db>))] +#[visit(drive(&crate::cst::LiteralTypeChildren<'db>))] +#[visit(drive(&crate::cst::LookupType<'db>))] +#[visit(drive(&crate::cst::LookupTypeChildren<'db>))] +#[visit(drive(&crate::cst::MappedTypeClause<'db>))] +#[visit(drive(&crate::cst::MappedTypeClauseChildren<'db>))] +#[visit(drive(&crate::cst::MemberExpression<'db>))] +#[visit(drive(&crate::cst::MemberExpressionChildren<'db>))] +#[visit(drive(&crate::cst::MemberExpressionObject<'db>))] +#[visit(drive(&crate::cst::MemberExpressionProperty<'db>))] +#[visit(drive(&crate::cst::MetaProperty<'db>))] +#[visit(drive(&crate::cst::MethodDefinition<'db>))] +#[visit(drive(&crate::cst::MethodDefinitionChildren<'db>))] +#[visit(drive(&crate::cst::MethodDefinitionName<'db>))] +#[visit(drive(&crate::cst::MethodDefinitionReturnType<'db>))] +#[visit(drive(&crate::cst::MethodSignature<'db>))] +#[visit(drive(&crate::cst::MethodSignatureChildren<'db>))] +#[visit(drive(&crate::cst::MethodSignatureName<'db>))] +#[visit(drive(&crate::cst::MethodSignatureReturnType<'db>))] +#[visit(drive(&crate::cst::ModuleChildren<'db>))] +#[visit(drive(&crate::cst::ModuleName<'db>))] +#[visit(drive(&crate::cst::NamedImports<'db>))] +#[visit(drive(&crate::cst::NamedImportsChildren<'db>))] +#[visit(drive(&crate::cst::NamespaceExport<'db>))] +#[visit(drive(&crate::cst::NamespaceExportChildren<'db>))] +#[visit(drive(&crate::cst::NamespaceImport<'db>))] +#[visit(drive(&crate::cst::NamespaceImportChildren<'db>))] +#[visit(drive(&crate::cst::NestedIdentifier<'db>))] +#[visit(drive(&crate::cst::NestedIdentifierChildren<'db>))] +#[visit(drive(&crate::cst::NestedIdentifierObject<'db>))] +#[visit(drive(&crate::cst::NestedTypeIdentifier<'db>))] +#[visit(drive(&crate::cst::NestedTypeIdentifierChildren<'db>))] +#[visit(drive(&crate::cst::NestedTypeIdentifierModule<'db>))] +#[visit(drive(&crate::cst::NewExpression<'db>))] +#[visit(drive(&crate::cst::NewExpressionChildren<'db>))] +#[visit(drive(&crate::cst::NonNullExpression<'db>))] +#[visit(drive(&crate::cst::NonNullExpressionChildren<'db>))] +#[visit(drive(&crate::cst::Null<'db>))] +#[visit(drive(&crate::cst::Number<'db>))] +#[visit(drive(&crate::cst::Object<'db>))] +#[visit(drive(&crate::cst::ObjectAssignmentPattern<'db>))] +#[visit(drive(&crate::cst::ObjectAssignmentPatternChildren<'db>))] +#[visit(drive(&crate::cst::ObjectAssignmentPatternLeft<'db>))] +#[visit(drive(&crate::cst::ObjectChildren<'db>))] +#[visit(drive(&crate::cst::ObjectPattern<'db>))] +#[visit(drive(&crate::cst::ObjectPatternChildren<'db>))] +#[visit(drive(&crate::cst::ObjectType<'db>))] +#[visit(drive(&crate::cst::ObjectTypeChildren<'db>))] +#[visit(drive(&crate::cst::OmittingTypeAnnotation<'db>))] +#[visit(drive(&crate::cst::OmittingTypeAnnotationChildren<'db>))] +#[visit(drive(&crate::cst::OptingTypeAnnotation<'db>))] +#[visit(drive(&crate::cst::OptingTypeAnnotationChildren<'db>))] +#[visit(drive(&crate::cst::OptionalChain<'db>))] +#[visit(drive(&crate::cst::OptionalParameter<'db>))] +#[visit(drive(&crate::cst::OptionalParameterChildren<'db>))] +#[visit(drive(&crate::cst::OptionalParameterPattern<'db>))] +#[visit(drive(&crate::cst::OptionalType<'db>))] +#[visit(drive(&crate::cst::OptionalTypeChildren<'db>))] +#[visit(drive(&crate::cst::OverrideModifier<'db>))] +#[visit(drive(&crate::cst::Pair<'db>))] +#[visit(drive(&crate::cst::PairChildren<'db>))] +#[visit(drive(&crate::cst::PairKey<'db>))] +#[visit(drive(&crate::cst::PairPattern<'db>))] +#[visit(drive(&crate::cst::PairPatternChildren<'db>))] +#[visit(drive(&crate::cst::PairPatternKey<'db>))] +#[visit(drive(&crate::cst::PairPatternValue<'db>))] +#[visit(drive(&crate::cst::ParenthesizedExpression<'db>))] +#[visit(drive(&crate::cst::ParenthesizedExpressionChildren<'db>))] +#[visit(drive(&crate::cst::ParenthesizedType<'db>))] +#[visit(drive(&crate::cst::ParenthesizedTypeChildren<'db>))] +#[visit(drive(&crate::cst::Pattern<'db>))] +#[visit(drive(&crate::cst::PredefinedType<'db>))] +#[visit(drive(&crate::cst::PrimaryExpression<'db>))] +#[visit(drive(&crate::cst::PrimaryType<'db>))] +#[visit(drive(&crate::cst::PrivatePropertyIdentifier<'db>))] +#[visit(drive(&crate::cst::Program<'db>))] +#[visit(drive(&crate::cst::ProgramChildren<'db>))] +#[visit(drive(&crate::cst::PropertyIdentifier<'db>))] +#[visit(drive(&crate::cst::PropertySignature<'db>))] +#[visit(drive(&crate::cst::PropertySignatureChildren<'db>))] +#[visit(drive(&crate::cst::PropertySignatureName<'db>))] +#[visit(drive(&crate::cst::PublicFieldDefinition<'db>))] +#[visit(drive(&crate::cst::PublicFieldDefinitionChildren<'db>))] +#[visit(drive(&crate::cst::PublicFieldDefinitionName<'db>))] +#[visit(drive(&crate::cst::ReadonlyType<'db>))] +#[visit(drive(&crate::cst::ReadonlyTypeChildren<'db>))] +#[visit(drive(&crate::cst::Regex<'db>))] +#[visit(drive(&crate::cst::RegexChildren<'db>))] +#[visit(drive(&crate::cst::RegexFlags<'db>))] +#[visit(drive(&crate::cst::RegexPattern<'db>))] +#[visit(drive(&crate::cst::RequiredParameter<'db>))] +#[visit(drive(&crate::cst::RequiredParameterChildren<'db>))] +#[visit(drive(&crate::cst::RequiredParameterName<'db>))] +#[visit(drive(&crate::cst::RequiredParameterPattern<'db>))] +#[visit(drive(&crate::cst::RestPattern<'db>))] +#[visit(drive(&crate::cst::RestPatternChildren<'db>))] +#[visit(drive(&crate::cst::RestType<'db>))] +#[visit(drive(&crate::cst::RestTypeChildren<'db>))] +#[visit(drive(&crate::cst::ReturnStatement<'db>))] +#[visit(drive(&crate::cst::ReturnStatementChildren<'db>))] +#[visit(drive(&crate::cst::SatisfiesExpression<'db>))] +#[visit(drive(&crate::cst::SatisfiesExpressionChildren<'db>))] +#[visit(drive(&crate::cst::SequenceExpression<'db>))] +#[visit(drive(&crate::cst::SequenceExpressionChildren<'db>))] +#[visit(drive(&crate::cst::ShorthandPropertyIdentifier<'db>))] +#[visit(drive(&crate::cst::ShorthandPropertyIdentifierPattern<'db>))] +#[visit(drive(&crate::cst::SpreadElement<'db>))] +#[visit(drive(&crate::cst::SpreadElementChildren<'db>))] +#[visit(drive(&crate::cst::Statement<'db>))] +#[visit(drive(&crate::cst::StatementBlock<'db>))] +#[visit(drive(&crate::cst::StatementBlockChildren<'db>))] +#[visit(drive(&crate::cst::StatementIdentifier<'db>))] +#[visit(drive(&crate::cst::String<'db>))] +#[visit(drive(&crate::cst::StringChildren<'db>))] +#[visit(drive(&crate::cst::StringFragment<'db>))] +#[visit(drive(&crate::cst::SubscriptExpression<'db>))] +#[visit(drive(&crate::cst::SubscriptExpressionChildren<'db>))] +#[visit(drive(&crate::cst::SubscriptExpressionIndex<'db>))] +#[visit(drive(&crate::cst::Super<'db>))] +#[visit(drive(&crate::cst::SwitchBody<'db>))] +#[visit(drive(&crate::cst::SwitchBodyChildren<'db>))] +#[visit(drive(&crate::cst::SwitchCase<'db>))] +#[visit(drive(&crate::cst::SwitchCaseChildren<'db>))] +#[visit(drive(&crate::cst::SwitchCaseValue<'db>))] +#[visit(drive(&crate::cst::SwitchDefault<'db>))] +#[visit(drive(&crate::cst::SwitchDefaultChildren<'db>))] +#[visit(drive(&crate::cst::SwitchStatement<'db>))] +#[visit(drive(&crate::cst::SwitchStatementChildren<'db>))] +#[visit(drive(&crate::cst::TemplateLiteralType<'db>))] +#[visit(drive(&crate::cst::TemplateLiteralTypeChildren<'db>))] +#[visit(drive(&crate::cst::TemplateString<'db>))] +#[visit(drive(&crate::cst::TemplateStringChildren<'db>))] +#[visit(drive(&crate::cst::TemplateSubstitution<'db>))] +#[visit(drive(&crate::cst::TemplateSubstitutionChildren<'db>))] +#[visit(drive(&crate::cst::TemplateType<'db>))] +#[visit(drive(&crate::cst::TemplateTypeChildren<'db>))] +#[visit(drive(&crate::cst::TernaryExpression<'db>))] +#[visit(drive(&crate::cst::TernaryExpressionChildren<'db>))] +#[visit(drive(&crate::cst::This<'db>))] +#[visit(drive(&crate::cst::ThisType<'db>))] +#[visit(drive(&crate::cst::ThrowStatement<'db>))] +#[visit(drive(&crate::cst::ThrowStatementChildren<'db>))] +#[visit(drive(&crate::cst::True<'db>))] +#[visit(drive(&crate::cst::TryStatement<'db>))] +#[visit(drive(&crate::cst::TryStatementChildren<'db>))] +#[visit(drive(&crate::cst::TupleType<'db>))] +#[visit(drive(&crate::cst::TupleTypeChildren<'db>))] +#[visit(drive(&crate::cst::Type<'db>))] +#[visit(drive(&crate::cst::TypeAliasDeclaration<'db>))] +#[visit(drive(&crate::cst::TypeAliasDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::TypeAnnotation<'db>))] +#[visit(drive(&crate::cst::TypeAnnotationChildren<'db>))] +#[visit(drive(&crate::cst::TypeArguments<'db>))] +#[visit(drive(&crate::cst::TypeArgumentsChildren<'db>))] +#[visit(drive(&crate::cst::TypeAssertion<'db>))] +#[visit(drive(&crate::cst::TypeAssertionChildren<'db>))] +#[visit(drive(&crate::cst::TypeIdentifier<'db>))] +#[visit(drive(&crate::cst::TypeParameter<'db>))] +#[visit(drive(&crate::cst::TypeParameterChildren<'db>))] +#[visit(drive(&crate::cst::TypeParameters<'db>))] +#[visit(drive(&crate::cst::TypeParametersChildren<'db>))] +#[visit(drive(&crate::cst::TypePredicate<'db>))] +#[visit(drive(&crate::cst::TypePredicateAnnotation<'db>))] +#[visit(drive(&crate::cst::TypePredicateAnnotationChildren<'db>))] +#[visit(drive(&crate::cst::TypePredicateChildren<'db>))] +#[visit(drive(&crate::cst::TypePredicateName<'db>))] +#[visit(drive(&crate::cst::TypeQuery<'db>))] +#[visit(drive(&crate::cst::TypeQueryChildren<'db>))] +#[visit(drive(&crate::cst::UnaryExpression<'db>))] +#[visit(drive(&crate::cst::UnaryExpressionArgument<'db>))] +#[visit(drive(&crate::cst::UnaryExpressionChildren<'db>))] +#[visit(drive(&crate::cst::UnaryExpressionOperator<'db>))] +#[visit(drive(&crate::cst::Undefined<'db>))] +#[visit(drive(&crate::cst::UnionType<'db>))] +#[visit(drive(&crate::cst::UnionTypeChildren<'db>))] +#[visit(drive(&crate::cst::UpdateExpression<'db>))] +#[visit(drive(&crate::cst::UpdateExpressionChildren<'db>))] +#[visit(drive(&crate::cst::UpdateExpressionOperator<'db>))] +#[visit(drive(&crate::cst::VariableDeclaration<'db>))] +#[visit(drive(&crate::cst::VariableDeclarationChildren<'db>))] +#[visit(drive(&crate::cst::VariableDeclarator<'db>))] +#[visit(drive(&crate::cst::VariableDeclaratorChildren<'db>))] +#[visit(drive(&crate::cst::VariableDeclaratorName<'db>))] +#[visit(drive(&crate::cst::WhileStatement<'db>))] +#[visit(drive(&crate::cst::WhileStatementChildren<'db>))] +#[visit(drive(&crate::cst::WithStatement<'db>))] +#[visit(drive(&crate::cst::WithStatementChildren<'db>))] +#[visit(drive(&crate::cst::YieldExpression<'db>))] +#[visit(drive(&crate::cst::YieldExpressionChildren<'db>))] +#[visit(drive(&crate::cst::AbstractClassDeclaration<'db>))] +#[visit(drive(&crate::cst::AbstractMethodSignature<'db>))] +#[visit(drive(&crate::cst::FunctionSignature<'db>))] +#[visit(drive(&crate::cst::InterfaceDeclaration<'db>))] +#[visit(drive(&crate::cst::Module<'db>))] +#[visit(drive(crate::cst::AbstractClassDeclarationChildren<'db>))] +#[visit(drive(crate::cst::AbstractMethodSignatureChildren<'db>))] +#[visit(drive(crate::cst::AbstractMethodSignatureName<'db>))] +#[visit(drive(crate::cst::AbstractMethodSignatureReturnType<'db>))] +#[visit(drive(crate::cst::AccessibilityModifier<'db>))] +#[visit(drive(crate::cst::AddingTypeAnnotation<'db>))] +#[visit(drive(crate::cst::AddingTypeAnnotationChildren<'db>))] +#[visit(drive(crate::cst::AmbientDeclaration<'db>))] +#[visit(drive(crate::cst::AmbientDeclarationChildren<'db>))] +#[visit(drive(crate::cst::AnonymousAbstract<'db>))] +#[visit(drive(crate::cst::AnonymousAccessor<'db>))] +#[visit(drive(crate::cst::AnonymousAmpersand<'db>))] +#[visit(drive(crate::cst::AnonymousAmpersandAmpersand<'db>))] +#[visit(drive(crate::cst::AnonymousAmpersandAmpersandEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAmpersandEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAny<'db>))] +#[visit(drive(crate::cst::AnonymousAs<'db>))] +#[visit(drive(crate::cst::AnonymousAssert<'db>))] +#[visit(drive(crate::cst::AnonymousAsserts<'db>))] +#[visit(drive(crate::cst::AnonymousAsterisk<'db>))] +#[visit(drive(crate::cst::AnonymousAsteriskAsterisk<'db>))] +#[visit(drive(crate::cst::AnonymousAsteriskAsteriskEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAsteriskEquals<'db>))] +#[visit(drive(crate::cst::AnonymousAsync<'db>))] +#[visit(drive(crate::cst::AnonymousAt<'db>))] +#[visit(drive(crate::cst::AnonymousAwait<'db>))] +#[visit(drive(crate::cst::AnonymousBacktick<'db>))] +#[visit(drive(crate::cst::AnonymousBang<'db>))] +#[visit(drive(crate::cst::AnonymousBangEquals<'db>))] +#[visit(drive(crate::cst::AnonymousBangEqualsEquals<'db>))] +#[visit(drive(crate::cst::AnonymousBoolean<'db>))] +#[visit(drive(crate::cst::AnonymousBreak<'db>))] +#[visit(drive(crate::cst::AnonymousCaret<'db>))] +#[visit(drive(crate::cst::AnonymousCaretEquals<'db>))] +#[visit(drive(crate::cst::AnonymousCase<'db>))] +#[visit(drive(crate::cst::AnonymousCatch<'db>))] +#[visit(drive(crate::cst::AnonymousClass<'db>))] +#[visit(drive(crate::cst::AnonymousCloseBrace<'db>))] +#[visit(drive(crate::cst::AnonymousCloseBracket<'db>))] +#[visit(drive(crate::cst::AnonymousCloseParen<'db>))] +#[visit(drive(crate::cst::AnonymousColon<'db>))] +#[visit(drive(crate::cst::AnonymousComma<'db>))] +#[visit(drive(crate::cst::AnonymousConst<'db>))] +#[visit(drive(crate::cst::AnonymousContinue<'db>))] +#[visit(drive(crate::cst::AnonymousDebugger<'db>))] +#[visit(drive(crate::cst::AnonymousDeclare<'db>))] +#[visit(drive(crate::cst::AnonymousDefault<'db>))] +#[visit(drive(crate::cst::AnonymousDelete<'db>))] +#[visit(drive(crate::cst::AnonymousDo<'db>))] +#[visit(drive(crate::cst::AnonymousDollarOpenBrace<'db>))] +#[visit(drive(crate::cst::AnonymousDot<'db>))] +#[visit(drive(crate::cst::AnonymousDotDotDot<'db>))] +#[visit(drive(crate::cst::AnonymousDoubleQuote<'db>))] +#[visit(drive(crate::cst::AnonymousElse<'db>))] +#[visit(drive(crate::cst::AnonymousEnum<'db>))] +#[visit(drive(crate::cst::AnonymousEquals<'db>))] +#[visit(drive(crate::cst::AnonymousEqualsEquals<'db>))] +#[visit(drive(crate::cst::AnonymousEqualsEqualsEquals<'db>))] +#[visit(drive(crate::cst::AnonymousEqualsGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousExport<'db>))] +#[visit(drive(crate::cst::AnonymousExtends<'db>))] +#[visit(drive(crate::cst::AnonymousFinally<'db>))] +#[visit(drive(crate::cst::AnonymousFor<'db>))] +#[visit(drive(crate::cst::AnonymousFrom<'db>))] +#[visit(drive(crate::cst::AnonymousFunction<'db>))] +#[visit(drive(crate::cst::AnonymousGet<'db>))] +#[visit(drive(crate::cst::AnonymousGlobal<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanGreaterThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanGreaterThanGreaterThan<'db>))] +#[visit(drive(crate::cst::AnonymousGreaterThanGreaterThanGreaterThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousIf<'db>))] +#[visit(drive(crate::cst::AnonymousImplements<'db>))] +#[visit(drive(crate::cst::AnonymousImport<'db>))] +#[visit(drive(crate::cst::AnonymousIn<'db>))] +#[visit(drive(crate::cst::AnonymousInfer<'db>))] +#[visit(drive(crate::cst::AnonymousInstanceof<'db>))] +#[visit(drive(crate::cst::AnonymousInterface<'db>))] +#[visit(drive(crate::cst::AnonymousIs<'db>))] +#[visit(drive(crate::cst::AnonymousKeyof<'db>))] +#[visit(drive(crate::cst::AnonymousLessThan<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanLessThan<'db>))] +#[visit(drive(crate::cst::AnonymousLessThanLessThanEquals<'db>))] +#[visit(drive(crate::cst::AnonymousLet<'db>))] +#[visit(drive(crate::cst::AnonymousMeta<'db>))] +#[visit(drive(crate::cst::AnonymousMinus<'db>))] +#[visit(drive(crate::cst::AnonymousMinusEquals<'db>))] +#[visit(drive(crate::cst::AnonymousMinusMinus<'db>))] +#[visit(drive(crate::cst::AnonymousMinusQuestionMarkColon<'db>))] +#[visit(drive(crate::cst::AnonymousModule<'db>))] +#[visit(drive(crate::cst::AnonymousNamespace<'db>))] +#[visit(drive(crate::cst::AnonymousNever<'db>))] +#[visit(drive(crate::cst::AnonymousNew<'db>))] +#[visit(drive(crate::cst::AnonymousNumber<'db>))] +#[visit(drive(crate::cst::AnonymousObject<'db>))] +#[visit(drive(crate::cst::AnonymousOf<'db>))] +#[visit(drive(crate::cst::AnonymousOpenBrace<'db>))] +#[visit(drive(crate::cst::AnonymousOpenBracePipe<'db>))] +#[visit(drive(crate::cst::AnonymousOpenBracket<'db>))] +#[visit(drive(crate::cst::AnonymousOpenParen<'db>))] +#[visit(drive(crate::cst::AnonymousOverride<'db>))] +#[visit(drive(crate::cst::AnonymousPercent<'db>))] +#[visit(drive(crate::cst::AnonymousPercentEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPipe<'db>))] +#[visit(drive(crate::cst::AnonymousPipeCloseBrace<'db>))] +#[visit(drive(crate::cst::AnonymousPipeEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPipePipe<'db>))] +#[visit(drive(crate::cst::AnonymousPipePipeEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPlus<'db>))] +#[visit(drive(crate::cst::AnonymousPlusEquals<'db>))] +#[visit(drive(crate::cst::AnonymousPlusPlus<'db>))] +#[visit(drive(crate::cst::AnonymousPlusQuestionMarkColon<'db>))] +#[visit(drive(crate::cst::AnonymousPrivate<'db>))] +#[visit(drive(crate::cst::AnonymousProtected<'db>))] +#[visit(drive(crate::cst::AnonymousPublic<'db>))] +#[visit(drive(crate::cst::AnonymousQuestionMark<'db>))] +#[visit(drive(crate::cst::AnonymousQuestionMarkColon<'db>))] +#[visit(drive(crate::cst::AnonymousQuestionMarkDot<'db>))] +#[visit(drive(crate::cst::AnonymousQuestionMarkQuestionMark<'db>))] +#[visit(drive(crate::cst::AnonymousQuestionMarkQuestionMarkEquals<'db>))] +#[visit(drive(crate::cst::AnonymousReadonly<'db>))] +#[visit(drive(crate::cst::AnonymousRequire<'db>))] +#[visit(drive(crate::cst::AnonymousReturn<'db>))] +#[visit(drive(crate::cst::AnonymousSatisfies<'db>))] +#[visit(drive(crate::cst::AnonymousSemicolon<'db>))] +#[visit(drive(crate::cst::AnonymousSet<'db>))] +#[visit(drive(crate::cst::AnonymousSingleQuote<'db>))] +#[visit(drive(crate::cst::AnonymousSlash<'db>))] +#[visit(drive(crate::cst::AnonymousSlashEquals<'db>))] +#[visit(drive(crate::cst::AnonymousStatic<'db>))] +#[visit(drive(crate::cst::AnonymousString<'db>))] +#[visit(drive(crate::cst::AnonymousSwitch<'db>))] +#[visit(drive(crate::cst::AnonymousSymbol<'db>))] +#[visit(drive(crate::cst::AnonymousTarget<'db>))] +#[visit(drive(crate::cst::AnonymousThrow<'db>))] +#[visit(drive(crate::cst::AnonymousTilde<'db>))] +#[visit(drive(crate::cst::AnonymousTry<'db>))] +#[visit(drive(crate::cst::AnonymousType<'db>))] +#[visit(drive(crate::cst::AnonymousTypeof<'db>))] +#[visit(drive(crate::cst::AnonymousUniqueSymbol<'db>))] +#[visit(drive(crate::cst::AnonymousUnknown<'db>))] +#[visit(drive(crate::cst::AnonymousUsing<'db>))] +#[visit(drive(crate::cst::AnonymousVar<'db>))] +#[visit(drive(crate::cst::AnonymousVoid<'db>))] +#[visit(drive(crate::cst::AnonymousWhile<'db>))] +#[visit(drive(crate::cst::AnonymousWith<'db>))] +#[visit(drive(crate::cst::AnonymousYield<'db>))] +#[visit(drive(crate::cst::Arguments<'db>))] +#[visit(drive(crate::cst::ArgumentsChildren<'db>))] +#[visit(drive(crate::cst::Array<'db>))] +#[visit(drive(crate::cst::ArrayChildren<'db>))] +#[visit(drive(crate::cst::ArrayPattern<'db>))] +#[visit(drive(crate::cst::ArrayPatternChildren<'db>))] +#[visit(drive(crate::cst::ArrayType<'db>))] +#[visit(drive(crate::cst::ArrayTypeChildren<'db>))] +#[visit(drive(crate::cst::ArrowFunction<'db>))] +#[visit(drive(crate::cst::ArrowFunctionBody<'db>))] +#[visit(drive(crate::cst::ArrowFunctionChildren<'db>))] +#[visit(drive(crate::cst::ArrowFunctionReturnType<'db>))] +#[visit(drive(crate::cst::AsExpression<'db>))] +#[visit(drive(crate::cst::AsExpressionChildren<'db>))] +#[visit(drive(crate::cst::Asserts<'db>))] +#[visit(drive(crate::cst::AssertsAnnotation<'db>))] +#[visit(drive(crate::cst::AssertsAnnotationChildren<'db>))] +#[visit(drive(crate::cst::AssertsChildren<'db>))] +#[visit(drive(crate::cst::AssignmentExpression<'db>))] +#[visit(drive(crate::cst::AssignmentExpressionChildren<'db>))] +#[visit(drive(crate::cst::AssignmentExpressionLeft<'db>))] +#[visit(drive(crate::cst::AssignmentPattern<'db>))] +#[visit(drive(crate::cst::AssignmentPatternChildren<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentExpression<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentExpressionChildren<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentExpressionLeft<'db>))] +#[visit(drive(crate::cst::AugmentedAssignmentExpressionOperator<'db>))] +#[visit(drive(crate::cst::AwaitExpression<'db>))] +#[visit(drive(crate::cst::AwaitExpressionChildren<'db>))] +#[visit(drive(crate::cst::BinaryExpression<'db>))] +#[visit(drive(crate::cst::BinaryExpressionChildren<'db>))] +#[visit(drive(crate::cst::BinaryExpressionLeft<'db>))] +#[visit(drive(crate::cst::BinaryExpressionOperator<'db>))] +#[visit(drive(crate::cst::BreakStatement<'db>))] +#[visit(drive(crate::cst::BreakStatementChildren<'db>))] +#[visit(drive(crate::cst::CallExpression<'db>))] +#[visit(drive(crate::cst::CallExpressionArguments<'db>))] +#[visit(drive(crate::cst::CallExpressionChildren<'db>))] +#[visit(drive(crate::cst::CallExpressionFunction<'db>))] +#[visit(drive(crate::cst::CallSignature<'db>))] +#[visit(drive(crate::cst::CallSignatureChildren<'db>))] +#[visit(drive(crate::cst::CallSignatureReturnType<'db>))] +#[visit(drive(crate::cst::CatchClause<'db>))] +#[visit(drive(crate::cst::CatchClauseChildren<'db>))] +#[visit(drive(crate::cst::CatchClauseParameter<'db>))] +#[visit(drive(crate::cst::Class<'db>))] +#[visit(drive(crate::cst::ClassBody<'db>))] +#[visit(drive(crate::cst::ClassBodyChildren<'db>))] +#[visit(drive(crate::cst::ClassChildren<'db>))] +#[visit(drive(crate::cst::ClassDeclaration<'db>))] +#[visit(drive(crate::cst::ClassDeclarationChildren<'db>))] +#[visit(drive(crate::cst::ClassHeritage<'db>))] +#[visit(drive(crate::cst::ClassHeritageChildren<'db>))] +#[visit(drive(crate::cst::ClassStaticBlock<'db>))] +#[visit(drive(crate::cst::ClassStaticBlockChildren<'db>))] +#[visit(drive(crate::cst::Comment<'db>))] +#[visit(drive(crate::cst::ComputedPropertyName<'db>))] +#[visit(drive(crate::cst::ComputedPropertyNameChildren<'db>))] +#[visit(drive(crate::cst::ConditionalType<'db>))] +#[visit(drive(crate::cst::ConditionalTypeChildren<'db>))] +#[visit(drive(crate::cst::Constraint<'db>))] +#[visit(drive(crate::cst::ConstraintChildren<'db>))] +#[visit(drive(crate::cst::ConstructSignature<'db>))] +#[visit(drive(crate::cst::ConstructSignatureChildren<'db>))] +#[visit(drive(crate::cst::ConstructorType<'db>))] +#[visit(drive(crate::cst::ConstructorTypeChildren<'db>))] +#[visit(drive(crate::cst::ContinueStatement<'db>))] +#[visit(drive(crate::cst::ContinueStatementChildren<'db>))] +#[visit(drive(crate::cst::DebuggerStatement<'db>))] +#[visit(drive(crate::cst::Declaration<'db>))] +#[visit(drive(crate::cst::Decorator<'db>))] +#[visit(drive(crate::cst::DecoratorChildren<'db>))] +#[visit(drive(crate::cst::DefaultType<'db>))] +#[visit(drive(crate::cst::DefaultTypeChildren<'db>))] +#[visit(drive(crate::cst::DoStatement<'db>))] +#[visit(drive(crate::cst::DoStatementChildren<'db>))] +#[visit(drive(crate::cst::ElseClause<'db>))] +#[visit(drive(crate::cst::ElseClauseChildren<'db>))] +#[visit(drive(crate::cst::EmptyStatement<'db>))] +#[visit(drive(crate::cst::EnumAssignment<'db>))] +#[visit(drive(crate::cst::EnumAssignmentChildren<'db>))] +#[visit(drive(crate::cst::EnumAssignmentName<'db>))] +#[visit(drive(crate::cst::EnumBody<'db>))] +#[visit(drive(crate::cst::EnumBodyChildren<'db>))] +#[visit(drive(crate::cst::EnumBodyName<'db>))] +#[visit(drive(crate::cst::EnumDeclaration<'db>))] +#[visit(drive(crate::cst::EnumDeclarationChildren<'db>))] +#[visit(drive(crate::cst::EscapeSequence<'db>))] +#[visit(drive(crate::cst::ExistentialType<'db>))] +#[visit(drive(crate::cst::ExportClause<'db>))] +#[visit(drive(crate::cst::ExportClauseChildren<'db>))] +#[visit(drive(crate::cst::ExportSpecifier<'db>))] +#[visit(drive(crate::cst::ExportSpecifierAlias<'db>))] +#[visit(drive(crate::cst::ExportSpecifierChildren<'db>))] +#[visit(drive(crate::cst::ExportSpecifierName<'db>))] +#[visit(drive(crate::cst::ExportStatement<'db>))] +#[visit(drive(crate::cst::ExportStatementChildren<'db>))] +#[visit(drive(crate::cst::Expression<'db>))] +#[visit(drive(crate::cst::ExpressionStatement<'db>))] +#[visit(drive(crate::cst::ExpressionStatementChildren<'db>))] +#[visit(drive(crate::cst::ExtendsClause<'db>))] +#[visit(drive(crate::cst::ExtendsClauseChildren<'db>))] +#[visit(drive(crate::cst::ExtendsTypeClause<'db>))] +#[visit(drive(crate::cst::ExtendsTypeClauseChildren<'db>))] +#[visit(drive(crate::cst::ExtendsTypeClauseType<'db>))] +#[visit(drive(crate::cst::False<'db>))] +#[visit(drive(crate::cst::FinallyClause<'db>))] +#[visit(drive(crate::cst::FinallyClauseChildren<'db>))] +#[visit(drive(crate::cst::FlowMaybeType<'db>))] +#[visit(drive(crate::cst::FlowMaybeTypeChildren<'db>))] +#[visit(drive(crate::cst::ForInStatement<'db>))] +#[visit(drive(crate::cst::ForInStatementChildren<'db>))] +#[visit(drive(crate::cst::ForInStatementKind<'db>))] +#[visit(drive(crate::cst::ForInStatementLeft<'db>))] +#[visit(drive(crate::cst::ForInStatementOperator<'db>))] +#[visit(drive(crate::cst::ForInStatementRight<'db>))] +#[visit(drive(crate::cst::ForStatement<'db>))] +#[visit(drive(crate::cst::ForStatementChildren<'db>))] +#[visit(drive(crate::cst::ForStatementCondition<'db>))] +#[visit(drive(crate::cst::ForStatementIncrement<'db>))] +#[visit(drive(crate::cst::ForStatementInitializer<'db>))] +#[visit(drive(crate::cst::FormalParameters<'db>))] +#[visit(drive(crate::cst::FormalParametersChildren<'db>))] +#[visit(drive(crate::cst::FunctionDeclaration<'db>))] +#[visit(drive(crate::cst::FunctionDeclarationChildren<'db>))] +#[visit(drive(crate::cst::FunctionDeclarationReturnType<'db>))] +#[visit(drive(crate::cst::FunctionExpression<'db>))] +#[visit(drive(crate::cst::FunctionExpressionChildren<'db>))] +#[visit(drive(crate::cst::FunctionExpressionReturnType<'db>))] +#[visit(drive(crate::cst::FunctionSignatureChildren<'db>))] +#[visit(drive(crate::cst::FunctionSignatureReturnType<'db>))] +#[visit(drive(crate::cst::FunctionType<'db>))] +#[visit(drive(crate::cst::FunctionTypeChildren<'db>))] +#[visit(drive(crate::cst::FunctionTypeReturnType<'db>))] +#[visit(drive(crate::cst::GeneratorFunction<'db>))] +#[visit(drive(crate::cst::GeneratorFunctionChildren<'db>))] +#[visit(drive(crate::cst::GeneratorFunctionDeclaration<'db>))] +#[visit(drive(crate::cst::GeneratorFunctionDeclarationChildren<'db>))] +#[visit(drive(crate::cst::GeneratorFunctionDeclarationReturnType<'db>))] +#[visit(drive(crate::cst::GeneratorFunctionReturnType<'db>))] +#[visit(drive(crate::cst::GenericType<'db>))] +#[visit(drive(crate::cst::GenericTypeChildren<'db>))] +#[visit(drive(crate::cst::GenericTypeName<'db>))] +#[visit(drive(crate::cst::HashBangLine<'db>))] +#[visit(drive(crate::cst::HtmlComment<'db>))] +#[visit(drive(crate::cst::Identifier<'db>))] +#[visit(drive(crate::cst::IfStatement<'db>))] +#[visit(drive(crate::cst::IfStatementChildren<'db>))] +#[visit(drive(crate::cst::ImplementsClause<'db>))] +#[visit(drive(crate::cst::ImplementsClauseChildren<'db>))] +#[visit(drive(crate::cst::Import<'db>))] +#[visit(drive(crate::cst::ImportAlias<'db>))] +#[visit(drive(crate::cst::ImportAliasChildren<'db>))] +#[visit(drive(crate::cst::ImportAttribute<'db>))] +#[visit(drive(crate::cst::ImportAttributeChildren<'db>))] +#[visit(drive(crate::cst::ImportClause<'db>))] +#[visit(drive(crate::cst::ImportClauseChildren<'db>))] +#[visit(drive(crate::cst::ImportRequireClause<'db>))] +#[visit(drive(crate::cst::ImportRequireClauseChildren<'db>))] +#[visit(drive(crate::cst::ImportSpecifier<'db>))] +#[visit(drive(crate::cst::ImportSpecifierChildren<'db>))] +#[visit(drive(crate::cst::ImportSpecifierName<'db>))] +#[visit(drive(crate::cst::ImportStatement<'db>))] +#[visit(drive(crate::cst::ImportStatementChildren<'db>))] +#[visit(drive(crate::cst::IndexSignature<'db>))] +#[visit(drive(crate::cst::IndexSignatureChildren<'db>))] +#[visit(drive(crate::cst::IndexSignatureSign<'db>))] +#[visit(drive(crate::cst::IndexSignatureType<'db>))] +#[visit(drive(crate::cst::IndexTypeQuery<'db>))] +#[visit(drive(crate::cst::IndexTypeQueryChildren<'db>))] +#[visit(drive(crate::cst::InferType<'db>))] +#[visit(drive(crate::cst::InferTypeChildren<'db>))] +#[visit(drive(crate::cst::InstantiationExpression<'db>))] +#[visit(drive(crate::cst::InstantiationExpressionChildren<'db>))] +#[visit(drive(crate::cst::InstantiationExpressionFunction<'db>))] +#[visit(drive(crate::cst::InterfaceBody<'db>))] +#[visit(drive(crate::cst::InterfaceBodyChildren<'db>))] +#[visit(drive(crate::cst::InterfaceDeclarationChildren<'db>))] +#[visit(drive(crate::cst::InternalModule<'db>))] +#[visit(drive(crate::cst::InternalModuleChildren<'db>))] +#[visit(drive(crate::cst::InternalModuleName<'db>))] +#[visit(drive(crate::cst::IntersectionType<'db>))] +#[visit(drive(crate::cst::IntersectionTypeChildren<'db>))] +#[visit(drive(crate::cst::LabeledStatement<'db>))] +#[visit(drive(crate::cst::LabeledStatementChildren<'db>))] +#[visit(drive(crate::cst::LexicalDeclaration<'db>))] +#[visit(drive(crate::cst::LexicalDeclarationChildren<'db>))] +#[visit(drive(crate::cst::LexicalDeclarationKind<'db>))] +#[visit(drive(crate::cst::LiteralType<'db>))] +#[visit(drive(crate::cst::LiteralTypeChildren<'db>))] +#[visit(drive(crate::cst::LookupType<'db>))] +#[visit(drive(crate::cst::LookupTypeChildren<'db>))] +#[visit(drive(crate::cst::MappedTypeClause<'db>))] +#[visit(drive(crate::cst::MappedTypeClauseChildren<'db>))] +#[visit(drive(crate::cst::MemberExpression<'db>))] +#[visit(drive(crate::cst::MemberExpressionChildren<'db>))] +#[visit(drive(crate::cst::MemberExpressionObject<'db>))] +#[visit(drive(crate::cst::MemberExpressionProperty<'db>))] +#[visit(drive(crate::cst::MetaProperty<'db>))] +#[visit(drive(crate::cst::MethodDefinition<'db>))] +#[visit(drive(crate::cst::MethodDefinitionChildren<'db>))] +#[visit(drive(crate::cst::MethodDefinitionName<'db>))] +#[visit(drive(crate::cst::MethodDefinitionReturnType<'db>))] +#[visit(drive(crate::cst::MethodSignature<'db>))] +#[visit(drive(crate::cst::MethodSignatureChildren<'db>))] +#[visit(drive(crate::cst::MethodSignatureName<'db>))] +#[visit(drive(crate::cst::MethodSignatureReturnType<'db>))] +#[visit(drive(crate::cst::ModuleChildren<'db>))] +#[visit(drive(crate::cst::ModuleName<'db>))] +#[visit(drive(crate::cst::NamedImports<'db>))] +#[visit(drive(crate::cst::NamedImportsChildren<'db>))] +#[visit(drive(crate::cst::NamespaceExport<'db>))] +#[visit(drive(crate::cst::NamespaceExportChildren<'db>))] +#[visit(drive(crate::cst::NamespaceImport<'db>))] +#[visit(drive(crate::cst::NamespaceImportChildren<'db>))] +#[visit(drive(crate::cst::NestedIdentifier<'db>))] +#[visit(drive(crate::cst::NestedIdentifierChildren<'db>))] +#[visit(drive(crate::cst::NestedIdentifierObject<'db>))] +#[visit(drive(crate::cst::NestedTypeIdentifier<'db>))] +#[visit(drive(crate::cst::NestedTypeIdentifierChildren<'db>))] +#[visit(drive(crate::cst::NestedTypeIdentifierModule<'db>))] +#[visit(drive(crate::cst::NewExpression<'db>))] +#[visit(drive(crate::cst::NewExpressionChildren<'db>))] +#[visit(drive(crate::cst::NonNullExpression<'db>))] +#[visit(drive(crate::cst::NonNullExpressionChildren<'db>))] +#[visit(drive(crate::cst::Null<'db>))] +#[visit(drive(crate::cst::Number<'db>))] +#[visit(drive(crate::cst::Object<'db>))] +#[visit(drive(crate::cst::ObjectAssignmentPattern<'db>))] +#[visit(drive(crate::cst::ObjectAssignmentPatternChildren<'db>))] +#[visit(drive(crate::cst::ObjectAssignmentPatternLeft<'db>))] +#[visit(drive(crate::cst::ObjectChildren<'db>))] +#[visit(drive(crate::cst::ObjectPattern<'db>))] +#[visit(drive(crate::cst::ObjectPatternChildren<'db>))] +#[visit(drive(crate::cst::ObjectType<'db>))] +#[visit(drive(crate::cst::ObjectTypeChildren<'db>))] +#[visit(drive(crate::cst::OmittingTypeAnnotation<'db>))] +#[visit(drive(crate::cst::OmittingTypeAnnotationChildren<'db>))] +#[visit(drive(crate::cst::OptingTypeAnnotation<'db>))] +#[visit(drive(crate::cst::OptingTypeAnnotationChildren<'db>))] +#[visit(drive(crate::cst::OptionalChain<'db>))] +#[visit(drive(crate::cst::OptionalParameter<'db>))] +#[visit(drive(crate::cst::OptionalParameterChildren<'db>))] +#[visit(drive(crate::cst::OptionalParameterPattern<'db>))] +#[visit(drive(crate::cst::OptionalType<'db>))] +#[visit(drive(crate::cst::OptionalTypeChildren<'db>))] +#[visit(drive(crate::cst::OverrideModifier<'db>))] +#[visit(drive(crate::cst::Pair<'db>))] +#[visit(drive(crate::cst::PairChildren<'db>))] +#[visit(drive(crate::cst::PairKey<'db>))] +#[visit(drive(crate::cst::PairPattern<'db>))] +#[visit(drive(crate::cst::PairPatternChildren<'db>))] +#[visit(drive(crate::cst::PairPatternKey<'db>))] +#[visit(drive(crate::cst::PairPatternValue<'db>))] +#[visit(drive(crate::cst::ParenthesizedExpression<'db>))] +#[visit(drive(crate::cst::ParenthesizedExpressionChildren<'db>))] +#[visit(drive(crate::cst::ParenthesizedType<'db>))] +#[visit(drive(crate::cst::ParenthesizedTypeChildren<'db>))] +#[visit(drive(crate::cst::Pattern<'db>))] +#[visit(drive(crate::cst::PredefinedType<'db>))] +#[visit(drive(crate::cst::PrimaryExpression<'db>))] +#[visit(drive(crate::cst::PrimaryType<'db>))] +#[visit(drive(crate::cst::PrivatePropertyIdentifier<'db>))] +#[visit(drive(crate::cst::Program<'db>))] +#[visit(drive(crate::cst::ProgramChildren<'db>))] +#[visit(drive(crate::cst::PropertyIdentifier<'db>))] +#[visit(drive(crate::cst::PropertySignature<'db>))] +#[visit(drive(crate::cst::PropertySignatureChildren<'db>))] +#[visit(drive(crate::cst::PropertySignatureName<'db>))] +#[visit(drive(crate::cst::PublicFieldDefinition<'db>))] +#[visit(drive(crate::cst::PublicFieldDefinitionChildren<'db>))] +#[visit(drive(crate::cst::PublicFieldDefinitionName<'db>))] +#[visit(drive(crate::cst::ReadonlyType<'db>))] +#[visit(drive(crate::cst::ReadonlyTypeChildren<'db>))] +#[visit(drive(crate::cst::Regex<'db>))] +#[visit(drive(crate::cst::RegexChildren<'db>))] +#[visit(drive(crate::cst::RegexFlags<'db>))] +#[visit(drive(crate::cst::RegexPattern<'db>))] +#[visit(drive(crate::cst::RequiredParameter<'db>))] +#[visit(drive(crate::cst::RequiredParameterChildren<'db>))] +#[visit(drive(crate::cst::RequiredParameterName<'db>))] +#[visit(drive(crate::cst::RequiredParameterPattern<'db>))] +#[visit(drive(crate::cst::RestPattern<'db>))] +#[visit(drive(crate::cst::RestPatternChildren<'db>))] +#[visit(drive(crate::cst::RestType<'db>))] +#[visit(drive(crate::cst::RestTypeChildren<'db>))] +#[visit(drive(crate::cst::ReturnStatement<'db>))] +#[visit(drive(crate::cst::ReturnStatementChildren<'db>))] +#[visit(drive(crate::cst::SatisfiesExpression<'db>))] +#[visit(drive(crate::cst::SatisfiesExpressionChildren<'db>))] +#[visit(drive(crate::cst::SequenceExpression<'db>))] +#[visit(drive(crate::cst::SequenceExpressionChildren<'db>))] +#[visit(drive(crate::cst::ShorthandPropertyIdentifier<'db>))] +#[visit(drive(crate::cst::ShorthandPropertyIdentifierPattern<'db>))] +#[visit(drive(crate::cst::SpreadElement<'db>))] +#[visit(drive(crate::cst::SpreadElementChildren<'db>))] +#[visit(drive(crate::cst::Statement<'db>))] +#[visit(drive(crate::cst::StatementBlock<'db>))] +#[visit(drive(crate::cst::StatementBlockChildren<'db>))] +#[visit(drive(crate::cst::StatementIdentifier<'db>))] +#[visit(drive(crate::cst::String<'db>))] +#[visit(drive(crate::cst::StringChildren<'db>))] +#[visit(drive(crate::cst::StringFragment<'db>))] +#[visit(drive(crate::cst::SubscriptExpression<'db>))] +#[visit(drive(crate::cst::SubscriptExpressionChildren<'db>))] +#[visit(drive(crate::cst::SubscriptExpressionIndex<'db>))] +#[visit(drive(crate::cst::Super<'db>))] +#[visit(drive(crate::cst::SwitchBody<'db>))] +#[visit(drive(crate::cst::SwitchBodyChildren<'db>))] +#[visit(drive(crate::cst::SwitchCase<'db>))] +#[visit(drive(crate::cst::SwitchCaseChildren<'db>))] +#[visit(drive(crate::cst::SwitchCaseValue<'db>))] +#[visit(drive(crate::cst::SwitchDefault<'db>))] +#[visit(drive(crate::cst::SwitchDefaultChildren<'db>))] +#[visit(drive(crate::cst::SwitchStatement<'db>))] +#[visit(drive(crate::cst::SwitchStatementChildren<'db>))] +#[visit(drive(crate::cst::TemplateLiteralType<'db>))] +#[visit(drive(crate::cst::TemplateLiteralTypeChildren<'db>))] +#[visit(drive(crate::cst::TemplateString<'db>))] +#[visit(drive(crate::cst::TemplateStringChildren<'db>))] +#[visit(drive(crate::cst::TemplateSubstitution<'db>))] +#[visit(drive(crate::cst::TemplateSubstitutionChildren<'db>))] +#[visit(drive(crate::cst::TemplateType<'db>))] +#[visit(drive(crate::cst::TemplateTypeChildren<'db>))] +#[visit(drive(crate::cst::TernaryExpression<'db>))] +#[visit(drive(crate::cst::TernaryExpressionChildren<'db>))] +#[visit(drive(crate::cst::This<'db>))] +#[visit(drive(crate::cst::ThisType<'db>))] +#[visit(drive(crate::cst::ThrowStatement<'db>))] +#[visit(drive(crate::cst::ThrowStatementChildren<'db>))] +#[visit(drive(crate::cst::True<'db>))] +#[visit(drive(crate::cst::TryStatement<'db>))] +#[visit(drive(crate::cst::TryStatementChildren<'db>))] +#[visit(drive(crate::cst::TupleType<'db>))] +#[visit(drive(crate::cst::TupleTypeChildren<'db>))] +#[visit(drive(crate::cst::Type<'db>))] +#[visit(drive(crate::cst::TypeAliasDeclaration<'db>))] +#[visit(drive(crate::cst::TypeAliasDeclarationChildren<'db>))] +#[visit(drive(crate::cst::TypeAnnotation<'db>))] +#[visit(drive(crate::cst::TypeAnnotationChildren<'db>))] +#[visit(drive(crate::cst::TypeArguments<'db>))] +#[visit(drive(crate::cst::TypeArgumentsChildren<'db>))] +#[visit(drive(crate::cst::TypeAssertion<'db>))] +#[visit(drive(crate::cst::TypeAssertionChildren<'db>))] +#[visit(drive(crate::cst::TypeIdentifier<'db>))] +#[visit(drive(crate::cst::TypeParameter<'db>))] +#[visit(drive(crate::cst::TypeParameterChildren<'db>))] +#[visit(drive(crate::cst::TypeParameters<'db>))] +#[visit(drive(crate::cst::TypeParametersChildren<'db>))] +#[visit(drive(crate::cst::TypePredicate<'db>))] +#[visit(drive(crate::cst::TypePredicateAnnotation<'db>))] +#[visit(drive(crate::cst::TypePredicateAnnotationChildren<'db>))] +#[visit(drive(crate::cst::TypePredicateChildren<'db>))] +#[visit(drive(crate::cst::TypePredicateName<'db>))] +#[visit(drive(crate::cst::TypeQuery<'db>))] +#[visit(drive(crate::cst::TypeQueryChildren<'db>))] +#[visit(drive(crate::cst::UnaryExpression<'db>))] +#[visit(drive(crate::cst::UnaryExpressionArgument<'db>))] +#[visit(drive(crate::cst::UnaryExpressionChildren<'db>))] +#[visit(drive(crate::cst::UnaryExpressionOperator<'db>))] +#[visit(drive(crate::cst::Undefined<'db>))] +#[visit(drive(crate::cst::UnionType<'db>))] +#[visit(drive(crate::cst::UnionTypeChildren<'db>))] +#[visit(drive(crate::cst::UpdateExpression<'db>))] +#[visit(drive(crate::cst::UpdateExpressionChildren<'db>))] +#[visit(drive(crate::cst::UpdateExpressionOperator<'db>))] +#[visit(drive(crate::cst::VariableDeclaration<'db>))] +#[visit(drive(crate::cst::VariableDeclarationChildren<'db>))] +#[visit(drive(crate::cst::VariableDeclarator<'db>))] +#[visit(drive(crate::cst::VariableDeclaratorChildren<'db>))] +#[visit(drive(crate::cst::VariableDeclaratorName<'db>))] +#[visit(drive(crate::cst::WhileStatement<'db>))] +#[visit(drive(crate::cst::WhileStatementChildren<'db>))] +#[visit(drive(crate::cst::WithStatement<'db>))] +#[visit(drive(crate::cst::WithStatementChildren<'db>))] +#[visit(drive(crate::cst::YieldExpression<'db>))] +#[visit(drive(crate::cst::YieldExpressionChildren<'db>))] +#[visit(drive(forBox))] +#[visit(drive(forVec))] +#[visit(drive(forOption))] +#[visit( + enter(AbstractClassDeclaration:crate::cst::AbstractClassDeclaration<'db>), + enter(AbstractMethodSignature:crate::cst::AbstractMethodSignature<'db>), + enter(FunctionSignature:crate::cst::FunctionSignature<'db>), + enter(InterfaceDeclaration:crate::cst::InterfaceDeclaration<'db>), + enter(Module:crate::cst::Module<'db>) +)] +pub struct Definitions<'db> { + pub classes: BTreeMap>>, + pub functions: BTreeMap>>, + pub interfaces: BTreeMap>>, + pub methods: BTreeMap>>, + pub modules: BTreeMap>>, + phantom: std::marker::PhantomData<&'db ()>, +} +impl<'db> Definitions<'db> { + fn enter_AbstractClassDeclaration( + &mut self, + node: &crate::cst::AbstractClassDeclaration<'db>, + ) { + ///Code for query: (abstract_class_declaration name: (type_identifier) @name) @definition.class + let name = &*node.name; + self.classes.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } + fn enter_AbstractMethodSignature( + &mut self, + node: &crate::cst::AbstractMethodSignature<'db>, + ) { + ///Code for query: (abstract_method_signature name: (property_identifier) @name) @definition.method + let name = &*node.name; + self.methods.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } + fn enter_FunctionSignature(&mut self, node: &crate::cst::FunctionSignature<'db>) { + ///Code for query: (function_signature name: (identifier) @name) @definition.function + let name = &*node.name; + self.functions.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } + fn enter_InterfaceDeclaration( + &mut self, + node: &crate::cst::InterfaceDeclaration<'db>, + ) { + ///Code for query: (interface_declaration name: (type_identifier) @name) @definition.interface + let name = &*node.name; + self.interfaces.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } + fn enter_Module(&mut self, node: &crate::cst::Module<'db>) { + ///Code for query: (module name: (identifier) @name) @definition.module + let name = &*node.name; + self.modules.entry(name.source()).or_insert(Vec::new()).push(node.clone()); + } +} diff --git a/codegen-sdk-ast-generator/src/visitor.rs b/codegen-sdk-ast-generator/src/visitor.rs index a152b48..a0baeff 100644 --- a/codegen-sdk-ast-generator/src/visitor.rs +++ b/codegen-sdk-ast-generator/src/visitor.rs @@ -88,7 +88,7 @@ pub fn generate_visitor<'db>( #[derive(Visitor, Visit, Debug, Clone, Eq, PartialEq, salsa::Update, Hash, Default)] #visitor pub struct #name<'db> { - #(pub #names: Vec>,)* + #(pub #names: BTreeMap>>,)* phantom: std::marker::PhantomData<&'db ()>, } impl<'db> #name<'db> { @@ -99,16 +99,19 @@ pub fn generate_visitor<'db>( #[cfg(all(test))] mod tests { - use codegen_sdk_common::language::typescript::Typescript; + use codegen_sdk_common::language::{python::Python, typescript::Typescript}; + use rstest::rstest; use super::*; - #[test_log::test] - fn test_generate_visitor() { - let language = &Typescript; + #[test_log::test(rstest)] + #[case::typescript(&Typescript)] + #[case::python(&Python)] + fn test_generate_visitor(#[case] language: &Language) { let db = codegen_sdk_cst::CSTDatabase::default(); let visitor = generate_visitor(&db, language, "definition"); insta::assert_snapshot!( + format!("{}", language.name()), codegen_sdk_common::generator::format_code_string(&visitor.to_string()).unwrap() ); } diff --git a/codegen-sdk-macros/src/lib.rs b/codegen-sdk-macros/src/lib.rs index 3db7f56..57b9250 100644 --- a/codegen-sdk-macros/src/lib.rs +++ b/codegen-sdk-macros/src/lib.rs @@ -39,6 +39,7 @@ use quote::{format_ident, quote}; #[proc_macro] pub fn languages_ast(_item: TokenStream) -> TokenStream { let mut output = Vec::new(); + let mut from_conversions = proc_macro2::TokenStream::new(); for language in LANGUAGES.iter() { if language.name() == "ts_query" { continue; @@ -52,6 +53,19 @@ pub fn languages_ast(_item: TokenStream) -> TokenStream { #struct_name(#package_name::ast::#file_name<'db>), }; output.push(variant); + from_conversions.extend_one(quote! { + #[cfg(feature = #name)] + impl<'db> TryInto<#package_name::ast::#file_name<'db>> for ParsedFile<'db> { + type Error = (); + fn try_into(self) -> Result<#package_name::ast::#file_name<'db>, ()> { + if let Self::#struct_name(parsed) = self { + Ok(parsed) + } else { + Err(()) + } + } + } + }); } let enum_output: TokenStream = quote! { #[derive(Debug, Clone, Eq, PartialEq, Hash, salsa::Update)] @@ -67,8 +81,10 @@ pub fn languages_ast(_item: TokenStream) -> TokenStream { pub enum ParsedFile<'db> { #(#output)* } + #from_conversions } .into(); + enum_output } @@ -88,6 +104,7 @@ pub fn parse_language(_item: TokenStream) -> TokenStream { let parsed = #package_name::ast::parse(db, file); return Parsed::new( db, + file.path(db), Some(ParsedFile::#struct_name(parsed)), ); } diff --git a/codegen-sdk-resolution/Cargo.toml b/codegen-sdk-resolution/Cargo.toml new file mode 100644 index 0000000..fba1a9c --- /dev/null +++ b/codegen-sdk-resolution/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "codegen-sdk-resolution" +description = "Traits for implementing type resolution in codegen-sdk" +version = "0.1.0" +edition = "2024" + +[dependencies] +salsa = { workspace = true } diff --git a/codegen-sdk-resolution/src/codebase.rs b/codegen-sdk-resolution/src/codebase.rs new file mode 100644 index 0000000..35b3e6e --- /dev/null +++ b/codegen-sdk-resolution/src/codebase.rs @@ -0,0 +1,13 @@ +use std::path::PathBuf; + +use salsa::Database; +// Not sure what to name this +// Equivalent to CodebaseGraph/CodebaseContext in the SDK +pub trait CodebaseContext { + type File<'a> + where + Self: 'a; + fn files<'a>(&'a self) -> Vec<&'a Self::File<'a>>; + fn db(&self) -> &dyn Database; + fn get_file<'a>(&'a self, path: PathBuf) -> Option<&'a Self::File<'a>>; +} diff --git a/codegen-sdk-resolution/src/lib.rs b/codegen-sdk-resolution/src/lib.rs new file mode 100644 index 0000000..7a3184e --- /dev/null +++ b/codegen-sdk-resolution/src/lib.rs @@ -0,0 +1,8 @@ +mod scope; +pub use scope::Scope; +mod resolve_type; +pub use resolve_type::ResolveType; +mod references; +pub use references::References; +mod codebase; +pub use codebase::CodebaseContext; diff --git a/codegen-sdk-resolution/src/references.rs b/codegen-sdk-resolution/src/references.rs new file mode 100644 index 0000000..81db74d --- /dev/null +++ b/codegen-sdk-resolution/src/references.rs @@ -0,0 +1,30 @@ +use crate::{CodebaseContext, ResolveType}; + +pub trait References< + 'db, + ReferenceType: ResolveType<'db, Scope, Type = Self> + Clone, // References must resolve to this type + Scope: crate::Scope<'db, Type = Self, ReferenceType = ReferenceType> + Clone, +>: Eq + PartialEq +{ + fn references + Clone + 'db, T>(&self, codebase: &'db T, scope: &Scope) -> Vec + where + Self: Sized, + for<'b> T: CodebaseContext = F> + 'static, + { + let scopes: Vec = codebase.files().into_iter().filter_map(|file| file.clone().try_into().ok()).collect(); + return self.references_for_scopes(codebase.db(), scopes, scope); + } + fn references_for_scopes(&self, db: &'db dyn salsa::Database, scopes: Vec, scope: &Scope) -> Vec + where + Self: Sized, + { + let mut results = Vec::new(); + for reference in scope.clone().resolvables(db) { + let resolved = reference.clone().resolve_type(db, scope.clone(), scopes.clone()); + if resolved.iter().any(|result| result == self) { + results.push(reference); + } + } + results + } +} diff --git a/codegen-sdk-resolution/src/resolve_type.rs b/codegen-sdk-resolution/src/resolve_type.rs new file mode 100644 index 0000000..72a134a --- /dev/null +++ b/codegen-sdk-resolution/src/resolve_type.rs @@ -0,0 +1,12 @@ +use crate::Scope; + +// Get definitions for a given type +pub trait ResolveType<'db, T: Scope<'db>> { + type Type; // Possible types this trait can be defined as + fn resolve_type( + self, + db: &'db dyn salsa::Database, + scope: T, + scopes: Vec, + ) -> Vec; +} diff --git a/codegen-sdk-resolution/src/scope.rs b/codegen-sdk-resolution/src/scope.rs new file mode 100644 index 0000000..b98dd09 --- /dev/null +++ b/codegen-sdk-resolution/src/scope.rs @@ -0,0 +1,10 @@ +use crate::ResolveType; + +// Resolve a given string name in a scope to a given type +pub trait Scope<'db>: Sized { + type Type; + type ReferenceType: ResolveType<'db, Self, Type = Self::Type>; + fn resolve(self, db: &'db dyn salsa::Database, name: String) -> Vec; + /// Get all the resolvables (IE: function_calls) in the scope + fn resolvables(self, db: &'db dyn salsa::Database) -> Vec; +} diff --git a/languages/codegen-sdk-python/Cargo.toml b/languages/codegen-sdk-python/Cargo.toml index 573fbcb..37e4eef 100644 --- a/languages/codegen-sdk-python/Cargo.toml +++ b/languages/codegen-sdk-python/Cargo.toml @@ -16,6 +16,7 @@ bytes = { workspace = true } codegen-sdk-cst = { workspace = true } log = { workspace = true } codegen-sdk-ast = { workspace = true } +codegen-sdk-resolution = { workspace = true } [build-dependencies] codegen-sdk-cst-generator = { workspace = true } @@ -23,6 +24,9 @@ codegen-sdk-ast-generator = { workspace = true } codegen-sdk-common = { workspace = true, features = ["python"] } env_logger = { workspace = true } log = { workspace = true } +[dev-dependencies] +test-log = { workspace = true } +tempfile = {workspace = true} [features] serialization = ["codegen-sdk-common/serialization"] diff --git a/languages/codegen-sdk-python/src/lib.rs b/languages/codegen-sdk-python/src/lib.rs index c489609..bfdaf00 100644 --- a/languages/codegen-sdk-python/src/lib.rs +++ b/languages/codegen-sdk-python/src/lib.rs @@ -5,5 +5,48 @@ pub mod cst { include!(concat!(env!("OUT_DIR"), "/python.rs")); } pub mod ast { + use codegen_sdk_ast::{Definitions as _, References as _}; + use codegen_sdk_resolution::{ResolveType, Scope}; include!(concat!(env!("OUT_DIR"), "/python-ast.rs")); + #[salsa::tracked] + impl<'db> Scope<'db> for PythonFile<'db> { + type Type = crate::cst::FunctionDefinition<'db>; + type ReferenceType = crate::cst::Call<'db>; + #[salsa::tracked] + fn resolve(self, db: &'db dyn salsa::Database, name: String) -> Vec { + let mut results = Vec::new(); + for (def_name, defs) in self.definitions(db).functions.iter() { + if def_name == &name { + results.extend(defs.iter().cloned()); + } + } + results + } + #[salsa::tracked] + fn resolvables(self, db: &'db dyn salsa::Database) -> Vec { + let mut results = Vec::new(); + for (_, refs) in self.references(db).calls.into_iter() { + results.extend(refs); + } + results + } + } + #[salsa::tracked] + impl<'db> ResolveType<'db, PythonFile<'db>> for crate::cst::Call<'db> { + type Type = crate::cst::FunctionDefinition<'db>; + #[salsa::tracked] + fn resolve_type( + self, + db: &'db dyn salsa::Database, + scope: PythonFile<'db>, + _scopes: Vec>, + ) -> Vec { + scope.resolve(db, self.function.source()) + } + } + #[salsa::tracked] + impl<'db> codegen_sdk_resolution::References<'db, crate::cst::Call<'db>, PythonFile<'db>> + for crate::cst::FunctionDefinition<'db> + { + } } diff --git a/languages/codegen-sdk-python/tests/test_python.rs b/languages/codegen-sdk-python/tests/test_python.rs new file mode 100644 index 0000000..7508432 --- /dev/null +++ b/languages/codegen-sdk-python/tests/test_python.rs @@ -0,0 +1,74 @@ +#![recursion_limit = "512"] +use std::path::PathBuf; + +use codegen_sdk_ast::{Definitions, References}; +use codegen_sdk_resolution::References as _; +fn write_to_temp_file(content: &str, temp_dir: &tempfile::TempDir) -> PathBuf { + let file_path = temp_dir.path().join("test.ts"); + std::fs::write(&file_path, content).unwrap(); + file_path +} +// TODO: Fix queries for classes and functions +// #[test_log::test] +// fn test_typescript_ast_class() { +// let temp_dir = tempfile::tempdir().unwrap(); +// let content = "class Test { }"; +// let file_path = write_to_temp_file(content, &temp_dir); +// let file = TypescriptFile::parse(&file_path).unwrap(); +// assert_eq!(file.visitor.classes.len(), 1); +// } +// #[test_log::test] +// fn test_typescript_ast_function() { +// let temp_dir = tempfile::tempdir().unwrap(); +// let content = "function test() { }"; +// let file_path = write_to_temp_file(content, &temp_dir); +// let file = TypescriptFile::parse(&file_path).unwrap(); +// assert_eq!(file.visitor.functions.len(), 1); +// } +#[test_log::test] +fn test_python_ast_class() { + let temp_dir = tempfile::tempdir().unwrap(); + let content = " +class Test: + pass"; + let file_path = write_to_temp_file(content, &temp_dir); + let db = codegen_sdk_cst::CSTDatabase::default(); + let content = codegen_sdk_cst::Input::new(&db, content.to_string()); + let input = codegen_sdk_ast::input::File::new(&db, file_path, content); + let file = codegen_sdk_python::ast::parse_query(&db, input); + assert_eq!(file.definitions(&db).classes.len(), 1); +} +#[test_log::test] +fn test_python_ast_function() { + let temp_dir = tempfile::tempdir().unwrap(); + let content = " +def test(): + pass"; + let file_path = write_to_temp_file(content, &temp_dir); + let db = codegen_sdk_cst::CSTDatabase::default(); + let content = codegen_sdk_cst::Input::new(&db, content.to_string()); + let input = codegen_sdk_ast::input::File::new(&db, file_path, content); + let file = codegen_sdk_python::ast::parse_query(&db, input); + assert_eq!(file.definitions(&db).functions.len(), 1); +} +#[test_log::test] +fn test_python_ast_function_usages() { + let temp_dir = tempfile::tempdir().unwrap(); + let content = " +def test(): + pass + +test()"; + let file_path = write_to_temp_file(content, &temp_dir); + let db = codegen_sdk_cst::CSTDatabase::default(); + let content = codegen_sdk_cst::Input::new(&db, content.to_string()); + let input = codegen_sdk_ast::input::File::new(&db, file_path, content); + let file = codegen_sdk_python::ast::parse_query(&db, input); + assert_eq!(file.references(&db).calls.len(), 1); + let definitions = file.definitions(&db); + let function = definitions.functions.get("test").unwrap().first().unwrap(); + assert_eq!( + function.references_for_scopes(&db, vec![file], &file).len(), + 1 + ); +} diff --git a/src/main.rs b/src/main.rs index 5703ca1..0a85d1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,11 +7,12 @@ use codegen_sdk_ast::Definitions; #[cfg(feature = "serialization")] use codegen_sdk_common::serialize::Cache; use codegen_sdk_core::system::get_memory; +use codegen_sdk_resolution::{CodebaseContext, References}; #[derive(Debug, Parser)] struct Args { input: String, } -fn get_total_definitions(codebase: &Codebase) -> Vec<(usize, usize, usize, usize, usize)> { +fn get_total_definitions(codebase: &Codebase) -> Vec<(usize, usize, usize, usize, usize, usize)> { codebase .files() .into_iter() @@ -25,34 +26,59 @@ fn get_total_definitions(codebase: &Codebase) -> Vec<(usize, usize, usize, usize definitions.interfaces.len(), definitions.methods.len(), definitions.modules.len(), + 0, ); } - (0, 0, 0, 0, 0) + #[cfg(feature = "python")] + if let ParsedFile::Python(file) = parsed { + let definitions = file.definitions(codebase.db()); + let functions = definitions.functions; + let mut total_references = 0; + let total_functions = functions.len(); + for function in functions + .into_iter() + .map(|(_, functions)| functions) + .flatten() + { + total_references += function.references(codebase, file).len(); + } + return ( + definitions.classes.len(), + total_functions, + 0, + 0, + 0, + total_references, + ); + } + (0, 0, 0, 0, 0, 0) }) .collect() } -#[cfg(feature = "typescript")] fn print_definitions(codebase: &Codebase) { let mut total_classes = 0; let mut total_functions = 0; let mut total_interfaces = 0; let mut total_methods = 0; let mut total_modules = 0; + let mut total_references = 0; let definitions = get_total_definitions(codebase); - for (classes, functions, interfaces, methods, modules) in definitions { + for (classes, functions, interfaces, methods, modules, references) in definitions { total_classes += classes; total_functions += functions; total_interfaces += interfaces; total_methods += methods; total_modules += modules; + total_references += references; } log::info!( - "{} classes, {} functions, {} interfaces, {} methods, {} modules", + "{} classes, {} functions, {} interfaces, {} methods, {} modules, {} references", total_classes, total_functions, total_interfaces, total_methods, - total_modules + total_modules, + total_references ); } fn main() -> anyhow::Result<()> {