From 0e8a9d9de3dac6cf00e265a5e3f7461615099e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Lavu=C5=A1?= Date: Wed, 3 Feb 2021 12:32:15 +0100 Subject: [PATCH 1/2] feat: add iteration atom node * add iteration atom node * rename statement condition to condition atom node * add iteration to call statement node * add condition and iteration to inline call node --- CHANGELOG.md | 8 ++++++++ src/interfaces/ast/map-ast.ts | 32 +++++++++++++++++++++-------- src/interfaces/ast/map-ast.utils.ts | 15 ++++++++++---- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17ffc3c..c1bf71d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ ## [Unreleased] +### Added +* Added `IterationAtomNode` +* Added `IterationAtomNode` to `CallStatementNode` and `InlineCallNode` +* Added `ConditionAtomNode` to `InlineCallNode` + +### Changed +* Renamed `StatementConditionNode` to `ConditionAtomNode` + ## [0.0.20] - 2021-01-11 ### Added diff --git a/src/interfaces/ast/map-ast.ts b/src/interfaces/ast/map-ast.ts index 659958d..1c6cc93 100644 --- a/src/interfaces/ast/map-ast.ts +++ b/src/interfaces/ast/map-ast.ts @@ -7,7 +7,8 @@ export type MapNodeKind = | 'JessieExpression' | 'InlineCall' | 'Assignment' - | 'StatementCondition' + | 'ConditionAtom' + | 'IterationAtom' // STATEMENTS | 'SetStatement' | 'OutcomeStatement' @@ -55,10 +56,12 @@ export interface JessieExpressionNode extends MapASTNodeBase { } /** - * Inline call, can appear on rhs in assignment. + * Inline call, can appear on rhs in assignment: `call (<...args>) ` */ export interface InlineCallNode extends MapASTNodeBase { kind: 'InlineCall'; + condition?: ConditionAtomNode; + iteration?: IterationAtomNode; operationName: string; arguments: AssignmentNode[]; } @@ -81,11 +84,20 @@ export interface AssignmentNode extends MapASTNodeBase { /** * Statement condition atom: `if ()` */ -export interface StatementConditionNode extends MapASTNodeBase { - kind: 'StatementCondition'; +export interface ConditionAtomNode extends MapASTNodeBase { + kind: 'ConditionAtom'; expression: JessieExpressionNode; } +/** + * Iteration atom: `foreach ( of )` + */ +export interface IterationAtomNode extends MapASTNodeBase { + kind: 'IterationAtom'; + iterationVariable: string; + iterable: JessieExpressionNode; +} + // STATEMENTS /** @@ -95,7 +107,7 @@ export interface StatementConditionNode extends MapASTNodeBase { */ export interface OutcomeStatementNode extends MapASTNodeBase { kind: 'OutcomeStatement'; - condition?: StatementConditionNode; + condition?: ConditionAtomNode; isError: boolean; terminateFlow: boolean; value: LiteralNode; @@ -108,16 +120,17 @@ export interface OutcomeStatementNode extends MapASTNodeBase { */ export interface SetStatementNode extends MapASTNodeBase { kind: 'SetStatement'; - condition?: StatementConditionNode; + condition?: ConditionAtomNode; assignments: AssignmentNode[]; } /** - * Call statement, possibly with a condition: `call (<...args>) { <...statements> }` + * Call statement, possibly with a condition and iteration: `call (<...args>) { <...statements> }` */ export interface CallStatementNode extends MapASTNodeBase { kind: 'CallStatement'; - condition?: StatementConditionNode; + iteration?: IterationAtomNode; + condition?: ConditionAtomNode; operationName: string; arguments: AssignmentNode[]; statements: (SetStatementNode | OutcomeStatementNode)[]; @@ -211,7 +224,8 @@ export type MapASTNode = | ObjectLiteralNode | JessieExpressionNode | AssignmentNode - | StatementConditionNode + | ConditionAtomNode + | IterationAtomNode | SetStatementNode | OutcomeStatementNode | CallStatementNode diff --git a/src/interfaces/ast/map-ast.utils.ts b/src/interfaces/ast/map-ast.utils.ts index 5469bad..a7e1d38 100644 --- a/src/interfaces/ast/map-ast.utils.ts +++ b/src/interfaces/ast/map-ast.utils.ts @@ -15,7 +15,8 @@ import { OutcomeStatementNode, PrimitiveLiteralNode, SetStatementNode, - StatementConditionNode, + ConditionAtomNode, + IterationAtomNode } from './map-ast'; export function isOutcomeStatementNode( @@ -70,10 +71,16 @@ export function isAssignmentNode(node: MapASTNode): node is AssignmentNode { return node.kind === 'Assignment'; } -export function isStatementConditionNode( +export function isConditionAtomNode( node: MapASTNode -): node is StatementConditionNode { - return node.kind === 'StatementCondition'; +): node is ConditionAtomNode { + return node.kind === 'ConditionAtom'; +} + +export function isIterationAtomNode( + node: MapASTNode +): node is IterationAtomNode { + return node.kind === 'IterationAtom'; } export function isCallStatementNode( From 5f7a8557812bd08996c1b2349153d832f192bbd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Lavu=C5=A1?= Date: Wed, 3 Feb 2021 12:34:48 +0100 Subject: [PATCH 2/2] chore: lint --- src/interfaces/ast/map-ast.utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/interfaces/ast/map-ast.utils.ts b/src/interfaces/ast/map-ast.utils.ts index a7e1d38..cbcdca4 100644 --- a/src/interfaces/ast/map-ast.utils.ts +++ b/src/interfaces/ast/map-ast.utils.ts @@ -1,10 +1,12 @@ import { AssignmentNode, CallStatementNode, + ConditionAtomNode, HttpCallStatementNode, HttpRequestNode, HttpResponseHandlerNode, InlineCallNode, + IterationAtomNode, JessieExpressionNode, MapASTNode, MapDefinitionNode, @@ -15,8 +17,6 @@ import { OutcomeStatementNode, PrimitiveLiteralNode, SetStatementNode, - ConditionAtomNode, - IterationAtomNode } from './map-ast'; export function isOutcomeStatementNode(