Skip to content

Commit 96410eb

Browse files
authored
fix missing react error with fragments in react-native (#60615)
1 parent ee0e08b commit 96410eb

8 files changed

+123
-3
lines changed

src/compiler/checker.ts

+21-3
Original file line numberDiff line numberDiff line change
@@ -30018,7 +30018,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3001830018
// #38720/60122, allow null as jsxFragmentFactory
3001930019
let jsxFactorySym: Symbol | undefined;
3002030020
if (!(isJsxOpeningFragment(node) && jsxFactoryNamespace === "null")) {
30021-
jsxFactorySym = resolveName(jsxFactoryLocation, jsxFactoryNamespace, compilerOptions.jsx === JsxEmit.Preserve ? SymbolFlags.Value & ~SymbolFlags.Enum : SymbolFlags.Value, jsxFactoryRefErr, /*isUse*/ true);
30021+
jsxFactorySym = resolveName(
30022+
jsxFactoryLocation,
30023+
jsxFactoryNamespace,
30024+
(compilerOptions.jsx === JsxEmit.Preserve || compilerOptions.jsx === JsxEmit.ReactNative) ? SymbolFlags.Value & ~SymbolFlags.Enum : SymbolFlags.Value,
30025+
jsxFactoryRefErr,
30026+
/*isUse*/ true,
30027+
);
3002230028
}
3002330029

3002430030
if (jsxFactorySym) {
@@ -30037,7 +30043,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3003730043
const file = getSourceFileOfNode(node);
3003830044
const localJsxNamespace = getLocalJsxNamespace(file);
3003930045
if (localJsxNamespace) {
30040-
resolveName(jsxFactoryLocation, localJsxNamespace, compilerOptions.jsx === JsxEmit.Preserve ? SymbolFlags.Value & ~SymbolFlags.Enum : SymbolFlags.Value, jsxFactoryRefErr, /*isUse*/ true);
30046+
resolveName(
30047+
jsxFactoryLocation,
30048+
localJsxNamespace,
30049+
(compilerOptions.jsx === JsxEmit.Preserve || compilerOptions.jsx === JsxEmit.ReactNative) ? SymbolFlags.Value & ~SymbolFlags.Enum : SymbolFlags.Value,
30050+
jsxFactoryRefErr,
30051+
/*isUse*/ true,
30052+
);
3004130053
}
3004230054
}
3004330055
}
@@ -36825,7 +36837,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3682536837

3682636838
const jsxFactoryRefErr = diagnostics ? Diagnostics.Using_JSX_fragments_requires_fragment_factory_0_to_be_in_scope_but_it_could_not_be_found : undefined;
3682736839
const jsxFactorySymbol = getJsxNamespaceContainerForImplicitImport(node) ??
36828-
resolveName(node, jsxFragmentFactoryName, compilerOptions.jsx === JsxEmit.Preserve ? SymbolFlags.Value & ~SymbolFlags.Enum : SymbolFlags.Value, /*nameNotFoundMessage*/ jsxFactoryRefErr, /*isUse*/ true);
36840+
resolveName(
36841+
node,
36842+
jsxFragmentFactoryName,
36843+
(compilerOptions.jsx === JsxEmit.Preserve || compilerOptions.jsx === JsxEmit.ReactNative) ? SymbolFlags.Value & ~SymbolFlags.Enum : SymbolFlags.Value,
36844+
/*nameNotFoundMessage*/ jsxFactoryRefErr,
36845+
/*isUse*/ true,
36846+
);
3682936847

3683036848
if (jsxFactorySymbol === undefined) return sourceFileLinks.jsxFragmentType = errorType;
3683136849
if (jsxFactorySymbol.escapedName === ReactNames.Fragment) return sourceFileLinks.jsxFragmentType = getTypeOfSymbol(jsxFactorySymbol);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/compiler/jsxFragReactReferenceErrors.tsx] ////
2+
3+
//// [jsxFragReactReferenceErrors.tsx]
4+
/// <reference path="/.lib/react18/react18.d.ts" />
5+
/// <reference path="/.lib/react18/global.d.ts" />
6+
export function Component(){
7+
8+
return <>
9+
</>
10+
}
11+
12+
//// [jsxFragReactReferenceErrors.jsx]
13+
/// <reference path="react18/react18.d.ts" />
14+
/// <reference path="react18/global.d.ts" />
15+
export function Component() {
16+
return <>
17+
</>;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [tests/cases/compiler/jsxFragReactReferenceErrors.tsx] ////
2+
3+
=== jsxFragReactReferenceErrors.tsx ===
4+
/// <reference path="react18/react18.d.ts" />
5+
/// <reference path="react18/global.d.ts" />
6+
export function Component(){
7+
>Component : Symbol(Component, Decl(jsxFragReactReferenceErrors.tsx, 0, 0))
8+
9+
return <>
10+
</>
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/jsxFragReactReferenceErrors.tsx] ////
2+
3+
=== jsxFragReactReferenceErrors.tsx ===
4+
/// <reference path="react18/react18.d.ts" />
5+
/// <reference path="react18/global.d.ts" />
6+
export function Component(){
7+
>Component : () => JSX.Element
8+
> : ^^^^^^^^^^^^^^^^^
9+
10+
return <>
11+
><> </> : JSX.Element
12+
> : ^^^^^^^^^^^
13+
14+
</>
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/compiler/jsxFragReactReferenceErrors.tsx] ////
2+
3+
//// [jsxFragReactReferenceErrors.tsx]
4+
/// <reference path="/.lib/react18/react18.d.ts" />
5+
/// <reference path="/.lib/react18/global.d.ts" />
6+
export function Component(){
7+
8+
return <>
9+
</>
10+
}
11+
12+
//// [jsxFragReactReferenceErrors.js]
13+
/// <reference path="react18/react18.d.ts" />
14+
/// <reference path="react18/global.d.ts" />
15+
export function Component() {
16+
return <>
17+
</>;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [tests/cases/compiler/jsxFragReactReferenceErrors.tsx] ////
2+
3+
=== jsxFragReactReferenceErrors.tsx ===
4+
/// <reference path="react18/react18.d.ts" />
5+
/// <reference path="react18/global.d.ts" />
6+
export function Component(){
7+
>Component : Symbol(Component, Decl(jsxFragReactReferenceErrors.tsx, 0, 0))
8+
9+
return <>
10+
</>
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/jsxFragReactReferenceErrors.tsx] ////
2+
3+
=== jsxFragReactReferenceErrors.tsx ===
4+
/// <reference path="react18/react18.d.ts" />
5+
/// <reference path="react18/global.d.ts" />
6+
export function Component(){
7+
>Component : () => JSX.Element
8+
> : ^^^^^^^^^^^^^^^^^
9+
10+
return <>
11+
><> </> : JSX.Element
12+
> : ^^^^^^^^^^^
13+
14+
</>
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @jsx: react-native, preserve
2+
// @strict: true
3+
// @skipLibCheck: true
4+
// @target: ES2017
5+
// @module: ESNext
6+
// @esModuleInterop: true
7+
8+
/// <reference path="/.lib/react18/react18.d.ts" />
9+
/// <reference path="/.lib/react18/global.d.ts" />
10+
export function Component(){
11+
12+
return <>
13+
</>
14+
}

0 commit comments

Comments
 (0)