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"
2099bd46c018ece10d6541a4b6bf0dbe97ad162477Chris Lattner#include "llvm/ADT/OwningPtr.h"
21cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#include <list>
22cff9cc95de367a3aea885a7f8fee304fe2707b92Chris Lattner#include <map>
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    ///
446f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith    OwningPtr<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