Author: Nathan Ridge Date: 2021-08-16T01:58:23-04:00 New Revision: 47d9d55c66601ffb5939ce07a7eb3c96122c48d6
URL: https://github.com/llvm/llvm-project/commit/47d9d55c66601ffb5939ce07a7eb3c96122c48d6 DIFF: https://github.com/llvm/llvm-project/commit/47d9d55c66601ffb5939ce07a7eb3c96122c48d6.diff LOG: [clangd] Do not show inlay hints pertaining to code in other files Fixes https://github.com/clangd/clangd/issues/817 Differential Revision: https://reviews.llvm.org/D106934 Added: Modified: clang-tools-extra/clangd/InlayHints.cpp clang-tools-extra/clangd/unittests/InlayHintTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index 1283aa4dd62cc..7c3c6a2421d83 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -13,6 +13,7 @@ #include "clang/AST/ExprCXX.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Basic/SourceManager.h" +#include "llvm/Support/raw_ostream.h" namespace clang { namespace clangd { @@ -314,6 +315,10 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { toHalfOpenFileRange(AST.getSourceManager(), AST.getLangOpts(), R); if (!FileRange) return; + // The hint may be in a file other than the main file (for example, a header + // file that was included after the preamble), do not show in that case. + if (!AST.getSourceManager().isWrittenInMainFile(FileRange->getBegin())) + return; Results.push_back(InlayHint{ Range{ sourceLocToPosition(AST.getSourceManager(), FileRange->getBegin()), diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp index 1410ed115b6bf..6796a8ce70fff 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -9,6 +9,7 @@ #include "InlayHints.h" #include "Protocol.h" #include "TestTU.h" +#include "TestWorkspace.h" #include "XRefs.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -398,6 +399,28 @@ TEST(ParameterHints, SetterFunctions) { ExpectedHint{"timeout_millis: ", "timeout_millis"}); } +TEST(ParameterHints, IncludeAtNonGlobalScope) { + Annotations FooInc(R"cpp( + void bar() { foo(42); } + )cpp"); + Annotations FooCC(R"cpp( + struct S { + void foo(int param); + #include "foo.inc" + }; + )cpp"); + + TestWorkspace Workspace; + Workspace.addSource("foo.inc", FooInc.code()); + Workspace.addMainFile("foo.cc", FooCC.code()); + + auto AST = Workspace.openFile("foo.cc"); + ASSERT_TRUE(bool(AST)); + + // Ensure the hint for the call in foo.inc is NOT materialized in foo.cc. + EXPECT_EQ(hintsOfKind(*AST, InlayHintKind::ParameterHint).size(), 0u); +} + TEST(TypeHints, Smoke) { assertTypeHints(R"cpp( auto $waldo[[waldo]] = 42; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits