void CheckPairedOperators ()
{
bool has_equality_or_inequality = false;
List<Operator.OpType> found_matched = new List<Operator.OpType> ();
for (int i = 0; i < members.Count; ++i) {
var o_a = members[i] as Operator;
if (o_a == null)
continue;
var o_type = o_a.OperatorType;
if (o_type == Operator.OpType.Equality || o_type == Operator.OpType.Inequality)
has_equality_or_inequality = true;
if (found_matched.Contains (o_type))
continue;
var matching_type = o_a.GetMatchingOperator ();
if (matching_type == Operator.OpType.TOP) {
continue;
}
bool pair_found = false;
for (int ii = 0; ii < members.Count; ++ii) {
var o_b = members[ii] as Operator;
if (o_b == null || o_b.OperatorType != matching_type)
continue;
if (!TypeSpecComparer.IsEqual (o_a.ReturnType, o_b.ReturnType))
continue;
if (!TypeSpecComparer.Equals (o_a.ParameterTypes, o_b.ParameterTypes))
continue;
found_matched.Add (matching_type);
pair_found = true;
break;
}
if (!pair_found) {
Report.Error (216, o_a.Location,
"The operator `{0}' requires a matching operator `{1}' to also be defined",
o_a.GetSignatureForError (), Operator.GetName (matching_type));
}
}
if (has_equality_or_inequality) {
if (!HasEquals)
Report.Warning (660, 2, Location, "`{0}' defines operator == or operator != but does not override Object.Equals(object o)",
GetSignatureForError ());
if (!HasGetHashCode)
Report.Warning (661, 2, Location, "`{0}' defines operator == or operator != but does not override Object.GetHashCode()",
GetSignatureForError ());
}
}