methodDeclaration.scope.problemReporter().disallowedTargetForAnnotation(ajAnnotations.adviceNameAnnotation);
}
+ boolean noValueSupplied=true;
boolean containsIfPcd = false;
int[] pcLocation = new int[2];
String pointcutExpression = getStringLiteralFor("value",ajAnnotations.pointcutAnnotation,pcLocation);
ISourceContext context = new EclipseSourceContext(unit.compilationResult,pcLocation[0]);
Pointcut pc = null;//abstract
if (pointcutExpression == null || pointcutExpression.length() == 0) {
- ;//will have to ensure abstract ()V method
+ noValueSupplied=true; // matches nothing pointcut
} else {
+ noValueSupplied=false;
pc = new PatternParser(pointcutExpression,context).parsePointcut();
}
pcDecl.pointcutDesignator = (pc==null)?null:new PointcutDesignator(pc);
}
if (pcDecl.pointcutDesignator == null) {
- if (Modifier.isAbstract(methodDeclaration.modifiers)
+ if (Modifier.isAbstract(methodDeclaration.modifiers)
+ || noValueSupplied // this is a matches nothing pointcut
//those 2 checks makes sense for aop.xml concretization but NOT for regular abstraction of pointcut
//&& returnsVoid
//&& (methodDeclaration.arguments == null || methodDeclaration.arguments.length == 0)) {
) {
;//fine
} else {
- methodDeclaration.scope.problemReporter().signalError(methodDeclaration.returnType.sourceStart,
- methodDeclaration.returnType.sourceEnd,
- "Method annotated with @Pointcut() for abstract pointcut must be abstract");
+ methodDeclaration.scope.problemReporter().signalError(methodDeclaration.returnType.sourceStart,
+ methodDeclaration.returnType.sourceEnd,
+ "Method annotated with @Pointcut() for abstract pointcut must be abstract");
}
} else if (Modifier.isAbstract(methodDeclaration.modifiers)) {
methodDeclaration.scope.problemReporter().signalError(methodDeclaration.returnType.sourceStart,
return;//stop
}
} else {
- if (pointcutExpr != null) {
+ if (pointcutExpr==null || (pointcutExpr != null && isNullOrEmpty(pointcutExpr.getValue().stringifyValue()))) {
+ // the matches nothing pointcut (125475/125480) - perhaps not as cleanly supported as it could be.
+ } else {
+ if (pointcutExpr != null) {
// use a LazyResolvedPointcutDefinition so that the pointcut is resolved lazily
// since for it to be resolved, we will need other pointcuts to be registered as well
pc = parsePointcut(pointcutExpr.getValue().stringifyValue(), struct, true);
if (pc == null) return;//parse error
pc.setLocation(struct.context, -1, -1);//FIXME AVASM !! bMethod is null here..
- } else {
+ } else {
reportError("Found undefined @Pointcut on a non-abstract method", struct);
return;
- }
+ }
+ }
}
// do not resolve binding now but lazily
struct.ajAttributes.add(