anchor.diff:                  typeParameters: TypeParameterDeclaration option,
                   implements: ClassImplements array option, body: ClassBody, loc) =
               printer.Print("class", ?loc=loc)
  -            printer.PrintOptional(" ", id)
  -            printer.PrintOptional(typeParameters)
  +            printer.PrintOptional(id, " ")
  +            printer.PrintOptional(typeParameters |> Option.map TypeParameterDeclaration)
               match superClass with
               | Some (Identifier(id)) when id.TypeAnnotation.IsSome ->
                   printer.Print(" extends ");
  -                printer.Print(id.TypeAnnotation.Value.TypeAnnotation)
  -            | _ -> printer.PrintOptional(" extends ", superClass)
  +                id.TypeAnnotation.Value.TypeAnnotation.Print(printer)
  +            | _ -> printer.PrintOptional(superClass, " extends ")
               // printer.PrintOptional(superTypeParameters)
               match implements with
               | Some implements when not (Array.isEmpty implements) ->
                   printer.Print(" implements ")
  -                printer.PrintArray(implements, (fun p x -> p.Print(x)), (fun p -> p.Print(", ")))
  +                printer.PrintArray(implements, (fun p x -> x.Print(p)), (fun p -> p.Print(", ")))
               | _ -> ()
               printer.Print(" ")
  -            printer.Print(body)
  +            body.Print(printer)
   
           member printer.PrintFunction(id: Identifier option, parameters: Pattern array, body: BlockStatement,
                   typeParameters: TypeParameterDeclaration option, returnType: TypeAnnotation option, loc, ?isDeclaration, ?isArrow) =
  
positive.code:     static member AsExpr(?loc): Expression = { Loc = loc } |> Undefined
  
      // TODO: Use `void 0` instead? Just remove this node?
      interface IPrintable with
          member this.Print(printer) =
              printer.Print("undefined", ?loc=this.Loc)
  
  type NullLiteral =
      { Loc: SourceLocation option }
  
negative.code:         { Test = test; Body = body; Loc = loc }
          |> WhileStatement
  
      member this.Print(printer: Printer) =
          printer.Print("while (", ?loc = this.Loc)
          this.Test.Print(printer)
          printer.Print(") ")
          this.Body.Print(printer)
  
  //type DoWhileStatement(body, test, ?loc) =
  //    inherit Statement("DoWhileStatement", ?loc = loc)
  