boolean (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; }