diff options
| author | atarasov5 <[email protected]> | 2025-07-08 08:22:31 +0300 |
|---|---|---|
| committer | atarasov5 <[email protected]> | 2025-07-08 08:39:34 +0300 |
| commit | 9ea5796fb72dfc72db92cc205a6ef5b9099dfbe0 (patch) | |
| tree | 7463b181b34de9f047627eb52a2f2ef812a4af8d /yql/essentials/ast | |
| parent | 4985bee7f78371eae4f89d2d010143ab71912a8e (diff) | |
YQL-19536: Block ifpresent
commit_hash:15146ac1817e0abc0483b2c138207daf3b63fdd5
Diffstat (limited to 'yql/essentials/ast')
| -rw-r--r-- | yql/essentials/ast/yql_expr.h | 3 | ||||
| -rw-r--r-- | yql/essentials/ast/yql_expr_builder.cpp | 11 | ||||
| -rw-r--r-- | yql/essentials/ast/yql_expr_builder.h | 3 |
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); |
