aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/grammar.ron1
-rw-r--r--src/parser/grammar/type_params.rs5
-rw-r--r--src/parser/grammar/types.rs11
-rw-r--r--src/syntax_kinds/generated.rs2
4 files changed, 19 insertions, 0 deletions
diff --git a/src/grammar.ron b/src/grammar.ron
index aa01cb205..df7b4083b 100644
--- a/src/grammar.ron
+++ b/src/grammar.ron
@@ -118,6 +118,7 @@ Grammar(
118 "PLACEHOLDER_TYPE", 118 "PLACEHOLDER_TYPE",
119 "FN_POINTER_TYPE", 119 "FN_POINTER_TYPE",
120 "FOR_TYPE", 120 "FOR_TYPE",
121 "IMPL_TRAIT_TYPE",
121 122
122 "REF_PAT", 123 "REF_PAT",
123 "BIND_PAT", 124 "BIND_PAT",
diff --git a/src/parser/grammar/type_params.rs b/src/parser/grammar/type_params.rs
index ccb44c0df..2affd47cc 100644
--- a/src/parser/grammar/type_params.rs
+++ b/src/parser/grammar/type_params.rs
@@ -57,6 +57,10 @@ pub(super) fn list(p: &mut Parser) {
57pub(super) fn bounds(p: &mut Parser) { 57pub(super) fn bounds(p: &mut Parser) {
58 assert!(p.at(COLON)); 58 assert!(p.at(COLON));
59 p.bump(); 59 p.bump();
60 bounds_without_colon(p);
61}
62
63pub(super) fn bounds_without_colon(p: &mut Parser) {
60 loop { 64 loop {
61 let has_paren = p.eat(L_PAREN); 65 let has_paren = p.eat(L_PAREN);
62 p.eat(QUESTION); 66 p.eat(QUESTION);
@@ -79,6 +83,7 @@ pub(super) fn bounds(p: &mut Parser) {
79 } 83 }
80} 84}
81 85
86
82pub(super) fn where_clause(p: &mut Parser) { 87pub(super) fn where_clause(p: &mut Parser) {
83 if p.at(WHERE_KW) { 88 if p.at(WHERE_KW) {
84 let m = p.start(); 89 let m = p.start();
diff --git a/src/parser/grammar/types.rs b/src/parser/grammar/types.rs
index 014086521..31871ceec 100644
--- a/src/parser/grammar/types.rs
+++ b/src/parser/grammar/types.rs
@@ -10,6 +10,7 @@ pub(super) fn type_(p: &mut Parser) {
10 UNDERSCORE => placeholder_type(p), 10 UNDERSCORE => placeholder_type(p),
11 FN_KW | UNSAFE_KW | EXTERN_KW => fn_pointer_type(p), 11 FN_KW | UNSAFE_KW | EXTERN_KW => fn_pointer_type(p),
12 FOR_KW => for_type(p), 12 FOR_KW => for_type(p),
13 IMPL_KW => impl_trait_type(p),
13 _ if paths::is_path_start(p) => path_type(p), 14 _ if paths::is_path_start(p) => path_type(p),
14 _ => { 15 _ => {
15 p.error("expected type"); 16 p.error("expected type");
@@ -183,6 +184,16 @@ fn for_type(p: &mut Parser) {
183 m.complete(p, FOR_TYPE); 184 m.complete(p, FOR_TYPE);
184} 185}
185 186
187// test impl_trait_type
188// type A = impl Iterator<Item=Foo<'a>> + 'a;
189fn impl_trait_type(p: &mut Parser) {
190 assert!(p.at(IMPL_KW));
191 let m = p.start();
192 p.bump();
193 type_params::bounds_without_colon(p);
194 m.complete(p, IMPL_TRAIT_TYPE);
195}
196
186// test path_type 197// test path_type
187// type A = Foo; 198// type A = Foo;
188// type B = ::Foo; 199// type B = ::Foo;
diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs
index a37fdea0b..156d42db4 100644
--- a/src/syntax_kinds/generated.rs
+++ b/src/syntax_kinds/generated.rs
@@ -111,6 +111,7 @@ pub enum SyntaxKind {
111 PLACEHOLDER_TYPE, 111 PLACEHOLDER_TYPE,
112 FN_POINTER_TYPE, 112 FN_POINTER_TYPE,
113 FOR_TYPE, 113 FOR_TYPE,
114 IMPL_TRAIT_TYPE,
114 REF_PAT, 115 REF_PAT,
115 BIND_PAT, 116 BIND_PAT,
116 PLACEHOLDER_PAT, 117 PLACEHOLDER_PAT,
@@ -271,6 +272,7 @@ impl SyntaxKind {
271 PLACEHOLDER_TYPE => &SyntaxInfo { name: "PLACEHOLDER_TYPE" }, 272 PLACEHOLDER_TYPE => &SyntaxInfo { name: "PLACEHOLDER_TYPE" },
272 FN_POINTER_TYPE => &SyntaxInfo { name: "FN_POINTER_TYPE" }, 273 FN_POINTER_TYPE => &SyntaxInfo { name: "FN_POINTER_TYPE" },
273 FOR_TYPE => &SyntaxInfo { name: "FOR_TYPE" }, 274 FOR_TYPE => &SyntaxInfo { name: "FOR_TYPE" },
275 IMPL_TRAIT_TYPE => &SyntaxInfo { name: "IMPL_TRAIT_TYPE" },
274 REF_PAT => &SyntaxInfo { name: "REF_PAT" }, 276 REF_PAT => &SyntaxInfo { name: "REF_PAT" },
275 BIND_PAT => &SyntaxInfo { name: "BIND_PAT" }, 277 BIND_PAT => &SyntaxInfo { name: "BIND_PAT" },
276 PLACEHOLDER_PAT => &SyntaxInfo { name: "PLACEHOLDER_PAT" }, 278 PLACEHOLDER_PAT => &SyntaxInfo { name: "PLACEHOLDER_PAT" },