Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

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