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); }
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); }