aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorKirill Bulatov <[email protected]>2021-03-08 12:59:54 +0000
committerKirill Bulatov <[email protected]>2021-03-08 21:59:39 +0000
commit778deb38fe7e1bac8833934224d26f44eb80a6cc (patch)
tree978ef918e70a41ef818ba12efb3e63b1e6abe2ae /crates
parent5168ab16e14679e16a472c0ab13b1bbc32dc95f3 (diff)
Better strip turbofishes
Diffstat (limited to 'crates')
-rw-r--r--crates/hir_def/src/path.rs4
-rw-r--r--crates/ide_db/src/helpers/import_assets.rs8
-rw-r--r--crates/syntax/src/ast/make.rs4
-rw-r--r--crates/syntax/src/lib.rs1
-rw-r--r--crates/syntax/src/utils.rs43
5 files changed, 52 insertions, 8 deletions
diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs
index 1dc085199..0e60dc2b6 100644
--- a/crates/hir_def/src/path.rs
+++ b/crates/hir_def/src/path.rs
@@ -44,10 +44,6 @@ pub enum ImportAlias {
44} 44}
45 45
46impl ModPath { 46impl ModPath {
47 pub fn from_src_unhygienic(path: ast::Path) -> Option<ModPath> {
48 lower::lower_path(path, &Hygiene::new_unhygienic()).map(|it| it.mod_path)
49 }
50
51 pub fn from_src(path: ast::Path, hygiene: &Hygiene) -> Option<ModPath> { 47 pub fn from_src(path: ast::Path, hygiene: &Hygiene) -> Option<ModPath> {
52 lower::lower_path(path, hygiene).map(|it| it.mod_path) 48 lower::lower_path(path, hygiene).map(|it| it.mod_path)
53 } 49 }
diff --git a/crates/ide_db/src/helpers/import_assets.rs b/crates/ide_db/src/helpers/import_assets.rs
index 3d9df463d..e03ccd351 100644
--- a/crates/ide_db/src/helpers/import_assets.rs
+++ b/crates/ide_db/src/helpers/import_assets.rs
@@ -5,7 +5,7 @@ use hir::{
5}; 5};
6use itertools::Itertools; 6use itertools::Itertools;
7use rustc_hash::FxHashSet; 7use rustc_hash::FxHashSet;
8use syntax::{ast, AstNode, SyntaxNode}; 8use syntax::{ast, utils::path_to_string_stripping_turbo_fish, AstNode, SyntaxNode};
9 9
10use crate::{ 10use crate::{
11 items_locator::{self, AssocItemSearch, DEFAULT_QUERY_SEARCH_LIMIT}, 11 items_locator::{self, AssocItemSearch, DEFAULT_QUERY_SEARCH_LIMIT},
@@ -57,7 +57,7 @@ pub struct PathImportCandidate {
57#[derive(Debug)] 57#[derive(Debug)]
58pub struct FirstSegmentUnresolved { 58pub struct FirstSegmentUnresolved {
59 fist_segment: ast::NameRef, 59 fist_segment: ast::NameRef,
60 full_qualifier: ModPath, 60 full_qualifier: ast::Path,
61} 61}
62 62
63/// A name that will be used during item lookups. 63/// A name that will be used during item lookups.
@@ -310,7 +310,7 @@ fn path_applicable_imports(
310 } 310 }
311 Some(first_segment_unresolved) => ( 311 Some(first_segment_unresolved) => (
312 first_segment_unresolved.fist_segment.to_string(), 312 first_segment_unresolved.fist_segment.to_string(),
313 first_segment_unresolved.full_qualifier.to_string(), 313 path_to_string_stripping_turbo_fish(&first_segment_unresolved.full_qualifier),
314 ), 314 ),
315 }; 315 };
316 316
@@ -583,7 +583,7 @@ fn path_import_candidate(
583 ImportCandidate::Path(PathImportCandidate { 583 ImportCandidate::Path(PathImportCandidate {
584 qualifier: Some(FirstSegmentUnresolved { 584 qualifier: Some(FirstSegmentUnresolved {
585 fist_segment: qualifier_start, 585 fist_segment: qualifier_start,
586 full_qualifier: ModPath::from_src_unhygienic(qualifier)?, 586 full_qualifier: qualifier,
587 }), 587 }),
588 name, 588 name,
589 }) 589 })
diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs
index b6c5de658..70ba8adb4 100644
--- a/crates/syntax/src/ast/make.rs
+++ b/crates/syntax/src/ast/make.rs
@@ -91,6 +91,10 @@ pub fn path_from_segments(
91 }) 91 })
92} 92}
93 93
94pub fn path_from_text(text: &str) -> ast::Path {
95 ast_from_text(&format!("fn main() {{ let test = {}; }}", text))
96}
97
94pub fn glob_use_tree() -> ast::UseTree { 98pub fn glob_use_tree() -> ast::UseTree {
95 ast_from_text("use *;") 99 ast_from_text("use *;")
96} 100}
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index 11294c5b2..09e212e8c 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -37,6 +37,7 @@ pub mod algo;
37pub mod ast; 37pub mod ast;
38#[doc(hidden)] 38#[doc(hidden)]
39pub mod fuzz; 39pub mod fuzz;
40pub mod utils;
40 41
41use std::{marker::PhantomData, sync::Arc}; 42use std::{marker::PhantomData, sync::Arc};
42 43
diff --git a/crates/syntax/src/utils.rs b/crates/syntax/src/utils.rs
new file mode 100644
index 000000000..f4c02518b
--- /dev/null
+++ b/crates/syntax/src/utils.rs
@@ -0,0 +1,43 @@
1//! A set of utils methods to reuse on other abstraction levels
2
3use itertools::Itertools;
4
5use crate::{ast, match_ast, AstNode};
6
7pub fn path_to_string_stripping_turbo_fish(path: &ast::Path) -> String {
8 path.syntax()
9 .children()
10 .filter_map(|node| {
11 match_ast! {
12 match node {
13 ast::PathSegment(it) => {
14 Some(it.name_ref()?.to_string())
15 },
16 ast::Path(it) => {
17 Some(path_to_string_stripping_turbo_fish(&it))
18 },
19 _ => None,
20 }
21 }
22 })
23 .join("::")
24}
25
26#[cfg(test)]
27mod tests {
28 use super::path_to_string_stripping_turbo_fish;
29 use crate::ast::make;
30
31 #[test]
32 fn turbofishes_are_stripped() {
33 assert_eq!("Vec", path_to_string_stripping_turbo_fish(&make::path_from_text("Vec::<i32>")),);
34 assert_eq!(
35 "Vec::new",
36 path_to_string_stripping_turbo_fish(&make::path_from_text("Vec::<i32>::new")),
37 );
38 assert_eq!(
39 "Vec::new",
40 path_to_string_stripping_turbo_fish(&make::path_from_text("Vec::new()")),
41 );
42 }
43}