1 | 'use strict';
|
2 | const getDocumentationUrl = require('./utils/get-documentation-url');
|
3 | const builtins = require('./utils/builtins');
|
4 | const isShadowed = require('./utils/is-shadowed');
|
5 |
|
6 | const messages = {
|
7 | enforce: 'Use `new {{name}}()` instead of `{{name}}()`.',
|
8 | disallow: 'Use `{{name}}()` instead of `new {{name}}()`.'
|
9 | };
|
10 |
|
11 | const enforceNew = new Set(builtins.enforceNew);
|
12 | const disallowNew = new Set(builtins.disallowNew);
|
13 |
|
14 | const create = context => {
|
15 | return {
|
16 | CallExpression: node => {
|
17 | const {callee} = node;
|
18 | const {name} = callee;
|
19 |
|
20 | if (enforceNew.has(name) && !isShadowed(context.getScope(), callee)) {
|
21 | context.report({
|
22 | node,
|
23 | messageId: 'enforce',
|
24 | data: {name},
|
25 | fix: fixer => fixer.insertTextBefore(node, 'new ')
|
26 | });
|
27 | }
|
28 | },
|
29 | NewExpression: node => {
|
30 | const {callee} = node;
|
31 | const {name} = callee;
|
32 |
|
33 | if (disallowNew.has(name) && !isShadowed(context.getScope(), callee)) {
|
34 | context.report({
|
35 | node,
|
36 | messageId: 'disallow',
|
37 | data: {name},
|
38 | fix: fixer => fixer.removeRange([
|
39 | node.range[0],
|
40 | node.callee.range[0]
|
41 | ])
|
42 | });
|
43 | }
|
44 | }
|
45 | };
|
46 | };
|
47 |
|
48 | module.exports = {
|
49 | create,
|
50 | meta: {
|
51 | type: 'suggestion',
|
52 | docs: {
|
53 | url: getDocumentationUrl(__filename)
|
54 | },
|
55 | fixable: 'code',
|
56 | messages
|
57 | }
|
58 | };
|