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