From 824668f9299403e74f4256fc3226760c5e4f5de6 Mon Sep 17 00:00:00 2001 From: Victorien Elvinger Date: Wed, 17 May 2023 15:44:58 +0200 Subject: [PATCH] fix(rome_js_analyze): noInvalidConstructorSuper recognize extends mod.Member --- CHANGELOG.md | 1 + .../correctness/no_invalid_constructor_super.rs | 10 +++------- .../correctness/noInvalidConstructorSuper/valid.js | 6 ++++++ .../noInvalidConstructorSuper/valid.js.snap | 7 +++++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78ab4901a5d..98f9eee46c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ #### Other changes - `noInnerDeclarations`: allow function declarations in nested block inside an _ES module_ [#4492](https://github.com/rome/tools/compare/main...Conaclos:noInnerDeclarations/4492?expand=1). +- `noInvalidConstructorSuper`: recognize `extends` clauses that use static member access such as `extends mod.C` [#4499](https://github.com/rome/tools/issues/4499) ## Parser ## VSCode diff --git a/crates/rome_js_analyze/src/analyzers/correctness/no_invalid_constructor_super.rs b/crates/rome_js_analyze/src/analyzers/correctness/no_invalid_constructor_super.rs index b477bc0293b..d3c97c45caf 100644 --- a/crates/rome_js_analyze/src/analyzers/correctness/no_invalid_constructor_super.rs +++ b/crates/rome_js_analyze/src/analyzers/correctness/no_invalid_constructor_super.rs @@ -80,6 +80,7 @@ impl NoInvalidConstructorSuperState { } } } + fn detail(&self) -> Option<(&TextRange, MarkupBuf)> { match self { NoInvalidConstructorSuperState::BadExtends { extends_range, .. } => Some(( @@ -150,7 +151,7 @@ impl Rule for NoInvalidConstructorSuper { } fn is_valid_constructor(expression: AnyJsExpression) -> Option { - match expression { + match expression.omit_parentheses() { AnyJsExpression::JsThisExpression(_) | AnyJsExpression::JsFunctionExpression(_) | AnyJsExpression::JsCallExpression(_) @@ -159,6 +160,7 @@ fn is_valid_constructor(expression: AnyJsExpression) -> Option { | AnyJsExpression::JsYieldExpression(_) | AnyJsExpression::JsNewExpression(_) | AnyJsExpression::JsNewTargetExpression(_) + | AnyJsExpression::JsStaticMemberExpression(_) | AnyJsExpression::JsClassExpression(_) => Some(true), AnyJsExpression::JsIdentifierExpression(identifier) => { let name = identifier.name().ok()?; @@ -176,16 +178,13 @@ fn is_valid_constructor(expression: AnyJsExpression) -> Option { ) { return is_valid_constructor(assignment.right().ok()?); } - Some(false) } - AnyJsExpression::JsLogicalExpression(expression) => { let operator = expression.operator().ok()?; if matches!(operator, JsLogicalOperator::LogicalAnd) { return is_valid_constructor(expression.right().ok()?); } - is_valid_constructor(expression.left().ok()?) .or_else(|| is_valid_constructor(expression.right().ok()?)) } @@ -196,9 +195,6 @@ fn is_valid_constructor(expression: AnyJsExpression) -> Option { AnyJsExpression::JsSequenceExpression(sequence_expression) => { is_valid_constructor(sequence_expression.right().ok()?) } - AnyJsExpression::JsParenthesizedExpression(expression) => { - is_valid_constructor(expression.expression().ok()?) - } _ => Some(false), } } diff --git a/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js b/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js index f1d4fca84e5..c2c83fccee3 100644 --- a/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js +++ b/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js @@ -35,3 +35,9 @@ export default class A extends B { super(); } } + +export class A extends mod.B { + constructor() { + super(); + } +} diff --git a/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js.snap b/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js.snap index e915a04363f..48d8a151509 100644 --- a/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js.snap +++ b/crates/rome_js_analyze/tests/specs/correctness/noInvalidConstructorSuper/valid.js.snap @@ -1,5 +1,6 @@ --- source: crates/rome_js_analyze/tests/spec_tests.rs +assertion_line: 96 expression: valid.js --- # Input @@ -42,6 +43,12 @@ export default class A extends B { } } +export class A extends mod.B { + constructor() { + super(); + } +} + ```