Example #1
0
        public override Value VisitConditionalExpression([NotNull] ConditionalExpressionContext context)
        {
            EmitLocation(context);
            var condition = context.Condition.Accept(this);

            if (condition == null)
            {
                return(null);
            }

            var condBool = InstructionBuilder.Compare(RealPredicate.OrderedAndNotEqual, condition, Context.CreateConstant(0.0))
                           .RegisterName("ifcond");

            var function = InstructionBuilder.InsertBlock.ContainingFunction;

            var thenBlock     = Context.CreateBasicBlock("then", function);
            var elseBlock     = Context.CreateBasicBlock("else");
            var phiMergeBlock = Context.CreateBasicBlock("ifcont");

            InstructionBuilder.Branch(condBool, thenBlock, elseBlock);

            // generate then block
            InstructionBuilder.PositionAtEnd(thenBlock);
            var thenValue = context.ThenExpression.Accept(this);

            if (thenValue == null)
            {
                return(null);
            }

            InstructionBuilder.Branch(phiMergeBlock);

            // capture the insert in case generating thenExpression adds new blocks
            thenBlock = InstructionBuilder.InsertBlock;

            // generate else block
            function.BasicBlocks.Add(elseBlock);
            InstructionBuilder.PositionAtEnd(elseBlock);
            var elseValue = context.ElseExpression.Accept(this);

            if (elseValue == null)
            {
                return(null);
            }

            InstructionBuilder.Branch(phiMergeBlock);
            elseBlock = InstructionBuilder.InsertBlock;

            // generate PHI merge block
            function.BasicBlocks.Add(phiMergeBlock);
            InstructionBuilder.PositionAtEnd(phiMergeBlock);
            var phiNode = InstructionBuilder.PhiNode(function.Context.DoubleType)
                          .RegisterName("iftmp");

            phiNode.AddIncoming(thenValue, thenBlock);
            phiNode.AddIncoming(elseValue, elseBlock);
            return(phiNode);
        }
Example #2
0
        private static void CheckConditional(ConditionalExpressionContext c, string returnType, Action <CompileException, Context> onError, SymbolTable table)
        {
            string type = GetExpressionType(c.Children.First.Value, onError, table);

            if (type != "bool")
            {
                onError(new CompileException($"Type of conditional expression in {c.Statement} statement is not bool"), c);
            }
            CheckScopeBody(c.Children.First.Next.Value, returnType, onError, table);
        }
Example #3
0
        public override IAstNode VisitConditionalExpression([NotNull] ConditionalExpressionContext context)
        {
            var expressionSpan = context.GetSourceSpan( );

            // compiler generated result variable supports building conditional
            // expressions without the need for SSA form using mutable variables
            // The result is assigned a value from both sides of the branch. In
            // pure SSA form this isn't needed as a PHI node would be used instead.
            var retVal = new ConditionalExpression(expressionSpan
                                                   , ( IExpression )context.Condition.Accept(this)
                                                   , ( IExpression )context.ThenExpression.Accept(this)
                                                   , ( IExpression )context.ElseExpression.Accept(this)
                                                   , new LocalVariableDeclaration(expressionSpan, $"$ifresult${LocalVarIndex++}", null, true)
                                                   );

            Push(retVal.ResultVariable);
            return(retVal);
        }
        public async Task <ICollection <MessageToken> > Execute(BPMNExecutionContext executionContext, UserTask userTask, CancellationToken token)
        {
            var pointer  = executionContext.Pointer;
            var instance = executionContext.Instance.GetInstance(pointer.InstanceFlowNodeId);

            if (!instance.Metadata.ContainsKey(HUMANTASK_INSTANCE_ID_NAME))
            {
                using (var httpClient = _httpClientFactory.Build())
                {
                    var operationParameters = new JObject
                    {
                        { "nameIdentifier", executionContext.Instance.NameIdentifier }
                    };
                    var ctx = new ConditionalExpressionContext(pointer.Incoming);
                    if (userTask.InputParameters != null && userTask.InputParameters.Any())
                    {
                        foreach (var inputParameter in userTask.InputParameters)
                        {
                            if (string.IsNullOrWhiteSpace(inputParameter.Value))
                            {
                                continue;
                            }

                            var value = ExpressionParser.GetString(inputParameter.Value, ctx);
                            operationParameters.Add(inputParameter.Key, value);
                        }
                    }

                    var jArr = new JArray();
                    var link = _options.CallbackUrl.Replace("{id}", executionContext.Instance.AggregateId);
                    link = link.Replace("{eltId}", pointer.InstanceFlowNodeId);
                    jArr.Add(link);
                    var tokenResponse = await httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
                    {
                        Address      = _options.OAuthTokenEndpoint,
                        ClientId     = _options.ClientId,
                        ClientSecret = _options.ClientSecret,
                        Scope        = "create_humantaskinstance"
                    }, token);

                    if (tokenResponse.IsError)
                    {
                        throw new BPMNProcessorException(tokenResponse.Error);
                    }

                    var obj = new JObject
                    {
                        { "humanTaskName", userTask.HumanTaskName },
                        { "operationParameters", operationParameters },
                        { "callbackUrls", jArr }
                    };
                    var content = new StringContent(obj.ToString(), Encoding.UTF8, "application/json");
                    var request = new HttpRequestMessage
                    {
                        Method     = HttpMethod.Post,
                        Content    = content,
                        RequestUri = new Uri($"{_options.WSHumanTaskAPI}/humantaskinstances")
                    };
                    request.Headers.Add("Authorization", $"Bearer {tokenResponse.AccessToken}");
                    var httpResult = await httpClient.SendAsync(request, token);

                    var str = await httpResult.Content.ReadAsStringAsync();

                    var o = JObject.Parse(str);
                    var humanTaskInstancId = o["id"].ToString();
                    executionContext.Instance.UpdateMetadata(pointer.InstanceFlowNodeId, HUMANTASK_INSTANCE_ID_NAME, humanTaskInstancId);
                    throw new FlowNodeInstanceBlockedException();
                }
            }

            var stateTransition = executionContext.Instance.StateTransitions.FirstOrDefault(_ => _.State == "COMPLETED" && _.FlowNodeInstanceId == pointer.InstanceFlowNodeId);

            if (stateTransition == null)
            {
                throw new FlowNodeInstanceBlockedException();
            }

            var result = new List <MessageToken>();

            if (stateTransition.Content == null)
            {
                result.Add(MessageToken.EmptyMessage());
            }
            else
            {
                result.Add(MessageToken.NewMessage(userTask.Id, stateTransition.Content));
            }

            return(result);
        }
Example #5
0
	public ConditionalExpressionContext conditionalExpression() {
		ConditionalExpressionContext _localctx = new ConditionalExpressionContext(Context, State);
		EnterRule(_localctx, 44, RULE_conditionalExpression);
		try {
			EnterOuterAlt(_localctx, 1);
			{
			State = 307; logicalOrExpression(0);
			State = 313;
			switch ( Interpreter.AdaptivePredict(TokenStream,29,Context) ) {
			case 1:
				{
				State = 308; Match(Question);
				State = 309; expression();
				State = 310; Match(Colon);
				State = 311; conditionalExpression();
				}
				break;
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			ErrorHandler.ReportError(this, re);
			ErrorHandler.Recover(this, re);
		}
		finally {
			ExitRule();
		}
		return _localctx;
	}