xref: /llvm-project/clang-tools-extra/clangd/unittests/FeatureModulesTests.cpp (revision bd89f9ec293ea5e20e89d4bce49135431239cf3e)
1bb6d96ceSKadir Cetinkaya //===--- FeatureModulesTests.cpp  -------------------------------*- C++ -*-===//
2bb6d96ceSKadir Cetinkaya //
3bb6d96ceSKadir Cetinkaya // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bb6d96ceSKadir Cetinkaya // See https://llvm.org/LICENSE.txt for license information.
5bb6d96ceSKadir Cetinkaya // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bb6d96ceSKadir Cetinkaya //
7bb6d96ceSKadir Cetinkaya //===----------------------------------------------------------------------===//
8bb6d96ceSKadir Cetinkaya 
9204014ecSKadir Cetinkaya #include "Annotations.h"
10bb6d96ceSKadir Cetinkaya #include "FeatureModule.h"
11bb6d96ceSKadir Cetinkaya #include "Selection.h"
12bb6d96ceSKadir Cetinkaya #include "TestTU.h"
13bb6d96ceSKadir Cetinkaya #include "refactor/Tweak.h"
14bb6d96ceSKadir Cetinkaya #include "support/Logger.h"
15ad46aaedSAdam Czachorowski #include "clang/Lex/PreprocessorOptions.h"
16bb6d96ceSKadir Cetinkaya #include "llvm/Support/Error.h"
17bb6d96ceSKadir Cetinkaya #include "gmock/gmock.h"
18bb6d96ceSKadir Cetinkaya #include "gtest/gtest.h"
19bb6d96ceSKadir Cetinkaya #include <memory>
20bb6d96ceSKadir Cetinkaya 
21bb6d96ceSKadir Cetinkaya namespace clang {
22bb6d96ceSKadir Cetinkaya namespace clangd {
23bb6d96ceSKadir Cetinkaya namespace {
24bb6d96ceSKadir Cetinkaya 
TEST(FeatureModulesTest,ContributesTweak)25bb6d96ceSKadir Cetinkaya TEST(FeatureModulesTest, ContributesTweak) {
26bb6d96ceSKadir Cetinkaya   static constexpr const char *TweakID = "ModuleTweak";
27bb6d96ceSKadir Cetinkaya   struct TweakContributingModule final : public FeatureModule {
28bb6d96ceSKadir Cetinkaya     struct ModuleTweak final : public Tweak {
29bb6d96ceSKadir Cetinkaya       const char *id() const override { return TweakID; }
30bb6d96ceSKadir Cetinkaya       bool prepare(const Selection &Sel) override { return true; }
31bb6d96ceSKadir Cetinkaya       Expected<Effect> apply(const Selection &Sel) override {
32bb6d96ceSKadir Cetinkaya         return error("not implemented");
33bb6d96ceSKadir Cetinkaya       }
34bb6d96ceSKadir Cetinkaya       std::string title() const override { return id(); }
358969762fSPan, Tao       llvm::StringLiteral kind() const override {
368969762fSPan, Tao         return llvm::StringLiteral("");
378969762fSPan, Tao       };
38bb6d96ceSKadir Cetinkaya     };
39bb6d96ceSKadir Cetinkaya 
40bb6d96ceSKadir Cetinkaya     void contributeTweaks(std::vector<std::unique_ptr<Tweak>> &Out) override {
41bb6d96ceSKadir Cetinkaya       Out.emplace_back(new ModuleTweak);
42bb6d96ceSKadir Cetinkaya     }
43bb6d96ceSKadir Cetinkaya   };
44bb6d96ceSKadir Cetinkaya 
45bb6d96ceSKadir Cetinkaya   FeatureModuleSet Set;
46bb6d96ceSKadir Cetinkaya   Set.add(std::make_unique<TweakContributingModule>());
47bb6d96ceSKadir Cetinkaya 
48bb6d96ceSKadir Cetinkaya   auto AST = TestTU::withCode("").build();
49bb6d96ceSKadir Cetinkaya   auto Tree =
50bb6d96ceSKadir Cetinkaya       SelectionTree::createRight(AST.getASTContext(), AST.getTokens(), 0, 0);
51bb6d96ceSKadir Cetinkaya   auto Actual = prepareTweak(
526b4e8f82SNathan James       TweakID, Tweak::Selection(nullptr, AST, 0, 0, std::move(Tree), nullptr),
536b4e8f82SNathan James       &Set);
54bb6d96ceSKadir Cetinkaya   ASSERT_TRUE(bool(Actual));
55bb6d96ceSKadir Cetinkaya   EXPECT_EQ(Actual->get()->id(), TweakID);
56bb6d96ceSKadir Cetinkaya }
57bb6d96ceSKadir Cetinkaya 
TEST(FeatureModulesTest,SuppressDiags)58204014ecSKadir Cetinkaya TEST(FeatureModulesTest, SuppressDiags) {
59204014ecSKadir Cetinkaya   struct DiagModifierModule final : public FeatureModule {
60204014ecSKadir Cetinkaya     struct Listener : public FeatureModule::ASTListener {
61204014ecSKadir Cetinkaya       void sawDiagnostic(const clang::Diagnostic &Info,
62204014ecSKadir Cetinkaya                          clangd::Diag &Diag) override {
63204014ecSKadir Cetinkaya         Diag.Severity = DiagnosticsEngine::Ignored;
64204014ecSKadir Cetinkaya       }
65204014ecSKadir Cetinkaya     };
66204014ecSKadir Cetinkaya     std::unique_ptr<ASTListener> astListeners() override {
67204014ecSKadir Cetinkaya       return std::make_unique<Listener>();
68204014ecSKadir Cetinkaya     };
69204014ecSKadir Cetinkaya   };
70204014ecSKadir Cetinkaya   FeatureModuleSet FMS;
71204014ecSKadir Cetinkaya   FMS.add(std::make_unique<DiagModifierModule>());
72204014ecSKadir Cetinkaya 
73204014ecSKadir Cetinkaya   Annotations Code("[[test]]; /* error-ok */");
74204014ecSKadir Cetinkaya   TestTU TU;
75204014ecSKadir Cetinkaya   TU.Code = Code.code().str();
76204014ecSKadir Cetinkaya 
77204014ecSKadir Cetinkaya   {
78204014ecSKadir Cetinkaya     auto AST = TU.build();
79*bd89f9ecSKadir Cetinkaya     EXPECT_THAT(AST.getDiagnostics(), testing::Not(testing::IsEmpty()));
80204014ecSKadir Cetinkaya   }
81204014ecSKadir Cetinkaya 
82204014ecSKadir Cetinkaya   TU.FeatureModules = &FMS;
83204014ecSKadir Cetinkaya   {
84204014ecSKadir Cetinkaya     auto AST = TU.build();
85*bd89f9ecSKadir Cetinkaya     EXPECT_THAT(AST.getDiagnostics(), testing::IsEmpty());
86204014ecSKadir Cetinkaya   }
87204014ecSKadir Cetinkaya }
88204014ecSKadir Cetinkaya 
TEST(FeatureModulesTest,BeforeExecute)89ad46aaedSAdam Czachorowski TEST(FeatureModulesTest, BeforeExecute) {
90ad46aaedSAdam Czachorowski   struct BeforeExecuteModule final : public FeatureModule {
91ad46aaedSAdam Czachorowski     struct Listener : public FeatureModule::ASTListener {
92ad46aaedSAdam Czachorowski       void beforeExecute(CompilerInstance &CI) override {
93ad46aaedSAdam Czachorowski         CI.getPreprocessor().SetSuppressIncludeNotFoundError(true);
94ad46aaedSAdam Czachorowski       }
95ad46aaedSAdam Czachorowski     };
96ad46aaedSAdam Czachorowski     std::unique_ptr<ASTListener> astListeners() override {
97ad46aaedSAdam Czachorowski       return std::make_unique<Listener>();
98ad46aaedSAdam Czachorowski     };
99ad46aaedSAdam Czachorowski   };
100ad46aaedSAdam Czachorowski   FeatureModuleSet FMS;
101ad46aaedSAdam Czachorowski   FMS.add(std::make_unique<BeforeExecuteModule>());
102ad46aaedSAdam Czachorowski 
103ad46aaedSAdam Czachorowski   TestTU TU = TestTU::withCode(R"cpp(
104ad46aaedSAdam Czachorowski     /*error-ok*/
105ad46aaedSAdam Czachorowski     #include "not_found.h"
106ad46aaedSAdam Czachorowski 
107ad46aaedSAdam Czachorowski     void foo() {
108ad46aaedSAdam Czachorowski       #include "not_found_not_preamble.h"
109ad46aaedSAdam Czachorowski     }
110ad46aaedSAdam Czachorowski   )cpp");
111ad46aaedSAdam Czachorowski 
112ad46aaedSAdam Czachorowski   {
113ad46aaedSAdam Czachorowski     auto AST = TU.build();
114*bd89f9ecSKadir Cetinkaya     EXPECT_THAT(AST.getDiagnostics(), testing::Not(testing::IsEmpty()));
115ad46aaedSAdam Czachorowski   }
116ad46aaedSAdam Czachorowski 
117ad46aaedSAdam Czachorowski   TU.FeatureModules = &FMS;
118ad46aaedSAdam Czachorowski   {
119ad46aaedSAdam Czachorowski     auto AST = TU.build();
120*bd89f9ecSKadir Cetinkaya     EXPECT_THAT(AST.getDiagnostics(), testing::IsEmpty());
121ad46aaedSAdam Czachorowski   }
122ad46aaedSAdam Czachorowski }
123ad46aaedSAdam Czachorowski 
124bb6d96ceSKadir Cetinkaya } // namespace
125bb6d96ceSKadir Cetinkaya } // namespace clangd
126bb6d96ceSKadir Cetinkaya } // namespace clang
127