summaryrefslogtreecommitdiffstats
path: root/yql/essentials/ast
diff options
context:
space:
mode:
authoratarasov5 <[email protected]>2025-07-08 08:22:31 +0300
committeratarasov5 <[email protected]>2025-07-08 08:39:34 +0300
commit9ea5796fb72dfc72db92cc205a6ef5b9099dfbe0 (patch)
tree7463b181b34de9f047627eb52a2f2ef812a4af8d /yql/essentials/ast
parent4985bee7f78371eae4f89d2d010143ab71912a8e (diff)
YQL-19536: Block ifpresent
commit_hash:15146ac1817e0abc0483b2c138207daf3b63fdd5
Diffstat (limited to 'yql/essentials/ast')
-rw-r--r--yql/essentials/ast/yql_expr.h3
-rw-r--r--yql/essentials/ast/yql_expr_builder.cpp11
-rw-r--r--yql/essentials/ast/yql_expr_builder.h3
3 files changed, 17 insertions, 0 deletions
diff --git a/yql/essentials/ast/yql_expr.h b/yql/essentials/ast/yql_expr.h
index 10165414f38..a75667766b8 100644
--- a/yql/essentials/ast/yql_expr.h
+++ b/yql/essentials/ast/yql_expr.h
@@ -354,6 +354,8 @@ public:
typedef std::vector<const TTypeAnnotationNode*> TListType;
typedef std::span<const TTypeAnnotationNode*> TSpanType;
+ typedef std::span<const TTypeAnnotationNode* const> TConstSpanType;
+
protected:
template <typename T>
static ui32 CombineFlags(const T& items) {
@@ -1608,6 +1610,7 @@ public:
typedef TIntrusivePtr<TExprNode> TPtr;
typedef std::vector<TPtr> TListType;
typedef TArrayRef<const TPtr> TChildrenType;
+ typedef std::span<const TPtr> TExprNodeSpan;
struct TPtrHash : private std::hash<const TExprNode*> {
size_t operator()(const TPtr& p) const {
diff --git a/yql/essentials/ast/yql_expr_builder.cpp b/yql/essentials/ast/yql_expr_builder.cpp
index f459937be45..5289e9354dd 100644
--- a/yql/essentials/ast/yql_expr_builder.cpp
+++ b/yql/essentials/ast/yql_expr_builder.cpp
@@ -468,6 +468,17 @@ TExprNodeReplaceBuilder& TExprNodeReplaceBuilder::With(ui32 argIndex, const TStr
return With(argIndex, TString(toName) += ToString(toIndex));
}
+TExprNodeReplaceBuilder& TExprNodeReplaceBuilder::WithArguments(TExprNodeSpan nodes) {
+ Y_ENSURE(Args_, "No arguments");
+ Y_ENSURE(nodes.size() == Args_->ChildrenSize(), "Wrong arguments size");
+ TNodeOnNodeOwnedMap replaces;
+ for (size_t argIndex = 0; argIndex < nodes.size(); ++argIndex) {
+ replaces[Args_->Child(argIndex)] = nodes[argIndex];
+ }
+ Body_ = Owner_->Ctx_.ReplaceNodes(std::move(Body_), replaces);
+ return *this;
+}
+
TExprNodeReplaceBuilder& TExprNodeReplaceBuilder::WithNode(const TExprNode& fromNode, TExprNode::TPtr&& toNode) {
Body_ = Owner_->Ctx_.ReplaceNodes(std::move(Body_), {{&fromNode, std::move(toNode)}});
return *this;
diff --git a/yql/essentials/ast/yql_expr_builder.h b/yql/essentials/ast/yql_expr_builder.h
index 18f7b1daafe..23f8fec0da1 100644
--- a/yql/essentials/ast/yql_expr_builder.h
+++ b/yql/essentials/ast/yql_expr_builder.h
@@ -12,6 +12,7 @@ struct TExprContext;
class TExprNode;
typedef TIntrusivePtr<TExprNode> TExprNodePtr;
typedef std::vector<TExprNodePtr> TExprNodeList;
+typedef std::span<const TExprNodePtr> TExprNodeSpan;
class TExprNodeReplaceBuilder;
@@ -43,6 +44,7 @@ public:
TExprNodeBuilder& Add(ui32 index, TExprNodePtr&& child);
TExprNodeBuilder& Add(ui32 index, const TExprNodePtr& child);
TExprNodeBuilder& Add(TExprNodeList&& children);
+
// only for lambda bodies
TExprNodeBuilder& Set(TExprNodePtr&& body);
TExprNodeBuilder& Set(const TExprNodePtr& body);
@@ -136,6 +138,7 @@ public:
TExprNodeReplaceBuilder& With(const TStringBuf& toName, ui32 toIndex);
TExprNodeReplaceBuilder& WithNode(const TExprNode& fromNode, TExprNodePtr&& toNode);
TExprNodeReplaceBuilder& WithNode(const TExprNode& fromNode, const TStringBuf& toName);
+ TExprNodeReplaceBuilder& WithArguments(TExprNodeSpan nodes);
TExprNodeBuilder With(ui32 argIndex);
TExprNodeBuilder WithNode(TExprNodePtr&& fromNode);