diff options
author | David Tolnay <dtolnay@gmail.com> | 2018-01-11 16:38:36 -0800 |
---|---|---|
committer | David Tolnay <dtolnay@gmail.com> | 2018-01-11 16:38:36 -0800 |
commit | 298570b7cafdcac25a207c75570c13c8797553f3 (patch) | |
tree | 67e0914698e365db1689b7b50a7d05e30753d3e2 /src/generics.rs | |
parent | b77d180d514d93d8ccfa83ce462554b673fa2af1 (diff) | |
download | syn-298570b7cafdcac25a207c75570c13c8797553f3.tar.gz |
Print generic params and generic arguments in the right order
Diffstat (limited to 'src/generics.rs')
-rw-r--r-- | src/generics.rs | 27 |
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); } } |