155 lines
4.6 KiB
JavaScript
155 lines
4.6 KiB
JavaScript
|
/*
|
||
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
|
Author Tobias Koppers @sokra
|
||
|
*/
|
||
|
"use strict";
|
||
|
|
||
|
const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
|
||
|
const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
|
||
|
const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
|
||
|
const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
|
||
|
const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
|
||
|
const ConstDependency = require("./ConstDependency");
|
||
|
|
||
|
module.exports = class HarmonyExportDependencyParserPlugin {
|
||
|
constructor(moduleOptions) {
|
||
|
this.strictExportPresence = moduleOptions.strictExportPresence;
|
||
|
}
|
||
|
|
||
|
apply(parser) {
|
||
|
parser.hooks.export.tap(
|
||
|
"HarmonyExportDependencyParserPlugin",
|
||
|
statement => {
|
||
|
const dep = new HarmonyExportHeaderDependency(
|
||
|
statement.declaration && statement.declaration.range,
|
||
|
statement.range
|
||
|
);
|
||
|
dep.loc = Object.create(statement.loc);
|
||
|
dep.loc.index = -1;
|
||
|
parser.state.current.addDependency(dep);
|
||
|
return true;
|
||
|
}
|
||
|
);
|
||
|
parser.hooks.exportImport.tap(
|
||
|
"HarmonyExportDependencyParserPlugin",
|
||
|
(statement, source) => {
|
||
|
parser.state.lastHarmonyImportOrder =
|
||
|
(parser.state.lastHarmonyImportOrder || 0) + 1;
|
||
|
const clearDep = new ConstDependency("", statement.range);
|
||
|
clearDep.loc = Object.create(statement.loc);
|
||
|
clearDep.loc.index = -1;
|
||
|
parser.state.current.addDependency(clearDep);
|
||
|
const sideEffectDep = new HarmonyImportSideEffectDependency(
|
||
|
source,
|
||
|
parser.state.module,
|
||
|
parser.state.lastHarmonyImportOrder,
|
||
|
parser.state.harmonyParserScope
|
||
|
);
|
||
|
sideEffectDep.loc = Object.create(statement.loc);
|
||
|
sideEffectDep.loc.index = -1;
|
||
|
parser.state.current.addDependency(sideEffectDep);
|
||
|
return true;
|
||
|
}
|
||
|
);
|
||
|
parser.hooks.exportExpression.tap(
|
||
|
"HarmonyExportDependencyParserPlugin",
|
||
|
(statement, expr) => {
|
||
|
const comments = parser.getComments([
|
||
|
statement.range[0],
|
||
|
expr.range[0]
|
||
|
]);
|
||
|
const dep = new HarmonyExportExpressionDependency(
|
||
|
parser.state.module,
|
||
|
expr.range,
|
||
|
statement.range,
|
||
|
comments
|
||
|
.map(c => {
|
||
|
switch (c.type) {
|
||
|
case "Block":
|
||
|
return `/*${c.value}*/`;
|
||
|
case "Line":
|
||
|
return `//${c.value}\n`;
|
||
|
}
|
||
|
return "";
|
||
|
})
|
||
|
.join("")
|
||
|
);
|
||
|
dep.loc = Object.create(statement.loc);
|
||
|
dep.loc.index = -1;
|
||
|
parser.state.current.addDependency(dep);
|
||
|
return true;
|
||
|
}
|
||
|
);
|
||
|
parser.hooks.exportDeclaration.tap(
|
||
|
"HarmonyExportDependencyParserPlugin",
|
||
|
statement => {}
|
||
|
);
|
||
|
parser.hooks.exportSpecifier.tap(
|
||
|
"HarmonyExportDependencyParserPlugin",
|
||
|
(statement, id, name, idx) => {
|
||
|
const rename = parser.scope.renames.get(id);
|
||
|
let dep;
|
||
|
const harmonyNamedExports = (parser.state.harmonyNamedExports =
|
||
|
parser.state.harmonyNamedExports || new Set());
|
||
|
harmonyNamedExports.add(name);
|
||
|
if (rename === "imported var") {
|
||
|
const settings = parser.state.harmonySpecifier.get(id);
|
||
|
dep = new HarmonyExportImportedSpecifierDependency(
|
||
|
settings.source,
|
||
|
parser.state.module,
|
||
|
settings.sourceOrder,
|
||
|
parser.state.harmonyParserScope,
|
||
|
settings.id,
|
||
|
name,
|
||
|
harmonyNamedExports,
|
||
|
null,
|
||
|
this.strictExportPresence
|
||
|
);
|
||
|
} else {
|
||
|
dep = new HarmonyExportSpecifierDependency(
|
||
|
parser.state.module,
|
||
|
id,
|
||
|
name
|
||
|
);
|
||
|
}
|
||
|
dep.loc = Object.create(statement.loc);
|
||
|
dep.loc.index = idx;
|
||
|
parser.state.current.addDependency(dep);
|
||
|
return true;
|
||
|
}
|
||
|
);
|
||
|
parser.hooks.exportImportSpecifier.tap(
|
||
|
"HarmonyExportDependencyParserPlugin",
|
||
|
(statement, source, id, name, idx) => {
|
||
|
const harmonyNamedExports = (parser.state.harmonyNamedExports =
|
||
|
parser.state.harmonyNamedExports || new Set());
|
||
|
let harmonyStarExports = null;
|
||
|
if (name) {
|
||
|
harmonyNamedExports.add(name);
|
||
|
} else {
|
||
|
harmonyStarExports = parser.state.harmonyStarExports =
|
||
|
parser.state.harmonyStarExports || [];
|
||
|
}
|
||
|
const dep = new HarmonyExportImportedSpecifierDependency(
|
||
|
source,
|
||
|
parser.state.module,
|
||
|
parser.state.lastHarmonyImportOrder,
|
||
|
parser.state.harmonyParserScope,
|
||
|
id,
|
||
|
name,
|
||
|
harmonyNamedExports,
|
||
|
harmonyStarExports && harmonyStarExports.slice(),
|
||
|
this.strictExportPresence
|
||
|
);
|
||
|
if (harmonyStarExports) {
|
||
|
harmonyStarExports.push(dep);
|
||
|
}
|
||
|
dep.loc = Object.create(statement.loc);
|
||
|
dep.loc.index = idx;
|
||
|
parser.state.current.addDependency(dep);
|
||
|
return true;
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
};
|