From b6aa53b7de15838dcb5b4a5a2a478a1ac8fe1644 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 12 Oct 2008 05:44:03 +0000 Subject: start implementing a token rewriter. At this point, it just reads in a file and lets a client iterate over it. llvm-svn: 57407 --- clang/lib/Rewrite/TokenRewriter.cpp | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 clang/lib/Rewrite/TokenRewriter.cpp (limited to 'clang/lib/Rewrite/TokenRewriter.cpp') 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 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; +} + -- cgit v1.2.3