diff options
author | Andy Clement <aclement@pivotal.io> | 2016-02-10 15:46:53 -0800 |
---|---|---|
committer | Andy Clement <aclement@pivotal.io> | 2016-02-10 15:46:53 -0800 |
commit | b54540d9a4843a46d6c2a25f6d2e7470648ef7c7 (patch) | |
tree | 58794fe0d924374656569a115b078f05bc924ef3 /org.aspectj.ajdt.core | |
parent | 4bee355d22f5dd4bb2120ca725f0c8b9eb904976 (diff) | |
download | aspectj-b54540d9a4843a46d6c2a25f6d2e7470648ef7c7.tar.gz aspectj-b54540d9a4843a46d6c2a25f6d2e7470648ef7c7.zip |
Fix 485583: NullPointerException in org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration
Diffstat (limited to 'org.aspectj.ajdt.core')
2 files changed, 20 insertions, 15 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java index 3d9990ad1..087e87d6c 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java @@ -26,9 +26,11 @@ import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclarat import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; +import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope; import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers; import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; +import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits; import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser; @@ -89,17 +91,7 @@ public class PointcutDeclaration extends AjMethodDeclaration { // } if (Modifier.isAbstract(this.declaredModifiers)) { - if (!(typeDec instanceof AspectDeclaration)) { - // check for @Aspect - if (isAtAspectJ(typeDec)) { - // no need to check abstract class as JDT does that - } else { - typeDec.scope.problemReporter().signalError(sourceStart, sourceEnd, - "The abstract pointcut " + new String(declaredName) + " can only be defined in an aspect"); - ignoreFurtherInvestigation = true; - return; - } - } else if (!Modifier.isAbstract(typeDec.modifiers)) { + if ((typeDec instanceof AspectDeclaration) && !Modifier.isAbstract(typeDec.modifiers)) { typeDec.scope.problemReporter().signalError(sourceStart, sourceEnd, "The abstract pointcut " + new String(declaredName) + " can only be defined in an abstract aspect"); @@ -116,10 +108,9 @@ public class PointcutDeclaration extends AjMethodDeclaration { private boolean isAtAspectJ(TypeDeclaration typeDec) { if (typeDec.annotations == null) return false; - for (int i = 0; i < typeDec.annotations.length; i++) { Annotation annotation = typeDec.annotations[i]; - if ("Lorg/aspectj/lang/annotation/Aspect;".equals(new String(annotation.resolvedType.signature()))) { + if (CharOperation.equals(annotation.resolvedType.signature(),ASPECT_CHARS)) { return true; } } @@ -174,6 +165,8 @@ public class PointcutDeclaration extends AjMethodDeclaration { generateSyntheticPointcutMethod = true; // mangleSelector = false; } + + private static char[] ASPECT_CHARS = "Lorg/aspectj/lang/annotation/Aspect;".toCharArray(); public void resolve(ClassScope upperScope) { // we attempted to resolve annotations below, but that was too early, so we do it again @@ -181,6 +174,18 @@ public class PointcutDeclaration extends AjMethodDeclaration { if (binding != null) { binding.tagBits -= TagBits.AnnotationResolved; resolveAnnotations(scope, this.annotations, this.binding); + + TypeDeclaration typeDec = upperScope.referenceContext; + if (Modifier.isAbstract(this.declaredModifiers)) { + if (!(typeDec instanceof AspectDeclaration)) { + if (!isAtAspectJ(typeDec)) { + typeDec.scope.problemReporter().signalError(sourceStart, sourceEnd, + "The abstract pointcut " + new String(declaredName) + " can only be defined in an aspect"); + ignoreFurtherInvestigation = true; + return; + } + } + } } // for the rest of the resolution process, this method should do nothing, use the entry point below... } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java index dc82d4aac..174f27215 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java @@ -465,11 +465,11 @@ public class EclipseSourceType extends AbstractReferenceTypeDelegate { } if (pointcuts[i].isAbstract()) { if (!this.isAspect()) { - eclipseWorld().showMessage(IMessage.ERROR, "abstract pointcut only allowed in aspect" + pointcuts[i].getName(), + eclipseWorld().showMessage(IMessage.ERROR, "The abstract pointcut " + pointcuts[i].getName()+ " can only be defined in an aspect", pointcuts[i].getSourceLocation(), null); sawError = true; } else if (!binding.isAbstract()) { - eclipseWorld().showMessage(IMessage.ERROR, "abstract pointcut in concrete aspect" + pointcuts[i], + eclipseWorld().showMessage(IMessage.ERROR, "abstract pointcut in concrete aspect: " + pointcuts[i], pointcuts[i].getSourceLocation(), null); sawError = true; } |