JintExportDefaultDeclaration.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. using Jint.Native.Function;
  4. using Jint.Runtime.Interpreter.Expressions;
  5. using Environment = Jint.Runtime.Environments.Environment;
  6. namespace Jint.Runtime.Interpreter.Statements;
  7. internal sealed class JintExportDefaultDeclaration : JintStatement<ExportDefaultDeclaration>
  8. {
  9. private ClassDefinition? _classDefinition;
  10. private JintFunctionDeclarationStatement? _functionDeclaration;
  11. private JintExpression? _assignmentExpression;
  12. private JintExpression? _simpleExpression;
  13. public JintExportDefaultDeclaration(ExportDefaultDeclaration statement) : base(statement)
  14. {
  15. }
  16. protected override void Initialize(EvaluationContext context)
  17. {
  18. if (_statement.Declaration is ClassDeclaration classDeclaration)
  19. {
  20. _classDefinition = new ClassDefinition(className: classDeclaration.Id?.Name ?? "default", classDeclaration.SuperClass, classDeclaration.Body);
  21. }
  22. else if (_statement.Declaration is FunctionDeclaration functionDeclaration)
  23. {
  24. _functionDeclaration = new JintFunctionDeclarationStatement(functionDeclaration);
  25. }
  26. else if (_statement.Declaration is AssignmentExpression assignmentExpression)
  27. {
  28. _assignmentExpression = JintAssignmentExpression.Build(assignmentExpression);
  29. }
  30. else
  31. {
  32. _simpleExpression = JintExpression.Build((Expression) _statement.Declaration);
  33. }
  34. }
  35. /// <summary>
  36. /// https://tc39.es/ecma262/#sec-exports-runtime-semantics-evaluation
  37. /// </summary>
  38. protected override Completion ExecuteInternal(EvaluationContext context)
  39. {
  40. var env = context.Engine.ExecutionContext.LexicalEnvironment;
  41. JsValue value;
  42. if (_classDefinition is not null)
  43. {
  44. value = _classDefinition.BuildConstructor(context, env);
  45. var classBinding = _classDefinition._className;
  46. if (classBinding != null)
  47. {
  48. env.CreateMutableBinding(classBinding);
  49. env.InitializeBinding(classBinding, value);
  50. }
  51. }
  52. else if (_functionDeclaration is not null)
  53. {
  54. value = _functionDeclaration.Execute(context).GetValueOrDefault();
  55. }
  56. else if (_assignmentExpression is not null)
  57. {
  58. value = _assignmentExpression.GetValue(context);
  59. }
  60. else
  61. {
  62. value = _simpleExpression!.GetValue(context);
  63. }
  64. if (value is Function functionInstance
  65. && string.IsNullOrWhiteSpace(functionInstance._nameDescriptor?._value?.ToString()))
  66. {
  67. functionInstance.SetFunctionName("default");
  68. }
  69. env.InitializeBinding("*default*", value);
  70. return Completion.Empty();
  71. }
  72. /// <summary>
  73. /// https://tc39.es/ecma262/#sec-initializeboundname
  74. /// </summary>
  75. private static void InitializeBoundName(string name, JsValue value, Environment? environment)
  76. {
  77. if (environment is not null)
  78. {
  79. environment.InitializeBinding(name, value);
  80. }
  81. else
  82. {
  83. ExceptionHelper.ThrowNotImplementedException();
  84. }
  85. }
  86. }