@@ -9,13 +9,15 @@ use syn::{
99
1010pub struct Optimizer {
1111 rm_whitespace : bool ,
12+ rm_newline : bool ,
1213}
1314
1415impl Optimizer {
1516 #[ inline]
1617 pub fn new ( ) -> Self {
1718 Self {
1819 rm_whitespace : false ,
20+ rm_newline : false ,
1921 }
2022 }
2123
@@ -25,17 +27,45 @@ impl Optimizer {
2527 self
2628 }
2729
30+ #[ inline]
31+ pub fn rm_newline ( mut self , new : bool ) -> Self {
32+ self . rm_newline = new;
33+ self
34+ }
35+
2836 #[ inline]
2937 pub fn optimize ( & self , i : & mut Block ) {
3038 OptmizerImpl {
3139 rm_whitespace : self . rm_whitespace ,
40+ rm_newline : self . rm_newline ,
3241 }
3342 . visit_block_mut ( i) ;
3443 }
3544}
3645
3746struct OptmizerImpl {
3847 rm_whitespace : bool ,
48+ rm_newline : bool ,
49+ }
50+
51+ impl OptmizerImpl {
52+ fn apply_optimizations ( & self , v : String ) -> Option < TokenStream > {
53+ let mut optimized = v. to_string ( ) ;
54+
55+ if self . rm_whitespace {
56+ optimized = remove_whitespace ( & optimized) ;
57+ }
58+ if self . rm_newline {
59+ optimized = remove_newlines ( & optimized) ;
60+ }
61+
62+ // Only return a token stream if the string was actually modified
63+ if optimized != v {
64+ Some ( quote ! { __sf_buf, #optimized } )
65+ } else {
66+ None
67+ }
68+ }
3969}
4070
4171impl VisitMut for OptmizerImpl {
@@ -120,12 +150,8 @@ impl VisitMut for OptmizerImpl {
120150 }
121151
122152 fn visit_stmt_macro_mut ( & mut self , i : & mut StmtMacro ) {
123- if self . rm_whitespace {
124- if let Some ( v) = get_rendertext_value ( & i. mac ) {
125- let ts = match remove_whitespace ( v) {
126- Some ( value) => value,
127- None => return ,
128- } ;
153+ if let Some ( v) = get_rendertext_value ( & i. mac ) {
154+ if let Some ( ts) = self . apply_optimizations ( v) {
129155 i. mac . tokens = ts;
130156 return ;
131157 }
@@ -135,12 +161,8 @@ impl VisitMut for OptmizerImpl {
135161 }
136162
137163 fn visit_expr_macro_mut ( & mut self , i : & mut ExprMacro ) {
138- if self . rm_whitespace {
139- if let Some ( v) = get_rendertext_value ( & i. mac ) {
140- let ts = match remove_whitespace ( v) {
141- Some ( value) => value,
142- None => return ,
143- } ;
164+ if let Some ( v) = get_rendertext_value ( & i. mac ) {
165+ if let Some ( ts) = self . apply_optimizations ( v) {
144166 i. mac . tokens = ts;
145167 return ;
146168 }
@@ -150,15 +172,15 @@ impl VisitMut for OptmizerImpl {
150172 }
151173}
152174
153- fn remove_whitespace ( v : String ) -> Option < TokenStream > {
175+ fn remove_whitespace ( v : & str ) -> String {
154176 let mut buffer = String :: new ( ) ;
155177 let mut it = v. lines ( ) . peekable ( ) ;
156178 if let Some ( line) = it. next ( ) {
157179 if it. peek ( ) . is_some ( ) {
158180 buffer. push_str ( line. trim_end ( ) ) ;
159181 buffer. push ( '\n' ) ;
160182 } else {
161- return None ;
183+ return v . to_string ( ) ;
162184 }
163185 }
164186 while let Some ( line) = it. next ( ) {
@@ -174,8 +196,11 @@ fn remove_whitespace(v: String) -> Option<TokenStream> {
174196 buffer. push_str ( line. trim_start ( ) ) ;
175197 }
176198 }
199+ buffer
200+ }
177201
178- Some ( quote ! { __sf_buf, #buffer } )
202+ fn remove_newlines ( v : & str ) -> String {
203+ v. replace ( [ '\n' , '\r' ] , "" )
179204}
180205
181206fn get_rendertext_value ( mac : & Macro ) -> Option < String > {
0 commit comments