JintTemplateLiteralExpression.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System.Text;
  2. using Jint.Native;
  3. namespace Jint.Runtime.Interpreter.Expressions;
  4. internal sealed class JintTemplateLiteralExpression : JintExpression
  5. {
  6. internal readonly TemplateLiteral _templateLiteralExpression;
  7. internal JintExpression[] _expressions = Array.Empty<JintExpression>();
  8. private bool _initialized;
  9. public JintTemplateLiteralExpression(TemplateLiteral expression) : base(expression)
  10. {
  11. _templateLiteralExpression = expression;
  12. }
  13. private void Initialize()
  14. {
  15. DoInitialize();
  16. }
  17. internal void DoInitialize()
  18. {
  19. ref readonly var expressions = ref _templateLiteralExpression.Expressions;
  20. _expressions = new JintExpression[expressions.Count];
  21. for (var i = 0; i < expressions.Count; i++)
  22. {
  23. _expressions[i] = Build(expressions[i]);
  24. }
  25. _initialized = true;
  26. }
  27. protected override object EvaluateInternal(EvaluationContext context)
  28. {
  29. if (!_initialized)
  30. {
  31. Initialize();
  32. _initialized = true;
  33. }
  34. using var sb = new ValueStringBuilder();
  35. ref readonly var elements = ref _templateLiteralExpression.Quasis;
  36. for (var i = 0; i < elements.Count; i++)
  37. {
  38. var quasi = elements[i];
  39. sb.Append(quasi.Value.Cooked);
  40. if (i < _expressions.Length)
  41. {
  42. var value = _expressions[i].GetValue(context);
  43. sb.Append(TypeConverter.ToString(value));
  44. }
  45. }
  46. return JsString.Create(sb.ToString());
  47. }
  48. }