1243791Sdim//===--- TokenRewriter.h - Token-based Rewriter -----------------*- C++ -*-===// 2243791Sdim// 3243791Sdim// The LLVM Compiler Infrastructure 4243791Sdim// 5243791Sdim// This file is distributed under the University of Illinois Open Source 6243791Sdim// License. See LICENSE.TXT for details. 7243791Sdim// 8243791Sdim//===----------------------------------------------------------------------===// 9243791Sdim// 10243791Sdim// This file defines the TokenRewriter class, which is used for code 11243791Sdim// transformations. 12243791Sdim// 13243791Sdim//===----------------------------------------------------------------------===// 14243791Sdim 15243791Sdim#ifndef LLVM_CLANG_TOKENREWRITER_H 16243791Sdim#define LLVM_CLANG_TOKENREWRITER_H 17243791Sdim 18243791Sdim#include "clang/Basic/SourceLocation.h" 19243791Sdim#include "clang/Lex/Token.h" 20243791Sdim#include "llvm/ADT/OwningPtr.h" 21243791Sdim#include <list> 22243791Sdim#include <map> 23243791Sdim 24243791Sdimnamespace clang { 25243791Sdim class LangOptions; 26243791Sdim class ScratchBuffer; 27243791Sdim 28243791Sdim class TokenRewriter { 29243791Sdim /// TokenList - This is the list of raw tokens that make up this file. Each 30243791Sdim /// of these tokens has a unique SourceLocation, which is a FileID. 31243791Sdim std::list<Token> TokenList; 32243791Sdim 33243791Sdim /// TokenRefTy - This is the type used to refer to a token in the TokenList. 34243791Sdim typedef std::list<Token>::iterator TokenRefTy; 35243791Sdim 36243791Sdim /// TokenAtLoc - This map indicates which token exists at a specific 37243791Sdim /// SourceLocation. Since each token has a unique SourceLocation, this is a 38243791Sdim /// one to one map. The token can return its own location directly, to map 39243791Sdim /// backwards. 40243791Sdim std::map<SourceLocation, TokenRefTy> TokenAtLoc; 41243791Sdim 42243791Sdim /// ScratchBuf - This is the buffer that we create scratch tokens from. 43243791Sdim /// 44243791Sdim OwningPtr<ScratchBuffer> ScratchBuf; 45243791Sdim 46243791Sdim TokenRewriter(const TokenRewriter &) LLVM_DELETED_FUNCTION; 47243791Sdim void operator=(const TokenRewriter &) LLVM_DELETED_FUNCTION; 48243791Sdim public: 49243791Sdim /// TokenRewriter - This creates a TokenRewriter for the file with the 50243791Sdim /// specified FileID. 51243791Sdim TokenRewriter(FileID FID, SourceManager &SM, const LangOptions &LO); 52243791Sdim ~TokenRewriter(); 53243791Sdim 54243791Sdim typedef std::list<Token>::const_iterator token_iterator; 55243791Sdim token_iterator token_begin() const { return TokenList.begin(); } 56243791Sdim token_iterator token_end() const { return TokenList.end(); } 57243791Sdim 58243791Sdim 59243791Sdim token_iterator AddTokenBefore(token_iterator I, const char *Val); 60243791Sdim token_iterator AddTokenAfter(token_iterator I, const char *Val) { 61243791Sdim assert(I != token_end() && "Cannot insert after token_end()!"); 62243791Sdim return AddTokenBefore(++I, Val); 63243791Sdim } 64243791Sdim 65243791Sdim private: 66243791Sdim /// RemapIterator - Convert from token_iterator (a const iterator) to 67243791Sdim /// TokenRefTy (a non-const iterator). 68243791Sdim TokenRefTy RemapIterator(token_iterator I); 69243791Sdim 70243791Sdim /// AddToken - Add the specified token into the Rewriter before the other 71243791Sdim /// position. 72243791Sdim TokenRefTy AddToken(const Token &T, TokenRefTy Where); 73243791Sdim }; 74243791Sdim 75243791Sdim 76243791Sdim 77243791Sdim} // end namespace clang 78243791Sdim 79243791Sdim#endif 80