%%%
%% Aspect Declaration
%%
%% @author Martin Bravenboer <martin.bravenboer@gmail.com>
%%%
module languages/aspectj/aspect/Declaration[Ctx JavaCtx]
imports
languages/aspectj/aspect/BodyDeclaration[Ctx]
exports
sorts AspectDec
context-free syntax
AspectDecHead AspectBody -> AspectDec {cons("AspectDec")}
(Anno[[Ctx]] | AspectMod)* "aspect" Id[[Ctx]] TypeParams[[Ctx]]? Super[[Ctx]]? Interfaces[[Ctx]]? PerClause?
-> AspectDecHead {cons("AspectDecHead")}
sorts PerClause
context-free syntax
"pertarget" "(" PointcutExpr ")" -> PerClause {cons("PerTarget")}
"perthis" "(" PointcutExpr ")" -> PerClause {cons("PerThis")}
"percflow" "(" PointcutExpr ")" -> PerClause {cons("PerCFlow")}
"percflowbelow" "(" PointcutExpr ")" -> PerClause {cons("PerCFlowBelow")}
"pertypewithin" "(" TypePattern ")" -> PerClause {cons("PerTypeWithin")}
"issingleton" -> PerClause {cons("IsSingleton")}
"issingleton" "(" ")" -> PerClause {cons("IsSingleton")}
sorts AspectBody
context-free syntax
"{" AspectBodyDec* "}" -> AspectBody {cons("AspectBody")}
%% todo: which modifiers are allowed?
sorts AspectMod
context-free syntax
ClassMod[[JavaCtx]] -> AspectMod
"privileged" -> AspectMod {cons("Privileged")}