Skip to content

Commit cff04e6

Browse files
author
Andy
authored
Ensure JsonSourceFile has all the non-optional properties of SourceFile (microsoft#26162)
* Ensure JsonSourceFile has all the non-optional properties of SourceFile * Set properties in parseSourceFile
1 parent 199d496 commit cff04e6

File tree

5 files changed

+32
-5
lines changed

5 files changed

+32
-5
lines changed

src/compiler/moduleSpecifiers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ namespace ts.moduleSpecifiers {
429429
}
430430

431431
function removeExtensionAndIndexPostFix(fileName: string, ending: Ending, options: CompilerOptions): string {
432+
if (fileExtensionIs(fileName, Extension.Json)) return fileName;
432433
const noExtension = removeFileExtension(fileName);
433434
switch (ending) {
434435
case Ending.Minimal:

src/compiler/parser.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ namespace ts {
515515
performance.mark("beforeParse");
516516
let result: SourceFile;
517517
if (languageVersion === ScriptTarget.JSON) {
518-
result = Parser.parseJsonText(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes);
518+
result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, ScriptKind.JSON);
519519
}
520520
else {
521521
result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, scriptKind);
@@ -689,8 +689,12 @@ namespace ts {
689689
if (scriptKind === ScriptKind.JSON) {
690690
const result = parseJsonText(fileName, sourceText, languageVersion, syntaxCursor, setParentNodes);
691691
convertToObjectWorker(result, result.parseDiagnostics, /*returnValue*/ false, /*knownRootOptions*/ undefined, /*jsonConversionNotifier*/ undefined);
692+
result.referencedFiles = emptyArray;
692693
result.typeReferenceDirectives = emptyArray;
694+
result.libReferenceDirectives = emptyArray;
693695
result.amdDependencies = emptyArray;
696+
result.hasNoDefaultLib = false;
697+
result.pragmas = emptyMap;
694698
return result;
695699
}
696700

@@ -7754,7 +7758,6 @@ namespace ts {
77547758
}
77557759
}
77567760

7757-
/*@internal*/
77587761
type PragmaDiagnosticReporter = (pos: number, length: number, message: DiagnosticMessage) => void;
77597762

77607763
/*@internal*/

src/compiler/types.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2632,7 +2632,7 @@ namespace ts {
26322632
/* @internal */ ambientModuleNames: ReadonlyArray<string>;
26332633
/* @internal */ checkJsDirective?: CheckJsDirective;
26342634
/* @internal */ version: string;
2635-
/* @internal */ pragmas: PragmaMap;
2635+
/* @internal */ pragmas: ReadonlyPragmaMap;
26362636
/* @internal */ localJsxNamespace?: __String;
26372637
/* @internal */ localJsxFactory?: EntityName;
26382638

@@ -5588,13 +5588,19 @@ namespace ts {
55885588
/* @internal */
55895589
export type PragmaPsuedoMapEntry = {[K in keyof PragmaPsuedoMap]: {name: K, args: PragmaPsuedoMap[K]}}[keyof PragmaPsuedoMap];
55905590

5591+
/* @internal */
5592+
export interface ReadonlyPragmaMap extends ReadonlyMap<PragmaPsuedoMap[keyof PragmaPsuedoMap] | PragmaPsuedoMap[keyof PragmaPsuedoMap][]> {
5593+
get<TKey extends keyof PragmaPsuedoMap>(key: TKey): PragmaPsuedoMap[TKey] | PragmaPsuedoMap[TKey][];
5594+
forEach(action: <TKey extends keyof PragmaPsuedoMap>(value: PragmaPsuedoMap[TKey] | PragmaPsuedoMap[TKey][], key: TKey) => void): void;
5595+
}
5596+
55915597
/**
55925598
* A strongly-typed es6 map of pragma entries, the values of which are either a single argument
55935599
* value (if only one was found), or an array of multiple argument values if the pragma is present
55945600
* in multiple places
55955601
*/
55965602
/* @internal */
5597-
export interface PragmaMap extends Map<PragmaPsuedoMap[keyof PragmaPsuedoMap] | PragmaPsuedoMap[keyof PragmaPsuedoMap][]> {
5603+
export interface PragmaMap extends Map<PragmaPsuedoMap[keyof PragmaPsuedoMap] | PragmaPsuedoMap[keyof PragmaPsuedoMap][]>, ReadonlyPragmaMap {
55985604
set<TKey extends keyof PragmaPsuedoMap>(key: TKey, value: PragmaPsuedoMap[TKey] | PragmaPsuedoMap[TKey][]): this;
55995605
get<TKey extends keyof PragmaPsuedoMap>(key: TKey): PragmaPsuedoMap[TKey] | PragmaPsuedoMap[TKey][];
56005606
forEach(action: <TKey extends keyof PragmaPsuedoMap>(value: PragmaPsuedoMap[TKey] | PragmaPsuedoMap[TKey][], key: TKey) => void): void;

src/compiler/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace ts {
1616
namespace ts {
1717
export const emptyArray: never[] = [] as never[];
1818
export const resolvingEmptyArray: never[] = [] as never[];
19-
export const emptyMap: ReadonlyMap<never> = createMap<never>();
19+
export const emptyMap = createMap<never>() as ReadonlyMap<never> & ReadonlyPragmaMap;
2020
export const emptyUnderscoreEscapedMap: ReadonlyUnderscoreEscapedMap<never> = emptyMap as ReadonlyUnderscoreEscapedMap<never>;
2121

2222
export const externalHelpersModuleNameText = "tslib";
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @resolveJsonModule: true
4+
5+
// @Filename: /a.ts
6+
////import text from "./message.json";
7+
8+
// @Filename: /message.json
9+
////{}
10+
11+
verify.getEditsForFileRename({
12+
oldPath: "/a.ts",
13+
newPath: "/src/a.ts",
14+
newFileContents: {
15+
"/a.ts": 'import text from "../message.json";',
16+
},
17+
});

0 commit comments

Comments
 (0)