//===- ClangASTNodesEmitter.h - Generate Clang AST node tables -*- C++ -*--===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // These tablegen backends emit Clang AST node tables // //===----------------------------------------------------------------------===// #ifndef CLANGAST_EMITTER_H #define CLANGAST_EMITTER_H #include "llvm/TableGen/TableGenBackend.h" #include "llvm/TableGen/Record.h" #include <string> #include <cctype> #include <map> namespace llvm { /// ClangASTNodesEmitter - The top-level class emits .inc files containing /// declarations of Clang statements. /// class ClangASTNodesEmitter : public TableGenBackend { // A map from a node to each of its derived nodes. typedef std::multimap<Record*, Record*> ChildMap; typedef ChildMap::const_iterator ChildIterator; RecordKeeper &Records; Record Root; const std::string &BaseSuffix; // Create a macro-ized version of a name static std::string macroName(std::string S) { for (unsigned i = 0; i < S.size(); ++i) S[i] = std::toupper(S[i]); return S; } // Return the name to be printed in the base field. Normally this is // the record's name plus the base suffix, but if it is the root node and // the suffix is non-empty, it's just the suffix. std::string baseName(Record &R) { if (&R == &Root && !BaseSuffix.empty()) return BaseSuffix; return R.getName() + BaseSuffix; } std::pair<Record *, Record *> EmitNode (const ChildMap &Tree, raw_ostream& OS, Record *Base); public: explicit ClangASTNodesEmitter(RecordKeeper &R, const std::string &N, const std::string &S) : Records(R), Root(N, SMLoc(), R), BaseSuffix(S) {} // run - Output the .inc file contents void run(raw_ostream &OS); }; /// ClangDeclContextEmitter - Emits an addendum to a .inc file to enumerate the /// clang declaration contexts. /// class ClangDeclContextEmitter : public TableGenBackend { RecordKeeper &Records; public: explicit ClangDeclContextEmitter(RecordKeeper &R) : Records(R) {} // run - Output the .inc file contents void run(raw_ostream &OS); }; } // End llvm namespace #endif