aboutsummaryrefslogtreecommitdiff
path: root/src/generics.rs
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2018-01-11 16:38:36 -0800
committerDavid Tolnay <dtolnay@gmail.com>2018-01-11 16:38:36 -0800
commit298570b7cafdcac25a207c75570c13c8797553f3 (patch)
tree67e0914698e365db1689b7b50a7d05e30753d3e2 /src/generics.rs
parentb77d180d514d93d8ccfa83ce462554b673fa2af1 (diff)
downloadsyn-298570b7cafdcac25a207c75570c13c8797553f3.tar.gz
Print generic params and generic arguments in the right order
Diffstat (limited to 'src/generics.rs')
-rw-r--r--src/generics.rs27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/generics.rs b/src/generics.rs
index 737a8014..5c4d8ef8 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -563,7 +563,32 @@ mod printing {
}
TokensOrDefault(&self.lt_token).to_tokens(tokens);
- self.params.to_tokens(tokens);
+
+ // Print lifetimes before types and consts, regardless of their
+ // order in self.params.
+ //
+ // TODO: ordering rules for const parameters vs type parameters have
+ // not been settled yet. https://github.com/rust-lang/rust/issues/44580
+ let mut trailing_or_empty = true;
+ for param in self.params.pairs() {
+ if let GenericParam::Lifetime(_) = **param.value() {
+ param.to_tokens(tokens);
+ trailing_or_empty = param.punct().is_some();
+ }
+ }
+ for param in self.params.pairs() {
+ match **param.value() {
+ GenericParam::Type(_) | GenericParam::Const(_) => {
+ if !trailing_or_empty {
+ <Token![,]>::default().to_tokens(tokens);
+ trailing_or_empty = true;
+ }
+ param.to_tokens(tokens);
+ }
+ GenericParam::Lifetime(_) => {}
+ }
+ }
+
TokensOrDefault(&self.gt_token).to_tokens(tokens);
}
}