Skip to content

Commit 2749a0b

Browse files
committed
Rewrite component detection
1 parent 0e14ff3 commit 2749a0b

File tree

10 files changed

+477
-407
lines changed

10 files changed

+477
-407
lines changed

lib/rules/display-name.js

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

7-
var componentUtil = require('../util/component');
8-
var ComponentList = componentUtil.List;
7+
var Components = require('../util/Components');
98

109
// ------------------------------------------------------------------------------
1110
// Rule Definition
1211
// ------------------------------------------------------------------------------
1312

14-
module.exports = function(context) {
13+
module.exports = Components.detect(function(context, components) {
1514

1615
var config = context.options[0] || {};
1716
var acceptTranspilerName = config.acceptTranspilerName || false;
1817

19-
var componentList = new ComponentList();
20-
2118
var MISSING_MESSAGE = 'Component definition is missing display name';
22-
var MISSING_MESSAGE_NAMED_COMP = '{{component}} component definition is missing display name';
2319

2420
/**
2521
* Checks if we are declaring a display name
@@ -51,7 +47,7 @@ module.exports = function(context) {
5147
* @param {ASTNode} node The AST node being checked.
5248
*/
5349
function markDisplayNameAsDeclared(node) {
54-
componentList.set(context, node, {
50+
components.set(node, {
5551
hasDisplayName: true
5652
});
5753
}
@@ -63,7 +59,7 @@ module.exports = function(context) {
6359
function reportMissingDisplayName(component) {
6460
context.report(
6561
component.node,
66-
component.name === componentUtil.DEFAULT_COMPONENT_NAME ? MISSING_MESSAGE : MISSING_MESSAGE_NAMED_COMP, {
62+
MISSING_MESSAGE, {
6763
component: component.name
6864
}
6965
);
@@ -135,31 +131,28 @@ module.exports = function(context) {
135131
if (!isDisplayNameDeclaration(node.property)) {
136132
return;
137133
}
138-
var component = componentList.getByName(context.getSource(node.object));
134+
var component = context.react.getRelatedComponent(node);
139135
if (!component) {
140136
return;
141137
}
142138
markDisplayNameAsDeclared(component.node);
143139
},
144140

145141
FunctionExpression: function(node) {
146-
componentList.set(context, node);
147142
if (!acceptTranspilerName || !hasTranspilerName(node)) {
148143
return;
149144
}
150145
markDisplayNameAsDeclared(node);
151146
},
152147

153148
FunctionDeclaration: function(node) {
154-
componentList.set(context, node);
155149
if (!acceptTranspilerName || !hasTranspilerName(node)) {
156150
return;
157151
}
158152
markDisplayNameAsDeclared(node);
159153
},
160154

161155
ArrowFunctionExpression: function(node) {
162-
componentList.set(context, node);
163156
if (!acceptTranspilerName || !hasTranspilerName(node)) {
164157
return;
165158
}
@@ -174,15 +167,13 @@ module.exports = function(context) {
174167
},
175168

176169
ClassDeclaration: function(node) {
177-
componentList.set(context, node);
178170
if (!acceptTranspilerName || !hasTranspilerName(node)) {
179171
return;
180172
}
181173
markDisplayNameAsDeclared(node);
182174
},
183175

184176
ObjectExpression: function(node) {
185-
componentList.set(context, node);
186177
if (!acceptTranspilerName || !hasTranspilerName(node)) {
187178
// Search for the displayName declaration
188179
node.properties.forEach(function(property) {
@@ -196,12 +187,8 @@ module.exports = function(context) {
196187
markDisplayNameAsDeclared(node);
197188
},
198189

199-
ReturnStatement: function(node) {
200-
componentList.set(context, node);
201-
},
202-
203190
'Program:exit': function() {
204-
var list = componentList.getList();
191+
var list = components.list();
205192
// Report missing display name for all components
206193
for (var component in list) {
207194
if (!list.hasOwnProperty(component) || list[component].hasDisplayName) {
@@ -211,7 +198,7 @@ module.exports = function(context) {
211198
}
212199
}
213200
};
214-
};
201+
});
215202

216203
module.exports.schema = [{
217204
type: 'object',

lib/rules/no-direct-mutation-state.js

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@
44
*/
55
'use strict';
66

7-
var componentUtil = require('../util/component');
8-
var ComponentList = componentUtil.List;
7+
var Components = require('../util/Components');
98

109
// ------------------------------------------------------------------------------
1110
// Rule Definition
1211
// ------------------------------------------------------------------------------
1312

14-
module.exports = function(context) {
15-
16-
var componentList = new ComponentList();
13+
module.exports = Components.detect(function(context, components) {
1714

1815
/**
1916
* Checks if the component is valid
@@ -41,15 +38,6 @@ module.exports = function(context) {
4138
// --------------------------------------------------------------------------
4239

4340
return {
44-
45-
ObjectExpression: function(node) {
46-
componentList.set(context, node);
47-
},
48-
49-
ClassDeclaration: function(node) {
50-
componentList.set(context, node);
51-
},
52-
5341
AssignmentExpression: function(node) {
5442
var item;
5543
if (!node.left || !node.left.object || !node.left.object.object) {
@@ -63,18 +51,18 @@ module.exports = function(context) {
6351
item.object.type === 'ThisExpression' &&
6452
item.property.name === 'state'
6553
) {
66-
var component = componentList.getByNode(context, node);
54+
var component = components.get(context.react.getParentComponent());
6755
var mutations = component && component.mutations || [];
6856
mutations.push(node.left.object);
69-
componentList.set(context, node, {
57+
components.set(node, {
7058
mutateSetState: true,
7159
mutations: mutations
7260
});
7361
}
7462
},
7563

7664
'Program:exit': function() {
77-
var list = componentList.getList();
65+
var list = components.list();
7866
for (var component in list) {
7967
if (!list.hasOwnProperty(component) || isValid(list[component])) {
8068
continue;
@@ -84,4 +72,4 @@ module.exports = function(context) {
8472
}
8573
};
8674

87-
};
75+
});

lib/rules/no-multi-comp.js

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@
44
*/
55
'use strict';
66

7-
var componentUtil = require('../util/component');
8-
var ComponentList = componentUtil.List;
7+
var Components = require('../util/Components');
98

109
// ------------------------------------------------------------------------------
1110
// Rule Definition
1211
// ------------------------------------------------------------------------------
1312

14-
module.exports = function(context) {
15-
16-
var componentList = new ComponentList();
13+
module.exports = Components.detect(function(context, components) {
1714

1815
var MULTI_COMP_MESSAGE = 'Declare only one React component per file';
1916

@@ -22,21 +19,12 @@ module.exports = function(context) {
2219
// --------------------------------------------------------------------------
2320

2421
return {
25-
26-
ClassDeclaration: function(node) {
27-
componentList.set(context, node);
28-
},
29-
30-
ObjectExpression: function(node) {
31-
componentList.set(context, node);
32-
},
33-
3422
'Program:exit': function() {
35-
if (componentList.count() <= 1) {
23+
if (components.length() <= 1) {
3624
return;
3725
}
3826

39-
var list = componentList.getList();
27+
var list = components.list();
4028
var i = 0;
4129

4230
for (var component in list) {
@@ -47,6 +35,6 @@ module.exports = function(context) {
4735
}
4836
}
4937
};
50-
};
38+
});
5139

5240
module.exports.schema = [];

lib/rules/prefer-es6-class.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44
*/
55
'use strict';
66

7-
var componentUtil = require('../util/component');
7+
var Components = require('../util/Components');
88

99
// ------------------------------------------------------------------------------
1010
// Rule Definition
1111
// ------------------------------------------------------------------------------
1212

13-
module.exports = function(context) {
13+
module.exports = Components.detect(function(context) {
1414

1515
return {
1616
ObjectExpression: function(node) {
17-
if (componentUtil.isComponentDefinition(context, node)) {
17+
if (context.react.isES5Component(node)) {
1818
context.report(node, 'Component should use es6 class instead of createClass');
1919
}
2020
}
2121
};
22-
};
22+
});
2323

2424
module.exports.schema = [];

0 commit comments

Comments
 (0)