public bool WriteRefError(TextWriter writer, IInlineExpression exp) { AddError(ResolverFluentError.Reference(exp)); try { writer.Write('{'); exp.WriteError(writer); writer.Write('}'); return(true); } catch (Exception) { return(false); } }
public void Track(TextWriter writer, Pattern pattern, IInlineExpression exp) { if (_travelled.Contains(pattern)) { AddError(ResolverFluentError.Cyclic(pattern)); writer.Write('{'); exp.WriteError(writer); writer.Write('}'); } else { _travelled.Add(pattern); pattern.Write(writer, this); PopTraveled(); } }
private static void ProcessMsgRef(IInlineExpression self, TextWriter writer, Scope scope, MessageReference msgRef) { var id = msgRef.Id; var attribute = msgRef.Attribute; if (scope.Bundle.TryGetAstMessage(id.Name.ToString(), out var msg)) { if (attribute != null) { var found = msg.Attributes.Find(e => e.Id.Equals(attribute)); if (found != null) { scope.Track(writer, found.Value, self); } else { scope.WriteRefError(writer, self); return; } } else { if (msg.Value != null) { scope.Track(writer, msg.Value, self); } else { scope.AddError(ResolverFluentError.NoValue(id.Name)); writer.Write('{'); self.WriteError(writer); writer.Write('}'); } } } else { scope.WriteRefError(writer, self); } }
private static void Write(this IInlineExpression self, TextWriter writer, Scope scope) { if (self is TextLiteral textLiteral) { UnicodeUtil.WriteUnescapedUnicode(textLiteral.Value, writer); return; } if (self is NumberLiteral numberLiteral) { var value = FluentNumber.TryNumber(numberLiteral.Value.Span); value.Write(writer, scope); return; } if (self is MessageReference msgRef) { ProcessMsgRef(self, writer, scope, msgRef); return; } if (self is TermReference termRef) { var res = scope.GetArguments(termRef.Arguments); scope.SetLocalArgs(res.Named); if (scope.Bundle.TryGetAstTerm(termRef.Id.ToString(), out var term)) { var attrName = termRef.Attribute; var attr = term .Attributes .Find(a => a.Id.Equals(attrName)); scope.Track(writer, attr != null ? attr.Value : term.Value, self); } else { scope.WriteRefError(writer, self); } scope.SetLocalArgs(null); return; } if (self is FunctionReference funcRef) { var(resolvedPosArgs, resolvedNamedArgs) = scope.GetArguments(funcRef.Arguments); if (scope.Bundle.TryGetFunction(funcRef.Id, out var func)) { var result = func.Function(resolvedPosArgs, resolvedNamedArgs); if (result.IsError()) { self.WriteError(writer); } else { writer.Write(result.AsString()); } } else { scope.WriteRefError(writer, self); } } if (self is VariableReference varRef) { var id = varRef.Id; var args = scope.LocalArgs ?? scope.Args; if (args != null && args.TryGetValue(id.ToString(), out var arg)) { arg.Write(writer, scope); } else { if (scope.LocalArgs == null) { scope.AddError(ResolverFluentError.Reference(self)); } writer.Write('{'); self.WriteError(writer); writer.Write('}'); } } if (self is Placeable placeable) { placeable.Expression.TryWrite(writer, scope); } }