clang 20.0.0git
EditedSource.h
Go to the documentation of this file.
1//===- EditedSource.h - Collection of source edits --------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_EDIT_EDITEDSOURCE_H
10#define LLVM_CLANG_EDIT_EDITEDSOURCE_H
11
13#include "clang/Basic/LLVM.h"
16#include "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/SmallVector.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/Support/Allocator.h"
20#include <map>
21#include <tuple>
22#include <utility>
23
24namespace clang {
25
26class LangOptions;
27class PPConditionalDirectiveRecord;
28class SourceManager;
29
30namespace edit {
31
32class Commit;
33class EditsReceiver;
34
36 const SourceManager &SourceMgr;
37 const LangOptions &LangOpts;
39
40 struct FileEdit {
41 StringRef Text;
42 unsigned RemoveLen = 0;
43
44 FileEdit() = default;
45 };
46
47 using FileEditsTy = std::map<FileOffset, FileEdit>;
48
49 FileEditsTy FileEdits;
50
51 struct MacroArgUse {
53 SourceLocation ImmediateExpansionLoc;
54
55 // Location of argument use inside the top-level macro
56 SourceLocation UseLoc;
57
58 bool operator==(const MacroArgUse &Other) const {
59 return std::tie(Identifier, ImmediateExpansionLoc, UseLoc) ==
60 std::tie(Other.Identifier, Other.ImmediateExpansionLoc,
61 Other.UseLoc);
62 }
63 };
64
65 llvm::DenseMap<SourceLocation, SmallVector<MacroArgUse, 2>> ExpansionToArgMap;
67 CurrCommitMacroArgExps;
68
69 IdentifierTable IdentTable;
70 llvm::BumpPtrAllocator StrAlloc;
71
72public:
73 EditedSource(const SourceManager &SM, const LangOptions &LangOpts,
74 const PPConditionalDirectiveRecord *PPRec = nullptr)
75 : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec), IdentTable(LangOpts) {}
76
77 const SourceManager &getSourceManager() const { return SourceMgr; }
78 const LangOptions &getLangOpts() const { return LangOpts; }
79
81 return PPRec;
82 }
83
85
86 bool commit(const Commit &commit);
87
88 void applyRewrites(EditsReceiver &receiver, bool adjustRemovals = true);
89 void clearRewrites();
90
91 StringRef copyString(StringRef str) { return str.copy(StrAlloc); }
92 StringRef copyString(const Twine &twine);
93
94private:
95 bool commitInsert(SourceLocation OrigLoc, FileOffset Offs, StringRef text,
96 bool beforePreviousInsertions);
97 bool commitInsertFromRange(SourceLocation OrigLoc, FileOffset Offs,
98 FileOffset InsertFromRangeOffs, unsigned Len,
99 bool beforePreviousInsertions);
100 void commitRemove(SourceLocation OrigLoc, FileOffset BeginOffs, unsigned Len);
101
102 StringRef getSourceText(FileOffset BeginOffs, FileOffset EndOffs,
103 bool &Invalid);
104 FileEditsTy::iterator getActionForOffset(FileOffset Offs);
105 void deconstructMacroArgLoc(SourceLocation Loc,
106 SourceLocation &ExpansionLoc,
107 MacroArgUse &ArgUse);
108
109 void startingCommit();
110 void finishedCommit();
111};
112
113} // namespace edit
114
115} // namespace clang
116
117#endif // LLVM_CLANG_EDIT_EDITEDSOURCE_H
#define SM(sm)
Definition: Cuda.cpp:84
StringRef Text
Definition: Format.cpp:3033
StringRef Identifier
Definition: Format.cpp:3040
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the clang::SourceLocation class and associated facilities.
One of these records is kept for each identifier that is lexed.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
Records preprocessor conditional directive regions and allows querying in which region source locatio...
Encodes a location in the source.
This class handles loading and caching of source files into memory.
const LangOptions & getLangOpts() const
Definition: EditedSource.h:78
StringRef copyString(StringRef str)
Definition: EditedSource.h:91
const PPConditionalDirectiveRecord * getPPCondDirectiveRecord() const
Definition: EditedSource.h:80
bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs)
void applyRewrites(EditsReceiver &receiver, bool adjustRemovals=true)
bool commit(const Commit &commit)
EditedSource(const SourceManager &SM, const LangOptions &LangOpts, const PPConditionalDirectiveRecord *PPRec=nullptr)
Definition: EditedSource.h:73
const SourceManager & getSourceManager() const
Definition: EditedSource.h:77
EditGenerator edit(ASTEdit E)
Generates a single (specified) edit.
Definition: RewriteRule.cpp:84
The JSON file list parser is used to communicate input to InstallAPI.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition: CallGraph.h:204
@ Other
Other implicit parameter.