From 87b12f0a09b9ae4b37fa6a176f51679f6395e2af Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Thu, 22 Jul 2010 00:39:23 -0700 Subject: [PATCH] Move class traits to new model --- Decl.pm | 2 +- Niecza/Actions.pm | 13 +++++++------ Op.pm | 21 +++++++++++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Decl.pm b/Decl.pm index 5b434d94..3e5b6745 100644 --- a/Decl.pm +++ b/Decl.pm @@ -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")))), diff --git a/Niecza/Actions.pm b/Niecza/Actions.pm index 0056e45f..ebcc58c5 100644 --- a/Niecza/Actions.pm +++ b/Niecza/Actions.pm @@ -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 {} @@ -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, @@ -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) = @_; diff --git a/Op.pm b/Op.pm index efc6cd54..e835d0c0 100644 --- a/Op.pm +++ b/Op.pm @@ -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;