PrettyPrinter.h revision 30c42404202d2e2512e51efc6066bd614cfdb5a4
11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//===--- PrettyPrinter.h - Classes for aiding with AST printing -*- C++ -*-===//
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//                     The LLVM Compiler Infrastructure
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck// This file is distributed under the University of Illinois Open Source
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck// License. See LICENSE.TXT for details.
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//===----------------------------------------------------------------------===//
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//  This file defines the PrinterHelper interface.
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck//===----------------------------------------------------------------------===//
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifndef LLVM_CLANG_AST_PRETTY_PRINTER_H
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define LLVM_CLANG_AST_PRETTY_PRINTER_H
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "clang/Basic/LangOptions.h"
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "clang/Basic/LLVM.h"
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
201176bdada62cabc6ec4b0308a930e83b679d5d36John Recknamespace clang {
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reckclass Stmt;
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reckclass TagDecl;
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reckclass LangOptions;
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reckclass PrinterHelper {
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpublic:
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  virtual ~PrinterHelper();
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  virtual bool handledStmt(Stmt* E, raw_ostream& OS) = 0;
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck};
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/// \brief Describes how types, statements, expressions, and
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/// declarations should be printed.
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstruct PrintingPolicy {
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Create a default printing policy for C.
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  PrintingPolicy(const LangOptions &LO)
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    : Indentation(2), LangOpts(LO), SuppressSpecifiers(false),
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck      SuppressTagKeyword(false), SuppressTag(false), SuppressScope(false),
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck      SuppressInitializers(false),
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck      Dump(false), ConstantArraySizeAsWritten(false),
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck      AnonymousTagLocations(true), SuppressStrongLifetime(false),
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck      Bool(LO.Bool) { }
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief The number of spaces to use to indent each line.
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  unsigned Indentation : 8;
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief What language we're printing.
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  const LangOptions LangOpts;
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Whether we should suppress printing of the actual specifiers for
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// the given type or declaration.
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// This flag is only used when we are printing declarators beyond
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// the first declarator within a declaration group. For example, given:
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \code
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// const int *x, *y;
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \endcode
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// SuppressSpecifiers will be false when printing the
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// declaration for "x", so that we will print "int *x"; it will be
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \c true when we print "y", so that we suppress printing the
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// "const int" type specifier and instead only print the "*y".
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool SuppressSpecifiers : 1;
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Whether type printing should skip printing the tag keyword.
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// This is used when printing the inner type of elaborated types,
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// (as the tag keyword is part of the elaborated type):
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \code
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// struct Geometry::Point;
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \endcode
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool SuppressTagKeyword : 1;
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Whether type printing should skip printing the actual tag type.
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// This is used when the caller needs to print a tag definition in front
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// of the type, as in constructs like the following:
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \code
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// typedef struct { int x, y; } Point;
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \endcode
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool SuppressTag : 1;
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Suppresses printing of scope specifiers.
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool SuppressScope : 1;
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Suppress printing of variable initializers.
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// This flag is used when printing the loop variable in a for-range
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// statement. For example, given:
931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \code
951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// for (auto x : coll)
961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \endcode
971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// SuppressInitializers will be true when printing "auto x", so that the
991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// internal initializer constructed for x will not be printed.
1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool SuppressInitializers : 1;
1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief True when we are "dumping" rather than "pretty-printing",
1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// where dumping involves printing the internal details of the AST
1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// and pretty-printing involves printing something similar to
1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// source code.
1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool Dump : 1;
1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Whether we should print the sizes of constant array expressions
1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// as written in the sources.
1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// This flag is determines whether arrays types declared as
1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \code
1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// int a[4+10*10];
1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// char a[] = "A string";
1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \endcode
1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// will be printed as written or as follows:
1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  ///
1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \code
1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// int a[104];
1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// char a[9] = "A string";
1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \endcode
1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool ConstantArraySizeAsWritten : 1;
1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief When printing an anonymous tag name, also print the location of
1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// that entity (e.g., "enum <anonymous at t.h:10:5>"). Otherwise, just
1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// prints "<anonymous>" for the name.
1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  bool AnonymousTagLocations : 1;
1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief When true, suppress printing of the __strong lifetime qualifier in
1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// ARC.
1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  unsigned SuppressStrongLifetime : 1;
1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// \brief Whether we can use 'bool' rather than '_Bool', even if the language
1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  /// doesn't actually have 'bool' (because, e.g., it is defined as a macro).
1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck  unsigned Bool : 1;
1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck};
1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} // end namespace clang
1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck