JintTemplateLiteralExpression.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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;
  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(context);
  18. }
  19. internal void DoInitialize(EvaluationContext context)
  20. {
  21. var engine = context.Engine;
  22. _expressions = new JintExpression[_templateLiteralExpression.Expressions.Count];
  23. for (var i = 0; i < _templateLiteralExpression.Expressions.Count; i++)
  24. {
  25. var exp = _templateLiteralExpression.Expressions[i];
  26. _expressions[i] = Build(engine, exp);
  27. }
  28. _initialized = true;
  29. }
  30. private JsString BuildString(EvaluationContext context)
  31. {
  32. using var sb = StringBuilderPool.Rent();
  33. for (var i = 0; i < _templateLiteralExpression.Quasis.Count; i++)
  34. {
  35. var quasi = _templateLiteralExpression.Quasis[i];
  36. sb.Builder.Append(quasi.Value.Cooked);
  37. if (i < _expressions.Length)
  38. {
  39. var completion = _expressions[i].GetValue(context);
  40. sb.Builder.Append(completion.Value);
  41. }
  42. }
  43. return JsString.Create(sb.ToString());
  44. }
  45. protected override ExpressionResult EvaluateInternal(EvaluationContext context)
  46. {
  47. return NormalCompletion(BuildString(context));
  48. }
  49. }
  50. }