Skip to content

Commit

Permalink
Add exception to rule S4144 when the function body is small. (#366)
Browse files Browse the repository at this point in the history
  • Loading branch information
francoismora committed Aug 8, 2022
1 parent 8a8fb10 commit 0081ef7
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 209 deletions.
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -51,7 +51,7 @@
"eslint-config-prettier": "8.5.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-notice": "0.9.10",
"eslint-plugin-sonarjs": "0.14.0-570",
"eslint-plugin-sonarjs": "0.14.0",
"jest": "28.1.3",
"jest-sonar-reporter": "2.0.0",
"lint-staged": "13.0.3",
Expand Down
97 changes: 6 additions & 91 deletions ruling/snapshots/no-identical-functions
@@ -1,101 +1,16 @@
src/Chart.js/src/core/core.layouts.js: 356
src/Ghost/core/server/api/subscribers.js: 161
src/Ghost/core/server/api/tags.js: 144
src/Ghost/core/server/api/users.js: 200
src/Ghost/core/server/models/base/index.js: 172
src/Ghost/core/server/models/base/listeners.js: 115
src/Ghost/core/server/models/base/utils.js: 82
src/Ghost/core/server/web/middleware/error-handler.js: 136
src/angular.js/benchmarks/ng-options-bp/app.js: 72
src/angular.js/benchmarks/select-ng-value-bp/app.js: 81
src/angular.js/src/ng/parse.js: 731,1071
src/angular.js/src/ng/q.js: 267
src/angular.js/src/ngMock/angular-mocks.js: 862
src/brackets/src/JSUtils/ScopeManager.js: 1009
src/brackets/src/LiveDevelopment/LiveDevelopment.js: 1192
src/brackets/src/command/Menus.js: 957,1005
src/brackets/src/extensibility/ExtensionManagerViewModel.js: 616,630
src/brackets/src/extensions/default/CSSAtRuleCodeHints/unittests.js: 133,194,215
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
src/brackets/src/extensions/default/CSSPseudoSelectorHints/unittests.js: 137,176,183
src/brackets/src/extensions/default/CodeFolding/unittests.js: 403
src/brackets/src/extensions/default/InlineColorEditor/unittests.js: 466
src/brackets/src/extensions/default/InlineTimingFunctionEditor/unittests.js: 280
src/brackets/src/extensions/default/JavaScriptCodeHints/unittests.js: 763,1032,1478,1611
src/brackets/src/extensions/default/JavaScriptQuickEdit/main.js: 155
src/brackets/src/extensions/default/JavaScriptRefactoring/unittests.js: 432
src/brackets/src/extensions/default/StaticServer/unittests.js: 158,213,257,313,337,363,384,410,433,472,486,528,547
src/brackets/src/extensions/default/UrlCodeHints/main.js: 499
src/brackets/src/extensions/default/UrlCodeHints/unittests.js: 586,711,738,759,783,806,831,883,891
src/brackets/src/filesystem/FileSystemEntry.js: 423,427
src/brackets/src/preferences/PreferencesBase.js: 1863
src/brackets/src/project/WorkingSetView.js: 1242
src/brackets/src/search/FindInFiles.js: 1000
src/brackets/src/utils/StringMatch.js: 141
src/brackets/src/view/MainViewManager.js: 1540
src/create-react-app/packages/react-dev-utils/WebpackDevServerUtils.js: 373
src/freeCodeCamp/common/app/routes/Challenges/views/step/redux/step-challenge-epic.test.js: 85,118
src/freeCodeCamp/server/boot/challenge.js: 217,322,331
src/freeCodeCamp/server/utils/publicUserProps.js: 75
src/jQuery-File-Upload/js/jquery.fileupload-ui.js: 207,268
src/jQuery-File-Upload/js/jquery.fileupload.js: 1216
src/jest/packages/expect/src/asymmetric_matchers.js: 156
src/jest/packages/jest-diff/src/diff_strings.js: 198
src/jquery/external/qunit/qunit.js: 2387
src/jquery/external/sinon/sinon.js: 4934,5459,6411
src/react-native/Libraries/Blob/FileReader.js: 113,120
src/react-native/Libraries/Core/Timers/JSTimers.js: 466
src/react-native/Libraries/Experimental/WindowedListView.js: 541
src/react-native/Libraries/Lists/ListView/ListView.js: 398
src/react/packages/react/src/ReactBaseClasses.js: 126
src/react/packages/react-art/src/ReactART.js: 152
src/react-native/Libraries/Lists/VirtualizedList.js: 1701
src/react-native/Libraries/Renderer/ReactFabric-dev.js: 3187,3208,3224,13354
src/react-native/Libraries/Renderer/ReactFabric-prod.js: 5803,5809,5815
src/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js: 3637,3658,3674,13724
src/react-native/Libraries/Renderer/ReactNativeRenderer-prod.js: 6317,6323,6329
src/react-native/Libraries/Storage/AsyncStorage.js: 90,116,284,309
src/react-native/RNTester/js/ActionSheetIOSExample.js: 67,138,162
src/react-native/RNTester/js/NativeAnimationsExample.js: 577
src/react-native/RNTester/js/NavigatorIOSExample.js: 128
src/react-native/Libraries/Renderer/ReactFabric-dev.js: 13354
src/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js: 13724
src/react-native/RNTester/js/ActionSheetIOSExample.js: 67,138
src/react-native/RNTester/js/NetInfoExample.js: 72
src/react-native/RNTester/js/PickerIOSExample.js: 117
src/react-native/RNTester/js/TouchableExample.js: 244,291
src/react-native/ReactAndroid/src/androidTest/js/MeasureLayoutTestModule.js: 98,133,155
src/react-native/ReactAndroid/src/androidTest/js/ScrollViewTestModule.js: 105
src/react-router/website/modules/animated/AnimatedAddition.js: 48
src/react-router/website/modules/animated/AnimatedMultiplication.js: 48
src/react-router/website/modules/components/EnvironmentSmall.js: 331
src/react/packages/react-art/src/ReactART.js: 152,489,504
src/react/packages/react/src/ReactBaseClasses.js: 126
src/react/scripts/rollup/utils.js: 52,64
src/spectrum/admin/src/components/avatar/index.js: 44,49
src/spectrum/admin/src/components/buttons/style.js: 98,113,121,127
src/spectrum/admin/src/views/navbar/style.js: 96,103
src/spectrum/api/models/community.js: 251,279,294,338,369,400,426,441
src/spectrum/api/models/directMessageThread.js: 135
src/spectrum/api/models/user.js: 326,366,391
src/spectrum/api/models/usersNotifications.js: 145
src/spectrum/api/routes/api/slackImporter.js: 58
src/spectrum/athena/queues/reaction-notification.js: 123
src/spectrum/cypress/integration/channel/view/composer_spec.js: 57,70
src/spectrum/cypress/integration/channel/view/threads_spec.js: 34
src/spectrum/cypress/integration/thread/action_bar_spec.js: 120,262,268,288,294,358
src/spectrum/hyperion/index.js: 50,58
src/spectrum/pluto/changefeeds/privateChannel.js: 83
src/spectrum/shared/graphql/queries/channel/getChannel.js: 75
src/spectrum/shared/graphql/queries/user/getUser.js: 46
src/spectrum/src/components/avatar/style.js: 95,113
src/spectrum/src/components/buttons/style.js: 108,124,132,139,150,154,162,169
src/spectrum/src/components/chatInput/index.js: 388,398
src/spectrum/src/components/chatInput/style.js: 86,92,98
src/spectrum/src/components/composer/index.js: 332
src/spectrum/src/components/modals/DeleteDoubleCheckModal/index.js: 224,241
src/spectrum/src/helpers/directMessageThreads.js: 15
src/spectrum/src/views/explore/view.js: 162
src/spectrum/src/views/notifications/components/mentionThreadNotification.js: 96
src/spectrum/src/views/notifications/components/newChannelNotification.js: 108
src/spectrum/src/views/notifications/components/newThreadNotification.js: 126,175
src/spectrum/src/views/pages/style.js: 434
src/spectrum/src/views/thread/components/actionBar.js: 161,191
src/spectrum/vulcan/models/user.js: 60
src/three.js/editor/js/Sidebar.Object.js: 583
src/spectrum/src/views/notifications/components/newThreadNotification.js: 126
src/vue/packages/weex-vue-framework/factory.js: 6593
8 changes: 6 additions & 2 deletions src/rules/no-identical-functions.ts
Expand Up @@ -64,10 +64,14 @@ const rule: TSESLint.RuleModule<string, Options> = {
FunctionDeclaration(node: TSESTree.Node) {
visitFunction(node as TSESTree.FunctionDeclaration);
},
FunctionExpression(node: TSESTree.Node) {
'VariableDeclarator > FunctionExpression, MethodDefinition > FunctionExpression': (
node: TSESTree.Node,
) => {
visitFunction(node as TSESTree.FunctionExpression);
},
ArrowFunctionExpression(node: TSESTree.Node) {
'VariableDeclarator > ArrowFunctionExpression, MethodDefinition > ArrowFunctionExpression': (
node: TSESTree.Node,
) => {
visitFunction(node as TSESTree.ArrowFunctionExpression);
},

Expand Down
166 changes: 58 additions & 108 deletions tests/rules/no-identical-functions.test.ts
Expand Up @@ -72,19 +72,18 @@ ruleTester.run('no-identical-functions', rule, {
},
{
code: `
const x = {
class Foo {
foo() {
console.log("Hello");
console.log("World");
return 42;
},
}
bar() {
console.log("Hello");
console.log("World");
return 42;
},
};`,
}
}`,
options: [4],
},
],
Expand Down Expand Up @@ -225,128 +224,79 @@ ruleTester.run('no-identical-functions', rule, {
},
{
code: `
let foo = () => (
[
1,
]
)
let bar = () => (
[
1,
]
)`,
errors: [message(2, 8)],
},
{
// few nodes, but many lines
code: `
function foo1() {
return [
1,
];
}
function bar1() { // Noncompliant
return [
1,
];
}`,
errors: [message(2, 8)],
function foo(a, b) {
a += b; b -= a; return {
b
};
}
function bar(a, b) {
a += b; b -= a; return {
b
};
}
`,
options: [3, 'sonar-runtime'],
errors: [
encodedMessage(2, 7, [
{ line: 2, column: 17, endLine: 2, endColumn: 20, message: 'Original implementation' },
]),
],
},
{
code: `
const x = {
data: function () {
return {
a: 2
function foo(a) {
try {
return a;
} catch {
return 2 * a;
}
}
}
const y = {
data: function () {
return {
a: 2
function bar(a) {
try {
return a;
} catch {
return 2 * a;
}
}
}`,
errors: [message(3, 11)],
`,
options: [3, 'sonar-runtime'],
errors: [
encodedMessage(2, 9, [
{ line: 2, column: 17, endLine: 2, endColumn: 20, message: 'Original implementation' },
]),
],
},
{
code: `
const x = {
foo() {
console.log("Hello");
console.log("World");
return 42;
},
bar() {
console.log("Hello");
console.log("World");
return 42;
},
};`,
errors: [
{
messageId: 'identicalFunctions',
data: {
line: 3,
},
line: 9,
column: 9,
endColumn: 12,
},
],
class Foo {
foo() {
console.log("Hello");
console.log("World");
return 42;
}
bar() {
console.log("Hello");
console.log("World");
return 42;
}
}
`,
errors: [message(3, 8)],
},
{
code: `
const x = {
foo() {
//^^^>
const foo = () => {
console.log("Hello");
console.log("World");
return 42;
},
bar() {
//^^^
};
const bar = () => {
console.log("Hello");
console.log("World");
return 42;
},
};`,
options: [3, 'sonar-runtime'],
errors: [
encodedMessage(3, 10, [
{ line: 3, column: 8, endLine: 3, endColumn: 11, message: 'Original implementation' },
]),
],
},
{
// few nodes, but many lines
code: `
function foo1() {
// ^^^^>
return [
1,
2,
];
}
function bar1() {
// ^^^^
return [
1,
2,
];
}`,
options: [4, 'sonar-runtime'],
errors: [
encodedMessage(2, 9, [
{ line: 2, column: 15, endLine: 2, endColumn: 19, message: 'Original implementation' },
]),
],
};
`,
errors: [message(2, 7)],
},
],
});
Expand Down

0 comments on commit 0081ef7

Please sign in to comment.