From: aclement Date: Wed, 15 Oct 2008 19:58:50 +0000 (+0000) Subject: 250921: xlint for missing aspect on reweave X-Git-Tag: PRE_251277 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=bef259500f620e03ee8fee4e6201cdc8a7821fab;p=aspectj.git 250921: xlint for missing aspect on reweave --- diff --git a/weaver/src/org/aspectj/weaver/Lint.java b/weaver/src/org/aspectj/weaver/Lint.java index 178995159..162c03e7e 100644 --- a/weaver/src/org/aspectj/weaver/Lint.java +++ b/weaver/src/org/aspectj/weaver/Lint.java @@ -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("",this,world); + + public Lint(World world) { + if (trace.isTraceEnabled()) + trace.enter("", this, world); this.world = world; - if (trace.isTraceEnabled()) trace.exit(""); + if (trace.isTraceEnabled()) + trace.exit(""); } - - + 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))); } } - + } diff --git a/weaver/src/org/aspectj/weaver/XlintDefault.properties b/weaver/src/org/aspectj/weaver/XlintDefault.properties index 6a735adb1..f88f24e7a 100644 --- a/weaver/src/org/aspectj/weaver/XlintDefault.properties +++ b/weaver/src/org/aspectj/weaver/XlintDefault.properties @@ -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 diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java index 86f37053f..810af0447 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java @@ -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