From 049a0a1ef0a20be557029730ed3d1d5567e4000c Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Sat, 25 Feb 2023 16:57:15 +0800 Subject: [PATCH 1/8] feat(rome_js_analyze): noUselessCatch --- .../src/categories.rs | 2 + .../rome_js_analyze/src/analyzers/nursery.rs | 3 +- .../src/analyzers/nursery/no_useless_catch.rs | 110 ++++++++++++++++++ .../specs/nursery/noUselessCatch/invalid.js | 13 +++ .../nursery/noUselessCatch/invalid.js.snap | 58 +++++++++ .../specs/nursery/noUselessCatch/valid.js | 8 ++ .../nursery/noUselessCatch/valid.js.snap | 18 +++ .../src/configuration/linter/rules.rs | 78 ++++++++++--- .../src/configuration/parse/json/rules.rs | 19 +++ editors/vscode/configuration_schema.json | 7 ++ npm/backend-jsonrpc/src/workspace.ts | 10 +- npm/rome/configuration_schema.json | 7 ++ website/src/pages/lint/rules/index.mdx | 6 + .../src/pages/lint/rules/noUselessCatch.md | 84 +++++++++++++ 14 files changed, 401 insertions(+), 22 deletions(-) create mode 100644 crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs create mode 100644 crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js create mode 100644 crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap create mode 100644 crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js create mode 100644 crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js.snap create mode 100644 website/src/pages/lint/rules/noUselessCatch.md diff --git a/crates/rome_diagnostics_categories/src/categories.rs b/crates/rome_diagnostics_categories/src/categories.rs index fe289f54b90..dd1c749a75b 100644 --- a/crates/rome_diagnostics_categories/src/categories.rs +++ b/crates/rome_diagnostics_categories/src/categories.rs @@ -106,6 +106,8 @@ define_dategories! { "lint/nursery/noGlobalObjectCalls": "https://docs.rome.tools/lint/rules/noGlobalObjectCalls", "lint/nursery/noPrototypeBuiltins": "https://docs.rome.tools/lint/rules/noPrototypeBuiltins", "lint/nursery/noSvgWithoutTitle": "https://docs.rome.tools/lint/rules/noSvgWithoutTitle", + "lint/nursery/noSelfAssignment": "https://docs.rome.tools/lint/rules/noSelfAssignment", + "lint/nursery/noUselessCatch": "https://docs.rome.tools/lint/rules/noUselessCatch", // Insert new nursery rule here // performance diff --git a/crates/rome_js_analyze/src/analyzers/nursery.rs b/crates/rome_js_analyze/src/analyzers/nursery.rs index 346fac27054..d6ebcc11e63 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery.rs @@ -38,6 +38,7 @@ mod no_unreachable_super; mod no_unsafe_finally; mod no_unsafe_optional_chaining; mod no_unused_labels; +mod no_useless_catch; mod no_useless_rename; mod no_useless_switch_case; mod no_void_type_return; @@ -50,4 +51,4 @@ mod use_is_nan; mod use_media_caption; mod use_numeric_literals; mod use_yield; -declare_group! { pub (crate) Nursery { name : "nursery" , rules : [self :: no_access_key :: NoAccessKey , self :: no_assign_in_expressions :: NoAssignInExpressions , self :: no_banned_types :: NoBannedTypes , self :: no_comma_operator :: NoCommaOperator , self :: no_confusing_labels :: NoConfusingLabels , self :: no_const_enum :: NoConstEnum , self :: no_constructor_return :: NoConstructorReturn , self :: no_distracting_elements :: NoDistractingElements , self :: no_duplicate_case :: NoDuplicateCase , self :: no_duplicate_class_members :: NoDuplicateClassMembers , self :: no_duplicate_jsx_props :: NoDuplicateJsxProps , self :: no_duplicate_object_keys :: NoDuplicateObjectKeys , self :: no_empty_interface :: NoEmptyInterface , self :: no_extra_labels :: NoExtraLabels , self :: no_extra_non_null_assertion :: NoExtraNonNullAssertion , self :: no_extra_semicolons :: NoExtraSemicolons , self :: no_global_object_calls :: NoGlobalObjectCalls , self :: no_header_scope :: NoHeaderScope , self :: no_inferrable_types :: NoInferrableTypes , self :: no_inner_declarations :: NoInnerDeclarations , self :: no_invalid_constructor_super :: NoInvalidConstructorSuper , self :: no_non_null_assertion :: NoNonNullAssertion , self :: no_parameter_properties :: NoParameterProperties , self :: no_precision_loss :: NoPrecisionLoss , self :: no_prototype_builtins :: NoPrototypeBuiltins , self :: no_redundant_alt :: NoRedundantAlt , self :: no_redundant_use_strict :: NoRedundantUseStrict , self :: no_self_assignment :: NoSelfAssignment , self :: no_self_compare :: NoSelfCompare , self :: no_setter_return :: NoSetterReturn , self :: no_string_case_mismatch :: NoStringCaseMismatch , self :: no_svg_without_title :: NoSvgWithoutTitle , self :: no_switch_declarations :: NoSwitchDeclarations , self :: no_unreachable_super :: NoUnreachableSuper , self :: no_unsafe_finally :: NoUnsafeFinally , self :: no_unsafe_optional_chaining :: NoUnsafeOptionalChaining , self :: no_unused_labels :: NoUnusedLabels , self :: no_useless_rename :: NoUselessRename , self :: no_useless_switch_case :: NoUselessSwitchCase , self :: no_void_type_return :: NoVoidTypeReturn , self :: no_with :: NoWith , self :: use_default_parameter_last :: UseDefaultParameterLast , self :: use_default_switch_clause_last :: UseDefaultSwitchClauseLast , self :: use_enum_initializers :: UseEnumInitializers , self :: use_exponentiation_operator :: UseExponentiationOperator , self :: use_is_nan :: UseIsNan , self :: use_media_caption :: UseMediaCaption , self :: use_numeric_literals :: UseNumericLiterals , self :: use_yield :: UseYield ,] } } +declare_group! { pub (crate) Nursery { name : "nursery" , rules : [self :: no_access_key :: NoAccessKey , self :: no_assign_in_expressions :: NoAssignInExpressions , self :: no_banned_types :: NoBannedTypes , self :: no_comma_operator :: NoCommaOperator , self :: no_confusing_labels :: NoConfusingLabels , self :: no_const_enum :: NoConstEnum , self :: no_constructor_return :: NoConstructorReturn , self :: no_distracting_elements :: NoDistractingElements , self :: no_duplicate_case :: NoDuplicateCase , self :: no_duplicate_class_members :: NoDuplicateClassMembers , self :: no_duplicate_jsx_props :: NoDuplicateJsxProps , self :: no_duplicate_object_keys :: NoDuplicateObjectKeys , self :: no_empty_interface :: NoEmptyInterface , self :: no_extra_labels :: NoExtraLabels , self :: no_extra_non_null_assertion :: NoExtraNonNullAssertion , self :: no_extra_semicolons :: NoExtraSemicolons , self :: no_global_object_calls :: NoGlobalObjectCalls , self :: no_header_scope :: NoHeaderScope , self :: no_inferrable_types :: NoInferrableTypes , self :: no_inner_declarations :: NoInnerDeclarations , self :: no_invalid_constructor_super :: NoInvalidConstructorSuper , self :: no_non_null_assertion :: NoNonNullAssertion , self :: no_parameter_properties :: NoParameterProperties , self :: no_precision_loss :: NoPrecisionLoss , self :: no_prototype_builtins :: NoPrototypeBuiltins , self :: no_redundant_alt :: NoRedundantAlt , self :: no_redundant_use_strict :: NoRedundantUseStrict , self :: no_self_assignment :: NoSelfAssignment , self :: no_self_compare :: NoSelfCompare , self :: no_setter_return :: NoSetterReturn , self :: no_string_case_mismatch :: NoStringCaseMismatch , self :: no_switch_declarations :: NoSwitchDeclarations , self :: no_unreachable_super :: NoUnreachableSuper , self :: no_unsafe_finally :: NoUnsafeFinally , self :: no_unsafe_optional_chaining :: NoUnsafeOptionalChaining , self :: no_unused_labels :: NoUnusedLabels , self :: no_useless_catch :: NoUselessCatch , self :: no_useless_rename :: NoUselessRename , self :: no_useless_switch_case :: NoUselessSwitchCase , self :: no_void_type_return :: NoVoidTypeReturn , self :: no_with :: NoWith , self :: use_default_parameter_last :: UseDefaultParameterLast , self :: use_default_switch_clause_last :: UseDefaultSwitchClauseLast , self :: use_enum_initializers :: UseEnumInitializers , self :: use_exponentiation_operator :: UseExponentiationOperator , self :: use_is_nan :: UseIsNan , self :: use_media_caption :: UseMediaCaption , self :: use_numeric_literals :: UseNumericLiterals , self :: use_yield :: UseYield ,] } } diff --git a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs new file mode 100644 index 00000000000..5c929a5bbd3 --- /dev/null +++ b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs @@ -0,0 +1,110 @@ +use rome_analyze::{context::RuleContext, declare_rule, Ast, Rule, RuleDiagnostic}; +use rome_console::markup; +use rome_js_syntax::{JsCatchClause, TextRange}; +use rome_rowan::{AstNode, AstNodeList}; + +declare_rule! { + /// Disallow unnecessary catch clauses + /// + /// ## Examples + /// + /// ### Invalid + /// + /// ```js,expect_diagnostic + /// try { + /// doSomething(); + /// } catch(e) { + /// throw e; + /// } + /// ``` + /// ```js,expect_diagnostic + /// try { + /// doSomething(); + /// } catch(e) { + /// throw e; + /// } finally { + /// doCleanUp(); + /// } + /// ``` + /// ## Valid + /// + /// ```js + /// try { + /// doSomething(); + /// } catch(e) { + /// doSomethingWhenCatch(); + /// throw e; + /// } + /// ``` + /// + /// ```js + /// try { + /// doSomething(); + /// } catch(e) { + /// handleError(e); + /// } + /// ``` + /// + pub(crate) NoUselessCatch { + version: "next", + name: "noUselessCatch", + recommended: true, + } +} + +impl Rule for NoUselessCatch { + type Query = Ast; + type State = TextRange; + type Signals = Option; + type Options = (); + + fn run(ctx: &RuleContext) -> Option { + let binding = ctx.query(); + + let catch_body = binding.body().ok()?; + let body_statements = catch_body.statements(); + + if body_statements.len() != 1 { + return None; + } + + let catch_declaration = binding.declaration()?; + let catch_binding_err = catch_declaration + .binding() + .ok()? + .as_any_js_binding()? + .as_js_identifier_binding()? + .name_token() + .ok()?; + let catch_err_name = catch_binding_err.text(); + + // The statements must have the first one, + // because the body_statements.lent().eq(1). + let first = body_statements.first().unwrap(); + let js_throw_statement = first.as_js_throw_statement()?; + let throw_ident = js_throw_statement + .argument() + .ok()? + .as_js_identifier_expression()? + .text(); + + if throw_ident.eq(catch_err_name) { + return Some(js_throw_statement.syntax().text_trimmed_range()); + } else { + None + } + } + + fn diagnostic(_: &RuleContext, text_range: &Self::State) -> Option { + Some( + RuleDiagnostic::new( + rule_category!(), + text_range, + markup!("The catch clause that only rethrows the original error is redundant."), + ) + .note(markup!( + "It is recommended that these unnecessary catch clauses be removed." + )), + ) + } +} diff --git a/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js new file mode 100644 index 00000000000..2de7327486f --- /dev/null +++ b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js @@ -0,0 +1,13 @@ +try { + doSomethingThatMightThrow(); +} catch (e) { + throw e; +} + +try { + doSomethingThatMightThrow(); +} catch (e) { + throw e; +} finally { + cleanUp(); +} diff --git a/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap new file mode 100644 index 00000000000..733cc147446 --- /dev/null +++ b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap @@ -0,0 +1,58 @@ +--- +source: crates/rome_js_analyze/tests/spec_tests.rs +expression: invalid.js +--- +# Input +```js +try { + doSomethingThatMightThrow(); +} catch (e) { + throw e; +} + +try { + doSomethingThatMightThrow(); +} catch (e) { + throw e; +} finally { + cleanUp(); +} + +``` + +# Diagnostics +``` +invalid.js:4:2 lint/nursery/noUselessCatch ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ! The catch clause that only rethrows the original error is redundant. + + 2 │ doSomethingThatMightThrow(); + 3 │ } catch (e) { + > 4 │ throw e; + │ ^^^^^^^^ + 5 │ } + 6 │ + + i It is recommended that these unnecessary catch clauses be removed. + + +``` + +``` +invalid.js:10:2 lint/nursery/noUselessCatch ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ! The catch clause that only rethrows the original error is redundant. + + 8 │ doSomethingThatMightThrow(); + 9 │ } catch (e) { + > 10 │ throw e; + │ ^^^^^^^^ + 11 │ } finally { + 12 │ cleanUp(); + + i It is recommended that these unnecessary catch clauses be removed. + + +``` + + diff --git a/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js new file mode 100644 index 00000000000..c3e45b9e59c --- /dev/null +++ b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js @@ -0,0 +1,8 @@ +/* should not generate diagnostics */ + +try { + doSomethingThatMightThrow(); +} catch (e) { + doSomethingBeforeRethrow(); + throw e; +} diff --git a/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js.snap b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js.snap new file mode 100644 index 00000000000..10a2fce3e34 --- /dev/null +++ b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/valid.js.snap @@ -0,0 +1,18 @@ +--- +source: crates/rome_js_analyze/tests/spec_tests.rs +expression: valid.js +--- +# Input +```js +/* should not generate diagnostics */ + +try { + doSomethingThatMightThrow(); +} catch (e) { + doSomethingBeforeRethrow(); + throw e; +} + +``` + + diff --git a/crates/rome_service/src/configuration/linter/rules.rs b/crates/rome_service/src/configuration/linter/rules.rs index 528fbbf0388..326690c411a 100644 --- a/crates/rome_service/src/configuration/linter/rules.rs +++ b/crates/rome_service/src/configuration/linter/rules.rs @@ -184,7 +184,9 @@ impl Rules { None } } - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } #[doc = r" It returns a tuple of filters. The first element of the tuple are the enabled rules,"] #[doc = r" while the second element are the disabled rules."] #[doc = r""] @@ -418,7 +420,9 @@ impl A11y { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[8]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[9]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_autofocus.as_ref() { @@ -528,7 +532,9 @@ impl A11y { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -603,7 +609,9 @@ impl Complexity { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[4]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[5]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_extra_boolean_cast.as_ref() { @@ -679,7 +687,9 @@ impl Complexity { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -780,7 +790,9 @@ impl Correctness { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[9]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[10]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_children_prop.as_ref() { @@ -900,7 +912,9 @@ impl Correctness { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -1053,6 +1067,9 @@ pub struct Nursery { #[doc = "Disallow unused labels."] #[serde(skip_serializing_if = "Option::is_none")] pub no_unused_labels: Option, + #[doc = "Disallow unnecessary catch clauses"] + #[serde(skip_serializing_if = "Option::is_none")] + pub no_useless_catch: Option, #[doc = "Disallow renaming import, export, and destructured assignments to the same name."] #[serde(skip_serializing_if = "Option::is_none")] pub no_useless_rename: Option, @@ -1163,6 +1180,7 @@ impl Nursery { "noUnsafeFinally", "noUnsafeOptionalChaining", "noUnusedLabels", + "noUselessCatch", "noUselessRename", "noUselessSwitchCase", "noVar", @@ -1220,6 +1238,7 @@ impl Nursery { "noUnsafeFinally", "noUnsafeOptionalChaining", "noUnusedLabels", + "noUselessCatch", "noUselessRename", "noUselessSwitchCase", "noVar", @@ -1292,7 +1311,9 @@ impl Nursery { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[60]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[61]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_access_key.as_ref() { @@ -1490,7 +1511,7 @@ impl Nursery { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[38])); } } - if let Some(rule) = self.no_unused_labels.as_ref() { + if let Some(rule) = self.no_useless_catch.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[39])); } @@ -1804,7 +1825,7 @@ impl Nursery { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[38])); } } - if let Some(rule) = self.no_unused_labels.as_ref() { + if let Some(rule) = self.no_useless_catch.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[39])); } @@ -1922,7 +1943,9 @@ impl Nursery { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -1974,6 +1997,7 @@ impl Nursery { "noUnsafeFinally" => self.no_unsafe_finally.as_ref(), "noUnsafeOptionalChaining" => self.no_unsafe_optional_chaining.as_ref(), "noUnusedLabels" => self.no_unused_labels.as_ref(), + "noUselessCatch" => self.no_useless_catch.as_ref(), "noUselessRename" => self.no_useless_rename.as_ref(), "noUselessSwitchCase" => self.no_useless_switch_case.as_ref(), "noVar" => self.no_var.as_ref(), @@ -2018,7 +2042,9 @@ impl Performance { const RECOMMENDED_RULES: [&'static str; 1] = ["noDelete"]; const RECOMMENDED_RULES_AS_FILTERS: [RuleFilter<'static>; 1] = [RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0])]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_delete.as_ref() { @@ -2038,7 +2064,9 @@ impl Performance { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -2082,7 +2110,9 @@ impl Security { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[1]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_dangerously_set_inner_html.as_ref() { @@ -2112,7 +2142,9 @@ impl Security { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -2211,7 +2243,9 @@ impl Style { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[11]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[12]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_arguments.as_ref() { @@ -2351,7 +2385,9 @@ impl Style { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -2491,7 +2527,9 @@ impl Suspicious { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[14]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[15]), ]; - pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } + pub(crate) fn is_recommended(&self) -> bool { + !matches!(self.recommended, Some(false)) + } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_array_index_key.as_ref() { @@ -2661,7 +2699,9 @@ impl Suspicious { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } + pub(crate) fn has_rule(rule_name: &str) -> bool { + Self::GROUP_RULES.contains(&rule_name) + } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) diff --git a/crates/rome_service/src/configuration/parse/json/rules.rs b/crates/rome_service/src/configuration/parse/json/rules.rs index e86dfb103c8..e0c3cb5c127 100644 --- a/crates/rome_service/src/configuration/parse/json/rules.rs +++ b/crates/rome_service/src/configuration/parse/json/rules.rs @@ -743,6 +743,7 @@ impl VisitNode for Nursery { "noUnsafeFinally", "noUnsafeOptionalChaining", "noUnusedLabels", + "noUselessCatch", "noUselessRename", "noUselessSwitchCase", "noVar", @@ -1501,6 +1502,24 @@ impl VisitNode for Nursery { )); } }, + "noUselessCatch" => match value { + AnyJsonValue::JsonStringValue(_) => { + let mut configuration = RuleConfiguration::default(); + self.map_to_known_string(&value, name_text, &mut configuration, diagnostics)?; + self.no_useless_catch = Some(configuration); + } + AnyJsonValue::JsonObjectValue(_) => { + let mut configuration = RuleConfiguration::default(); + self.map_to_object(&value, name_text, &mut configuration, diagnostics)?; + self.no_useless_catch = Some(configuration); + } + _ => { + diagnostics.push(DeserializationDiagnostic::new_incorrect_type( + "object or string", + value.range(), + )); + } + }, "noUselessRename" => match value { AnyJsonValue::JsonStringValue(_) => { let mut configuration = RuleConfiguration::default(); diff --git a/editors/vscode/configuration_schema.json b/editors/vscode/configuration_schema.json index 4cd774d21fd..6df52761d1a 100644 --- a/editors/vscode/configuration_schema.json +++ b/editors/vscode/configuration_schema.json @@ -683,6 +683,13 @@ { "type": "null" } ] }, + "noUselessCatch": { + "description": "Disallow unnecessary catch clauses", + "anyOf": [ + { "$ref": "#/definitions/RuleConfiguration" }, + { "type": "null" } + ] + }, "noUselessRename": { "description": "Disallow renaming import, export, and destructured assignments to the same name.", "anyOf": [ diff --git a/npm/backend-jsonrpc/src/workspace.ts b/npm/backend-jsonrpc/src/workspace.ts index 0832b3ab56b..02b31baf8d5 100644 --- a/npm/backend-jsonrpc/src/workspace.ts +++ b/npm/backend-jsonrpc/src/workspace.ts @@ -456,6 +456,10 @@ export interface Nursery { * Disallow unused labels. */ noUnusedLabels?: RuleConfiguration; + /** + * Disallow unnecessary catch clauses + */ + noUselessCatch?: RuleConfiguration; /** * Disallow renaming import, export, and destructured assignments to the same name. */ @@ -881,6 +885,8 @@ export type Category = | "lint/nursery/noGlobalObjectCalls" | "lint/nursery/noPrototypeBuiltins" | "lint/nursery/noSvgWithoutTitle" + | "lint/nursery/noSelfAssignment" + | "lint/nursery/noUselessCatch" | "lint/performance/noDelete" | "lint/security/noDangerouslySetInnerHtml" | "lint/security/noDangerouslySetInnerHtmlWithChildren" @@ -1159,7 +1165,7 @@ export interface RenameResult { } export interface Workspace { supportsFeature( - params: SupportsFeatureParams, + params: SupportsFeatureParams ): Promise; updateSettings(params: UpdateSettingsParams): Promise; openFile(params: OpenFileParams): Promise; @@ -1169,7 +1175,7 @@ export interface Workspace { getControlFlowGraph(params: GetControlFlowGraphParams): Promise; getFormatterIr(params: GetFormatterIRParams): Promise; pullDiagnostics( - params: PullDiagnosticsParams, + params: PullDiagnosticsParams ): Promise; pullActions(params: PullActionsParams): Promise; formatFile(params: FormatFileParams): Promise; diff --git a/npm/rome/configuration_schema.json b/npm/rome/configuration_schema.json index 4cd774d21fd..6df52761d1a 100644 --- a/npm/rome/configuration_schema.json +++ b/npm/rome/configuration_schema.json @@ -683,6 +683,13 @@ { "type": "null" } ] }, + "noUselessCatch": { + "description": "Disallow unnecessary catch clauses", + "anyOf": [ + { "$ref": "#/definitions/RuleConfiguration" }, + { "type": "null" } + ] + }, "noUselessRename": { "description": "Disallow renaming import, export, and destructured assignments to the same name.", "anyOf": [ diff --git a/website/src/pages/lint/rules/index.mdx b/website/src/pages/lint/rules/index.mdx index dd513e05d40..26f7799893d 100644 --- a/website/src/pages/lint/rules/index.mdx +++ b/website/src/pages/lint/rules/index.mdx @@ -728,6 +728,12 @@ Disallow the use of optional chaining in contexts where the undefined value is n Disallow unused labels.
+

+ noUselessCatch +

+Disallow unnecessary catch clauses +
+

noUselessRename

diff --git a/website/src/pages/lint/rules/noUselessCatch.md b/website/src/pages/lint/rules/noUselessCatch.md new file mode 100644 index 00000000000..b97c6e4e16a --- /dev/null +++ b/website/src/pages/lint/rules/noUselessCatch.md @@ -0,0 +1,84 @@ +--- +title: Lint Rule noUselessCatch +parent: lint/rules/index +--- + +# noUselessCatch (since vnext) + +Disallow unnecessary catch clauses + +## Examples + +### Invalid + +```jsx +try { + doSomething(); +} catch(e) { + throw e; +} +``` + +
nursery/noUselessCatch.js:4:5 lint/nursery/noUselessCatch ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+   The catch clause that only rethrows the original error is redundant.
+  
+    2 │     doSomething();
+    3 │ } catch(e) {
+  > 4 │     throw e;
+       ^^^^^^^^
+    5 │ }
+    6 │ 
+  
+   It is recommended that these unnecessary catch clauses be removed.
+  
+
+ +```jsx +try { + doSomething(); +} catch(e) { + throw e; +} finally { + doCleanUp(); +} +``` + +
nursery/noUselessCatch.js:4:5 lint/nursery/noUselessCatch ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+   The catch clause that only rethrows the original error is redundant.
+  
+    2 │     doSomething();
+    3 │ } catch(e) {
+  > 4 │     throw e;
+       ^^^^^^^^
+    5 │ } finally {
+    6 │     doCleanUp();
+  
+   It is recommended that these unnecessary catch clauses be removed.
+  
+
+ +## Valid + +```jsx +try { + doSomething(); +} catch(e) { + doSomethingWhenCatch(); + throw e; +} +``` + +```jsx +try { + doSomething(); +} catch(e) { + handleError(e); +} +``` + +## Related links + +- [Disable a rule](/linter/#disable-a-lint-rule) +- [Rule options](/linter/#rule-options) From 638a0f0eaf51e15bacfe92b72227fac85a3f183f Mon Sep 17 00:00:00 2001 From: qixuan <58852732+GiveMe-A-Name@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:41:03 +0800 Subject: [PATCH 2/8] Update crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs Co-authored-by: Victorien ELVINGER --- .../src/analyzers/nursery/no_useless_catch.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs index 5c929a5bbd3..500d9888b5c 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs @@ -4,7 +4,14 @@ use rome_js_syntax::{JsCatchClause, TextRange}; use rome_rowan::{AstNode, AstNodeList}; declare_rule! { - /// Disallow unnecessary catch clauses + /// Disallow unnecessary `catch` clauses. + /// + /// A `catch` clause that only rethrows the original error is redundant, + /// and has no effect on the runtime behavior of the program. + /// These redundant clauses can be a source of confusion and code bloat, + /// so it’s better to disallow these unnecessary `catch` clauses. + /// + /// Source: https://eslint.org/docs/latest/rules/no-useless-catch /// /// ## Examples /// From 4d13dd5f2f9dc7d01ae379f991fc3b26ffa58b73 Mon Sep 17 00:00:00 2001 From: qixuan <58852732+GiveMe-A-Name@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:45:32 +0800 Subject: [PATCH 3/8] Apply suggestions from code review Co-authored-by: Victorien ELVINGER --- .../src/analyzers/nursery/no_useless_catch.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs index 500d9888b5c..ceb33d7e65d 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs @@ -65,7 +65,7 @@ impl Rule for NoUselessCatch { type Signals = Option; type Options = (); - fn run(ctx: &RuleContext) -> Option { + fn run(ctx: &RuleContext) -> Self::Signals { let binding = ctx.query(); let catch_body = binding.body().ok()?; @@ -85,7 +85,7 @@ impl Rule for NoUselessCatch { .ok()?; let catch_err_name = catch_binding_err.text(); - // The statements must have the first one, + // SAFETY: The statements must have the first one, // because the body_statements.lent().eq(1). let first = body_statements.first().unwrap(); let js_throw_statement = first.as_js_throw_statement()?; @@ -96,7 +96,7 @@ impl Rule for NoUselessCatch { .text(); if throw_ident.eq(catch_err_name) { - return Some(js_throw_statement.syntax().text_trimmed_range()); + Some(js_throw_statement.syntax().text_trimmed_range()) } else { None } @@ -107,10 +107,10 @@ impl Rule for NoUselessCatch { RuleDiagnostic::new( rule_category!(), text_range, - markup!("The catch clause that only rethrows the original error is redundant."), + markup!("The ""catch"" clause that only rethrows the original error is redundant."), ) .note(markup!( - "It is recommended that these unnecessary catch clauses be removed." + "These unnecessary ""catch"" clauses can be confusing. It is recommended to remove them." )), ) } From 419124d06d941ef36a46d7a2455eced4a41d4eb2 Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Sat, 25 Feb 2023 19:57:19 +0800 Subject: [PATCH 4/8] test: update the test snapshot & rule docs --- .../nursery/noUselessCatch/invalid.js.snap | 4 ++-- .../src/configuration/linter/rules.rs | 2 +- editors/vscode/configuration_schema.json | 2 +- npm/backend-jsonrpc/src/workspace.ts | 2 +- npm/rome/configuration_schema.json | 2 +- website/src/pages/lint/rules/index.mdx | 2 +- website/src/pages/lint/rules/noUselessCatch.md | 17 ++++++++++++----- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap index 733cc147446..93db1b1a547 100644 --- a/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap +++ b/crates/rome_js_analyze/tests/specs/nursery/noUselessCatch/invalid.js.snap @@ -33,7 +33,7 @@ invalid.js:4:2 lint/nursery/noUselessCatch ━━━━━━━━━━━━ 5 │ } 6 │ - i It is recommended that these unnecessary catch clauses be removed. + i These unnecessary catch clauses can be confusing. It is recommended to remove them. ``` @@ -50,7 +50,7 @@ invalid.js:10:2 lint/nursery/noUselessCatch ━━━━━━━━━━━━ 11 │ } finally { 12 │ cleanUp(); - i It is recommended that these unnecessary catch clauses be removed. + i These unnecessary catch clauses can be confusing. It is recommended to remove them. ``` diff --git a/crates/rome_service/src/configuration/linter/rules.rs b/crates/rome_service/src/configuration/linter/rules.rs index 326690c411a..627b0f1a0ac 100644 --- a/crates/rome_service/src/configuration/linter/rules.rs +++ b/crates/rome_service/src/configuration/linter/rules.rs @@ -1067,7 +1067,7 @@ pub struct Nursery { #[doc = "Disallow unused labels."] #[serde(skip_serializing_if = "Option::is_none")] pub no_unused_labels: Option, - #[doc = "Disallow unnecessary catch clauses"] + #[doc = "Disallow unnecessary catch clauses."] #[serde(skip_serializing_if = "Option::is_none")] pub no_useless_catch: Option, #[doc = "Disallow renaming import, export, and destructured assignments to the same name."] diff --git a/editors/vscode/configuration_schema.json b/editors/vscode/configuration_schema.json index 6df52761d1a..66d28285722 100644 --- a/editors/vscode/configuration_schema.json +++ b/editors/vscode/configuration_schema.json @@ -684,7 +684,7 @@ ] }, "noUselessCatch": { - "description": "Disallow unnecessary catch clauses", + "description": "Disallow unnecessary catch clauses.", "anyOf": [ { "$ref": "#/definitions/RuleConfiguration" }, { "type": "null" } diff --git a/npm/backend-jsonrpc/src/workspace.ts b/npm/backend-jsonrpc/src/workspace.ts index 02b31baf8d5..4a1724aceab 100644 --- a/npm/backend-jsonrpc/src/workspace.ts +++ b/npm/backend-jsonrpc/src/workspace.ts @@ -457,7 +457,7 @@ export interface Nursery { */ noUnusedLabels?: RuleConfiguration; /** - * Disallow unnecessary catch clauses + * Disallow unnecessary catch clauses. */ noUselessCatch?: RuleConfiguration; /** diff --git a/npm/rome/configuration_schema.json b/npm/rome/configuration_schema.json index 6df52761d1a..66d28285722 100644 --- a/npm/rome/configuration_schema.json +++ b/npm/rome/configuration_schema.json @@ -684,7 +684,7 @@ ] }, "noUselessCatch": { - "description": "Disallow unnecessary catch clauses", + "description": "Disallow unnecessary catch clauses.", "anyOf": [ { "$ref": "#/definitions/RuleConfiguration" }, { "type": "null" } diff --git a/website/src/pages/lint/rules/index.mdx b/website/src/pages/lint/rules/index.mdx index 26f7799893d..8caf630a284 100644 --- a/website/src/pages/lint/rules/index.mdx +++ b/website/src/pages/lint/rules/index.mdx @@ -731,7 +731,7 @@ Disallow unused labels.

noUselessCatch

-Disallow unnecessary catch clauses +Disallow unnecessary catch clauses.

diff --git a/website/src/pages/lint/rules/noUselessCatch.md b/website/src/pages/lint/rules/noUselessCatch.md index b97c6e4e16a..d7ee2179674 100644 --- a/website/src/pages/lint/rules/noUselessCatch.md +++ b/website/src/pages/lint/rules/noUselessCatch.md @@ -5,7 +5,14 @@ parent: lint/rules/index # noUselessCatch (since vnext) -Disallow unnecessary catch clauses +Disallow unnecessary `catch` clauses. + +A `catch` clause that only rethrows the original error is redundant, +and has no effect on the runtime behavior of the program. +These redundant clauses can be a source of confusion and code bloat, +so it’s better to disallow these unnecessary `catch` clauses. + +Source: https://eslint.org/docs/latest/rules/no-useless-catch ## Examples @@ -21,7 +28,7 @@ try {
nursery/noUselessCatch.js:4:5 lint/nursery/noUselessCatch ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
-   The catch clause that only rethrows the original error is redundant.
+   The catch clause that only rethrows the original error is redundant.
   
     2 │     doSomething();
     3 │ } catch(e) {
@@ -30,7 +37,7 @@ try {
     5 │ }
     6 │ 
   
-   It is recommended that these unnecessary catch clauses be removed.
+   These unnecessary catch clauses can be confusing. It is recommended to remove them.
   
 
@@ -46,7 +53,7 @@ try {
nursery/noUselessCatch.js:4:5 lint/nursery/noUselessCatch ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
-   The catch clause that only rethrows the original error is redundant.
+   The catch clause that only rethrows the original error is redundant.
   
     2 │     doSomething();
     3 │ } catch(e) {
@@ -55,7 +62,7 @@ try {
     5 │ } finally {
     6 │     doCleanUp();
   
-   It is recommended that these unnecessary catch clauses be removed.
+   These unnecessary catch clauses can be confusing. It is recommended to remove them.
   
 
From 1ba0011d39d4053378ca463129606541c3c4e71c Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Sat, 25 Feb 2023 21:23:38 +0800 Subject: [PATCH 5/8] fix(rome_js_analyzers): use ? instead of unwrap. --- .../src/analyzers/nursery/no_useless_catch.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs index ceb33d7e65d..aa64e35c98e 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs @@ -85,10 +85,8 @@ impl Rule for NoUselessCatch { .ok()?; let catch_err_name = catch_binding_err.text(); - // SAFETY: The statements must have the first one, - // because the body_statements.lent().eq(1). - let first = body_statements.first().unwrap(); - let js_throw_statement = first.as_js_throw_statement()?; + let first_statement = body_statements.first()?; + let js_throw_statement = first_statement.as_js_throw_statement()?; let throw_ident = js_throw_statement .argument() .ok()? From 6ace6b2c0bd048bf35859ee3f66e5b6ff5e39f3d Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Sat, 25 Feb 2023 21:31:36 +0800 Subject: [PATCH 6/8] perf: added some annotations --- crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs index aa64e35c98e..d5ae5d12c8e 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs @@ -71,6 +71,7 @@ impl Rule for NoUselessCatch { let catch_body = binding.body().ok()?; let body_statements = catch_body.statements(); + // We need guarantees that body_statements is only one statement so much that it has only one `throw` statement. if body_statements.len() != 1 { return None; } From 1293f79cae248f3903b279bbfc3187a30d3f5586 Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Sat, 25 Feb 2023 21:38:24 +0800 Subject: [PATCH 7/8] perf: update annotation --- .../rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs index d5ae5d12c8e..abadb4751ba 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery/no_useless_catch.rs @@ -71,7 +71,7 @@ impl Rule for NoUselessCatch { let catch_body = binding.body().ok()?; let body_statements = catch_body.statements(); - // We need guarantees that body_statements is only one statement so much that it has only one `throw` statement. + // We need guarantees that body_statements has only one `throw` statement. if body_statements.len() != 1 { return None; } From 1ae17c1c6fc6cd64a6049fffc4ea5d96f8a44f7d Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Sun, 26 Feb 2023 07:29:45 +0800 Subject: [PATCH 8/8] fix: resolve the conflicts due to rebase --- .../src/categories.rs | 1 - .../rome_js_analyze/src/analyzers/nursery.rs | 2 +- .../src/configuration/linter/rules.rs | 185 ++++++++---------- npm/backend-jsonrpc/src/workspace.ts | 5 +- 4 files changed, 84 insertions(+), 109 deletions(-) diff --git a/crates/rome_diagnostics_categories/src/categories.rs b/crates/rome_diagnostics_categories/src/categories.rs index dd1c749a75b..7e8c54ad177 100644 --- a/crates/rome_diagnostics_categories/src/categories.rs +++ b/crates/rome_diagnostics_categories/src/categories.rs @@ -106,7 +106,6 @@ define_dategories! { "lint/nursery/noGlobalObjectCalls": "https://docs.rome.tools/lint/rules/noGlobalObjectCalls", "lint/nursery/noPrototypeBuiltins": "https://docs.rome.tools/lint/rules/noPrototypeBuiltins", "lint/nursery/noSvgWithoutTitle": "https://docs.rome.tools/lint/rules/noSvgWithoutTitle", - "lint/nursery/noSelfAssignment": "https://docs.rome.tools/lint/rules/noSelfAssignment", "lint/nursery/noUselessCatch": "https://docs.rome.tools/lint/rules/noUselessCatch", // Insert new nursery rule here diff --git a/crates/rome_js_analyze/src/analyzers/nursery.rs b/crates/rome_js_analyze/src/analyzers/nursery.rs index d6ebcc11e63..a6434859c9d 100644 --- a/crates/rome_js_analyze/src/analyzers/nursery.rs +++ b/crates/rome_js_analyze/src/analyzers/nursery.rs @@ -51,4 +51,4 @@ mod use_is_nan; mod use_media_caption; mod use_numeric_literals; mod use_yield; -declare_group! { pub (crate) Nursery { name : "nursery" , rules : [self :: no_access_key :: NoAccessKey , self :: no_assign_in_expressions :: NoAssignInExpressions , self :: no_banned_types :: NoBannedTypes , self :: no_comma_operator :: NoCommaOperator , self :: no_confusing_labels :: NoConfusingLabels , self :: no_const_enum :: NoConstEnum , self :: no_constructor_return :: NoConstructorReturn , self :: no_distracting_elements :: NoDistractingElements , self :: no_duplicate_case :: NoDuplicateCase , self :: no_duplicate_class_members :: NoDuplicateClassMembers , self :: no_duplicate_jsx_props :: NoDuplicateJsxProps , self :: no_duplicate_object_keys :: NoDuplicateObjectKeys , self :: no_empty_interface :: NoEmptyInterface , self :: no_extra_labels :: NoExtraLabels , self :: no_extra_non_null_assertion :: NoExtraNonNullAssertion , self :: no_extra_semicolons :: NoExtraSemicolons , self :: no_global_object_calls :: NoGlobalObjectCalls , self :: no_header_scope :: NoHeaderScope , self :: no_inferrable_types :: NoInferrableTypes , self :: no_inner_declarations :: NoInnerDeclarations , self :: no_invalid_constructor_super :: NoInvalidConstructorSuper , self :: no_non_null_assertion :: NoNonNullAssertion , self :: no_parameter_properties :: NoParameterProperties , self :: no_precision_loss :: NoPrecisionLoss , self :: no_prototype_builtins :: NoPrototypeBuiltins , self :: no_redundant_alt :: NoRedundantAlt , self :: no_redundant_use_strict :: NoRedundantUseStrict , self :: no_self_assignment :: NoSelfAssignment , self :: no_self_compare :: NoSelfCompare , self :: no_setter_return :: NoSetterReturn , self :: no_string_case_mismatch :: NoStringCaseMismatch , self :: no_switch_declarations :: NoSwitchDeclarations , self :: no_unreachable_super :: NoUnreachableSuper , self :: no_unsafe_finally :: NoUnsafeFinally , self :: no_unsafe_optional_chaining :: NoUnsafeOptionalChaining , self :: no_unused_labels :: NoUnusedLabels , self :: no_useless_catch :: NoUselessCatch , self :: no_useless_rename :: NoUselessRename , self :: no_useless_switch_case :: NoUselessSwitchCase , self :: no_void_type_return :: NoVoidTypeReturn , self :: no_with :: NoWith , self :: use_default_parameter_last :: UseDefaultParameterLast , self :: use_default_switch_clause_last :: UseDefaultSwitchClauseLast , self :: use_enum_initializers :: UseEnumInitializers , self :: use_exponentiation_operator :: UseExponentiationOperator , self :: use_is_nan :: UseIsNan , self :: use_media_caption :: UseMediaCaption , self :: use_numeric_literals :: UseNumericLiterals , self :: use_yield :: UseYield ,] } } +declare_group! { pub (crate) Nursery { name : "nursery" , rules : [self :: no_access_key :: NoAccessKey , self :: no_assign_in_expressions :: NoAssignInExpressions , self :: no_banned_types :: NoBannedTypes , self :: no_comma_operator :: NoCommaOperator , self :: no_confusing_labels :: NoConfusingLabels , self :: no_const_enum :: NoConstEnum , self :: no_constructor_return :: NoConstructorReturn , self :: no_distracting_elements :: NoDistractingElements , self :: no_duplicate_case :: NoDuplicateCase , self :: no_duplicate_class_members :: NoDuplicateClassMembers , self :: no_duplicate_jsx_props :: NoDuplicateJsxProps , self :: no_duplicate_object_keys :: NoDuplicateObjectKeys , self :: no_empty_interface :: NoEmptyInterface , self :: no_extra_labels :: NoExtraLabels , self :: no_extra_non_null_assertion :: NoExtraNonNullAssertion , self :: no_extra_semicolons :: NoExtraSemicolons , self :: no_global_object_calls :: NoGlobalObjectCalls , self :: no_header_scope :: NoHeaderScope , self :: no_inferrable_types :: NoInferrableTypes , self :: no_inner_declarations :: NoInnerDeclarations , self :: no_invalid_constructor_super :: NoInvalidConstructorSuper , self :: no_non_null_assertion :: NoNonNullAssertion , self :: no_parameter_properties :: NoParameterProperties , self :: no_precision_loss :: NoPrecisionLoss , self :: no_prototype_builtins :: NoPrototypeBuiltins , self :: no_redundant_alt :: NoRedundantAlt , self :: no_redundant_use_strict :: NoRedundantUseStrict , self :: no_self_assignment :: NoSelfAssignment , self :: no_self_compare :: NoSelfCompare , self :: no_setter_return :: NoSetterReturn , self :: no_string_case_mismatch :: NoStringCaseMismatch , self :: no_svg_without_title :: NoSvgWithoutTitle , self :: no_switch_declarations :: NoSwitchDeclarations , self :: no_unreachable_super :: NoUnreachableSuper , self :: no_unsafe_finally :: NoUnsafeFinally , self :: no_unsafe_optional_chaining :: NoUnsafeOptionalChaining , self :: no_unused_labels :: NoUnusedLabels , self :: no_useless_catch :: NoUselessCatch , self :: no_useless_rename :: NoUselessRename , self :: no_useless_switch_case :: NoUselessSwitchCase , self :: no_void_type_return :: NoVoidTypeReturn , self :: no_with :: NoWith , self :: use_default_parameter_last :: UseDefaultParameterLast , self :: use_default_switch_clause_last :: UseDefaultSwitchClauseLast , self :: use_enum_initializers :: UseEnumInitializers , self :: use_exponentiation_operator :: UseExponentiationOperator , self :: use_is_nan :: UseIsNan , self :: use_media_caption :: UseMediaCaption , self :: use_numeric_literals :: UseNumericLiterals , self :: use_yield :: UseYield ,] } } diff --git a/crates/rome_service/src/configuration/linter/rules.rs b/crates/rome_service/src/configuration/linter/rules.rs index 627b0f1a0ac..d2cead9970f 100644 --- a/crates/rome_service/src/configuration/linter/rules.rs +++ b/crates/rome_service/src/configuration/linter/rules.rs @@ -184,9 +184,7 @@ impl Rules { None } } - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } #[doc = r" It returns a tuple of filters. The first element of the tuple are the enabled rules,"] #[doc = r" while the second element are the disabled rules."] #[doc = r""] @@ -420,9 +418,7 @@ impl A11y { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[8]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[9]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_autofocus.as_ref() { @@ -532,9 +528,7 @@ impl A11y { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -609,9 +603,7 @@ impl Complexity { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[4]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[5]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_extra_boolean_cast.as_ref() { @@ -687,9 +679,7 @@ impl Complexity { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -790,9 +780,7 @@ impl Correctness { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[9]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[10]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_children_prop.as_ref() { @@ -912,9 +900,7 @@ impl Correctness { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -1139,7 +1125,7 @@ pub struct Nursery { } impl Nursery { const GROUP_NAME: &'static str = "nursery"; - pub(crate) const GROUP_RULES: [&'static str; 62] = [ + pub(crate) const GROUP_RULES: [&'static str; 63] = [ "noAccessKey", "noAssignInExpressions", "noBannedTypes", @@ -1204,7 +1190,7 @@ impl Nursery { "useValidLang", "useYield", ]; - const RECOMMENDED_RULES: [&'static str; 51] = [ + const RECOMMENDED_RULES: [&'static str; 52] = [ "noAssignInExpressions", "noBannedTypes", "noClassAssign", @@ -1258,7 +1244,7 @@ impl Nursery { "useValidLang", "useYield", ]; - const RECOMMENDED_RULES_AS_FILTERS: [RuleFilter<'static>; 51] = [ + const RECOMMENDED_RULES_AS_FILTERS: [RuleFilter<'static>; 52] = [ RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[1]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[2]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[3]), @@ -1297,23 +1283,22 @@ impl Nursery { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[42]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[43]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[44]), - RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46]), - RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[45]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[50]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[51]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[52]), - RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[55]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[53]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[56]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[57]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[58]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[59]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[60]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[61]), + RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[62]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_access_key.as_ref() { @@ -1511,121 +1496,126 @@ impl Nursery { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[38])); } } - if let Some(rule) = self.no_useless_catch.as_ref() { + if let Some(rule) = self.no_unused_labels.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[39])); } } - if let Some(rule) = self.no_useless_rename.as_ref() { + if let Some(rule) = self.no_useless_catch.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[40])); } } - if let Some(rule) = self.no_useless_switch_case.as_ref() { + if let Some(rule) = self.no_useless_rename.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[41])); } } - if let Some(rule) = self.no_var.as_ref() { + if let Some(rule) = self.no_useless_switch_case.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[42])); } } - if let Some(rule) = self.no_void_type_return.as_ref() { + if let Some(rule) = self.no_var.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[43])); } } - if let Some(rule) = self.no_with.as_ref() { + if let Some(rule) = self.no_void_type_return.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[44])); } } - if let Some(rule) = self.use_aria_prop_types.as_ref() { + if let Some(rule) = self.no_with.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[45])); } } - if let Some(rule) = self.use_aria_props_for_role.as_ref() { + if let Some(rule) = self.use_aria_prop_types.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46])); } } - if let Some(rule) = self.use_camel_case.as_ref() { + if let Some(rule) = self.use_aria_props_for_role.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47])); } } - if let Some(rule) = self.use_const.as_ref() { + if let Some(rule) = self.use_camel_case.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48])); } } - if let Some(rule) = self.use_default_parameter_last.as_ref() { + if let Some(rule) = self.use_const.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49])); } } - if let Some(rule) = self.use_default_switch_clause_last.as_ref() { + if let Some(rule) = self.use_default_parameter_last.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[50])); } } - if let Some(rule) = self.use_enum_initializers.as_ref() { + if let Some(rule) = self.use_default_switch_clause_last.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[51])); } } - if let Some(rule) = self.use_exhaustive_dependencies.as_ref() { + if let Some(rule) = self.use_enum_initializers.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[52])); } } - if let Some(rule) = self.use_exponentiation_operator.as_ref() { + if let Some(rule) = self.use_exhaustive_dependencies.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[53])); } } - if let Some(rule) = self.use_hook_at_top_level.as_ref() { + if let Some(rule) = self.use_exponentiation_operator.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[54])); } } - if let Some(rule) = self.use_iframe_title.as_ref() { + if let Some(rule) = self.use_hook_at_top_level.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[55])); } } - if let Some(rule) = self.use_is_nan.as_ref() { + if let Some(rule) = self.use_iframe_title.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[56])); } } - if let Some(rule) = self.use_media_caption.as_ref() { + if let Some(rule) = self.use_is_nan.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[57])); } } - if let Some(rule) = self.use_numeric_literals.as_ref() { + if let Some(rule) = self.use_media_caption.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[58])); } } - if let Some(rule) = self.use_valid_aria_props.as_ref() { + if let Some(rule) = self.use_numeric_literals.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[59])); } } - if let Some(rule) = self.use_valid_lang.as_ref() { + if let Some(rule) = self.use_valid_aria_props.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[60])); } } - if let Some(rule) = self.use_yield.as_ref() { + if let Some(rule) = self.use_valid_lang.as_ref() { if rule.is_enabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[61])); } } + if let Some(rule) = self.use_yield.as_ref() { + if rule.is_enabled() { + index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[62])); + } + } index_set } pub(crate) fn get_disabled_rules(&self) -> IndexSet { @@ -1825,132 +1815,135 @@ impl Nursery { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[38])); } } - if let Some(rule) = self.no_useless_catch.as_ref() { + if let Some(rule) = self.no_unused_labels.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[39])); } } - if let Some(rule) = self.no_useless_rename.as_ref() { + if let Some(rule) = self.no_useless_catch.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[40])); } } - if let Some(rule) = self.no_useless_switch_case.as_ref() { + if let Some(rule) = self.no_useless_rename.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[41])); } } - if let Some(rule) = self.no_var.as_ref() { + if let Some(rule) = self.no_useless_switch_case.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[42])); } } - if let Some(rule) = self.no_void_type_return.as_ref() { + if let Some(rule) = self.no_var.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[43])); } } - if let Some(rule) = self.no_with.as_ref() { + if let Some(rule) = self.no_void_type_return.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[44])); } } - if let Some(rule) = self.use_aria_prop_types.as_ref() { + if let Some(rule) = self.no_with.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[45])); } } - if let Some(rule) = self.use_aria_props_for_role.as_ref() { + if let Some(rule) = self.use_aria_prop_types.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[46])); } } - if let Some(rule) = self.use_camel_case.as_ref() { + if let Some(rule) = self.use_aria_props_for_role.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[47])); } } - if let Some(rule) = self.use_const.as_ref() { + if let Some(rule) = self.use_camel_case.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[48])); } } - if let Some(rule) = self.use_default_parameter_last.as_ref() { + if let Some(rule) = self.use_const.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[49])); } } - if let Some(rule) = self.use_default_switch_clause_last.as_ref() { + if let Some(rule) = self.use_default_parameter_last.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[50])); } } - if let Some(rule) = self.use_enum_initializers.as_ref() { + if let Some(rule) = self.use_default_switch_clause_last.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[51])); } } - if let Some(rule) = self.use_exhaustive_dependencies.as_ref() { + if let Some(rule) = self.use_enum_initializers.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[52])); } } - if let Some(rule) = self.use_exponentiation_operator.as_ref() { + if let Some(rule) = self.use_exhaustive_dependencies.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[53])); } } - if let Some(rule) = self.use_hook_at_top_level.as_ref() { + if let Some(rule) = self.use_exponentiation_operator.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[54])); } } - if let Some(rule) = self.use_iframe_title.as_ref() { + if let Some(rule) = self.use_hook_at_top_level.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[55])); } } - if let Some(rule) = self.use_is_nan.as_ref() { + if let Some(rule) = self.use_iframe_title.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[56])); } } - if let Some(rule) = self.use_media_caption.as_ref() { + if let Some(rule) = self.use_is_nan.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[57])); } } - if let Some(rule) = self.use_numeric_literals.as_ref() { + if let Some(rule) = self.use_media_caption.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[58])); } } - if let Some(rule) = self.use_valid_aria_props.as_ref() { + if let Some(rule) = self.use_numeric_literals.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[59])); } } - if let Some(rule) = self.use_valid_lang.as_ref() { + if let Some(rule) = self.use_valid_aria_props.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[60])); } } - if let Some(rule) = self.use_yield.as_ref() { + if let Some(rule) = self.use_valid_lang.as_ref() { if rule.is_disabled() { index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[61])); } } + if let Some(rule) = self.use_yield.as_ref() { + if rule.is_disabled() { + index_set.insert(RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[62])); + } + } index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) } - pub(crate) fn recommended_rules_as_filters() -> [RuleFilter<'static>; 51] { + pub(crate) fn recommended_rules_as_filters() -> [RuleFilter<'static>; 52] { Self::RECOMMENDED_RULES_AS_FILTERS } pub(crate) fn get_rule_configuration(&self, rule_name: &str) -> Option<&RuleConfiguration> { @@ -2042,9 +2035,7 @@ impl Performance { const RECOMMENDED_RULES: [&'static str; 1] = ["noDelete"]; const RECOMMENDED_RULES_AS_FILTERS: [RuleFilter<'static>; 1] = [RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0])]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_delete.as_ref() { @@ -2064,9 +2055,7 @@ impl Performance { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -2110,9 +2099,7 @@ impl Security { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[0]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[1]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_dangerously_set_inner_html.as_ref() { @@ -2142,9 +2129,7 @@ impl Security { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -2243,9 +2228,7 @@ impl Style { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[11]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[12]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_arguments.as_ref() { @@ -2385,9 +2368,7 @@ impl Style { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) @@ -2527,9 +2508,7 @@ impl Suspicious { RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[14]), RuleFilter::Rule(Self::GROUP_NAME, Self::GROUP_RULES[15]), ]; - pub(crate) fn is_recommended(&self) -> bool { - !matches!(self.recommended, Some(false)) - } + pub(crate) fn is_recommended(&self) -> bool { !matches!(self.recommended, Some(false)) } pub(crate) fn get_enabled_rules(&self) -> IndexSet { let mut index_set = IndexSet::new(); if let Some(rule) = self.no_array_index_key.as_ref() { @@ -2699,9 +2678,7 @@ impl Suspicious { index_set } #[doc = r" Checks if, given a rule name, matches one of the rules contained in this category"] - pub(crate) fn has_rule(rule_name: &str) -> bool { - Self::GROUP_RULES.contains(&rule_name) - } + pub(crate) fn has_rule(rule_name: &str) -> bool { Self::GROUP_RULES.contains(&rule_name) } #[doc = r" Checks if, given a rule name, it is marked as recommended"] pub(crate) fn is_recommended_rule(rule_name: &str) -> bool { Self::RECOMMENDED_RULES.contains(&rule_name) diff --git a/npm/backend-jsonrpc/src/workspace.ts b/npm/backend-jsonrpc/src/workspace.ts index 4a1724aceab..c204d772e22 100644 --- a/npm/backend-jsonrpc/src/workspace.ts +++ b/npm/backend-jsonrpc/src/workspace.ts @@ -885,7 +885,6 @@ export type Category = | "lint/nursery/noGlobalObjectCalls" | "lint/nursery/noPrototypeBuiltins" | "lint/nursery/noSvgWithoutTitle" - | "lint/nursery/noSelfAssignment" | "lint/nursery/noUselessCatch" | "lint/performance/noDelete" | "lint/security/noDangerouslySetInnerHtml" @@ -1165,7 +1164,7 @@ export interface RenameResult { } export interface Workspace { supportsFeature( - params: SupportsFeatureParams + params: SupportsFeatureParams, ): Promise; updateSettings(params: UpdateSettingsParams): Promise; openFile(params: OpenFileParams): Promise; @@ -1175,7 +1174,7 @@ export interface Workspace { getControlFlowGraph(params: GetControlFlowGraphParams): Promise; getFormatterIr(params: GetFormatterIRParams): Promise; pullDiagnostics( - params: PullDiagnosticsParams + params: PullDiagnosticsParams, ): Promise; pullActions(params: PullActionsParams): Promise; formatFile(params: FormatFileParams): Promise;