Skip to content

Commit

Permalink
fix: noUndeclaredVariables no longer errors on this in JSX tags (…
Browse files Browse the repository at this point in the history
…attempt 2)
  • Loading branch information
printfn committed Apr 30, 2024
1 parent a3e81bf commit 9df96ee
Show file tree
Hide file tree
Showing 10 changed files with 131 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,9 @@ impl Rule for NoUselessFragments {
AnyJsxElementName::JsxReferenceIdentifier(identifier) => {
jsx_reference_identifier_is_fragment(&identifier, model)?
}
AnyJsxElementName::JsxName(_) | AnyJsxElementName::JsxNamespaceName(_) => false,
AnyJsxElementName::JsThisExpression(_)
| AnyJsxElementName::JsxName(_)
| AnyJsxElementName::JsxNamespaceName(_) => false,
};

if is_valid_react_fragment {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ impl Rule for UseFragmentSyntax {
AnyJsxElementName::JsxReferenceIdentifier(identifier) => {
jsx_reference_identifier_is_fragment(&identifier, model)?
}
AnyJsxElementName::JsxName(_) | AnyJsxElementName::JsxNamespaceName(_) => false,
AnyJsxElementName::JsThisExpression(_)
| AnyJsxElementName::JsxName(_)
| AnyJsxElementName::JsxNamespaceName(_) => false,
};

if maybe_invalid && opening_element.attributes().is_empty() {
Expand Down
1 change: 1 addition & 0 deletions crates/biome_js_formatter/src/jsx/any/element_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ impl FormatRule<AnyJsxElementName> for FormatAnyJsxElementName {
type Context = JsFormatContext;
fn fmt(&self, node: &AnyJsxElementName, f: &mut JsFormatter) -> FormatResult<()> {
match node {
AnyJsxElementName::JsThisExpression(node) => node.format().fmt(f),
AnyJsxElementName::JsxMemberName(node) => node.format().fmt(f),
AnyJsxElementName::JsxName(node) => node.format().fmt(f),
AnyJsxElementName::JsxNamespaceName(node) => node.format().fmt(f),
Expand Down
1 change: 1 addition & 0 deletions crates/biome_js_formatter/src/jsx/any/object_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ impl FormatRule<AnyJsxObjectName> for FormatAnyJsxObjectName {
type Context = JsFormatContext;
fn fmt(&self, node: &AnyJsxObjectName, f: &mut JsFormatter) -> FormatResult<()> {
match node {
AnyJsxObjectName::JsThisExpression(node) => node.format().fmt(f),
AnyJsxObjectName::JsxMemberName(node) => node.format().fmt(f),
AnyJsxObjectName::JsxNamespaceName(node) => node.format().fmt(f),
AnyJsxObjectName::JsxReferenceIdentifier(node) => node.format().fmt(f),
Expand Down
11 changes: 8 additions & 3 deletions crates/biome_js_parser/src/syntax/jsx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -402,16 +402,15 @@ fn parse_jsx_expression_child(p: &mut JsParser) -> ParsedSyntax {
// <a.b.c.d></a.b.c.d>;
// <a-b.c></a-b.c>;
// <Abcd></Abcd>;
// <this.foo></this.foo>;
//
// test_err jsx jsx_namespace_member_element_name
// <namespace:a></namespace:a>;
// <namespace:a.b></namespace:a.b>;
fn parse_jsx_any_element_name(p: &mut JsParser) -> ParsedSyntax {
let name = parse_jsx_name_or_namespace(p);
name.map(|mut name| {
if name.kind(p) == JSX_NAME && name.text(p) == "this" {
name.change_kind(p, JS_THIS_EXPRESSION)
} else if name.kind(p) == JSX_NAME && (p.at(T![.]) || !is_intrinsic_element(name.text(p))) {
if name.kind(p) == JSX_NAME && (p.at(T![.]) || !is_intrinsic_element(name.text(p))) {
name.change_kind(p, JSX_REFERENCE_IDENTIFIER)
} else if name.kind(p) == JSX_NAMESPACE_NAME && p.at(T![.]) {
let error = p.err_builder(
Expand Down Expand Up @@ -467,6 +466,12 @@ fn parse_jsx_name_or_namespace(p: &mut JsParser) -> ParsedSyntax {
}

fn parse_jsx_name(p: &mut JsParser) -> ParsedSyntax {
if p.at(THIS_KW) {
let name = p.start();
p.bump(THIS_KW);
return Present(name.complete(p, JS_THIS_EXPRESSION));
}

p.re_lex(JsReLexContext::JsxIdentifier);

if p.at(JSX_IDENT) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<a.b.c.d></a.b.c.d>;
<a-b.c></a-b.c>;
<Abcd></Abcd>;
<this.foo></this.foo>;
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,52 @@ JsModule {
},
semicolon_token: SEMICOLON@51..52 ";" [] [],
},
JsExpressionStatement {
expression: JsxTagExpression {
tag: JsxElement {
opening_element: JsxOpeningElement {
l_angle_token: L_ANGLE@52..54 "<" [Newline("\n")] [],
name: JsxMemberName {
object: JsThisExpression {
this_token: THIS_KW@54..58 "this" [] [],
},
dot_token: DOT@58..59 "." [] [],
member: JsName {
value_token: IDENT@59..62 "foo" [] [],
},
},
type_arguments: missing (optional),
attributes: JsxAttributeList [],
r_angle_token: R_ANGLE@62..63 ">" [] [],
},
children: JsxChildList [],
closing_element: JsxClosingElement {
l_angle_token: L_ANGLE@63..64 "<" [] [],
slash_token: SLASH@64..65 "/" [] [],
name: JsxMemberName {
object: JsThisExpression {
this_token: THIS_KW@65..69 "this" [] [],
},
dot_token: DOT@69..70 "." [] [],
member: JsName {
value_token: IDENT@70..73 "foo" [] [],
},
},
r_angle_token: R_ANGLE@73..74 ">" [] [],
},
},
},
semicolon_token: SEMICOLON@74..75 ";" [] [],
},
],
eof_token: EOF@52..53 "" [Newline("\n")] [],
eof_token: EOF@75..76 "" [Newline("\n")] [],
}

0: JS_MODULE@0..53
0: JS_MODULE@0..76
0: (empty)
1: (empty)
2: JS_DIRECTIVE_LIST@0..0
3: JS_MODULE_ITEM_LIST@0..52
3: JS_MODULE_ITEM_LIST@0..75
0: JS_EXPRESSION_STATEMENT@0..20
0: JSX_TAG_EXPRESSION@0..19
0: JSX_ELEMENT@0..19
Expand Down Expand Up @@ -221,4 +258,30 @@ JsModule {
0: JSX_IDENT@46..50 "Abcd" [] []
3: R_ANGLE@50..51 ">" [] []
1: SEMICOLON@51..52 ";" [] []
4: EOF@52..53 "" [Newline("\n")] []
3: JS_EXPRESSION_STATEMENT@52..75
0: JSX_TAG_EXPRESSION@52..74
0: JSX_ELEMENT@52..74
0: JSX_OPENING_ELEMENT@52..63
0: L_ANGLE@52..54 "<" [Newline("\n")] []
1: JSX_MEMBER_NAME@54..62
0: JS_THIS_EXPRESSION@54..58
0: THIS_KW@54..58 "this" [] []
1: DOT@58..59 "." [] []
2: JS_NAME@59..62
0: IDENT@59..62 "foo" [] []
2: (empty)
3: JSX_ATTRIBUTE_LIST@62..62
4: R_ANGLE@62..63 ">" [] []
1: JSX_CHILD_LIST@63..63
2: JSX_CLOSING_ELEMENT@63..74
0: L_ANGLE@63..64 "<" [] []
1: SLASH@64..65 "/" [] []
2: JSX_MEMBER_NAME@65..73
0: JS_THIS_EXPRESSION@65..69
0: THIS_KW@65..69 "this" [] []
1: DOT@69..70 "." [] []
2: JS_NAME@70..73
0: IDENT@70..73 "foo" [] []
3: R_ANGLE@73..74 ">" [] []
1: SEMICOLON@74..75 ";" [] []
4: EOF@75..76 "" [Newline("\n")] []
48 changes: 44 additions & 4 deletions crates/biome_js_syntax/src/generated/nodes.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/biome_js_syntax/src/jsx_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,7 @@ impl AnyJsxElementName {
AnyJsxElementName::JsxName(name) => name.value_token().ok(),
AnyJsxElementName::JsxNamespaceName(name) => name.name().ok()?.value_token().ok(),
AnyJsxElementName::JsxReferenceIdentifier(name) => name.value_token().ok(),
AnyJsxElementName::JsThisExpression(name) => name.this_token().ok(),
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions xtask/codegen/js.ungram
Original file line number Diff line number Diff line change
Expand Up @@ -2294,12 +2294,14 @@ JsxNamespaceName =

AnyJsxElementName =
JsxName
| JsThisExpression
| JsxReferenceIdentifier
| JsxMemberName
| JsxNamespaceName

AnyJsxObjectName =
JsxReferenceIdentifier
| JsThisExpression
| JsxMemberName
| JsxNamespaceName

Expand Down

0 comments on commit 9df96ee

Please sign in to comment.