blob: 9e32c8c211b70f8ca666e66111e2b8753fb9eb86 [file] [log] [blame]
Chris Lattner77cd2a02007-10-11 00:43:27 +00001//===--- RewriteTest.cpp - Playground for the code rewriter ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under the
6// University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Hacks and fun related to the code rewriter.
11//
12//===----------------------------------------------------------------------===//
13
14#include "ASTConsumers.h"
Chris Lattner8a12c272007-10-11 18:38:32 +000015#include "clang/Rewrite/Rewriter.h"
Chris Lattner77cd2a02007-10-11 00:43:27 +000016#include "clang/AST/AST.h"
17#include "clang/AST/ASTConsumer.h"
Chris Lattner8a12c272007-10-11 18:38:32 +000018#include "clang/Basic/SourceManager.h"
Chris Lattner77cd2a02007-10-11 00:43:27 +000019using namespace clang;
20
21
22namespace {
Chris Lattner8a12c272007-10-11 18:38:32 +000023 class RewriteTest : public ASTConsumer {
Chris Lattner77cd2a02007-10-11 00:43:27 +000024 SourceManager *SM;
Chris Lattner8a12c272007-10-11 18:38:32 +000025 unsigned MainFileID;
Chris Lattner77cd2a02007-10-11 00:43:27 +000026 public:
Chris Lattner8a12c272007-10-11 18:38:32 +000027 void Initialize(ASTContext &Context, unsigned mainFileID) {
Chris Lattner77cd2a02007-10-11 00:43:27 +000028 SM = &Context.SourceMgr;
Chris Lattner8a12c272007-10-11 18:38:32 +000029 MainFileID = mainFileID;
Chris Lattner77cd2a02007-10-11 00:43:27 +000030 }
31
32 virtual void HandleTopLevelDecl(Decl *D);
Chris Lattner8a12c272007-10-11 18:38:32 +000033
34
35 ~RewriteTest();
Chris Lattner77cd2a02007-10-11 00:43:27 +000036 };
37}
38
Chris Lattner8a12c272007-10-11 18:38:32 +000039ASTConsumer *clang::CreateCodeRewriterTest() { return new RewriteTest(); }
Chris Lattner77cd2a02007-10-11 00:43:27 +000040
Chris Lattner8a12c272007-10-11 18:38:32 +000041void RewriteTest::HandleTopLevelDecl(Decl *D) {
42 // Nothing to do here yet.
43#if 0
Chris Lattner77cd2a02007-10-11 00:43:27 +000044 if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
45 if (ND->getName())
46 printf("%s\n", ND->getName());
Chris Lattner8a12c272007-10-11 18:38:32 +000047#endif
48}
49
50
51
52RewriteTest::~RewriteTest() {
53 Rewriter Rewrite(*SM);
Chris Lattner77cd2a02007-10-11 00:43:27 +000054
Chris Lattner8a12c272007-10-11 18:38:32 +000055 // Get the top-level buffer that this corresponds to.
56 std::pair<const char*, const char*> MainBuf = SM->getBufferData(MainFileID);
57 const char *MainBufStart = MainBuf.first;
58 const char *MainBufEnd = MainBuf.second;
59
60 // Loop over the whole file, looking for tabs.
61 for (const char *BufPtr = MainBufStart; BufPtr != MainBufEnd; ++BufPtr) {
62 if (*BufPtr != '\t')
63 continue;
64
65 // Okay, we found a tab. This tab will turn into at least one character,
66 // but it depends on which 'virtual column' it is in. Compute that now.
67 unsigned VCol = 0;
68 while (BufPtr-VCol != MainBufStart && BufPtr[-VCol-1] != '\t' &&
69 BufPtr[-VCol-1] != '\n' && BufPtr[-VCol-1] != '\r')
70 ++VCol;
71
72 // Okay, now that we know the virtual column, we know how many spaces to
73 // insert. We assume 8-character tab-stops.
74 unsigned Spaces = 8-(VCol & 7);
75
76 // Get the location of the tab.
77 SourceLocation TabLoc =
78 SourceLocation::getFileLoc(MainFileID, BufPtr-MainBufStart);
79
80 // Rewrite the single tab character into a sequence of spaces.
81 Rewrite.ReplaceText(TabLoc, 1, "xxxxxxxxxxx", Spaces);
82 }
83
84 // Get the buffer corresponding to MainFileID. If we haven't changed it, then
85 // we are done.
86 if (const RewriteBuffer *RewriteBuf =
87 Rewrite.getRewriteBufferFor(MainFileID)) {
88 RewriteBuf = 0;
89 printf("Changed\n");
90 } else {
91 printf("No changes\n");
92 }
Chris Lattner77cd2a02007-10-11 00:43:27 +000093}