From 47d9d55c66601ffb5939ce07a7eb3c96122c48d6 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Wed, 28 Jul 2021 01:58:28 -0400 Subject: [PATCH] [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 --- clang-tools-extra/clangd/InlayHints.cpp | 5 +++++ .../clangd/unittests/InlayHintTests.cpp | 23 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index 1283aa4d..7c3c6a2 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 @@ private: 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 1410ed1..6796a8c 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; -- 2.7.4