private Map<Parameter, ClassNode> forLoopVariableTypes = new HashMap<Parameter, ClassNode>();
private final ReturnAdder returnAdder = new ReturnAdder(new ReturnAdder.ReturnStatementListener() {
public void returnStatementAdded(final ReturnStatement returnStatement) {
if (returnStatement.getExpression().equals(ConstantExpression.NULL)) return;
ClassNode returnType = checkReturnType(returnStatement);
<BUG>if (methodNode!=null) {
ClassNode previousType = (ClassNode) methodNode.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);</BUG>
ClassNode inferred = previousType==null?returnType: lowestUpperBound(returnType, previousType);
methodNode.putNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE, inferred);
}

private Map<Parameter, ClassNode> forLoopVariableTypes = new HashMap<Parameter, ClassNode>();
private final ReturnAdder returnAdder = new ReturnAdder(new ReturnAdder.ReturnStatementListener() {
public void returnStatementAdded(final ReturnStatement returnStatement) {
if (returnStatement.getExpression().equals(ConstantExpression.NULL)) return;
ClassNode returnType = checkReturnType(returnStatement);
if (methodNode!=null) {
ClassNode mrt = methodNode.getReturnType();
if (!returnType.implementsInterface(mrt) && !returnType.isDerivedFrom(mrt)) {
returnType = mrt;
}
ClassNode previousType = (ClassNode) methodNode.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
ClassNode inferred = previousType==null?returnType: lowestUpperBound(returnType, previousType);
methodNode.putNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE, inferred);
