Skip to content

Commit

Permalink
Move class traits to new model
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Jul 22, 2010
1 parent 4da1598 commit 87b12f0
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Decl.pm
Expand Up @@ -244,7 +244,7 @@ use CgOp;
CgOp::wrap(CgOp::clr_string($self->name // 'ANON'))),

CgOp::proto_var($self->var . '!HOW', CgOp::letvar("how")),
((grep { $_->isa('Decl::Super') } @{ $self->body->decls }) ? () :
((grep { $_->isa('Decl::Super') } $self->body->do->local_decls) ? () :
CgOp::sink(CgOp::methodcall(CgOp::letvar("how"), "add-super",
CgOp::scopedlex("Any!HOW")))),

Expand Down
13 changes: 7 additions & 6 deletions Niecza/Actions.pm
Expand Up @@ -854,7 +854,8 @@ sub package_declarator__S_slang { my ($cl, $M) = @_;
}

sub package_declarator__S_also { my ($cl, $M) = @_;
$cl->add_decl(map { $_->{_ast} } @{ $M->{trait} });
$M->{_ast} = Op::StatementList->new(children =>
[ map { $_->{_ast}{mop} } @{ $M->{trait} }]);
}

sub termish {}
Expand Down Expand Up @@ -957,13 +958,13 @@ sub package_def { my ($cl, $M) = @_;
my $blocktype = $::PKGDECL;
my $bodyvar = $cl->gensym;

unshift @{ $::CURLEX->{'!decls'} //= [] },
map { $_->{_ast} } @{ $M->{trait} };

if (!$M->{decl}{stub}) {
my $stmts = $M->{statementlist} // $M->{blockoid};

my $cbody = $cl->sl_to_block($blocktype, $stmts->{_ast},
$stmts = Op::StatementList->new(children =>
[ (map { $_->{_ast}{mop} } @{ $M->{trait} }), $stmts->{_ast} ]);

my $cbody = $cl->sl_to_block($blocktype, $stmts,
name => $name);
$M->{_ast} = $optype->new(
name => $name,
Expand Down Expand Up @@ -992,7 +993,7 @@ sub trait_mod__S_is { my ($cl, $M) = @_;
return;
}

$M->{_ast} = Decl::Super->new(name => $trait);
$M->{_ast}{mop} = Op::Super->new(name => $trait);
}

sub trait { my ($cl, $M) = @_;
Expand Down
21 changes: 21 additions & 0 deletions Op.pm
Expand Up @@ -453,6 +453,27 @@ use CgOp;
no Moose;
}

{
package Op::Super;
use Moose;
extends 'Op';

has name => (isa => 'Str', is => 'ro');

sub local_decls {
my ($self) = @_;
Decl::Super->new(name => $self->name);
}

sub code {
my ($self, $body) = @_;
CgOp::null('Variable');
}

__PACKAGE__->meta->make_immutable;
no Moose;
}

{
package Op::SubDef;
use Moose;
Expand Down

0 comments on commit 87b12f0

Please sign in to comment.