Skip to content

Commit 6373941

Browse files
committed
Check expression statements for context displayname
1 parent d5adb6d commit 6373941

File tree

2 files changed

+88
-13
lines changed

2 files changed

+88
-13
lines changed

lib/rules/display-name.js

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,30 +80,52 @@ module.exports = {
8080
/**
8181
* Checks if the node is a React.createContext call
8282
* @param {ASTNode} node - The AST node being checked.
83-
* @returns {Boolean} - True if node is a React.createContext call object literal, false if not.
83+
* @returns {Boolean} - True if node is a React.createContext call, false if not.
8484
*/
8585
function isCreateContext(node) {
86-
if (!node.init) {
87-
return false;
88-
}
89-
9086
if (
91-
node.init.type === 'CallExpression'
87+
node.init
88+
&& node.init.type === 'CallExpression'
9289
&& node.init.callee
9390
&& node.init.callee.name === 'createContext'
9491
) {
9592
return true;
9693
}
9794

9895
if (
99-
node.init.callee
96+
node.init
97+
&& node.init.callee
10098
&& node.init.callee.type === 'MemberExpression'
10199
&& node.init.callee.property
102100
&& node.init.callee.property.name === 'createContext'
103101
) {
104102
return true;
105103
}
106104

105+
if (
106+
node.expression
107+
&& node.expression.type === 'AssignmentExpression'
108+
&& node.expression.operator === '='
109+
&& node.expression.right.type === 'CallExpression'
110+
&& node.expression.right.callee
111+
&& node.expression.right.callee.name === 'createContext'
112+
) {
113+
return true;
114+
}
115+
116+
if (
117+
node.expression
118+
&& node.expression.type === 'AssignmentExpression'
119+
&& node.expression.operator === '='
120+
&& node.expression.right.type === 'CallExpression'
121+
&& node.expression.right.callee
122+
&& node.expression.right.callee.type === 'MemberExpression'
123+
&& node.expression.right.callee.property
124+
&& node.expression.right.callee.property.name === 'createContext'
125+
) {
126+
return true;
127+
}
128+
107129
return false;
108130
}
109131

@@ -191,6 +213,11 @@ module.exports = {
191213
// --------------------------------------------------------------------------
192214

193215
return {
216+
ExpressionStatement(node) {
217+
if (checkContextObjects && isCreateContext(node)) {
218+
contextObjects.set(node.expression.left.name, { node, hasDisplayName: false });
219+
}
220+
},
194221
VariableDeclarator(node) {
195222
if (checkContextObjects && isCreateContext(node)) {
196223
contextObjects.set(node.id.name, { node, hasDisplayName: false });

tests/lib/rules/display-name.js

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,16 @@ ruleTester.run('display-name', rule, {
839839
code: `
840840
import { createContext } from 'react';
841841
842+
let Hello;
843+
Hello = createContext();
844+
Hello.displayName = "HelloContext";
845+
`,
846+
options: [{ checkContextObjects: true }],
847+
},
848+
{
849+
code: `
850+
import { createContext } from 'react';
851+
842852
const Hello = createContext();
843853
`,
844854
settings: {
@@ -852,13 +862,21 @@ ruleTester.run('display-name', rule, {
852862
code: `
853863
import { createContext } from 'react';
854864
855-
const Hello = createContext();
865+
var Hello;
866+
Hello = createContext();
867+
Hello.displayName = "HelloContext";
856868
`,
857-
settings: {
858-
react: {
859-
version: '>16.3.0',
860-
},
861-
},
869+
options: [{ checkContextObjects: true }],
870+
},
871+
{
872+
code: `
873+
import { createContext } from 'react';
874+
875+
var Hello;
876+
Hello = React.createContext();
877+
Hello.displayName = "HelloContext";
878+
`,
879+
options: [{ checkContextObjects: true }],
862880
},
863881
]),
864882

@@ -1327,5 +1345,35 @@ ruleTester.run('display-name', rule, {
13271345
],
13281346
options: [{ checkContextObjects: true }],
13291347
},
1348+
{
1349+
code: `
1350+
import { createContext } from 'react';
1351+
1352+
var Hello;
1353+
Hello = createContext();
1354+
`,
1355+
errors: [
1356+
{
1357+
messageId: 'noContextDisplayName',
1358+
line: 5,
1359+
},
1360+
],
1361+
options: [{ checkContextObjects: true }],
1362+
},
1363+
{
1364+
code: `
1365+
import { createContext } from 'react';
1366+
1367+
var Hello;
1368+
Hello = React.createContext();
1369+
`,
1370+
errors: [
1371+
{
1372+
messageId: 'noContextDisplayName',
1373+
line: 5,
1374+
},
1375+
],
1376+
options: [{ checkContextObjects: true }],
1377+
},
13301378
]),
13311379
});

0 commit comments

Comments
 (0)