linter.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "linter.h"
  2. #include "check_runner.h"
  3. #include <yql/essentials/ast/yql_ast.h>
  4. #include <yql/essentials/ast/yql_expr.h>
  5. #include <functional>
  6. namespace NYql {
  7. namespace NFastCheck {
  8. class TCheckRunnerFactory : public ICheckRunnerFactory {
  9. public:
  10. using TRunnerFactoryFunction = std::function<std::unique_ptr<ICheckRunner>()>;
  11. TCheckRunnerFactory() {
  12. Registry_.emplace("lexer", MakeLexerRunner);
  13. Registry_.emplace("parser", MakeParserRunner);
  14. Registry_.emplace("format", MakeFormatRunner);
  15. Registry_.emplace("translator", MakeTranslatorRunner);
  16. for (const auto& x : Registry_) {
  17. CheckNames_.emplace(x.first);
  18. }
  19. }
  20. const TSet<TString>& ListChecks() const {
  21. return CheckNames_;
  22. }
  23. std::unique_ptr<ICheckRunner> MakeRunner(const TString& checkName) const final {
  24. auto ptr = Registry_.FindPtr(checkName);
  25. if (!ptr) {
  26. return {};
  27. }
  28. return (*ptr)();
  29. }
  30. private:
  31. THashMap<TString, TRunnerFactoryFunction> Registry_;
  32. TSet<TString> CheckNames_;
  33. };
  34. TCheckRunnerFactory& GetCheckRunnerFactory() {
  35. return *Singleton<TCheckRunnerFactory>();
  36. };
  37. const TSet<TString>& ListChecks() {
  38. return GetCheckRunnerFactory().ListChecks();
  39. }
  40. TChecksResponse RunChecks(const TChecksRequest& request) {
  41. auto filters = request.Filters.GetOrElse(TVector<TCheckFilter>(1, TCheckFilter{.Include = true, .CheckNameGlob = "*"}));
  42. const auto& fullChecks = ListChecks();
  43. TSet<TString> enabledChecks;
  44. for (const auto& f : filters) {
  45. if (f.CheckNameGlob == "*") {
  46. if (f.Include) {
  47. enabledChecks = fullChecks;
  48. } else {
  49. enabledChecks.clear();
  50. }
  51. } else {
  52. // TODO full support of glob (* and ?)
  53. Y_ENSURE(f.CheckNameGlob.find('*') == TString::npos);
  54. Y_ENSURE(f.CheckNameGlob.find('?') == TString::npos);
  55. if (f.Include) {
  56. if (fullChecks.contains(f.CheckNameGlob)) {
  57. enabledChecks.insert(f.CheckNameGlob);
  58. }
  59. } else {
  60. enabledChecks.erase(f.CheckNameGlob);
  61. }
  62. }
  63. }
  64. TChecksResponse res;
  65. for (const auto& c : enabledChecks) {
  66. auto checkRunner = GetCheckRunnerFactory().MakeRunner(c);
  67. if (checkRunner) {
  68. res.Checks.push_back(checkRunner->Run(request));
  69. }
  70. }
  71. return res;
  72. }
  73. }
  74. }