diff --git a/package-lock.json b/package-lock.json index f733fd42..9dd827cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,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", @@ -4578,9 +4578,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "0.14.0-570", - "resolved": "https://repox.jfrog.io/repox/api/npm/npm/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.14.0-570.tgz", - "integrity": "sha1-t+BfKEnvIHrzW8s0KeRiMahV1fw=", + "version": "0.14.0", + "resolved": "https://repox.jfrog.io/repox/api/npm/npm/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.14.0.tgz", + "integrity": "sha1-ES0Vm6dRaippuxptbKt4LiO8olk=", "dev": true, "license": "LGPL-3.0", "engines": { @@ -12788,9 +12788,9 @@ } }, "eslint-plugin-sonarjs": { - "version": "0.14.0-570", - "resolved": "https://repox.jfrog.io/repox/api/npm/npm/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.14.0-570.tgz", - "integrity": "sha1-t+BfKEnvIHrzW8s0KeRiMahV1fw=", + "version": "0.14.0", + "resolved": "https://repox.jfrog.io/repox/api/npm/npm/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.14.0.tgz", + "integrity": "sha1-ES0Vm6dRaippuxptbKt4LiO8olk=", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 945e5435..6b72d805 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/ruling/snapshots/no-identical-functions b/ruling/snapshots/no-identical-functions index cba3eb53..ac47440b 100644 --- a/ruling/snapshots/no-identical-functions +++ b/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 diff --git a/src/rules/no-identical-functions.ts b/src/rules/no-identical-functions.ts index 9d6e5b24..34ce50f7 100644 --- a/src/rules/no-identical-functions.ts +++ b/src/rules/no-identical-functions.ts @@ -64,10 +64,14 @@ const rule: TSESLint.RuleModule = { 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); }, diff --git a/tests/rules/no-identical-functions.test.ts b/tests/rules/no-identical-functions.test.ts index 742c0c52..50e3c089 100644 --- a/tests/rules/no-identical-functions.test.ts +++ b/tests/rules/no-identical-functions.test.ts @@ -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], }, ], @@ -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)], }, ], });