Give path segment type anchors their own grammar rule

This commit is contained in:
Lukas Wirth 2025-06-04 11:30:43 +02:00
parent d2164fe08b
commit 7c3de05e3a
14 changed files with 223 additions and 158 deletions

View file

@ -89,7 +89,9 @@ fn path_segment(p: &mut Parser<'_>, mode: Mode, first: bool) -> Option<Completed
// test qual_paths
// type X = <A as B>::Output;
// fn foo() { <usize as Default>::default(); }
if first && p.eat(T![<]) {
if first && p.at(T![<]) {
let m = p.start();
p.bump(T![<]);
// test_err angled_path_without_qual
// type X = <()>;
// type Y = <A as B>;
@ -102,6 +104,7 @@ fn path_segment(p: &mut Parser<'_>, mode: Mode, first: bool) -> Option<Completed
}
}
p.expect(T![>]);
m.complete(p, TYPE_ANCHOR);
if !p.at(T![::]) {
p.error("expected `::`");
}

View file

@ -291,6 +291,7 @@ pub enum SyntaxKind {
TUPLE_STRUCT_PAT,
TUPLE_TYPE,
TYPE_ALIAS,
TYPE_ANCHOR,
TYPE_ARG,
TYPE_BOUND,
TYPE_BOUND_LIST,
@ -463,6 +464,7 @@ impl SyntaxKind {
| TUPLE_STRUCT_PAT
| TUPLE_TYPE
| TYPE_ALIAS
| TYPE_ANCHOR
| TYPE_ARG
| TYPE_BOUND
| TYPE_BOUND_LIST

View file

@ -10,11 +10,12 @@ SOURCE_FILE
PATH_TYPE
PATH
PATH_SEGMENT
L_ANGLE "<"
TUPLE_TYPE
L_PAREN "("
R_PAREN ")"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
TUPLE_TYPE
L_PAREN "("
R_PAREN ")"
R_ANGLE ">"
SEMICOLON ";"
WHITESPACE "\n"
TYPE_ALIAS
@ -28,21 +29,22 @@ SOURCE_FILE
PATH_TYPE
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "A"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "B"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "A"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "B"
R_ANGLE ">"
SEMICOLON ";"
WHITESPACE "\n"
error 13: expected `::`

View file

@ -88,13 +88,14 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Foo"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Foo"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF
@ -119,21 +120,22 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Foo"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Trait"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Foo"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Trait"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF

View file

@ -11,21 +11,22 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "A"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "B"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "A"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "B"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF
@ -51,21 +52,22 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "usize"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Default"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "usize"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Default"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF

View file

@ -19,10 +19,11 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
INFER_TYPE
UNDERSCORE "_"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
INFER_TYPE
UNDERSCORE "_"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF

View file

@ -84,21 +84,22 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "T"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Iterator"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "T"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Iterator"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF

View file

@ -45,21 +45,22 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "S"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Iterator"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "S"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Iterator"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF

View file

@ -107,13 +107,14 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Foo"
R_ANGLE ">"
TYPE_ANCHOR
L_ANGLE "<"
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Foo"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF

View file

@ -288,26 +288,27 @@ SOURCE_FILE
PATH
PATH
PATH_SEGMENT
L_ANGLE "<"
REF_TYPE
AMP "&"
LIFETIME
LIFETIME_IDENT "'a"
TYPE_ANCHOR
L_ANGLE "<"
REF_TYPE
AMP "&"
LIFETIME
LIFETIME_IDENT "'a"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "T"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "T"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
IDENT "Baz"
R_ANGLE ">"
IDENT "Baz"
R_ANGLE ">"
COLON2 "::"
PATH_SEGMENT
NAME_REF