#include "check_runner.h" #include "check_state.h" #include "settings.h" #include "utils.h" #include #include #include #include #include #include #include #include namespace NYql::NFastCheck { namespace { class TTypecheckRunner: public TCheckRunnerBase { public: TString GetCheckName() const final { return "typecheck"; } TCheckResponse DoRun(const TChecksRequest& request, TCheckState& state) final { switch (state.GetEffectiveSyntax()) { case ESyntax::SExpr: return RunSExpr(request, state); case ESyntax::PG: return RunPg(request, state); case ESyntax::YQL: return RunYql(request, state); } } private: TCheckResponse RunSExpr(const TChecksRequest& request, TCheckState& state) { TCheckResponse res{.CheckName = GetCheckName()}; const auto* astResult = state.TranslateSExpr(res.Issues); if (!astResult || !astResult->IsOk()) { res.Success = false; return res; } res.Success = DoTypeCheck(request.Mode, astResult->Root, request.LangVer, request.UdfMeta, res.Issues); return res; } TCheckResponse RunPg(const TChecksRequest& request, TCheckState& state) { TCheckResponse res{.CheckName = GetCheckName()}; const auto* astResult = state.TranslatePg(res.Issues); if (!astResult || !astResult->IsOk()) { res.Success = false; return res; } res.Success = DoTypeCheck(request.Mode, astResult->Root, request.LangVer, request.UdfMeta, res.Issues); return res; } TCheckResponse RunYql(const TChecksRequest& request, TCheckState& state) { TCheckResponse res{.CheckName = GetCheckName()}; const auto* astResult = state.TranslateSql(res.Issues); if (!astResult || !astResult->IsOk()) { res.Success = false; return res; } res.Success = DoTypeCheck(request.Mode, astResult->Root, request.LangVer, request.UdfMeta, res.Issues); return res; } bool DoTypeCheck(EMode mode, TAstNode* astRoot, TLangVersion langver, const IUdfMeta* udfMeta, TIssues& issues) { if (!udfMeta) { udfMeta = GetDefaultUdfMeta(); } // clang-format off return PartialAnnonateTypes(astRoot, mode == EMode::Library, langver, udfMeta, issues, [](TTypeAnnotationContext& newTypeCtx) { return CreateConfigProvider(newTypeCtx, nullptr, "", {}, /*forPartialTypeCheck=*/true); }, [](TStringBuf str, TExprContext& ctx) { return NCommon::ParseTypeFromYson(str, ctx); }, [](const TTypeAnnotationNode* type) { return NCommon::WriteTypeToYson(type); } ); // clang-format on } }; } // namespace std::unique_ptr MakeTypecheckRunner() { return std::make_unique(); } } // namespace NYql::NFastCheck