Package org.aspectj.weaver.patterns
Class Pointcut
java.lang.Object
org.aspectj.weaver.patterns.PatternNode
org.aspectj.weaver.patterns.Pointcut
- All Implemented Interfaces:
IHasPosition
,IHasSourceLocation
- Direct Known Subclasses:
AndPointcut
,CflowPointcut
,ConcreteCflowPointcut
,HandlerPointcut
,IfPointcut
,KindedPointcut
,NameBindingPointcut
,NotPointcut
,OrPointcut
,PerClause
,PointcutDesignatorHandlerBasedPointcut
,ReferencePointcut
,WithincodePointcut
,WithinPointcut
The lifecycle of Pointcuts is modeled by Pointcut.State. It has three things:
Creation -- SYMBOLIC -- then resolve(IScope) -- RESOLVED -- concretize(...) -- CONCRETE
- Author:
- Erik Hilsdale, Jim Hugunin A day in the life of a pointcut.... - AMC. ========================================== Pointcuts are created by the PatternParser, which is called by ajdt to parse a pointcut from the PseudoTokens AST node (which in turn are part of a PointcutDesignator AST node). Pointcuts are resolved by ajdt when an AdviceDeclaration or a PointcutDeclaration has its statements resolved. This happens as part of completeTypeBindings in the AjLookupEnvironment which is called after the diet parse phase of the compiler. Named pointcuts, and references to named pointcuts are instances of ReferencePointcut. At the end of the compilation process, the pointcuts are serialized (write method) into attributes in the class file. When the weaver loads the class files, it unpacks the attributes and deserializes the pointcuts (read). All aspects are added to the world, by calling addOrReplaceAspect on the crosscutting members set of the world. When aspects are added or replaced, the crosscutting members in the aspect are extracted as ShadowMungers (each holding a pointcut). The ShadowMungers are concretized, which concretizes the pointcuts. At this stage ReferencePointcuts are replaced by their declared content. During weaving, the weaver processes type by type. It first culls potentially matching ShadowMungers by calling the fastMatch method on their pointcuts. Only those that might match make it through to the next phase. At the next phase, all of the shadows within the type are created and passed to the pointcut for matching (match). When the actual munging happens, matched pointcuts are asked for their residue (findResidue) - the runtime test if any. Because of negation, findResidue may be called on pointcuts that could never match the shadow.
-
Nested Class Summary
-
Field Summary
Modifier and TypeFieldDescriptionstatic byte
static byte
static byte
static byte
static byte
static byte
static byte
static byte
static Pointcut.State
static String[]
static byte
protected boolean
static byte
static byte
static byte
static byte
protected int
String[]
ATAJ the name of the formal for which we don't want any warning when unbound since we consider them as implicitly bound. f.e.static byte
static byte
static byte
protected byte
static byte
static Pointcut.State
static Pointcut.State
static byte
static byte
static byte
static byte
Fields inherited from class org.aspectj.weaver.patterns.PatternNode
end, sourceContext, start
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
assertState(Pointcut.State state)
void
check(ISourceContext ctx, World world)
concretize(ResolvedType inAspect, ResolvedType declaringType, int arity)
Returns a new pointcut Only used by test casesconcretize(ResolvedType inAspect, ResolvedType declaringType, int arity, ShadowMunger advice)
concretize(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings)
protected abstract Pointcut
concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings)
Resolves and removes ReferencePointcuts, replacing with basic onesabstract int
The set of ShadowKinds that this Pointcut could possibly match - an int whose bits are set according to the Kinds specified in Shadow.javaabstract FuzzyBoolean
fastMatch(FastMatchInfo info)
Could I match any shadows in the code defined within this type?findResidue(Shadow shadow, ExposedState state)
This can be called from NotPointcut even for Pointcuts that don't match the shadowprotected abstract Test
findResidueInternal(Shadow shadow, ExposedState state)
static Pointcut
fromString(String str)
byte
String[]
boolean
isDeclare(ShadowMunger munger)
static Pointcut
makeMatchesNothing(Pointcut.State state)
Do I really match this shadow?protected abstract FuzzyBoolean
matchInternal(Shadow shadow)
abstract Pointcut
parameterizeWith(Map<String,UnresolvedType> typeVariableMap, World w)
void
postRead(ResolvedType enclosingType)
static Pointcut
read(VersionedDataInputStream s, ISourceContext context)
Returns this pointcut mutatedprotected abstract void
resolveBindings(IScope scope, Bindings bindings)
void
setTypeVariablesInScope(String[] typeVars)
protected boolean
Methods inherited from class org.aspectj.weaver.patterns.PatternNode
accept, copyLocationFrom, getEnd, getFileName, getSourceContext, getSourceLocation, getStart, readLocation, setLocation, traverse, write, writeLocation
-
Field Details
-
m_ignoreUnboundBindingForNames
ATAJ the name of the formal for which we don't want any warning when unbound since we consider them as implicitly bound. f.e. JoinPoint for @AJ advices -
EMPTY_STRING_ARRAY
-
SYMBOLIC
-
RESOLVED
-
CONCRETE
-
pointcutKind
protected byte pointcutKind -
state
-
lastMatchedShadowId
protected int lastMatchedShadowId -
hasBeenParameterized
protected boolean hasBeenParameterized -
KINDED
public static final byte KINDED- See Also:
- Constant Field Values
-
WITHIN
public static final byte WITHIN- See Also:
- Constant Field Values
-
THIS_OR_TARGET
public static final byte THIS_OR_TARGET- See Also:
- Constant Field Values
-
ARGS
public static final byte ARGS- See Also:
- Constant Field Values
-
AND
public static final byte AND- See Also:
- Constant Field Values
-
OR
public static final byte OR- See Also:
- Constant Field Values
-
NOT
public static final byte NOT- See Also:
- Constant Field Values
-
REFERENCE
public static final byte REFERENCE- See Also:
- Constant Field Values
-
IF
public static final byte IF- See Also:
- Constant Field Values
-
CFLOW
public static final byte CFLOW- See Also:
- Constant Field Values
-
WITHINCODE
public static final byte WITHINCODE- See Also:
- Constant Field Values
-
HANDLER
public static final byte HANDLER- See Also:
- Constant Field Values
-
IF_TRUE
public static final byte IF_TRUE- See Also:
- Constant Field Values
-
IF_FALSE
public static final byte IF_FALSE- See Also:
- Constant Field Values
-
ANNOTATION
public static final byte ANNOTATION- See Also:
- Constant Field Values
-
ATWITHIN
public static final byte ATWITHIN- See Also:
- Constant Field Values
-
ATWITHINCODE
public static final byte ATWITHINCODE- See Also:
- Constant Field Values
-
ATTHIS_OR_TARGET
public static final byte ATTHIS_OR_TARGET- See Also:
- Constant Field Values
-
NONE
public static final byte NONE- See Also:
- Constant Field Values
-
ATARGS
public static final byte ATARGS- See Also:
- Constant Field Values
-
USER_EXTENSION
public static final byte USER_EXTENSION- See Also:
- Constant Field Values
-
-
Constructor Details
-
Pointcut
public Pointcut()Constructor for Pattern.
-
-
Method Details
-
fastMatch
Could I match any shadows in the code defined within this type? -
couldMatchKinds
public abstract int couldMatchKinds()The set of ShadowKinds that this Pointcut could possibly match - an int whose bits are set according to the Kinds specified in Shadow.java -
getTypeVariablesInScope
-
setTypeVariablesInScope
-
match
Do I really match this shadow? XXX implementors need to handle state -
matchInternal
-
getPointcutKind
public byte getPointcutKind() -
resolveBindings
-
resolve
Returns this pointcut mutated -
concretize
Returns a new pointcut Only used by test cases -
concretize
public final Pointcut concretize(ResolvedType inAspect, ResolvedType declaringType, int arity, ShadowMunger advice) -
isDeclare
-
concretize
public final Pointcut concretize(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) -
shouldCopyLocationForConcretize
protected boolean shouldCopyLocationForConcretize() -
concretize1
protected abstract Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings)Resolves and removes ReferencePointcuts, replacing with basic ones- Parameters:
inAspect
- the aspect to resolve relative tobindings
- a Map from formal index in the current lexical context → formal index in the concrete advice that will run This must always return a new Pointcut object (even if the concretized Pointcut is identical to the resolved one). That behavior is assumed in many places. XXX fix implementors to handle state
-
findResidue
This can be called from NotPointcut even for Pointcuts that don't match the shadow -
findResidueInternal
-
postRead
-
read
- Throws:
IOException
-
check
-
fromString
-
makeMatchesNothing
-
assertState
-
parameterizeWith
-