false ambigous binding error (introduced in 1.2rc2)tags/V1_2_0
@@ -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 |
@@ -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())); |
@@ -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 | |||