Skip to content

Commit 28a1178

Browse files
committed
Add error for using jsx factory pragma with fragments
1 parent f4d3143 commit 28a1178

7 files changed

+119
-2
lines changed

src/compiler/checker.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -14523,8 +14523,10 @@ namespace ts {
1452314523
function checkJsxFragment(node: JsxFragment, checkMode: CheckMode): Type {
1452414524
checkJsxOpeningLikeElementOrOpeningFragment(node.openingFragment, checkMode);
1452514525

14526-
if (compilerOptions.jsx === JsxEmit.React && compilerOptions.jsxFactory) {
14527-
error(node, Diagnostics.JSX_fragment_is_not_supported_when_using_jsxFactory);
14526+
if (compilerOptions.jsx === JsxEmit.React && (compilerOptions.jsxFactory || getSourceFileOfNode(node).pragmas.get("jsx"))) {
14527+
error(node, compilerOptions.jsxFactory
14528+
? Diagnostics.JSX_fragment_is_not_supported_when_using_jsxFactory
14529+
: Diagnostics.JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma);
1452814530
}
1452914531

1453014532
return getJsxGlobalElementType() || anyType;

src/compiler/diagnosticMessages.json

+4
Original file line numberDiff line numberDiff line change
@@ -3767,6 +3767,10 @@
37673767
"category": "Error",
37683768
"code": 17016
37693769
},
3770+
"JSX fragment is not supported when using an inline JSX factory pragma": {
3771+
"category": "Error",
3772+
"code": 17017
3773+
},
37703774

37713775
"Circularity detected while resolving configuration: {0}": {
37723776
"category": "Error",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
tests/cases/conformance/jsx/inline/index.tsx(3,1): error TS17017: JSX fragment is not supported when using an inline JSX factory pragma
2+
3+
4+
==== tests/cases/conformance/jsx/inline/renderer.d.ts (0 errors) ====
5+
declare global {
6+
namespace JSX {
7+
interface IntrinsicElements {
8+
[e: string]: any;
9+
}
10+
}
11+
}
12+
export function dom(): void;
13+
==== tests/cases/conformance/jsx/inline/index.tsx (1 errors) ====
14+
/** @jsx dom */
15+
import { dom } from "./renderer";
16+
<><h></h></>
17+
~~~~~~~~~~~~
18+
!!! error TS17017: JSX fragment is not supported when using an inline JSX factory pragma
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [tests/cases/conformance/jsx/inline/inlineJsxFactoryWithFragmentIsError.tsx] ////
2+
3+
//// [renderer.d.ts]
4+
declare global {
5+
namespace JSX {
6+
interface IntrinsicElements {
7+
[e: string]: any;
8+
}
9+
}
10+
}
11+
export function dom(): void;
12+
//// [index.tsx]
13+
/** @jsx dom */
14+
import { dom } from "./renderer";
15+
<><h></h></>
16+
17+
//// [index.js]
18+
"use strict";
19+
exports.__esModule = true;
20+
/** @jsx dom */
21+
var renderer_1 = require("./renderer");
22+
renderer_1.dom(React.Fragment, null,
23+
renderer_1.dom("h", null));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
2+
declare global {
3+
>global : Symbol(global, Decl(renderer.d.ts, 0, 0))
4+
5+
namespace JSX {
6+
>JSX : Symbol(JSX, Decl(renderer.d.ts, 0, 16))
7+
8+
interface IntrinsicElements {
9+
>IntrinsicElements : Symbol(IntrinsicElements, Decl(renderer.d.ts, 1, 19))
10+
11+
[e: string]: any;
12+
>e : Symbol(e, Decl(renderer.d.ts, 3, 13))
13+
}
14+
}
15+
}
16+
export function dom(): void;
17+
>dom : Symbol(dom, Decl(renderer.d.ts, 6, 1))
18+
19+
=== tests/cases/conformance/jsx/inline/index.tsx ===
20+
/** @jsx dom */
21+
import { dom } from "./renderer";
22+
>dom : Symbol(dom, Decl(index.tsx, 1, 8))
23+
24+
<><h></h></>
25+
>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
26+
>h : Symbol(JSX.IntrinsicElements, Decl(renderer.d.ts, 1, 19))
27+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
=== tests/cases/conformance/jsx/inline/renderer.d.ts ===
2+
declare global {
3+
>global : any
4+
5+
namespace JSX {
6+
>JSX : any
7+
8+
interface IntrinsicElements {
9+
>IntrinsicElements : IntrinsicElements
10+
11+
[e: string]: any;
12+
>e : string
13+
}
14+
}
15+
}
16+
export function dom(): void;
17+
>dom : () => void
18+
19+
=== tests/cases/conformance/jsx/inline/index.tsx ===
20+
/** @jsx dom */
21+
import { dom } from "./renderer";
22+
>dom : () => void
23+
24+
<><h></h></>
25+
><><h></h></> : any
26+
><h></h> : any
27+
>h : any
28+
>h : any
29+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @jsx: react
2+
// @filename: renderer.d.ts
3+
declare global {
4+
namespace JSX {
5+
interface IntrinsicElements {
6+
[e: string]: any;
7+
}
8+
}
9+
}
10+
export function dom(): void;
11+
// @filename: index.tsx
12+
/** @jsx dom */
13+
import { dom } from "./renderer";
14+
<><h></h></>

0 commit comments

Comments
 (0)