mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 04:53:34 +00:00
Complete types
This commit is contained in:
parent
9fcebbc512
commit
49e14a99ed
3 changed files with 35 additions and 8 deletions
|
@ -21,11 +21,10 @@ pub fn scope_completion(file: &File, offset: TextUnit) -> Option<Vec<CompletionI
|
||||||
// Insert a fake ident to get a valid parse tree
|
// Insert a fake ident to get a valid parse tree
|
||||||
let file = {
|
let file = {
|
||||||
let edit = AtomEdit::insert(offset, "intellijRulezz".to_string());
|
let edit = AtomEdit::insert(offset, "intellijRulezz".to_string());
|
||||||
// Don't bother with completion if incremental reparse fails
|
file.reparse(&edit)
|
||||||
file.incremental_reparse(&edit)?
|
|
||||||
};
|
};
|
||||||
let name_ref = find_node_at_offset::<ast::NameRef>(file.syntax(), offset)?;
|
let name_ref = find_node_at_offset::<ast::NameRef>(file.syntax(), offset)?;
|
||||||
if !is_ident_expr(name_ref) {
|
if !is_single_segment(name_ref) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,11 +49,11 @@ pub fn scope_completion(file: &File, offset: TextUnit) -> Option<Vec<CompletionI
|
||||||
Some(res)
|
Some(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ident_expr(name_ref: ast::NameRef) -> bool {
|
fn is_single_segment(name_ref: ast::NameRef) -> bool {
|
||||||
match ancestors(name_ref.syntax()).filter_map(ast::Expr::cast).next() {
|
match ancestors(name_ref.syntax()).filter_map(ast::Path::cast).next() {
|
||||||
None => false,
|
None => false,
|
||||||
Some(expr) => {
|
Some(path) => {
|
||||||
expr.syntax().range() == name_ref.syntax().range()
|
path.syntax().range() == name_ref.syntax().range()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,6 +202,15 @@ mod tests {
|
||||||
CompletionItem { name: "quux", snippet: None }]"#);
|
CompletionItem { name: "quux", snippet: None }]"#);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_complete_type() {
|
||||||
|
check_scope_completion(r"
|
||||||
|
struct Foo;
|
||||||
|
fn x() -> <|>
|
||||||
|
", r#"[CompletionItem { name: "Foo", snippet: None },
|
||||||
|
CompletionItem { name: "x", snippet: None }]"#)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_completion_kewords() {
|
fn test_completion_kewords() {
|
||||||
check_snippet_completion(r"
|
check_snippet_completion(r"
|
||||||
|
|
|
@ -1278,6 +1278,24 @@ impl<'a> AstNode<'a> for Pat<'a> {
|
||||||
|
|
||||||
impl<'a> Pat<'a> {}
|
impl<'a> Pat<'a> {}
|
||||||
|
|
||||||
|
// Path
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Path<'a> {
|
||||||
|
syntax: SyntaxNodeRef<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AstNode<'a> for Path<'a> {
|
||||||
|
fn cast(syntax: SyntaxNodeRef<'a>) -> Option<Self> {
|
||||||
|
match syntax.kind() {
|
||||||
|
PATH => Some(Path { syntax }),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Path<'a> {}
|
||||||
|
|
||||||
// PathExpr
|
// PathExpr
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct PathExpr<'a> {
|
pub struct PathExpr<'a> {
|
||||||
|
|
|
@ -513,6 +513,7 @@ Grammar(
|
||||||
collections: [
|
collections: [
|
||||||
["args", "Expr"]
|
["args", "Expr"]
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
|
"Path": (),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue