message: Unify DeclareClass with ClassDeclaration
  These have so much in common that when they're implemented separately,
  it's easy (as the breakage fixed in the previous commit demonstrates)
  for one of them to lag behind in getting a feature the other has.
diff: @@ -1472,6 +1472,7 @@ function genericPrintNoParens(path: any, options: any, print: any) {
  case "ClassDeclaration":
  case "ClassExpression":
  + case "DeclareClass":
  if (n.declare) {
  parts.push("declare ");
  }
  @@ -1491,6 +1492,7 @@ function genericPrintNoParens(path: any, options: any, print: any) {
  }
  if (n.superClass) {
  + // ClassDeclaration and ClassExpression only
  parts.push(
  " extends ",
  path.call(print, "superClass"),
  @@ -1498,6 +1500,14 @@ function genericPrintNoParens(path: any, options: any, print: any) {
  );
  }
  + if (n.extends && n.extends.length > 0) {
  + // DeclareClass only
  + parts.push(
  + " extends ",
  + fromString(", ").join(path.map(print, "extends")),
  + );
  + }
  +
  if (n["implements"] && n["implements"].length > 0) {
  parts.push(
  " implements ",
  @@ -1507,7 +1517,11 @@ function genericPrintNoParens(path: any, options: any, print: any) {
  parts.push(" ", path.call(print, "body"));
  + if (n.type === "DeclareClass") {
  + return printFlowDeclaration(path, parts);
  + } else {
  return concat(parts);
  + }
  case "TemplateElement":
  return fromString(n.value.raw, options).lockIndentTail();
  @@ -1662,35 +1676,6 @@ function genericPrintNoParens(path: any, options: any, print: any) {
  parts.push(" ", path.call(print, "body"));
  return concat(parts);
  - case "DeclareClass":
  - parts.push("class");
  -
  - if (n.id) {
  - parts.push(" ", path.call(print, "id"));
  - }
  -
  - if (n.typeParameters) {
  - parts.push(path.call(print, "typeParameters"));
  - }
  -
  - if (n.extends && n.extends.length > 0) {
  - parts.push(
  - " extends ",
  - fromString(", ").join(path.map(print, "extends")),
  - );
  - }
  -
  - if (n["implements"] && n["implements"].length > 0) {
  - parts.push(
  - " implements ",
  - fromString(", ").join(path.map(print, "implements")),
  - );
  - }
  -
  - parts.push(" ", path.call(print, "body"));
  -
  - return printFlowDeclaration(path, parts);
  -
  case "DeclareFunction":
  return printFlowDeclaration(path, [
  "function ",
  