aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/completion.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-12-21 20:04:56 +0000
committerAleksey Kladov <[email protected]>2018-12-21 20:04:56 +0000
commit2136e75c0bce090d104bb5b5006e48e42fb22a0a (patch)
treed17fa5832a8e04f925f9d3b62c3c2bf23a2de714 /crates/ra_analysis/src/completion.rs
parentcbe67339df2bbcb17e12ad74e8b8cd53baffb9f7 (diff)
move path completion to a separate component
Diffstat (limited to 'crates/ra_analysis/src/completion.rs')
-rw-r--r--crates/ra_analysis/src/completion.rs43
1 files changed, 29 insertions, 14 deletions
diff --git a/crates/ra_analysis/src/completion.rs b/crates/ra_analysis/src/completion.rs
index 883b3e851..d91304bc2 100644
--- a/crates/ra_analysis/src/completion.rs
+++ b/crates/ra_analysis/src/completion.rs
@@ -4,13 +4,12 @@ mod reference_completion;
4mod complete_fn_param; 4mod complete_fn_param;
5mod complete_keyword; 5mod complete_keyword;
6mod complete_snippet; 6mod complete_snippet;
7mod complete_path;
7 8
8use ra_editor::find_node_at_offset; 9use ra_editor::find_node_at_offset;
9use ra_text_edit::AtomTextEdit; 10use ra_text_edit::AtomTextEdit;
10use ra_syntax::{ 11use ra_syntax::{
11 algo::{ 12 algo::find_leaf_at_offset,
12 find_leaf_at_offset,
13 },
14 ast, 13 ast,
15 AstNode, 14 AstNode,
16 SyntaxNodeRef, 15 SyntaxNodeRef,
@@ -48,11 +47,12 @@ pub(crate) fn completions(
48 reference_completion::completions(&mut acc, db, &module, &file, name_ref)?; 47 reference_completion::completions(&mut acc, db, &module, &file, name_ref)?;
49 } 48 }
50 49
51 let ctx = ctry!(SyntaxContext::new(&original_file, position.offset)); 50 let ctx = ctry!(SyntaxContext::new(db, &original_file, position)?);
52 complete_fn_param::complete_fn_param(&mut acc, &ctx); 51 complete_fn_param::complete_fn_param(&mut acc, &ctx);
53 complete_keyword::complete_expr_keyword(&mut acc, &ctx); 52 complete_keyword::complete_expr_keyword(&mut acc, &ctx);
54 complete_snippet::complete_expr_snippet(&mut acc, &ctx); 53 complete_snippet::complete_expr_snippet(&mut acc, &ctx);
55 complete_snippet::complete_item_snippet(&mut acc, &ctx); 54 complete_snippet::complete_item_snippet(&mut acc, &ctx);
55 complete_path::complete_path(&mut acc, &ctx)?;
56 56
57 Ok(Some(acc)) 57 Ok(Some(acc))
58} 58}
@@ -61,31 +61,44 @@ pub(crate) fn completions(
61/// exactly is the cursor, syntax-wise. 61/// exactly is the cursor, syntax-wise.
62#[derive(Debug)] 62#[derive(Debug)]
63pub(super) struct SyntaxContext<'a> { 63pub(super) struct SyntaxContext<'a> {
64 db: &'a db::RootDatabase,
64 leaf: SyntaxNodeRef<'a>, 65 leaf: SyntaxNodeRef<'a>,
66 module: Option<hir::Module>,
65 enclosing_fn: Option<ast::FnDef<'a>>, 67 enclosing_fn: Option<ast::FnDef<'a>>,
66 is_param: bool, 68 is_param: bool,
67 /// A single-indent path, like `foo`. 69 /// A single-indent path, like `foo`.
68 is_trivial_path: bool, 70 is_trivial_path: bool,
71 /// If not a trivial, path, the prefix (qualifier).
72 path_prefix: Option<hir::Path>,
69 after_if: bool, 73 after_if: bool,
70 is_stmt: bool, 74 is_stmt: bool,
71 /// Something is typed at the "top" level, in module or impl/trait. 75 /// Something is typed at the "top" level, in module or impl/trait.
72 is_new_item: bool, 76 is_new_item: bool,
73} 77}
74 78
75impl SyntaxContext<'_> { 79impl<'a> SyntaxContext<'a> {
76 pub(super) fn new(original_file: &SourceFileNode, offset: TextUnit) -> Option<SyntaxContext> { 80 pub(super) fn new(
77 let leaf = find_leaf_at_offset(original_file.syntax(), offset).left_biased()?; 81 db: &'a db::RootDatabase,
82 original_file: &'a SourceFileNode,
83 position: FilePosition,
84 ) -> Cancelable<Option<SyntaxContext<'a>>> {
85 let module = source_binder::module_from_position(db, position)?;
86 let leaf =
87 ctry!(find_leaf_at_offset(original_file.syntax(), position.offset).left_biased());
78 let mut ctx = SyntaxContext { 88 let mut ctx = SyntaxContext {
89 db,
79 leaf, 90 leaf,
91 module,
80 enclosing_fn: None, 92 enclosing_fn: None,
81 is_param: false, 93 is_param: false,
82 is_trivial_path: false, 94 is_trivial_path: false,
95 path_prefix: None,
83 after_if: false, 96 after_if: false,
84 is_stmt: false, 97 is_stmt: false,
85 is_new_item: false, 98 is_new_item: false,
86 }; 99 };
87 ctx.fill(original_file, offset); 100 ctx.fill(original_file, position.offset);
88 Some(ctx) 101 Ok(Some(ctx))
89 } 102 }
90 103
91 fn fill(&mut self, original_file: &SourceFileNode, offset: TextUnit) { 104 fn fill(&mut self, original_file: &SourceFileNode, offset: TextUnit) {
@@ -140,11 +153,13 @@ impl SyntaxContext<'_> {
140 }; 153 };
141 if let Some(segment) = ast::PathSegment::cast(parent) { 154 if let Some(segment) = ast::PathSegment::cast(parent) {
142 let path = segment.parent_path(); 155 let path = segment.parent_path();
143 // if let Some(path) = Path::from_ast(path) { 156 if let Some(mut path) = hir::Path::from_ast(path) {
144 // if !path.is_ident() { 157 if !path.is_ident() {
145 // return Some(NameRefKind::Path(path)); 158 path.segments.pop().unwrap();
146 // } 159 self.path_prefix = Some(path);
147 // } 160 return;
161 }
162 }
148 if path.qualifier().is_none() { 163 if path.qualifier().is_none() {
149 self.is_trivial_path = true; 164 self.is_trivial_path = true;
150 self.enclosing_fn = self 165 self.enclosing_fn = self