JintTemplateLiteralExpression.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Text;
  2. using Esprima.Ast;
  3. using Jint.Native;
  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. private bool _initialized;
  10. public JintTemplateLiteralExpression(TemplateLiteral expression) : base(expression)
  11. {
  12. _templateLiteralExpression = expression;
  13. }
  14. private void Initialize()
  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. protected override object EvaluateInternal(EvaluationContext context)
  29. {
  30. if (!_initialized)
  31. {
  32. Initialize();
  33. _initialized = true;
  34. }
  35. using var sb = new ValueStringBuilder();
  36. ref readonly var elements = ref _templateLiteralExpression.Quasis;
  37. for (var i = 0; i < elements.Count; i++)
  38. {
  39. var quasi = elements[i];
  40. sb.Append(quasi.Value.Cooked);
  41. if (i < _expressions.Length)
  42. {
  43. var value = _expressions[i].GetValue(context);
  44. sb.Append(TypeConverter.ToString(value));
  45. }
  46. }
  47. return JsString.Create(sb.ToString());
  48. }
  49. }