*/
public ShadowMunger concretize(ResolvedType fromType, World world, PerClause clause) {
// assert !fromType.isAbstract();
- Pointcut p = pointcut.concretize(fromType, signature.getArity(), this);
+ Pointcut p = pointcut.concretize(fromType, getDeclaringType(), signature.getArity(), this);
if (clause != null) {
Pointcut oldP = p;
p = new AndPointcut(clause, p);
}
public ShadowMunger concretize(ResolvedType fromType, World world, PerClause clause) {
- pointcut = pointcut.concretize(fromType, 0, this);
+ pointcut = pointcut.concretize(fromType, getDeclaringType(), 0, this);
return this;
}
// this is not extensible, oh well
if (declare instanceof DeclareErrorOrWarning) {
ShadowMunger m = new Checker((DeclareErrorOrWarning)declare);
+ m.setDeclaringType(declare.getDeclaringType());
addShadowMunger(m);
} else if (declare instanceof DeclarePrecedence) {
declareDominates.add(declare);
DeclareSoft d = (DeclareSoft)declare;
// Ordered so that during concretization we can check the related munger
ShadowMunger m = Advice.makeSoftener(world, d.getPointcut(), d.getException(),inAspect,d);
- Pointcut concretePointcut = d.getPointcut().concretize(inAspect, 0,m);
+ m.setDeclaringType(d.getDeclaringType());
+ Pointcut concretePointcut = d.getPointcut().concretize(inAspect, d.getDeclaringType(), 0,m);
m.pointcut = concretePointcut;
declareSofts.add(new DeclareSoft(d.getException(), concretePointcut));
addConcreteShadowMunger(m);
protected Collection getDeclares() {
if (parameterizedDeclares != null) return parameterizedDeclares;
+ Collection declares = null;
if (isParameterizedType()) {
Collection genericDeclares = delegate.getDeclares();
parameterizedDeclares = new ArrayList();
Declare declareStatement = (Declare) iter.next();
parameterizedDeclares.add(declareStatement.parameterizeWith(parameterizationMap));
}
- return parameterizedDeclares;
+ declares = parameterizedDeclares;
} else {
- return delegate.getDeclares();
+ declares = delegate.getDeclares();
}
+ for (Iterator iter = declares.iterator(); iter.hasNext();) {
+ Declare d = (Declare) iter.next();
+ d.setDeclaringType(this);
+ }
+ return declares;
}
protected Collection getTypeMungers() { return delegate.getTypeMungers(); }
if (this.isParameterizedType()) {
munger.setPointcut(munger.getPointcut().parameterizeWith(typeVariableMap));
}
+ munger.setDeclaringType(this);
l.add(munger);
}
}
protected ISourceContext sourceContext;
private ISourceLocation sourceLocation;
private String handle = null;
+ private ResolvedType declaringType; // the type that declared this munger.
public ShadowMunger(Pointcut pointcut, int start, int end, ISourceContext sourceContext) {
this.pointcut = pointcut;
}
-
+ /**
+ * Invoked when the shadow munger of a resolved type are processed.
+ * @param aType
+ */
+ public void setDeclaringType(ResolvedType aType) {
+ this.declaringType = aType;
+ }
+
+ public ResolvedType getDeclaringType() {
+ return this.declaringType;
+ }
+
/**
* @return a Collection of ResolvedType for all checked exceptions that
* might be thrown by this munger