Skip to content

Commit

Permalink
Merge pull request #6953 from webpack/refactor/mode_deopt
Browse files Browse the repository at this point in the history
Change internal representation of harmony export modes
  • Loading branch information
sokra committed Apr 4, 2018
2 parents 1958784 + 24a5699 commit f3c9bd0
Showing 1 changed file with 68 additions and 81 deletions.
149 changes: 68 additions & 81 deletions lib/dependencies/HarmonyExportImportedSpecifierDependency.js
Expand Up @@ -9,6 +9,20 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
const Template = require("../Template");
const HarmonyLinkingError = require("../HarmonyLinkingError");

const EMPTY_MAP = new Map();

class ExportMode {
constructor(type) {
this.type = type;
this.name = null;
this.map = EMPTY_MAP;
this.module = null;
this.userRequest = null;
}
}

const EMPTY_STAR_MODE = new ExportMode("empty-star");

class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
constructor(
request,
Expand Down Expand Up @@ -40,81 +54,64 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
const importedModule = this.module;

if (!importedModule) {
return {
type: "missing",
userRequest: this.userRequest
};
const mode = new ExportMode("missing");
mode.userRequest = this.userRequest;
return mode;
}

if (
!ignoreUnused &&
(name ? !used : this.originModule.usedExports === false)
) {
return {
type: "unused",
name: name || "*"
};
const mode = new ExportMode("unused");
mode.name = name || "*";
return mode;
}

const strictHarmonyModule = this.originModule.buildMeta.strictHarmonyModule;
if (name && id === "default" && importedModule.buildMeta) {
if (!importedModule.buildMeta.exportsType) {
if (strictHarmonyModule) {
return {
type: "reexport-non-harmony-default-strict",
module: importedModule,
name
};
} else {
return {
type: "reexport-non-harmony-default",
module: importedModule,
name
};
}
const mode = new ExportMode(
strictHarmonyModule
? "reexport-non-harmony-default-strict"
: "reexport-non-harmony-default"
);
mode.name = name;
mode.module = importedModule;
return mode;
} else if (importedModule.buildMeta.exportsType === "named") {
return {
type: "reexport-named-default",
module: importedModule,
name
};
const mode = new ExportMode("reexport-named-default");
mode.name = name;
mode.module = importedModule;
return mode;
}
}

const isNotAHarmonyModule =
importedModule.buildMeta && !importedModule.buildMeta.exportsType;
if (name) {
// export { name as name }
let mode;
if (id) {
// export { name as name }
if (isNotAHarmonyModule && strictHarmonyModule) {
return {
type: "rexport-non-harmony-undefined",
module: importedModule,
name
};
mode = new ExportMode("rexport-non-harmony-undefined");
mode.name = name;
} else {
return {
type: "safe-reexport",
module: importedModule,
map: new Map([[name, id]])
};
mode = new ExportMode("safe-reexport");
mode.map = new Map([[name, id]]);
}
}

// export { * as name }
if (isNotAHarmonyModule && strictHarmonyModule) {
return {
type: "reexport-fake-namespace-object",
module: importedModule,
name
};
} else {
return {
type: "reexport-namespace-object",
module: importedModule,
name
};
// export { * as name }
if (isNotAHarmonyModule && strictHarmonyModule) {
mode = new ExportMode("reexport-fake-namespace-object");
mode.name = name;
} else {
mode = new ExportMode("reexport-namespace-object");
mode.name = name;
}
}
mode.module = importedModule;
return mode;
}

const hasUsedExports = Array.isArray(this.originModule.usedExports);
Expand All @@ -141,16 +138,13 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
);

if (map.size === 0) {
return {
type: "empty-star"
};
return EMPTY_STAR_MODE;
}

return {
type: "safe-reexport",
module: importedModule,
map
};
const mode = new ExportMode("safe-reexport");
mode.module = importedModule;
mode.map = map;
return mode;
}

const map = new Map(
Expand All @@ -166,16 +160,13 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
);

if (map.size === 0) {
return {
type: "empty-star"
};
return EMPTY_STAR_MODE;
}

return {
type: "checked-reexport",
module: importedModule,
map
};
const mode = new ExportMode("checked-reexport");
mode.module = importedModule;
mode.map = map;
return mode;
}

if (hasProvidedExports) {
Expand All @@ -192,26 +183,22 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
);

if (map.size === 0) {
return {
type: "empty-star"
};
return EMPTY_STAR_MODE;
}

return {
type: "safe-reexport",
module: importedModule,
map
};
const mode = new ExportMode("safe-reexport");
mode.module = importedModule;
mode.map = map;
return mode;
}

return {
type: "dynamic-reexport",
module: importedModule
};
const mode = new ExportMode("dynamic-reexport");
mode.module = importedModule;
return mode;
}

getReference() {
const mode = this.getMode();
const mode = this.getMode(false);

switch (mode.type) {
case "missing":
Expand Down Expand Up @@ -432,7 +419,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
}

getContent(dep) {
const mode = dep.getMode();
const mode = dep.getMode(false);
const module = dep.originModule;
const importedModule = dep.module;
const importVar = dep.getImportVar();
Expand Down

0 comments on commit f3c9bd0

Please sign in to comment.