Skip to content

Commit 1ff8d69

Browse files
authored
Merge pull request webpack#3846 from timse/extract-to-parser-helpers-extended
Extract to parser helpers extended
2 parents 96ea95a + d6e2abf commit 1ff8d69

16 files changed

+64
-169
lines changed

lib/APIPlugin.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,11 @@ class APIPlugin {
3737

3838
params.normalModuleFactory.plugin("parser", parser => {
3939
Object.keys(REPLACEMENTS).forEach(key => {
40-
parser.plugin(`expression ${key}`, expr => {
41-
const dep = new ConstDependency(REPLACEMENTS[key], expr.range);
42-
dep.loc = expr.loc;
43-
parser.state.current.addDependency(dep);
44-
return true;
45-
});
46-
40+
parser.plugin(`expression ${key}`, ParserHelpers.toConstantDependency(REPLACEMENTS[key]));
4741
parser.plugin(`evaluate typeof ${key}`, ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]));
4842
});
4943
IGNORES.forEach(key => {
50-
parser.plugin(key, () => true);
44+
parser.plugin(key, ParserHelpers.skipTraversal);
5145
});
5246
});
5347
});

lib/ConstPlugin.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
Author Tobias Koppers @sokra
44
*/
55
"use strict";
6-
76
const ConstDependency = require("./dependencies/ConstDependency");
8-
const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
97
const NullFactory = require("./NullFactory");
8+
const ParserHelpers = require("./ParserHelpers");
109

1110
const getQuery = (request) => {
1211
const i = request.indexOf("?");
@@ -46,10 +45,7 @@ class ConstPlugin {
4645
});
4746
parser.plugin("evaluate Identifier __resourceQuery", function(expr) {
4847
if(!this.state.module) return;
49-
const res = new BasicEvaluatedExpression();
50-
res.setString(getQuery(this.state.module.resource));
51-
res.setRange(expr.range);
52-
return res;
48+
return ParserHelpers.evaluateToString(getQuery(this.state.module.resource))(expr);
5349
});
5450
parser.plugin("expression __resourceQuery", function() {
5551
if(!this.state.module) return;

lib/DefinePlugin.js

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class DefinePlugin {
5454
const splittedKey = key.split(".");
5555
splittedKey.slice(1).forEach((_, i) => {
5656
const fullKey = prefix + splittedKey.slice(0, i + 1).join(".");
57-
parser.plugin("can-rename " + fullKey, () => true);
57+
parser.plugin("can-rename " + fullKey, ParserHelpers.approve);
5858
});
5959
}
6060

@@ -65,20 +65,15 @@ class DefinePlugin {
6565
let recurseTypeof = false;
6666
code = toCode(code);
6767
if(!isTypeof) {
68-
parser.plugin("can-rename " + key, () => true);
68+
parser.plugin("can-rename " + key, ParserHelpers.approve);
6969
parser.plugin("evaluate Identifier " + key, (expr) => {
7070
if(recurse) return;
7171
let res = parser.evaluate(code);
7272
recurse = false;
7373
res.setRange(expr.range);
7474
return res;
7575
});
76-
parser.plugin("expression " + key, (expr) => {
77-
let dep = new ConstDependency(code, expr.range);
78-
dep.loc = expr.loc;
79-
parser.state.current.addDependency(dep);
80-
return true;
81-
});
76+
parser.plugin("expression " + key, ParserHelpers.toConstantDependency(code));
8277
}
8378
let typeofCode = isTypeof ? code : "typeof (" + code + ")";
8479
parser.plugin("evaluate typeof " + key, (expr) => {
@@ -91,30 +86,17 @@ class DefinePlugin {
9186
parser.plugin("typeof " + key, (expr) => {
9287
let res = parser.evaluate(typeofCode);
9388
if(!res.isString()) return;
94-
let dep = new ConstDependency(JSON.stringify(res.string), expr.range);
95-
dep.loc = expr.loc;
96-
parser.state.current.addDependency(dep);
97-
return true;
89+
return ParserHelpers.toConstantDependency(JSON.stringify(res.string)).bind(parser)(expr);
9890
});
9991
}
10092

10193
function applyObjectDefine(key, obj) {
10294
let code = stringifyObj(obj);
103-
parser.plugin("can-rename " + key, () => true);
95+
parser.plugin("can-rename " + key, ParserHelpers.approve);
10496
parser.plugin("evaluate Identifier " + key, (expr) => new BasicEvaluatedExpression().setRange(expr.range));
10597
parser.plugin("evaluate typeof " + key, ParserHelpers.evaluateToString("object"));
106-
parser.plugin("expression " + key, (expr) => {
107-
let dep = new ConstDependency(code, expr.range);
108-
dep.loc = expr.loc;
109-
parser.state.current.addDependency(dep);
110-
return true;
111-
});
112-
parser.plugin("typeof " + key, (expr) => {
113-
let dep = new ConstDependency("\"object\"", expr.range);
114-
dep.loc = expr.loc;
115-
parser.state.current.addDependency(dep);
116-
return true;
117-
});
98+
parser.plugin("expression " + key, ParserHelpers.toConstantDependency(code));
99+
parser.plugin("typeof " + key, ParserHelpers.toConstantDependency(JSON.stringify("object")));
118100
}
119101
});
120102
});

lib/ExtendedAPIPlugin.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,7 @@ ExtendedAPIPlugin.prototype.apply = function(compiler) {
3434

3535
params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
3636
Object.keys(REPLACEMENTS).forEach(function(key) {
37-
parser.plugin("expression " + key, function(expr) {
38-
var dep = new ConstDependency(REPLACEMENTS[key], expr.range);
39-
dep.loc = expr.loc;
40-
this.state.current.addDependency(dep);
41-
return true;
42-
});
37+
parser.plugin("expression " + key, ParserHelpers.toConstantDependency(REPLACEMENTS[key]));
4338
parser.plugin("evaluate typeof " + key, ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]));
4439
});
4540
});

lib/HotModuleReplacementPlugin.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
"use strict";
66
var Template = require("./Template");
7-
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
87
var ModuleHotAcceptDependency = require("./dependencies/ModuleHotAcceptDependency");
98
var ModuleHotDeclineDependency = require("./dependencies/ModuleHotDeclineDependency");
109
var RawSource = require("webpack-sources").RawSource;
@@ -197,17 +196,10 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
197196
});
198197

199198
params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
200-
parser.plugin("expression __webpack_hash__", function(expr) {
201-
var dep = new ConstDependency("__webpack_require__.h()", expr.range);
202-
dep.loc = expr.loc;
203-
this.state.current.addDependency(dep);
204-
return true;
205-
});
199+
parser.plugin("expression __webpack_hash__", ParserHelpers.toConstantDependency("__webpack_require__.h()"));
206200
parser.plugin("evaluate typeof __webpack_hash__", ParserHelpers.evaluateToString("string"));
207201
parser.plugin("evaluate Identifier module.hot", function(expr) {
208-
return new BasicEvaluatedExpression()
209-
.setBoolean(!!this.state.compilation.hotUpdateChunkTemplate)
210-
.setRange(expr.range);
202+
return ParserHelpers.evaluateToBoolean(!!this.state.compilation.hotUpdateChunkTemplate)(expr);
211203
});
212204
parser.plugin("call module.hot.accept", function(expr) {
213205
if(!this.state.compilation.hotUpdateChunkTemplate) return false;
@@ -260,9 +252,7 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
260252
}.bind(this));
261253
}
262254
});
263-
parser.plugin("expression module.hot", function() {
264-
return true;
265-
});
255+
parser.plugin("expression module.hot", ParserHelpers.skipTraversal);
266256
});
267257
});
268258

lib/NodeStuffPlugin.js

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
var path = require("path");
66
var ParserHelpers = require("./ParserHelpers");
77
var ConstDependency = require("./dependencies/ConstDependency");
8-
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
98

109
var NullFactory = require("./NullFactory");
1110

@@ -51,12 +50,9 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
5150
}
5251
parser.plugin("evaluate Identifier __filename", function(expr) {
5352
if(!this.state.module) return;
54-
var res = new BasicEvaluatedExpression();
5553
var resource = this.state.module.resource;
5654
var i = resource.indexOf("?");
57-
res.setString(i < 0 ? resource : resource.substr(0, i));
58-
res.setRange(expr.range);
59-
return res;
55+
return ParserHelpers.evaluateToString(i < 0 ? resource : resource.substr(0, i))(expr);
6056
});
6157
if(localOptions.__dirname === "mock") {
6258
setConstant("__dirname", "/");
@@ -67,42 +63,22 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
6763
}
6864
parser.plugin("evaluate Identifier __dirname", function(expr) {
6965
if(!this.state.module) return;
70-
var res = new BasicEvaluatedExpression();
71-
res.setString(this.state.module.context);
72-
res.setRange(expr.range);
73-
return res;
74-
});
75-
parser.plugin("expression require.main", function(expr) {
76-
var dep = new ConstDependency("__webpack_require__.c[__webpack_require__.s]", expr.range);
77-
dep.loc = expr.loc;
78-
this.state.current.addDependency(dep);
79-
return true;
66+
return ParserHelpers.evaluateToString(this.state.module.context)(expr);
8067
});
68+
parser.plugin("expression require.main", ParserHelpers.toConstantDependency("__webpack_require__.c[__webpack_require__.s]"));
8169
parser.plugin(
8270
"expression require.extensions",
8371
ParserHelpers.expressionIsUnsupported("require.extensions is not supported by webpack. Use a loader instead.")
8472
);
85-
parser.plugin("expression module.loaded", function(expr) {
86-
var dep = new ConstDependency("module.l", expr.range);
87-
dep.loc = expr.loc;
88-
this.state.current.addDependency(dep);
89-
return true;
90-
});
91-
parser.plugin("expression module.id", function(expr) {
92-
var dep = new ConstDependency("module.i", expr.range);
93-
dep.loc = expr.loc;
94-
this.state.current.addDependency(dep);
95-
return true;
96-
});
73+
parser.plugin("expression module.loaded", ParserHelpers.toConstantDependency("module.l"));
74+
parser.plugin("expression module.id", ParserHelpers.toConstantDependency("module.i"));
9775
parser.plugin("expression module.exports", function() {
9876
var module = this.state.module;
9977
var isHarmony = module.meta && module.meta.harmonyModule;
10078
if(!isHarmony)
10179
return true;
10280
});
103-
parser.plugin("evaluate Identifier module.hot", function(expr) {
104-
return new BasicEvaluatedExpression().setBoolean(false).setRange(expr.range);
105-
});
81+
parser.plugin("evaluate Identifier module.hot", ParserHelpers.evaluateToBoolean(false));
10682
parser.plugin("expression module", function() {
10783
var module = this.state.module;
10884
var isHarmony = module.meta && module.meta.harmonyModule;

lib/ParserHelpers.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,28 @@ ParserHelpers.addParsedVariableToModule = function(parser, name, expression) {
2525
return true;
2626
};
2727

28-
ParserHelpers.toConstantDependency = function toConstantDependency(value) {
29-
return function constantDependency(expr) {
30-
var dep = new ConstDependency(JSON.stringify(value), expr.range);
28+
ParserHelpers.toConstantDependency = function(value) {
29+
return function constDependency(expr) {
30+
var dep = new ConstDependency(value, expr.range);
3131
dep.loc = expr.loc;
3232
this.state.current.addDependency(dep);
3333
return true;
3434
};
3535
};
3636

37-
ParserHelpers.evaluateToString = function evaluateToString(value) {
37+
ParserHelpers.evaluateToString = function(value) {
3838
return function stringExpression(expr) {
3939
return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
4040
};
4141
};
4242

43-
ParserHelpers.expressionIsUnsupported = function expressionIsUnsupported(message) {
43+
ParserHelpers.evaluateToBoolean = function(value) {
44+
return function booleanExpression(expr) {
45+
return new BasicEvaluatedExpression().setBoolean(value).setRange(expr.range);
46+
};
47+
};
48+
49+
ParserHelpers.expressionIsUnsupported = function(message) {
4450
return function unsupportedExpression(expr) {
4551
var dep = new ConstDependency("(void 0)", expr.range);
4652
dep.loc = expr.loc;
@@ -50,3 +56,11 @@ ParserHelpers.expressionIsUnsupported = function expressionIsUnsupported(message
5056
return true;
5157
};
5258
};
59+
60+
ParserHelpers.skipTraversal = function skipTraversal() {
61+
return true;
62+
};
63+
64+
ParserHelpers.approve = function approve() {
65+
return true;
66+
};

lib/ProvidePlugin.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ ProvidePlugin.prototype.apply = function(compiler) {
2323
if(splittedName.length > 0) {
2424
splittedName.slice(1).forEach(function(_, i) {
2525
var name = splittedName.slice(0, i + 1).join(".");
26-
parser.plugin("can-rename " + name, function() {
27-
return true;
28-
});
26+
parser.plugin("can-rename " + name, ParserHelpers.approve);
2927
});
3028
}
3129
parser.plugin("expression " + name, function(expr) {
@@ -44,9 +42,7 @@ ProvidePlugin.prototype.apply = function(compiler) {
4442
return false;
4543
}
4644
if(scopedName) {
47-
var dep = new ConstDependency(nameIdentifier, expr.range);
48-
dep.loc = expr.loc;
49-
this.state.current.addDependency(dep);
45+
ParserHelpers.toConstantDependency(nameIdentifier).bind(this)(expr);
5046
}
5147
return true;
5248
});

lib/RequireJsStuffPlugin.js

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
"use strict";
66

7+
const ParserHelpers = require("./ParserHelpers");
78
const ConstDependency = require("./dependencies/ConstDependency");
89
const NullFactory = require("./NullFactory");
910

@@ -18,27 +19,11 @@ module.exports = class RequireJsStuffPlugin {
1819
if(typeof parserOptions.requireJs !== "undefined" && !parserOptions.requireJs)
1920
return;
2021

21-
function remove(expr) {
22-
var dep = new ConstDependency(";", expr.range);
23-
dep.loc = expr.loc;
24-
this.state.current.addDependency(dep);
25-
return true;
26-
}
27-
parser.plugin("call require.config", remove);
28-
parser.plugin("call requirejs.config", remove);
22+
parser.plugin("call require.config", ParserHelpers.toConstantDependency("undefined"));
23+
parser.plugin("call requirejs.config", ParserHelpers.toConstantDependency("undefined"));
2924

30-
parser.plugin("expression require.version", function(expr) {
31-
var dep = new ConstDependency(JSON.stringify("0.0.0"), expr.range);
32-
dep.loc = expr.loc;
33-
this.state.current.addDependency(dep);
34-
return true;
35-
});
36-
parser.plugin("expression requirejs.onError", function(expr) {
37-
var dep = new ConstDependency(JSON.stringify("__webpack_require__.oe"), expr.range);
38-
dep.loc = expr.loc;
39-
this.state.current.addDependency(dep);
40-
return true;
41-
});
25+
parser.plugin("expression require.version", ParserHelpers.toConstantDependency(JSON.stringify("0.0.0")));
26+
parser.plugin("expression requirejs.onError", ParserHelpers.toConstantDependency(JSON.stringify("__webpack_require__.oe")));
4227
});
4328
});
4429
}

lib/dependencies/AMDPlugin.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlug
2020

2121
const AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
2222

23-
const BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
2423
const ParserHelpers = require("../ParserHelpers");
2524

2625
class AMDPlugin {
@@ -83,23 +82,19 @@ class AMDPlugin {
8382
parser.state.current.addVariable("__webpack_amd_options__", JSON.stringify(amdOptions)));
8483
parser.plugin("evaluate typeof define.amd", ParserHelpers.evaluateToString(typeof amdOptions));
8584
parser.plugin("evaluate typeof require.amd", ParserHelpers.evaluateToString(typeof amdOptions));
86-
parser.plugin("evaluate Identifier define.amd", (expr) => {
87-
return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
88-
});
89-
parser.plugin("evaluate Identifier require.amd", (expr) => {
90-
return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
91-
});
92-
parser.plugin("typeof define", ParserHelpers.toConstantDependency("function"));
85+
parser.plugin("evaluate Identifier define.amd", ParserHelpers.evaluateToBoolean(true));
86+
parser.plugin("evaluate Identifier require.amd", ParserHelpers.evaluateToBoolean(true));
87+
parser.plugin("typeof define", ParserHelpers.toConstantDependency(JSON.stringify("function")));
9388
parser.plugin("evaluate typeof define", ParserHelpers.evaluateToString("function"));
94-
parser.plugin("can-rename define", () => true);
89+
parser.plugin("can-rename define", ParserHelpers.approve);
9590
parser.plugin("rename define", (expr) => {
9691
const dep = new AMDRequireItemDependency("!!webpack amd define", expr.range);
9792
dep.userRequest = "define";
9893
dep.loc = expr.loc;
9994
parser.state.current.addDependency(dep);
10095
return false;
10196
});
102-
parser.plugin("typeof require", ParserHelpers.toConstantDependency("function"));
97+
parser.plugin("typeof require", ParserHelpers.toConstantDependency(JSON.stringify("function")));
10398
parser.plugin("evaluate typeof require", ParserHelpers.evaluateToString("function"));
10499
});
105100
});

0 commit comments

Comments
 (0)