njames93 created this revision. njames93 added reviewers: sammccall, kadircet. Herald added subscribers: usaxena95, arphaman. njames93 requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang.
The DefineOutline tweak can now apply even if the target file is unsaved. Depends on D93977 <https://reviews.llvm.org/D93977>. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D93978 Files: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp =================================================================== --- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "AST.h" +#include "DraftStore.h" #include "FindTarget.h" #include "HeaderSourceSwitch.h" #include "ParsedAST.h" @@ -36,6 +37,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" +#include "llvm/Support/MemoryBuffer.h" #include <cstddef> #include <string> @@ -397,7 +399,8 @@ return true; } - Expected<Effect> apply(const Selection &Sel, const DraftStore &) override { + Expected<Effect> apply(const Selection &Sel, + const DraftStore &DraftMgr) override { const SourceManager &SM = Sel.AST->getSourceManager(); auto MainFileName = getCanonicalPath(SM.getFileEntryForID(SM.getMainFileID()), SM); @@ -408,14 +411,24 @@ if (!CCFile) return error("Couldn't find a suitable implementation file."); - auto &FS = - Sel.AST->getSourceManager().getFileManager().getVirtualFileSystem(); - auto Buffer = FS.getBufferForFile(*CCFile); - // FIXME: Maybe we should consider creating the implementation file if it - // doesn't exist? - if (!Buffer) - return llvm::errorCodeToError(Buffer.getError()); - auto Contents = Buffer->get()->getBuffer(); + StringRef Contents; + // We need to keep both these alive as Contents can reference the storage + // contained in either of them. + auto Draft = DraftMgr.getDraft(*CCFile); + std::unique_ptr<llvm::MemoryBuffer> Buffer; + if (Draft) { + Contents = Draft->Contents; + } else { + auto &FS = + Sel.AST->getSourceManager().getFileManager().getVirtualFileSystem(); + auto BufferOr = FS.getBufferForFile(*CCFile); + // FIXME: Maybe we should consider creating the implementation file if it + // doesn't exist? + if (!BufferOr) + return llvm::errorCodeToError(BufferOr.getError()); + Buffer = std::move(*BufferOr); + Contents = Buffer->getBuffer(); + } auto InsertionPoint = getInsertionPoint( Contents, Source->getQualifiedNameAsString(), Sel.AST->getLangOpts()); if (!InsertionPoint)
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp =================================================================== --- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "AST.h" +#include "DraftStore.h" #include "FindTarget.h" #include "HeaderSourceSwitch.h" #include "ParsedAST.h" @@ -36,6 +37,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" +#include "llvm/Support/MemoryBuffer.h" #include <cstddef> #include <string> @@ -397,7 +399,8 @@ return true; } - Expected<Effect> apply(const Selection &Sel, const DraftStore &) override { + Expected<Effect> apply(const Selection &Sel, + const DraftStore &DraftMgr) override { const SourceManager &SM = Sel.AST->getSourceManager(); auto MainFileName = getCanonicalPath(SM.getFileEntryForID(SM.getMainFileID()), SM); @@ -408,14 +411,24 @@ if (!CCFile) return error("Couldn't find a suitable implementation file."); - auto &FS = - Sel.AST->getSourceManager().getFileManager().getVirtualFileSystem(); - auto Buffer = FS.getBufferForFile(*CCFile); - // FIXME: Maybe we should consider creating the implementation file if it - // doesn't exist? - if (!Buffer) - return llvm::errorCodeToError(Buffer.getError()); - auto Contents = Buffer->get()->getBuffer(); + StringRef Contents; + // We need to keep both these alive as Contents can reference the storage + // contained in either of them. + auto Draft = DraftMgr.getDraft(*CCFile); + std::unique_ptr<llvm::MemoryBuffer> Buffer; + if (Draft) { + Contents = Draft->Contents; + } else { + auto &FS = + Sel.AST->getSourceManager().getFileManager().getVirtualFileSystem(); + auto BufferOr = FS.getBufferForFile(*CCFile); + // FIXME: Maybe we should consider creating the implementation file if it + // doesn't exist? + if (!BufferOr) + return llvm::errorCodeToError(BufferOr.getError()); + Buffer = std::move(*BufferOr); + Contents = Buffer->getBuffer(); + } auto InsertionPoint = getInsertionPoint( Contents, Source->getQualifiedNameAsString(), Sel.AST->getLangOpts()); if (!InsertionPoint)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits