示例#1
0
        private (object value, string error) EvalByAdaptiveExpression(string exp, object scope, ParserRuleContext expressionContext)
        {
            var currentTemplate = CurrentTemplate();

            if (currentTemplate != null)
            {
                var source = currentTemplate.SourceRange.Source;
                if (expressionContext != null && _lgOptions.OnEvent != null)
                {
                    var lineOffset    = currentTemplate.SourceRange.Range.Start.Line;
                    var sourceRange   = new SourceRange(expressionContext, source, lineOffset);
                    var expressionRef = new ExpressionRef(exp, sourceRange);

                    var expression = currentTemplate.Expressions.FirstOrDefault(u => u.GetId() == expressionRef.GetId());
                    if (expression != null)
                    {
                        _lgOptions.OnEvent(expression, new BeginExpressionEvaluationArgs {
                            Source = source, Expression = exp
                        });
                    }
                }
            }

            var parse = this.ExpressionParser.Parse(exp);
            var opt   = new Options
            {
                Locale           = _lgOptions.Locale,
                NullSubstitution = _lgOptions.NullSubstitution
            };
            var result = parse.TryEvaluate(scope, opt);

            if (currentTemplate != null && _lgOptions.OnEvent != null)
            {
                string text;
                if (string.IsNullOrEmpty(result.error))
                {
                    text = $"Evaluate expression '{exp}' get result: {result.value}";
                }
                else
                {
                    text = $"Evaluate expression '{exp}' get error: {result.error}";
                }

                _lgOptions.OnEvent(currentTemplate, new MessageArgs {
                    Source = currentTemplate.SourceRange.Source, Text = text
                });
            }

            return(result);
        }
示例#2
0
            private void FillInExpression(ParserRuleContext expressionContext)
            {
                if (expressionContext == null)
                {
                    return;
                }

                var exp = expressionContext.GetText().TrimExpression();

                var lineOffset    = this._template.SourceRange.Range.Start.Line;
                var sourceRange   = new SourceRange(expressionContext, _template.SourceRange.Source, lineOffset);
                var expressionRef = new ExpressionRef(exp, sourceRange);

                _template.Expressions.Add(expressionRef);
            }