Skip to content

Commit 643253d

Browse files
authored
fix(es/parser): Support keywords as JSX member expression properties (#10701)
**Related issue:** - Closes #10698
1 parent 636d7a3 commit 643253d

File tree

7 files changed

+668
-1
lines changed

7 files changed

+668
-1
lines changed

.changeset/long-parrots-love.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
swc_ecma_parser: patch
3+
swc_core: patch
4+
---
5+
6+
fix(es/parser): Support keywords as JSX member expression properties
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "ecmascript",
5+
"jsx": true
6+
},
7+
"transform": {
8+
"react": {
9+
"runtime": "automatic",
10+
"throwIfNamespace": false
11+
}
12+
}
13+
}
14+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const render = () => {
2+
return <widget.component.type />;
3+
};
4+
5+
const foo = () => {
6+
return (
7+
<widget.string>
8+
<Foo.interface />
9+
</widget.string>
10+
);
11+
};
12+
13+
const bar = () => {
14+
return <widget:number></widget:number>;
15+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var _require = require("react/jsx-runtime"), _jsx = _require.jsx;
2+
var render = function() {
3+
return /*#__PURE__*/ _jsx(widget.component.type, {});
4+
};
5+
var foo = function() {
6+
return /*#__PURE__*/ _jsx(widget.string, {
7+
children: /*#__PURE__*/ _jsx(Foo.interface, {})
8+
});
9+
};
10+
var bar = function() {
11+
return /*#__PURE__*/ _jsx("widget:number", {});
12+
};

crates/swc_ecma_parser/src/parser/jsx/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use swc_ecma_lexer::{
88
buffer::Buffer,
99
expr::{parse_assignment_expr, parse_str_lit},
1010
get_qualified_jsx_name,
11+
ident::parse_ident_name,
1112
jsx::{
1213
jsx_expr_container_to_jsx_attr_value, parse_jsx_expr_container,
1314
parse_jsx_spread_child,
@@ -84,7 +85,7 @@ impl<I: Tokens> Parser<I> {
8485
};
8586
while self.input_mut().eat(&Token::Dot) {
8687
let _ = self.input_mut().cur();
87-
let prop: IdentName = self.parse_jsx_ident()?.into();
88+
let prop: IdentName = parse_ident_name(self)?;
8889
let new_node = JSXElementName::JSXMemberExpr(JSXMemberExpr {
8990
span: self.span(start),
9091
obj: match node {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<widget.component.type />;
2+
3+
<widget.string>
4+
<Foo.interface />
5+
</widget.string>;
6+
7+
<widget:number></widget:number>;
8+
9+
<a-b.type />;
10+
<a-type.c />;
11+
<a-type.type />;
12+
<type-type.type />;
13+
<type-b.type />;
14+
<type-type.c />;

0 commit comments

Comments
 (0)