bahlint 28.58.6934
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 +370 -0
- package/bin/eslint.js +195 -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 +22 -0
- package/lib/cli-engine/formatters/gasoline.js +168 -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 +607 -0
- package/lib/config/config-loader.js +683 -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 +1817 -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,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview enforce or disallow capitalization of the first letter of a comment
|
|
3
|
+
* @author Kevin Partington
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
//------------------------------------------------------------------------------
|
|
8
|
+
// Requirements
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const astUtils = require("./utils/ast-utils");
|
|
12
|
+
|
|
13
|
+
//------------------------------------------------------------------------------
|
|
14
|
+
// Helpers
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
const DEFAULT_IGNORE_PATTERN = astUtils.COMMENTS_IGNORE_PATTERN,
|
|
18
|
+
WHITESPACE = /\s/gu,
|
|
19
|
+
MAYBE_URL = /^\s*[^:/?#\s]+:\/\/[^?#]/u, // TODO: Combine w/ max-len pattern?
|
|
20
|
+
LETTER_PATTERN = /\p{L}/u;
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* Base schema body for defining the basic capitalization rule, ignorePattern,
|
|
24
|
+
* and ignoreInlineComments values.
|
|
25
|
+
* This can be used in a few different ways in the actual schema.
|
|
26
|
+
*/
|
|
27
|
+
const SCHEMA_BODY = {
|
|
28
|
+
type: "object",
|
|
29
|
+
properties: {
|
|
30
|
+
ignorePattern: {
|
|
31
|
+
type: "string",
|
|
32
|
+
},
|
|
33
|
+
ignoreInlineComments: {
|
|
34
|
+
type: "boolean",
|
|
35
|
+
},
|
|
36
|
+
ignoreConsecutiveComments: {
|
|
37
|
+
type: "boolean",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
additionalProperties: false,
|
|
41
|
+
};
|
|
42
|
+
const DEFAULTS = {
|
|
43
|
+
ignorePattern: "",
|
|
44
|
+
ignoreInlineComments: false,
|
|
45
|
+
ignoreConsecutiveComments: false,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Get normalized options for either block or line comments from the given
|
|
50
|
+
* user-provided options.
|
|
51
|
+
* - If the user-provided options is just a string, returns a normalized
|
|
52
|
+
* set of options using default values for all other options.
|
|
53
|
+
* - If the user-provided options is an object, then a normalized option
|
|
54
|
+
* set is returned. Options specified in overrides will take priority
|
|
55
|
+
* over options specified in the main options object, which will in
|
|
56
|
+
* turn take priority over the rule's defaults.
|
|
57
|
+
* @param {Object|string} rawOptions The user-provided options.
|
|
58
|
+
* @param {string} which Either "line" or "block".
|
|
59
|
+
* @returns {Object} The normalized options.
|
|
60
|
+
*/
|
|
61
|
+
function getNormalizedOptions(rawOptions, which) {
|
|
62
|
+
return Object.assign({}, DEFAULTS, rawOptions[which] || rawOptions);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get normalized options for block and line comments.
|
|
67
|
+
* @param {Object|string} rawOptions The user-provided options.
|
|
68
|
+
* @returns {Object} An object with "Line" and "Block" keys and corresponding
|
|
69
|
+
* normalized options objects.
|
|
70
|
+
*/
|
|
71
|
+
function getAllNormalizedOptions(rawOptions = {}) {
|
|
72
|
+
return {
|
|
73
|
+
Line: getNormalizedOptions(rawOptions, "line"),
|
|
74
|
+
Block: getNormalizedOptions(rawOptions, "block"),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Creates a regular expression for each ignorePattern defined in the rule
|
|
80
|
+
* options.
|
|
81
|
+
*
|
|
82
|
+
* This is done in order to avoid invoking the RegExp constructor repeatedly.
|
|
83
|
+
* @param {Object} normalizedOptions The normalized rule options.
|
|
84
|
+
* @returns {void}
|
|
85
|
+
*/
|
|
86
|
+
function createRegExpForIgnorePatterns(normalizedOptions) {
|
|
87
|
+
Object.keys(normalizedOptions).forEach(key => {
|
|
88
|
+
const ignorePatternStr = normalizedOptions[key].ignorePattern;
|
|
89
|
+
|
|
90
|
+
if (ignorePatternStr) {
|
|
91
|
+
const regExp = RegExp(`^\\s*(?:${ignorePatternStr})`, "u");
|
|
92
|
+
|
|
93
|
+
normalizedOptions[key].ignorePatternRegExp = regExp;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//------------------------------------------------------------------------------
|
|
99
|
+
// Rule Definition
|
|
100
|
+
//------------------------------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
103
|
+
module.exports = {
|
|
104
|
+
meta: {
|
|
105
|
+
type: "suggestion",
|
|
106
|
+
|
|
107
|
+
docs: {
|
|
108
|
+
description:
|
|
109
|
+
"Enforce or disallow capitalization of the first letter of a comment",
|
|
110
|
+
recommended: false,
|
|
111
|
+
frozen: true,
|
|
112
|
+
url: "https://eslint.org/docs/latest/rules/capitalized-comments",
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
fixable: "code",
|
|
116
|
+
|
|
117
|
+
schema: [
|
|
118
|
+
{ enum: ["always", "never"] },
|
|
119
|
+
{
|
|
120
|
+
oneOf: [
|
|
121
|
+
SCHEMA_BODY,
|
|
122
|
+
{
|
|
123
|
+
type: "object",
|
|
124
|
+
properties: {
|
|
125
|
+
line: SCHEMA_BODY,
|
|
126
|
+
block: SCHEMA_BODY,
|
|
127
|
+
},
|
|
128
|
+
additionalProperties: false,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
|
|
134
|
+
messages: {
|
|
135
|
+
unexpectedLowercaseComment:
|
|
136
|
+
"Comments should not begin with a lowercase character.",
|
|
137
|
+
unexpectedUppercaseComment:
|
|
138
|
+
"Comments should not begin with an uppercase character.",
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
create(context) {
|
|
143
|
+
const capitalize = context.options[0] || "always",
|
|
144
|
+
normalizedOptions = getAllNormalizedOptions(context.options[1]),
|
|
145
|
+
sourceCode = context.sourceCode;
|
|
146
|
+
|
|
147
|
+
createRegExpForIgnorePatterns(normalizedOptions);
|
|
148
|
+
|
|
149
|
+
//----------------------------------------------------------------------
|
|
150
|
+
// Helpers
|
|
151
|
+
//----------------------------------------------------------------------
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Checks whether a comment is an inline comment.
|
|
155
|
+
*
|
|
156
|
+
* For the purpose of this rule, a comment is inline if:
|
|
157
|
+
* 1. The comment is preceded by a token on the same line; and
|
|
158
|
+
* 2. The command is followed by a token on the same line.
|
|
159
|
+
*
|
|
160
|
+
* Note that the comment itself need not be single-line!
|
|
161
|
+
*
|
|
162
|
+
* Also, it follows from this definition that only block comments can
|
|
163
|
+
* be considered as possibly inline. This is because line comments
|
|
164
|
+
* would consume any following tokens on the same line as the comment.
|
|
165
|
+
* @param {ASTNode} comment The comment node to check.
|
|
166
|
+
* @returns {boolean} True if the comment is an inline comment, false
|
|
167
|
+
* otherwise.
|
|
168
|
+
*/
|
|
169
|
+
function isInlineComment(comment) {
|
|
170
|
+
const previousToken = sourceCode.getTokenBefore(comment, {
|
|
171
|
+
includeComments: true,
|
|
172
|
+
}),
|
|
173
|
+
nextToken = sourceCode.getTokenAfter(comment, {
|
|
174
|
+
includeComments: true,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
return Boolean(
|
|
178
|
+
previousToken &&
|
|
179
|
+
nextToken &&
|
|
180
|
+
comment.loc.start.line === previousToken.loc.end.line &&
|
|
181
|
+
comment.loc.end.line === nextToken.loc.start.line,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Determine if a comment follows another comment.
|
|
187
|
+
* @param {ASTNode} comment The comment to check.
|
|
188
|
+
* @returns {boolean} True if the comment follows a valid comment.
|
|
189
|
+
*/
|
|
190
|
+
function isConsecutiveComment(comment) {
|
|
191
|
+
const previousTokenOrComment = sourceCode.getTokenBefore(comment, {
|
|
192
|
+
includeComments: true,
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
return Boolean(
|
|
196
|
+
previousTokenOrComment &&
|
|
197
|
+
["Block", "Line"].includes(previousTokenOrComment.type),
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Check a comment to determine if it is valid for this rule.
|
|
203
|
+
* @param {ASTNode} comment The comment node to process.
|
|
204
|
+
* @param {Object} options The options for checking this comment.
|
|
205
|
+
* @returns {boolean} True if the comment is valid, false otherwise.
|
|
206
|
+
*/
|
|
207
|
+
function isCommentValid(comment, options) {
|
|
208
|
+
// 1. Check for default ignore pattern.
|
|
209
|
+
if (DEFAULT_IGNORE_PATTERN.test(comment.value)) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// 2. Check for custom ignore pattern.
|
|
214
|
+
const commentWithoutAsterisks = comment.value.replace(/\*/gu, "");
|
|
215
|
+
|
|
216
|
+
if (
|
|
217
|
+
options.ignorePatternRegExp &&
|
|
218
|
+
options.ignorePatternRegExp.test(commentWithoutAsterisks)
|
|
219
|
+
) {
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// 3. Check for inline comments.
|
|
224
|
+
if (options.ignoreInlineComments && isInlineComment(comment)) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// 4. Is this a consecutive comment (and are we tolerating those)?
|
|
229
|
+
if (
|
|
230
|
+
options.ignoreConsecutiveComments &&
|
|
231
|
+
isConsecutiveComment(comment)
|
|
232
|
+
) {
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// 5. Does the comment start with a possible URL?
|
|
237
|
+
if (MAYBE_URL.test(commentWithoutAsterisks)) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// 6. Is the initial word character a letter?
|
|
242
|
+
const commentWordCharsOnly = commentWithoutAsterisks.replace(
|
|
243
|
+
WHITESPACE,
|
|
244
|
+
"",
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
if (commentWordCharsOnly.length === 0) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Get the first Unicode character (1 or 2 code units).
|
|
252
|
+
const [firstWordChar] = commentWordCharsOnly;
|
|
253
|
+
|
|
254
|
+
if (!LETTER_PATTERN.test(firstWordChar)) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// 7. Check the case of the initial word character.
|
|
259
|
+
const isUppercase =
|
|
260
|
+
firstWordChar !== firstWordChar.toLocaleLowerCase(),
|
|
261
|
+
isLowercase =
|
|
262
|
+
firstWordChar !== firstWordChar.toLocaleUpperCase();
|
|
263
|
+
|
|
264
|
+
if (capitalize === "always" && isLowercase) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
if (capitalize === "never" && isUppercase) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Process a comment to determine if it needs to be reported.
|
|
276
|
+
* @param {ASTNode} comment The comment node to process.
|
|
277
|
+
* @returns {void}
|
|
278
|
+
*/
|
|
279
|
+
function processComment(comment) {
|
|
280
|
+
const options = normalizedOptions[comment.type],
|
|
281
|
+
commentValid = isCommentValid(comment, options);
|
|
282
|
+
|
|
283
|
+
if (!commentValid) {
|
|
284
|
+
const messageId =
|
|
285
|
+
capitalize === "always"
|
|
286
|
+
? "unexpectedLowercaseComment"
|
|
287
|
+
: "unexpectedUppercaseComment";
|
|
288
|
+
|
|
289
|
+
context.report({
|
|
290
|
+
node: null, // Intentionally using loc instead
|
|
291
|
+
loc: comment.loc,
|
|
292
|
+
messageId,
|
|
293
|
+
fix(fixer) {
|
|
294
|
+
const match = comment.value.match(LETTER_PATTERN);
|
|
295
|
+
const char = match[0];
|
|
296
|
+
|
|
297
|
+
// Offset match.index by 2 to account for the first 2 characters that start the comment (// or /*)
|
|
298
|
+
const charIndex = comment.range[0] + match.index + 2;
|
|
299
|
+
|
|
300
|
+
return fixer.replaceTextRange(
|
|
301
|
+
[charIndex, charIndex + char.length],
|
|
302
|
+
capitalize === "always"
|
|
303
|
+
? char.toLocaleUpperCase()
|
|
304
|
+
: char.toLocaleLowerCase(),
|
|
305
|
+
);
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
//----------------------------------------------------------------------
|
|
312
|
+
// Public
|
|
313
|
+
//----------------------------------------------------------------------
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
Program() {
|
|
317
|
+
const comments = sourceCode.getAllComments();
|
|
318
|
+
|
|
319
|
+
comments
|
|
320
|
+
.filter(token => token.type !== "Shebang")
|
|
321
|
+
.forEach(processComment);
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
},
|
|
325
|
+
};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to enforce that all class methods use 'this'.
|
|
3
|
+
* @author Patrick Williams
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Rule Definition
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
19
|
+
module.exports = {
|
|
20
|
+
meta: {
|
|
21
|
+
dialects: ["javascript", "typescript"],
|
|
22
|
+
language: "javascript",
|
|
23
|
+
type: "suggestion",
|
|
24
|
+
|
|
25
|
+
defaultOptions: [
|
|
26
|
+
{
|
|
27
|
+
enforceForClassFields: true,
|
|
28
|
+
exceptMethods: [],
|
|
29
|
+
ignoreOverrideMethods: false,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
|
|
33
|
+
docs: {
|
|
34
|
+
description: "Enforce that class methods utilize `this`",
|
|
35
|
+
recommended: false,
|
|
36
|
+
url: "https://eslint.org/docs/latest/rules/class-methods-use-this",
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
schema: [
|
|
40
|
+
{
|
|
41
|
+
type: "object",
|
|
42
|
+
properties: {
|
|
43
|
+
exceptMethods: {
|
|
44
|
+
type: "array",
|
|
45
|
+
items: {
|
|
46
|
+
type: "string",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
enforceForClassFields: {
|
|
50
|
+
type: "boolean",
|
|
51
|
+
},
|
|
52
|
+
ignoreOverrideMethods: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
},
|
|
55
|
+
ignoreClassesWithImplements: {
|
|
56
|
+
enum: ["all", "public-fields"],
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
additionalProperties: false,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
|
|
63
|
+
messages: {
|
|
64
|
+
missingThis: "Expected 'this' to be used by class {{name}}.",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
create(context) {
|
|
68
|
+
const [options] = context.options;
|
|
69
|
+
const {
|
|
70
|
+
enforceForClassFields,
|
|
71
|
+
ignoreOverrideMethods,
|
|
72
|
+
ignoreClassesWithImplements,
|
|
73
|
+
} = options;
|
|
74
|
+
const exceptMethods = new Set(options.exceptMethods);
|
|
75
|
+
|
|
76
|
+
const stack = [];
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Push `this` used flag initialized with `false` onto the stack.
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
function pushContext() {
|
|
83
|
+
stack.push(false);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Pop `this` used flag from the stack.
|
|
88
|
+
* @returns {boolean | undefined} `this` used flag
|
|
89
|
+
*/
|
|
90
|
+
function popContext() {
|
|
91
|
+
return stack.pop();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Initializes the current context to false and pushes it onto the stack.
|
|
96
|
+
* These booleans represent whether 'this' has been used in the context.
|
|
97
|
+
* @returns {void}
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
100
|
+
function enterFunction() {
|
|
101
|
+
pushContext();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Check if the node is an instance method
|
|
106
|
+
* @param {ASTNode} node node to check
|
|
107
|
+
* @returns {boolean} True if its an instance method
|
|
108
|
+
* @private
|
|
109
|
+
*/
|
|
110
|
+
function isInstanceMethod(node) {
|
|
111
|
+
switch (node.type) {
|
|
112
|
+
case "MethodDefinition":
|
|
113
|
+
return !node.static && node.kind !== "constructor";
|
|
114
|
+
case "AccessorProperty":
|
|
115
|
+
case "PropertyDefinition":
|
|
116
|
+
return !node.static && enforceForClassFields;
|
|
117
|
+
default:
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Check if the node's parent class implements any interfaces
|
|
124
|
+
* @param {ASTNode} node node to check
|
|
125
|
+
* @returns {boolean} True if parent class implements interfaces
|
|
126
|
+
* @private
|
|
127
|
+
*/
|
|
128
|
+
function hasImplements(node) {
|
|
129
|
+
const classNode = node.parent.parent;
|
|
130
|
+
return (
|
|
131
|
+
classNode?.type === "ClassDeclaration" &&
|
|
132
|
+
classNode.implements?.length > 0
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Check if the node is an instance method not excluded by config
|
|
138
|
+
* @param {ASTNode} node node to check
|
|
139
|
+
* @returns {boolean} True if it is an instance method, and not excluded by config
|
|
140
|
+
* @private
|
|
141
|
+
*/
|
|
142
|
+
function isIncludedInstanceMethod(node) {
|
|
143
|
+
if (isInstanceMethod(node)) {
|
|
144
|
+
if (node.computed) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (ignoreOverrideMethods && node.override) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (ignoreClassesWithImplements) {
|
|
153
|
+
const implementsInterfaces = hasImplements(node);
|
|
154
|
+
if (implementsInterfaces) {
|
|
155
|
+
if (
|
|
156
|
+
ignoreClassesWithImplements === "all" ||
|
|
157
|
+
(ignoreClassesWithImplements === "public-fields" &&
|
|
158
|
+
node.key.type !== "PrivateIdentifier" &&
|
|
159
|
+
(!node.accessibility ||
|
|
160
|
+
node.accessibility === "public"))
|
|
161
|
+
) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const hashIfNeeded =
|
|
168
|
+
node.key.type === "PrivateIdentifier" ? "#" : "";
|
|
169
|
+
const name =
|
|
170
|
+
node.key.type === "Literal"
|
|
171
|
+
? astUtils.getStaticStringValue(node.key)
|
|
172
|
+
: node.key.name || "";
|
|
173
|
+
|
|
174
|
+
return !exceptMethods.has(hashIfNeeded + name);
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Checks if we are leaving a function that is a method, and reports if 'this' has not been used.
|
|
181
|
+
* Static methods and the constructor are exempt.
|
|
182
|
+
* Then pops the context off the stack.
|
|
183
|
+
* @param {ASTNode} node A function node that was entered.
|
|
184
|
+
* @returns {void}
|
|
185
|
+
* @private
|
|
186
|
+
*/
|
|
187
|
+
function exitFunction(node) {
|
|
188
|
+
const methodUsesThis = popContext();
|
|
189
|
+
|
|
190
|
+
if (isIncludedInstanceMethod(node.parent) && !methodUsesThis) {
|
|
191
|
+
context.report({
|
|
192
|
+
node,
|
|
193
|
+
loc: astUtils.getFunctionHeadLoc(node, context.sourceCode),
|
|
194
|
+
messageId: "missingThis",
|
|
195
|
+
data: {
|
|
196
|
+
name: astUtils.getFunctionNameWithKind(node),
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Mark the current context as having used 'this'.
|
|
204
|
+
* @returns {void}
|
|
205
|
+
* @private
|
|
206
|
+
*/
|
|
207
|
+
function markThisUsed() {
|
|
208
|
+
if (stack.length) {
|
|
209
|
+
stack[stack.length - 1] = true;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
FunctionDeclaration: enterFunction,
|
|
215
|
+
"FunctionDeclaration:exit": exitFunction,
|
|
216
|
+
FunctionExpression: enterFunction,
|
|
217
|
+
"FunctionExpression:exit": exitFunction,
|
|
218
|
+
|
|
219
|
+
/*
|
|
220
|
+
* Class field value are implicit functions.
|
|
221
|
+
*/
|
|
222
|
+
"AccessorProperty > *.key:exit": pushContext,
|
|
223
|
+
"AccessorProperty:exit": popContext,
|
|
224
|
+
"PropertyDefinition > *.key:exit": pushContext,
|
|
225
|
+
"PropertyDefinition:exit": popContext,
|
|
226
|
+
|
|
227
|
+
/*
|
|
228
|
+
* Class static blocks are implicit functions. They aren't required to use `this`,
|
|
229
|
+
* but we have to push context so that it captures any use of `this` in the static block
|
|
230
|
+
* separately from enclosing contexts, because static blocks have their own `this` and it
|
|
231
|
+
* shouldn't count as used `this` in enclosing contexts.
|
|
232
|
+
*/
|
|
233
|
+
StaticBlock: pushContext,
|
|
234
|
+
"StaticBlock:exit": popContext,
|
|
235
|
+
|
|
236
|
+
ThisExpression: markThisUsed,
|
|
237
|
+
Super: markThisUsed,
|
|
238
|
+
...(enforceForClassFields && {
|
|
239
|
+
"AccessorProperty > ArrowFunctionExpression.value":
|
|
240
|
+
enterFunction,
|
|
241
|
+
"AccessorProperty > ArrowFunctionExpression.value:exit":
|
|
242
|
+
exitFunction,
|
|
243
|
+
"PropertyDefinition > ArrowFunctionExpression.value":
|
|
244
|
+
enterFunction,
|
|
245
|
+
"PropertyDefinition > ArrowFunctionExpression.value:exit":
|
|
246
|
+
exitFunction,
|
|
247
|
+
}),
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
};
|