EditedSource.h revision 651f13cea278ec967336033dd032faef0e9fc2ec
130660a898545416f0fea2d717f16f75640001e38Ted Kremenek//===----- EditedSource.h - Collection of source edits ----------*- C++ -*-===//
230660a898545416f0fea2d717f16f75640001e38Ted Kremenek//
330660a898545416f0fea2d717f16f75640001e38Ted Kremenek//                     The LLVM Compiler Infrastructure
430660a898545416f0fea2d717f16f75640001e38Ted Kremenek//
530660a898545416f0fea2d717f16f75640001e38Ted Kremenek// This file is distributed under the University of Illinois Open Source
630660a898545416f0fea2d717f16f75640001e38Ted Kremenek// License. See LICENSE.TXT for details.
730660a898545416f0fea2d717f16f75640001e38Ted Kremenek//
830660a898545416f0fea2d717f16f75640001e38Ted Kremenek//===----------------------------------------------------------------------===//
930660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1030660a898545416f0fea2d717f16f75640001e38Ted Kremenek#ifndef LLVM_CLANG_EDIT_EDITEDSOURCE_H
1130660a898545416f0fea2d717f16f75640001e38Ted Kremenek#define LLVM_CLANG_EDIT_EDITEDSOURCE_H
1230660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1330660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "clang/Edit/FileOffset.h"
1430660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "llvm/ADT/DenseMap.h"
1530660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "llvm/ADT/StringRef.h"
1630a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/Support/Allocator.h"
1730660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include <map>
1830660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1930660a898545416f0fea2d717f16f75640001e38Ted Kremeneknamespace clang {
2030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  class LangOptions;
2137ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  class PPConditionalDirectiveRecord;
2230660a898545416f0fea2d717f16f75640001e38Ted Kremenek
2330660a898545416f0fea2d717f16f75640001e38Ted Kremeneknamespace edit {
2430660a898545416f0fea2d717f16f75640001e38Ted Kremenek  class Commit;
2530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  class EditsReceiver;
2630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
2730660a898545416f0fea2d717f16f75640001e38Ted Kremenekclass EditedSource {
2830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  const SourceManager &SourceMgr;
2930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  const LangOptions &LangOpts;
3037ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  const PPConditionalDirectiveRecord *PPRec;
316badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian  const bool ForceCommitInSystemHeader;
3230660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  struct FileEdit {
3430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    StringRef Text;
3530660a898545416f0fea2d717f16f75640001e38Ted Kremenek    unsigned RemoveLen;
3630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    FileEdit() : RemoveLen(0) {}
3830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  };
3930660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  typedef std::map<FileOffset, FileEdit> FileEditsTy;
4130660a898545416f0fea2d717f16f75640001e38Ted Kremenek  FileEditsTy FileEdits;
4230660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  llvm::DenseMap<unsigned, SourceLocation> ExpansionToArgMap;
4430660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  llvm::BumpPtrAllocator StrAlloc;
4630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4730660a898545416f0fea2d717f16f75640001e38Ted Kremenekpublic:
4830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  EditedSource(const SourceManager &SM, const LangOptions &LangOpts,
496badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian               const PPConditionalDirectiveRecord *PPRec = 0,
506badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian               const bool FCommitInSystemHeader = true)
5130660a898545416f0fea2d717f16f75640001e38Ted Kremenek    : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec),
526badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian      ForceCommitInSystemHeader(FCommitInSystemHeader),
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      StrAlloc() { }
5430660a898545416f0fea2d717f16f75640001e38Ted Kremenek
5530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  const SourceManager &getSourceManager() const { return SourceMgr; }
564e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &getLangOpts() const { return LangOpts; }
5737ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  const PPConditionalDirectiveRecord *getPPCondDirectiveRecord() const {
5837ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis    return PPRec;
5937ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  }
606badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian
616badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian  bool getForceCommitInSystemHeader() const {
626badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian    return ForceCommitInSystemHeader;
636badc76787dc9480fd7c21d3eb75aab79d2df3f5Fariborz Jahanian  }
6430660a898545416f0fea2d717f16f75640001e38Ted Kremenek
6530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs);
6630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
6730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool commit(const Commit &commit);
6830660a898545416f0fea2d717f16f75640001e38Ted Kremenek
6930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  void applyRewrites(EditsReceiver &receiver);
7030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  void clearRewrites();
7130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
7230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  StringRef copyString(StringRef str) {
7330660a898545416f0fea2d717f16f75640001e38Ted Kremenek    char *buf = StrAlloc.Allocate<char>(str.size());
747ba87f38462dde08e4962936a7612b7869e06c0fBenjamin Kramer    std::memcpy(buf, str.data(), str.size());
7530660a898545416f0fea2d717f16f75640001e38Ted Kremenek    return StringRef(buf, str.size());
7630660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
7730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  StringRef copyString(const Twine &twine);
7830660a898545416f0fea2d717f16f75640001e38Ted Kremenek
7930660a898545416f0fea2d717f16f75640001e38Ted Kremenekprivate:
8030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool commitInsert(SourceLocation OrigLoc, FileOffset Offs, StringRef text,
8130660a898545416f0fea2d717f16f75640001e38Ted Kremenek                    bool beforePreviousInsertions);
8230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool commitInsertFromRange(SourceLocation OrigLoc, FileOffset Offs,
8330660a898545416f0fea2d717f16f75640001e38Ted Kremenek                             FileOffset InsertFromRangeOffs, unsigned Len,
8430660a898545416f0fea2d717f16f75640001e38Ted Kremenek                             bool beforePreviousInsertions);
8530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  void commitRemove(SourceLocation OrigLoc, FileOffset BeginOffs, unsigned Len);
8630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
8730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  StringRef getSourceText(FileOffset BeginOffs, FileOffset EndOffs,
8830660a898545416f0fea2d717f16f75640001e38Ted Kremenek                          bool &Invalid);
8930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  FileEditsTy::iterator getActionForOffset(FileOffset Offs);
9030660a898545416f0fea2d717f16f75640001e38Ted Kremenek};
9130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
9230660a898545416f0fea2d717f16f75640001e38Ted Kremenek}
9330660a898545416f0fea2d717f16f75640001e38Ted Kremenek
9430660a898545416f0fea2d717f16f75640001e38Ted Kremenek} // end namespace clang
9530660a898545416f0fea2d717f16f75640001e38Ted Kremenek
9630660a898545416f0fea2d717f16f75640001e38Ted Kremenek#endif
97