diff options
author | vvvv <[email protected]> | 2024-11-06 10:40:15 +0300 |
---|---|---|
committer | vvvv <[email protected]> | 2024-11-06 10:50:39 +0300 |
commit | 8cf98f8169af124576399a29eac2bc2a691124e3 (patch) | |
tree | 54260d85e28822402e0d17d1e840ccfb62b33b61 /yql/essentials/ast/yql_expr_builder.h | |
parent | 13cc9ffc62224711fd2923aed53525fc7d1838f8 (diff) |
Moved yql/ast YQL-19206
init
commit_hash:a6a63582073784b9318cc04ffcc1e212f3df703b
Diffstat (limited to 'yql/essentials/ast/yql_expr_builder.h')
-rw-r--r-- | yql/essentials/ast/yql_expr_builder.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/yql/essentials/ast/yql_expr_builder.h b/yql/essentials/ast/yql_expr_builder.h new file mode 100644 index 00000000000..db816359eb9 --- /dev/null +++ b/yql/essentials/ast/yql_expr_builder.h @@ -0,0 +1,175 @@ +#pragma once + +#include "yql_ast.h" +#include "yql_errors.h" +#include "yql_pos_handle.h" + +#include <functional> + +namespace NYql { + +struct TExprContext; +class TExprNode; +typedef TIntrusivePtr<TExprNode> TExprNodePtr; +typedef std::vector<TExprNodePtr> TExprNodeList; + +class TExprNodeReplaceBuilder; + +class TExprNodeBuilder { +friend class TExprNodeReplaceBuilder; +public: + typedef std::function<TExprNodePtr(const TStringBuf&)> ExtArgsFuncType; +public: + TExprNodeBuilder(TPositionHandle pos, TExprContext& ctx); + TExprNodeBuilder(TPositionHandle pos, TExprContext& ctx, ExtArgsFuncType extArgsFunc); + TExprNodePtr Build(); + TExprNodeBuilder& Seal(); + TExprNodeReplaceBuilder& Done(); + + // Indexed version of methods must be used inside of Callable or List, otherwise + // non-indexed version must be used (at root or as lambda body) + TExprNodeBuilder& Atom(ui32 index, TPositionHandle pos, const TStringBuf& content, ui32 flags = TNodeFlags::ArbitraryContent); + TExprNodeBuilder& Atom(TPositionHandle pos, const TStringBuf& content, ui32 flags = TNodeFlags::ArbitraryContent); + TExprNodeBuilder& Atom(ui32 index, const TStringBuf& content, ui32 flags = TNodeFlags::ArbitraryContent); + TExprNodeBuilder& Atom(const TStringBuf& content, ui32 flags = TNodeFlags::ArbitraryContent); + TExprNodeBuilder& Atom(ui32 index, ui32 literalIndexValue); + TExprNodeBuilder& Atom(ui32 literalIndexValue); + + TExprNodeBuilder List(ui32 index, TPositionHandle pos); + TExprNodeBuilder List(TPositionHandle pos); + TExprNodeBuilder List(ui32 index); + TExprNodeBuilder List(); + + 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); + + TExprNodeBuilder Callable(ui32 index, TPositionHandle pos, const TStringBuf& content); + TExprNodeBuilder Callable(TPositionHandle pos, const TStringBuf& content); + TExprNodeBuilder Callable(ui32 index, const TStringBuf& content); + TExprNodeBuilder Callable(const TStringBuf& content); + + TExprNodeBuilder& World(ui32 index, TPositionHandle pos); + TExprNodeBuilder& World(TPositionHandle pos); + TExprNodeBuilder& World(ui32 index); + TExprNodeBuilder& World(); + + TExprNodeBuilder Lambda(ui32 index, TPositionHandle pos); + TExprNodeBuilder Lambda(TPositionHandle pos); + TExprNodeBuilder Lambda(ui32 index); + TExprNodeBuilder Lambda(); + + TExprNodeBuilder& Param(TPositionHandle pos, const TStringBuf& name); + TExprNodeBuilder& Param(const TStringBuf& name); + TExprNodeBuilder& Params(const TStringBuf& name, ui32 width); + + TExprNodeBuilder& Arg(ui32 index, const TStringBuf& name); + TExprNodeBuilder& Arg(const TStringBuf& name); + TExprNodeBuilder& Arg(ui32 index, const TStringBuf& name, ui32 toIndex); + TExprNodeBuilder& Arg(const TStringBuf& name, ui32 toIndex); + TExprNodeBuilder& Arg(const TExprNodePtr& arg); + + TExprNodeBuilder& Args(ui32 index, const TStringBuf& name, ui32 toIndex); + TExprNodeBuilder& Args(const TStringBuf& name, ui32 toIndex); + + TExprNodeReplaceBuilder Apply(ui32 index, const TExprNode& lambda); + TExprNodeReplaceBuilder Apply(ui32 index, const TExprNodePtr& lambda); + TExprNodeReplaceBuilder Apply(const TExprNode& lambda); + TExprNodeReplaceBuilder Apply(const TExprNodePtr& lambda); + TExprNodeReplaceBuilder ApplyPartial(ui32 index, TExprNodePtr args, TExprNodePtr body); + TExprNodeReplaceBuilder ApplyPartial(ui32 index, TExprNodePtr args, TExprNodeList body); + TExprNodeReplaceBuilder ApplyPartial(TExprNodePtr args, TExprNodePtr body); + TExprNodeReplaceBuilder ApplyPartial(TExprNodePtr args, TExprNodeList body); + + template <typename TFunc> + TExprNodeBuilder& Do(const TFunc& func) { + return func(*this); + } + +private: + TExprNodeBuilder(TPositionHandle pos, TExprNodeBuilder* parent, const TExprNodePtr& container); + TExprNodeBuilder(TPositionHandle pos, TExprNodeReplaceBuilder* parentReplacer); + TExprNodePtr FindArgument(const TStringBuf& name); + +private: + TExprContext& Ctx; + TExprNodeBuilder* Parent; + TExprNodeReplaceBuilder* ParentReplacer; + TExprNodePtr Container; + TPositionHandle Pos; + TExprNodePtr CurrentNode; + ExtArgsFuncType ExtArgsFunc; +}; + +namespace NNodes { + template<typename TParent, typename TNode> + class TNodeBuilder; +} + +class TExprNodeReplaceBuilder { +friend class TExprNodeBuilder; +private: + struct TBuildAdapter { + typedef TExprNodeReplaceBuilder& ResultType; + + TBuildAdapter(TExprNodeReplaceBuilder& builder) + : Builder(builder) {} + + ResultType Value() { + return Builder; + } + + TExprNodeReplaceBuilder& Builder; + }; + +public: + TExprNodeReplaceBuilder(TExprNodeBuilder* owner, TExprNodePtr container, const TExprNode& lambda); + TExprNodeReplaceBuilder(TExprNodeBuilder* owner, TExprNodePtr container, TExprNodePtr&& args, TExprNodePtr&& body); + TExprNodeReplaceBuilder(TExprNodeBuilder* owner, TExprNodePtr container, TExprNodePtr&& args, TExprNodeList&& body); + TExprNodeReplaceBuilder& With(ui32 argIndex, const TStringBuf& toName); + TExprNodeReplaceBuilder& With(ui32 argIndex, const TStringBuf& toName, ui32 toIndex); + TExprNodeReplaceBuilder& With(ui32 argIndex, TExprNodePtr toNode); + TExprNodeReplaceBuilder& With(const TStringBuf& toName); + TExprNodeReplaceBuilder& With(const TStringBuf& toName, ui32 toIndex); + TExprNodeReplaceBuilder& WithNode(const TExprNode& fromNode, TExprNodePtr&& toNode); + TExprNodeReplaceBuilder& WithNode(const TExprNode& fromNode, const TStringBuf& toName); + TExprNodeBuilder With(ui32 argIndex); + TExprNodeBuilder WithNode(TExprNodePtr&& fromNode); + + template<typename TNode> + NNodes::TNodeBuilder<TBuildAdapter, TNode> With(ui32 argIndex) { + TBuildAdapter adapter(*this); + + NNodes::TNodeBuilder<TBuildAdapter, TNode> builder(Owner->Ctx, Owner->Pos, + [adapter, argIndex](const TNode& node) mutable -> TBuildAdapter& { + adapter.Builder = adapter.Builder.With(argIndex, node.Get()); + return adapter; + }, + [adapter] (const TStringBuf& argName) { + return adapter.Builder.Owner->FindArgument(argName); + }); + + return builder; + } + + TExprNodeBuilder& Seal(); + + template <typename TFunc> + TExprNodeReplaceBuilder& Do(const TFunc& func) { + return func(*this); + } + +private: + TExprNodeBuilder* Owner; + TExprNodePtr Container; + TExprNodePtr Args; + TExprNodeList Body; + ui32 CurrentIndex; + TExprNodePtr CurrentNode; +}; + +} // namespace NYql + |