/// <summary> /// state : /// STATE StateNameDefinition comment? /// (ON (ENTER STATE | EXIT STATE | ENTER AND EXIT STATE) execute)* /// on_event_statement* /// ; /// </summary> /// <param name="context"></param> /// <returns></returns> public override object VisitState([NotNull] WorkflowParser.StateContext context) { return(base.VisitState(context)); }
/// <summary> /// Visit a parse tree produced by <see cref="WorkflowParser.state"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitState([NotNull] WorkflowParser.StateContext context) { return(VisitChildren(context)); }
/// <summary> /// state : /// STATE key comment? /// (ON (ENTER STATE | EXIT STATE | ENTER AND EXIT STATE) execute)* /// on_event_statement* /// ; /// </summary> /// <param name="context"></param> /// <returns></returns> public override object VisitState([NotNull] WorkflowParser.StateContext context) { string comment = string.Empty; var c = context.comment(); if (c != null) { comment = (string)Visit(c); } StateConfig state = new StateConfig() { Name = (string)VisitKey(context.key()), Label = comment, }; var executes = context.execute(); if (executes != null) { foreach (var execute in executes) { var e = ((bool, bool, ResultRuleConfig))VisitExecute(execute); if (e.Item1) { state.IncomingRules.Add(e.Item3); } if (e.Item2) { state.OutcomingRules.Add(e.Item3); } } } var on_event_statements = context.on_event_statement(); if (on_event_statements != null) { foreach (var on_event_statement in on_event_statements) { var e = ((IncomingEventConfig, List <(string, ResultRuleConfig)>))VisitOn_event_statement(on_event_statement); if (state.Events.TryGetValue(e.Item1.Name, out IncomingEventConfig ic)) { throw new Exceptions.DuplicatedArgumentNameMethodReferenceException($"event name {e.Item1.Name} in {state.Name}"); } state.Events.Add(e.Item1.Name, e.Item1); foreach (var item in e.Item2) { switch (item.Item1) { case "in": state.IncomingRules.Add(item.Item2); break; case "out": state.OutcomingRules.Add(item.Item2); break; default: break; } } } } return(state); }