diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2020-11-10 10:25:48 -0500 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2020-12-08 12:52:17 -0800 |
commit | 51f3432f4b5217b35dc2694c6e46d6cfc7defad6 (patch) | |
tree | 1b3c1684b80b6932fa813e3523ccaebb5e4c4af2 /clang | |
parent | a65dc08d105e147c98ef17a47b9504210f6058c5 (diff) | |
download | llvm-51f3432f4b5217b35dc2694c6e46d6cfc7defad6.zip llvm-51f3432f4b5217b35dc2694c6e46d6cfc7defad6.tar.gz llvm-51f3432f4b5217b35dc2694c6e46d6cfc7defad6.tar.bz2 |
Frontend: Clarify logic for using the preamble in ASTUnit::CodeComplete, almost NFC
Clarify the logic for using the preamble (and overriding the main file
buffer) in `ASTUnit::CodeComplete` by factoring out a couple of lambdas
(`getUniqueID` and `hasSameUniqueID`). While refactoring the logic,
hoist the check for `Line > 1` and locally check if the filenames are
equal (both to avoid unnecessary `stat` calls) and skip copying out the
filenames to `std::string`.
Besides fewer calls to `stat`, there's no functionality change here.
Differential Revision: https://reviews.llvm.org/D91296
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Frontend/ASTUnit.cpp | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index c8ac7eaa..d9154e9 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -2237,28 +2237,30 @@ void ASTUnit::CodeComplete( = new AugmentedCodeCompleteConsumer(*this, Consumer, CodeCompleteOpts); Clang->setCodeCompletionConsumer(AugmentedConsumer); + auto getUniqueID = + [&FileMgr](StringRef Filename) -> Optional<llvm::sys::fs::UniqueID> { + if (auto Status = FileMgr.getVirtualFileSystem().status(Filename)) + return Status->getUniqueID(); + return None; + }; + + auto hasSameUniqueID = [getUniqueID](StringRef LHS, StringRef RHS) { + if (LHS == RHS) + return true; + if (auto LHSID = getUniqueID(LHS)) + if (auto RHSID = getUniqueID(RHS)) + return *LHSID == *RHSID; + return false; + }; + // If we have a precompiled preamble, try to use it. We only allow // the use of the precompiled preamble if we're if the completion // point is within the main file, after the end of the precompiled // preamble. std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer; - if (Preamble) { - std::string CompleteFilePath(File); - - auto &VFS = FileMgr.getVirtualFileSystem(); - auto CompleteFileStatus = VFS.status(CompleteFilePath); - if (CompleteFileStatus) { - llvm::sys::fs::UniqueID CompleteFileID = CompleteFileStatus->getUniqueID(); - - std::string MainPath(OriginalSourceFile); - auto MainStatus = VFS.status(MainPath); - if (MainStatus) { - llvm::sys::fs::UniqueID MainID = MainStatus->getUniqueID(); - if (CompleteFileID == MainID && Line > 1) - OverrideMainBuffer = getMainBufferWithPrecompiledPreamble( - PCHContainerOps, Inv, &VFS, false, Line - 1); - } - } + if (Preamble && Line > 1 && hasSameUniqueID(File, OriginalSourceFile)) { + OverrideMainBuffer = getMainBufferWithPrecompiledPreamble( + PCHContainerOps, Inv, &FileMgr.getVirtualFileSystem(), false, Line - 1); } // If the main file has been overridden due to the use of a preamble, |