[PATCH] D79426: [clangd] Change PreambleOnlyAction with content truncation
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 5 09:08:41 PDT 2020
kadircet created this revision.
kadircet added a reviewer: sammccall.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, ilya-biryukov.
Herald added a project: clang.
kadircet updated this revision to Diff 262132.
kadircet added a comment.
- Add test
Lexing until the token location is past preamble bound could be wrong
in some cases as preprocessor lexer can lex multiple tokens in a single call.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D79426
Files:
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
Index: clang-tools-extra/clangd/unittests/PreambleTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/PreambleTests.cpp
+++ clang-tools-extra/clangd/unittests/PreambleTests.cpp
@@ -59,6 +59,11 @@
^#include "a.h"
#include <b
^#include <b.h>)cpp",
+ // Directive is not part of preamble if it is not the token immediately
+ // followed by the hash (#).
+ R"cpp(
+ ^#include "a.h"
+ #/**/include <b.h>)cpp",
};
// ms-compatibility changes meaning of #import, make sure it is turned off.
Index: clang-tools-extra/clangd/Preamble.cpp
===================================================================
--- clang-tools-extra/clangd/Preamble.cpp
+++ clang-tools-extra/clangd/Preamble.cpp
@@ -102,24 +102,6 @@
const SourceManager *SourceMgr = nullptr;
};
-// Runs preprocessor over preamble section.
-class PreambleOnlyAction : public PreprocessorFrontendAction {
-protected:
- void ExecuteAction() override {
- Preprocessor &PP = getCompilerInstance().getPreprocessor();
- auto &SM = PP.getSourceManager();
- PP.EnterMainSourceFile();
- auto Bounds = ComputePreambleBounds(getCompilerInstance().getLangOpts(),
- SM.getBuffer(SM.getMainFileID()), 0);
- Token Tok;
- do {
- PP.Lex(Tok);
- assert(SM.isInMainFile(Tok.getLocation()));
- } while (Tok.isNot(tok::eof) &&
- SM.getDecomposedLoc(Tok.getLocation()).second < Bounds.Size);
- }
-};
-
/// Gets the includes in the preamble section of the file by running
/// preprocessor over \p Contents. Returned includes do not contain resolved
/// paths. \p VFS and \p Cmd is used to build the compiler invocation, which
@@ -140,8 +122,12 @@
"failed to create compiler invocation");
CI->getDiagnosticOpts().IgnoreWarnings = true;
auto ContentsBuffer = llvm::MemoryBuffer::getMemBuffer(Contents);
+ auto Bounds =
+ ComputePreambleBounds(*CI->getLangOpts(), ContentsBuffer.get(), 0);
+ auto PreambleContents =
+ llvm::MemoryBuffer::getMemBufferCopy(Contents.substr(0, Bounds.Size));
auto Clang = prepareCompilerInstance(
- std::move(CI), nullptr, std::move(ContentsBuffer),
+ std::move(CI), nullptr, std::move(PreambleContents),
// Provide an empty FS to prevent preprocessor from performing IO. This
// also implies missing resolved paths for includes.
new llvm::vfs::InMemoryFileSystem, IgnoreDiags);
@@ -150,7 +136,7 @@
"compiler instance had no inputs");
// We are only interested in main file includes.
Clang->getPreprocessorOpts().SingleFileParseMode = true;
- PreambleOnlyAction Action;
+ PreprocessOnlyAction Action;
if (!Action.BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0]))
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"failed BeginSourceFile");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79426.262132.patch
Type: text/x-patch
Size: 3018 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200505/0178c783/attachment.bin>
More information about the cfe-commits
mailing list