1 //===- TokenRewriter.h - Token-based Rewriter -------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the TokenRewriter class, which is used for code 11 // transformations. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_REWRITE_CORE_TOKENREWRITER_H 16 #define LLVM_CLANG_REWRITE_CORE_TOKENREWRITER_H 17 18 #include "clang/Basic/SourceLocation.h" 19 #include "clang/Lex/Token.h" 20 #include <cassert> 21 #include <list> 22 #include <map> 23 #include <memory> 24 25 namespace clang { 26 27 class LangOptions; 28 class ScratchBuffer; 29 class SourceManager; 30 31 class TokenRewriter { 32 /// TokenList - This is the list of raw tokens that make up this file. Each 33 /// of these tokens has a unique SourceLocation, which is a FileID. 34 std::list<Token> TokenList; 35 36 /// TokenRefTy - This is the type used to refer to a token in the TokenList. 37 using TokenRefTy = std::list<Token>::iterator; 38 39 /// TokenAtLoc - This map indicates which token exists at a specific 40 /// SourceLocation. Since each token has a unique SourceLocation, this is a 41 /// one to one map. The token can return its own location directly, to map 42 /// backwards. 43 std::map<SourceLocation, TokenRefTy> TokenAtLoc; 44 45 /// ScratchBuf - This is the buffer that we create scratch tokens from. 46 std::unique_ptr<ScratchBuffer> ScratchBuf; 47 48 public: 49 /// TokenRewriter - This creates a TokenRewriter for the file with the 50 /// specified FileID. 51 TokenRewriter(FileID FID, SourceManager &SM, const LangOptions &LO); 52 53 TokenRewriter(const TokenRewriter &) = delete; 54 TokenRewriter &operator=(const TokenRewriter &) = delete; 55 ~TokenRewriter(); 56 57 using token_iterator = std::list<Token>::const_iterator; 58 token_begin()59 token_iterator token_begin() const { return TokenList.begin(); } token_end()60 token_iterator token_end() const { return TokenList.end(); } 61 62 token_iterator AddTokenBefore(token_iterator I, const char *Val); 63 AddTokenAfter(token_iterator I,const char * Val)64 token_iterator AddTokenAfter(token_iterator I, const char *Val) { 65 assert(I != token_end() && "Cannot insert after token_end()!"); 66 return AddTokenBefore(++I, Val); 67 } 68 69 private: 70 /// RemapIterator - Convert from token_iterator (a const iterator) to 71 /// TokenRefTy (a non-const iterator). 72 TokenRefTy RemapIterator(token_iterator I); 73 74 /// AddToken - Add the specified token into the Rewriter before the other 75 /// position. 76 TokenRefTy AddToken(const Token &T, TokenRefTy Where); 77 }; 78 79 } // namespace clang 80 81 #endif // LLVM_CLANG_REWRITE_CORE_TOKENREWRITER_H 82