@@ -29,15 +29,76 @@ const parserOptions = {
29
29
const ruleTester = new RuleTester ( { parserOptions } ) ;
30
30
ruleTester . run ( 'display-name' , rule , {
31
31
valid : parsers . all ( [
32
+ {
33
+ code : `
34
+ import React, { memo, forwardRef } from 'react'
35
+
36
+ const TestComponent = function () {
37
+ {
38
+ const memo = (cb) => cb()
39
+ const forwardRef = (cb) => cb()
40
+ const React = { memo, forwardRef }
41
+ const BlockReactShadowedMemo = React.memo(() => {
42
+ return <div>shadowed</div>
43
+ })
44
+ const BlockShadowedMemo = memo(() => {
45
+ return <div>shadowed</div>
46
+ })
47
+ const BlockShadowedForwardRef = forwardRef((props, ref) => {
48
+ return \`\${props} \${ref}\`
49
+ })
50
+ }
51
+ return null
52
+ }
53
+ ` ,
54
+ } ,
55
+ {
56
+ code : `
57
+ import React, { memo } from 'react'
58
+
59
+ const TestComponent = function (memo) {
60
+ const Comp = memo(() => {
61
+ return <div>param shadowed</div>
62
+ })
63
+ return Comp
64
+ }
65
+ ` ,
66
+ } ,
67
+ {
68
+ code : `
69
+ import React, { memo } from 'react'
70
+
71
+ const TestComponent = function ({ memo }) {
72
+ const Comp = memo(() => {
73
+ return <div>destructured param shadowed</div>
74
+ })
75
+ return Comp
76
+ }
77
+ ` ,
78
+ } ,
79
+ {
80
+ code : `
81
+ import React, { memo, forwardRef } from 'react'
82
+
83
+ const TestComponent = function () {
84
+ function innerFunction() {
85
+ const memo = (cb) => cb()
86
+ const React = { forwardRef }
87
+ const Comp = memo(() => <div>nested shadowed</div>)
88
+ const ForwardComp = React.forwardRef(() => <div>nested</div>)
89
+ return [Comp, ForwardComp]
90
+ }
91
+ return innerFunction()
92
+ }
93
+ ` ,
94
+ } ,
32
95
{
33
96
code : `
34
97
import React, { forwardRef } from 'react'
35
98
36
99
const TestComponent = function () {
37
100
const { forwardRef } = { forwardRef: () => null }
38
-
39
101
const OtherComp = forwardRef((props, ref) => \`\${props} \${ref}\`)
40
-
41
102
return OtherComp
42
103
}
43
104
` ,
@@ -48,11 +109,9 @@ ruleTester.run('display-name', rule, {
48
109
49
110
const TestComponent = function () {
50
111
const memo = (cb) => cb()
51
-
52
112
const Comp = memo(() => {
53
113
return <div>shadowed</div>
54
114
})
55
-
56
115
return Comp
57
116
}
58
117
` ,
@@ -898,6 +957,181 @@ ruleTester.run('display-name', rule, {
898
957
] ) ,
899
958
900
959
invalid : parsers . all ( [
960
+ {
961
+ code : `
962
+ import React, { memo, forwardRef } from 'react'
963
+
964
+ const TestComponent = function () {
965
+ {
966
+ const BlockReactMemo = React.memo(() => {
967
+ return <div>not shadowed</div>
968
+ })
969
+
970
+ const BlockMemo = memo(() => {
971
+ return <div>not shadowed</div>
972
+ })
973
+
974
+ const BlockForwardRef = forwardRef((props, ref) => {
975
+ return \`\${props} \${ref}\`
976
+ })
977
+ }
978
+
979
+ return null
980
+ }
981
+ ` ,
982
+ errors : [
983
+ {
984
+ messageId : 'noDisplayName' ,
985
+ line : 6 ,
986
+ } ,
987
+ {
988
+ messageId : 'noDisplayName' ,
989
+ line : 10 ,
990
+ } ,
991
+ {
992
+ messageId : 'noDisplayName' ,
993
+ line : 14 ,
994
+ } ,
995
+ ] ,
996
+ } ,
997
+
998
+ {
999
+ code : `
1000
+ import React, { memo } from 'react'
1001
+
1002
+ const TestComponent = function () {
1003
+ const Comp = memo(() => {
1004
+ return <div>not param shadowed</div>
1005
+ })
1006
+
1007
+ return Comp
1008
+ }
1009
+ ` ,
1010
+ errors : [
1011
+ {
1012
+ messageId : 'noDisplayName' ,
1013
+ line : 5 ,
1014
+ } ,
1015
+ ] ,
1016
+ } ,
1017
+
1018
+ {
1019
+ code : `
1020
+ import React, { memo } from 'react'
1021
+
1022
+ const TestComponent = function () {
1023
+ const Comp = memo(() => {
1024
+ return <div>not destructured param shadowed</div>
1025
+ })
1026
+
1027
+ return Comp
1028
+ }
1029
+ ` ,
1030
+ errors : [
1031
+ {
1032
+ messageId : 'noDisplayName' ,
1033
+ line : 5 ,
1034
+ } ,
1035
+ ] ,
1036
+ } ,
1037
+
1038
+ {
1039
+ code : `
1040
+ import React, { memo, forwardRef } from 'react'
1041
+
1042
+ const TestComponent = function () {
1043
+ function innerFunction() {
1044
+ const Comp = memo(() => <div>nested not shadowed</div>)
1045
+ const ForwardComp = React.forwardRef(() => <div>nested</div>)
1046
+
1047
+ return [Comp, ForwardComp]
1048
+ }
1049
+
1050
+ return innerFunction()
1051
+ }
1052
+ ` ,
1053
+ errors : [
1054
+ {
1055
+ messageId : 'noDisplayName' ,
1056
+ line : 6 ,
1057
+ } ,
1058
+ {
1059
+ messageId : 'noDisplayName' ,
1060
+ line : 7 ,
1061
+ } ,
1062
+ ] ,
1063
+ } ,
1064
+ {
1065
+ code : `
1066
+ import React, { forwardRef } from 'react'
1067
+
1068
+ const TestComponent = function () {
1069
+ const OtherComp = forwardRef((props, ref) => \`\${props} \${ref}\`)
1070
+
1071
+ return OtherComp
1072
+ }
1073
+ ` ,
1074
+ errors : [
1075
+ {
1076
+ messageId : 'noDisplayName' ,
1077
+ line : 5 ,
1078
+ } ,
1079
+ ] ,
1080
+ } ,
1081
+ {
1082
+ code : `
1083
+ import React, { memo } from 'react'
1084
+
1085
+ const TestComponent = function () {
1086
+ const Comp = memo(() => {
1087
+ return <div>not shadowed</div>
1088
+ })
1089
+ return Comp
1090
+ }
1091
+ ` ,
1092
+ errors : [
1093
+ {
1094
+ messageId : 'noDisplayName' ,
1095
+ line : 5 ,
1096
+ } ,
1097
+ ] ,
1098
+ } ,
1099
+ {
1100
+ code : `
1101
+ import React, { memo, forwardRef } from 'react'
1102
+
1103
+ const MixedNotShadowed = function () {
1104
+ const Comp = memo(() => {
1105
+ return <div>not shadowed</div>
1106
+ })
1107
+ const ReactMemo = React.memo(() => null)
1108
+ const ReactForward = React.forwardRef((props, ref) => {
1109
+ return \`\${props} \${ref}\`
1110
+ })
1111
+ const OtherComp = forwardRef((props, ref) => \`\${props} \${ref}\`)
1112
+
1113
+ return [Comp, ReactMemo, ReactForward, OtherComp]
1114
+ }
1115
+ ` ,
1116
+ errors : [
1117
+ {
1118
+ messageId : 'noDisplayName' ,
1119
+ line : 5 ,
1120
+ } ,
1121
+ {
1122
+ messageId : 'noDisplayName' ,
1123
+ line : 8 ,
1124
+ } ,
1125
+ {
1126
+ messageId : 'noDisplayName' ,
1127
+ line : 9 ,
1128
+ } ,
1129
+ {
1130
+ messageId : 'noDisplayName' ,
1131
+ line : 12 ,
1132
+ } ,
1133
+ ] ,
1134
+ } ,
901
1135
{
902
1136
code : `
903
1137
import React from 'react'
0 commit comments