@@ -7,7 +7,8 @@ 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 , Declare , FilterBlock , If , Include , Let , Lit , Loop , Match ,
11+ Whitespace , Ws ,
1112} ;
1213use parser:: { Expr , Node , Span , Target , WithSpan } ;
1314use proc_macro2:: TokenStream ;
@@ -103,6 +104,9 @@ impl<'a> Generator<'a, '_> {
103104 Node :: Let ( ref l) => {
104105 self . write_let ( ctx, buf, l) ?;
105106 }
107+ Node :: Declare ( ref c) => {
108+ self . write_decl ( ctx, buf, c) ?;
109+ }
106110 Node :: If ( ref i) => {
107111 size_hint += self . write_if ( ctx, buf, i) ?;
108112 }
@@ -859,6 +863,14 @@ impl<'a> Generator<'a, '_> {
859863 let span = ctx. span_for_node ( l. span ( ) ) ;
860864
861865 let Some ( val) = & l. val else {
866+ let file_info = ctx
867+ . file_info_of ( l. span ( ) )
868+ . map ( |info| format ! ( " {info}:" ) )
869+ . unwrap_or_default ( ) ;
870+ eprintln ! (
871+ "⚠️{file_info} `let` tag will stop supporting declaring variables without value. \
872+ Use `create` instead for this case",
873+ ) ;
862874 self . write_buf_writable ( ctx, buf) ?;
863875 buf. write_token ( Token ! [ let ] , span) ;
864876 if l. is_mutable {
@@ -914,6 +926,32 @@ impl<'a> Generator<'a, '_> {
914926 Ok ( ( ) )
915927 }
916928
929+ fn write_decl (
930+ & mut self ,
931+ ctx : & Context < ' _ > ,
932+ buf : & mut Buffer ,
933+ c : & ' a WithSpan < Declare < ' _ > > ,
934+ ) -> Result < ( ) , CompileError > {
935+ let span = ctx. span_for_node ( c. span ( ) ) ;
936+ if * c. var_name == "_" {
937+ return Err ( ctx. generate_error (
938+ "`_` cannot be used when there is no value assigned, use `let` instead" ,
939+ c. var_name . span ( ) ,
940+ ) ) ;
941+ }
942+ self . handle_ws ( c. ws ) ;
943+
944+ self . write_buf_writable ( ctx, buf) ?;
945+ buf. write_token ( Token ! [ let ] , span) ;
946+ if c. is_mutable {
947+ buf. write_token ( Token ! [ mut ] , span) ;
948+ }
949+ self . visit_target ( ctx, buf, false , true , & Target :: Name ( c. var_name ) , span) ;
950+ buf. write_token ( Token ! [ ; ] , span) ;
951+
952+ Ok ( ( ) )
953+ }
954+
917955 // If `name` is `Some`, this is a call to a block definition, and we have to find
918956 // the first block for that name from the ancestry chain. If name is `None`, this
919957 // is from a `super()` call, and we can get the name from `self.super_block`.
0 commit comments