diff options
author | Aleksey Kladov <[email protected]> | 2018-07-31 16:03:50 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-07-31 16:03:50 +0100 |
commit | 892acc5b36552995515f91d2bc14ae82f81d7b8d (patch) | |
tree | e046cfbec482330e34a196f0f132fc738bf563f4 /src | |
parent | edf2b17a572b56371cfc29bbc3a686edcb12782c (diff) |
impl items
Diffstat (limited to 'src')
-rw-r--r-- | src/grammar.ron | 1 | ||||
-rw-r--r-- | src/parser/grammar/items/traits.rs | 11 | ||||
-rw-r--r-- | src/parser/grammar/mod.rs | 24 | ||||
-rw-r--r-- | src/syntax_kinds/generated.rs | 2 |
4 files changed, 38 insertions, 0 deletions
diff --git a/src/grammar.ron b/src/grammar.ron index fca29f1ef..e10e5aaf4 100644 --- a/src/grammar.ron +++ b/src/grammar.ron | |||
@@ -158,6 +158,7 @@ Grammar( | |||
158 | "TYPE_ARG_LIST", | 158 | "TYPE_ARG_LIST", |
159 | 159 | ||
160 | "PARAM_LIST", | 160 | "PARAM_LIST", |
161 | "SELF_PARAM", | ||
161 | "ARG_LIST", | 162 | "ARG_LIST", |
162 | ] | 163 | ] |
163 | ) | 164 | ) |
diff --git a/src/parser/grammar/items/traits.rs b/src/parser/grammar/items/traits.rs index 812cacfb7..7d657ced0 100644 --- a/src/parser/grammar/items/traits.rs +++ b/src/parser/grammar/items/traits.rs | |||
@@ -29,6 +29,17 @@ pub(super) fn impl_item(p: &mut Parser) { | |||
29 | } | 29 | } |
30 | type_params::where_clause(p); | 30 | type_params::where_clause(p); |
31 | p.expect(L_CURLY); | 31 | p.expect(L_CURLY); |
32 | |||
33 | // test impl_item_items | ||
34 | // impl F { | ||
35 | // type A = i32; | ||
36 | // const B: i32 = 92; | ||
37 | // fn foo() {} | ||
38 | // fn bar(&self) {} | ||
39 | // } | ||
40 | while !p.at(EOF) && !p.at(R_CURLY) { | ||
41 | item(p); | ||
42 | } | ||
32 | p.expect(R_CURLY); | 43 | p.expect(R_CURLY); |
33 | } | 44 | } |
34 | 45 | ||
diff --git a/src/parser/grammar/mod.rs b/src/parser/grammar/mod.rs index 498b45d44..b8847fb68 100644 --- a/src/parser/grammar/mod.rs +++ b/src/parser/grammar/mod.rs | |||
@@ -104,6 +104,7 @@ fn fn_value_parameters(p: &mut Parser) { | |||
104 | assert!(p.at(L_PAREN)); | 104 | assert!(p.at(L_PAREN)); |
105 | let m = p.start(); | 105 | let m = p.start(); |
106 | p.bump(); | 106 | p.bump(); |
107 | self_param(p); | ||
107 | while !p.at(EOF) && !p.at(R_PAREN) { | 108 | while !p.at(EOF) && !p.at(R_PAREN) { |
108 | value_parameter(p); | 109 | value_parameter(p); |
109 | if !p.at(R_PAREN) { | 110 | if !p.at(R_PAREN) { |
@@ -120,6 +121,29 @@ fn fn_value_parameters(p: &mut Parser) { | |||
120 | types::type_(p); | 121 | types::type_(p); |
121 | m.complete(p, VALUE_PARAMETER); | 122 | m.complete(p, VALUE_PARAMETER); |
122 | } | 123 | } |
124 | |||
125 | // test self_param | ||
126 | // impl S { | ||
127 | // fn a(self) {} | ||
128 | // fn b(&self,) {} | ||
129 | // fn c(&mut self, x: i32) {} | ||
130 | // } | ||
131 | fn self_param(p: &mut Parser) { | ||
132 | let la1 = p.nth(1); | ||
133 | let la2 = p.nth(2); | ||
134 | let n_toks = match (p.current(), la1, la2) { | ||
135 | (SELF_KW, _, _) => 1, | ||
136 | (AMPERSAND, SELF_KW, _) => 2, | ||
137 | (AMPERSAND, MUT_KW, SELF_KW) => 3, | ||
138 | _ => return, | ||
139 | }; | ||
140 | let m = p.start(); | ||
141 | for _ in 0..n_toks { p.bump(); } | ||
142 | m.complete(p, SELF_PARAM); | ||
143 | if !p.at(R_PAREN) { | ||
144 | p.expect(COMMA); | ||
145 | } | ||
146 | } | ||
123 | } | 147 | } |
124 | 148 | ||
125 | fn fn_ret_type(p: &mut Parser) { | 149 | fn fn_ret_type(p: &mut Parser) { |
diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 699f5282e..0603f53fd 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs | |||
@@ -145,6 +145,7 @@ pub enum SyntaxKind { | |||
145 | TYPE_PARAM_LIST, | 145 | TYPE_PARAM_LIST, |
146 | TYPE_ARG_LIST, | 146 | TYPE_ARG_LIST, |
147 | PARAM_LIST, | 147 | PARAM_LIST, |
148 | SELF_PARAM, | ||
148 | ARG_LIST, | 149 | ARG_LIST, |
149 | // Technical SyntaxKinds: they appear temporally during parsing, | 150 | // Technical SyntaxKinds: they appear temporally during parsing, |
150 | // but never end up in the final tree | 151 | // but never end up in the final tree |
@@ -298,6 +299,7 @@ impl SyntaxKind { | |||
298 | TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" }, | 299 | TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" }, |
299 | TYPE_ARG_LIST => &SyntaxInfo { name: "TYPE_ARG_LIST" }, | 300 | TYPE_ARG_LIST => &SyntaxInfo { name: "TYPE_ARG_LIST" }, |
300 | PARAM_LIST => &SyntaxInfo { name: "PARAM_LIST" }, | 301 | PARAM_LIST => &SyntaxInfo { name: "PARAM_LIST" }, |
302 | SELF_PARAM => &SyntaxInfo { name: "SELF_PARAM" }, | ||
301 | ARG_LIST => &SyntaxInfo { name: "ARG_LIST" }, | 303 | ARG_LIST => &SyntaxInfo { name: "ARG_LIST" }, |
302 | TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" }, | 304 | TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" }, |
303 | EOF => &SyntaxInfo { name: "EOF" }, | 305 | EOF => &SyntaxInfo { name: "EOF" }, |