public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof MatchVariableConstraint other)) return false;
    if (!super.equals(o)) return false;

    if (exprTypeWithinHierarchy != other.exprTypeWithinHierarchy) return false;
    if (formalArgTypeWithinHierarchy != other.formalArgTypeWithinHierarchy) return false;
    if (greedy != other.greedy) return false;
    if (invertExprType != other.invertExprType) return false;
    if (invertFormalType != other.invertFormalType) return false;
    if (invertReference != other.invertReference) return false;
    if (invertRegExp != other.invertRegExp) return false;
    if (maxCount != other.maxCount) return false;
    if (minCount != other.minCount) return false;
    if (partOfSearchResults != other.partOfSearchResults) return false;
    if (strictlyWithinHierarchy != other.strictlyWithinHierarchy) return false;
    if (wholeWordsOnly != other.wholeWordsOnly) return false;
    if (withinHierarchy != other.withinHierarchy) return false;
    if (!nameOfExprType.equals(other.nameOfExprType)) return false;
    if (!expressionTypes.equals(other.expressionTypes)) return false;
    if (!nameOfFormalArgType.equals(other.nameOfFormalArgType)) return false;
    if (!expectedTypes.equals(other.expectedTypes)) return false;
    if (!referenceConstraint.equals(other.referenceConstraint)) return false;
    if (!regExp.equals(other.regExp)) return false;
    if (!withinConstraint.equals(other.withinConstraint)) return false;
    if (!containsConstraint.equals(other.containsConstraint)) return false;
    if (invertWithinConstraint != other.invertWithinConstraint) return false;
    if (invertContainsConstraint != other.invertContainsConstraint) return false;
    if (!contextConstraint.equals(other.contextConstraint)) return false;
    if (additionalConstraints != null) {
       if (!additionalConstraints.equals(other.additionalConstraints)) return false;
    }
    else {
      return other.additionalConstraints == null;
    }
    return true;
  }
public boolean equals(Object o)