HarmonyExportDependencyParserPlugin.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
  7. const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
  8. const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
  9. const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
  10. const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
  11. const ConstDependency = require("./ConstDependency");
  12. module.exports = class HarmonyExportDependencyParserPlugin {
  13. constructor(moduleOptions) {
  14. this.strictExportPresence = moduleOptions.strictExportPresence;
  15. }
  16. apply(parser) {
  17. parser.hooks.export.tap(
  18. "HarmonyExportDependencyParserPlugin",
  19. statement => {
  20. const dep = new HarmonyExportHeaderDependency(
  21. statement.declaration && statement.declaration.range,
  22. statement.range
  23. );
  24. dep.loc = Object.create(statement.loc);
  25. dep.loc.index = -1;
  26. parser.state.current.addDependency(dep);
  27. return true;
  28. }
  29. );
  30. parser.hooks.exportImport.tap(
  31. "HarmonyExportDependencyParserPlugin",
  32. (statement, source) => {
  33. parser.state.lastHarmonyImportOrder =
  34. (parser.state.lastHarmonyImportOrder || 0) + 1;
  35. const clearDep = new ConstDependency("", statement.range);
  36. clearDep.loc = Object.create(statement.loc);
  37. clearDep.loc.index = -1;
  38. parser.state.current.addDependency(clearDep);
  39. const sideEffectDep = new HarmonyImportSideEffectDependency(
  40. source,
  41. parser.state.module,
  42. parser.state.lastHarmonyImportOrder,
  43. parser.state.harmonyParserScope
  44. );
  45. sideEffectDep.loc = Object.create(statement.loc);
  46. sideEffectDep.loc.index = -1;
  47. parser.state.current.addDependency(sideEffectDep);
  48. return true;
  49. }
  50. );
  51. parser.hooks.exportExpression.tap(
  52. "HarmonyExportDependencyParserPlugin",
  53. (statement, expr) => {
  54. const dep = new HarmonyExportExpressionDependency(
  55. parser.state.module,
  56. expr.range,
  57. statement.range
  58. );
  59. dep.loc = Object.create(statement.loc);
  60. dep.loc.index = -1;
  61. parser.state.current.addDependency(dep);
  62. return true;
  63. }
  64. );
  65. parser.hooks.exportDeclaration.tap(
  66. "HarmonyExportDependencyParserPlugin",
  67. statement => {}
  68. );
  69. parser.hooks.exportSpecifier.tap(
  70. "HarmonyExportDependencyParserPlugin",
  71. (statement, id, name, idx) => {
  72. const rename = parser.scope.renames.get(id);
  73. let dep;
  74. const harmonyNamedExports = (parser.state.harmonyNamedExports =
  75. parser.state.harmonyNamedExports || new Set());
  76. harmonyNamedExports.add(name);
  77. if (rename === "imported var") {
  78. const settings = parser.state.harmonySpecifier.get(id);
  79. dep = new HarmonyExportImportedSpecifierDependency(
  80. settings.source,
  81. parser.state.module,
  82. settings.sourceOrder,
  83. parser.state.harmonyParserScope,
  84. settings.id,
  85. name,
  86. harmonyNamedExports,
  87. null,
  88. this.strictExportPresence
  89. );
  90. } else {
  91. dep = new HarmonyExportSpecifierDependency(
  92. parser.state.module,
  93. id,
  94. name
  95. );
  96. }
  97. dep.loc = Object.create(statement.loc);
  98. dep.loc.index = idx;
  99. parser.state.current.addDependency(dep);
  100. return true;
  101. }
  102. );
  103. parser.hooks.exportImportSpecifier.tap(
  104. "HarmonyExportDependencyParserPlugin",
  105. (statement, source, id, name, idx) => {
  106. const harmonyNamedExports = (parser.state.harmonyNamedExports =
  107. parser.state.harmonyNamedExports || new Set());
  108. let harmonyStarExports = null;
  109. if (name) {
  110. harmonyNamedExports.add(name);
  111. } else {
  112. harmonyStarExports = parser.state.harmonyStarExports =
  113. parser.state.harmonyStarExports || [];
  114. }
  115. const dep = new HarmonyExportImportedSpecifierDependency(
  116. source,
  117. parser.state.module,
  118. parser.state.lastHarmonyImportOrder,
  119. parser.state.harmonyParserScope,
  120. id,
  121. name,
  122. harmonyNamedExports,
  123. harmonyStarExports && harmonyStarExports.slice(),
  124. this.strictExportPresence
  125. );
  126. if (harmonyStarExports) {
  127. harmonyStarExports.push(dep);
  128. }
  129. dep.loc = Object.create(statement.loc);
  130. dep.loc.index = idx;
  131. parser.state.current.addDependency(dep);
  132. return true;
  133. }
  134. );
  135. }
  136. };