mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[Basic] Don't rewrite source buffer copy multiple times
The on-disc buffer file name was not recorded correctly. rdar://130478685
This commit is contained in:
@@ -71,7 +71,7 @@ public:
|
||||
|
||||
/// The name of the source file on disk that was created to hold the
|
||||
/// contents of this file for external clients.
|
||||
StringRef onDiskBufferCopyFileName = StringRef();
|
||||
mutable StringRef onDiskBufferCopyFileName = StringRef();
|
||||
|
||||
/// Contains the ancestors of this source buffer, starting with the root source
|
||||
/// buffer and ending at this source buffer.
|
||||
@@ -209,8 +209,7 @@ public:
|
||||
bool hasGeneratedSourceInfo(unsigned bufferID);
|
||||
|
||||
/// Retrieve the generated source information for the given buffer.
|
||||
std::optional<GeneratedSourceInfo>
|
||||
getGeneratedSourceInfo(unsigned bufferID) const;
|
||||
const GeneratedSourceInfo *getGeneratedSourceInfo(unsigned bufferID) const;
|
||||
|
||||
/// Retrieve the list of ancestors of the given source buffer, starting with
|
||||
/// the root buffer and proceding to the given buffer ID at the end.
|
||||
|
||||
@@ -907,7 +907,7 @@ ModuleDecl::getOriginalLocation(SourceLoc loc) const {
|
||||
|
||||
SourceLoc startLoc = loc;
|
||||
unsigned startBufferID = bufferID;
|
||||
while (std::optional<GeneratedSourceInfo> info =
|
||||
while (const GeneratedSourceInfo *info =
|
||||
SM.getGeneratedSourceInfo(bufferID)) {
|
||||
switch (info->kind) {
|
||||
#define MACRO_ROLE(Name, Description) \
|
||||
|
||||
@@ -288,7 +288,8 @@ StringRef SourceManager::getIdentifierForBuffer(
|
||||
// If this is generated source code, and we're supposed to force it to disk
|
||||
// so external clients can see it, do so now.
|
||||
if (ForceGeneratedSourceToDisk) {
|
||||
if (auto generatedInfo = getGeneratedSourceInfo(bufferID)) {
|
||||
if (const GeneratedSourceInfo *generatedInfo =
|
||||
getGeneratedSourceInfo(bufferID)) {
|
||||
// We only care about macros, so skip everything else.
|
||||
if (generatedInfo->kind == GeneratedSourceInfo::ReplacedFunctionBody ||
|
||||
generatedInfo->kind == GeneratedSourceInfo::PrettyPrinted ||
|
||||
@@ -403,12 +404,12 @@ bool SourceManager::hasGeneratedSourceInfo(unsigned bufferID) {
|
||||
return GeneratedSourceInfos.count(bufferID);
|
||||
}
|
||||
|
||||
std::optional<GeneratedSourceInfo>
|
||||
const GeneratedSourceInfo *
|
||||
SourceManager::getGeneratedSourceInfo(unsigned bufferID) const {
|
||||
auto known = GeneratedSourceInfos.find(bufferID);
|
||||
if (known == GeneratedSourceInfos.end())
|
||||
return std::nullopt;
|
||||
return known->second;
|
||||
return nullptr;
|
||||
return &known->second;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -285,7 +285,7 @@ static DeclContext *getInnermostFunctionContext(DeclContext *DC) {
|
||||
}
|
||||
|
||||
/// Return location of the macro expansion and the macro name.
|
||||
static MacroInfo getMacroInfo(GeneratedSourceInfo &Info,
|
||||
static MacroInfo getMacroInfo(const GeneratedSourceInfo &Info,
|
||||
DeclContext *FunctionDC) {
|
||||
MacroInfo Result(Info.generatedSourceRange.getStart(),
|
||||
Info.originalSourceRange.getStart());
|
||||
|
||||
Reference in New Issue
Block a user