// examples of a selector language // that uses two nested selector languages: // one for AspectJ-style pointcuts, // the other for type patterns. // The type pattern language uses // meta variables (e.g. ?W or ??L) // to generically talk about Java language elements // that decorate the call graph. target( A+) target( (| A ?V)) within( (| A ?V)) target( ?A+) this ( ?V) (&& (! within(?V)) target(?W) call(public R A.foo(??L))) (&& (! withincode(public R A.foo(??L))) target((& ?W V)) call(public R A.foo(??L))) call(public ?V1 ?V2.?V3(??L)) call(public ?V1 ?V2.?V3(?L)) call(public ?V1 ?V2.?V3(..)) call(?V ?V1+ ?V2.?V3(..)) call(?V (| (! ?V1) ?V7) (| ?V2+ ?V9).?V3(..)) call(?V (& (! ?V1) ?V7) (| ?V2+ (& ?V9 V11)).?V3(..)) execution(?V (& (! ?V1) ?V7) (| ?V2+ (& ?V9 V11)).?V3(..)) withincode(?V (& (! ?V1) ?V7) (| ?V2+ (& (| ?V9 V11) V45)).?V3(..)) (&& call(public ?ret ?CalledType . ?m(..)) withincode(public * ?CallingType.?CallingMeth(?? ParamTypes))) (|| call(public ?ret ?CalledType . ?m(..)) withincode(public * ?CallingType.?CallingMeth(?? ParamTypes))) call (public ?ConstrCall ?CalledType.new(..))