span.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // SPDX-License-Identifier: Apache-2.0 OR MIT
  2. use proc_macro2::extra::DelimSpan;
  3. use proc_macro2::{Delimiter, Group, Span, TokenStream};
  4. #[doc(hidden)]
  5. pub trait IntoSpans<S> {
  6. fn into_spans(self) -> S;
  7. }
  8. impl IntoSpans<Span> for Span {
  9. fn into_spans(self) -> Span {
  10. self
  11. }
  12. }
  13. impl IntoSpans<[Span; 1]> for Span {
  14. fn into_spans(self) -> [Span; 1] {
  15. [self]
  16. }
  17. }
  18. impl IntoSpans<[Span; 2]> for Span {
  19. fn into_spans(self) -> [Span; 2] {
  20. [self, self]
  21. }
  22. }
  23. impl IntoSpans<[Span; 3]> for Span {
  24. fn into_spans(self) -> [Span; 3] {
  25. [self, self, self]
  26. }
  27. }
  28. impl IntoSpans<[Span; 1]> for [Span; 1] {
  29. fn into_spans(self) -> [Span; 1] {
  30. self
  31. }
  32. }
  33. impl IntoSpans<[Span; 2]> for [Span; 2] {
  34. fn into_spans(self) -> [Span; 2] {
  35. self
  36. }
  37. }
  38. impl IntoSpans<[Span; 3]> for [Span; 3] {
  39. fn into_spans(self) -> [Span; 3] {
  40. self
  41. }
  42. }
  43. impl IntoSpans<DelimSpan> for Span {
  44. fn into_spans(self) -> DelimSpan {
  45. let mut group = Group::new(Delimiter::None, TokenStream::new());
  46. group.set_span(self);
  47. group.delim_span()
  48. }
  49. }
  50. impl IntoSpans<DelimSpan> for DelimSpan {
  51. fn into_spans(self) -> DelimSpan {
  52. self
  53. }
  54. }