EditedSource.h revision 37ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17
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/Support/Allocator.h" 1530660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "llvm/ADT/DenseMap.h" 1630660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "llvm/ADT/StringRef.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, 4837ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis const PPConditionalDirectiveRecord *PPRec = 0) 4930660a898545416f0fea2d717f16f75640001e38Ted Kremenek : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec), 5030660a898545416f0fea2d717f16f75640001e38Ted Kremenek StrAlloc(/*size=*/512) { } 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