Browse Source

262218: test and fix

tags/pre268419
aclement 15 years ago
parent
commit
01eb395e6e

+ 14
- 6
org.aspectj.matcher/src/org/aspectj/weaver/ConcreteTypeMunger.java View File

@@ -26,17 +26,25 @@ public abstract class ConcreteTypeMunger implements PartialOrder.PartialComparab
this.aspectType = aspectType;
}

/**
* Equivalence can be true for an EclipseTypeMunger and a BcelTypeMunger that represent the
* same transformation (just at different points in the pipeline).
*/
/**
* Equivalence can be true for an EclipseTypeMunger and a BcelTypeMunger that represent the same transformation (just at
* different points in the pipeline).
*/
public boolean equivalentTo(Object other) {
if (!(other instanceof ConcreteTypeMunger)) {
return false;
}
ConcreteTypeMunger o = (ConcreteTypeMunger) other;
return ((o.getMunger() == null) ? (getMunger() == null) : o.getMunger().equals(getMunger()))
&& ((o.getAspectType() == null) ? (getAspectType() == null) : o.getAspectType().equals(getAspectType()));
ResolvedTypeMunger otherTypeMunger = o.getMunger();
ResolvedTypeMunger thisTypeMunger = getMunger();
if (thisTypeMunger instanceof NewConstructorTypeMunger && otherTypeMunger instanceof NewConstructorTypeMunger) {
return ((otherTypeMunger == null) ? (thisTypeMunger == null) : ((NewConstructorTypeMunger) otherTypeMunger)
.equivalentTo(thisTypeMunger))
&& ((o.getAspectType() == null) ? (getAspectType() == null) : o.getAspectType().equals(getAspectType()));
} else {
return ((otherTypeMunger == null) ? (thisTypeMunger == null) : otherTypeMunger.equals(thisTypeMunger))
&& ((o.getAspectType() == null) ? (getAspectType() == null) : o.getAspectType().equals(getAspectType()));
}
}

// public abstract boolean munge(LazyClassGen gen);

+ 4
- 4
org.aspectj.matcher/src/org/aspectj/weaver/CrosscuttingMembers.java View File

@@ -52,13 +52,13 @@ public class CrosscuttingMembers {
private List lateTypeMungers = new ArrayList(0);

private Set declareParents = new HashSet();
private List declareSofts = new ArrayList(0);
private Set declareSofts = new HashSet();
private List declareDominates = new ArrayList(4);

// These are like declare parents type mungers
private Set declareAnnotationsOnType = new HashSet();
private Set declareAnnotationsOnField = new HashSet();
private Set declareAnnotationsOnMethods = new HashSet();
private Set declareAnnotationsOnMethods = new HashSet();
// declareAnnotationsOnMethods includes constructors too

private boolean shouldConcretizeIfNeeded = true;
@@ -460,7 +460,7 @@ public class CrosscuttingMembers {
Pointcut p = munger.getPointcut();
Pointcut newP = pr.rewrite(p);
if (p.m_ignoreUnboundBindingForNames.length != 0) {
// *sigh* dirty fix for dirty hacky implementation pr149305
// *sigh* dirty fix for dirty hacky implementation pr149305
newP.m_ignoreUnboundBindingForNames = p.m_ignoreUnboundBindingForNames;
}
munger.setPointcut(newP);
@@ -483,7 +483,7 @@ public class CrosscuttingMembers {
return declareParents;
}

public List getDeclareSofts() {
public Collection getDeclareSofts() {
return declareSofts;
}


+ 63
- 53
org.aspectj.matcher/src/org/aspectj/weaver/NewConstructorTypeMunger.java View File

@@ -10,7 +10,6 @@
* PARC initial implementation
* ******************************************************************/


package org.aspectj.weaver;

import java.io.DataOutputStream;
@@ -25,13 +24,8 @@ public class NewConstructorTypeMunger extends ResolvedTypeMunger {
private ResolvedMember syntheticConstructor;
private ResolvedMember explicitConstructor;


public NewConstructorTypeMunger(
ResolvedMember signature,
ResolvedMember syntheticConstructor,
ResolvedMember explicitConstructor,
Set superMethodsCalled,
List typeVariableAliases) {
public NewConstructorTypeMunger(ResolvedMember signature, ResolvedMember syntheticConstructor,
ResolvedMember explicitConstructor, Set superMethodsCalled, List typeVariableAliases) {
super(Constructor, signature);
this.syntheticConstructor = syntheticConstructor;
this.typeVariableAliases = typeVariableAliases;
@@ -39,31 +33,42 @@ public class NewConstructorTypeMunger extends ResolvedTypeMunger {
this.setSuperMethodsCalled(superMethodsCalled);

}
public boolean equals(Object other) {
if (!(other instanceof NewConstructorTypeMunger)) return false;
NewConstructorTypeMunger o = (NewConstructorTypeMunger)other;
return ((o.syntheticConstructor == null) ? (syntheticConstructor == null )
: syntheticConstructor.equals(o.syntheticConstructor))
& ((o.explicitConstructor == null) ? (explicitConstructor == null )
: explicitConstructor.equals(o.explicitConstructor));
}

private volatile int hashCode = 0;
public int hashCode() {
if (hashCode == 0) {
int result = 17;
result = 37*result + ((syntheticConstructor == null) ? 0 : syntheticConstructor.hashCode());
result = 37*result + ((explicitConstructor == null) ? 0 : explicitConstructor.hashCode());
hashCode = result;

public boolean equals(Object other) {
if (!(other instanceof NewConstructorTypeMunger))
return false;
NewConstructorTypeMunger o = (NewConstructorTypeMunger) other;
return ((syntheticConstructor == null) ? (o.syntheticConstructor == null) : syntheticConstructor
.equals(o.syntheticConstructor))
& ((explicitConstructor == null) ? (o.explicitConstructor == null) : explicitConstructor
.equals(o.explicitConstructor));
}

// pr262218 - equivalence ignores the explicit constructor since that won't have yet been set for an EclipseTypeMunger
public boolean equivalentTo(Object other) {
if (!(other instanceof NewConstructorTypeMunger))
return false;
NewConstructorTypeMunger o = (NewConstructorTypeMunger) other;
return ((syntheticConstructor == null) ? (o.syntheticConstructor == null) : syntheticConstructor
.equals(o.syntheticConstructor));
}

private volatile int hashCode = 0;

public int hashCode() {
if (hashCode == 0) {
int result = 17;
result = 37 * result + ((syntheticConstructor == null) ? 0 : syntheticConstructor.hashCode());
result = 37 * result + ((explicitConstructor == null) ? 0 : explicitConstructor.hashCode());
hashCode = result;
}
return hashCode;
}
return hashCode;
}
// doesnt seem required....
// public ResolvedMember getDispatchMethod(UnresolvedType aspectType) {
// return AjcMemberMaker.interMethodBody(signature, aspectType);
// }
// public ResolvedMember getDispatchMethod(UnresolvedType aspectType) {
// return AjcMemberMaker.interMethodBody(signature, aspectType);
// }

public void write(DataOutputStream s) throws IOException {
kind.write(s);
@@ -74,17 +79,19 @@ public class NewConstructorTypeMunger extends ResolvedTypeMunger {
writeSourceLocation(s);
writeOutTypeAliases(s);
}
public static ResolvedTypeMunger readConstructor(VersionedDataInputStream s, ISourceContext context) throws IOException {
ISourceLocation sloc = null;
ResolvedMember sig = ResolvedMemberImpl.readResolvedMember(s, context);
ResolvedMember sig = ResolvedMemberImpl.readResolvedMember(s, context);
ResolvedMember syntheticCtor = ResolvedMemberImpl.readResolvedMember(s, context);
ResolvedMember explicitCtor = ResolvedMemberImpl.readResolvedMember(s, context);
Set superMethodsCalled = readSuperMethodsCalled(s);
sloc = readSourceLocation(s);
List typeVarAliases = readInTypeAliases(s);
ResolvedTypeMunger munger = new NewConstructorTypeMunger(sig,syntheticCtor,explicitCtor,superMethodsCalled,typeVarAliases);
if (sloc!=null) munger.setSourceLocation(sloc);
ResolvedMember explicitCtor = ResolvedMemberImpl.readResolvedMember(s, context);
Set superMethodsCalled = readSuperMethodsCalled(s);
sloc = readSourceLocation(s);
List typeVarAliases = readInTypeAliases(s);
ResolvedTypeMunger munger = new NewConstructorTypeMunger(sig, syntheticCtor, explicitCtor, superMethodsCalled,
typeVarAliases);
if (sloc != null)
munger.setSourceLocation(sloc);
return munger;
}

@@ -101,29 +108,30 @@ public class NewConstructorTypeMunger extends ResolvedTypeMunger {
// reset hashCode so that its recalculated with new value
hashCode = 0;
}
public ResolvedMember getMatchingSyntheticMember(Member member, ResolvedType aspectType) {
ResolvedMember ret = getSyntheticConstructor();
if (ResolvedType.matches(ret, member)) return getSignature();
if (ResolvedType.matches(ret, member))
return getSignature();
return super.getMatchingSyntheticMember(member, aspectType);
}
public void check(World world) {
if (getSignature().getDeclaringType().resolve(world).isAspect()) {
world.showMessage(IMessage.ERROR,
WeaverMessages.format(WeaverMessages.ITD_CONS_ON_ASPECT),
getSignature().getSourceLocation(), null);
world.showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.ITD_CONS_ON_ASPECT), getSignature()
.getSourceLocation(), null);
}
}

/**
* see ResolvedTypeMunger.parameterizedFor(ResolvedType)
*/
* see ResolvedTypeMunger.parameterizedFor(ResolvedType)
*/
public ResolvedTypeMunger parameterizedFor(ResolvedType target) {
ResolvedType genericType = target;
if (target.isRawType() || target.isParameterizedType()) genericType = genericType.getGenericType();
if (target.isRawType() || target.isParameterizedType())
genericType = genericType.getGenericType();
ResolvedMember parameterizedSignature = null;
// If we are parameterizing it for a generic type, we just need to 'swap the letters' from the ones used
// If we are parameterizing it for a generic type, we just need to 'swap the letters' from the ones used
// in the original ITD declaration to the ones used in the actual target type declaration.
if (target.isGenericType()) {
TypeVariable vars[] = target.getTypeVariables();
@@ -131,12 +139,14 @@ public class NewConstructorTypeMunger extends ResolvedTypeMunger {
for (int i = 0; i < vars.length; i++) {
varRefs[i] = new UnresolvedTypeVariableReferenceType(vars[i]);
}
parameterizedSignature = getSignature().parameterizedWith(varRefs,genericType,true,typeVariableAliases);
parameterizedSignature = getSignature().parameterizedWith(varRefs, genericType, true, typeVariableAliases);
} else {
// For raw and 'normal' parameterized targets (e.g. Interface, Interface<String>)
parameterizedSignature = getSignature().parameterizedWith(target.getTypeParameters(),genericType,target.isParameterizedType(),typeVariableAliases);
// For raw and 'normal' parameterized targets (e.g. Interface, Interface<String>)
parameterizedSignature = getSignature().parameterizedWith(target.getTypeParameters(), genericType,
target.isParameterizedType(), typeVariableAliases);
}
NewConstructorTypeMunger nctm = new NewConstructorTypeMunger(parameterizedSignature,syntheticConstructor,explicitConstructor,getSuperMethodsCalled(),typeVariableAliases);
NewConstructorTypeMunger nctm = new NewConstructorTypeMunger(parameterizedSignature, syntheticConstructor,
explicitConstructor, getSuperMethodsCalled(), typeVariableAliases);
nctm.setSourceLocation(getSourceLocation());
return nctm;
}

+ 49
- 58
org.aspectj.matcher/src/org/aspectj/weaver/patterns/DeclareSoft.java View File

@@ -10,7 +10,6 @@
* PARC initial implementation
* ******************************************************************/


package org.aspectj.weaver.patterns;

import java.io.DataOutputStream;
@@ -34,20 +33,18 @@ public class DeclareSoft extends Declare {
this.exception = exception;
this.pointcut = pointcut;
}
public Object accept(PatternNodeVisitor visitor, Object data) {
return visitor.visit(this,data);
return visitor.visit(this, data);
}
public Declare parameterizeWith(Map typeVariableBindingMap,World w) {
DeclareSoft ret =
new DeclareSoft(
exception.parameterizeWith(typeVariableBindingMap,w),
pointcut.parameterizeWith(typeVariableBindingMap,w));

public Declare parameterizeWith(Map typeVariableBindingMap, World w) {
DeclareSoft ret = new DeclareSoft(exception.parameterizeWith(typeVariableBindingMap, w), pointcut.parameterizeWith(
typeVariableBindingMap, w));
ret.copyLocationFrom(this);
return ret;
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("declare soft: ");
@@ -57,22 +54,20 @@ public class DeclareSoft extends Declare {
buf.append(";");
return buf.toString();
}
public boolean equals(Object other) {
if (!(other instanceof DeclareSoft)) return false;
DeclareSoft o = (DeclareSoft)other;
return
o.pointcut.equals(pointcut) &&
o.exception.equals(exception);

public boolean equals(Object other) {
if (!(other instanceof DeclareSoft))
return false;
DeclareSoft o = (DeclareSoft) other;
return o.pointcut.equals(pointcut) && o.exception.equals(exception);
}
public int hashCode() {
int result = 19;
result = 37*result + pointcut.hashCode();
result = 37*result + exception.hashCode();
return result;
}

public int hashCode() {
int result = 19;
result = 37 * result + pointcut.hashCode();
result = 37 * result + exception.hashCode();
return result;
}

public void write(DataOutputStream s) throws IOException {
s.writeByte(Declare.SOFT);
@@ -82,10 +77,7 @@ public class DeclareSoft extends Declare {
}

public static Declare read(VersionedDataInputStream s, ISourceContext context) throws IOException {
Declare ret = new DeclareSoft(
TypePattern.read(s, context),
Pointcut.read(s, context)
);
Declare ret = new DeclareSoft(TypePattern.read(s, context), Pointcut.read(s, context));
ret.readLocation(context, s);
return ret;
}
@@ -93,44 +85,43 @@ public class DeclareSoft extends Declare {
public Pointcut getPointcut() {
return pointcut;
}
public TypePattern getException() {
return exception;
}

public void resolve(IScope scope) {
exception = exception.resolveBindings(scope, null, false, true);
ResolvedType excType = exception.getExactType().resolve(scope.getWorld());
if (!excType.isMissing()) {
if (excType.isTypeVariableReference()) {
TypeVariableReferenceType typeVariableRT = (TypeVariableReferenceType) excType;
// a declare soft in a generic abstract aspect, we need to check the upper bound
excType = typeVariableRT.getUpperBound().resolve(scope.getWorld());
}
if (!scope.getWorld().getCoreType(UnresolvedType.THROWABLE).isAssignableFrom(excType)) {
scope.getWorld().showMessage(IMessage.ERROR,
WeaverMessages.format(WeaverMessages.NOT_THROWABLE,excType.getName()),
exception.getSourceLocation(), null);
pointcut = Pointcut.makeMatchesNothing(Pointcut.RESOLVED);
return;
}
// ENH 42743 suggests that we don't soften runtime exceptions.
public void resolve(IScope scope) {
exception = exception.resolveBindings(scope, null, false, true);
ResolvedType excType = exception.getExactType().resolve(scope.getWorld());
if (!excType.isMissing()) {
if (excType.isTypeVariableReference()) {
TypeVariableReferenceType typeVariableRT = (TypeVariableReferenceType) excType;
// a declare soft in a generic abstract aspect, we need to check the upper bound
excType = typeVariableRT.getUpperBound().resolve(scope.getWorld());
}
if (!scope.getWorld().getCoreType(UnresolvedType.THROWABLE).isAssignableFrom(excType)) {
scope.getWorld()
.showMessage(IMessage.ERROR, WeaverMessages.format(WeaverMessages.NOT_THROWABLE, excType.getName()),
exception.getSourceLocation(), null);
pointcut = Pointcut.makeMatchesNothing(Pointcut.RESOLVED);
return;
}
// ENH 42743 suggests that we don't soften runtime exceptions.
if (scope.getWorld().getCoreType(UnresolvedType.RUNTIME_EXCEPTION).isAssignableFrom(excType)) {
scope.getWorld().getLint().runtimeExceptionNotSoftened.signal(
new String[]{excType.getName()},
exception.getSourceLocation(),null);
scope.getWorld().getLint().runtimeExceptionNotSoftened.signal(new String[] { excType.getName() }, exception
.getSourceLocation(), null);
pointcut = Pointcut.makeMatchesNothing(Pointcut.RESOLVED);
return;
}
}
pointcut = pointcut.resolve(scope);
}
public boolean isAdviceLike() {
return true;
}
}

pointcut = pointcut.resolve(scope);
}

public boolean isAdviceLike() {
return false;
}

public String getNameSuffix() {
return "soft";
}

Loading…
Cancel
Save