diff options
author | acolyer <acolyer> | 2005-08-09 12:56:40 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-08-09 12:56:40 +0000 |
commit | 1bae1c807ca847b71d9a0274d41309586707766e (patch) | |
tree | f2ede39a36a3bb75b23f1bb72c1ba38d208b8eff /weaver | |
parent | a0e7fbf879f45831be1ead2dcf5ff74c642d0d2b (diff) | |
download | aspectj-1bae1c807ca847b71d9a0274d41309586707766e.tar.gz aspectj-1bae1c807ca847b71d9a0274d41309586707766e.zip |
support for coercion testing
Diffstat (limited to 'weaver')
-rw-r--r-- | weaver/src/org/aspectj/weaver/BoundedReferenceType.java | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/weaver/src/org/aspectj/weaver/BoundedReferenceType.java b/weaver/src/org/aspectj/weaver/BoundedReferenceType.java index 48ec7f927..0497fccf2 100644 --- a/weaver/src/org/aspectj/weaver/BoundedReferenceType.java +++ b/weaver/src/org/aspectj/weaver/BoundedReferenceType.java @@ -71,9 +71,60 @@ public class BoundedReferenceType extends ReferenceType { return getLowerBound() != null; } - public boolean isExtends() { return isExtends; } + public boolean isExtends() { return (isExtends && !getUpperBound().getSignature().equals("Ljava/lang/Object;")); } public boolean isSuper() { return isSuper; } + public boolean alwaysMatches(ResolvedType aCandidateType) { + if (isExtends()) { + // aCandidateType must be a subtype of upperBound + return ((ReferenceType)getUpperBound()).isAssignableFrom(aCandidateType); + } else if (isSuper()) { + // aCandidateType must be a supertype of lowerBound + return aCandidateType.isAssignableFrom((ReferenceType)getLowerBound()); + } else { + return true; // straight '?' + } + } + + // this "maybe matches" that + public boolean canBeCoercedTo(ResolvedType aCandidateType) { + if (alwaysMatches(aCandidateType)) return true; + if (aCandidateType.isGenericWildcard()) { + ResolvedType myUpperBound = (ResolvedType) getUpperBound(); + ResolvedType myLowerBound = (ResolvedType) getLowerBound(); + if (isExtends()) { + if (aCandidateType.isExtends()) { + return myUpperBound.isAssignableFrom((ResolvedType)aCandidateType.getUpperBound()); + } else if (aCandidateType.isSuper()) { + return myUpperBound == aCandidateType.getLowerBound(); + } else { + return true; // it's '?' + } + } else if (isSuper()) { + if (aCandidateType.isSuper()) { + return ((ResolvedType)aCandidateType.getLowerBound()).isAssignableFrom(myLowerBound); + } else if (aCandidateType.isExtends()) { + return myLowerBound == aCandidateType.getUpperBound(); + } else { + return true; + } + } else { + return true; + } + } else { + return false; + } + } + + public String getSimpleName() { + if (!isExtends() && !isSuper()) return "?"; + if (isExtends()) { + return ("? extends " + getUpperBound().getSimpleName()); + } else { + return ("? super " + getLowerBound().getSimpleName()); + } + } + // override to include additional interface bounds... public ResolvedType[] getDeclaredInterfaces() { ResolvedType[] interfaces = super.getDeclaredInterfaces(); |