aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2002-12-19 22:13:11 +0000
committerjhugunin <jhugunin>2002-12-19 22:13:11 +0000
commit12955353e3df181ab99a2f8c86212730cb1bcaf9 (patch)
tree960e213025e1d2e4415b8a4710996776e9f14860
parent102a6af2f228e7bbcf03864f1c95339c533fb54e (diff)
downloadaspectj-12955353e3df181ab99a2f8c86212730cb1bcaf9.tar.gz
aspectj-12955353e3df181ab99a2f8c86212730cb1bcaf9.zip
better type and visibility checking for pointcut references
-rw-r--r--weaver/src/org/aspectj/weaver/ResolvedMember.java5
-rw-r--r--weaver/src/org/aspectj/weaver/ResolvedTypeX.java6
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/ReferencePointcut.java15
3 files changed, 20 insertions, 6 deletions
diff --git a/weaver/src/org/aspectj/weaver/ResolvedMember.java b/weaver/src/org/aspectj/weaver/ResolvedMember.java
index d7e400122..f47f11279 100644
--- a/weaver/src/org/aspectj/weaver/ResolvedMember.java
+++ b/weaver/src/org/aspectj/weaver/ResolvedMember.java
@@ -161,5 +161,10 @@ public class ResolvedMember extends Member implements IHasPosition {
return Modifier.isAbstract(modifiers);
}
+ public boolean isVisible(ResolvedTypeX fromType) {
+ World world = fromType.getWorld();
+ return ResolvedTypeX.isVisible(getModifiers(), getDeclaringType().resolve(world),
+ fromType);
+ }
}
diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java
index bcfd9e02b..c0de08a5b 100644
--- a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java
+++ b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java
@@ -885,7 +885,7 @@ public abstract class ResolvedTypeX extends TypeX {
} else {
if (this instanceof BcelObjectType) return false; //XXX ignores separate comp
getWorld().getMessageHandler().handleMessage(
- MessageUtil.error("inter-type declaration from " + munger.getAspectType() +
+ MessageUtil.error("inter-type declaration from " + munger.getAspectType().getName() +
" conflicts with existing member: " + existingMember,
munger.getSourceLocation())
);
@@ -957,11 +957,11 @@ public abstract class ResolvedTypeX extends TypeX {
//System.err.println("conflict at " + m2.getSourceLocation());
getWorld().getMessageHandler().handleMessage(MessageUtil.error(
"intertype declaration from "
- + m1.getAspectType().getClassName()
+ + m1.getAspectType().getName()
+ " conflicts with intertype declaration: "
+ m2.getSignature()
+ " from "
- + m2.getAspectType().getClassName(),
+ + m2.getAspectType().getName(),
m2.getSourceLocation()));
}
diff --git a/weaver/src/org/aspectj/weaver/patterns/ReferencePointcut.java b/weaver/src/org/aspectj/weaver/patterns/ReferencePointcut.java
index d3b9d1bad..52977f2b7 100644
--- a/weaver/src/org/aspectj/weaver/patterns/ReferencePointcut.java
+++ b/weaver/src/org/aspectj/weaver/patterns/ReferencePointcut.java
@@ -142,6 +142,12 @@ public class ReferencePointcut extends Pointcut {
return;
}
+ // check visibility
+ if (!pointcutDef.isVisible(scope.getEnclosingType())) {
+ scope.message(IMessage.ERROR, this, "pointcut declaration " + pointcutDef + " is not accessible");
+ return;
+ }
+
if (Modifier.isAbstract(pointcutDef.getModifiers())) {
if (onType != null) {
scope.message(IMessage.ERROR, this,
@@ -174,7 +180,9 @@ public class ReferencePointcut extends Pointcut {
"bad parameter to pointcut reference");
return;
}
- if (!p.matchesSubtypes(parameterTypes[i])) {
+ if (!p.matchesSubtypes(parameterTypes[i]) &&
+ !p.getExactType().equals(TypeX.OBJECT))
+ {
scope.message(IMessage.ERROR, p, "incompatible type, expected " +
parameterTypes[i].getName() + " found " + p);
return;
@@ -220,7 +228,6 @@ public class ReferencePointcut extends Pointcut {
);
return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
}
- //??? error if we don't find
//System.err.println("start: " + searchStart);
ResolvedTypeX[] parameterTypes = searchStart.getWorld().resolve(pointcutDec.getParameterTypes());
@@ -231,7 +238,9 @@ public class ReferencePointcut extends Pointcut {
for (int i=0,len=arguments.size(); i < len; i++) {
TypePattern p = arguments.get(i);
//we are allowed to bind to pointcuts which use subtypes as this is type safe
- if (!p.matchesSubtypes(parameterTypes[i])) {
+ if (!p.matchesSubtypes(parameterTypes[i]) &&
+ !p.getExactType().equals(TypeX.OBJECT))
+ {
throw new BCException("illegal change to pointcut declaration: " + this);
}