World world = weaver.getWorld();
world.setMessageHandler(weaverOption.messageHandler);
world.setXlazyTjp(weaverOption.lazyTjp);
+ world.setXHasMemberSupportEnabled(weaverOption.hasMember);
weaver.setReweavableMode(weaverOption.reWeavable, false);
world.setXnoInline(weaverOption.noInline);
world.setBehaveInJava5Way(weaverOption.java5);//TODO should be autodetected ?
private final static String OPTION_verbose = "-verbose";
private final static String OPTION_reweavable = "-Xreweavable";
private final static String OPTION_noinline = "-Xnoinline";
+ private final static String OPTION_hasMember = "-XhasMember";
private final static String OPTION_showWeaveInfo = "-showWeaveInfo";
private final static String OPTIONVALUED_messageHandler = "-XmessageHandlerClass:";
private static final String OPTIONVALUED_Xlintfile = "-Xlintfile:";
weaverOption.reWeavable = true;
} else if (arg.equalsIgnoreCase(OPTION_showWeaveInfo)) {
weaverOption.showWeaveInfo = true;
+ } else if (arg.equalsIgnoreCase(OPTION_hasMember)) {
+ weaverOption.hasMember = true;
} else if (arg.equalsIgnoreCase(OPTION_verbose)) {
weaverOption.verbose = true;
} else if (arg.startsWith(OPTIONVALUED_messageHandler)) {
public static class WeaverOption {
boolean java5;
boolean lazyTjp;
+ boolean hasMember;
boolean noWarn;
boolean proceedOnError;
boolean verbose;
}
} else if (arg.equals("-XnoInline")) {
buildConfig.setXnoInline(true);
- } else if (arg.startsWith("-showWeaveInfo")) {
+ } else if (arg.equals("-XhasMember")) {
+ buildConfig.setXHasMemberSupport(true);
+ } else if (arg.startsWith("-showWeaveInfo")) {
buildConfig.setShowWeavingInformation(true);
} else if (arg.equals("-Xlintfile")) {
if (args.size() > nextArgIndex) {
\t-Xreweavable:compress as above, but also compress the reweaving information\n\
\t-XserializableAspects allows aspects to implement serializable\n\
\t-XnoWeave compile classes but do not weave. Deprecated, use\n\
-\t reweavable instead.\n
+\t reweavable instead.\n\
+\t-XhasMember allow hasmethod() and hasfield type patterns in\n\
+\t declare parents and declare @type\n
## options not documented above (per ..ajdt.ajc.BuildArgParser.java):
# -XincrementalFile, -XjavadocsInModel
options.xReweavable = b;
}
+ public void setXHasMemberSupport(boolean enabled) {
+ options.xHasMember = enabled;
+ }
+
+ public boolean isXHasMemberEnabled() {
+ return options.xHasMember;
+ }
+
public boolean isXreweavable() {
return options.xReweavable;
}
bcelWorld.setBehaveInJava5Way(buildConfig.getBehaveInJava5Way());
bcelWorld.setXnoInline(buildConfig.isXnoInline());
bcelWorld.setXlazyTjp(buildConfig.isXlazyTjp());
+ bcelWorld.setXHasMemberSupportEnabled(buildConfig.isXHasMemberEnabled());
BcelWeaver bcelWeaver = new BcelWeaver(bcelWorld);
state.setWorld(bcelWorld);
state.setWeaver(bcelWeaver);
public static final String OPTION_XNoInline = "org.aspectj.ajdt.core.compiler.weaver.XNoInline";
public static final String OPTION_XReweavable = "org.aspectj.ajdt.core.compiler.weaver.XReweavable";
public static final String OPTION_XReweavableCompress = "org.aspectj.ajdt.core.compiler.weaver.XReweavableCompress";
+ public static final String OPTION_XHasMember = "org.aspectj.ajdt.core.compiler.weaver.XHasMember";
// these next four not exposed by IDEs
public static final String OPTION_XDevNoAtAspectJProcessing = "org.aspectj.ajdt.core.compiler.ast.NoAtAspectJProcessing";
public boolean xNoInline = false;
public boolean xReweavable = false;
public boolean xReweavableCompress = false;
+ public boolean xHasMember = false;
public boolean showWeavingInformation = false;
// If true - autoboxing behaves differently ...
map.put(OPTION_XNoInline,this.xNoInline ? ENABLED : DISABLED);
map.put(OPTION_XReweavable,this.xReweavable ? ENABLED : DISABLED);
map.put(OPTION_XReweavableCompress,this.xReweavableCompress ? ENABLED : DISABLED);
+ map.put(OPTION_XHasMember, this.xHasMember ? ENABLED : DISABLED);
map.put(OPTION_GenerateModel,this.generateModel ? ENABLED : DISABLED);
map.put(OPTION_GenerateJavaDocsInModel,this.generateJavaDocsInModel ? ENABLED : DISABLED);
this.xReweavableCompress = false;
}
}
+ if ((optionValue = optionsMap.get(OPTION_XHasMember)) != null) {
+ if (ENABLED.equals(optionValue)) {
+ this.xHasMember = true;
+ } else if (DISABLED.equals(optionValue)) {
+ this.xHasMember = false;
+ }
+ }
if ((optionValue = optionsMap.get(OPTION_GenerateModel)) != null) {
if (ENABLED.equals(optionValue)) {
buf.append("\n\t- lazy thisJoinPoint (X option): ").append(this.xLazyThisJoinPoint ? ENABLED : DISABLED); //$NON-NLS-1$
buf.append("\n\t- generate reweavable class files (X option): ").append(this.xReweavable ? ENABLED : DISABLED); //$NON-NLS-1$
buf.append("\n\t- compress reweavable class files (X option): ").append(this.xReweavableCompress ? ENABLED : DISABLED); //$NON-NLS-1$
+ buf.append("\n\t- has member support (X option): ").append(this.xHasMember ? ENABLED : DISABLED); //$NON-NLS-1$
buf.append("\n\t- generate AJDE model: ").append(this.generateModel ? ENABLED : DISABLED); //$NON-NLS-1$
buf.append("\n\t- generate Javadocs in AJDE model: ").append(this.generateJavaDocsInModel ? ENABLED : DISABLED); //$NON-NLS-1$
myBcelWorld.setBehaveInJava5Way(options.behaveInJava5Way);
myBcelWorld.setXnoInline(options.xNoInline);
myBcelWorld.setXlazyTjp(options.xLazyThisJoinPoint);
+ myBcelWorld.setXHasMemberSupportEnabled(options.xHasMember);
setLintProperties(myBcelWorld,options);
myWeaver = new BcelWeaver(myBcelWorld);
myWeaver.setReweavableMode(options.xReweavable,options.xReweavableCompress);
public static final String CALL_DOESNT_SUPPORT_PARAMETERIZED_DECLARING_TYPES="noParameterizedDeclaringTypesInCall";
public static final String CANT_REFERENCE_POINTCUT_IN_RAW_TYPE="noRawTypePointcutReferences";
+ public static final String HAS_MEMBER_NOT_ENABLED="hasMemberNotEnabled";
+
public static String format(String key) {
return bundle.getString(key);
}
/** XlazyTjp option setting passed down to weaver */
private boolean XlazyTjp;
+ /** XhasMember option setting passed down to weaver */
+ private boolean XhasMember = false;
+
/** When behaving in a Java 5 way autoboxing is considered */
private boolean behaveInJava5Way = false;
public void setXlazyTjp(boolean b) {
XlazyTjp = b;
}
+
+ public boolean isHasMemberSupportEnabled() {
+ return XhasMember;
+ }
+
+ public void setXHasMemberSupportEnabled(boolean b) {
+ XhasMember = b;
+ }
public void setBehaveInJava5Way(boolean b) {
behaveInJava5Way = b;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+
+import org.aspectj.bridge.IMessage;
+import org.aspectj.bridge.MessageUtil;
import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.ConcreteTypeMunger;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.Member;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.VersionedDataInputStream;
+import org.aspectj.weaver.WeaverMessages;
import org.aspectj.weaver.World;
/**
return ret;
}
+ public TypePattern resolveBindings(IScope scope, Bindings bindings, boolean allowBinding, boolean requireExactType) {
+ // check that hasmember type patterns are allowed!
+ if (!scope.getWorld().isHasMemberSupportEnabled()) {
+ String msg = WeaverMessages.format(WeaverMessages.HAS_MEMBER_NOT_ENABLED,this.toString());
+ scope.message(IMessage.ERROR, this, msg);
+ }
+ return this;
+ }
+
public boolean equals(Object obj) {
if (!(obj instanceof HasMemberTypePattern)) return false;
if (this == obj) return true;
private ITokenSource tokenSource;
private ISourceContext sourceContext;
- private static final boolean HASMEMBER_PATTERNS_ENABLED = false;
/** not thread-safe, but this class is not intended to be... */
private boolean allowHasTypePatterns = false;
}
public DeclareAnnotation parseDeclareAtType() {
- if (HASMEMBER_PATTERNS_ENABLED) allowHasTypePatterns = true;
+ allowHasTypePatterns = true;
TypePattern p = parseTypePattern();
allowHasTypePatterns = false;
return new DeclareAnnotation(DeclareAnnotation.AT_TYPE,p);
* String[] typeParameters = maybeParseSimpleTypeVariableList();
*/
eat(":");
- if (HASMEMBER_PATTERNS_ENABLED) allowHasTypePatterns = true;
+ allowHasTypePatterns = true;
TypePattern p = parseTypePattern(false);
allowHasTypePatterns = false;
IToken t = tokenSource.next();
noParameterizedDeclaringTypesWithinCode=can't use parameterized type patterns for the declaring type of a withincode pointcut expression (use the raw type instead)
noParameterizedDeclaringTypesInExecution=can't use parameterized type patterns for the declaring type of an execution pointcut expression (use the raw type instead)
noParameterizedDeclaringTypesInCall=can't use parameterized type patterns for the declaring type of a call pointcut expression (use the raw type instead)
-noRawTypePointcutReferences=cannot use a raw type reference to refer to a pointcut in a generic type (use a parameterized reference instead)
\ No newline at end of file
+noRawTypePointcutReferences=cannot use a raw type reference to refer to a pointcut in a generic type (use a parameterized reference instead)
+
+hasMemberNotEnabled=the type pattern {0} can only be used when the -XhasMember option is set
\ No newline at end of file