anchor.diff:        (p_tmConjunction e1) @ [p_tmTuple e2]
     | _ -> [p_tmTuple e]
   
  -and p_tmTuple e = with_comment p_tmTuple' e e.range
  +and p_tmTuple e = with_comment p_tmTuple' e e.range "!5"
   
   and p_tmTuple' e = match e.tm with
     | Construct (lid, args) when is_tuple_constructor lid ->
  
positive.code:      is_fsdoc: bool} //is a standalone fsdoc
  let dummy_meta = {r = dummyRange; has_qs = false; has_attrs = false; has_fsdoc = false; is_fsdoc = false}
  
  let with_comment printer tm tmrange =
    let rec comments_before_pos acc print_pos lookahead_pos =
      match !comment_stack with
      | [] -> acc, false
      | (comment, crange) :: cs ->
        if range_before_pos crange print_pos
        then begin
          comment_stack := cs ;
          comments_before_pos (acc ^^ str comment ^^ hardline) print_pos lookahead_pos
        end
        else acc, range_before_pos crange lookahead_pos
    in
  
negative.code:   | 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
          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 () =
  