]> source.dussan.org Git - aspectj.git/commitdiff
better errors for bad named pointcut declarations and references
authorjhugunin <jhugunin>
Mon, 23 Dec 2002 22:17:50 +0000 (22:17 +0000)
committerjhugunin <jhugunin>
Mon, 23 Dec 2002 22:17:50 +0000 (22:17 +0000)
handling concrete aspect correctly for cflow fields

15 files changed:
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseObjectType.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseScope.java
weaver/src/org/aspectj/weaver/Advice.java
weaver/src/org/aspectj/weaver/Checker.java
weaver/src/org/aspectj/weaver/CrosscuttingMembers.java
weaver/src/org/aspectj/weaver/IntMap.java
weaver/src/org/aspectj/weaver/ResolvedPointcutDefinition.java
weaver/src/org/aspectj/weaver/ResolvedTypeX.java
weaver/src/org/aspectj/weaver/ShadowMunger.java
weaver/src/org/aspectj/weaver/patterns/CflowPointcut.java
weaver/src/org/aspectj/weaver/patterns/IfPointcut.java
weaver/src/org/aspectj/weaver/patterns/PerCflow.java
weaver/src/org/aspectj/weaver/patterns/PerObject.java
weaver/src/org/aspectj/weaver/patterns/Pointcut.java
weaver/src/org/aspectj/weaver/patterns/ReferencePointcut.java

index 40d3448cc958fc8d7664ed8c20bba9c86f28593c..6939d8580b852875b5bcbfa625d31cdb9bc8eec7 100644 (file)
@@ -128,31 +128,34 @@ public class EclipseObjectType extends ResolvedTypeX.Name {
        //XXX make sure this is applied to classes and interfaces
        public void checkPointcutDeclarations() {
                ResolvedMember[] pointcuts = getDeclaredPointcuts();
+               boolean sawError = false;
                for (int i=0, len=pointcuts.length; i < len; i++) {
                        if (pointcuts[i].isAbstract()) {
                                if (!this.isAspect()) {
-                                       MessageUtil.error(
-                                                       "abstract pointcut only allowed in aspect" + pointcuts[i].getName(),
-                                                       pointcuts[i].getSourceLocation());
+                                       eclipseWorld().showMessage(IMessage.ERROR,
+                                               "abstract pointcut only allowed in aspect" + pointcuts[i].getName(),
+                                               pointcuts[i].getSourceLocation(), null);
+                                       sawError = true;
                                } else if (!this.isAbstract()) {
-                                       MessageUtil.error(
-                                                       "abstract pointcut in concrete aspect" + pointcuts[i].getName(),
-                                                       pointcuts[i].getSourceLocation());
+                                       eclipseWorld().showMessage(IMessage.ERROR,
+                                               "abstract pointcut in concrete aspect" + pointcuts[i],
+                                               pointcuts[i].getSourceLocation(), null);
+                                       sawError = true;
                                }
                        }
                                
                        for (int j=i+1; j < len; j++) {
                                if (pointcuts[i].getName().equals(pointcuts[j].getName())) {
-                                       eclipseWorld().getMessageHandler().handleMessage(
-                                               MessageUtil.error(
-                                                       "duplicate pointcut name: " + pointcuts[j].getName(),
-                                                       pointcuts[j].getSourceLocation()));
+                                       eclipseWorld().showMessage(IMessage.ERROR,
+                                               "duplicate pointcut name: " + pointcuts[j].getName(),
+                                               pointcuts[i].getSourceLocation(), pointcuts[j].getSourceLocation());
+                                       sawError = true;
                                }
                        }
                }
                
                //now check all inherited pointcuts to be sure that they're handled reasonably
-               if (!isAspect()) return;
+               if (sawError || !isAspect()) return;
                
 
                
index 49fef3dc69f81266c92f969ff19af40af93c1933..1035d293257908123571d9a513b438183d6c4606 100644 (file)
@@ -144,7 +144,8 @@ public class EclipseScope implements IScope {
 
                String packageName = 
                        new String(CharOperation.concatWith(cuScope.currentPackageName, '.'));
-               if (packageName.length() > 1) {
+               //System.err.println("package: " + packageName);
+               if (packageName.length() > 0) {
                        importedPrefixesList.add(packageName + ".");
                }
                
index 4c5dcb47b08df46b05a483754da0e237ca98de26..361c4a93f76411166dbdd785c0eca419ef662bdb 100644 (file)
@@ -15,6 +15,7 @@ package org.aspectj.weaver;
 
 import java.util.*;
 
+import org.aspectj.bridge.*;
 import org.aspectj.bridge.MessageUtil;
 import org.aspectj.weaver.patterns.*;
 
@@ -85,6 +86,16 @@ public abstract class Advice extends ShadowMunger {
        
        public boolean match(Shadow shadow, World world) {
                if (super.match(shadow, world)) {
+                       if (shadow.getKind() == Shadow.ExceptionHandler) {
+                               if (kind.isAfter() || kind == AdviceKind.Around) {
+                                       world.showMessage(IMessage.WARNING,
+                                       "Only before advice is supported on handler join points (compiler limitation)", 
+                                       getSourceLocation(), shadow.getSourceLocation());
+                                       return false;
+                               }
+                       }
+                       
+                       
                if (hasExtraParameter() && kind == AdviceKind.AfterReturning) {
                        return getExtraParameterType().isConvertableFrom(shadow.getReturnType(), world);
                } else if (kind == AdviceKind.PerTargetEntry) {
@@ -93,12 +104,9 @@ public abstract class Advice extends ShadowMunger {
                        return shadow.hasThis();
                } else if (kind == AdviceKind.Around) {
                        if (shadow.getKind() == Shadow.PreInitialization) {
-                               world.getMessageHandler().handleMessage(
-                                       MessageUtil.error("Around on pre-initialization not supported in 1.1",
-                                               getSourceLocation()));
-                               world.getMessageHandler().handleMessage(
-                                       MessageUtil.error("Around on pre-initialization not supported in 1.1",
-                                               shadow.getSourceLocation()));
+                               world.showMessage(IMessage.WARNING,
+                                       "around on pre-initialization not supported (compiler limitation)", 
+                                       getSourceLocation(), shadow.getSourceLocation());
                                        return false;
                        } else {
                                if (!getSignature().getReturnType().isConvertableFrom(shadow.getReturnType(), world)) {
index eec7d05af0615392b473902c5ccb0fb3f0d30a20..4732a8671264f06ea8b624298bafc5c8088ec570 100644 (file)
@@ -30,7 +30,7 @@ public class Checker extends ShadowMunger {
        }                
 
     public ShadowMunger concretize(ResolvedTypeX fromType, World world, PerClause clause) {
-        pointcut = pointcut.concretize(fromType, 0);
+        pointcut = pointcut.concretize(fromType, 0, this);
         return this;
     }
 
index ab60e689796009cbeaa9ef774443b1b6d92d89e2..22e73efb75e452bdfb55b7ff60c9261b092b3787 100644 (file)
@@ -66,7 +66,7 @@ public class CrosscuttingMembers {
        }
        
        private void addShadowMunger(ShadowMunger m) {
-               //if (inAspect.isAbstract()) return; // we don't do mungers for abstract aspects
+               if (inAspect.isAbstract()) return; // we don't do mungers for abstract aspects
                addConcreteShadowMunger(m.concretize(inAspect, world, perClause));
        }
        
index 712a646375ebca249b8c73ac900850064fe9087a..7a12bf0f680d09912c40a5ef0259db478b5779ff 100644 (file)
@@ -18,12 +18,13 @@ import java.util.*;
 public class IntMap {
        public static final IntMap EMPTY = new IntMap(0) {
                public boolean directlyInAdvice() { return true; }
-               public Advice getEnclosingAdvice() { return null; }  //XXX possible
+               public ShadowMunger getEnclosingAdvice() { return null; }  //XXX possible
        };
        
        
        // XXX begin hack to avoid a signature refactoring in Pointcut
-       private Advice enclosingAdvice;
+       private ResolvedTypeX concreteAspect;
+       private ShadowMunger enclosingAdvice;
        private List/*ResolvedPointcutDefinition*/ enclosingDefinition = new ArrayList();
        
        public void pushEnclosingDefinition(ResolvedPointcutDefinition def) {
@@ -44,21 +45,32 @@ public class IntMap {
                return enclosingDefinition.isEmpty();
        }
        
-       public Advice getEnclosingAdvice() {
+       public ShadowMunger getEnclosingAdvice() {
                return enclosingAdvice;
        }
        
-       public void setEnclosingAdvice(Advice advice) {
+       public void setEnclosingAdvice(ShadowMunger advice) {
                this.enclosingAdvice = advice;
        }
        
        public Member getAdviceSignature() {
-               return getEnclosingAdvice().signature;
+               if (enclosingAdvice instanceof Advice) return ((Advice)enclosingAdvice).signature;
+               else return null;
+       }
+       
+
+       public ResolvedTypeX getConcreteAspect() {
+               return concreteAspect;
+       }
+
+       public void setConcreteAspect(ResolvedTypeX concreteAspect) {
+               this.concreteAspect = concreteAspect;
        }
        
        public void copyContext(IntMap bindings) {
                this.enclosingAdvice = bindings.enclosingAdvice;
                this.enclosingDefinition = bindings.enclosingDefinition;
+               this.concreteAspect = bindings.concreteAspect;
        }
        
        // XXX end hack to avoid a signature refactoring in Pointcut
@@ -131,4 +143,5 @@ public class IntMap {
     }
 
 
+
 }
index 8c38d6a99266d84f4b624ef063eac0218c22b0a6..5dfc055d82240bb41a53706e507e338cf77e24f7 100644 (file)
@@ -62,14 +62,16 @@ public class ResolvedPointcutDefinition extends ResolvedMember {
        public String toString() {
                StringBuffer buf = new StringBuffer();
                buf.append("poincut ");
+               buf.append(getDeclaringType().getName());
+               buf.append(".");
                buf.append(getName());
                buf.append("(");
                for (int i=0; i < getParameterTypes().length; i++) {
                        if (i > 0) buf.append(", ");
                        buf.append(getParameterTypes()[i].toString());
                }
-               buf.append(")");
-               buf.append(pointcut);
+               buf.append(")");
+               //buf.append(pointcut);
                
                return buf.toString();
        }
@@ -87,5 +89,4 @@ public class ResolvedPointcutDefinition extends ResolvedMember {
            new ResolvedPointcutDefinition(TypeX.OBJECT, 0, "missing", 
                                        TypeX.NONE, Pointcut.makeMatchesNothing(Pointcut.RESOLVED));
 
-
 }
index 2fa0da533cbd0ce31f6e49eb46354d77e1ea6850..a57bbd58d6b5099424801588256cdd9bffa46bc5 100644 (file)
@@ -1019,8 +1019,6 @@ public abstract class ResolvedTypeX extends TypeX {
        public List getExposedPointcuts() {
                List ret = new ArrayList();
                if (getSuperclass() != null) ret.addAll(getSuperclass().getExposedPointcuts());
-
-               
                
                for (Iterator i = Arrays.asList(getDeclaredInterfaces()).iterator(); i.hasNext(); ) {
                        ResolvedTypeX t = (ResolvedTypeX)i.next();
@@ -1032,7 +1030,7 @@ public abstract class ResolvedTypeX extends TypeX {
                        if (inherited.isAbstract()) {
                                if (!this.isAbstract()) {
                                        getWorld().showMessage(IMessage.ERROR,
-                                               "inherited abstract pointcut " + inherited + 
+                                               "inherited abstract pointcut " + inherited.getSignature() + 
                                                " is not made concrete in " + this.getName(),
                                                inherited.getSourceLocation(), this.getSourceLocation());
                                }
index 4cce6743bf1331d62727755e45c41b4cab8dcf3b..61e49286bd82a02cb20b5c78d53d8b9d9e9ebfb9 100644 (file)
@@ -84,4 +84,8 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
 
 
 
+       public Pointcut getPointcut() {
+               return pointcut;
+       }
+
 }
index 72348d45bdd68dcde72789976efddef33407f1df..39566938ddf9859f1ccd4a341cfbd29d5741ae98 100644 (file)
@@ -118,7 +118,7 @@ public class CflowPointcut extends Pointcut {
                
                Pointcut concreteEntry;
                
-               CrosscuttingMembers xcut = inAspect.crosscuttingMembers;                
+               CrosscuttingMembers xcut = bindings.getConcreteAspect().crosscuttingMembers;            
                Collection previousCflowEntries = xcut.getCflowEntries();
                
                entryBindings.pushEnclosingDefinition(CFLOW_MARKER);
@@ -140,10 +140,10 @@ public class CflowPointcut extends Pointcut {
                // add field and initializer to inAspect
                //XXX and then that info above needs to be mapped down here to help with
                //XXX getting the exposed state right
-               inAspect.crosscuttingMembers.addConcreteShadowMunger(
+               bindings.getConcreteAspect().crosscuttingMembers.addConcreteShadowMunger(
                                Advice.makeCflowEntry(world, concreteEntry, isBelow, cflowField, freeVars.length, innerCflowEntries));
                
-               inAspect.crosscuttingMembers.addTypeMunger(
+               bindings.getConcreteAspect().crosscuttingMembers.addTypeMunger(
                        world.makeCflowStackFieldAdder(cflowField));
                        
                        
index 051a2b24d8b49f67cd1974c3ee8dab64350817a0..8ef64b0a01ce8bae8507d42d7b0fdeb345f34f35 100644 (file)
@@ -125,8 +125,8 @@ public class IfPointcut extends Pointcut {
                IfPointcut ret = new IfPointcut(testMethod, extraParameterFlags);
                partiallyConcretized = ret;
                if (bindings.directlyInAdvice()) {
-                       Advice advice = bindings.getEnclosingAdvice();
-                       ret.baseArgsCount = advice.getBaseParameterCount();
+                       ShadowMunger advice = bindings.getEnclosingAdvice();
+                       ret.baseArgsCount = ((Advice)advice).getBaseParameterCount();
                        ret.residueSource = advice.getPointcut().concretize(inAspect, ret.baseArgsCount, advice);
                } else {
                        ResolvedPointcutDefinition def = bindings.peekEnclosingDefinitition();
index 35614041a09145295e5ec2db111fb814eb566d24..37610252e3a1cb634ced8d3a93874171d7816fb2 100644 (file)
@@ -65,7 +65,7 @@ public class PerCflow extends PerClause {
                CrosscuttingMembers xcut = inAspect.crosscuttingMembers;
                
                Collection previousCflowEntries = xcut.getCflowEntries();
-               Pointcut concreteEntry = entry.concretize(inAspect, IntMap.EMPTY);
+               Pointcut concreteEntry = entry.concretize(inAspect, 0, null); //IntMap.EMPTY);
                List innerCflowEntries = new ArrayList(xcut.getCflowEntries());
                innerCflowEntries.removeAll(previousCflowEntries);
                                        
index de73e706617a5e6b39194e91ae6c155ef073c8b3..167e7002c14850a10cd6da3a68eab9143a0f30ea 100644 (file)
@@ -69,7 +69,7 @@ public class PerObject extends PerClause {
                
                World world = inAspect.getWorld();
                
-               Pointcut concreteEntry = entry.concretize(inAspect, IntMap.EMPTY);
+               Pointcut concreteEntry = entry.concretize(inAspect, 0, null);
                //concreteEntry = new AndPointcut(this, concreteEntry);
                //concreteEntry.state = Pointcut.CONCRETE;
                inAspect.crosscuttingMembers.addConcreteShadowMunger(
index 99f7f6bc8b8cb1072a5b8428aae1518907991e7b..d4f86112695be27c55e8fe96818c32c920d2859b 100644 (file)
@@ -104,10 +104,11 @@ public abstract class Pointcut extends PatternNode {
        
        
        //XXX this is the signature we're moving to
-       public Pointcut concretize(ResolvedTypeX inAspect, int arity, Advice advice) {
+       public Pointcut concretize(ResolvedTypeX inAspect, int arity, ShadowMunger advice) {
                //if (state == CONCRETE) return this; //???
                IntMap map = IntMap.idMap(arity);
                map.setEnclosingAdvice(advice);
+               map.setConcreteAspect(inAspect);
                return concretize(inAspect, map);
        }
        
index 52977f2b722f264d9ac4801ecd809d5a0388e884..85c6a357336e6106140cb7c5c14eed1ea72047e2 100644 (file)
@@ -228,6 +228,14 @@ public class ReferencePointcut extends Pointcut {
                                );
                                return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
                        }
+                       
+                       if (pointcutDec.isAbstract()) {
+                               Thread.currentThread().dumpStack();
+                               searchStart.getWorld().showMessage(IMessage.ERROR,
+                                       pointcutDec + " is abstract", 
+                                       getSourceLocation(), bindings.getEnclosingAdvice().getSourceLocation());
+                               return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
+                       }
                                        
                        //System.err.println("start: " + searchStart);
                        ResolvedTypeX[] parameterTypes = searchStart.getWorld().resolve(pointcutDec.getParameterTypes());