private boolean mergeTypeDescriptors(
      AbstractClassTypeDeclarationDescr prev, AbstractClassTypeDeclarationDescr descr) {
    boolean isDef1 = isDefinition(prev);
    boolean isDef2 = isDefinition(descr);

    if (isDef1 && isDef2) {
      return false;
    }
    if (!prev.getSuperTypes().isEmpty()
        && !descr.getSuperTypes().isEmpty()
        && prev.getSuperTypes().size() != descr.getSuperTypes().size()) {
      return false;
    }

    if (prev.getSuperTypes().isEmpty()) {
      for (QualifiedName qn : descr.getSuperTypes()) {
        ((TypeDeclarationDescr) prev).addSuperType(qn);
      }
    }
    if (prev.getFields().isEmpty()) {
      for (String fieldName : descr.getFields().keySet()) {
        prev.addField(descr.getFields().get(fieldName));
      }
    }
    for (AnnotationDescr ad : descr.getAnnotations()) {
      prev.addQualifiedAnnotation(ad);
    }
    for (AnnotationDescr ad : prev.getAnnotations()) {
      if (!descr.getAnnotations().contains(ad)) {
        descr.addQualifiedAnnotation(ad);
      }
    }
    return true;
  }