From 0d98dc5605534c7fe48f36c816b89411aa04ace3 Mon Sep 17 00:00:00 2001 From: nissy-dev Date: Sun, 9 Jul 2023 23:29:27 +0900 Subject: [PATCH 1/3] fix: skip `this` reference representing the class instance --- .../correctness/no_undeclared_variables.rs | 2 ++ .../noUndeclaredVariables.ts | 13 ++++++++++++- .../noUndeclaredVariables.ts.snap | 19 ++++++++++++++++--- crates/rome_js_semantic/src/events.rs | 4 ++++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs b/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs index 6df9e33da28..56b84e6fb2c 100644 --- a/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs +++ b/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs @@ -48,7 +48,9 @@ impl Rule for NoUndeclaredVariables { ctx.query() .all_unresolved_references() .filter_map(|reference| { + // dbg!(&reference); let identifier = reference.tree(); + dbg!(&identifier); let under_as_expression = identifier .parent::() .and_then(|ty| ty.parent::()) diff --git a/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts b/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts index 353e59722e2..97ab9fda490 100644 --- a/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts +++ b/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts @@ -11,5 +11,16 @@ export type WhateverDefault = `Hello ${S}` // Const assertions are valid const fruits = ["banana"] as const; +class X { + f() { + this.g; + type T1 = typeof this.g; + type T2 = X['g']; + } + + g() { + } +} + // Invalid -export type Invalid = `Hello ${T}` \ No newline at end of file +export type Invalid = `Hello ${T}` diff --git a/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap b/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap index 832a398abe2..b0621477a65 100644 --- a/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap +++ b/crates/rome_js_analyze/tests/specs/correctness/noUndeclaredVariables/noUndeclaredVariables.ts.snap @@ -17,19 +17,32 @@ export type WhateverDefault = `Hello ${S}` // Const assertions are valid const fruits = ["banana"] as const; +class X { + f() { + this.g; + type T1 = typeof this.g; + type T2 = X['g']; + } + + g() { + } +} + // Invalid export type Invalid = `Hello ${T}` + ``` # Diagnostics ``` -noUndeclaredVariables.ts:15:50 lint/correctness/noUndeclaredVariables ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +noUndeclaredVariables.ts:26:50 lint/correctness/noUndeclaredVariables ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! The T variable is undeclared - 14 │ // Invalid - > 15 │ export type Invalid = `Hello ${T}` + 25 │ // Invalid + > 26 │ export type Invalid = `Hello ${T}` │ ^ + 27 │ ``` diff --git a/crates/rome_js_semantic/src/events.rs b/crates/rome_js_semantic/src/events.rs index b3700a4f197..b410cdefe2c 100644 --- a/crates/rome_js_semantic/src/events.rs +++ b/crates/rome_js_semantic/src/events.rs @@ -479,6 +479,10 @@ impl SemanticEventExtractor { // SAFETY: kind check above let reference = JsReferenceIdentifier::unwrap_cast(node.clone()); let name_token = reference.value_token().ok()?; + // skip `this` reference representing the class instance + if name_token.token_text_trimmed() == "this" { + return None; + } ( name_token.token_text_trimmed(), self.is_js_reference_identifier_exported(node), From b144b4a35e5173ca81b2dd0385a2d2e0891afd3a Mon Sep 17 00:00:00 2001 From: nissy-dev Date: Mon, 10 Jul 2023 13:51:45 +0900 Subject: [PATCH 2/3] fix: remove debug codes --- .../semantic_analyzers/correctness/no_undeclared_variables.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs b/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs index 56b84e6fb2c..6df9e33da28 100644 --- a/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs +++ b/crates/rome_js_analyze/src/semantic_analyzers/correctness/no_undeclared_variables.rs @@ -48,9 +48,7 @@ impl Rule for NoUndeclaredVariables { ctx.query() .all_unresolved_references() .filter_map(|reference| { - // dbg!(&reference); let identifier = reference.tree(); - dbg!(&identifier); let under_as_expression = identifier .parent::() .and_then(|ty| ty.parent::()) From 63056edbd9b21a26e5285824324d8a72dd4e1a98 Mon Sep 17 00:00:00 2001 From: nissy-dev Date: Mon, 10 Jul 2023 17:56:40 +0900 Subject: [PATCH 3/3] docs: update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5fdcb4c30..00f9aa6c229 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -266,6 +266,10 @@ if no error diagnostics are emitted. This rule's code action emits an invalid AST, so I fixed using JsxString instead of JsStringLiteral +- Fix [noUndeclaredVariables](https://docs.rome.tools/lint/rules/noundeclaredvariables/)'s false positive diagnostics ([#4675](https://github.com/rome/tools/issues/4675)) + + The semantic analyzer no longer handles `this` reference identifier in the semantic analyzer. + ### Parser - Add support for decorators in class method parameters, example: