@@ -6,67 +6,98 @@ use cast::u64;
66use proc_macro2:: { Ident , Span , TokenStream } ;
77use quote:: quote;
88
9- use crate :: util:: { self , ToSanitizedUpperCase } ;
10- use crate :: Target ;
9+ use crate :: util:: { self , ToSanitizedSnakeCase , ToSanitizedUpperCase } ;
10+ use crate :: { Config , Target } ;
1111use anyhow:: Result ;
1212
1313/// Generates code for `src/interrupt.rs`
1414pub fn render (
1515 target : Target ,
1616 peripherals : & [ Peripheral ] ,
1717 device_x : & mut String ,
18+ config : & Config ,
1819) -> Result < TokenStream > {
1920 let interrupts = peripherals
2021 . iter ( )
21- . flat_map ( |p| p. interrupt . iter ( ) )
22- . map ( |i| ( i. value , i ) )
22+ . flat_map ( |p| p. interrupt . iter ( ) . map ( move |i| ( i , p . group_name . clone ( ) ) ) )
23+ . map ( |i| ( i. 0 . value , ( i . 0 , i . 1 ) ) )
2324 . collect :: < HashMap < _ , _ > > ( ) ;
2425
2526 let mut interrupts = interrupts. into_iter ( ) . map ( |( _, v) | v) . collect :: < Vec < _ > > ( ) ;
26- interrupts. sort_by_key ( |i| i. value ) ;
27+ interrupts. sort_by_key ( |i| i. 0 . value ) ;
2728
2829 let mut root = TokenStream :: new ( ) ;
2930 let mut from_arms = TokenStream :: new ( ) ;
3031 let mut elements = TokenStream :: new ( ) ;
3132 let mut names = vec ! [ ] ;
33+ let mut names_cfg_attr = vec ! [ ] ;
3234 let mut variants = TokenStream :: new ( ) ;
3335
3436 // Current position in the vector table
3537 let mut pos = 0 ;
3638 let mut mod_items = TokenStream :: new ( ) ;
3739 for interrupt in & interrupts {
38- while pos < interrupt. value {
40+ while pos < interrupt. 0 . value {
3941 elements. extend ( quote ! ( Vector { _reserved: 0 } , ) ) ;
4042 pos += 1 ;
4143 }
4244 pos += 1 ;
4345
44- let name_uc = Ident :: new ( & interrupt. name . to_sanitized_upper_case ( ) , Span :: call_site ( ) ) ;
46+ let name_uc = Ident :: new (
47+ & interrupt. 0 . name . to_sanitized_upper_case ( ) ,
48+ Span :: call_site ( ) ,
49+ ) ;
4550 let description = format ! (
4651 "{} - {}" ,
47- interrupt. value,
52+ interrupt. 0 . value,
4853 interrupt
54+ . 0
4955 . description
5056 . as_ref( )
5157 . map( |s| util:: respace( s) )
5258 . as_ref( )
5359 . map( |s| util:: escape_brackets( s) )
54- . unwrap_or_else( || interrupt. name. clone( ) )
60+ . unwrap_or_else( || interrupt. 0 . name. clone( ) )
5561 ) ;
5662
57- let value = util:: unsuffixed ( u64 ( interrupt. value ) ) ;
63+ let value = util:: unsuffixed ( u64 ( interrupt. 0 . value ) ) ;
64+
65+ let mut feature_attribute_flag = false ;
66+ let ( feature_attribute, not_feature_attribute) =
67+ if config. feature_group && interrupt. 1 . is_some ( ) {
68+ let feature_name = interrupt. 1 . as_ref ( ) . unwrap ( ) . to_sanitized_snake_case ( ) ;
69+ feature_attribute_flag = true ;
70+ (
71+ quote ! ( #[ cfg( feature = #feature_name) ] ) ,
72+ quote ! ( #[ cfg( not( feature = #feature_name) ) ] ) ,
73+ )
74+ } else {
75+ ( quote ! ( ) , quote ! ( ) )
76+ } ;
5877
5978 variants. extend ( quote ! {
6079 #[ doc = #description]
80+ #feature_attribute
6181 #name_uc = #value,
6282 } ) ;
6383
6484 from_arms. extend ( quote ! {
85+ #feature_attribute
6586 #value => Ok ( Interrupt :: #name_uc) ,
6687 } ) ;
6788
68- elements. extend ( quote ! ( Vector { _handler: #name_uc } , ) ) ;
89+ if feature_attribute_flag {
90+ elements. extend ( quote ! {
91+ #not_feature_attribute
92+ Vector { _reserved: 0 } ,
93+ #feature_attribute
94+ Vector { _handler: #name_uc } ,
95+ } ) ;
96+ } else {
97+ elements. extend ( quote ! ( Vector { _handler: #name_uc } , ) ) ;
98+ }
6999 names. push ( name_uc) ;
100+ names_cfg_attr. push ( feature_attribute) ;
70101 }
71102
72103 let n = util:: unsuffixed ( u64 ( pos) ) ;
@@ -79,7 +110,7 @@ pub fn render(
79110 root. extend ( quote ! {
80111 #[ cfg( feature = "rt" ) ]
81112 extern "C" {
82- #( fn #names( ) ; ) *
113+ #( #names_cfg_attr fn #names( ) ; ) *
83114 }
84115
85116 #[ doc( hidden) ]
@@ -105,7 +136,7 @@ pub fn render(
105136 root. extend ( quote ! {
106137 #[ cfg( feature = "rt" ) ]
107138 extern "msp430-interrupt" {
108- #( fn #names( ) ; ) *
139+ #( #names_cfg_attr fn #names( ) ; ) *
109140 }
110141
111142 #[ doc( hidden) ]
@@ -133,7 +164,7 @@ pub fn render(
133164 root. extend ( quote ! {
134165 #[ cfg( feature = "rt" ) ]
135166 extern "C" {
136- #( fn #names( ) ; ) *
167+ #( #names_cfg_attr fn #names( ) ; ) *
137168 }
138169
139170 #[ doc( hidden) ]
@@ -158,7 +189,7 @@ pub fn render(
158189 root. extend ( quote ! {
159190 #[ cfg( feature = "rt" ) ]
160191 extern "C" {
161- #( fn #names( ) ; ) *
192+ #( #names_cfg_attr fn #names( ) ; ) *
162193 }
163194
164195 #[ doc( hidden) ]
0 commit comments