This is not enforced by compiler (yet?), but basically data class should be final. There was a recent discussion internally if we want to support abstract data classes, so that data class could be either final or abstract. It allows for some usecases with sharing common data across a number of data classes, but we didn't decide or even investigate it thoroughly.
Any chance of splitting copy method generation out from data classes? E.g. using a ‘copy’ annotation. I almost always want a copy method but often not equality or to string.
If I want to customise equality for example I have to ditch data classes completely and painfully implement copy manually.