JintTemplateLiteralExpression.cs 1.7 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(Engine engine, TemplateLiteral expression) : base(engine, expression)
  11. {
  12. _templateLiteralExpression = expression;
  13. _initialized = false;
  14. }
  15. protected override void Initialize()
  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(_engine, exp);
  26. }
  27. _initialized = true;
  28. }
  29. private JsString BuildString()
  30. {
  31. using (var sb = StringBuilderPool.Rent())
  32. {
  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. sb.Builder.Append(_expressions[i].GetValue());
  40. }
  41. }
  42. return JsString.Create(sb.ToString());
  43. }
  44. }
  45. protected override object EvaluateInternal()
  46. {
  47. return BuildString();
  48. }
  49. }
  50. }