brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 2d89c65 Raw
127 lines · cpp
1//===--- FeatureModulesTests.cpp  -------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "Annotations.h"10#include "FeatureModule.h"11#include "Selection.h"12#include "TestTU.h"13#include "refactor/Tweak.h"14#include "support/Logger.h"15#include "clang/Lex/PreprocessorOptions.h"16#include "llvm/Support/Error.h"17#include "gmock/gmock.h"18#include "gtest/gtest.h"19#include <memory>20 21namespace clang {22namespace clangd {23namespace {24 25TEST(FeatureModulesTest, ContributesTweak) {26  static constexpr const char *TweakID = "ModuleTweak";27  struct TweakContributingModule final : public FeatureModule {28    struct ModuleTweak final : public Tweak {29      const char *id() const override { return TweakID; }30      bool prepare(const Selection &Sel) override { return true; }31      Expected<Effect> apply(const Selection &Sel) override {32        return error("not implemented");33      }34      std::string title() const override { return id(); }35      llvm::StringLiteral kind() const override {36        return llvm::StringLiteral("");37      };38    };39 40    void contributeTweaks(std::vector<std::unique_ptr<Tweak>> &Out) override {41      Out.emplace_back(new ModuleTweak);42    }43  };44 45  FeatureModuleSet Set;46  Set.add(std::make_unique<TweakContributingModule>());47 48  auto AST = TestTU::withCode("").build();49  auto Tree =50      SelectionTree::createRight(AST.getASTContext(), AST.getTokens(), 0, 0);51  auto Actual = prepareTweak(52      TweakID, Tweak::Selection(nullptr, AST, 0, 0, std::move(Tree), nullptr),53      &Set);54  ASSERT_TRUE(bool(Actual));55  EXPECT_EQ(Actual->get()->id(), TweakID);56}57 58TEST(FeatureModulesTest, SuppressDiags) {59  struct DiagModifierModule final : public FeatureModule {60    struct Listener : public FeatureModule::ASTListener {61      void sawDiagnostic(const clang::Diagnostic &Info,62                         clangd::Diag &Diag) override {63        Diag.Severity = DiagnosticsEngine::Ignored;64      }65    };66    std::unique_ptr<ASTListener> astListeners() override {67      return std::make_unique<Listener>();68    };69  };70  FeatureModuleSet FMS;71  FMS.add(std::make_unique<DiagModifierModule>());72 73  Annotations Code("[[test]]; /* error-ok */");74  TestTU TU;75  TU.Code = Code.code().str();76 77  {78    auto AST = TU.build();79    EXPECT_THAT(AST.getDiagnostics(), testing::Not(testing::IsEmpty()));80  }81 82  TU.FeatureModules = &FMS;83  {84    auto AST = TU.build();85    EXPECT_THAT(AST.getDiagnostics(), testing::IsEmpty());86  }87}88 89TEST(FeatureModulesTest, BeforeExecute) {90  struct BeforeExecuteModule final : public FeatureModule {91    struct Listener : public FeatureModule::ASTListener {92      void beforeExecute(CompilerInstance &CI) override {93        CI.getPreprocessor().SetSuppressIncludeNotFoundError(true);94      }95    };96    std::unique_ptr<ASTListener> astListeners() override {97      return std::make_unique<Listener>();98    };99  };100  FeatureModuleSet FMS;101  FMS.add(std::make_unique<BeforeExecuteModule>());102 103  TestTU TU = TestTU::withCode(R"cpp(104    /*error-ok*/105    #include "not_found.h"106 107    void foo() {108      #include "not_found_not_preamble.h"109    }110  )cpp");111 112  {113    auto AST = TU.build();114    EXPECT_THAT(AST.getDiagnostics(), testing::Not(testing::IsEmpty()));115  }116 117  TU.FeatureModules = &FMS;118  {119    auto AST = TU.build();120    EXPECT_THAT(AST.getDiagnostics(), testing::IsEmpty());121  }122}123 124} // namespace125} // namespace clangd126} // namespace clang127