diff --git a/src/NQP/Actions.pm b/src/NQP/Actions.pm index 5ea5b02..15669ff 100644 --- a/src/NQP/Actions.pm +++ b/src/NQP/Actions.pm @@ -18,7 +18,7 @@ method statementlist($/) { for $ { my $ast := $_.ast; if $ast.isa(PAST::Block) && !$ast.blocktype { - $ast.blocktype('immediate'); + $ast := block_immediate($ast); } $past.push( $ast ); } @@ -35,9 +35,7 @@ method statement($/) { } method xblock($/) { - my $pblock := $.ast; - $pblock.blocktype('immediate'); - make PAST::Op.new( $.ast, $pblock, :pasttype('if'), :node($/) ); + make PAST::Op.new( $.ast, $.ast, :pasttype('if'), :node($/) ); } method pblock($/) { @@ -61,30 +59,28 @@ method newpad($/) { method statement_control:sym($/) { my $count := +$ - 1; - my $past := $[$count].ast; + my $past := xblock_immediate( $[$count].ast ); if $ { - my $else := $[0].ast; - $else.blocktype('immediate'); - $past.push($else); + $past.push( block_immediate( $[0].ast ) ); } # build if/then/elsif structure while $count > 0 { $count--; my $else := $past; - $past := $[$count].ast; + $past := xblock_immediate( $[$count].ast ); $past.push($else); } make $past; } method statement_control:sym($/) { - my $past := $.ast; + my $past := xblock_immediate( $.ast ); $past.pasttype('unless'); make $past; } method statement_control:sym($/) { - my $past := $.ast; + my $past := xblock_immediate( $.ast ); $past.pasttype(~$); make $past; } @@ -93,13 +89,11 @@ method statement_control:sym($/) { my $pasttype := 'repeat_' ~ ~$; my $past; if $ { - $past := $.ast; + $past := xblock_immediate( $.ast ); $past.pasttype($pasttype); } else { - $past := $.ast; - $past.blocktype('immediate'); - $past := PAST::Op.new( $.ast, $past, + $past := PAST::Op.new( $.ast, block_immediate( $.ast ), :pasttype($pasttype), :node($/) ); } make $past; @@ -112,6 +106,7 @@ method statement_control:sym($/) { $block[0].push( PAST::Var.new( :name('$_'), :scope('parameter') ) ); $block.symbol('$_', :scope('lexical') ); $block.arity(1); + $block.blocktype('immediate'); make $past; } @@ -333,6 +328,21 @@ method postfix:sym<-->($/) { :pasttype('inline') ); } +sub xblock_immediate($xblock) { + $xblock[1] := block_immediate($xblock[1]); + $xblock; +} + +sub block_immediate($block) { + $block.blocktype('immediate'); + unless $block.symtable() { + my $stmts := PAST::Stmts.new( :node($block) ); + for $block.list { $stmts.push($_); } + $block := $stmts; + } + $block; +} + sub sigiltype($sigil) { $sigil eq '%' ?? 'Hash'