blob: 8cdb4a21b2fcf1cc55da6fafee7d8f39901294c0 [file] [log] [blame]
Alex Crichton2e0229c2017-05-23 09:34:50 -07001#![cfg(feature = "extra-traits")]
Nika Layzella2a1a4a2017-11-19 11:33:17 -05002#![feature(rustc_private)]
3
David Tolnayb153dbc2016-10-04 23:39:10 -07004extern crate syn;
5use syn::*;
6
David Tolnaye7678922016-10-13 20:44:03 -07007#[macro_use]
8extern crate quote;
David Tolnayb153dbc2016-10-04 23:39:10 -07009
Alex Crichton605643b2017-07-05 18:35:14 -070010extern crate proc_macro2;
David Tolnayc5f1a652017-12-27 02:10:10 -050011use proc_macro2::{Span, Term, TokenStream};
Alex Crichton605643b2017-07-05 18:35:14 -070012
David Tolnayc7a5d3d2017-06-04 12:11:05 -070013mod common;
14
David Tolnayb153dbc2016-10-04 23:39:10 -070015#[test]
16fn test_split_for_impl() {
David Tolnaye7678922016-10-13 20:44:03 -070017 // <'a, 'b: 'a, #[may_dangle] T: 'a = ()> where T: Debug
David Tolnayc2f1aba2017-11-12 20:29:22 -080018 let generics = Generics {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070019 gt_token: Some(Default::default()),
20 lt_token: Some(Default::default()),
David Tolnayc2f1aba2017-11-12 20:29:22 -080021 params: vec![
22 GenericParam::Lifetime(LifetimeDef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070023 attrs: Default::default(),
Alex Crichton605643b2017-07-05 18:35:14 -070024 lifetime: Lifetime::new(Term::intern("'a"), Span::default()),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070025 bounds: Default::default(),
26 colon_token: None,
David Tolnayc2f1aba2017-11-12 20:29:22 -080027 }),
28 GenericParam::Lifetime(LifetimeDef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070029 attrs: Default::default(),
Alex Crichton605643b2017-07-05 18:35:14 -070030 lifetime: Lifetime::new(Term::intern("'b"), Span::default()),
31 bounds: vec![Lifetime::new(Term::intern("'a"), Span::default())].into(),
David Tolnay42eaae12017-12-26 23:05:18 -050032 colon_token: Some(token::Colon::default()),
David Tolnayc2f1aba2017-11-12 20:29:22 -080033 }),
34 GenericParam::Type(TypeParam {
David Tolnay51382052017-12-27 13:46:21 -050035 attrs: vec![
36 Attribute {
37 bracket_token: Default::default(),
38 pound_token: Default::default(),
39 style: AttrStyle::Outer,
40 path: "may_dangle".into(),
41 tts: TokenStream::empty(),
42 is_sugared_doc: false,
43 },
44 ],
Alex Crichtonccbb45d2017-05-23 10:58:24 -070045 ident: "T".into(),
David Tolnay51382052017-12-27 13:46:21 -050046 bounds: vec![
47 TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default())),
48 ].into(),
49 default: Some(
50 TypeTuple {
David Tolnayeadbda32017-12-29 02:33:47 -050051 elems: Default::default(),
David Tolnay51382052017-12-27 13:46:21 -050052 paren_token: Default::default(),
53 }.into(),
54 ),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070055 colon_token: Some(Default::default()),
56 eq_token: Default::default(),
David Tolnayc2f1aba2017-11-12 20:29:22 -080057 }),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070058 ].into(),
David Tolnayac997dd2017-12-27 23:18:22 -050059 where_clause: Some(WhereClause {
60 where_token: Default::default(),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070061 predicates: vec![
62 WherePredicate::BoundPredicate(WhereBoundPredicate {
63 bound_lifetimes: None,
64 colon_token: Default::default(),
David Tolnayfd6bf5c2017-11-12 09:41:14 -080065 bounded_ty: TypePath {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070066 qself: None,
67 path: "T".into(),
68 }.into(),
69 bounds: vec![
David Tolnayfd6bf5c2017-11-12 09:41:14 -080070 TypeParamBound::Trait(
David Tolnayb153dbc2016-10-04 23:39:10 -070071 PolyTraitRef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070072 bound_lifetimes: None,
David Tolnaye7678922016-10-13 20:44:03 -070073 trait_ref: "Debug".into(),
David Tolnayb153dbc2016-10-04 23:39:10 -070074 },
75 TraitBoundModifier::None,
76 ),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070077 ].into(),
David Tolnay51382052017-12-27 13:46:21 -050078 }),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070079 ].into(),
David Tolnayac997dd2017-12-27 23:18:22 -050080 }),
David Tolnayb153dbc2016-10-04 23:39:10 -070081 };
82
83 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
David Tolnaye7678922016-10-13 20:44:03 -070084 let tokens = quote! {
85 impl #impl_generics MyTrait for Test #ty_generics #where_clause {}
David Tolnayb153dbc2016-10-04 23:39:10 -070086 };
David Tolnay51382052017-12-27 13:46:21 -050087 let expected = concat!(
88 "impl < 'a , 'b : 'a , # [ may_dangle ] T : 'a > ",
89 "MyTrait for Test < 'a , 'b , T > ",
90 "where T : Debug { }"
91 );
David Tolnayc879a502017-01-25 15:51:32 -080092 assert_eq!(expected, tokens.to_string());
David Tolnayb153dbc2016-10-04 23:39:10 -070093
David Tolnayc879a502017-01-25 15:51:32 -080094 let turbofish = ty_generics.as_turbofish();
95 let tokens = quote! {
96 Test #turbofish
97 };
98 let expected = "Test :: < 'a , 'b , T >";
David Tolnaye7678922016-10-13 20:44:03 -070099 assert_eq!(expected, tokens.to_string());
David Tolnayb153dbc2016-10-04 23:39:10 -0700100}
David Tolnay23d83f92017-01-25 15:41:47 -0800101
102#[test]
103fn test_ty_param_bound() {
104 let tokens = quote!('a);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800105 let expected = TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default()));
David Tolnay51382052017-12-27 13:46:21 -0500106 assert_eq!(
107 expected,
108 common::parse::syn::<TypeParamBound>(tokens.into())
109 );
David Tolnay23d83f92017-01-25 15:41:47 -0800110
111 let tokens = quote!(Debug);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800112 let expected = TypeParamBound::Trait(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700113 PolyTraitRef {
114 bound_lifetimes: None,
115 trait_ref: "Debug".into(),
116 },
David Tolnay51382052017-12-27 13:46:21 -0500117 TraitBoundModifier::None,
118 );
119 assert_eq!(
120 expected,
121 common::parse::syn::<TypeParamBound>(tokens.into())
122 );
David Tolnay23d83f92017-01-25 15:41:47 -0800123
124 let tokens = quote!(?Sized);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800125 let expected = TypeParamBound::Trait(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700126 PolyTraitRef {
127 bound_lifetimes: None,
128 trait_ref: "Sized".into(),
129 },
David Tolnay51382052017-12-27 13:46:21 -0500130 TraitBoundModifier::Maybe(Default::default()),
131 );
132 assert_eq!(
133 expected,
134 common::parse::syn::<TypeParamBound>(tokens.into())
135 );
David Tolnay23d83f92017-01-25 15:41:47 -0800136}