diff --git a/src/Perl6/Actions.pm b/src/Perl6/Actions.pm index c525f97a545..14c3f30d77b 100644 --- a/src/Perl6/Actions.pm +++ b/src/Perl6/Actions.pm @@ -1475,12 +1475,31 @@ method dec_number($/) { } method typename($/) { - my @name := Perl6::Grammar::parse_name($.Str); - my $past := PAST::Var.new( - :name(@name.pop), - :namespace(@name), - :scope('package') - ); + my $past; + if is_lexical($.Str) { + # We need to build a thunk. + $past := PAST::Block.new( + PAST::Var.new( :name('$_'), :scope('parameter'), :isdecl(1) ), + PAST::Op.new( :pasttype('callmethod'), :name('ACCEPTS'), + PAST::Var.new( :name($.Str), :scope('lexical') ), + PAST::Var.new( :name('$_'), :scope('lexical') ) + ) + ); + my $sig := Perl6::Compiler::Signature.new(); + my $param := Perl6::Compiler::Parameter.new(); + $param.var_name('$_'); + $sig.add_parameter($param); + add_signature($past, $sig, 0); + $past := create_code_object($past, 'Block', 0, ''); + } + else { + my @name := Perl6::Grammar::parse_name($.Str); + $past := PAST::Var.new( + :name(@name.pop), + :namespace(@name), + :scope('package') + ); + } make $past; }