anchor.diff:  class MethodConstraint extends Constraint {
     Name method;
     AbstractType object;
  -  List<AbstractType> normalParameterTypes;
  -  List<AbstractType> optionalParameterTypes;
  -  Map<Name, AbstractType> namedParameterTypes;
  -  AbstractType returnType;
  +  List<SimpleType> normalParameterTypes;
  +  List<SimpleType> optionalParameterTypes;
  +  Map<Name, SimpleType> namedParameterTypes;
  +  SimpleType returnType;
     
     MethodConstraint(AbstractType this.object, this.method, List<SimpleType> this.normalParameterTypes, this.returnType, [List<SimpleType> optionalParameterTypes = null, Map<Name, SimpleType> namedParameterTypes = null ] ) :
  -    this.optionalParameterTypes = (optionalParameterTypes == null ? <AbstractType>[] : optionalParameterTypes),
  -    this.namedParameterTypes = (namedParameterTypes == null ? <Name, AbstractType>{} : namedParameterTypes);
  +    this.optionalParameterTypes = (optionalParameterTypes == null ? <SimpleType>[] : optionalParameterTypes),
  +    this.namedParameterTypes = (namedParameterTypes == null ? <Name, SimpleType>{} : namedParameterTypes);
     
     String toString() => "${object} contains method: '${method}', with return '${returnType}', normalParameters: ${normalParameterTypes}, optionalParameters: ${optionalParameterTypes}, namedParameters: ${namedParameterTypes}.";
     
  
positive.code:       substitutions[node.rightHandSide] = node.leftHandSide;
        queue.replace(node.rightHandSide, substitutions[node.rightHandSide]); 
        substitutions.replace(node.rightHandSide, substitutions[node.rightHandSide]);
      } else if (node.leftHandSide is ObjectType) {
        node.leftHandSide.union(node.rightHandSide);
      } else if (node.rightHandSide is ObjectType) {
  
negative.code:   }
  }
  
  
  abstract class Constraint {
    dynamic accept(ConstraintVisitor visitor);
  