5629: Finalize Path grammar r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-07-31 16:50:43 +00:00 committed by GitHub
commit 5d9145ce10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
41 changed files with 718 additions and 656 deletions

View file

@ -79,19 +79,25 @@ impl<'a> SubstituteTypeParams<'a> {
};
// FIXME: It would probably be nicer if we could get this via HIR (i.e. get the
// trait ref, and then go from the types in the substs back to the syntax)
// trait ref, and then go from the types in the substs back to the syntax).
fn get_syntactic_substs(impl_def: ast::Impl) -> Option<Vec<ast::Type>> {
let target_trait = impl_def.target_trait()?;
let path_type = match target_trait {
ast::Type::PathType(path) => path,
_ => return None,
};
let type_arg_list = path_type.path()?.segment()?.type_arg_list()?;
let generic_arg_list = path_type.path()?.segment()?.generic_arg_list()?;
let mut result = Vec::new();
for type_arg in type_arg_list.type_args() {
let type_arg: ast::TypeArg = type_arg;
result.push(type_arg.ty()?);
for generic_arg in generic_arg_list.generic_args() {
match generic_arg {
ast::GenericArg::TypeArg(type_arg) => result.push(type_arg.ty()?),
ast::GenericArg::AssocTypeArg(_)
| ast::GenericArg::LifetimeArg(_)
| ast::GenericArg::ConstArg(_) => (),
}
}
Some(result)
}
}
@ -157,7 +163,7 @@ impl<'a> QualifyPaths<'a> {
let type_args = p
.segment()
.and_then(|s| s.type_arg_list())
.and_then(|s| s.generic_arg_list())
.map(|arg_list| apply(self, arg_list));
if let Some(type_args) = type_args {
let last_segment = path.segment().unwrap();

View file

@ -337,7 +337,7 @@ impl ExprCollector<'_> {
};
let method_name = e.name_ref().map(|nr| nr.as_name()).unwrap_or_else(Name::missing);
let generic_args =
e.type_arg_list().and_then(|it| GenericArgs::from_ast(&self.ctx(), it));
e.generic_arg_list().and_then(|it| GenericArgs::from_ast(&self.ctx(), it));
self.alloc_expr(
Expr::MethodCall { receiver, method_name, args, generic_args },
syntax_ptr,

View file

@ -258,7 +258,7 @@ impl<'a> PathSegments<'a> {
}
impl GenericArgs {
pub(crate) fn from_ast(lower_ctx: &LowerCtx, node: ast::TypeArgList) -> Option<GenericArgs> {
pub(crate) fn from_ast(lower_ctx: &LowerCtx, node: ast::GenericArgList) -> Option<GenericArgs> {
lower::lower_generic_args(lower_ctx, node)
}

View file

@ -41,7 +41,7 @@ pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path>
match hygiene.name_ref_to_name(name_ref) {
Either::Left(name) => {
let args = segment
.type_arg_list()
.generic_arg_list()
.and_then(|it| lower_generic_args(&ctx, it))
.or_else(|| {
lower_generic_args_from_fn_path(
@ -148,33 +148,37 @@ pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path>
pub(super) fn lower_generic_args(
lower_ctx: &LowerCtx,
node: ast::TypeArgList,
node: ast::GenericArgList,
) -> Option<GenericArgs> {
let mut args = Vec::new();
for type_arg in node.type_args() {
let type_ref = TypeRef::from_ast_opt(lower_ctx, type_arg.ty());
args.push(GenericArg::Type(type_ref));
}
// lifetimes ignored for now
let mut bindings = Vec::new();
for assoc_type_arg in node.assoc_type_args() {
let assoc_type_arg: ast::AssocTypeArg = assoc_type_arg;
if let Some(name_ref) = assoc_type_arg.name_ref() {
let name = name_ref.as_name();
let type_ref = assoc_type_arg.ty().map(|it| TypeRef::from_ast(lower_ctx, it));
let bounds = if let Some(l) = assoc_type_arg.type_bound_list() {
l.bounds().map(|it| TypeBound::from_ast(lower_ctx, it)).collect()
} else {
Vec::new()
};
bindings.push(AssociatedTypeBinding { name, type_ref, bounds });
for generic_arg in node.generic_args() {
match generic_arg {
ast::GenericArg::TypeArg(type_arg) => {
let type_ref = TypeRef::from_ast_opt(lower_ctx, type_arg.ty());
args.push(GenericArg::Type(type_ref));
}
ast::GenericArg::AssocTypeArg(assoc_type_arg) => {
if let Some(name_ref) = assoc_type_arg.name_ref() {
let name = name_ref.as_name();
let type_ref = assoc_type_arg.ty().map(|it| TypeRef::from_ast(lower_ctx, it));
let bounds = if let Some(l) = assoc_type_arg.type_bound_list() {
l.bounds().map(|it| TypeBound::from_ast(lower_ctx, it)).collect()
} else {
Vec::new()
};
bindings.push(AssociatedTypeBinding { name, type_ref, bounds });
}
}
// Lifetimes and constants are ignored for now.
ast::GenericArg::LifetimeArg(_) | ast::GenericArg::ConstArg(_) => (),
}
}
if args.is_empty() && bindings.is_empty() {
None
} else {
Some(GenericArgs { args, has_self_type: false, bindings })
return None;
}
Some(GenericArgs { args, has_self_type: false, bindings })
}
/// Collect `GenericArgs` from the parts of a fn-like path, i.e. `Fn(X, Y)

View file

@ -377,7 +377,7 @@ impl<'a> CompletionContext<'a> {
path.syntax().parent().and_then(ast::TupleStructPat::cast).is_some();
self.is_path_type = path.syntax().parent().and_then(ast::PathType::cast).is_some();
self.has_type_args = segment.type_arg_list().is_some();
self.has_type_args = segment.generic_arg_list().is_some();
#[allow(deprecated)]
if let Some(path) = hir::Path::from_ast(path.clone()) {

View file

@ -45,7 +45,7 @@ fn try_extend_selection(
VARIANT_LIST,
USE_TREE_LIST,
GENERIC_PARAM_LIST,
TYPE_ARG_LIST,
GENERIC_ARG_LIST,
TYPE_BOUND_LIST,
PARAM_LIST,
ARG_LIST,

View file

@ -22,7 +22,7 @@ pub(super) fn opt_type_arg_list(p: &mut Parser, colon_colon_required: bool) {
}
}
p.expect(T![>]);
m.complete(p, TYPE_ARG_LIST);
m.complete(p, GENERIC_ARG_LIST);
}
// test type_arg
@ -52,7 +52,7 @@ fn type_arg(p: &mut Parser) {
m.complete(p, CONST_ARG);
}
k if k.is_literal() => {
p.bump(k);
expressions::literal(p);
m.complete(p, CONST_ARG);
}
_ => {

View file

@ -235,7 +235,7 @@ pub enum SyntaxKind {
LIFETIME_PARAM,
TYPE_PARAM,
CONST_PARAM,
TYPE_ARG_LIST,
GENERIC_ARG_LIST,
LIFETIME_ARG,
TYPE_ARG,
ASSOC_TYPE_ARG,

View file

@ -348,8 +348,8 @@ impl<'db, 'sema> Matcher<'db, 'sema> {
// separately via comparing what the path resolves to below.
self.attempt_match_opt(
phase,
pattern_segment.type_arg_list(),
code_segment.type_arg_list(),
pattern_segment.generic_arg_list(),
code_segment.generic_arg_list(),
)?;
self.attempt_match_opt(
phase,

View file

@ -217,7 +217,7 @@ fn pick_node_for_resolution(node: SyntaxNode) -> SyntaxNode {
fn path_contains_type_arguments(path: Option<ast::Path>) -> bool {
if let Some(path) = path {
if let Some(segment) = path.segment() {
if segment.type_arg_list().is_some() {
if segment.generic_arg_list().is_some() {
mark::hit!(type_arguments_within_path);
return true;
}

View file

@ -237,17 +237,17 @@ impl ast::Path {
impl ast::PathSegment {
#[must_use]
pub fn with_type_args(&self, type_args: ast::TypeArgList) -> ast::PathSegment {
pub fn with_type_args(&self, type_args: ast::GenericArgList) -> ast::PathSegment {
self._with_type_args(type_args, false)
}
#[must_use]
pub fn with_turbo_fish(&self, type_args: ast::TypeArgList) -> ast::PathSegment {
pub fn with_turbo_fish(&self, type_args: ast::GenericArgList) -> ast::PathSegment {
self._with_type_args(type_args, true)
}
fn _with_type_args(&self, type_args: ast::TypeArgList, turbo: bool) -> ast::PathSegment {
if let Some(old) = self.type_arg_list() {
fn _with_type_args(&self, type_args: ast::GenericArgList, turbo: bool) -> ast::PathSegment {
if let Some(old) = self.generic_arg_list() {
return self.replace_children(
single_node(old.syntax().clone()),
iter::once(type_args.syntax().clone().into()),

File diff suppressed because it is too large Load diff

View file

@ -25,7 +25,7 @@ SOURCE_FILE@0..389
PATH_SEGMENT@29..37
NAME_REF@29..33
IDENT@29..33 "Sink"
TYPE_ARG_LIST@33..37
GENERIC_ARG_LIST@33..37
L_ANGLE@33..34
LIFETIME_ARG@34..36
LIFETIME@34..36 "'a"
@ -79,7 +79,7 @@ SOURCE_FILE@0..389
PATH_SEGMENT@82..92
NAME_REF@82..85
IDENT@82..85 "Vec"
TYPE_ARG_LIST@85..92
GENERIC_ARG_LIST@85..92
L_ANGLE@85..86
TYPE_ARG@86..91
PATH_TYPE@86..91

View file

@ -16,7 +16,7 @@ SOURCE_FILE@0..86
PATH_SEGMENT@22..68
NAME_REF@22..29
IDENT@22..29 "RefCell"
TYPE_ARG_LIST@29..68
GENERIC_ARG_LIST@29..68
L_ANGLE@29..30 "<"
TYPE_ARG@30..68
PATH_TYPE@30..68
@ -24,7 +24,7 @@ SOURCE_FILE@0..86
PATH_SEGMENT@30..68
NAME_REF@30..37
IDENT@30..37 "HashMap"
TYPE_ARG_LIST@37..68
GENERIC_ARG_LIST@37..68
L_ANGLE@37..38 "<"
WHITESPACE@38..47 "\n "
TYPE_ARG@47..53
@ -41,7 +41,7 @@ SOURCE_FILE@0..86
PATH_SEGMENT@63..68
NAME_REF@63..66
IDENT@63..66 "Box"
TYPE_ARG_LIST@66..68
GENERIC_ARG_LIST@66..68
L_ANGLE@66..67 "<"
TYPE_ARG@67..68
ERROR@67..68

View file

@ -50,7 +50,7 @@ SOURCE_FILE@0..240
PATH_SEGMENT@37..46
NAME_REF@37..42
IDENT@37..42 "Trait"
TYPE_ARG_LIST@42..46
GENERIC_ARG_LIST@42..46
L_ANGLE@42..43 "<"
LIFETIME_ARG@43..45
LIFETIME@43..45 "\'a"
@ -92,7 +92,7 @@ SOURCE_FILE@0..240
PATH_SEGMENT@78..88
NAME_REF@78..81
IDENT@78..81 "Box"
TYPE_ARG_LIST@81..88
GENERIC_ARG_LIST@81..88
L_ANGLE@81..82 "<"
TYPE_ARG@82..88
PAREN_TYPE@82..88
@ -133,7 +133,7 @@ SOURCE_FILE@0..240
PATH_SEGMENT@111..120
NAME_REF@111..116
IDENT@111..116 "Trait"
TYPE_ARG_LIST@116..120
GENERIC_ARG_LIST@116..120
L_ANGLE@116..117 "<"
LIFETIME_ARG@117..119
LIFETIME@117..119 "\'a"
@ -156,7 +156,7 @@ SOURCE_FILE@0..240
PATH_SEGMENT@135..141
NAME_REF@135..138
IDENT@135..138 "Box"
TYPE_ARG_LIST@138..141
GENERIC_ARG_LIST@138..141
L_ANGLE@138..139 "<"
TYPE_ARG@139..141
PAREN_TYPE@139..141
@ -235,7 +235,7 @@ SOURCE_FILE@0..240
PATH_SEGMENT@192..215
NAME_REF@192..195
IDENT@192..195 "Box"
TYPE_ARG_LIST@195..215
GENERIC_ARG_LIST@195..215
L_ANGLE@195..196 "<"
TYPE_ARG@196..215
PAREN_TYPE@196..215
@ -253,7 +253,7 @@ SOURCE_FILE@0..240
PATH_SEGMENT@205..214
NAME_REF@205..210
IDENT@205..210 "Trait"
TYPE_ARG_LIST@210..214
GENERIC_ARG_LIST@210..214
L_ANGLE@210..211 "<"
LIFETIME_ARG@211..213
LIFETIME@211..213 "\'a"

View file

@ -31,7 +31,7 @@ SOURCE_FILE@0..38
PATH_SEGMENT@23..34
NAME_REF@23..31
IDENT@23..31 "OnceCell"
TYPE_ARG_LIST@31..34
GENERIC_ARG_LIST@31..34
L_ANGLE@31..32 "<"
TYPE_ARG@32..33
PATH_TYPE@32..33

View file

@ -62,7 +62,7 @@ SOURCE_FILE@0..83
DOT@66..67 "."
NAME_REF@67..70
IDENT@67..70 "max"
TYPE_ARG_LIST@70..77
GENERIC_ARG_LIST@70..77
COLON2@70..72 "::"
L_ANGLE@72..73 "<"
TYPE_ARG@73..76

View file

@ -3,7 +3,7 @@ PATH_TYPE@0..16
PATH_SEGMENT@0..16
NAME_REF@0..6
IDENT@0..6 "Result"
TYPE_ARG_LIST@6..16
GENERIC_ARG_LIST@6..16
L_ANGLE@6..7 "<"
TYPE_ARG@7..10
PATH_TYPE@7..10

View file

@ -12,7 +12,7 @@ SOURCE_FILE@0..39
PATH_SEGMENT@9..37
NAME_REF@9..12
IDENT@9..12 "Box"
TYPE_ARG_LIST@12..37
GENERIC_ARG_LIST@12..37
L_ANGLE@12..13 "<"
TYPE_ARG@13..36
PATH_TYPE@13..36

View file

@ -53,7 +53,7 @@ SOURCE_FILE@0..69
PATH_SEGMENT@53..62
NAME_REF@53..56
IDENT@53..56 "Box"
TYPE_ARG_LIST@56..62
GENERIC_ARG_LIST@56..62
L_ANGLE@56..57 "<"
TYPE_ARG@57..61
PATH_TYPE@57..61

View file

@ -17,7 +17,7 @@ SOURCE_FILE@0..43
PATH_SEGMENT@14..36
NAME_REF@14..22
IDENT@14..22 "Iterator"
TYPE_ARG_LIST@22..36
GENERIC_ARG_LIST@22..36
L_ANGLE@22..23 "<"
ASSOC_TYPE_ARG@23..35
NAME_REF@23..27
@ -28,7 +28,7 @@ SOURCE_FILE@0..43
PATH_SEGMENT@28..35
NAME_REF@28..31
IDENT@28..31 "Foo"
TYPE_ARG_LIST@31..35
GENERIC_ARG_LIST@31..35
L_ANGLE@31..32 "<"
LIFETIME_ARG@32..34
LIFETIME@32..34 "\'a"

View file

@ -12,7 +12,7 @@ SOURCE_FILE@0..46
PATH_SEGMENT@9..44
NAME_REF@9..10
IDENT@9..10 "B"
TYPE_ARG_LIST@10..44
GENERIC_ARG_LIST@10..44
L_ANGLE@10..11 "<"
LIFETIME_ARG@11..18
LIFETIME@11..18 "\'static"
@ -27,7 +27,8 @@ SOURCE_FILE@0..46
COMMA@23..24 ","
WHITESPACE@24..25 " "
CONST_ARG@25..26
INT_NUMBER@25..26 "1"
LITERAL@25..26
INT_NUMBER@25..26 "1"
COMMA@26..27 ","
WHITESPACE@27..28 " "
CONST_ARG@28..33

View file

@ -30,7 +30,7 @@ SOURCE_FILE@0..35
PATH_SEGMENT@21..28
NAME_REF@21..24
IDENT@21..24 "Foo"
TYPE_ARG_LIST@24..28
GENERIC_ARG_LIST@24..28
L_ANGLE@24..25 "<"
LIFETIME_ARG@25..27
LIFETIME@25..27 "\'a"

View file

@ -16,7 +16,7 @@ SOURCE_FILE@0..58
PATH_SEGMENT@12..23
NAME_REF@12..15
IDENT@12..15 "Box"
TYPE_ARG_LIST@15..23
GENERIC_ARG_LIST@15..23
L_ANGLE@15..16 "<"
TYPE_ARG@16..22
DYN_TRAIT_TYPE@16..22
@ -55,7 +55,7 @@ SOURCE_FILE@0..58
PATH_SEGMENT@39..54
NAME_REF@39..42
IDENT@39..42 "Box"
TYPE_ARG_LIST@42..54
GENERIC_ARG_LIST@42..54
L_ANGLE@42..43 "<"
TYPE_ARG@43..53
DYN_TRAIT_TYPE@43..53

View file

@ -60,7 +60,7 @@ SOURCE_FILE@0..91
COLON2@56..58 "::"
NAME_REF@58..59
IDENT@58..59 "a"
TYPE_ARG_LIST@59..64
GENERIC_ARG_LIST@59..64
COLON2@59..61 "::"
L_ANGLE@61..62 "<"
TYPE_ARG@62..63

View file

@ -17,7 +17,7 @@ SOURCE_FILE@0..42
PATH_SEGMENT@13..35
NAME_REF@13..21
IDENT@13..21 "Iterator"
TYPE_ARG_LIST@21..35
GENERIC_ARG_LIST@21..35
L_ANGLE@21..22 "<"
ASSOC_TYPE_ARG@22..34
NAME_REF@22..26
@ -28,7 +28,7 @@ SOURCE_FILE@0..42
PATH_SEGMENT@27..34
NAME_REF@27..30
IDENT@27..30 "Foo"
TYPE_ARG_LIST@30..34
GENERIC_ARG_LIST@30..34
L_ANGLE@30..31 "<"
LIFETIME_ARG@31..33
LIFETIME@31..33 "\'a"

View file

@ -95,7 +95,7 @@ SOURCE_FILE@0..121
PATH_SEGMENT@101..119
NAME_REF@101..110
IDENT@101..110 "PartialEq"
TYPE_ARG_LIST@110..119
GENERIC_ARG_LIST@110..119
L_ANGLE@110..111 "<"
TYPE_ARG@111..118
REFERENCE_TYPE@111..118

View file

@ -12,7 +12,7 @@ SOURCE_FILE@0..29
PATH_SEGMENT@9..27
NAME_REF@9..12
IDENT@9..12 "Box"
TYPE_ARG_LIST@12..27
GENERIC_ARG_LIST@12..27
L_ANGLE@12..13 "<"
TYPE_ARG@13..26
PATH_TYPE@13..26

View file

@ -36,7 +36,7 @@ SOURCE_FILE@0..49
DOT@29..30 "."
NAME_REF@30..33
IDENT@30..33 "bar"
TYPE_ARG_LIST@33..38
GENERIC_ARG_LIST@33..38
COLON2@33..35 "::"
L_ANGLE@35..36 "<"
TYPE_ARG@36..37

View file

@ -18,7 +18,7 @@ SOURCE_FILE@0..59
PATH_SEGMENT@16..39
NAME_REF@16..24
IDENT@16..24 "Iterator"
TYPE_ARG_LIST@24..39
GENERIC_ARG_LIST@24..39
L_ANGLE@24..25 "<"
ASSOC_TYPE_ARG@25..38
NAME_REF@25..29

View file

@ -22,7 +22,7 @@ SOURCE_FILE@0..29
PATH_SEGMENT@19..25
NAME_REF@19..22
IDENT@19..22 "Bar"
TYPE_ARG_LIST@22..25
GENERIC_ARG_LIST@22..25
L_ANGLE@22..23 "<"
TYPE_ARG@23..24
PATH_TYPE@23..24

View file

@ -20,7 +20,7 @@ SOURCE_FILE@0..83
PATH_SEGMENT@13..17
NAME_REF@13..14
IDENT@13..14 "T"
TYPE_ARG_LIST@14..17
GENERIC_ARG_LIST@14..17
L_ANGLE@14..15 "<"
TYPE_ARG@15..16
PATH_TYPE@15..16
@ -52,7 +52,7 @@ SOURCE_FILE@0..83
PATH_SEGMENT@32..36
NAME_REF@32..33
IDENT@32..33 "T"
TYPE_ARG_LIST@33..36
GENERIC_ARG_LIST@33..36
L_ANGLE@33..34 "<"
TYPE_ARG@34..35
PATH_TYPE@34..35
@ -115,7 +115,7 @@ SOURCE_FILE@0..83
PATH_SEGMENT@77..81
NAME_REF@77..78
IDENT@77..78 "T"
TYPE_ARG_LIST@78..81
GENERIC_ARG_LIST@78..81
L_ANGLE@78..79 "<"
TYPE_ARG@79..80
PATH_TYPE@79..80

View file

@ -49,7 +49,7 @@ SOURCE_FILE@0..116
PATH_SEGMENT@65..81
NAME_REF@65..76
IDENT@65..76 "Deserialize"
TYPE_ARG_LIST@76..81
GENERIC_ARG_LIST@76..81
L_ANGLE@76..77 "<"
LIFETIME_ARG@77..80
LIFETIME@77..80 "\'de"

View file

@ -249,7 +249,7 @@ SOURCE_FILE@0..3813
PATH_SEGMENT@653..663
NAME_REF@653..657
IDENT@653..657 "Cell"
TYPE_ARG_LIST@657..663
GENERIC_ARG_LIST@657..663
L_ANGLE@657..658 "<"
TYPE_ARG@658..662
PATH_TYPE@658..662
@ -1588,7 +1588,7 @@ SOURCE_FILE@0..3813
PATH_SEGMENT@2888..2901
NAME_REF@2888..2893
IDENT@2888..2893 "union"
TYPE_ARG_LIST@2893..2901
GENERIC_ARG_LIST@2893..2901
L_ANGLE@2893..2894 "<"
LIFETIME_ARG@2894..2900
LIFETIME@2894..2900 "\'union"

View file

@ -141,7 +141,7 @@ SOURCE_FILE@0..686
PATH_SEGMENT@589..600
NAME_REF@589..594
IDENT@589..594 "Event"
TYPE_ARG_LIST@594..600
GENERIC_ARG_LIST@594..600
L_ANGLE@594..595 "<"
TYPE_ARG@595..599
PATH_TYPE@595..599

View file

@ -32,7 +32,7 @@ SOURCE_FILE@0..95
PATH_SEGMENT@28..48
NAME_REF@28..34
IDENT@28..34 "Future"
TYPE_ARG_LIST@34..48
GENERIC_ARG_LIST@34..48
L_ANGLE@34..35 "<"
ASSOC_TYPE_ARG@35..47
NAME_REF@35..41

View file

@ -172,7 +172,7 @@ SOURCE_FILE@0..519
PATH_SEGMENT@159..166
NAME_REF@159..162
IDENT@159..162 "Foo"
TYPE_ARG_LIST@162..166
GENERIC_ARG_LIST@162..166
L_ANGLE@162..163 "<"
LIFETIME_ARG@163..165
LIFETIME@163..165 "\'a"
@ -490,7 +490,7 @@ SOURCE_FILE@0..519
PATH_SEGMENT@505..513
NAME_REF@505..507
IDENT@505..507 "Rc"
TYPE_ARG_LIST@507..513
GENERIC_ARG_LIST@507..513
L_ANGLE@507..508 "<"
TYPE_ARG@508..512
PATH_TYPE@508..512

View file

@ -50,7 +50,7 @@ SOURCE_FILE@0..80
DOT@43..44 "."
NAME_REF@44..47
IDENT@44..47 "sum"
TYPE_ARG_LIST@47..54
GENERIC_ARG_LIST@47..54
COLON2@47..49 "::"
L_ANGLE@49..50 "<"
TYPE_ARG@50..53

View file

@ -16,7 +16,7 @@ SOURCE_FILE@0..88
PATH_SEGMENT@10..23
NAME_REF@10..13
IDENT@10..13 "Foo"
TYPE_ARG_LIST@13..23
GENERIC_ARG_LIST@13..23
L_ANGLE@13..14 "<"
TYPE_ARG@14..22
PATH_TYPE@14..22

View file

@ -208,7 +208,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
"LIFETIME_PARAM",
"TYPE_PARAM",
"CONST_PARAM",
"TYPE_ARG_LIST",
"GENERIC_ARG_LIST",
"LIFETIME_ARG",
"TYPE_ARG",
"ASSOC_TYPE_ARG",

View file

@ -1,3 +1,34 @@
Path =
(qualifier:Path '::')? segment:PathSegment
PathSegment =
'crate' | 'self' | 'super'
| '::' NameRef
| NameRef GenericArgList?
| NameRef ParamList RetType?
| '<' PathType ('as' PathType)? '>'
GenericArgList =
'::'? '<' (GenericArg (',' GenericArg)* ','?)? '>'
GenericArg =
TypeArg
| AssocTypeArg
| LifetimeArg
| ConstArg
TypeArg =
Type
AssocTypeArg =
NameRef (':' TypeBoundList | '=' Type)
LifetimeArg =
'lifetime'
ConstArg =
Expr
SourceFile =
'shebang'?
Attr*
@ -318,7 +349,7 @@ ArgList =
'(' args:(Expr (',' Expr)* ','?)? ')'
MethodCallExpr =
Attr* Expr '.' NameRef TypeArgList? ArgList
Attr* Expr '.' NameRef GenericArgList? ArgList
FieldExpr =
Attr* Expr '.' NameRef
@ -521,33 +552,6 @@ MacroStmts =
statements:Stmt*
Expr?
Path =
(qualifier:Path '::')? segment:PathSegment
PathSegment =
'::' | 'crate' | 'self' | 'super'
| '<' NameRef TypeArgList ParamList RetType PathType '>'
TypeArgList =
'::'? '<'
TypeArg*
LifetimeArg*
AssocTypeArg*
ConstArg*
'>'
TypeArg =
Type
AssocTypeArg =
NameRef (':' TypeBoundList | '=' Type)
LifetimeArg =
'lifetime'
ConstArg =
Literal | BlockExpr BlockExpr
Pat =
OrPat
| ParenPat