summaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoracolyer <acolyer>2005-08-09 12:56:40 +0000
committeracolyer <acolyer>2005-08-09 12:56:40 +0000
commit1bae1c807ca847b71d9a0274d41309586707766e (patch)
treef2ede39a36a3bb75b23f1bb72c1ba38d208b8eff /weaver
parenta0e7fbf879f45831be1ead2dcf5ff74c642d0d2b (diff)
downloadaspectj-1bae1c807ca847b71d9a0274d41309586707766e.tar.gz
aspectj-1bae1c807ca847b71d9a0274d41309586707766e.zip
support for coercion testing
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/org/aspectj/weaver/BoundedReferenceType.java53
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();