bahlint 28.58.6934-dev-001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +19 -0
- package/README.md +354 -0
- package/bin/bahlint.js +267 -0
- package/bin/eslint.js +194 -0
- package/conf/ecma-version.js +16 -0
- package/conf/globals.js +169 -0
- package/conf/replacements.json +26 -0
- package/conf/rule-type-list.json +91 -0
- package/lib/api.js +39 -0
- package/lib/cli-engine/formatters/formatters-meta.json +18 -0
- package/lib/cli-engine/formatters/html.js +359 -0
- package/lib/cli-engine/formatters/json-with-metadata.js +16 -0
- package/lib/cli-engine/formatters/json.js +13 -0
- package/lib/cli-engine/formatters/stylish.js +153 -0
- package/lib/cli-engine/hash.js +35 -0
- package/lib/cli-engine/lint-result-cache.js +220 -0
- package/lib/cli.js +521 -0
- package/lib/config/config-loader.js +668 -0
- package/lib/config/config.js +674 -0
- package/lib/config/default-config.js +78 -0
- package/lib/config/flat-config-array.js +217 -0
- package/lib/config/flat-config-schema.js +598 -0
- package/lib/config-api.js +12 -0
- package/lib/eslint/eslint-helpers.js +1462 -0
- package/lib/eslint/eslint.js +1364 -0
- package/lib/eslint/index.js +7 -0
- package/lib/eslint/worker.js +173 -0
- package/lib/languages/js/index.js +336 -0
- package/lib/languages/js/source-code/index.js +7 -0
- package/lib/languages/js/source-code/source-code.js +1178 -0
- package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +61 -0
- package/lib/languages/js/source-code/token-store/backward-token-cursor.js +57 -0
- package/lib/languages/js/source-code/token-store/cursor.js +76 -0
- package/lib/languages/js/source-code/token-store/cursors.js +120 -0
- package/lib/languages/js/source-code/token-store/decorative-cursor.js +38 -0
- package/lib/languages/js/source-code/token-store/filter-cursor.js +42 -0
- package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +65 -0
- package/lib/languages/js/source-code/token-store/forward-token-cursor.js +62 -0
- package/lib/languages/js/source-code/token-store/index.js +695 -0
- package/lib/languages/js/source-code/token-store/limit-cursor.js +39 -0
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
- package/lib/languages/js/source-code/token-store/skip-cursor.js +41 -0
- package/lib/languages/js/source-code/token-store/utils.js +131 -0
- package/lib/languages/js/validate-language-options.js +196 -0
- package/lib/linter/apply-disable-directives.js +583 -0
- package/lib/linter/code-path-analysis/code-path-analyzer.js +828 -0
- package/lib/linter/code-path-analysis/code-path-segment.js +262 -0
- package/lib/linter/code-path-analysis/code-path-state.js +2370 -0
- package/lib/linter/code-path-analysis/code-path.js +332 -0
- package/lib/linter/code-path-analysis/debug-helpers.js +223 -0
- package/lib/linter/code-path-analysis/fork-context.js +374 -0
- package/lib/linter/code-path-analysis/id-generator.js +44 -0
- package/lib/linter/esquery.js +332 -0
- package/lib/linter/file-context.js +88 -0
- package/lib/linter/file-report.js +604 -0
- package/lib/linter/index.js +11 -0
- package/lib/linter/interpolate.js +50 -0
- package/lib/linter/linter.js +1614 -0
- package/lib/linter/rule-fixer.js +199 -0
- package/lib/linter/source-code-fixer.js +154 -0
- package/lib/linter/source-code-traverser.js +333 -0
- package/lib/linter/source-code-visitor.js +81 -0
- package/lib/linter/timing.js +209 -0
- package/lib/linter/vfile.js +115 -0
- package/lib/options.js +416 -0
- package/lib/rule-tester/index.js +7 -0
- package/lib/rule-tester/rule-tester.js +1989 -0
- package/lib/rules/accessor-pairs.js +420 -0
- package/lib/rules/array-bracket-newline.js +291 -0
- package/lib/rules/array-bracket-spacing.js +301 -0
- package/lib/rules/array-callback-return.js +493 -0
- package/lib/rules/array-element-newline.js +374 -0
- package/lib/rules/arrow-body-style.js +418 -0
- package/lib/rules/arrow-parens.js +237 -0
- package/lib/rules/arrow-spacing.js +188 -0
- package/lib/rules/block-scoped-var.js +137 -0
- package/lib/rules/block-spacing.js +202 -0
- package/lib/rules/brace-style.js +278 -0
- package/lib/rules/callback-return.js +216 -0
- package/lib/rules/camelcase.js +422 -0
- package/lib/rules/capitalized-comments.js +325 -0
- package/lib/rules/class-methods-use-this.js +250 -0
- package/lib/rules/comma-dangle.js +424 -0
- package/lib/rules/comma-spacing.js +205 -0
- package/lib/rules/comma-style.js +391 -0
- package/lib/rules/complexity.js +201 -0
- package/lib/rules/computed-property-spacing.js +251 -0
- package/lib/rules/consistent-return.js +221 -0
- package/lib/rules/consistent-this.js +179 -0
- package/lib/rules/constructor-super.js +453 -0
- package/lib/rules/curly.js +425 -0
- package/lib/rules/default-case-last.js +51 -0
- package/lib/rules/default-case.js +103 -0
- package/lib/rules/default-param-last.js +78 -0
- package/lib/rules/dot-location.js +138 -0
- package/lib/rules/dot-notation.js +216 -0
- package/lib/rules/eol-last.js +135 -0
- package/lib/rules/eqeqeq.js +210 -0
- package/lib/rules/for-direction.js +168 -0
- package/lib/rules/func-call-spacing.js +281 -0
- package/lib/rules/func-name-matching.js +338 -0
- package/lib/rules/func-names.js +194 -0
- package/lib/rules/func-style.js +221 -0
- package/lib/rules/function-call-argument-newline.js +166 -0
- package/lib/rules/function-paren-newline.js +368 -0
- package/lib/rules/generator-star-spacing.js +246 -0
- package/lib/rules/getter-return.js +242 -0
- package/lib/rules/global-require.js +117 -0
- package/lib/rules/grouped-accessor-pairs.js +268 -0
- package/lib/rules/guard-for-in.js +85 -0
- package/lib/rules/handle-callback-err.js +122 -0
- package/lib/rules/id-blacklist.js +241 -0
- package/lib/rules/id-denylist.js +223 -0
- package/lib/rules/id-length.js +217 -0
- package/lib/rules/id-match.js +363 -0
- package/lib/rules/implicit-arrow-linebreak.js +125 -0
- package/lib/rules/indent-legacy.js +1369 -0
- package/lib/rules/indent.js +2334 -0
- package/lib/rules/index.js +332 -0
- package/lib/rules/init-declarations.js +172 -0
- package/lib/rules/jsx-quotes.js +128 -0
- package/lib/rules/key-spacing.js +822 -0
- package/lib/rules/keyword-spacing.js +701 -0
- package/lib/rules/line-comment-position.js +157 -0
- package/lib/rules/linebreak-style.js +135 -0
- package/lib/rules/lines-around-comment.js +581 -0
- package/lib/rules/lines-around-directive.js +249 -0
- package/lib/rules/lines-between-class-members.js +358 -0
- package/lib/rules/logical-assignment-operators.js +688 -0
- package/lib/rules/max-classes-per-file.js +90 -0
- package/lib/rules/max-depth.js +159 -0
- package/lib/rules/max-len.js +497 -0
- package/lib/rules/max-lines-per-function.js +238 -0
- package/lib/rules/max-lines.js +189 -0
- package/lib/rules/max-nested-callbacks.js +115 -0
- package/lib/rules/max-params.js +148 -0
- package/lib/rules/max-statements-per-line.js +224 -0
- package/lib/rules/max-statements.js +188 -0
- package/lib/rules/multiline-comment-style.js +652 -0
- package/lib/rules/multiline-ternary.js +257 -0
- package/lib/rules/new-cap.js +277 -0
- package/lib/rules/new-parens.js +120 -0
- package/lib/rules/newline-after-var.js +307 -0
- package/lib/rules/newline-before-return.js +242 -0
- package/lib/rules/newline-per-chained-call.js +159 -0
- package/lib/rules/no-alert.js +149 -0
- package/lib/rules/no-array-constructor.js +195 -0
- package/lib/rules/no-async-promise-executor.js +45 -0
- package/lib/rules/no-await-in-loop.js +115 -0
- package/lib/rules/no-bitwise.js +145 -0
- package/lib/rules/no-buffer-constructor.js +74 -0
- package/lib/rules/no-caller.js +52 -0
- package/lib/rules/no-case-declarations.js +80 -0
- package/lib/rules/no-catch-shadow.js +96 -0
- package/lib/rules/no-class-assign.js +66 -0
- package/lib/rules/no-compare-neg-zero.js +74 -0
- package/lib/rules/no-cond-assign.js +175 -0
- package/lib/rules/no-confusing-arrow.js +127 -0
- package/lib/rules/no-console.js +221 -0
- package/lib/rules/no-const-assign.js +73 -0
- package/lib/rules/no-constant-binary-expression.js +603 -0
- package/lib/rules/no-constant-condition.js +177 -0
- package/lib/rules/no-constructor-return.js +62 -0
- package/lib/rules/no-continue.js +38 -0
- package/lib/rules/no-control-regex.js +142 -0
- package/lib/rules/no-debugger.js +41 -0
- package/lib/rules/no-delete-var.js +42 -0
- package/lib/rules/no-div-regex.js +60 -0
- package/lib/rules/no-dupe-args.js +92 -0
- package/lib/rules/no-dupe-class-members.js +117 -0
- package/lib/rules/no-dupe-else-if.js +145 -0
- package/lib/rules/no-dupe-keys.js +165 -0
- package/lib/rules/no-duplicate-case.js +78 -0
- package/lib/rules/no-duplicate-imports.js +368 -0
- package/lib/rules/no-else-return.js +450 -0
- package/lib/rules/no-empty-character-class.js +83 -0
- package/lib/rules/no-empty-function.js +236 -0
- package/lib/rules/no-empty-pattern.js +85 -0
- package/lib/rules/no-empty-static-block.js +73 -0
- package/lib/rules/no-empty.js +153 -0
- package/lib/rules/no-eq-null.js +51 -0
- package/lib/rules/no-eval.js +295 -0
- package/lib/rules/no-ex-assign.js +57 -0
- package/lib/rules/no-extend-native.js +180 -0
- package/lib/rules/no-extra-bind.js +224 -0
- package/lib/rules/no-extra-boolean-cast.js +420 -0
- package/lib/rules/no-extra-label.js +169 -0
- package/lib/rules/no-extra-parens.js +1669 -0
- package/lib/rules/no-extra-semi.js +167 -0
- package/lib/rules/no-fallthrough.js +260 -0
- package/lib/rules/no-floating-decimal.js +99 -0
- package/lib/rules/no-func-assign.js +77 -0
- package/lib/rules/no-global-assign.js +101 -0
- package/lib/rules/no-implicit-coercion.js +468 -0
- package/lib/rules/no-implicit-globals.js +187 -0
- package/lib/rules/no-implied-eval.js +170 -0
- package/lib/rules/no-import-assign.js +227 -0
- package/lib/rules/no-inline-comments.js +115 -0
- package/lib/rules/no-inner-declarations.js +147 -0
- package/lib/rules/no-invalid-regexp.js +244 -0
- package/lib/rules/no-invalid-this.js +178 -0
- package/lib/rules/no-irregular-whitespace.js +292 -0
- package/lib/rules/no-iterator.js +48 -0
- package/lib/rules/no-label-var.js +78 -0
- package/lib/rules/no-labels.js +156 -0
- package/lib/rules/no-lone-blocks.js +140 -0
- package/lib/rules/no-lonely-if.js +126 -0
- package/lib/rules/no-loop-func.js +267 -0
- package/lib/rules/no-loss-of-precision.js +249 -0
- package/lib/rules/no-magic-numbers.js +365 -0
- package/lib/rules/no-misleading-character-class.js +595 -0
- package/lib/rules/no-mixed-operators.js +253 -0
- package/lib/rules/no-mixed-requires.js +267 -0
- package/lib/rules/no-mixed-spaces-and-tabs.js +148 -0
- package/lib/rules/no-multi-assign.js +66 -0
- package/lib/rules/no-multi-spaces.js +179 -0
- package/lib/rules/no-multi-str.js +67 -0
- package/lib/rules/no-multiple-empty-lines.js +210 -0
- package/lib/rules/no-native-reassign.js +114 -0
- package/lib/rules/no-negated-condition.js +100 -0
- package/lib/rules/no-negated-in-lhs.js +59 -0
- package/lib/rules/no-nested-ternary.js +46 -0
- package/lib/rules/no-new-func.js +96 -0
- package/lib/rules/no-new-native-nonconstructor.js +70 -0
- package/lib/rules/no-new-object.js +76 -0
- package/lib/rules/no-new-require.js +67 -0
- package/lib/rules/no-new-symbol.js +74 -0
- package/lib/rules/no-new-wrappers.js +62 -0
- package/lib/rules/no-new.js +42 -0
- package/lib/rules/no-nonoctal-decimal-escape.js +176 -0
- package/lib/rules/no-obj-calls.js +99 -0
- package/lib/rules/no-object-constructor.js +124 -0
- package/lib/rules/no-octal-escape.js +53 -0
- package/lib/rules/no-octal.js +42 -0
- package/lib/rules/no-param-reassign.js +248 -0
- package/lib/rules/no-path-concat.js +79 -0
- package/lib/rules/no-plusplus.js +102 -0
- package/lib/rules/no-process-env.js +68 -0
- package/lib/rules/no-process-exit.js +67 -0
- package/lib/rules/no-promise-executor-return.js +264 -0
- package/lib/rules/no-proto.js +45 -0
- package/lib/rules/no-prototype-builtins.js +181 -0
- package/lib/rules/no-redeclare.js +173 -0
- package/lib/rules/no-regex-spaces.js +219 -0
- package/lib/rules/no-restricted-exports.js +227 -0
- package/lib/rules/no-restricted-globals.js +266 -0
- package/lib/rules/no-restricted-imports.js +892 -0
- package/lib/rules/no-restricted-modules.js +249 -0
- package/lib/rules/no-restricted-properties.js +233 -0
- package/lib/rules/no-restricted-syntax.js +74 -0
- package/lib/rules/no-return-assign.js +87 -0
- package/lib/rules/no-return-await.js +162 -0
- package/lib/rules/no-script-url.js +68 -0
- package/lib/rules/no-self-assign.js +186 -0
- package/lib/rules/no-self-compare.js +77 -0
- package/lib/rules/no-sequences.js +158 -0
- package/lib/rules/no-setter-return.js +224 -0
- package/lib/rules/no-shadow-restricted-names.js +113 -0
- package/lib/rules/no-shadow.js +624 -0
- package/lib/rules/no-spaced-func.js +105 -0
- package/lib/rules/no-sparse-arrays.js +68 -0
- package/lib/rules/no-sync.js +81 -0
- package/lib/rules/no-tabs.js +110 -0
- package/lib/rules/no-template-curly-in-string.js +45 -0
- package/lib/rules/no-ternary.js +38 -0
- package/lib/rules/no-this-before-super.js +365 -0
- package/lib/rules/no-throw-literal.js +46 -0
- package/lib/rules/no-trailing-spaces.js +227 -0
- package/lib/rules/no-unassigned-vars.js +80 -0
- package/lib/rules/no-undef-init.js +101 -0
- package/lib/rules/no-undef.js +84 -0
- package/lib/rules/no-undefined.js +85 -0
- package/lib/rules/no-underscore-dangle.js +383 -0
- package/lib/rules/no-unexpected-multiline.js +130 -0
- package/lib/rules/no-unmodified-loop-condition.js +360 -0
- package/lib/rules/no-unneeded-ternary.js +232 -0
- package/lib/rules/no-unreachable-loop.js +190 -0
- package/lib/rules/no-unreachable.js +300 -0
- package/lib/rules/no-unsafe-finally.js +119 -0
- package/lib/rules/no-unsafe-negation.js +152 -0
- package/lib/rules/no-unsafe-optional-chaining.js +221 -0
- package/lib/rules/no-unused-expressions.js +227 -0
- package/lib/rules/no-unused-labels.js +158 -0
- package/lib/rules/no-unused-private-class-members.js +219 -0
- package/lib/rules/no-unused-vars.js +1739 -0
- package/lib/rules/no-use-before-define.js +446 -0
- package/lib/rules/no-useless-assignment.js +657 -0
- package/lib/rules/no-useless-backreference.js +263 -0
- package/lib/rules/no-useless-call.js +95 -0
- package/lib/rules/no-useless-catch.js +57 -0
- package/lib/rules/no-useless-computed-key.js +204 -0
- package/lib/rules/no-useless-concat.js +121 -0
- package/lib/rules/no-useless-constructor.js +262 -0
- package/lib/rules/no-useless-escape.js +406 -0
- package/lib/rules/no-useless-rename.js +202 -0
- package/lib/rules/no-useless-return.js +401 -0
- package/lib/rules/no-var.js +367 -0
- package/lib/rules/no-void.js +69 -0
- package/lib/rules/no-warning-comments.js +209 -0
- package/lib/rules/no-whitespace-before-property.js +150 -0
- package/lib/rules/no-with.js +37 -0
- package/lib/rules/nonblock-statement-body-position.js +164 -0
- package/lib/rules/object-curly-newline.js +383 -0
- package/lib/rules/object-curly-spacing.js +369 -0
- package/lib/rules/object-property-newline.js +151 -0
- package/lib/rules/object-shorthand.js +652 -0
- package/lib/rules/one-var-declaration-per-line.js +117 -0
- package/lib/rules/one-var.js +717 -0
- package/lib/rules/operator-assignment.js +270 -0
- package/lib/rules/operator-linebreak.js +315 -0
- package/lib/rules/padded-blocks.js +366 -0
- package/lib/rules/padding-line-between-statements.js +612 -0
- package/lib/rules/prefer-arrow-callback.js +437 -0
- package/lib/rules/prefer-const.js +546 -0
- package/lib/rules/prefer-destructuring.js +332 -0
- package/lib/rules/prefer-exponentiation-operator.js +235 -0
- package/lib/rules/prefer-named-capture-group.js +197 -0
- package/lib/rules/prefer-numeric-literals.js +157 -0
- package/lib/rules/prefer-object-has-own.js +148 -0
- package/lib/rules/prefer-object-spread.js +319 -0
- package/lib/rules/prefer-promise-reject-errors.js +154 -0
- package/lib/rules/prefer-reflect.js +150 -0
- package/lib/rules/prefer-regex-literals.js +605 -0
- package/lib/rules/prefer-rest-params.js +117 -0
- package/lib/rules/prefer-spread.js +91 -0
- package/lib/rules/prefer-template.js +347 -0
- package/lib/rules/preserve-caught-error.js +535 -0
- package/lib/rules/quote-props.js +394 -0
- package/lib/rules/quotes.js +416 -0
- package/lib/rules/radix.js +193 -0
- package/lib/rules/require-atomic-updates.js +365 -0
- package/lib/rules/require-await.js +184 -0
- package/lib/rules/require-unicode-regexp.js +317 -0
- package/lib/rules/require-yield.js +86 -0
- package/lib/rules/rest-spread-spacing.js +150 -0
- package/lib/rules/semi-spacing.js +297 -0
- package/lib/rules/semi-style.js +218 -0
- package/lib/rules/semi.js +476 -0
- package/lib/rules/sort-imports.js +319 -0
- package/lib/rules/sort-keys.js +268 -0
- package/lib/rules/sort-vars.js +140 -0
- package/lib/rules/space-before-blocks.js +232 -0
- package/lib/rules/space-before-function-paren.js +202 -0
- package/lib/rules/space-in-parens.js +374 -0
- package/lib/rules/space-infix-ops.js +249 -0
- package/lib/rules/space-unary-ops.js +400 -0
- package/lib/rules/spaced-comment.js +447 -0
- package/lib/rules/strict.js +314 -0
- package/lib/rules/switch-colon-spacing.js +158 -0
- package/lib/rules/symbol-description.js +70 -0
- package/lib/rules/template-curly-spacing.js +168 -0
- package/lib/rules/template-tag-spacing.js +121 -0
- package/lib/rules/unicode-bom.js +73 -0
- package/lib/rules/use-isnan.js +268 -0
- package/lib/rules/utils/ast-utils.js +2828 -0
- package/lib/rules/utils/char-source.js +247 -0
- package/lib/rules/utils/fix-tracker.js +125 -0
- package/lib/rules/utils/keywords.js +67 -0
- package/lib/rules/utils/lazy-loading-rule-map.js +118 -0
- package/lib/rules/utils/regular-expressions.js +58 -0
- package/lib/rules/utils/unicode/index.js +16 -0
- package/lib/rules/utils/unicode/is-combining-character.js +13 -0
- package/lib/rules/utils/unicode/is-emoji-modifier.js +13 -0
- package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +13 -0
- package/lib/rules/utils/unicode/is-surrogate-pair.js +14 -0
- package/lib/rules/valid-typeof.js +171 -0
- package/lib/rules/vars-on-top.js +165 -0
- package/lib/rules/wrap-iife.js +238 -0
- package/lib/rules/wrap-regex.js +91 -0
- package/lib/rules/yield-star-spacing.js +158 -0
- package/lib/rules/yoda.js +362 -0
- package/lib/services/parser-service.js +64 -0
- package/lib/services/processor-service.js +100 -0
- package/lib/services/suppressions-service.js +302 -0
- package/lib/services/warning-service.js +87 -0
- package/lib/shared/ajv.js +34 -0
- package/lib/shared/assert.js +21 -0
- package/lib/shared/ast-utils.js +30 -0
- package/lib/shared/deep-merge-arrays.js +62 -0
- package/lib/shared/directives.js +16 -0
- package/lib/shared/flags.js +89 -0
- package/lib/shared/logging.js +38 -0
- package/lib/shared/naming.js +109 -0
- package/lib/shared/option-utils.js +63 -0
- package/lib/shared/relative-module-resolver.js +28 -0
- package/lib/shared/runtime-info.js +177 -0
- package/lib/shared/serialization.js +78 -0
- package/lib/shared/severity.js +49 -0
- package/lib/shared/stats.js +30 -0
- package/lib/shared/string-utils.js +58 -0
- package/lib/shared/text-table.js +68 -0
- package/lib/shared/translate-cli-options.js +223 -0
- package/lib/shared/traverser.js +202 -0
- package/lib/types/config-api.d.ts +12 -0
- package/lib/types/index.d.ts +1482 -0
- package/lib/types/rules.d.ts +5603 -0
- package/lib/types/universal.d.ts +6 -0
- package/lib/types/use-at-your-own-risk.d.ts +34 -0
- package/lib/universal.js +10 -0
- package/lib/unsupported-api.js +26 -0
- package/messages/all-files-ignored.js +16 -0
- package/messages/all-matched-files-ignored.js +21 -0
- package/messages/config-file-missing.js +16 -0
- package/messages/config-plugin-missing.js +14 -0
- package/messages/config-serialize-function.js +30 -0
- package/messages/eslintrc-incompat.js +117 -0
- package/messages/eslintrc-plugins.js +27 -0
- package/messages/extend-config-missing.js +13 -0
- package/messages/failed-to-read-json.js +11 -0
- package/messages/file-not-found.js +10 -0
- package/messages/invalid-rule-options.js +17 -0
- package/messages/invalid-rule-severity.js +13 -0
- package/messages/no-config-found.js +15 -0
- package/messages/plugin-conflict.js +22 -0
- package/messages/plugin-invalid.js +16 -0
- package/messages/plugin-missing.js +19 -0
- package/messages/print-config-with-directory-path.js +8 -0
- package/messages/shared.js +23 -0
- package/messages/whitespace-found.js +11 -0
- package/package.json +220 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to replace assignment expressions with operator assignment
|
|
3
|
+
* @author Brandon Mills
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
//------------------------------------------------------------------------------
|
|
8
|
+
// Requirements
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const astUtils = require("./utils/ast-utils");
|
|
12
|
+
|
|
13
|
+
//------------------------------------------------------------------------------
|
|
14
|
+
// Helpers
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Checks whether an operator is commutative and has an operator assignment
|
|
19
|
+
* shorthand form.
|
|
20
|
+
* @param {string} operator Operator to check.
|
|
21
|
+
* @returns {boolean} True if the operator is commutative and has a
|
|
22
|
+
* shorthand form.
|
|
23
|
+
*/
|
|
24
|
+
function isCommutativeOperatorWithShorthand(operator) {
|
|
25
|
+
return ["*", "&", "^", "|"].includes(operator);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Checks whether an operator is not commutative and has an operator assignment
|
|
30
|
+
* shorthand form.
|
|
31
|
+
* @param {string} operator Operator to check.
|
|
32
|
+
* @returns {boolean} True if the operator is not commutative and has
|
|
33
|
+
* a shorthand form.
|
|
34
|
+
*/
|
|
35
|
+
function isNonCommutativeOperatorWithShorthand(operator) {
|
|
36
|
+
return ["+", "-", "/", "%", "<<", ">>", ">>>", "**"].includes(operator);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//------------------------------------------------------------------------------
|
|
40
|
+
// Rule Definition
|
|
41
|
+
//------------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Determines if the left side of a node can be safely fixed (i.e. if it activates the same getters/setters and)
|
|
45
|
+
* toString calls regardless of whether assignment shorthand is used)
|
|
46
|
+
* @param {ASTNode} node The node on the left side of the expression
|
|
47
|
+
* @returns {boolean} `true` if the node can be fixed
|
|
48
|
+
*/
|
|
49
|
+
function canBeFixed(node) {
|
|
50
|
+
return (
|
|
51
|
+
node.type === "Identifier" ||
|
|
52
|
+
(node.type === "MemberExpression" &&
|
|
53
|
+
(node.object.type === "Identifier" ||
|
|
54
|
+
node.object.type === "ThisExpression") &&
|
|
55
|
+
(!node.computed || node.property.type === "Literal"))
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
60
|
+
module.exports = {
|
|
61
|
+
meta: {
|
|
62
|
+
type: "suggestion",
|
|
63
|
+
|
|
64
|
+
defaultOptions: ["always"],
|
|
65
|
+
|
|
66
|
+
docs: {
|
|
67
|
+
description:
|
|
68
|
+
"Require or disallow assignment operator shorthand where possible",
|
|
69
|
+
recommended: false,
|
|
70
|
+
frozen: true,
|
|
71
|
+
url: "https://eslint.org/docs/latest/rules/operator-assignment",
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
schema: [
|
|
75
|
+
{
|
|
76
|
+
enum: ["always", "never"],
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
|
|
80
|
+
fixable: "code",
|
|
81
|
+
messages: {
|
|
82
|
+
replaced:
|
|
83
|
+
"Assignment (=) can be replaced with operator assignment ({{operator}}).",
|
|
84
|
+
unexpected:
|
|
85
|
+
"Unexpected operator assignment ({{operator}}) shorthand.",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
create(context) {
|
|
90
|
+
const never = context.options[0] === "never";
|
|
91
|
+
const sourceCode = context.sourceCode;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Returns the operator token of an AssignmentExpression or BinaryExpression
|
|
95
|
+
* @param {ASTNode} node An AssignmentExpression or BinaryExpression node
|
|
96
|
+
* @returns {Token} The operator token in the node
|
|
97
|
+
*/
|
|
98
|
+
function getOperatorToken(node) {
|
|
99
|
+
return sourceCode.getFirstTokenBetween(
|
|
100
|
+
node.left,
|
|
101
|
+
node.right,
|
|
102
|
+
token => token.value === node.operator,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Ensures that an assignment uses the shorthand form where possible.
|
|
108
|
+
* @param {ASTNode} node An AssignmentExpression node.
|
|
109
|
+
* @returns {void}
|
|
110
|
+
*/
|
|
111
|
+
function verify(node) {
|
|
112
|
+
if (
|
|
113
|
+
node.operator !== "=" ||
|
|
114
|
+
node.right.type !== "BinaryExpression"
|
|
115
|
+
) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const left = node.left;
|
|
120
|
+
const expr = node.right;
|
|
121
|
+
const operator = expr.operator;
|
|
122
|
+
|
|
123
|
+
if (
|
|
124
|
+
isCommutativeOperatorWithShorthand(operator) ||
|
|
125
|
+
isNonCommutativeOperatorWithShorthand(operator)
|
|
126
|
+
) {
|
|
127
|
+
const replacementOperator = `${operator}=`;
|
|
128
|
+
|
|
129
|
+
if (astUtils.isSameReference(left, expr.left, true)) {
|
|
130
|
+
context.report({
|
|
131
|
+
node,
|
|
132
|
+
messageId: "replaced",
|
|
133
|
+
data: { operator: replacementOperator },
|
|
134
|
+
fix(fixer) {
|
|
135
|
+
if (canBeFixed(left) && canBeFixed(expr.left)) {
|
|
136
|
+
const equalsToken = getOperatorToken(node);
|
|
137
|
+
const operatorToken = getOperatorToken(expr);
|
|
138
|
+
const leftText = sourceCode
|
|
139
|
+
.getText()
|
|
140
|
+
.slice(node.range[0], equalsToken.range[0]);
|
|
141
|
+
const rightText = sourceCode
|
|
142
|
+
.getText()
|
|
143
|
+
.slice(
|
|
144
|
+
operatorToken.range[1],
|
|
145
|
+
node.right.range[1],
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Check for comments that would be removed.
|
|
149
|
+
if (
|
|
150
|
+
sourceCode.commentsExistBetween(
|
|
151
|
+
equalsToken,
|
|
152
|
+
operatorToken,
|
|
153
|
+
)
|
|
154
|
+
) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return fixer.replaceText(
|
|
159
|
+
node,
|
|
160
|
+
`${leftText}${replacementOperator}${rightText}`,
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
} else if (
|
|
167
|
+
astUtils.isSameReference(left, expr.right, true) &&
|
|
168
|
+
isCommutativeOperatorWithShorthand(operator)
|
|
169
|
+
) {
|
|
170
|
+
/*
|
|
171
|
+
* This case can't be fixed safely.
|
|
172
|
+
* If `a` and `b` both have custom valueOf() behavior, then fixing `a = b * a` to `a *= b` would
|
|
173
|
+
* change the execution order of the valueOf() functions.
|
|
174
|
+
*/
|
|
175
|
+
context.report({
|
|
176
|
+
node,
|
|
177
|
+
messageId: "replaced",
|
|
178
|
+
data: { operator: replacementOperator },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Warns if an assignment expression uses operator assignment shorthand.
|
|
186
|
+
* @param {ASTNode} node An AssignmentExpression node.
|
|
187
|
+
* @returns {void}
|
|
188
|
+
*/
|
|
189
|
+
function prohibit(node) {
|
|
190
|
+
if (
|
|
191
|
+
node.operator !== "=" &&
|
|
192
|
+
!astUtils.isLogicalAssignmentOperator(node.operator)
|
|
193
|
+
) {
|
|
194
|
+
context.report({
|
|
195
|
+
node,
|
|
196
|
+
messageId: "unexpected",
|
|
197
|
+
data: { operator: node.operator },
|
|
198
|
+
fix(fixer) {
|
|
199
|
+
if (canBeFixed(node.left)) {
|
|
200
|
+
const firstToken = sourceCode.getFirstToken(node);
|
|
201
|
+
const operatorToken = getOperatorToken(node);
|
|
202
|
+
const leftText = sourceCode
|
|
203
|
+
.getText()
|
|
204
|
+
.slice(node.range[0], operatorToken.range[0]);
|
|
205
|
+
const newOperator = node.operator.slice(0, -1);
|
|
206
|
+
let rightText;
|
|
207
|
+
|
|
208
|
+
// Check for comments that would be duplicated.
|
|
209
|
+
if (
|
|
210
|
+
sourceCode.commentsExistBetween(
|
|
211
|
+
firstToken,
|
|
212
|
+
operatorToken,
|
|
213
|
+
)
|
|
214
|
+
) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// If this change would modify precedence (e.g. `foo *= bar + 1` => `foo = foo * (bar + 1)`), parenthesize the right side.
|
|
219
|
+
if (
|
|
220
|
+
astUtils.getPrecedence(node.right) <=
|
|
221
|
+
astUtils.getPrecedence({
|
|
222
|
+
type: "BinaryExpression",
|
|
223
|
+
operator: newOperator,
|
|
224
|
+
}) &&
|
|
225
|
+
!astUtils.isParenthesised(
|
|
226
|
+
sourceCode,
|
|
227
|
+
node.right,
|
|
228
|
+
)
|
|
229
|
+
) {
|
|
230
|
+
rightText = `${sourceCode.text.slice(operatorToken.range[1], node.right.range[0])}(${sourceCode.getText(node.right)})`;
|
|
231
|
+
} else {
|
|
232
|
+
const tokenAfterOperator =
|
|
233
|
+
sourceCode.getTokenAfter(operatorToken, {
|
|
234
|
+
includeComments: true,
|
|
235
|
+
});
|
|
236
|
+
let rightTextPrefix = "";
|
|
237
|
+
|
|
238
|
+
if (
|
|
239
|
+
operatorToken.range[1] ===
|
|
240
|
+
tokenAfterOperator.range[0] &&
|
|
241
|
+
!astUtils.canTokensBeAdjacent(
|
|
242
|
+
{
|
|
243
|
+
type: "Punctuator",
|
|
244
|
+
value: newOperator,
|
|
245
|
+
},
|
|
246
|
+
tokenAfterOperator,
|
|
247
|
+
)
|
|
248
|
+
) {
|
|
249
|
+
rightTextPrefix = " "; // foo+=+bar -> foo= foo+ +bar
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
rightText = `${rightTextPrefix}${sourceCode.text.slice(operatorToken.range[1], node.range[1])}`;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return fixer.replaceText(
|
|
256
|
+
node,
|
|
257
|
+
`${leftText}= ${leftText}${newOperator}${rightText}`,
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
return null;
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
AssignmentExpression: !never ? verify : prohibit,
|
|
268
|
+
};
|
|
269
|
+
},
|
|
270
|
+
};
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Operator linebreak - enforces operator linebreak style of two types: after and before
|
|
3
|
+
* @author Benoît Zugmeyer
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Requirements
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
const astUtils = require("./utils/ast-utils");
|
|
14
|
+
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
// Rule Definition
|
|
17
|
+
//------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
20
|
+
module.exports = {
|
|
21
|
+
meta: {
|
|
22
|
+
deprecated: {
|
|
23
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
24
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
25
|
+
deprecatedSince: "8.53.0",
|
|
26
|
+
availableUntil: "11.0.0",
|
|
27
|
+
replacedBy: [
|
|
28
|
+
{
|
|
29
|
+
message:
|
|
30
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
31
|
+
url: "https://eslint.style/guide/migration",
|
|
32
|
+
plugin: {
|
|
33
|
+
name: "@stylistic/eslint-plugin",
|
|
34
|
+
url: "https://eslint.style",
|
|
35
|
+
},
|
|
36
|
+
rule: {
|
|
37
|
+
name: "operator-linebreak",
|
|
38
|
+
url: "https://eslint.style/rules/operator-linebreak",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
type: "layout",
|
|
44
|
+
|
|
45
|
+
docs: {
|
|
46
|
+
description: "Enforce consistent linebreak style for operators",
|
|
47
|
+
recommended: false,
|
|
48
|
+
url: "https://eslint.org/docs/latest/rules/operator-linebreak",
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
schema: [
|
|
52
|
+
{
|
|
53
|
+
enum: ["after", "before", "none", null],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
type: "object",
|
|
57
|
+
properties: {
|
|
58
|
+
overrides: {
|
|
59
|
+
type: "object",
|
|
60
|
+
additionalProperties: {
|
|
61
|
+
enum: ["after", "before", "none", "ignore"],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
additionalProperties: false,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
|
|
69
|
+
fixable: "code",
|
|
70
|
+
|
|
71
|
+
messages: {
|
|
72
|
+
operatorAtBeginning:
|
|
73
|
+
"'{{operator}}' should be placed at the beginning of the line.",
|
|
74
|
+
operatorAtEnd:
|
|
75
|
+
"'{{operator}}' should be placed at the end of the line.",
|
|
76
|
+
badLinebreak: "Bad line breaking before and after '{{operator}}'.",
|
|
77
|
+
noLinebreak:
|
|
78
|
+
"There should be no line break before or after '{{operator}}'.",
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
create(context) {
|
|
83
|
+
const usedDefaultGlobal = !context.options[0];
|
|
84
|
+
const globalStyle = context.options[0] || "after";
|
|
85
|
+
const options = context.options[1] || {};
|
|
86
|
+
const styleOverrides = options.overrides
|
|
87
|
+
? Object.assign({}, options.overrides)
|
|
88
|
+
: {};
|
|
89
|
+
|
|
90
|
+
if (usedDefaultGlobal && !styleOverrides["?"]) {
|
|
91
|
+
styleOverrides["?"] = "before";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (usedDefaultGlobal && !styleOverrides[":"]) {
|
|
95
|
+
styleOverrides[":"] = "before";
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const sourceCode = context.sourceCode;
|
|
99
|
+
|
|
100
|
+
//--------------------------------------------------------------------------
|
|
101
|
+
// Helpers
|
|
102
|
+
//--------------------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Gets a fixer function to fix rule issues
|
|
106
|
+
* @param {Token} operatorToken The operator token of an expression
|
|
107
|
+
* @param {string} desiredStyle The style for the rule. One of 'before', 'after', 'none'
|
|
108
|
+
* @returns {Function} A fixer function
|
|
109
|
+
*/
|
|
110
|
+
function getFixer(operatorToken, desiredStyle) {
|
|
111
|
+
return fixer => {
|
|
112
|
+
const tokenBefore = sourceCode.getTokenBefore(operatorToken);
|
|
113
|
+
const tokenAfter = sourceCode.getTokenAfter(operatorToken);
|
|
114
|
+
const textBefore = sourceCode.text.slice(
|
|
115
|
+
tokenBefore.range[1],
|
|
116
|
+
operatorToken.range[0],
|
|
117
|
+
);
|
|
118
|
+
const textAfter = sourceCode.text.slice(
|
|
119
|
+
operatorToken.range[1],
|
|
120
|
+
tokenAfter.range[0],
|
|
121
|
+
);
|
|
122
|
+
const hasLinebreakBefore = !astUtils.isTokenOnSameLine(
|
|
123
|
+
tokenBefore,
|
|
124
|
+
operatorToken,
|
|
125
|
+
);
|
|
126
|
+
const hasLinebreakAfter = !astUtils.isTokenOnSameLine(
|
|
127
|
+
operatorToken,
|
|
128
|
+
tokenAfter,
|
|
129
|
+
);
|
|
130
|
+
let newTextBefore, newTextAfter;
|
|
131
|
+
|
|
132
|
+
if (
|
|
133
|
+
hasLinebreakBefore !== hasLinebreakAfter &&
|
|
134
|
+
desiredStyle !== "none"
|
|
135
|
+
) {
|
|
136
|
+
// If there is a comment before and after the operator, don't do a fix.
|
|
137
|
+
if (
|
|
138
|
+
sourceCode.getTokenBefore(operatorToken, {
|
|
139
|
+
includeComments: true,
|
|
140
|
+
}) !== tokenBefore &&
|
|
141
|
+
sourceCode.getTokenAfter(operatorToken, {
|
|
142
|
+
includeComments: true,
|
|
143
|
+
}) !== tokenAfter
|
|
144
|
+
) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/*
|
|
149
|
+
* If there is only one linebreak and it's on the wrong side of the operator, swap the text before and after the operator.
|
|
150
|
+
* foo &&
|
|
151
|
+
* bar
|
|
152
|
+
* would get fixed to
|
|
153
|
+
* foo
|
|
154
|
+
* && bar
|
|
155
|
+
*/
|
|
156
|
+
newTextBefore = textAfter;
|
|
157
|
+
newTextAfter = textBefore;
|
|
158
|
+
} else {
|
|
159
|
+
const LINEBREAK_REGEX =
|
|
160
|
+
astUtils.createGlobalLinebreakMatcher();
|
|
161
|
+
|
|
162
|
+
// Otherwise, if no linebreak is desired and no comments interfere, replace the linebreaks with empty strings.
|
|
163
|
+
newTextBefore =
|
|
164
|
+
desiredStyle === "before" || textBefore.trim()
|
|
165
|
+
? textBefore
|
|
166
|
+
: textBefore.replace(LINEBREAK_REGEX, "");
|
|
167
|
+
newTextAfter =
|
|
168
|
+
desiredStyle === "after" || textAfter.trim()
|
|
169
|
+
? textAfter
|
|
170
|
+
: textAfter.replace(LINEBREAK_REGEX, "");
|
|
171
|
+
|
|
172
|
+
// If there was no change (due to interfering comments), don't output a fix.
|
|
173
|
+
if (
|
|
174
|
+
newTextBefore === textBefore &&
|
|
175
|
+
newTextAfter === textAfter
|
|
176
|
+
) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (
|
|
182
|
+
newTextAfter === "" &&
|
|
183
|
+
tokenAfter.type === "Punctuator" &&
|
|
184
|
+
"+-".includes(operatorToken.value) &&
|
|
185
|
+
tokenAfter.value === operatorToken.value
|
|
186
|
+
) {
|
|
187
|
+
// To avoid accidentally creating a ++ or -- operator, insert a space if the operator is a +/- and the following token is a unary +/-.
|
|
188
|
+
newTextAfter += " ";
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return fixer.replaceTextRange(
|
|
192
|
+
[tokenBefore.range[1], tokenAfter.range[0]],
|
|
193
|
+
newTextBefore + operatorToken.value + newTextAfter,
|
|
194
|
+
);
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Checks the operator placement
|
|
200
|
+
* @param {ASTNode} node The node to check
|
|
201
|
+
* @param {ASTNode} rightSide The node that comes after the operator in `node`
|
|
202
|
+
* @param {string} operator The operator
|
|
203
|
+
* @private
|
|
204
|
+
* @returns {void}
|
|
205
|
+
*/
|
|
206
|
+
function validateNode(node, rightSide, operator) {
|
|
207
|
+
/*
|
|
208
|
+
* Find the operator token by searching from the right side, because between the left side and the operator
|
|
209
|
+
* there could be additional tokens from type annotations. Search specifically for the token which
|
|
210
|
+
* value equals the operator, in order to skip possible opening parentheses before the right side node.
|
|
211
|
+
*/
|
|
212
|
+
const operatorToken = sourceCode.getTokenBefore(
|
|
213
|
+
rightSide,
|
|
214
|
+
token => token.value === operator,
|
|
215
|
+
);
|
|
216
|
+
const leftToken = sourceCode.getTokenBefore(operatorToken);
|
|
217
|
+
const rightToken = sourceCode.getTokenAfter(operatorToken);
|
|
218
|
+
const operatorStyleOverride = styleOverrides[operator];
|
|
219
|
+
const style = operatorStyleOverride || globalStyle;
|
|
220
|
+
const fix = getFixer(operatorToken, style);
|
|
221
|
+
|
|
222
|
+
// if single line
|
|
223
|
+
if (
|
|
224
|
+
astUtils.isTokenOnSameLine(leftToken, operatorToken) &&
|
|
225
|
+
astUtils.isTokenOnSameLine(operatorToken, rightToken)
|
|
226
|
+
) {
|
|
227
|
+
// do nothing.
|
|
228
|
+
} else if (
|
|
229
|
+
operatorStyleOverride !== "ignore" &&
|
|
230
|
+
!astUtils.isTokenOnSameLine(leftToken, operatorToken) &&
|
|
231
|
+
!astUtils.isTokenOnSameLine(operatorToken, rightToken)
|
|
232
|
+
) {
|
|
233
|
+
// lone operator
|
|
234
|
+
context.report({
|
|
235
|
+
node,
|
|
236
|
+
loc: operatorToken.loc,
|
|
237
|
+
messageId: "badLinebreak",
|
|
238
|
+
data: {
|
|
239
|
+
operator,
|
|
240
|
+
},
|
|
241
|
+
fix,
|
|
242
|
+
});
|
|
243
|
+
} else if (
|
|
244
|
+
style === "before" &&
|
|
245
|
+
astUtils.isTokenOnSameLine(leftToken, operatorToken)
|
|
246
|
+
) {
|
|
247
|
+
context.report({
|
|
248
|
+
node,
|
|
249
|
+
loc: operatorToken.loc,
|
|
250
|
+
messageId: "operatorAtBeginning",
|
|
251
|
+
data: {
|
|
252
|
+
operator,
|
|
253
|
+
},
|
|
254
|
+
fix,
|
|
255
|
+
});
|
|
256
|
+
} else if (
|
|
257
|
+
style === "after" &&
|
|
258
|
+
astUtils.isTokenOnSameLine(operatorToken, rightToken)
|
|
259
|
+
) {
|
|
260
|
+
context.report({
|
|
261
|
+
node,
|
|
262
|
+
loc: operatorToken.loc,
|
|
263
|
+
messageId: "operatorAtEnd",
|
|
264
|
+
data: {
|
|
265
|
+
operator,
|
|
266
|
+
},
|
|
267
|
+
fix,
|
|
268
|
+
});
|
|
269
|
+
} else if (style === "none") {
|
|
270
|
+
context.report({
|
|
271
|
+
node,
|
|
272
|
+
loc: operatorToken.loc,
|
|
273
|
+
messageId: "noLinebreak",
|
|
274
|
+
data: {
|
|
275
|
+
operator,
|
|
276
|
+
},
|
|
277
|
+
fix,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Validates a binary expression using `validateNode`
|
|
284
|
+
* @param {BinaryExpression|LogicalExpression|AssignmentExpression} node node to be validated
|
|
285
|
+
* @returns {void}
|
|
286
|
+
*/
|
|
287
|
+
function validateBinaryExpression(node) {
|
|
288
|
+
validateNode(node, node.right, node.operator);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
//--------------------------------------------------------------------------
|
|
292
|
+
// Public
|
|
293
|
+
//--------------------------------------------------------------------------
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
BinaryExpression: validateBinaryExpression,
|
|
297
|
+
LogicalExpression: validateBinaryExpression,
|
|
298
|
+
AssignmentExpression: validateBinaryExpression,
|
|
299
|
+
VariableDeclarator(node) {
|
|
300
|
+
if (node.init) {
|
|
301
|
+
validateNode(node, node.init, "=");
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
PropertyDefinition(node) {
|
|
305
|
+
if (node.value) {
|
|
306
|
+
validateNode(node, node.value, "=");
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
ConditionalExpression(node) {
|
|
310
|
+
validateNode(node, node.consequent, "?");
|
|
311
|
+
validateNode(node, node.alternate, ":");
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
},
|
|
315
|
+
};
|