%%%
 %% 3.3.3: Advice Declarations
 %%
 %% @author  Martin Bravenboer <martin.bravenboer@gmail.com>
 %%%
module languages/aspectj/aspect/AdviceDeclaration[Ctx]
exports
  sorts AdviceDec AdviceMod
  context-free syntax
    AdviceMod* AdviceSpec Throws[[Ctx]]? ":" PointcutExpr MethodBody[[Ctx]] -> AdviceDec {cons("AdviceDec")}

    StrictFP[[Ctx]] -> AdviceMod
    Anno[[Ctx]]     -> AdviceMod

  sorts AdviceSpec
  context-free syntax
    "before" "(" {FormalParam[[Ctx]] ","}* ")"             -> AdviceSpec {cons("Before")}
    "after"  "(" {FormalParam[[Ctx]] ","}* ")" ExitStatus? -> AdviceSpec {cons("After")}

    ResultType[[Ctx]] "around" "(" {FormalParam[[Ctx]] ","}* ")" -> AdviceSpec {cons("Around")}

    "returning"                            -> ExitStatus {cons("Returning")}
    "returning" "("                    ")" -> ExitStatus {cons("Returning")}
    "returning" "(" FormalParam[[Ctx]] ")" -> ExitStatus {cons("Returning")}

    "throwing"                             -> ExitStatus {cons("Throwing")}
    "throwing"  "("                    ")" -> ExitStatus {cons("Throwing")}
    "throwing"  "(" FormalParam[[Ctx]] ")" -> ExitStatus {cons("Throwing")}