Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Perlito5 - perl6 - transform 'use vars' into 'our'
  • Loading branch information
fglock committed Jun 2, 2014
1 parent 0985575 commit 94274ab
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 15 deletions.
26 changes: 22 additions & 4 deletions html/perlito5.js
Expand Up @@ -8209,10 +8209,28 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
var v_full_ident;
v_full_ident = (p5pkg["Perlito5::Match"].flat(p5list_to_a((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('Perlito5::Grammar.full_ident')), 0));
(p5make_package("Perlito5")["v_PACKAGES"] || (p5make_package("Perlito5")["v_PACKAGES"] = new p5HashRef({})))._hash_.p5hset(p5str(v_full_ident), (1));
var v_ast;
v_ast = (p5call(p5pkg["Perlito5::AST::Use"], "new", p5list_to_a('code', p5pkg["Perlito5::Match"].flat(p5list_to_a((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('use_decl')), 1), 'mod', v_full_ident, 'arguments', v_list), 0));
p5pkg["Perlito5::Grammar::Use"].parse_time_eval([v_ast], null);
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', (v_ast));
var v_use_decl;
v_use_decl = (p5pkg["Perlito5::Match"].flat(p5list_to_a((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('use_decl')), 0));
if ( (((p5str(v_use_decl) == 'use') && (p5str(v_full_ident) == 'vars')) && p5bool(v_list)) ) {
(function () {
var v_code;
v_code = (('our (' + p5pkg["Perlito5::Grammar::Use"].join([', ', p5list_to_a((v_list || (v_list = new p5ArrayRef([])))._array_)], 0) + ')'));
var v_m;
v_m = (p5call(p5pkg["Perlito5::Grammar::Statement"], "statement_parse", [v_code, 0], 0));
if ( !( p5bool(v_m)) ) {
p5pkg["Perlito5::Grammar::Use"].die([[('not a valid variable name: ' + p5pkg["Perlito5::Grammar::Use"].join([p5pkg["main"]["v_\""], p5list_to_a((v_list || (v_list = new p5ArrayRef([])))._array_)], 0))]], null)
};
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', ((v_m || (v_m = new p5HashRef({})))._hash_.p5hget('capture')));
})();
}
else {
(function () {
var v_ast;
v_ast = (p5call(p5pkg["Perlito5::AST::Use"], "new", ['code', v_use_decl, 'mod', v_full_ident, 'arguments', v_list], 0));
p5pkg["Perlito5::Grammar::Use"].parse_time_eval([v_ast], null);
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', (v_ast));
})();
};
return (p5context([1], p5want));
})()], p5want) })], p5want));
})()], p5want) }));
Expand Down
16 changes: 13 additions & 3 deletions perlito5.pl
Expand Up @@ -5222,9 +5222,19 @@ sub Perlito5::Grammar::Use::stmt_use {
}
my $full_ident = Perlito5::Match::flat($MATCH->{'Perlito5::Grammar.full_ident'});
$Perlito5::PACKAGES->{$full_ident} = 1;
my $ast = Perlito5::AST::Use->new('code' => Perlito5::Match::flat($MATCH->{'use_decl'}), 'mod' => $full_ident, 'arguments' => $list);
parse_time_eval($ast);
$MATCH->{'capture'} = $ast;
my $use_decl = Perlito5::Match::flat($MATCH->{'use_decl'});
if ($use_decl eq 'use' && $full_ident eq 'vars' && $list) {
my $code = 'our (' . join(', ', @{$list}) . ')';
my $m = Perlito5::Grammar::Statement->statement_parse($code, 0);
die('not a valid variable name: ' . join(${'"'}, @{$list}))
if !$m;
$MATCH->{'capture'} = $m->{'capture'}
}
else {
my $ast = Perlito5::AST::Use->new('code' => $use_decl, 'mod' => $full_ident, 'arguments' => $list);
parse_time_eval($ast);
$MATCH->{'capture'} = $ast
}
1
}))
})
Expand Down
28 changes: 20 additions & 8 deletions src5/lib/Perlito5/Grammar/Use.pm
Expand Up @@ -17,6 +17,7 @@ my %Perlito_internal_module = (
encoding => 'Perlito5::encoding',
Carp => 'Perlito5::Carp',
'Data::Dumper' => 'Perlito5::Dumper',
# vars => 'Perlito5::vars', # this is "hardcoded" in stmt_use()
);


Expand Down Expand Up @@ -60,15 +61,26 @@ token stmt_use {
my $full_ident = Perlito5::Match::flat($MATCH->{"Perlito5::Grammar.full_ident"});
$Perlito5::PACKAGES->{$full_ident} = 1;

my $ast = Perlito5::AST::Use->new(
code => Perlito5::Match::flat($MATCH->{use_decl}),
mod => $full_ident,
arguments => $list
);
my $use_decl = Perlito5::Match::flat($MATCH->{use_decl});

parse_time_eval($ast);

$MATCH->{capture} = $ast;
if ($use_decl eq 'use' && $full_ident eq 'vars' && $list) {
my $code = 'our (' . join(', ', @$list) . ')';
#say "will do: $code";
my $m = Perlito5::Grammar::Statement->statement_parse($code, 0);
die "not a valid variable name: @$list"
if !$m;
#say Perlito5::Dumper::Dumper($m->{capture});
$MATCH->{capture} = $m->{capture};
}
else {
my $ast = Perlito5::AST::Use->new(
code => $use_decl,
mod => $full_ident,
arguments => $list
);
parse_time_eval($ast);
$MATCH->{capture} = $ast;
}
}
]
};
Expand Down

0 comments on commit 94274ab

Please sign in to comment.