diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-12 05:44:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-12 05:44:03 +0000 |
commit | b6aa53b7de15838dcb5b4a5a2a478a1ac8fe1644 (patch) | |
tree | d656c0338c2f60428e42e5d05759609e8880ee1b /clang/lib/Rewrite/TokenRewriter.cpp | |
parent | 1782da2f84eb78cccb495a3251366b3bd42149ab (diff) | |
download | bcm5719-llvm-b6aa53b7de15838dcb5b4a5a2a478a1ac8fe1644.tar.gz bcm5719-llvm-b6aa53b7de15838dcb5b4a5a2a478a1ac8fe1644.zip |
start implementing a token rewriter. At this point, it just reads in a file
and lets a client iterate over it.
llvm-svn: 57407
Diffstat (limited to 'clang/lib/Rewrite/TokenRewriter.cpp')
-rw-r--r-- | clang/lib/Rewrite/TokenRewriter.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/lib/Rewrite/TokenRewriter.cpp b/clang/lib/Rewrite/TokenRewriter.cpp new file mode 100644 index 00000000000..0362bacdfc6 --- /dev/null +++ b/clang/lib/Rewrite/TokenRewriter.cpp @@ -0,0 +1,53 @@ +//===--- TokenRewriter.cpp - Token-based code rewriting interface ---------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the TokenRewriter class, which is used for code +// transformations. +// +//===----------------------------------------------------------------------===// + +#include "clang/Rewrite/TokenRewriter.h" +#include "clang/Lex/Lexer.h" +#include "clang/Basic/SourceManager.h" +using namespace clang; + +TokenRewriter::TokenRewriter(unsigned FileID, SourceManager &SM, + const LangOptions &LangOpts) { + + std::pair<const char*,const char*> File = SM.getBufferData(FileID); + + // Create a lexer to lex all the tokens of the main file in raw mode. + Lexer RawLex(SourceLocation::getFileLoc(FileID, 0), + LangOpts, File.first, File.second); + + // Return all comments and whitespace as tokens. + RawLex.SetKeepWhitespaceMode(true); + + // Lex the file, populating our datastructures. + Token RawTok; + RawLex.LexFromRawLexer(RawTok); + while (RawTok.isNot(tok::eof)) { + AddToken(RawTok, TokenList.end()); + RawLex.LexFromRawLexer(RawTok); + } + + +} + +/// AddToken - Add the specified token into the Rewriter before the other +/// position. +void TokenRewriter::AddToken(const Token &T, TokenRefTy Where) { + Where = TokenList.insert(Where, T); + + bool InsertSuccess = TokenAtLoc.insert(std::make_pair(T.getLocation(), + Where)).second; + assert(InsertSuccess && "Token location already in rewriter!"); + InsertSuccess = InsertSuccess; +} + |