From 321c6567eaec0530e3ab479ac507392c3297fe38 Mon Sep 17 00:00:00 2001 From: vitya-smirnov Date: Mon, 20 Oct 2025 09:58:22 +0300 Subject: YQL-20496: Fix an option highlighting pattern There was a bug with highlighting an identifier a in expression a == b as an option. So for an option match we expect an exactly = token. So all hints are enumerated and the solid regex is built. commit_hash:8df3cd082a7eaa99fc06daa282ba6dd9f0798f6f --- .../sql/v1/highlight/data_language_json.cpp | 34 ++++++++++++++++++++++ .../sql/v1/highlight/data_language_json.h | 12 ++++++++ yql/essentials/sql/v1/highlight/sql_highlight.cpp | 25 +++++++--------- yql/essentials/sql/v1/highlight/ya.make | 2 ++ 4 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 yql/essentials/sql/v1/highlight/data_language_json.cpp create mode 100644 yql/essentials/sql/v1/highlight/data_language_json.h diff --git a/yql/essentials/sql/v1/highlight/data_language_json.cpp b/yql/essentials/sql/v1/highlight/data_language_json.cpp new file mode 100644 index 00000000000..224a2630a02 --- /dev/null +++ b/yql/essentials/sql/v1/highlight/data_language_json.cpp @@ -0,0 +1,34 @@ +#include "data_language_json.h" + +#include +#include + +namespace NSQLHighlight { + +TVector LoadTypes() { + TString resource = NResource::Find("types.json"); + NJson::TJsonValue json = NJson::ReadJsonFastTree(resource); + + TVector types; + for (const NJson::TJsonValue& value : json.GetArraySafe()) { + types.emplace_back(value["name"].GetStringSafe()); + } + return types; +} + +TVector LoadHints() { + TString resource = NResource::Find("statements_opensource.json"); + NJson::TJsonValue json = NJson::ReadJsonFastTree(resource); + + TVector hints; + for (const auto& [statement, services] : json.GetMapSafe()) { + for (const auto& [service, kinds] : services.GetMapSafe()) { + for (const auto& hint : kinds["hints"].GetArraySafe()) { + hints.emplace_back(hint["name"].GetStringSafe()); + } + } + } + return hints; +} + +} // namespace NSQLHighlight diff --git a/yql/essentials/sql/v1/highlight/data_language_json.h b/yql/essentials/sql/v1/highlight/data_language_json.h new file mode 100644 index 00000000000..1e2a7fdb9aa --- /dev/null +++ b/yql/essentials/sql/v1/highlight/data_language_json.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include + +namespace NSQLHighlight { + +TVector LoadTypes(); + +TVector LoadHints(); + +} // namespace NSQLHighlight diff --git a/yql/essentials/sql/v1/highlight/sql_highlight.cpp b/yql/essentials/sql/v1/highlight/sql_highlight.cpp index 3f17934cef4..9ad8c6b383b 100644 --- a/yql/essentials/sql/v1/highlight/sql_highlight.cpp +++ b/yql/essentials/sql/v1/highlight/sql_highlight.cpp @@ -1,10 +1,11 @@ #include "sql_highlight.h" +#include "data_language_json.h" + #include #include -#include #include #include @@ -104,6 +105,11 @@ TUnit MakeUnit(Syntax& s) { template <> TUnit MakeUnit(Syntax& s) { + TVector hints; + for (const TString& type : LoadHints()) { + hints.emplace_back(CaseInsensitive(type)); + } + return { .Kind = EUnitKind::OptionIdentifier, .Patterns = { @@ -113,25 +119,16 @@ TUnit MakeUnit(Syntax& s) { .Before = TStringBuilder() << "PRAGMA" << s.Get("WS"), .IsCaseInsensitive = true, }, - { - .Body = s.Get("ID_PLAIN"), - .Before = TStringBuilder() << "WITH" << s.Get("WS"), - .IsCaseInsensitive = true, - }, - { - .Body = s.Get("ID_PLAIN"), - .After = " ?" + s.Get("EQUALS"), - .IsCaseInsensitive = true, - }}, + {Merged(std::move(hints))}, + }, }; } template <> TUnit MakeUnit(Syntax& s) { TVector types; - NJson::TJsonValue json = NJson::ReadJsonFastTree(NResource::Find("types.json")); - for (const NJson::TJsonValue& value : json.GetArraySafe()) { - types.emplace_back(CaseInsensitive(value["name"].GetStringSafe())); + for (const TString& type : LoadTypes()) { + types.emplace_back(CaseInsensitive(type)); } return { diff --git a/yql/essentials/sql/v1/highlight/ya.make b/yql/essentials/sql/v1/highlight/ya.make index 103f1908aa0..d6ede67108f 100644 --- a/yql/essentials/sql/v1/highlight/ya.make +++ b/yql/essentials/sql/v1/highlight/ya.make @@ -1,6 +1,7 @@ LIBRARY() SRCS( + data_language_json.cpp sql_highlight_json.cpp sql_highlight.cpp sql_highlighter.cpp @@ -16,6 +17,7 @@ PEERDIR( RESOURCE( yql/essentials/sql/v1/highlight/ut/suite.json suite.json yql/essentials/data/language/types.json types.json + yql/essentials/data/language/statements_opensource.json statements_opensource.json ) END() -- cgit v1.3