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;
3130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  struct FileEdit {
3330660a898545416f0fea2d717f16f75640001e38Ted Kremenek    StringRef Text;
3430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    unsigned RemoveLen;
3530660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    FileEdit() : RemoveLen(0) {}
3730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  };
3830660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  typedef std::map<FileOffset, FileEdit> FileEditsTy;
4030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  FileEditsTy FileEdits;
4130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  llvm::DenseMap<unsigned, SourceLocation> ExpansionToArgMap;
4330660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4430660a898545416f0fea2d717f16f75640001e38Ted Kremenek  llvm::BumpPtrAllocator StrAlloc;
4530660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4630660a898545416f0fea2d717f16f75640001e38Ted Kremenekpublic:
4730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  EditedSource(const SourceManager &SM, const LangOptions &LangOpts,
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               const PPConditionalDirectiveRecord *PPRec = nullptr)
4930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec),
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      StrAlloc() { }
5130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
5230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  const SourceManager &getSourceManager() const { return SourceMgr; }
534e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &getLangOpts() const { return LangOpts; }
5437ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  const PPConditionalDirectiveRecord *getPPCondDirectiveRecord() const {
5537ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis    return PPRec;
5637ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  }
5730660a898545416f0fea2d717f16f75640001e38Ted Kremenek
5830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs);
5930660a898545416f0fea2d717f16f75640001e38Ted Kremenek
6030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool commit(const Commit &commit);
6130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
6230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  void applyRewrites(EditsReceiver &receiver);
6330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  void clearRewrites();
6430660a898545416f0fea2d717f16f75640001e38Ted Kremenek
6530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  StringRef copyString(StringRef str) {
6630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    char *buf = StrAlloc.Allocate<char>(str.size());
677ba87f38462dde08e4962936a7612b7869e06c0fBenjamin Kramer    std::memcpy(buf, str.data(), str.size());
6830660a898545416f0fea2d717f16f75640001e38Ted Kremenek    return StringRef(buf, str.size());
6930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
7030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  StringRef copyString(const Twine &twine);
7130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
7230660a898545416f0fea2d717f16f75640001e38Ted Kremenekprivate:
7330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool commitInsert(SourceLocation OrigLoc, FileOffset Offs, StringRef text,
7430660a898545416f0fea2d717f16f75640001e38Ted Kremenek                    bool beforePreviousInsertions);
7530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool commitInsertFromRange(SourceLocation OrigLoc, FileOffset Offs,
7630660a898545416f0fea2d717f16f75640001e38Ted Kremenek                             FileOffset InsertFromRangeOffs, unsigned Len,
7730660a898545416f0fea2d717f16f75640001e38Ted Kremenek                             bool beforePreviousInsertions);
7830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  void commitRemove(SourceLocation OrigLoc, FileOffset BeginOffs, unsigned Len);
7930660a898545416f0fea2d717f16f75640001e38Ted Kremenek
8030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  StringRef getSourceText(FileOffset BeginOffs, FileOffset EndOffs,
8130660a898545416f0fea2d717f16f75640001e38Ted Kremenek                          bool &Invalid);
8230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  FileEditsTy::iterator getActionForOffset(FileOffset Offs);
8330660a898545416f0fea2d717f16f75640001e38Ted Kremenek};
8430660a898545416f0fea2d717f16f75640001e38Ted Kremenek
8530660a898545416f0fea2d717f16f75640001e38Ted Kremenek}
8630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
8730660a898545416f0fea2d717f16f75640001e38Ted Kremenek} // end namespace clang
8830660a898545416f0fea2d717f16f75640001e38Ted Kremenek
8930660a898545416f0fea2d717f16f75640001e38Ted Kremenek#endif
90