Skip to content

Commit

Permalink
RakuAST: Eradicate Statement::No class
Browse files Browse the repository at this point in the history
Since all use of "no foo" will be pragmas for the foreseeable future,
it doesn't make sense to keep the class around, but instead directly
refer to the RakuAST::Pragma class directly in the actions.

This allows further simplifications, and changing tests for
RakuAST::Statement::No to RakuAST::Pragma
  • Loading branch information
lizmat committed Feb 5, 2023
1 parent 46982a9 commit 32a733c
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 80 deletions.
58 changes: 39 additions & 19 deletions src/Raku/Actions.nqp
Expand Up @@ -515,29 +515,49 @@ class Raku::Actions is HLL::Actions does Raku::CommonActions {
}

method statement_control:sym<no>($/) {
my $ast := $<arglist><EXPR>
?? self.r('Statement', 'No').new(
module-name => $<module_name>.ast,
argument => $<arglist><EXPR>.ast,
)
!! self.r('Statement', 'No').new(
module-name => $<module_name>.ast,
);
$ast.ensure-begin-performed($*R, $*CU.context);
self.attach: $/, $ast;
my str $name := ~$<module_name>;
if RakuAST::Pragma.IS-PRAGMA($name) {
my $ast := $<arglist><EXPR>
?? self.r('Pragma').new(
:$name, :argument($<arglist><EXPR>.ast), :off
)
!! self.r('Pragma').new(:$name, :off);
$ast.ensure-begin-performed($*R, $*CU.context);
self.attach: $/, $ast;
}
else {
nqp::die("Don't know how to 'no " ~ $name ~ "'just yet")
}
}

method statement_control:sym<use>($/) {
my $ast := $<arglist><EXPR>
?? self.r('Statement', 'Use').new(
module-name => $<module_name>.ast,
argument => $<arglist><EXPR>.ast
)
!! self.r('Statement', 'Use').new(module-name => $<module_name>.ast);
$ast.ensure-begin-performed($*R, $*CU.context);
for $ast.IMPL-UNWRAP-LIST($ast.categoricals) {
$/.add-categorical($_.category, $_.opname, $_.canname, $_.subname, $_.declarand);
my str $name := ~$<module_name>;
my $ast;

if RakuAST::Pragma.IS-PRAGMA($name) {
$ast := $<arglist><EXPR>
?? self.r('Pragma').new(:$name, :argument($<arglist><EXPR>.ast))
!! self.r('Pragma').new(:$name);
$ast.ensure-begin-performed($*R, $*CU.context);
}

# proper module loading
else {
$ast := $<arglist><EXPR>
?? self.r('Statement', 'Use').new(
:module-name($<module_name>.ast),
:argument($<arglist><EXPR>.ast)
)
!! self.r('Statement', 'Use').new(
:module-name($<module_name>.ast)
);
$ast.ensure-begin-performed($*R, $*CU.context);
for $ast.IMPL-UNWRAP-LIST($ast.categoricals) {
$/.add-categorical(
$_.category, $_.opname, $_.canname, $_.subname, $_.declarand);
}
}

self.attach: $/, $ast;
}

Expand Down
3 changes: 0 additions & 3 deletions src/Raku/ast/pragma.rakumod
Expand Up @@ -72,9 +72,6 @@ class RakuAST::Pragma
nqp::existskey(self.KNOWN-ISMS, $name)
}

# needed by BeginTime
method categoricals() { () }

method PERFORM-BEGIN(
RakuAST::Resolver $resolver,
RakuAST::IMPL::QASTContext $context
Expand Down
54 changes: 7 additions & 47 deletions src/Raku/ast/statements.rakumod
Expand Up @@ -1277,40 +1277,6 @@ class RakuAST::Statement::Control
}
}

# A no statement.
class RakuAST::Statement::No
is RakuAST::Statement
is RakuAST::BeginTime
is RakuAST::ProducesNil
{
has RakuAST::Name $.module-name;
has RakuAST::Expression $.argument;

method new(RakuAST::Name :$module-name!, RakuAST::Expression :$argument) {
my $name := $module-name.canonicalize;
if RakuAST::Pragma.IS-PRAGMA($name) {
RakuAST::Pragma.new(:$name, :$argument, :off)
}
else {
my $obj := nqp::create(self);
nqp::bindattr($obj, RakuAST::Statement::No, '$!module-name',
$module-name);
nqp::bindattr($obj, RakuAST::Statement::No, '$!argument',
$argument // RakuAST::Expression);
$obj
}
}

method PERFORM-BEGIN(RakuAST::Resolver $resolver, RakuAST::IMPL::QASTContext $context) {
nqp::die("Don't know how to 'no " ~ $!module-name.canonicalize ~ "' just yet");
}

method visit-children(Code $visitor) {
$visitor($!module-name);
self.visit-labels($visitor);
}
}

class RakuAST::Categorical {
has Str $.category;
has Str $.opname;
Expand Down Expand Up @@ -1342,19 +1308,13 @@ class RakuAST::Statement::Use
has List $!categoricals;

method new(RakuAST::Name :$module-name!, RakuAST::Expression :$argument, List :$labels) {
my $name := $module-name.canonicalize;
if RakuAST::Pragma.IS-PRAGMA($name) {
RakuAST::Pragma.new(:$name, :$argument)
}
else {
my $obj := nqp::create(self);
nqp::bindattr($obj, RakuAST::Statement::Use, '$!module-name', $module-name);
nqp::bindattr($obj, RakuAST::Statement::Use, '$!categoricals', []);
nqp::bindattr($obj, RakuAST::Statement::Use, '$!argument',
$argument // RakuAST::Expression);
$obj.set-labels($labels) if $labels;
$obj
}
my $obj := nqp::create(self);
nqp::bindattr($obj, RakuAST::Statement::Use, '$!module-name', $module-name);
nqp::bindattr($obj, RakuAST::Statement::Use, '$!categoricals', []);
nqp::bindattr($obj, RakuAST::Statement::Use, '$!argument',
$argument // RakuAST::Expression);
$obj.set-labels($labels) if $labels;
$obj
}

method categoricals() {
Expand Down
4 changes: 0 additions & 4 deletions src/core.c/RakuAST/Deparse.pm6
Expand Up @@ -1133,10 +1133,6 @@ class RakuAST::Deparse {
'$<' ~ $ast.name ~ '>=' ~ self.deparse($ast.regex)
}

multi method deparse(RakuAST::Statement::No:D $ast --> Str:D) {
self!use-no("no ", $ast)
}

#- Regex::Q --------------------------------------------------------------------

multi method deparse(RakuAST::Regex::QuantifiedAtom:D $ast --> Str:D) {
Expand Down
10 changes: 3 additions & 7 deletions t/12-rakuast/statement.rakutest
Expand Up @@ -976,11 +976,9 @@ subtest "check parsing of 'use' pragma" => {
# so we fake one here for now
my $*LANG = class { method set_pragma($,$) { } }

# no trace; 42
# use MONKEY; nqp::const::STAT_ISDIR
ast RakuAST::StatementList.new(
RakuAST::Statement::Use.new(
module-name => RakuAST::Name.from-identifier('MONKEY')
),
RakuAST::Pragma.new(:name<MONKEY>),
RakuAST::Statement::Expression.new(
expression => RakuAST::Nqp::Const.new("STAT_ISDIR")
)
Expand All @@ -1001,9 +999,7 @@ subtest "check parsing of 'no' pragma" => {

# no trace; 42
ast RakuAST::StatementList.new(
RakuAST::Statement::No.new(
module-name => RakuAST::Name.from-identifier('trace')
),
RakuAST::Pragma.new(:name<trace>, :off),
RakuAST::Statement::Expression.new(
expression => RakuAST::IntLiteral.new(42)
)
Expand Down

0 comments on commit 32a733c

Please sign in to comment.