From c135af2300efd7944eabf5264144a22f232f1afb Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 25 Mar 2025 14:16:24 +0100 Subject: [PATCH 1/3] Rust: crate_graph: generate 'use' statements for re-exported items --- rust/extractor/src/crate_graph.rs | 122 +++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 4 deletions(-) diff --git a/rust/extractor/src/crate_graph.rs b/rust/extractor/src/crate_graph.rs index 358e80ff277..fa8cb657db9 100644 --- a/rust/extractor/src/crate_graph.rs +++ b/rust/extractor/src/crate_graph.rs @@ -9,9 +9,13 @@ use chalk_ir::{FloatTy, Safety}; use itertools::Itertools; use ra_ap_base_db::{Crate, RootQueryDb}; use ra_ap_cfg::CfgAtom; -use ra_ap_hir::{DefMap, ModuleDefId, db::HirDatabase}; +use ra_ap_hir::{DefMap, ModuleDefId, PathKind, db::HirDatabase}; use ra_ap_hir::{VariantId, Visibility, db::DefDatabase}; -use ra_ap_hir_def::{AssocItemId, LocalModuleId, data::adt::VariantData, nameres::ModuleData}; +use ra_ap_hir_def::Lookup; +use ra_ap_hir_def::{ + AssocItemId, LocalModuleId, data::adt::VariantData, item_scope::ImportOrGlob, + item_tree::ImportKind, nameres::ModuleData, path::ImportAlias, +}; use ra_ap_hir_def::{HasModule, visibility::VisibilityExplicitness}; use ra_ap_hir_def::{ModuleId, resolver::HasResolver}; use ra_ap_hir_ty::TraitRefExt; @@ -22,6 +26,7 @@ use ra_ap_hir_ty::{Binders, FnPointer}; use ra_ap_hir_ty::{Interner, ProjectionTy}; use ra_ap_ide_db::RootDatabase; use ra_ap_vfs::{Vfs, VfsPath}; + use std::hash::Hasher; use std::{cmp::Ordering, collections::HashMap, path::PathBuf}; use std::{hash::Hash, vec}; @@ -172,19 +177,116 @@ fn emit_module_children( .collect() } +fn emit_reexport( + db: &dyn HirDatabase, + trap: &mut TrapFile, + uses: &mut HashMap>, + import: ImportOrGlob, + name: &str, +) { + let (use_, idx) = match import { + ImportOrGlob::Glob(import) => (import.use_, import.idx), + ImportOrGlob::Import(import) => (import.use_, import.idx), + }; + let def_db = db.upcast(); + let loc = use_.lookup(def_db); + let use_ = &loc.id.item_tree(def_db)[loc.id.value]; + + use_.use_tree.expand(|id, path, kind, alias| { + if id == idx { + let mut path_components = Vec::new(); + match path.kind { + PathKind::Plain => (), + PathKind::Super(0) => path_components.push("self".to_owned()), + PathKind::Super(n) => { + path_components.extend(std::iter::repeat_n("super".to_owned(), n.into())); + } + PathKind::Crate => path_components.push("crate".to_owned()), + PathKind::Abs => path_components.push("".to_owned()), + PathKind::DollarCrate(crate_id) => { + let crate_extra = crate_id.extra_data(db); + let crate_name = crate_extra + .display_name + .as_ref() + .map(|x| x.canonical_name().to_string()); + path_components.push(crate_name.unwrap_or("crate".to_owned())); + } + } + path_components.extend(path.segments().iter().map(|x| x.as_str().to_owned())); + match kind { + ImportKind::Plain => (), + ImportKind::Glob => path_components.push(name.to_owned()), + ImportKind::TypeOnly => path_components.push("self".to_owned()), + }; + + let alias = alias.map(|alias| match alias { + ImportAlias::Underscore => "_".to_owned(), + ImportAlias::Alias(name) => name.as_str().to_owned(), + }); + let key = format!( + "{} as {}", + path_components.join("::"), + alias.as_ref().unwrap_or(&"".to_owned()) + ); + // prevent duplicate imports + if uses.contains_key(&key) { + return; + } + let rename = alias.map(|name| { + let name = Some(trap.emit(generated::Name { + id: trap::TrapId::Star, + text: Some(name), + })); + trap.emit(generated::Rename { + id: trap::TrapId::Star, + name, + }) + }); + let path = make_qualified_path(trap, path_components); + let use_tree = trap.emit(generated::UseTree { + id: trap::TrapId::Star, + is_glob: false, + path, + rename, + use_tree_list: None, + }); + let visibility = emit_visibility(db, trap, Visibility::Public); + uses.insert( + key, + trap.emit(generated::Use { + id: trap::TrapId::Star, + attrs: vec![], + use_tree: Some(use_tree), + visibility, + }) + .into(), + ); + } + }); +} + fn emit_module_items( db: &dyn HirDatabase, module: &ModuleData, trap: &mut TrapFile, ) -> Vec> { let mut items = Vec::new(); + let mut uses = HashMap::new(); let item_scope = &module.scope; for (name, item) in item_scope.entries() { let def = item.filter_visibility(|x| matches!(x, ra_ap_hir::Visibility::Public)); + if let Some(ra_ap_hir_def::per_ns::Item { + def: _, + vis: _, + import: Some(import), + }) = def.values + { + emit_reexport(db, trap, &mut uses, import, name.as_str()); + } if let Some(ra_ap_hir_def::per_ns::Item { def: value, vis, - import: _, + import: None, }) = def.values { match value { @@ -203,10 +305,21 @@ fn emit_module_items( _ => (), } } + if let Some(ra_ap_hir_def::per_ns::Item { + def: _, + vis: _, + import: Some(import), + }) = def.types + { + // TODO: handle ExternCrate as well? + if let Some(import) = import.import_or_glob() { + emit_reexport(db, trap, &mut uses, import, name.as_str()); + } + } if let Some(ra_ap_hir_def::per_ns::Item { def: type_id, vis, - import: _, + import: None, }) = def.types { match type_id { @@ -220,6 +333,7 @@ fn emit_module_items( } } } + items.extend(uses.values()); items } From d84baaa0f800e85b330e2f9d2af8b6dad6c538d5 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 25 Mar 2025 14:19:10 +0100 Subject: [PATCH 2/3] Rust: implement Use::toString --- rust/ql/.generated.list | 2 -- rust/ql/.gitattributes | 2 -- .../codeql/rust/elements/internal/UseImpl.qll | 6 ++++-- .../rust/elements/internal/UseTreeImpl.qll | 18 ++++++++++++++++-- .../canonical_path/canonical_paths.expected | 4 ++-- .../canonical_paths.expected | 4 ++-- .../CONSISTENCY/AstConsistency.expected | 4 ++-- .../MacroItems/MacroItems_getItem.expected | 2 +- .../generated/UseTree/UseTree.expected | 14 +++++++------- .../generated/UseTree/UseTree_getPath.expected | 14 +++++++------- .../UseTree/UseTree_getRename.expected | 2 +- .../UseTree/UseTree_getUseTreeList.expected | 2 +- 12 files changed, 43 insertions(+), 31 deletions(-) diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 79d9eabff3a..89138a2b01b 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -440,9 +440,7 @@ lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll 2f90bfd5e43113da115 lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll 84d4a959d098fcd1713cb169e15b4945d846121701d2c5709b11e19202c21f2b 93113c92be9bc9f0b8530c308fe482dfeddc7dc827fc44049cecb3eab28df731 lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll 43caeeb43b4b9480bd586f58124ef3b14980ba61c47326799ca7cb98dd3b7394 71936dd5dd0428ab24c697232770bc7309c22e5de6a17db23443b78f245078a4 lib/codeql/rust/elements/internal/UseConstructor.qll a4f790795e18abc29a50d6fbaa0db64cba781e3259a42cbf0468c24ac66b63e7 2fa288f073ac094a838c11f091def2c790b347b6a1b79407c11b10c73d6bff57 -lib/codeql/rust/elements/internal/UseImpl.qll ba779517c3c928ab6e794360b6344829e84ec6da5e1de1b03b4eaf8bdae58ce9 0f4ead9eecb584eb9827502276ffe8cb1da0d2fa4b8f660d2afc26ac4e0fba86 lib/codeql/rust/elements/internal/UseTreeConstructor.qll 3e6e834100fcc7249f8a20f8bd9debe09b705fcf5a0e655537e71ac1c6f7956b cdbc84b8f1b009be1e4a7aaba7f5237823cea62c86b38f1794aad97e3dfcf64b -lib/codeql/rust/elements/internal/UseTreeImpl.qll d478495a62e466fa4f443ffcf0d5235a7278fa9e8565267e73bb78210b7d54a1 76b71392b12f1bd7e66dd9e2902f48a1c27dce01fadad3a23e5a680d64fa0d49 lib/codeql/rust/elements/internal/UseTreeListConstructor.qll 973577da5d7b58eb245f108bd1ae2fecc5645f2795421dedf7687b067a233003 f41e5e3ffcb2a387e5c37f56c0b271e8dc20428b6ff4c63e1ee42fcfa4e67d0a lib/codeql/rust/elements/internal/UseTreeListImpl.qll 6cac5242f1219df0fe9b3c139db8cc075a2fde618614ca56de2c856130a8ebaa d2ec917055a45f4d07d4ea6dff14298925ae323b165a5bcb6e906f7aad463f82 lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063d308c8d0e7a067d028b9ec97de10a1d659ee2cfdd 6a4bee28b340e97d06b262120fd39ab21717233a5bcc142ba542cb1b456eb952 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index bd0d20063fa..2c66ca19d95 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -442,9 +442,7 @@ /lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UseTreeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VariantConstructor.qll linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll index 3b45ab46439..5c2567fc3d7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Use`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.Use * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Use. For example: * ```rust * todo!() * ``` */ - class Use extends Generated::Use { } + class Use extends Generated::Use { + override string toStringImpl() { result = "use " + this.getUseTree() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseTreeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseTreeImpl.qll index 2820c2ba6d7..ef1be77ef78 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseTreeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseTreeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UseTree`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.UseTree * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A UseTree. For example: * ```rust @@ -21,5 +21,19 @@ module Impl { * use std::collections::{self, HashMap, HashSet}; * ``` */ - class UseTree extends Generated::UseTree { } + class UseTree extends Generated::UseTree { + override string toStringImpl() { + result = strictconcat(int i | | this.toStringPart(i) order by i) + } + + private string toStringPart(int index) { + result = this.getPath().toStringImpl() and index = 0 + or + result = "::{...}" and this.hasUseTreeList() and index = 1 + or + result = "::*" and this.isGlob() and index = 2 + or + result = " as " + this.getRename().getName().getText() and index = 3 + } + } } diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index c6dae9ae3fc..c7f85fb86f8 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -1,5 +1,5 @@ canonicalPaths -| anonymous.rs:1:1:1:26 | Use | None | None | +| anonymous.rs:1:1:1:26 | use ...::Trait | None | None | | anonymous.rs:3:1:32:1 | fn canonicals | repo::test | crate::anonymous::canonicals | | anonymous.rs:4:5:4:23 | struct OtherStruct | None | None | | anonymous.rs:6:5:8:5 | trait OtherTrait | None | None | @@ -33,7 +33,7 @@ canonicalPaths | regular.rs:34:1:38:1 | enum MyEnum | repo::test | crate::regular::MyEnum | | regular.rs:40:1:46:1 | fn enum_qualified_usage | repo::test | crate::regular::enum_qualified_usage | | regular.rs:48:1:55:1 | fn enum_unqualified_usage | repo::test | crate::regular::enum_unqualified_usage | -| regular.rs:51:5:51:18 | Use | None | None | +| regular.rs:51:5:51:18 | use MyEnum::* | None | None | | regular.rs:57:1:63:1 | fn enum_match | repo::test | crate::regular::enum_match | resolvedPaths | anonymous.rs:27:17:27:30 | OtherStruct {...} | None | None | diff --git a/rust/ql/test/extractor-tests/canonical_path_disabled/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path_disabled/canonical_paths.expected index 6a19610d76f..ec6b4bad150 100644 --- a/rust/ql/test/extractor-tests/canonical_path_disabled/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path_disabled/canonical_paths.expected @@ -1,5 +1,5 @@ canonicalPaths -| anonymous.rs:4:1:4:26 | Use | None | None | +| anonymous.rs:4:1:4:26 | use ...::Trait | None | None | | anonymous.rs:6:1:35:1 | fn canonicals | None | None | | anonymous.rs:7:5:7:23 | struct OtherStruct | None | None | | anonymous.rs:9:5:11:5 | trait OtherTrait | None | None | @@ -33,7 +33,7 @@ canonicalPaths | regular.rs:37:1:41:1 | enum MyEnum | None | None | | regular.rs:43:1:49:1 | fn enum_qualified_usage | None | None | | regular.rs:51:1:58:1 | fn enum_unqualified_usage | None | None | -| regular.rs:54:5:54:18 | Use | None | None | +| regular.rs:54:5:54:18 | use MyEnum::* | None | None | | regular.rs:60:1:66:1 | fn enum_match | None | None | resolvedPaths | anonymous.rs:30:17:30:30 | OtherStruct {...} | None | None | diff --git a/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/AstConsistency.expected b/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/AstConsistency.expected index 65117407456..1e47287a293 100644 --- a/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/AstConsistency.expected +++ b/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/AstConsistency.expected @@ -2,6 +2,7 @@ noLocation | file://:0:0:0:0 | ... .unwrap(...) | | file://:0:0:0:0 | ...: ... | | file://:0:0:0:0 | ...::Path | +| file://:0:0:0:0 | ...::Path | | file://:0:0:0:0 | ...::path | | file://:0:0:0:0 | ArgList | | file://:0:0:0:0 | ArgList | @@ -20,8 +21,6 @@ noLocation | file://:0:0:0:0 | RefTypeRepr | | file://:0:0:0:0 | RetTypeRepr | | file://:0:0:0:0 | StmtList | -| file://:0:0:0:0 | Use | -| file://:0:0:0:0 | UseTree | | file://:0:0:0:0 | fn get_parent | | file://:0:0:0:0 | get_parent | | file://:0:0:0:0 | parent | @@ -38,4 +37,5 @@ noLocation | file://:0:0:0:0 | std | | file://:0:0:0:0 | std | | file://:0:0:0:0 | unwrap | +| file://:0:0:0:0 | use ...::Path | | file://:0:0:0:0 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected index dee883ca8b7..08f3925f5a4 100644 --- a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected +++ b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected @@ -1,2 +1,2 @@ -| gen_macro_items.rs:5:5:5:38 | MacroItems | 0 | file://:0:0:0:0 | Use | +| gen_macro_items.rs:5:5:5:38 | MacroItems | 0 | file://:0:0:0:0 | use ...::Path | | gen_macro_items.rs:5:5:5:38 | MacroItems | 1 | file://:0:0:0:0 | fn get_parent | diff --git a/rust/ql/test/extractor-tests/generated/UseTree/UseTree.expected b/rust/ql/test/extractor-tests/generated/UseTree/UseTree.expected index 74145411e3d..ac5d1b77295 100644 --- a/rust/ql/test/extractor-tests/generated/UseTree/UseTree.expected +++ b/rust/ql/test/extractor-tests/generated/UseTree/UseTree.expected @@ -1,7 +1,7 @@ -| gen_use_tree.rs:5:9:5:33 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | -| gen_use_tree.rs:6:9:6:27 | UseTree | isGlob: | yes | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | -| gen_use_tree.rs:7:9:7:46 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | yes | hasUseTreeList: | no | -| gen_use_tree.rs:8:9:8:50 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | yes | -| gen_use_tree.rs:8:28:8:31 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | -| gen_use_tree.rs:8:34:8:40 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | -| gen_use_tree.rs:8:43:8:49 | UseTree | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | +| gen_use_tree.rs:5:9:5:33 | ...::HashMap | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | +| gen_use_tree.rs:6:9:6:27 | ...::collections::* | isGlob: | yes | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | +| gen_use_tree.rs:7:9:7:46 | ...::HashMap as MyHashMap | isGlob: | no | hasPath: | yes | hasRename: | yes | hasUseTreeList: | no | +| gen_use_tree.rs:8:9:8:50 | ...::collections::{...} | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | yes | +| gen_use_tree.rs:8:28:8:31 | self | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | +| gen_use_tree.rs:8:34:8:40 | HashMap | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | +| gen_use_tree.rs:8:43:8:49 | HashSet | isGlob: | no | hasPath: | yes | hasRename: | no | hasUseTreeList: | no | diff --git a/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getPath.expected b/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getPath.expected index 6560c5fb456..b6164b65342 100644 --- a/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getPath.expected +++ b/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getPath.expected @@ -1,7 +1,7 @@ -| gen_use_tree.rs:5:9:5:33 | UseTree | gen_use_tree.rs:5:9:5:33 | ...::HashMap | -| gen_use_tree.rs:6:9:6:27 | UseTree | gen_use_tree.rs:6:9:6:24 | ...::collections | -| gen_use_tree.rs:7:9:7:46 | UseTree | gen_use_tree.rs:7:9:7:33 | ...::HashMap | -| gen_use_tree.rs:8:9:8:50 | UseTree | gen_use_tree.rs:8:9:8:24 | ...::collections | -| gen_use_tree.rs:8:28:8:31 | UseTree | gen_use_tree.rs:8:28:8:31 | self | -| gen_use_tree.rs:8:34:8:40 | UseTree | gen_use_tree.rs:8:34:8:40 | HashMap | -| gen_use_tree.rs:8:43:8:49 | UseTree | gen_use_tree.rs:8:43:8:49 | HashSet | +| gen_use_tree.rs:5:9:5:33 | ...::HashMap | gen_use_tree.rs:5:9:5:33 | ...::HashMap | +| gen_use_tree.rs:6:9:6:27 | ...::collections::* | gen_use_tree.rs:6:9:6:24 | ...::collections | +| gen_use_tree.rs:7:9:7:46 | ...::HashMap as MyHashMap | gen_use_tree.rs:7:9:7:33 | ...::HashMap | +| gen_use_tree.rs:8:9:8:50 | ...::collections::{...} | gen_use_tree.rs:8:9:8:24 | ...::collections | +| gen_use_tree.rs:8:28:8:31 | self | gen_use_tree.rs:8:28:8:31 | self | +| gen_use_tree.rs:8:34:8:40 | HashMap | gen_use_tree.rs:8:34:8:40 | HashMap | +| gen_use_tree.rs:8:43:8:49 | HashSet | gen_use_tree.rs:8:43:8:49 | HashSet | diff --git a/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getRename.expected b/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getRename.expected index 0ccdbacfc49..77c4b31a86a 100644 --- a/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getRename.expected +++ b/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getRename.expected @@ -1 +1 @@ -| gen_use_tree.rs:7:9:7:46 | UseTree | gen_use_tree.rs:7:35:7:46 | Rename | +| gen_use_tree.rs:7:9:7:46 | ...::HashMap as MyHashMap | gen_use_tree.rs:7:35:7:46 | Rename | diff --git a/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getUseTreeList.expected b/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getUseTreeList.expected index f5bb77ce720..547fb0bd37b 100644 --- a/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getUseTreeList.expected +++ b/rust/ql/test/extractor-tests/generated/UseTree/UseTree_getUseTreeList.expected @@ -1 +1 @@ -| gen_use_tree.rs:8:9:8:50 | UseTree | gen_use_tree.rs:8:27:8:50 | UseTreeList | +| gen_use_tree.rs:8:9:8:50 | ...::collections::{...} | gen_use_tree.rs:8:27:8:50 | UseTreeList | From ec9fe8079e11962514d5c72ae57d880500235d4f Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 25 Mar 2025 14:24:00 +0100 Subject: [PATCH 3/3] Rust: add tests for re-export statements --- .../extractor-tests/crate_graph/module.rs | 3 + .../crate_graph/modules.expected | 90 +++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/rust/ql/test/extractor-tests/crate_graph/module.rs b/rust/ql/test/extractor-tests/crate_graph/module.rs index e163026e817..17ef271a729 100644 --- a/rust/ql/test/extractor-tests/crate_graph/module.rs +++ b/rust/ql/test/extractor-tests/crate_graph/module.rs @@ -40,3 +40,6 @@ impl fmt::Display for X { pub const X_A: X = X::A; pub static X_B: X = X::B; + +pub use std::fs::create_dir as mkdir; +pub use std::{fs::*, path::PathBuf}; diff --git a/rust/ql/test/extractor-tests/crate_graph/modules.expected b/rust/ql/test/extractor-tests/crate_graph/modules.expected index 0bf8f0858f8..40ee24579e0 100644 --- a/rust/ql/test/extractor-tests/crate_graph/modules.expected +++ b/rust/ql/test/extractor-tests/crate_graph/modules.expected @@ -31,8 +31,98 @@ lib.rs: #-----| -> impl AsString for ...::X { ... } #-----| -> struct X_List #-----| -> trait AsString +#-----| -> use ...::DirBuilder +#-----| -> use ...::DirEntry +#-----| -> use ...::File +#-----| -> use ...::FileTimes +#-----| -> use ...::FileType +#-----| -> use ...::Metadata +#-----| -> use ...::OpenOptions +#-----| -> use ...::PathBuf +#-----| -> use ...::Permissions +#-----| -> use ...::ReadDir +#-----| -> use ...::canonicalize +#-----| -> use ...::copy +#-----| -> use ...::create_dir +#-----| -> use ...::create_dir as mkdir +#-----| -> use ...::create_dir_all +#-----| -> use ...::exists +#-----| -> use ...::hard_link +#-----| -> use ...::metadata +#-----| -> use ...::read +#-----| -> use ...::read_dir +#-----| -> use ...::read_link +#-----| -> use ...::read_to_string +#-----| -> use ...::remove_dir +#-----| -> use ...::remove_dir_all +#-----| -> use ...::remove_file +#-----| -> use ...::rename +#-----| -> use ...::set_permissions +#-----| -> use ...::soft_link +#-----| -> use ...::symlink_metadata +#-----| -> use ...::write #-----| struct X_List #-----| trait AsString #-----| -> fn as_string + +#-----| use ...::DirBuilder + +#-----| use ...::DirEntry + +#-----| use ...::File + +#-----| use ...::FileTimes + +#-----| use ...::FileType + +#-----| use ...::Metadata + +#-----| use ...::OpenOptions + +#-----| use ...::PathBuf + +#-----| use ...::Permissions + +#-----| use ...::ReadDir + +#-----| use ...::canonicalize + +#-----| use ...::copy + +#-----| use ...::create_dir + +#-----| use ...::create_dir as mkdir + +#-----| use ...::create_dir_all + +#-----| use ...::exists + +#-----| use ...::hard_link + +#-----| use ...::metadata + +#-----| use ...::read + +#-----| use ...::read_dir + +#-----| use ...::read_link + +#-----| use ...::read_to_string + +#-----| use ...::remove_dir + +#-----| use ...::remove_dir_all + +#-----| use ...::remove_file + +#-----| use ...::rename + +#-----| use ...::set_permissions + +#-----| use ...::soft_link + +#-----| use ...::symlink_metadata + +#-----| use ...::write