diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-03-31 10:11:48 +0100 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-03-31 10:11:48 +0100 |
commit | c5ca49678f129045e59438df279829902034ec71 (patch) | |
tree | 3fd54185e0c064fbd6f718ac345064ce9c559efb /crates/ra_syntax/src/grammar.ron | |
parent | 23dd53eb35ff50508d0c0fc5878a55754b12d381 (diff) | |
parent | 55dcdb7d094f473c73f87ecf997b24f8e35f2a5e (diff) |
Merge #1077
1077: Improve parsing of type bounds r=matklad a=vipentti
This adds new TYPE_BOUND_LIST and TYPE_BOUND syntax kinds. These are now used when parsing type bounds. In addition parsing paths inside a bound now does not recursively parse paths, rather they are treated as separate bounds, separated by +.
Basically now the generic params `struct S<T: 'a + ?Sized + (Copy)>;` in will be parsed as
```
TYPE_PARAM_LIST@[8; 33)
L_ANGLE@[8; 9)
TYPE_PARAM@[9; 32)
NAME@[9; 10)
IDENT@[9; 10) "T"
COLON@[10; 11)
WHITESPACE@[11; 12)
TYPE_BOUND_LIST@[12; 32)
TYPE_BOUND@[12; 14)
LIFETIME@[12; 14) "'a"
WHITESPACE@[14; 15)
PLUS@[15; 16)
WHITESPACE@[16; 17)
TYPE_BOUND@[17; 23)
QUESTION@[17; 18)
PATH_TYPE@[18; 23)
PATH@[18; 23)
PATH_SEGMENT@[18; 23)
NAME_REF@[18; 23)
IDENT@[18; 23) "Sized"
WHITESPACE@[23; 24)
PLUS@[24; 25)
WHITESPACE@[25; 26)
TYPE_BOUND@[26; 32)
L_PAREN@[26; 27)
PATH_TYPE@[27; 31)
PATH@[27; 31)
PATH_SEGMENT@[27; 31)
NAME_REF@[27; 31)
IDENT@[27; 31) "Copy"
R_PAREN@[31; 32)
R_ANGLE@[32; 33)
```
Previously it was parsed, with the paths nested:
```
TYPE_PARAM_LIST@[8; 33)
L_ANGLE@[8; 9)
TYPE_PARAM@[9; 32)
NAME@[9; 10)
IDENT@[9; 10) "T"
COLON@[10; 11)
WHITESPACE@[11; 12)
LIFETIME@[12; 14) "'a"
WHITESPACE@[14; 15)
PLUS@[15; 16)
WHITESPACE@[16; 17)
QUESTION@[17; 18)
PATH_TYPE@[18; 32)
PATH@[18; 23)
PATH_SEGMENT@[18; 23)
NAME_REF@[18; 23)
IDENT@[18; 23) "Sized"
WHITESPACE@[23; 24)
PLUS@[24; 25)
WHITESPACE@[25; 26)
L_PAREN@[26; 27)
PATH_TYPE@[27; 31)
PATH@[27; 31)
PATH_SEGMENT@[27; 31)
NAME_REF@[27; 31)
IDENT@[27; 31) "Copy"
R_PAREN@[31; 32)
R_ANGLE@[32; 33)
```
Looking for feedback.
Co-authored-by: Ville Penttinen <[email protected]>
Diffstat (limited to 'crates/ra_syntax/src/grammar.ron')
-rw-r--r-- | crates/ra_syntax/src/grammar.ron | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index ad6d74162..18730a894 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron | |||
@@ -243,6 +243,8 @@ Grammar( | |||
243 | "PARAM", | 243 | "PARAM", |
244 | "SELF_PARAM", | 244 | "SELF_PARAM", |
245 | "ARG_LIST", | 245 | "ARG_LIST", |
246 | "TYPE_BOUND", | ||
247 | "TYPE_BOUND_LIST", | ||
246 | ], | 248 | ], |
247 | ast: { | 249 | ast: { |
248 | "SourceFile": ( | 250 | "SourceFile": ( |
@@ -293,7 +295,7 @@ Grammar( | |||
293 | "EnumVariantList": ( collections: [["variants", "EnumVariant"]] ), | 295 | "EnumVariantList": ( collections: [["variants", "EnumVariant"]] ), |
294 | "EnumVariant": ( traits: ["NameOwner", "DocCommentsOwner", "AttrsOwner"], options: ["Expr"] ), | 296 | "EnumVariant": ( traits: ["NameOwner", "DocCommentsOwner", "AttrsOwner"], options: ["Expr"] ), |
295 | "TraitDef": ( | 297 | "TraitDef": ( |
296 | traits: ["VisibilityOwner", "NameOwner", "AttrsOwner", "DocCommentsOwner", "TypeParamsOwner"], | 298 | traits: ["VisibilityOwner", "NameOwner", "AttrsOwner", "DocCommentsOwner", "TypeParamsOwner", "TypeBoundsOwner"], |
297 | options: ["ItemList"] | 299 | options: ["ItemList"] |
298 | ), | 300 | ), |
299 | "Module": ( | 301 | "Module": ( |
@@ -330,7 +332,8 @@ Grammar( | |||
330 | "NameOwner", | 332 | "NameOwner", |
331 | "TypeParamsOwner", | 333 | "TypeParamsOwner", |
332 | "AttrsOwner", | 334 | "AttrsOwner", |
333 | "DocCommentsOwner" | 335 | "DocCommentsOwner", |
336 | "TypeBoundsOwner", | ||
334 | ], | 337 | ], |
335 | options: ["TypeRef"] | 338 | options: ["TypeRef"] |
336 | ), | 339 | ), |
@@ -347,8 +350,12 @@ Grammar( | |||
347 | "PlaceholderType": (), | 350 | "PlaceholderType": (), |
348 | "FnPointerType": (options: ["ParamList", "RetType"]), | 351 | "FnPointerType": (options: ["ParamList", "RetType"]), |
349 | "ForType": (options: ["TypeRef"]), | 352 | "ForType": (options: ["TypeRef"]), |
350 | "ImplTraitType": (), | 353 | "ImplTraitType": ( |
351 | "DynTraitType": (), | 354 | traits: ["TypeBoundsOwner"], |
355 | ), | ||
356 | "DynTraitType": ( | ||
357 | traits: ["TypeBoundsOwner"], | ||
358 | ), | ||
352 | 359 | ||
353 | "TypeRef": ( enum: [ | 360 | "TypeRef": ( enum: [ |
354 | "ParenType", | 361 | "ParenType", |
@@ -571,12 +578,23 @@ Grammar( | |||
571 | ["lifetime_params", "LifetimeParam" ], | 578 | ["lifetime_params", "LifetimeParam" ], |
572 | ] | 579 | ] |
573 | ), | 580 | ), |
574 | "TypeParam": ( traits: ["NameOwner", "AttrsOwner"] ), | 581 | "TypeParam": ( traits: ["NameOwner", "AttrsOwner", "TypeBoundsOwner"] ), |
575 | "LifetimeParam": ( | 582 | "LifetimeParam": ( |
576 | options: [ "Lifetime"], | 583 | options: [ "Lifetime"], |
577 | traits: ["AttrsOwner"], | 584 | traits: ["AttrsOwner"], |
578 | ), | 585 | ), |
579 | "Lifetime": ( traits: ["AstToken"] ), | 586 | "Lifetime": ( traits: ["AstToken"] ), |
587 | "TypeBound": ( | ||
588 | options: [ | ||
589 | "TypeRef", | ||
590 | "Lifetime", | ||
591 | ] | ||
592 | ), | ||
593 | "TypeBoundList": ( | ||
594 | collections: [ | ||
595 | ["bounds", "TypeBound"], | ||
596 | ] | ||
597 | ), | ||
580 | "WhereClause": (), | 598 | "WhereClause": (), |
581 | "ExprStmt": ( | 599 | "ExprStmt": ( |
582 | options: [ ["expr", "Expr"] ] | 600 | options: [ ["expr", "Expr"] ] |