While upgrading groovy from 2.4.18 to 3.0.4 in a project we ran into a problem: ASTNode.hashCode uses mutable properties of the object to calculate the hash.
Those object properties are not, however, used when equals() is invoked on an ASTNode instance (as of 3.0.4 ASTNode does not implement equals).
This means ASTNode violates an important part of the Object.hashCode contract and you cannot safely put ASTNode instances into collections where the hashcode is relied upon to be consistent.
Quoting the Object.hashCode javadoc:
- Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.