1cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner//===--- TokenRewriter.h - Token-based Rewriter -----------------*- C++ -*-===// 2cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// 3cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// The LLVM Compiler Infrastructure 4cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// 5cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// This file is distributed under the University of Illinois Open Source 6cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// License. See LICENSE.TXT for details. 7cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// 8cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner//===----------------------------------------------------------------------===// 9cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// 10cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// This file defines the TokenRewriter class, which is used for code 11cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// transformations. 12cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner// 13cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner//===----------------------------------------------------------------------===// 14cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner 15cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#ifndef LLVM_CLANG_TOKENREWRITER_H 16cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#define LLVM_CLANG_TOKENREWRITER_H 17cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner 18cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#include "clang/Basic/SourceLocation.h" 193ecafe4d7d8f45da616be2ffef998c851dfb7b6bJohn McCall#include "clang/Lex/Token.h" 20cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#include <list> 21cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#include <map> 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory> 23cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner 24cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattnernamespace clang { 25cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner class LangOptions; 2699bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner class ScratchBuffer; 271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner class TokenRewriter { 29cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// TokenList - This is the list of raw tokens that make up this file. Each 30cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// of these tokens has a unique SourceLocation, which is a FileID. 31cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner std::list<Token> TokenList; 32cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner 33cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// TokenRefTy - This is the type used to refer to a token in the TokenList. 34cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner typedef std::list<Token>::iterator TokenRefTy; 351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// TokenAtLoc - This map indicates which token exists at a specific 37cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// SourceLocation. Since each token has a unique SourceLocation, this is a 38cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// one to one map. The token can return its own location directly, to map 39cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// backwards. 40cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner std::map<SourceLocation, TokenRefTy> TokenAtLoc; 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4299bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner /// ScratchBuf - This is the buffer that we create scratch tokens from. 4399bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner /// 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<ScratchBuffer> ScratchBuf; 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko TokenRewriter(const TokenRewriter &) LLVM_DELETED_FUNCTION; 47f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko void operator=(const TokenRewriter &) LLVM_DELETED_FUNCTION; 48cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner public: 49cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// TokenRewriter - This creates a TokenRewriter for the file with the 50cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// specified FileID. 512b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner TokenRewriter(FileID FID, SourceManager &SM, const LangOptions &LO); 5299bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner ~TokenRewriter(); 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner typedef std::list<Token>::const_iterator token_iterator; 55cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner token_iterator token_begin() const { return TokenList.begin(); } 56cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner token_iterator token_end() const { return TokenList.end(); } 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5999bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner token_iterator AddTokenBefore(token_iterator I, const char *Val); 6099bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner token_iterator AddTokenAfter(token_iterator I, const char *Val) { 6199bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner assert(I != token_end() && "Cannot insert after token_end()!"); 6299bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner return AddTokenBefore(++I, Val); 6399bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner } 641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner private: 6699bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner /// RemapIterator - Convert from token_iterator (a const iterator) to 6799bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner /// TokenRefTy (a non-const iterator). 6899bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner TokenRefTy RemapIterator(token_iterator I); 691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// AddToken - Add the specified token into the Rewriter before the other 71cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner /// position. 7299bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner TokenRefTy AddToken(const Token &T, TokenRefTy Where); 73cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner }; 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner} // end namespace clang 78cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner 79cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#endif 80