aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-08-31 14:30:42 +0100
committerAleksey Kladov <[email protected]>2018-08-31 14:30:42 +0100
commit7a5bc94774a50837f8c9bf8b96c8272882aca640 (patch)
tree7d96566cbbf7bdd636fd095acb6bff12bba1ec13
parentcdb9b4cbf417976739de5147938e2c3080e497b9 (diff)
complete self
-rw-r--r--crates/libeditor/src/completion.rs13
-rw-r--r--crates/libeditor/src/scope/fn_scope.rs4
-rw-r--r--crates/libsyntax2/src/ast/generated.rs21
-rw-r--r--crates/libsyntax2/src/grammar.ron2
4 files changed, 40 insertions, 0 deletions
diff --git a/crates/libeditor/src/completion.rs b/crates/libeditor/src/completion.rs
index 06a607265..f3058c023 100644
--- a/crates/libeditor/src/completion.rs
+++ b/crates/libeditor/src/completion.rs
@@ -142,6 +142,12 @@ fn complete_fn(name_ref: ast::NameRef, scopes: &FnScopes, acc: &mut Vec<Completi
142 snippet: None, 142 snippet: None,
143 }) 143 })
144 ); 144 );
145 if scopes.self_param.is_some() {
146 acc.push(CompletionItem {
147 name: "self".to_string(),
148 snippet: None,
149 })
150 }
145} 151}
146 152
147#[cfg(test)] 153#[cfg(test)]
@@ -250,6 +256,13 @@ mod tests {
250 } 256 }
251 257
252 #[test] 258 #[test]
259 fn test_complete_self() {
260 check_scope_completion(r"
261 impl S { fn foo(&self) { <|> } }
262 ", r#"[CompletionItem { name: "self", snippet: None }]"#)
263 }
264
265 #[test]
253 fn test_completion_kewords() { 266 fn test_completion_kewords() {
254 check_snippet_completion(r" 267 check_snippet_completion(r"
255 fn quux() { 268 fn quux() {
diff --git a/crates/libeditor/src/scope/fn_scope.rs b/crates/libeditor/src/scope/fn_scope.rs
index 5c04e2f9b..78e9c061c 100644
--- a/crates/libeditor/src/scope/fn_scope.rs
+++ b/crates/libeditor/src/scope/fn_scope.rs
@@ -13,6 +13,7 @@ type ScopeId = usize;
13 13
14#[derive(Debug)] 14#[derive(Debug)]
15pub struct FnScopes { 15pub struct FnScopes {
16 pub self_param: Option<SyntaxNode>,
16 scopes: Vec<ScopeData>, 17 scopes: Vec<ScopeData>,
17 scope_for: HashMap<SyntaxNode, ScopeId>, 18 scope_for: HashMap<SyntaxNode, ScopeId>,
18} 19}
@@ -20,6 +21,9 @@ pub struct FnScopes {
20impl FnScopes { 21impl FnScopes {
21 pub fn new(fn_def: ast::FnDef) -> FnScopes { 22 pub fn new(fn_def: ast::FnDef) -> FnScopes {
22 let mut scopes = FnScopes { 23 let mut scopes = FnScopes {
24 self_param: fn_def.param_list()
25 .and_then(|it| it.self_param())
26 .map(|it| it.syntax().owned()),
23 scopes: Vec::new(), 27 scopes: Vec::new(),
24 scope_for: HashMap::new() 28 scope_for: HashMap::new()
25 }; 29 };
diff --git a/crates/libsyntax2/src/ast/generated.rs b/crates/libsyntax2/src/ast/generated.rs
index 58dcf574e..50dc41b27 100644
--- a/crates/libsyntax2/src/ast/generated.rs
+++ b/crates/libsyntax2/src/ast/generated.rs
@@ -1168,6 +1168,9 @@ impl<'a> ParamList<'a> {
1168 pub fn params(self) -> impl Iterator<Item = Param<'a>> + 'a { 1168 pub fn params(self) -> impl Iterator<Item = Param<'a>> + 'a {
1169 super::children(self) 1169 super::children(self)
1170 } 1170 }
1171pub fn self_param(self) -> Option<SelfParam<'a>> {
1172 super::child_opt(self)
1173 }
1171} 1174}
1172 1175
1173// ParenExpr 1176// ParenExpr
@@ -1579,6 +1582,24 @@ impl<'a> Root<'a> {
1579 } 1582 }
1580} 1583}
1581 1584
1585// SelfParam
1586#[derive(Debug, Clone, Copy)]
1587pub struct SelfParam<'a> {
1588 syntax: SyntaxNodeRef<'a>,
1589}
1590
1591impl<'a> AstNode<'a> for SelfParam<'a> {
1592 fn cast(syntax: SyntaxNodeRef<'a>) -> Option<Self> {
1593 match syntax.kind() {
1594 SELF_PARAM => Some(SelfParam { syntax }),
1595 _ => None,
1596 }
1597 }
1598 fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax }
1599}
1600
1601impl<'a> SelfParam<'a> {}
1602
1582// SlicePat 1603// SlicePat
1583#[derive(Debug, Clone, Copy)] 1604#[derive(Debug, Clone, Copy)]
1584pub struct SlicePat<'a> { 1605pub struct SlicePat<'a> {
diff --git a/crates/libsyntax2/src/grammar.ron b/crates/libsyntax2/src/grammar.ron
index 77730e306..522521229 100644
--- a/crates/libsyntax2/src/grammar.ron
+++ b/crates/libsyntax2/src/grammar.ron
@@ -488,10 +488,12 @@ Grammar(
488 ] 488 ]
489 ), 489 ),
490 "ParamList": ( 490 "ParamList": (
491 options: [ "SelfParam" ],
491 collections: [ 492 collections: [
492 ["params", "Param"] 493 ["params", "Param"]
493 ] 494 ]
494 ), 495 ),
496 "SelfParam": (),
495 "Param": ( 497 "Param": (
496 options: [ "Pat" ], 498 options: [ "Pat" ],
497 ), 499 ),