mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-30 11:24:49 -05:00
Fix crash on attempting to suggest a ts import for a synthetic js resolution
This commit is contained in:
@@ -1091,6 +1091,16 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
function errorOrSuggestion(isError: boolean, location: Node, message: DiagnosticMessage | DiagnosticMessageChain, arg0?: string | number, arg1?: string | number, arg2?: string | number, arg3?: string | number): void {
|
||||
if (location.pos < 0 || location.end < 0) {
|
||||
// Psuedo-synthesized input node
|
||||
if (!isError) {
|
||||
return; // Drop suggestions (we have no span to suggest on)
|
||||
}
|
||||
// Issue errors globally
|
||||
const file = getSourceFileOfNode(location);
|
||||
addErrorOrSuggestion(isError, "message" in message ? createFileDiagnostic(file, 0, 0, message, arg0, arg1, arg2, arg3) : createDiagnosticForFileFromMessageChain(file, message)); // eslint-disable-line no-in-operator
|
||||
return;
|
||||
}
|
||||
addErrorOrSuggestion(isError, "message" in message ? createDiagnosticForNode(location, message, arg0, arg1, arg2, arg3) : createDiagnosticForNodeFromMessageChain(location, message)); // eslint-disable-line no-in-operator
|
||||
}
|
||||
|
||||
|
||||
@@ -989,6 +989,18 @@ namespace ts {
|
||||
};
|
||||
}
|
||||
|
||||
export function createDiagnosticForFileFromMessageChain(sourceFile: SourceFile, messageChain: DiagnosticMessageChain, relatedInformation?: DiagnosticRelatedInformation[]): DiagnosticWithLocation {
|
||||
return {
|
||||
file: sourceFile,
|
||||
start: 0,
|
||||
length: 0,
|
||||
code: messageChain.code,
|
||||
category: messageChain.category,
|
||||
messageText: messageChain.next ? messageChain : messageChain.messageText,
|
||||
relatedInformation
|
||||
};
|
||||
}
|
||||
|
||||
export function createDiagnosticForRange(sourceFile: SourceFile, range: TextRange, message: DiagnosticMessage): DiagnosticWithLocation {
|
||||
return {
|
||||
file: sourceFile,
|
||||
|
||||
@@ -235,5 +235,42 @@ const a: string = 10;`, "utf-8"),
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const jsxLibraryContent = `
|
||||
export {};
|
||||
declare global {
|
||||
namespace JSX {
|
||||
interface Element {}
|
||||
interface IntrinsicElements {
|
||||
div: {
|
||||
propA?: boolean;
|
||||
};
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
verifyTsc({
|
||||
scenario: "react-jsx-emit-mode",
|
||||
subScenario: "with no backing types found doesn't crash",
|
||||
fs: () => loadProjectFromFiles({
|
||||
"/src/project/node_modules/react/jsx-runtime.js": "export {}", // js needs to be present so there's a resolution result
|
||||
"/src/project/node_modules/@types/react/index.d.ts": jsxLibraryContent, // doesn't contain a jsx-runtime definition
|
||||
"/src/project/src/index.tsx": `export const App = () => <div propA={true}></div>;`,
|
||||
"/src/project/tsconfig.json": JSON.stringify({ compilerOptions: { module: "commonjs", jsx: "react-jsx", incremental: true, jsxImportSource: "react" } })
|
||||
}),
|
||||
commandLineArgs: ["--p", "src/project"]
|
||||
});
|
||||
|
||||
verifyTsc({
|
||||
scenario: "react-jsx-emit-mode",
|
||||
subScenario: "with no backing types found doesn't crash under --strict",
|
||||
fs: () => loadProjectFromFiles({
|
||||
"/src/project/node_modules/react/jsx-runtime.js": "export {}", // js needs to be present so there's a resolution result
|
||||
"/src/project/node_modules/@types/react/index.d.ts": jsxLibraryContent, // doesn't contain a jsx-runtime definition
|
||||
"/src/project/src/index.tsx": `export const App = () => <div propA={true}></div>;`,
|
||||
"/src/project/tsconfig.json": JSON.stringify({ compilerOptions: { module: "commonjs", jsx: "react-jsx", incremental: true, jsxImportSource: "react" } })
|
||||
}),
|
||||
commandLineArgs: ["--p", "src/project", "--strict"]
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user