@@ -240,6 +240,11 @@ pub fn print_crate<'a>(
240240 let mut s =
241241 State { s : pp:: Printer :: new ( ) , comments : Some ( Comments :: new ( sm, filename, input) ) , ann } ;
242242
243+ // We need to print shebang before anything else
244+ // otherwise the resulting code will not compile
245+ // and shebang will be useless.
246+ s. maybe_print_shebang ( ) ;
247+
243248 if is_expanded && !krate. attrs . iter ( ) . any ( |attr| attr. has_name ( sym:: no_core) ) {
244249 // We need to print `#![no_std]` (and its feature gate) so that
245250 // compiling pretty-printed source won't inject libstd again.
@@ -560,6 +565,20 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
560565 self . word ( st)
561566 }
562567
568+ fn maybe_print_shebang ( & mut self ) {
569+ if let Some ( cmnt) = self . peek_comment ( ) {
570+ // Comment is a shebang if it's:
571+ // Isolated, starts with #! and doesn't continue with `[`
572+ // See [rustc_lexer::strip_shebang] and [gather_comments] from pprust/state.rs for details
573+ if cmnt. style == CommentStyle :: Isolated
574+ && cmnt. lines . first ( ) . map_or ( false , |l| l. starts_with ( "#!" ) )
575+ {
576+ let cmnt = self . next_comment ( ) . unwrap ( ) ;
577+ self . print_comment ( cmnt) ;
578+ }
579+ }
580+ }
581+
563582 fn print_inner_attributes ( & mut self , attrs : & [ ast:: Attribute ] ) -> bool {
564583 self . print_either_attributes ( attrs, ast:: AttrStyle :: Inner , false , true )
565584 }
0 commit comments