diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-07-23 19:32:36 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-07-27 22:59:35 +0300 |
| commit | ce3beb609f75fb690d6980c9e6a62c6efa6f3d97 (patch) | |
| tree | 393b1ae3dd4e554835638bb3cc5c451caa2aad24 /src/libsyntax | |
| parent | da77a1a0acf54fddba97052d55187a441224d022 (diff) | |
| download | rust-ce3beb609f75fb690d6980c9e6a62c6efa6f3d97.tar.gz rust-ce3beb609f75fb690d6980c9e6a62c6efa6f3d97.zip | |
Discern between `Path` and `Path<>` in AST
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/ext/build.rs | 20 |
2 files changed, 14 insertions, 20 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index b8e371a4e76..544afc5d6f6 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -120,12 +120,11 @@ pub struct PathSegment { pub span: Span, /// Type/lifetime parameters attached to this path. They come in - /// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`. Note that - /// this is more than just simple syntactic sugar; the use of - /// parens affects the region binding rules, so we preserve the - /// distinction. - /// The `Option<P<..>>` wrapper is purely a size optimization; - /// `None` is used to represent both `Path` and `Path<>`. + /// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`. + /// `None` means that no parameter list is supplied (`Path`), + /// `Some` means that parameter list is supplied (`Path<X, Y>`) + /// but it can be empty (`Path<>`). + /// `P` is used as a size optimization for the common case with no parameters. pub parameters: Option<P<PathParameters>>, } @@ -181,8 +180,7 @@ pub struct AngleBracketedParameterData { impl Into<Option<P<PathParameters>>> for AngleBracketedParameterData { fn into(self) -> Option<P<PathParameters>> { - let empty = self.lifetimes.is_empty() && self.types.is_empty() && self.bindings.is_empty(); - if empty { None } else { Some(P(PathParameters::AngleBracketed(self))) } + Some(P(PathParameters::AngleBracketed(self))) } } diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index d8140417214..af9143eadbc 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -326,14 +326,10 @@ impl<'a> AstBuilder for ExtCtxt<'a> { } segments.extend(idents.into_iter().map(|i| ast::PathSegment::from_ident(i, sp))); - let parameters = if lifetimes.is_empty() && types.is_empty() && bindings.is_empty() { - None + let parameters = if !lifetimes.is_empty() || !types.is_empty() || !bindings.is_empty() { + ast::AngleBracketedParameterData { lifetimes, types, bindings }.into() } else { - Some(P(ast::PathParameters::AngleBracketed(ast::AngleBracketedParameterData { - lifetimes: lifetimes, - types: types, - bindings: bindings, - }))) + None }; segments.push(ast::PathSegment { identifier: last_identifier, @@ -369,15 +365,15 @@ impl<'a> AstBuilder for ExtCtxt<'a> { bindings: Vec<ast::TypeBinding>) -> (ast::QSelf, ast::Path) { let mut path = trait_path; - let parameters = ast::AngleBracketedParameterData { - lifetimes: lifetimes, - types: types, - bindings: bindings, + let parameters = if !lifetimes.is_empty() || !types.is_empty() || !bindings.is_empty() { + ast::AngleBracketedParameterData { lifetimes, types, bindings }.into() + } else { + None }; path.segments.push(ast::PathSegment { identifier: ident.node, span: ident.span, - parameters: Some(P(ast::PathParameters::AngleBracketed(parameters))), + parameters: parameters, }); (ast::QSelf { |
