Author: Duncan P. N. Exon Smith Date: 2020-12-08T12:52:17-08:00 New Revision: 51f3432f4b5217b35dc2694c6e46d6cfc7defad6
URL: https://github.com/llvm/llvm-project/commit/51f3432f4b5217b35dc2694c6e46d6cfc7defad6 DIFF: https://github.com/llvm/llvm-project/commit/51f3432f4b5217b35dc2694c6e46d6cfc7defad6.diff LOG: 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 Added: Modified: clang/lib/Frontend/ASTUnit.cpp Removed: ################################################################################ diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index c8ac7eaa9ab8..d9154e9b459e 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, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits