]> source.dussan.org Git - aspectj.git/commitdiff
250921: xlint for missing aspect on reweave PRE_251277
authoraclement <aclement>
Wed, 15 Oct 2008 19:58:50 +0000 (19:58 +0000)
committeraclement <aclement>
Wed, 15 Oct 2008 19:58:50 +0000 (19:58 +0000)
weaver/src/org/aspectj/weaver/Lint.java
weaver/src/org/aspectj/weaver/XlintDefault.properties
weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java

index 178995159d048475df07f95825e1f57f9be5f1c3..162c03e7e372cf7073259ca7b8f03b1bb2e3fc90 100644 (file)
@@ -10,7 +10,6 @@
  *     PARC     initial implementation 
  * ******************************************************************/
 
-
 package org.aspectj.weaver;
 
 import java.io.File;
@@ -31,204 +30,209 @@ import org.aspectj.weaver.tools.Trace;
 import org.aspectj.weaver.tools.TraceFactory;
 
 public class Lint {
-       /* private */ Map kinds = new HashMap();
-       /* private */ World world;
-
-       public final Kind invalidAbsoluteTypeName =
-               new Kind("invalidAbsoluteTypeName", "no match for this type name: {0}");
-
-       public final Kind invalidWildcardTypeName = 
-               new Kind("invalidWildcardTypeName", "no match for this type pattern: {0}");
-       
-       public final Kind unresolvableMember = 
-               new Kind("unresolvableMember", "can not resolve this member: {0}");
-       
-       public final Kind typeNotExposedToWeaver = 
-               new Kind("typeNotExposedToWeaver", "this affected type is not exposed to the weaver: {0}");
-               
-       public final Kind shadowNotInStructure = 
-               new Kind("shadowNotInStructure", "the shadow for this join point is not exposed in the structure model: {0}");
-
-       public final Kind unmatchedSuperTypeInCall = 
-               new Kind("unmatchedSuperTypeInCall", "does not match because declaring type is {0}, if match desired use target({1})");
-
-       public final Kind unmatchedTargetKind = 
-               new Kind("unmatchedTargetKind", "does not match because annotation {0} has @Target{1}");
-       
-       public final Kind canNotImplementLazyTjp = 
-               new Kind("canNotImplementLazyTjp", "can not implement lazyTjp on this joinpoint {0} because around advice is used");
-
-       public final Kind multipleAdviceStoppingLazyTjp = 
-               new Kind("multipleAdviceStoppingLazyTjp", "can not implement lazyTjp at joinpoint {0} because of advice conflicts, see secondary locations to find conflicting advice");
-
-       public final Kind needsSerialVersionUIDField = 
-               new Kind("needsSerialVersionUIDField", "serialVersionUID of type {0} needs to be set because of {1}");
-
-       public final Kind serialVersionUIDBroken = 
-               new Kind("brokeSerialVersionCompatibility", "serialVersionUID of type {0} is broken because of added field {1}");
-               
-       public final Kind noInterfaceCtorJoinpoint = 
-               new Kind("noInterfaceCtorJoinpoint","no interface constructor-execution join point - use {0}+ for implementing classes");
-        
-       public final Kind noJoinpointsForBridgeMethods =
-               new Kind("noJoinpointsForBridgeMethods","pointcut did not match on the method call to a bridge method.  Bridge methods are generated by the compiler and have no join points");
-       
-       public final Kind enumAsTargetForDecpIgnored =
-               new Kind("enumAsTargetForDecpIgnored","enum type {0} matches a declare parents type pattern but is being ignored");
-
-       public final Kind annotationAsTargetForDecpIgnored =
-               new Kind("annotationAsTargetForDecpIgnored","annotation type {0} matches a declare parents type pattern but is being ignored");
-       
-       public final Kind cantMatchArrayTypeOnVarargs =
-               new Kind("cantMatchArrayTypeOnVarargs","an array type as the last parameter in a signature does not match on the varargs declared method: {0}");
-       
-    public final Kind adviceDidNotMatch =
-        new Kind("adviceDidNotMatch","advice defined in {0} has not been applied");
-    
-    public final Kind invalidTargetForAnnotation =
-       new Kind("invalidTargetForAnnotation","{0} is not a valid target for annotation {1}, this annotation can only be applied to {2}");
-
-    public final Kind elementAlreadyAnnotated =
-       new Kind("elementAlreadyAnnotated","{0} - already has an annotation of type {1}, cannot add a second instance");
-       
-       public final Kind runtimeExceptionNotSoftened = 
-               new Kind("runtimeExceptionNotSoftened","{0} will not be softened as it is already a RuntimeException");
-       
-       public final Kind uncheckedArgument =
-               new Kind("uncheckedArgument","unchecked match of {0} with {1} when argument is an instance of {2} at join point {3}");
-       
-       public final Kind uncheckedAdviceConversion =
-               new Kind("uncheckedAdviceConversion","unchecked conversion when advice applied at shadow {0}, expected {1} but advice uses {2}");
-       public final Kind noGuardForLazyTjp =
-               new Kind("noGuardForLazyTjp","can not build thisJoinPoint lazily for this advice since it has no suitable guard");
-       
-       public final Kind noExplicitConstructorCall = 
-               new Kind("noExplicitConstructorCall","inter-type constructor does not contain explicit constructor call: field initializers in the target type will not be executed");
-       
-       public final Kind aspectExcludedByConfiguration = 
-               new Kind("aspectExcludedByConfiguration","aspect {0} exluded for class loader {1}");
-       
-       public final Kind unorderedAdviceAtShadow =
-               new Kind("unorderedAdviceAtShadow","at this shadow {0} no precedence is specified between advice applying from aspect {1} and aspect {2}");
-       
-       public final Kind swallowedExceptionInCatchBlock = 
-               new Kind("swallowedExceptionInCatchBlock","exception swallowed in catch block");
-       
-       public final Kind calculatingSerialVersionUID =
-               new Kind("calculatingSerialVersionUID","calculated SerialVersionUID for type {0} to be {1}");
-       
+       /* private */Map kinds = new HashMap();
+       /* private */World world;
+
+       public final Kind invalidAbsoluteTypeName = new Kind("invalidAbsoluteTypeName", "no match for this type name: {0}");
+
+       public final Kind invalidWildcardTypeName = new Kind("invalidWildcardTypeName", "no match for this type pattern: {0}");
+
+       public final Kind unresolvableMember = new Kind("unresolvableMember", "can not resolve this member: {0}");
+
+       public final Kind typeNotExposedToWeaver = new Kind("typeNotExposedToWeaver",
+                       "this affected type is not exposed to the weaver: {0}");
+
+       public final Kind shadowNotInStructure = new Kind("shadowNotInStructure",
+                       "the shadow for this join point is not exposed in the structure model: {0}");
+
+       public final Kind unmatchedSuperTypeInCall = new Kind("unmatchedSuperTypeInCall",
+                       "does not match because declaring type is {0}, if match desired use target({1})");
+
+       public final Kind unmatchedTargetKind = new Kind("unmatchedTargetKind", "does not match because annotation {0} has @Target{1}");
+
+       public final Kind canNotImplementLazyTjp = new Kind("canNotImplementLazyTjp",
+                       "can not implement lazyTjp on this joinpoint {0} because around advice is used");
+
+       public final Kind multipleAdviceStoppingLazyTjp = new Kind("multipleAdviceStoppingLazyTjp",
+                       "can not implement lazyTjp at joinpoint {0} because of advice conflicts, see secondary locations to find conflicting advice");
+
+       public final Kind needsSerialVersionUIDField = new Kind("needsSerialVersionUIDField",
+                       "serialVersionUID of type {0} needs to be set because of {1}");
+
+       public final Kind serialVersionUIDBroken = new Kind("brokeSerialVersionCompatibility",
+                       "serialVersionUID of type {0} is broken because of added field {1}");
+
+       public final Kind noInterfaceCtorJoinpoint = new Kind("noInterfaceCtorJoinpoint",
+                       "no interface constructor-execution join point - use {0}+ for implementing classes");
+
+       public final Kind noJoinpointsForBridgeMethods = new Kind(
+                       "noJoinpointsForBridgeMethods",
+                       "pointcut did not match on the method call to a bridge method.  Bridge methods are generated by the compiler and have no join points");
+
+       public final Kind enumAsTargetForDecpIgnored = new Kind("enumAsTargetForDecpIgnored",
+                       "enum type {0} matches a declare parents type pattern but is being ignored");
+
+       public final Kind annotationAsTargetForDecpIgnored = new Kind("annotationAsTargetForDecpIgnored",
+                       "annotation type {0} matches a declare parents type pattern but is being ignored");
+
+       public final Kind cantMatchArrayTypeOnVarargs = new Kind("cantMatchArrayTypeOnVarargs",
+                       "an array type as the last parameter in a signature does not match on the varargs declared method: {0}");
+
+       public final Kind adviceDidNotMatch = new Kind("adviceDidNotMatch", "advice defined in {0} has not been applied");
+
+       public final Kind invalidTargetForAnnotation = new Kind("invalidTargetForAnnotation",
+                       "{0} is not a valid target for annotation {1}, this annotation can only be applied to {2}");
+
+       public final Kind elementAlreadyAnnotated = new Kind("elementAlreadyAnnotated",
+                       "{0} - already has an annotation of type {1}, cannot add a second instance");
+
+       public final Kind runtimeExceptionNotSoftened = new Kind("runtimeExceptionNotSoftened",
+                       "{0} will not be softened as it is already a RuntimeException");
+
+       public final Kind uncheckedArgument = new Kind("uncheckedArgument",
+                       "unchecked match of {0} with {1} when argument is an instance of {2} at join point {3}");
+
+       public final Kind uncheckedAdviceConversion = new Kind("uncheckedAdviceConversion",
+                       "unchecked conversion when advice applied at shadow {0}, expected {1} but advice uses {2}");
+
+       public final Kind noGuardForLazyTjp = new Kind("noGuardForLazyTjp",
+                       "can not build thisJoinPoint lazily for this advice since it has no suitable guard");
+
+       public final Kind noExplicitConstructorCall = new Kind("noExplicitConstructorCall",
+                       "inter-type constructor does not contain explicit constructor call: field initializers in the target type will not be executed");
+
+       public final Kind aspectExcludedByConfiguration = new Kind("aspectExcludedByConfiguration",
+                       "aspect {0} exluded for class loader {1}");
+
+       public final Kind unorderedAdviceAtShadow = new Kind("unorderedAdviceAtShadow",
+                       "at this shadow {0} no precedence is specified between advice applying from aspect {1} and aspect {2}");
+
+       public final Kind swallowedExceptionInCatchBlock = new Kind("swallowedExceptionInCatchBlock",
+                       "exception swallowed in catch block");
+
+       public final Kind calculatingSerialVersionUID = new Kind("calculatingSerialVersionUID",
+                       "calculated SerialVersionUID for type {0} to be {1}");
+
        // there are a lot of messages in the cant find type family - I'm defining an umbrella lint warning that
        // allows a user to control their severity (for e.g. ltw or binary weaving)
-       public final Kind cantFindType =
-               new Kind("cantFindType","{0}");
-       
-       public final Kind cantFindTypeAffectingJoinPointMatch = new Kind("cantFindTypeAffectingJPMatch","{0}");
-       
+       public final Kind cantFindType = new Kind("cantFindType", "{0}");
+
+       public final Kind cantFindTypeAffectingJoinPointMatch = new Kind("cantFindTypeAffectingJPMatch", "{0}");
+
        public final Kind advisingSynchronizedMethods = new Kind("advisingSynchronizedMethods",
                        "advice matching the synchronized method shadow ''{0}'' will be executed outside the lock rather than inside (compiler limitation)");
 
-       public final Kind mustWeaveXmlDefinedAspects = new Kind("mustWeaveXmlDefinedAspects",
+       public final Kind mustWeaveXmlDefinedAspects = new Kind(
+                       "mustWeaveXmlDefinedAspects",
                        "XML Defined aspects must be woven in cases where cflow pointcuts are involved. Currently the include/exclude patterns exclude ''{0}''");
-       
+
+       /**
+        * Indicates an aspect could not be found when attempting reweaving.
+        */
+       public final Kind missingAspectForReweaving = new Kind("missingAspectForReweaving",
+                       "aspect {0} cannot be found when reweaving {1}");
+
        private static Trace trace = TraceFactory.getTraceFactory().getTrace(Lint.class);
-       
-    public Lint(World world) {
-       if (trace.isTraceEnabled()) trace.enter("<init>",this,world);
+
+       public Lint(World world) {
+               if (trace.isTraceEnabled())
+                       trace.enter("<init>", this, world);
                this.world = world;
-               if (trace.isTraceEnabled()) trace.exit("<init>");
+               if (trace.isTraceEnabled())
+                       trace.exit("<init>");
        }
-       
-       
+
        public void setAll(String messageKind) {
-               if (trace.isTraceEnabled()) trace.enter("setAll",this,messageKind);
+               if (trace.isTraceEnabled())
+                       trace.enter("setAll", this, messageKind);
                setAll(getMessageKind(messageKind));
-               if (trace.isTraceEnabled()) trace.exit("setAll");
+               if (trace.isTraceEnabled())
+                       trace.exit("setAll");
        }
-       
+
        private void setAll(IMessage.Kind messageKind) {
-               for (Iterator i = kinds.values().iterator(); i.hasNext(); ) {
-                       Kind kind = (Kind)i.next();
+               for (Iterator i = kinds.values().iterator(); i.hasNext();) {
+                       Kind kind = (Kind) i.next();
                        kind.setKind(messageKind);
                }
        }
-       
+
        public void setFromProperties(File file) {
-               if (trace.isTraceEnabled()) trace.enter("setFromProperties",this,file);
+               if (trace.isTraceEnabled())
+                       trace.enter("setFromProperties", this, file);
                try {
                        InputStream s = new FileInputStream(file);
                        setFromProperties(s);
                } catch (IOException ioe) {
-                       MessageUtil.error(world.getMessageHandler(),
-                                       WeaverMessages.format(WeaverMessages.XLINT_LOAD_ERROR,file.getPath(),ioe.getMessage()));
+                       MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINT_LOAD_ERROR, file.getPath(), ioe
+                                       .getMessage()));
                }
-               if (trace.isTraceEnabled()) trace.exit("setFromProperties");
+               if (trace.isTraceEnabled())
+                       trace.exit("setFromProperties");
        }
 
        public void loadDefaultProperties() {
                InputStream s = getClass().getResourceAsStream("XlintDefault.properties");
                if (s == null) {
-                       MessageUtil.warn(world.getMessageHandler(), 
-                                       WeaverMessages.format(WeaverMessages.XLINTDEFAULT_LOAD_ERROR));
+                       MessageUtil.warn(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINTDEFAULT_LOAD_ERROR));
                        return;
                }
                try {
                        setFromProperties(s);
                } catch (IOException ioe) {
-                       MessageUtil.error(world.getMessageHandler(),
-                                       WeaverMessages.format(WeaverMessages.XLINTDEFAULT_LOAD_PROBLEM,ioe.getMessage()));
+                       MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINTDEFAULT_LOAD_PROBLEM, ioe
+                                       .getMessage()));
                }
 
        }
 
-
        private void setFromProperties(InputStream s) throws IOException {
                Properties p = new Properties();
                p.load(s);
                setFromProperties(p);
        }
-       
-       
+
        public void setFromProperties(Properties properties) {
-               for (Iterator i = properties.entrySet().iterator(); i.hasNext(); ) {
-                       Map.Entry entry = (Map.Entry)i.next();
-                       Kind kind = (Kind)kinds.get(entry.getKey());
+               for (Iterator i = properties.entrySet().iterator(); i.hasNext();) {
+                       Map.Entry entry = (Map.Entry) i.next();
+                       Kind kind = (Kind) kinds.get(entry.getKey());
                        if (kind == null) {
-                               MessageUtil.error(world.getMessageHandler(),
-                                               WeaverMessages.format(WeaverMessages.XLINT_KEY_ERROR,entry.getKey()));
+                               MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINT_KEY_ERROR, entry.getKey()));
                        } else {
-                               kind.setKind(getMessageKind((String)entry.getValue()));
+                               kind.setKind(getMessageKind((String) entry.getValue()));
                        }
                }
        }
-       
+
        public Collection allKinds() {
                return kinds.values();
        }
-       
+
        public Kind getLintKind(String name) {
                return (Kind) kinds.get(name);
        }
-       
+
        // temporarily suppress the given lint messages
        public void suppressKinds(Collection lintKind) {
-               if (lintKind.isEmpty()) return;
+               if (lintKind.isEmpty())
+                       return;
                for (Iterator iter = lintKind.iterator(); iter.hasNext();) {
                        Kind k = (Kind) iter.next();
                        k.setSuppressed(true);
                }
        }
-       
+
        // remove any suppression of lint warnings in place
        public void clearAllSuppressions() {
                for (Iterator iter = kinds.values().iterator(); iter.hasNext();) {
                        Kind k = (Kind) iter.next();
                        k.setSuppressed(false);
-               }               
+               }
        }
-       
+
        public void clearSuppressions(Collection lintKind) {
-               if (lintKind.isEmpty()) return;
+               if (lintKind.isEmpty())
+                       return;
                for (Iterator iter = lintKind.iterator(); iter.hasNext();) {
                        Kind k = (Kind) iter.next();
                        k.setSuppressed(false);
@@ -236,47 +240,50 @@ public class Lint {
        }
 
        private IMessage.Kind getMessageKind(String v) {
-               if (v.equals("ignore")) return null;
-               else if (v.equals("warning")) return IMessage.WARNING;
-               else if (v.equals("error")) return IMessage.ERROR;
-               
-               MessageUtil.error(world.getMessageHandler(), 
-                               WeaverMessages.format(WeaverMessages.XLINT_VALUE_ERROR,v));
+               if (v.equals("ignore"))
+                       return null;
+               else if (v.equals("warning"))
+                       return IMessage.WARNING;
+               else if (v.equals("error"))
+                       return IMessage.ERROR;
+
+               MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINT_VALUE_ERROR, v));
                return null;
        }
 
        public Kind fromKey(String lintkey) {
-               return (Lint.Kind)kinds.get(lintkey);
+               return (Lint.Kind) kinds.get(lintkey);
        }
-       
+
        public class Kind {
-               private String name;
-               private String message;
+               private final String name;
+               private final String message;
                private IMessage.Kind kind = IMessage.WARNING;
                private boolean isSupressed = false; // by SuppressAjWarnings
+
                public Kind(String name, String message) {
                        this.name = name;
                        this.message = message;
                        kinds.put(this.name, this);
                }
-               
+
                public void setSuppressed(boolean shouldBeSuppressed) {
                        this.isSupressed = shouldBeSuppressed;
                }
-               
+
                public boolean isEnabled() {
                        return (kind != null) && !isSupressed();
                }
-               
+
                private boolean isSupressed() {
                        // can't suppress errors!
                        return isSupressed && (kind != IMessage.ERROR);
                }
-               
+
                public String getName() {
                        return name;
                }
-               
+
                public IMessage.Kind getKind() {
                        return kind;
                }
@@ -284,25 +291,25 @@ public class Lint {
                public void setKind(IMessage.Kind kind) {
                        this.kind = kind;
                }
-               
+
                public void signal(String info, ISourceLocation location) {
-                       if (kind == null) return;
-                       
-                       String text = MessageFormat.format(message, new Object[] {info} );
+                       if (kind == null)
+                               return;
+
+                       String text = MessageFormat.format(message, new Object[] { info });
                        text += " [Xlint:" + name + "]";
-                       world.getMessageHandler().handleMessage(
-                                       new LintMessage(text, kind, location,null,getLintKind(name)));
+                       world.getMessageHandler().handleMessage(new LintMessage(text, kind, location, null, getLintKind(name)));
                }
 
                public void signal(String[] infos, ISourceLocation location, ISourceLocation[] extraLocations) {
-            if (kind == null) return;
-            
-            String text = MessageFormat.format(message, (Object[])infos );
-            text += " [Xlint:" + name + "]";
-            world.getMessageHandler().handleMessage(
-                    new LintMessage(text, kind, location,extraLocations,getLintKind(name)));
+                       if (kind == null)
+                               return;
+
+                       String text = MessageFormat.format(message, (Object[]) infos);
+                       text += " [Xlint:" + name + "]";
+                       world.getMessageHandler().handleMessage(new LintMessage(text, kind, location, extraLocations, getLintKind(name)));
                }
 
        }
-       
+
 }
index 6a735adb15adb24e7254adfcd1a10ed4ee4db0cc..f88f24e7ad474c36bac8c4d54d6b302575f9b4b6 100644 (file)
@@ -42,4 +42,6 @@ unorderedAdviceAtShadow=ignore
 swallowedExceptionInCatchBlock=ignore
 calculatingSerialVersionUID=ignore
 advisingSynchronizedMethods=warning
-mustWeaveXmlDefinedAspects=warning
\ No newline at end of file
+mustWeaveXmlDefinedAspects=warning
+
+missingAspectForReweaving=error
\ No newline at end of file
index 86f37053f47a8d4357abc0cbf51bfb77c449d5b7..810af0447e866fb2144c1e05f06b619b789237df 100644 (file)
@@ -1426,8 +1426,10 @@ public class BcelWeaver {
                                                ResolvedType rtx = world.resolve(UnresolvedType.forName(requiredTypeName), true);
                                                boolean exists = !rtx.isMissing();
                                                if (!exists) {
-                                                       world.showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.MISSING_REWEAVABLE_TYPE,
-                                                                       requiredTypeName, className), classType.getSourceLocation(), null);
+                                                       world.getLint().missingAspectForReweaving.signal(new String[] { requiredTypeName, className },
+                                                                       classType.getSourceLocation(), null);
+                                                       // world.showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.MISSING_REWEAVABLE_TYPE,
+                                                       // requiredTypeName, className), classType.getSourceLocation(), null);
                                                } else {
                                                        // weaved in aspect that are not declared in aop.xml
                                                        // trigger an error for now