@@ -7,7 +7,7 @@ use std::str::FromStr;
77
88use parser:: expr:: BinOp ;
99use parser:: node:: {
10- Call , Comment , Cond , CondTest , FilterBlock , If , Include , Let , Lit , Loop , Match , Whitespace , Ws ,
10+ Call , Comment , Cond , CondTest , Create , FilterBlock , If , Include , Let , Lit , Loop , Match , Whitespace , Ws ,
1111} ;
1212use parser:: { Expr , Node , Span , Target , WithSpan } ;
1313use proc_macro2:: TokenStream ;
@@ -103,6 +103,9 @@ impl<'a> Generator<'a, '_> {
103103 Node :: Let ( ref l) => {
104104 self . write_let ( ctx, buf, l) ?;
105105 }
106+ Node :: Create ( ref c) => {
107+ self . write_create ( ctx, buf, c) ?;
108+ }
106109 Node :: If ( ref i) => {
107110 size_hint += self . write_if ( ctx, buf, i) ?;
108111 }
@@ -913,6 +916,32 @@ impl<'a> Generator<'a, '_> {
913916 Ok ( ( ) )
914917 }
915918
919+ fn write_create (
920+ & mut self ,
921+ ctx : & Context < ' _ > ,
922+ buf : & mut Buffer ,
923+ c : & ' a WithSpan < Create < ' _ > > ,
924+ ) -> Result < ( ) , CompileError > {
925+ let span = ctx. span_for_node ( c. span ( ) ) ;
926+ if * c. var_name == "_" {
927+ return Err ( ctx. generate_error (
928+ "`_` cannot be used when there is no value assigned, use `let` instead" ,
929+ c. var_name . span ( ) ,
930+ ) ) ;
931+ }
932+ self . handle_ws ( c. ws ) ;
933+
934+ self . write_buf_writable ( ctx, buf) ?;
935+ buf. write_token ( Token ! [ let ] , span) ;
936+ if c. is_mutable {
937+ buf. write_token ( Token ! [ mut ] , span) ;
938+ }
939+ self . visit_target ( ctx, buf, false , true , & Target :: Name ( c. var_name ) , span) ;
940+ buf. write_token ( Token ! [ ; ] , span) ;
941+
942+ Ok ( ( ) )
943+ }
944+
916945 // If `name` is `Some`, this is a call to a block definition, and we have to find
917946 // the first block for that name from the ancestry chain. If name is `None`, this
918947 // is from a `super()` call, and we can get the name from `self.super_block`.
0 commit comments