Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Commit 0081ef7

Browse files
authored
Add exception to rule S4144 when the function body is small. (#366)
1 parent 8a8fb10 commit 0081ef7

File tree

5 files changed

+78
-209
lines changed

5 files changed

+78
-209
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"eslint-config-prettier": "8.5.0",
5252
"eslint-plugin-import": "2.26.0",
5353
"eslint-plugin-notice": "0.9.10",
54-
"eslint-plugin-sonarjs": "0.14.0-570",
54+
"eslint-plugin-sonarjs": "0.14.0",
5555
"jest": "28.1.3",
5656
"jest-sonar-reporter": "2.0.0",
5757
"lint-staged": "13.0.3",
Lines changed: 6 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,16 @@
1-
src/Chart.js/src/core/core.layouts.js: 356
2-
src/Ghost/core/server/api/subscribers.js: 161
3-
src/Ghost/core/server/api/tags.js: 144
4-
src/Ghost/core/server/api/users.js: 200
5-
src/Ghost/core/server/models/base/index.js: 172
6-
src/Ghost/core/server/models/base/listeners.js: 115
7-
src/Ghost/core/server/models/base/utils.js: 82
8-
src/Ghost/core/server/web/middleware/error-handler.js: 136
9-
src/angular.js/benchmarks/ng-options-bp/app.js: 72
10-
src/angular.js/benchmarks/select-ng-value-bp/app.js: 81
11-
src/angular.js/src/ng/parse.js: 731,1071
12-
src/angular.js/src/ng/q.js: 267
13-
src/angular.js/src/ngMock/angular-mocks.js: 862
141
src/brackets/src/JSUtils/ScopeManager.js: 1009
15-
src/brackets/src/LiveDevelopment/LiveDevelopment.js: 1192
16-
src/brackets/src/command/Menus.js: 957,1005
17-
src/brackets/src/extensibility/ExtensionManagerViewModel.js: 616,630
18-
src/brackets/src/extensions/default/CSSAtRuleCodeHints/unittests.js: 133,194,215
19-
src/brackets/src/extensions/default/CSSCodeHints/unittests.js: 161,246,253,327,334,395,465,484,491,500,509,523,554,571,578,610,617
20-
src/brackets/src/extensions/default/CSSPseudoSelectorHints/unittests.js: 137,176,183
21-
src/brackets/src/extensions/default/CodeFolding/unittests.js: 403
22-
src/brackets/src/extensions/default/InlineColorEditor/unittests.js: 466
232
src/brackets/src/extensions/default/InlineTimingFunctionEditor/unittests.js: 280
24-
src/brackets/src/extensions/default/JavaScriptCodeHints/unittests.js: 763,1032,1478,1611
25-
src/brackets/src/extensions/default/JavaScriptQuickEdit/main.js: 155
26-
src/brackets/src/extensions/default/JavaScriptRefactoring/unittests.js: 432
27-
src/brackets/src/extensions/default/StaticServer/unittests.js: 158,213,257,313,337,363,384,410,433,472,486,528,547
28-
src/brackets/src/extensions/default/UrlCodeHints/main.js: 499
29-
src/brackets/src/extensions/default/UrlCodeHints/unittests.js: 586,711,738,759,783,806,831,883,891
30-
src/brackets/src/filesystem/FileSystemEntry.js: 423,427
31-
src/brackets/src/preferences/PreferencesBase.js: 1863
32-
src/brackets/src/project/WorkingSetView.js: 1242
33-
src/brackets/src/search/FindInFiles.js: 1000
343
src/brackets/src/utils/StringMatch.js: 141
35-
src/brackets/src/view/MainViewManager.js: 1540
36-
src/create-react-app/packages/react-dev-utils/WebpackDevServerUtils.js: 373
37-
src/freeCodeCamp/common/app/routes/Challenges/views/step/redux/step-challenge-epic.test.js: 85,118
38-
src/freeCodeCamp/server/boot/challenge.js: 217,322,331
39-
src/freeCodeCamp/server/utils/publicUserProps.js: 75
40-
src/jQuery-File-Upload/js/jquery.fileupload-ui.js: 207,268
41-
src/jQuery-File-Upload/js/jquery.fileupload.js: 1216
424
src/jest/packages/expect/src/asymmetric_matchers.js: 156
43-
src/jest/packages/jest-diff/src/diff_strings.js: 198
44-
src/jquery/external/qunit/qunit.js: 2387
455
src/jquery/external/sinon/sinon.js: 4934,5459,6411
46-
src/react-native/Libraries/Blob/FileReader.js: 113,120
47-
src/react-native/Libraries/Core/Timers/JSTimers.js: 466
48-
src/react-native/Libraries/Experimental/WindowedListView.js: 541
49-
src/react-native/Libraries/Lists/ListView/ListView.js: 398
6+
src/react/packages/react/src/ReactBaseClasses.js: 126
7+
src/react/packages/react-art/src/ReactART.js: 152
508
src/react-native/Libraries/Lists/VirtualizedList.js: 1701
51-
src/react-native/Libraries/Renderer/ReactFabric-dev.js: 3187,3208,3224,13354
52-
src/react-native/Libraries/Renderer/ReactFabric-prod.js: 5803,5809,5815
53-
src/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js: 3637,3658,3674,13724
54-
src/react-native/Libraries/Renderer/ReactNativeRenderer-prod.js: 6317,6323,6329
55-
src/react-native/Libraries/Storage/AsyncStorage.js: 90,116,284,309
56-
src/react-native/RNTester/js/ActionSheetIOSExample.js: 67,138,162
57-
src/react-native/RNTester/js/NativeAnimationsExample.js: 577
58-
src/react-native/RNTester/js/NavigatorIOSExample.js: 128
9+
src/react-native/Libraries/Renderer/ReactFabric-dev.js: 13354
10+
src/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js: 13724
11+
src/react-native/RNTester/js/ActionSheetIOSExample.js: 67,138
5912
src/react-native/RNTester/js/NetInfoExample.js: 72
60-
src/react-native/RNTester/js/PickerIOSExample.js: 117
61-
src/react-native/RNTester/js/TouchableExample.js: 244,291
62-
src/react-native/ReactAndroid/src/androidTest/js/MeasureLayoutTestModule.js: 98,133,155
63-
src/react-native/ReactAndroid/src/androidTest/js/ScrollViewTestModule.js: 105
64-
src/react-router/website/modules/animated/AnimatedAddition.js: 48
65-
src/react-router/website/modules/animated/AnimatedMultiplication.js: 48
6613
src/react-router/website/modules/components/EnvironmentSmall.js: 331
67-
src/react/packages/react-art/src/ReactART.js: 152,489,504
68-
src/react/packages/react/src/ReactBaseClasses.js: 126
69-
src/react/scripts/rollup/utils.js: 52,64
70-
src/spectrum/admin/src/components/avatar/index.js: 44,49
71-
src/spectrum/admin/src/components/buttons/style.js: 98,113,121,127
72-
src/spectrum/admin/src/views/navbar/style.js: 96,103
73-
src/spectrum/api/models/community.js: 251,279,294,338,369,400,426,441
74-
src/spectrum/api/models/directMessageThread.js: 135
75-
src/spectrum/api/models/user.js: 326,366,391
76-
src/spectrum/api/models/usersNotifications.js: 145
77-
src/spectrum/api/routes/api/slackImporter.js: 58
78-
src/spectrum/athena/queues/reaction-notification.js: 123
79-
src/spectrum/cypress/integration/channel/view/composer_spec.js: 57,70
80-
src/spectrum/cypress/integration/channel/view/threads_spec.js: 34
81-
src/spectrum/cypress/integration/thread/action_bar_spec.js: 120,262,268,288,294,358
82-
src/spectrum/hyperion/index.js: 50,58
83-
src/spectrum/pluto/changefeeds/privateChannel.js: 83
84-
src/spectrum/shared/graphql/queries/channel/getChannel.js: 75
85-
src/spectrum/shared/graphql/queries/user/getUser.js: 46
86-
src/spectrum/src/components/avatar/style.js: 95,113
87-
src/spectrum/src/components/buttons/style.js: 108,124,132,139,150,154,162,169
88-
src/spectrum/src/components/chatInput/index.js: 388,398
89-
src/spectrum/src/components/chatInput/style.js: 86,92,98
90-
src/spectrum/src/components/composer/index.js: 332
91-
src/spectrum/src/components/modals/DeleteDoubleCheckModal/index.js: 224,241
92-
src/spectrum/src/helpers/directMessageThreads.js: 15
93-
src/spectrum/src/views/explore/view.js: 162
9414
src/spectrum/src/views/notifications/components/mentionThreadNotification.js: 96
95-
src/spectrum/src/views/notifications/components/newChannelNotification.js: 108
96-
src/spectrum/src/views/notifications/components/newThreadNotification.js: 126,175
97-
src/spectrum/src/views/pages/style.js: 434
98-
src/spectrum/src/views/thread/components/actionBar.js: 161,191
99-
src/spectrum/vulcan/models/user.js: 60
100-
src/three.js/editor/js/Sidebar.Object.js: 583
15+
src/spectrum/src/views/notifications/components/newThreadNotification.js: 126
10116
src/vue/packages/weex-vue-framework/factory.js: 6593

src/rules/no-identical-functions.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,14 @@ const rule: TSESLint.RuleModule<string, Options> = {
6464
FunctionDeclaration(node: TSESTree.Node) {
6565
visitFunction(node as TSESTree.FunctionDeclaration);
6666
},
67-
FunctionExpression(node: TSESTree.Node) {
67+
'VariableDeclarator > FunctionExpression, MethodDefinition > FunctionExpression': (
68+
node: TSESTree.Node,
69+
) => {
6870
visitFunction(node as TSESTree.FunctionExpression);
6971
},
70-
ArrowFunctionExpression(node: TSESTree.Node) {
72+
'VariableDeclarator > ArrowFunctionExpression, MethodDefinition > ArrowFunctionExpression': (
73+
node: TSESTree.Node,
74+
) => {
7175
visitFunction(node as TSESTree.ArrowFunctionExpression);
7276
},
7377

tests/rules/no-identical-functions.test.ts

Lines changed: 58 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,18 @@ ruleTester.run('no-identical-functions', rule, {
7272
},
7373
{
7474
code: `
75-
const x = {
75+
class Foo {
7676
foo() {
7777
console.log("Hello");
7878
console.log("World");
7979
return 42;
80-
},
81-
80+
}
8281
bar() {
8382
console.log("Hello");
8483
console.log("World");
8584
return 42;
86-
},
87-
};`,
85+
}
86+
}`,
8887
options: [4],
8988
},
9089
],
@@ -225,128 +224,79 @@ ruleTester.run('no-identical-functions', rule, {
225224
},
226225
{
227226
code: `
228-
let foo = () => (
229-
[
230-
1,
231-
]
232-
)
233-
234-
let bar = () => (
235-
[
236-
1,
237-
]
238-
)`,
239-
errors: [message(2, 8)],
240-
},
241-
{
242-
// few nodes, but many lines
243-
code: `
244-
function foo1() {
245-
return [
246-
1,
247-
];
248-
}
249-
250-
function bar1() { // Noncompliant
251-
return [
252-
1,
253-
];
254-
}`,
255-
errors: [message(2, 8)],
227+
function foo(a, b) {
228+
a += b; b -= a; return {
229+
b
230+
};
231+
}
232+
function bar(a, b) {
233+
a += b; b -= a; return {
234+
b
235+
};
236+
}
237+
`,
238+
options: [3, 'sonar-runtime'],
239+
errors: [
240+
encodedMessage(2, 7, [
241+
{ line: 2, column: 17, endLine: 2, endColumn: 20, message: 'Original implementation' },
242+
]),
243+
],
256244
},
257245
{
258246
code: `
259-
const x = {
260-
data: function () {
261-
return {
262-
a: 2
247+
function foo(a) {
248+
try {
249+
return a;
250+
} catch {
251+
return 2 * a;
263252
}
264253
}
265-
}
266-
267-
const y = {
268-
data: function () {
269-
return {
270-
a: 2
254+
function bar(a) {
255+
try {
256+
return a;
257+
} catch {
258+
return 2 * a;
271259
}
272260
}
273-
}`,
274-
errors: [message(3, 11)],
261+
`,
262+
options: [3, 'sonar-runtime'],
263+
errors: [
264+
encodedMessage(2, 9, [
265+
{ line: 2, column: 17, endLine: 2, endColumn: 20, message: 'Original implementation' },
266+
]),
267+
],
275268
},
276269
{
277270
code: `
278-
const x = {
279-
foo() {
280-
console.log("Hello");
281-
console.log("World");
282-
return 42;
283-
},
284-
285-
bar() {
286-
console.log("Hello");
287-
console.log("World");
288-
return 42;
289-
},
290-
};`,
291-
errors: [
292-
{
293-
messageId: 'identicalFunctions',
294-
data: {
295-
line: 3,
296-
},
297-
line: 9,
298-
column: 9,
299-
endColumn: 12,
300-
},
301-
],
271+
class Foo {
272+
foo() {
273+
console.log("Hello");
274+
console.log("World");
275+
return 42;
276+
}
277+
bar() {
278+
console.log("Hello");
279+
console.log("World");
280+
return 42;
281+
}
282+
}
283+
`,
284+
errors: [message(3, 8)],
302285
},
303286
{
304287
code: `
305-
const x = {
306-
foo() {
307-
//^^^>
288+
const foo = () => {
308289
console.log("Hello");
309290
console.log("World");
310291
return 42;
311-
},
312-
313-
bar() {
314-
//^^^
292+
};
293+
const bar = () => {
315294
console.log("Hello");
316295
console.log("World");
317296
return 42;
318-
},
319-
};`,
320-
options: [3, 'sonar-runtime'],
321-
errors: [
322-
encodedMessage(3, 10, [
323-
{ line: 3, column: 8, endLine: 3, endColumn: 11, message: 'Original implementation' },
324-
]),
325-
],
326-
},
327-
{
328-
// few nodes, but many lines
329-
code: `
330-
function foo1() {
331-
// ^^^^>
332-
return [
333-
1,
334-
2,
335-
];
336-
}
337-
function bar1() {
338-
// ^^^^
339-
return [
340-
1,
341-
2,
342-
];
343-
}`,
344-
options: [4, 'sonar-runtime'],
345-
errors: [
346-
encodedMessage(2, 9, [
347-
{ line: 2, column: 15, endLine: 2, endColumn: 19, message: 'Original implementation' },
348-
]),
349-
],
297+
};
298+
`,
299+
errors: [message(2, 7)],
350300
},
351301
],
352302
});

0 commit comments

Comments
 (0)