%%%
 %% 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")}