/// <summary> /// Initializes a new instance of the <see cref="Template"/> class. /// </summary> /// <param name="templateName">Template name without parameters.</param> /// <param name="parameters">Parameter list.</param> /// <param name="templateBody">Template content.</param> /// <param name="sourceRange">Source range of template.</param> internal Template( string templateName, List <string> parameters, string templateBody, SourceRange sourceRange) { this.Name = templateName ?? string.Empty; this.Parameters = parameters ?? new List <string>(); this.Body = templateBody ?? string.Empty; this.SourceRange = sourceRange; }
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); }
/// <inheritdoc/> public override object VisitImportDefinition([NotNull] LGFileParser.ImportDefinitionContext context) { var importStr = context.IMPORT().GetText(); var matchResult = ImportRegex.Match(importStr); if (matchResult.Success && matchResult.Groups.Count == 3) { var description = matchResult.Groups[1].Value?.Trim(); var id = matchResult.Groups[2].Value?.Trim(); var sourceRange = new SourceRange(context, _templates.Source); var import = new TemplateImport(description, id, sourceRange); _templates.Imports.Add(import); } return(null); }
/// <inheritdoc/> public override object VisitImportDefinition([NotNull] LGFileParser.ImportDefinitionContext context) { var importStr = context.IMPORT().GetText(); var matchResult = ImportRegex.Match(importStr); if (!matchResult.Success || (matchResult.Groups.Count != 3 && matchResult.Groups.Count != 4)) { _templates.Diagnostics.Add(BuildTemplatesDiagnostic(TemplateErrors.ImportFormatError, context)); return(null); } var description = matchResult.Groups[1].Value?.Trim(); var id = matchResult.Groups[2].Value?.Trim(); var sourceRange = new SourceRange(context, _templates.Source); var import = new TemplateImport(description, id, sourceRange); if (matchResult.Groups.Count == 4) { var asAlias = matchResult.Groups[3].Value?.Trim(); if (!string.IsNullOrWhiteSpace(asAlias)) { var asAliasArray = Regex.Split(asAlias, @"\s+"); if (asAliasArray.Length != 2 || asAliasArray[0] != "as") { _templates.Diagnostics.Add(BuildTemplatesDiagnostic(TemplateErrors.ImportFormatError, context)); return(null); } else { import.Alias = asAliasArray[1].Trim(); } } } _templates.Imports.Add(import); return(null); }
/// <summary> /// Initializes a new instance of the <see cref="ExpressionRef"/> class. /// </summary> /// <param name="expression">Expression string.</param> /// <param name="sourceRange">Expression source range.</param> public ExpressionRef(string expression, SourceRange sourceRange) { this.Expression = expression; this.SourceRange = sourceRange; }