2
0

JintTemplateLiteralExpression.cs 1.8 KB

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