mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Merge pull request #19113 from github/aibaars/crate-graph-reexport
Rust: crate_graph: generate 'use' statements for re-exported items
This commit is contained in:
@@ -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<String, trap::Label<generated::Item>>,
|
||||
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<trap::Label<generated::Item>> {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
2
rust/ql/.generated.list
generated
2
rust/ql/.generated.list
generated
@@ -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
|
||||
|
||||
2
rust/ql/.gitattributes
generated
vendored
2
rust/ql/.gitattributes
generated
vendored
@@ -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
|
||||
|
||||
@@ -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() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 | { ... } |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user