blob: eda415b9c5a937b1bf1ffed1b68848e84a09d221 [file] [log] [blame]
Alex Crichton2e0229c2017-05-23 09:34:50 -07001#![cfg(feature = "extra-traits")]
2
David Tolnayb153dbc2016-10-04 23:39:10 -07003extern crate syn;
4use syn::*;
5
David Tolnaye7678922016-10-13 20:44:03 -07006#[macro_use]
7extern crate quote;
David Tolnayb153dbc2016-10-04 23:39:10 -07008
Alex Crichton605643b2017-07-05 18:35:14 -07009extern crate proc_macro2;
10use proc_macro2::Term;
11
David Tolnayc7a5d3d2017-06-04 12:11:05 -070012mod common;
13
David Tolnayb153dbc2016-10-04 23:39:10 -070014#[test]
15fn test_split_for_impl() {
David Tolnaye7678922016-10-13 20:44:03 -070016 // <'a, 'b: 'a, #[may_dangle] T: 'a = ()> where T: Debug
Alex Crichtonccbb45d2017-05-23 10:58:24 -070017 let mut generics = Generics {
18 gt_token: Some(Default::default()),
19 lt_token: Some(Default::default()),
20 lifetimes: vec![
21 LifetimeDef {
22 attrs: Default::default(),
Alex Crichton605643b2017-07-05 18:35:14 -070023 lifetime: Lifetime::new(Term::intern("'a"), Span::default()),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070024 bounds: Default::default(),
25 colon_token: None,
26 },
27 LifetimeDef {
28 attrs: Default::default(),
Alex Crichton605643b2017-07-05 18:35:14 -070029 lifetime: Lifetime::new(Term::intern("'b"), Span::default()),
30 bounds: vec![Lifetime::new(Term::intern("'a"), Span::default())].into(),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070031 colon_token: Some(tokens::Colon::default()),
32 },
33 ].into(),
34 ty_params: vec![
David Tolnayfd6bf5c2017-11-12 09:41:14 -080035 TypeParam {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070036 attrs: vec![Attribute {
37 bracket_token: Default::default(),
38 pound_token: Default::default(),
39 style: AttrStyle::Outer,
40 path: "may_dangle".into(),
41 tts: vec![],
42 is_sugared_doc: false,
43 }],
44 ident: "T".into(),
David Tolnayfd6bf5c2017-11-12 09:41:14 -080045 bounds: vec![TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default()))].into(),
46 default: Some(TypeTup {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070047 tys: Default::default(),
48 lone_comma: None,
49 paren_token: Default::default(),
50 }.into()),
51 colon_token: Some(Default::default()),
52 eq_token: Default::default(),
53 },
54 ].into(),
David Tolnayb153dbc2016-10-04 23:39:10 -070055 where_clause: WhereClause {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070056 where_token: Some(Default::default()),
57 predicates: vec![
58 WherePredicate::BoundPredicate(WhereBoundPredicate {
59 bound_lifetimes: None,
60 colon_token: Default::default(),
David Tolnayfd6bf5c2017-11-12 09:41:14 -080061 bounded_ty: TypePath {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070062 qself: None,
63 path: "T".into(),
64 }.into(),
65 bounds: vec![
David Tolnayfd6bf5c2017-11-12 09:41:14 -080066 TypeParamBound::Trait(
David Tolnayb153dbc2016-10-04 23:39:10 -070067 PolyTraitRef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070068 bound_lifetimes: None,
David Tolnaye7678922016-10-13 20:44:03 -070069 trait_ref: "Debug".into(),
David Tolnayb153dbc2016-10-04 23:39:10 -070070 },
71 TraitBoundModifier::None,
72 ),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070073 ].into(),
74 })
75 ].into(),
David Tolnayb153dbc2016-10-04 23:39:10 -070076 },
77 };
Alex Crichtonccbb45d2017-05-23 10:58:24 -070078 generics.lifetimes.push_trailing(Default::default());
David Tolnayb153dbc2016-10-04 23:39:10 -070079
80 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
David Tolnaye7678922016-10-13 20:44:03 -070081 let tokens = quote! {
82 impl #impl_generics MyTrait for Test #ty_generics #where_clause {}
David Tolnayb153dbc2016-10-04 23:39:10 -070083 };
David Tolnay93413a52016-10-24 13:02:36 -070084 let expected = concat!("impl < 'a , 'b : 'a , # [ may_dangle ] T : 'a > ",
85 "MyTrait for Test < 'a , 'b , T > ",
86 "where T : Debug { }");
David Tolnayc879a502017-01-25 15:51:32 -080087 assert_eq!(expected, tokens.to_string());
David Tolnayb153dbc2016-10-04 23:39:10 -070088
David Tolnayc879a502017-01-25 15:51:32 -080089 let turbofish = ty_generics.as_turbofish();
90 let tokens = quote! {
91 Test #turbofish
92 };
93 let expected = "Test :: < 'a , 'b , T >";
David Tolnaye7678922016-10-13 20:44:03 -070094 assert_eq!(expected, tokens.to_string());
David Tolnayb153dbc2016-10-04 23:39:10 -070095}
David Tolnay23d83f92017-01-25 15:41:47 -080096
97#[test]
98fn test_ty_param_bound() {
99 let tokens = quote!('a);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800100 let expected = TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default()));
101 assert_eq!(expected, common::parse::syn::<TypeParamBound>(tokens.into()));
David Tolnay23d83f92017-01-25 15:41:47 -0800102
103 let tokens = quote!(Debug);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800104 let expected = TypeParamBound::Trait(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700105 PolyTraitRef {
106 bound_lifetimes: None,
107 trait_ref: "Debug".into(),
108 },
109 TraitBoundModifier::None);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800110 assert_eq!(expected, common::parse::syn::<TypeParamBound>(tokens.into()));
David Tolnay23d83f92017-01-25 15:41:47 -0800111
112 let tokens = quote!(?Sized);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800113 let expected = TypeParamBound::Trait(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700114 PolyTraitRef {
115 bound_lifetimes: None,
116 trait_ref: "Sized".into(),
117 },
118 TraitBoundModifier::Maybe(Default::default()));
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800119 assert_eq!(expected, common::parse::syn::<TypeParamBound>(tokens.into()));
David Tolnay23d83f92017-01-25 15:41:47 -0800120}