PrettyPrinter.h revision 4fe0c8e9c76b96e7aff21696a40dacc09d0237bc
142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===--- PrettyPrinter.h - Classes for aiding with AST printing -*- C++ -*-===//
242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//
342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//                     The LLVM Compiler Infrastructure
442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//
842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//
1042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//  This file defines the PrinterHelper interface.
1142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//
1242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
1342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
1442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#ifndef LLVM_CLANG_AST_PRETTY_PRINTER_H
1542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#define LLVM_CLANG_AST_PRETTY_PRINTER_H
1642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
17d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregornamespace llvm {
18d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  class raw_ostream;
19d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor}
2042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
2142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremeneknamespace clang {
2242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
2342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenekclass Stmt;
24d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorclass TagDecl;
25d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
2642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenekclass PrinterHelper {
2742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenekpublic:
2842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek  virtual ~PrinterHelper();
29a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek  virtual bool handledStmt(Stmt* E, llvm::raw_ostream& OS) = 0;
3042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek};
3142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
32d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor/// \brief Describes how types, statements, expressions, and
33d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor/// declarations should be printed.
34d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorstruct PrintingPolicy {
35d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \brief Create a default printing policy for C.
36d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  PrintingPolicy()
37d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    : Indentation(2), CPlusPlus(false), SuppressTypeSpecifiers(false),
384fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      SuppressTagKind(false), Dump(false), OwnedTag(0) { }
39d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
40d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \brief The number of spaces to use to indent each line.
41d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  unsigned Indentation : 8;
42d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \brief Whether we're printing C++ code (otherwise, we're
44d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// printing C code).
45d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  bool CPlusPlus : 1;
46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
47d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \brief Whether we should suppress printing of the actual type
48d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// specifiers within the type that we are printing.
49d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ///
50d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// This flag is only used when we are printing declarators beyond
51d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// the first declarator within a declaration group. For example, given:
52d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ///
53d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \code
54d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// const int *x, *y;
55d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \endcode
56d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ///
57d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// SuppressTypeSpecifiers will be false when printing the
58d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// declaration for "x", so that we will print "int *x"; it will be
59d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \c true when we print "y", so that we suppress printing the
60d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// "const int" type specifier and instead only print the "*y".
61d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  bool SuppressTypeSpecifiers : 1;
62d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
63d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \brief If we are printing a tag type, suppresses printing of the
64d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// kind of tag, e.g., "struct", "union", "enum".
65d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  bool SuppressTagKind : 1;
66d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
674fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  /// \brief True when we are "dumping" rather than "pretty-printing",
684fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  /// where dumping involves printing the internal details of the AST
694fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  /// and pretty-printing involves printing something similar to
704fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  /// source code.
714fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  bool Dump : 1;
724fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
73d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \brief If we are printing a type where the tag type (e.g., a
74d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// class or enum type) was declared or defined within the type
75d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// itself, OwnedTag will point at the declaration node owned by
76d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// this type.
77d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ///
78d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// Owned tags occur when a tag type is defined as part of the
79d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// declaration specifiers of another declarator, e.g.,
80d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ///
81d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \code
82d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// typedef struct { int x, y; } Point;
83d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// \endcode
84d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ///
85d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// Here, the anonymous struct definition is owned by the type of
86d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// Point. The actual representation uses a DeclGroup to store both
87d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  /// the RecordDecl and the TypedefDecl.
88d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  TagDecl *OwnedTag;
89d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor};
90d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
9142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek} // end namespace clang
9242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
938467583c2704e7a9691ea56939a029015f0ade0aGabor Greif#endif
94