Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add exception to rule S4144 when the function body is small. #366

Merged
merged 6 commits into from Aug 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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