anchor.diff:    | TyconVariant (lid, bs, typ_opt, ct_decls) ->
       let p_constructorBranchAndComments (uid, t_opt, doc_opt, use_of) =
           let range = extend_to_end_of_line (dflt uid.idRange (map_opt t_opt (fun t -> t.range))) in
  -        with_comment p_constructorBranch (uid, t_opt, doc_opt, use_of) range
  +        let comm, ctor = with_comment_tuple p_constructorBranch (uid, t_opt, doc_opt, use_of) range "!2" in
  +        if comm = empty then
  +          ctor
  +        else
  +          group <| ifflat (group (ctor ^^ break1 ^^ comm)) (comm ^^ hardline ^^ ctor)
       in
       (* Beware of side effects with comments printing *)
       let datacon_doc () =
  
positive.code:       (p_tmConjunction e1) @ [p_tmTuple e2]
    | _ -> [p_tmTuple e]
  
  and p_tmTuple e = with_comment p_tmTuple' e e.range
  
  and p_tmTuple' e = match e.tm with
    | Construct (lid, args) when is_tuple_constructor lid ->
  
negative.code:     p_typeDeclPrefix pre true lid bs typ_opt, f
    | TyconRecord (lid, bs, typ_opt, record_field_decls) ->
      let p_recordFieldAndComments ps (lid, t, doc_opt) =
        with_comment (p_recordFieldDecl ps) (lid, t, doc_opt) (extend_to_end_of_line t.range) "!1"
      in
      let p_fields () =
          space ^^ braces_with_nesting (
  