JintTemplateLiteralExpression.cs 1.6 KB

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