Browse Source

Fix for Bugzilla Bug 62073

   false ambigous binding error (introduced in 1.2rc2)
tags/V1_2_0
aclement 20 years ago
parent
commit
66818c77ef

+ 13
- 0
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/WeaverMessageHandler.java View File

@@ -49,6 +49,19 @@ public class WeaverMessageHandler implements IMessageHandler {
if (! (message.isError() || message.isWarning()) ) return sink.handleMessage(message);
// we only care about warnings and errors here...
ISourceLocation sLoc = message.getSourceLocation();
// See bug 62073. We should assert that the caller pass the correct primary source location.
// But for AJ1.2 final we will simply do less processing of the locations if that is not the
// case (By calling sink.handleMessage()) - this ensures we don't put out bogus source context info.
if (sLoc instanceof EclipseSourceLocation) {
EclipseSourceLocation esLoc = (EclipseSourceLocation)sLoc;
if (currentlyWeaving!=null && esLoc.getCompilationResult()!=null) {
if (!currentlyWeaving.equals(((EclipseSourceLocation)sLoc).getCompilationResult()))
return sink.handleMessage(message);
// throw new RuntimeException("Primary source location must match the file we are currently processing!");
}
}
CompilationResult problemSource = currentlyWeaving;
if (problemSource == null) {
// must be a problem found during completeTypeBindings phase of begin to compile

+ 13
- 0
weaver/src/org/aspectj/weaver/patterns/ArgsPointcut.java View File

@@ -18,6 +18,8 @@ import java.io.DataOutputStream;
import java.io.IOException;

import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.ISourceLocation;
import org.aspectj.bridge.Message;
import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.BetaException;
import org.aspectj.weaver.ISourceContext;
@@ -118,6 +120,17 @@ public class ArgsPointcut extends NameBindingPointcut {
if (type.matchesInstanceof(shadow.getIWorld().resolve(argType)).alwaysTrue()) {
continue;
}
} else {
BindingTypePattern btp = (BindingTypePattern)type;
// Check if we have already bound something to this formal
if (state.get(btp.getFormalIndex())!=null) {
ISourceLocation isl = getSourceLocation();
Message errorMessage = new Message(
"Ambiguous binding of type "+type.getExactType().toString()+
" using args(..) at this line. Use one args(..) per matched join point,"+"" + " see secondary source location for location of extraneous args(..)",
shadow.getSourceLocation(),true,new ISourceLocation[]{getSourceLocation()});
shadow.getIWorld().getMessageHandler().handleMessage(errorMessage);
}
}
ret = Test.makeAnd(ret,
exposeStateForVar(shadow.getArgVar(i), type, state,shadow.getIWorld()));

+ 1
- 7
weaver/src/org/aspectj/weaver/patterns/NameBindingPointcut.java View File

@@ -34,13 +34,7 @@ public abstract class NameBindingPointcut extends Pointcut {
protected Test exposeStateForVar(Var var,TypePattern type, ExposedState state, World world) {
if (type instanceof BindingTypePattern) {
BindingTypePattern b = (BindingTypePattern)type;
if (state.get(b.getFormalIndex())!=null) {
world.getMessageHandler().handleMessage(MessageUtil.error(
"Ambiguous binding of type "+type.getExactType().toString()+". Use one args(..) per matched join point",
getSourceLocation()));
} else {
state.set(b.getFormalIndex(), var);
}
state.set(b.getFormalIndex(), var);
}
TypeX myType = type.getExactType(); //should have failed earlier

Loading…
Cancel
Save