@@ -1890,8 +1890,25 @@ impl Parser {
18901890 let local = self . get_local ( & name) ?;
18911891 Expr :: LocalCall ( local, args)
18921892 } else if self . functions . contains_key ( & name) {
1893- let decl = self . resolve_function_for_call ( & name, args. len ( ) ) ?;
1894- Expr :: Call ( decl. index , args)
1893+ let builtin_alias_call = if matches ! ( name. as_str( ) , "print" | "println" ) {
1894+ self . functions
1895+ . get ( & name)
1896+ . map ( |decl| !self . function_impls . contains_key ( & decl. index ) )
1897+ . unwrap_or ( false )
1898+ } else {
1899+ false
1900+ } ;
1901+ if builtin_alias_call {
1902+ if let Some ( expr) = self . try_build_language_builtin_call ( & name, & args) ? {
1903+ expr
1904+ } else {
1905+ let decl = self . resolve_function_for_call ( & name, args. len ( ) ) ?;
1906+ Expr :: Call ( decl. index , args)
1907+ }
1908+ } else {
1909+ let decl = self . resolve_function_for_call ( & name, args. len ( ) ) ?;
1910+ Expr :: Call ( decl. index , args)
1911+ }
18951912 } else if let Some ( expr) = self . try_build_language_builtin_call ( & name, & args) ? {
18961913 expr
18971914 } else if let Some ( host_name) = self . resolve_direct_host_call_target ( & name) {
@@ -2640,9 +2657,11 @@ impl Parser {
26402657 "print" if self . dialect . allow_macro_calls ( ) => {
26412658 Ok ( Some ( self . lower_print_call ( args. to_vec ( ) ) ?) )
26422659 }
2660+ "print" => Ok ( Some ( self . lower_plain_print_call ( args. to_vec ( ) ) ?) ) ,
26432661 "println" if self . dialect . allow_macro_calls ( ) => {
26442662 Ok ( Some ( self . lower_println_call ( args. to_vec ( ) ) ?) )
26452663 }
2664+ "println" => Ok ( Some ( self . lower_plain_println_call ( args. to_vec ( ) ) ?) ) ,
26462665 "type" | "typeof" => {
26472666 if args. len ( ) != 1 {
26482667 return Err ( ParseError {
@@ -2694,6 +2713,11 @@ impl Parser {
26942713 self . build_print_call_expr ( rendered)
26952714 }
26962715
2716+ fn lower_plain_print_call ( & mut self , args : Vec < Expr > ) -> Result < Expr , ParseError > {
2717+ let rendered = self . render_plain_print_args ( args) ?;
2718+ self . build_print_call_expr ( rendered)
2719+ }
2720+
26972721 fn lower_println_call ( & mut self , args : Vec < Expr > ) -> Result < Expr , ParseError > {
26982722 let rendered = match args. as_slice ( ) {
26992723 [ ] => Expr :: String ( "\n " . to_string ( ) ) ,
@@ -2714,6 +2738,42 @@ impl Parser {
27142738 self . build_print_call_expr ( rendered)
27152739 }
27162740
2741+ fn lower_plain_println_call ( & mut self , args : Vec < Expr > ) -> Result < Expr , ParseError > {
2742+ let rendered = match args. is_empty ( ) {
2743+ true => Expr :: String ( "\n " . to_string ( ) ) ,
2744+ false => {
2745+ let rendered = self . render_plain_print_args ( args) ?;
2746+ let value = self . build_to_string_expr ( rendered) ?;
2747+ self . append_newline_expr ( value)
2748+ }
2749+ } ;
2750+ self . build_print_call_expr ( rendered)
2751+ }
2752+
2753+ fn render_plain_print_args ( & mut self , args : Vec < Expr > ) -> Result < Expr , ParseError > {
2754+ match args. len ( ) {
2755+ 0 => Ok ( Expr :: String ( String :: new ( ) ) ) ,
2756+ 1 => Ok ( args
2757+ . into_iter ( )
2758+ . next ( )
2759+ . expect ( "single print arg should exist" ) ) ,
2760+ _ => {
2761+ let mut args = args. into_iter ( ) ;
2762+ let mut rendered =
2763+ self . build_to_string_expr ( args. next ( ) . expect ( "first print arg should exist" ) ) ?;
2764+ for arg in args {
2765+ rendered =
2766+ Expr :: Add ( Box :: new ( rendered) , Box :: new ( Expr :: String ( " " . to_string ( ) ) ) ) ;
2767+ rendered = Expr :: Add (
2768+ Box :: new ( rendered) ,
2769+ Box :: new ( self . build_to_string_expr ( arg) ?) ,
2770+ ) ;
2771+ }
2772+ Ok ( rendered)
2773+ }
2774+ }
2775+ }
2776+
27172777 fn expect_format_literal < ' a > (
27182778 & self ,
27192779 callee : & str ,
@@ -3126,8 +3186,9 @@ impl Parser {
31263186 let mut args = self . parse_call_args ( ) ?;
31273187
31283188 if base == "console" && segments. len ( ) == 1 && segments[ 0 ] == "log" {
3129- let decl = self . resolve_function_for_call ( STDLIB_PRINT_NAME , args. len ( ) ) ?;
3130- return Ok ( Some ( Expr :: Call ( decl. index , args) ) ) ;
3189+ return Ok ( Some (
3190+ self . lower_plain_print_call ( std:: mem:: take ( & mut args) ) ?,
3191+ ) ) ;
31313192 }
31323193
31333194 if segments. is_empty ( ) {
0 commit comments