blob: 1823a25cb7314352c57e5601d2ce9ebc964f04c0 [file] [log] [blame]
Alex Crichton2e0229c2017-05-23 09:34:50 -07001#![cfg(feature = "extra-traits")]
2
Nika Layzella2a1a4a2017-11-19 11:33:17 -05003#![feature(rustc_private)]
4
David Tolnayb153dbc2016-10-04 23:39:10 -07005extern crate syn;
6use syn::*;
7
David Tolnaye7678922016-10-13 20:44:03 -07008#[macro_use]
9extern crate quote;
David Tolnayb153dbc2016-10-04 23:39:10 -070010
Alex Crichton605643b2017-07-05 18:35:14 -070011extern crate proc_macro2;
12use proc_macro2::Term;
13
David Tolnayc7a5d3d2017-06-04 12:11:05 -070014mod common;
15
David Tolnayb153dbc2016-10-04 23:39:10 -070016#[test]
17fn test_split_for_impl() {
David Tolnaye7678922016-10-13 20:44:03 -070018 // <'a, 'b: 'a, #[may_dangle] T: 'a = ()> where T: Debug
David Tolnayc2f1aba2017-11-12 20:29:22 -080019 let generics = Generics {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070020 gt_token: Some(Default::default()),
21 lt_token: Some(Default::default()),
David Tolnayc2f1aba2017-11-12 20:29:22 -080022 params: vec![
23 GenericParam::Lifetime(LifetimeDef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070024 attrs: Default::default(),
Alex Crichton605643b2017-07-05 18:35:14 -070025 lifetime: Lifetime::new(Term::intern("'a"), Span::default()),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070026 bounds: Default::default(),
27 colon_token: None,
David Tolnayc2f1aba2017-11-12 20:29:22 -080028 }),
29 GenericParam::Lifetime(LifetimeDef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070030 attrs: Default::default(),
Alex Crichton605643b2017-07-05 18:35:14 -070031 lifetime: Lifetime::new(Term::intern("'b"), Span::default()),
32 bounds: vec![Lifetime::new(Term::intern("'a"), Span::default())].into(),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070033 colon_token: Some(tokens::Colon::default()),
David Tolnayc2f1aba2017-11-12 20:29:22 -080034 }),
35 GenericParam::Type(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(),
David Tolnayc2f1aba2017-11-12 20:29:22 -080053 }),
Alex Crichtonccbb45d2017-05-23 10:58:24 -070054 ].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 };
78
79 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
David Tolnaye7678922016-10-13 20:44:03 -070080 let tokens = quote! {
81 impl #impl_generics MyTrait for Test #ty_generics #where_clause {}
David Tolnayb153dbc2016-10-04 23:39:10 -070082 };
David Tolnay93413a52016-10-24 13:02:36 -070083 let expected = concat!("impl < 'a , 'b : 'a , # [ may_dangle ] T : 'a > ",
84 "MyTrait for Test < 'a , 'b , T > ",
85 "where T : Debug { }");
David Tolnayc879a502017-01-25 15:51:32 -080086 assert_eq!(expected, tokens.to_string());
David Tolnayb153dbc2016-10-04 23:39:10 -070087
David Tolnayc879a502017-01-25 15:51:32 -080088 let turbofish = ty_generics.as_turbofish();
89 let tokens = quote! {
90 Test #turbofish
91 };
92 let expected = "Test :: < 'a , 'b , T >";
David Tolnaye7678922016-10-13 20:44:03 -070093 assert_eq!(expected, tokens.to_string());
David Tolnayb153dbc2016-10-04 23:39:10 -070094}
David Tolnay23d83f92017-01-25 15:41:47 -080095
96#[test]
97fn test_ty_param_bound() {
98 let tokens = quote!('a);
David Tolnayfd6bf5c2017-11-12 09:41:14 -080099 let expected = TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default()));
100 assert_eq!(expected, common::parse::syn::<TypeParamBound>(tokens.into()));
David Tolnay23d83f92017-01-25 15:41:47 -0800101
102 let tokens = quote!(Debug);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800103 let expected = TypeParamBound::Trait(
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700104 PolyTraitRef {
105 bound_lifetimes: None,
106 trait_ref: "Debug".into(),
107 },
108 TraitBoundModifier::None);
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800109 assert_eq!(expected, common::parse::syn::<TypeParamBound>(tokens.into()));
David Tolnay23d83f92017-01-25 15:41:47 -0800110
111 let tokens = quote!(?Sized);
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: "Sized".into(),
116 },
117 TraitBoundModifier::Maybe(Default::default()));
David Tolnayfd6bf5c2017-11-12 09:41:14 -0800118 assert_eq!(expected, common::parse::syn::<TypeParamBound>(tokens.into()));
David Tolnay23d83f92017-01-25 15:41:47 -0800119}