From d2d0d8436dc316f0870d6fb1b1e71bb04ab6bd87 Mon Sep 17 00:00:00 2001 From: jnthn Date: Wed, 18 Feb 2009 14:42:03 +0100 Subject: [PATCH] Support use of does inside packages. --- src/parser/actions.pm | 19 ++++++++++++++++++- src/parser/grammar.pg | 5 +++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/parser/actions.pm b/src/parser/actions.pm index 48fa15df9d8..dd1a65ebe4b 100644 --- a/src/parser/actions.pm +++ b/src/parser/actions.pm @@ -1538,10 +1538,27 @@ method package_declarator($/, $key) { $?BLOCK_OPEN := $sym; @?PKGDECL.unshift( $sym ); } - else { + elsif $key eq 'package_def' { make $( $ ); @?PKGDECL.shift(); } + elsif $key eq 'does' { + our @?BLOCK; + our $?METACLASS; + my $block := @?BLOCK[0]; + my $pkgdecl := $block; + my $typename := ~$; + unless $pkgdecl eq 'class' || $pkgdecl eq 'role' || $pkgdecl eq 'grammar' { + $/.panic("Cannot use does package declarator outside of class, role, or grammar"); + } + $block[0].push(PAST::Op.new( + :name('!meta_trait'), + $?METACLASS, + 'trait_auxiliary:does', + $typename + )); + make PAST::Stmts.new() + } } diff --git a/src/parser/grammar.pg b/src/parser/grammar.pg index 181cfd00a30..e5f6185282a 100644 --- a/src/parser/grammar.pg +++ b/src/parser/grammar.pg @@ -625,8 +625,9 @@ token named_0ary { } rule package_declarator { - $=[class|grammar|module|package|role] {*} #= open - {*} #= package_def + | $=[class|grammar|module|package|role] {*} #= open + {*} #= package_def + | 'does' {*} #= does }