Skip to content

Commit a303bf0

Browse files
committed
Merge remote-tracking branch 'upstream/master'
* upstream/master: (48 commits) Fix merging of JS value & TS type decl LEGO: check in for master to temporary branch. `getSymbolDisplayPartsDocumentationAndSymbolKind`: use actual `symbol.flags` for `getAliasedSymbol` LEGO: check in for master to temporary branch. LEGO: check in for master to temporary branch. Fix two tests Update user baselines LEGO: check in for master to temporary branch. address PR comments Emit build info even on noEmitOnError or tsc --build (microsoft#38853) Some changes to tsc baselines for clarity (microsoft#38850) LEGO: check in for master to temporary branch. fix merge conflicts polish tests remove outdated tests convert import trigger reason test convert import trigger reason only convert export trigger reason test convert export cursor only changes remove declaration ...
2 parents 59a3320 + 4ee013d commit a303bf0

File tree

511 files changed

+32543
-13742
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

511 files changed

+32543
-13742
lines changed

src/compiler/builder.ts

+42-13
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ namespace ts {
148148
/**
149149
* true if build info is emitted
150150
*/
151-
emittedBuildInfo?: boolean;
151+
buildInfoEmitPending: boolean;
152152
/**
153153
* Already seen emitted files
154154
*/
@@ -173,7 +173,7 @@ namespace ts {
173173
const compilerOptions = newProgram.getCompilerOptions();
174174
state.compilerOptions = compilerOptions;
175175
// With --out or --outFile, any change affects all semantic diagnostics so no need to cache them
176-
if (!compilerOptions.outFile && !compilerOptions.out) {
176+
if (!outFile(compilerOptions)) {
177177
state.semanticDiagnosticsPerFile = createMap<readonly Diagnostic[]>();
178178
}
179179
state.changedFilesSet = createMap<true>();
@@ -197,7 +197,7 @@ namespace ts {
197197
if (changedFilesSet) {
198198
copyEntries(changedFilesSet, state.changedFilesSet);
199199
}
200-
if (!compilerOptions.outFile && !compilerOptions.out && oldState!.affectedFilesPendingEmit) {
200+
if (!outFile(compilerOptions) && oldState!.affectedFilesPendingEmit) {
201201
state.affectedFilesPendingEmit = oldState!.affectedFilesPendingEmit.slice();
202202
state.affectedFilesPendingEmitKind = cloneMapOrUndefined(oldState!.affectedFilesPendingEmitKind);
203203
state.affectedFilesPendingEmitIndex = oldState!.affectedFilesPendingEmitIndex;
@@ -250,14 +250,14 @@ namespace ts {
250250
BuilderState.getAllFilesExcludingDefaultLibraryFile(state, newProgram, /*firstSourceFile*/ undefined)
251251
.forEach(file => state.changedFilesSet.set(file.resolvedPath, true));
252252
}
253-
else if (oldCompilerOptions && compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions)) {
253+
else if (oldCompilerOptions && !outFile(compilerOptions) && compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions)) {
254254
// Add all files to affectedFilesPendingEmit since emit changed
255255
newProgram.getSourceFiles().forEach(f => addToAffectedFilesPendingEmit(state, f.resolvedPath, BuilderFileEmit.Full));
256256
Debug.assert(!state.seenAffectedFiles || !state.seenAffectedFiles.size);
257257
state.seenAffectedFiles = state.seenAffectedFiles || createMap<true>();
258258
}
259259

260-
state.emittedBuildInfo = !state.changedFilesSet.size && !state.affectedFilesPendingEmit;
260+
state.buildInfoEmitPending = !!state.changedFilesSet.size;
261261
return state;
262262
}
263263

@@ -374,7 +374,7 @@ namespace ts {
374374
// so operations are performed directly on program, return program
375375
const program = Debug.checkDefined(state.program);
376376
const compilerOptions = program.getCompilerOptions();
377-
if (compilerOptions.outFile || compilerOptions.out) {
377+
if (outFile(compilerOptions)) {
378378
Debug.assert(!state.semanticDiagnosticsPerFile);
379379
return program;
380380
}
@@ -611,7 +611,7 @@ namespace ts {
611611
isBuildInfoEmit?: boolean
612612
) {
613613
if (isBuildInfoEmit) {
614-
state.emittedBuildInfo = true;
614+
state.buildInfoEmitPending = false;
615615
}
616616
else if (affected === state.program) {
617617
state.changedFilesSet.clear();
@@ -624,6 +624,7 @@ namespace ts {
624624
}
625625
if (isPendingEmit) {
626626
state.affectedFilesPendingEmitIndex!++;
627+
state.buildInfoEmitPending = true;
627628
}
628629
else {
629630
state.affectedFilesIndex!++;
@@ -688,19 +689,21 @@ namespace ts {
688689
}
689690

690691
export type ProgramBuildInfoDiagnostic = string | [string, readonly ReusableDiagnostic[]];
692+
export type ProgramBuilderInfoFilePendingEmit = [string, BuilderFileEmit];
691693
export interface ProgramBuildInfo {
692694
fileInfos: MapLike<BuilderState.FileInfo>;
693695
options: CompilerOptions;
694696
referencedMap?: MapLike<string[]>;
695697
exportedModulesMap?: MapLike<string[]>;
696698
semanticDiagnosticsPerFile?: ProgramBuildInfoDiagnostic[];
699+
affectedFilesPendingEmit?: ProgramBuilderInfoFilePendingEmit[];
697700
}
698701

699702
/**
700703
* Gets the program information to be emitted in buildInfo so that we can use it to create new program
701704
*/
702705
function getProgramBuildInfo(state: Readonly<ReusableBuilderProgramState>, getCanonicalFileName: GetCanonicalFileName): ProgramBuildInfo | undefined {
703-
if (state.compilerOptions.outFile || state.compilerOptions.out) return undefined;
706+
if (outFile(state.compilerOptions)) return undefined;
704707
const currentDirectory = Debug.checkDefined(state.program).getCurrentDirectory();
705708
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(state.compilerOptions)!, currentDirectory));
706709
const fileInfos: MapLike<BuilderState.FileInfo> = {};
@@ -751,6 +754,17 @@ namespace ts {
751754
result.semanticDiagnosticsPerFile = semanticDiagnosticsPerFile;
752755
}
753756

757+
if (state.affectedFilesPendingEmit) {
758+
const affectedFilesPendingEmit: ProgramBuilderInfoFilePendingEmit[] = [];
759+
const seenFiles = createMap<true>();
760+
for (const path of state.affectedFilesPendingEmit.slice(state.affectedFilesPendingEmitIndex).sort(compareStringsCaseSensitive)) {
761+
if (addToSeen(seenFiles, path)) {
762+
affectedFilesPendingEmit.push([relativeToBuildInfo(path), state.affectedFilesPendingEmitKind!.get(path)!]);
763+
}
764+
}
765+
result.affectedFilesPendingEmit = affectedFilesPendingEmit;
766+
}
767+
754768
return result;
755769

756770
function relativeToBuildInfoEnsuringAbsolutePath(path: string) {
@@ -916,13 +930,23 @@ namespace ts {
916930
else if (kind === BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram) {
917931
(builderProgram as EmitAndSemanticDiagnosticsBuilderProgram).getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile;
918932
(builderProgram as EmitAndSemanticDiagnosticsBuilderProgram).emitNextAffectedFile = emitNextAffectedFile;
933+
builderProgram.emitBuildInfo = emitBuildInfo;
919934
}
920935
else {
921936
notImplemented();
922937
}
923938

924939
return builderProgram;
925940

941+
function emitBuildInfo(writeFile?: WriteFileCallback, cancellationToken?: CancellationToken): EmitResult {
942+
if (state.buildInfoEmitPending) {
943+
const result = Debug.checkDefined(state.program).emitBuildInfo(writeFile || maybeBind(host, host.writeFile), cancellationToken);
944+
state.buildInfoEmitPending = false;
945+
return result;
946+
}
947+
return emitSkippedWithNoDiagnostics;
948+
}
949+
926950
/**
927951
* Emits the next affected file's emit result (EmitResult and sourceFiles emitted) or returns undefined if iteration is complete
928952
* The first of writeFile if provided, writeFile of BuilderProgramHost if provided, writeFile of compiler host
@@ -933,10 +957,10 @@ namespace ts {
933957
let emitKind = BuilderFileEmit.Full;
934958
let isPendingEmitFile = false;
935959
if (!affected) {
936-
if (!state.compilerOptions.out && !state.compilerOptions.outFile) {
960+
if (!outFile(state.compilerOptions)) {
937961
const pendingAffectedFile = getNextAffectedFilePendingEmit(state);
938962
if (!pendingAffectedFile) {
939-
if (state.emittedBuildInfo) {
963+
if (!state.buildInfoEmitPending) {
940964
return undefined;
941965
}
942966

@@ -993,7 +1017,7 @@ namespace ts {
9931017
function emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult {
9941018
if (kind === BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram) {
9951019
assertSourceFileOkWithoutNextAffectedCall(state, targetSourceFile);
996-
const result = handleNoEmitOptions(builderProgram, targetSourceFile, cancellationToken);
1020+
const result = handleNoEmitOptions(builderProgram, targetSourceFile, writeFile, cancellationToken);
9971021
if (result) return result;
9981022
if (!targetSourceFile) {
9991023
// Emit and report any errors we ran into.
@@ -1071,7 +1095,7 @@ namespace ts {
10711095
function getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[] {
10721096
assertSourceFileOkWithoutNextAffectedCall(state, sourceFile);
10731097
const compilerOptions = Debug.checkDefined(state.program).getCompilerOptions();
1074-
if (compilerOptions.outFile || compilerOptions.out) {
1098+
if (outFile(compilerOptions)) {
10751099
Debug.assert(!state.semanticDiagnosticsPerFile);
10761100
// We dont need to cache the diagnostics just return them from program
10771101
return Debug.checkDefined(state.program).getSemanticDiagnostics(sourceFile, cancellationToken);
@@ -1142,7 +1166,10 @@ namespace ts {
11421166
referencedMap: getMapOfReferencedSet(program.referencedMap, toPath),
11431167
exportedModulesMap: getMapOfReferencedSet(program.exportedModulesMap, toPath),
11441168
semanticDiagnosticsPerFile: program.semanticDiagnosticsPerFile && arrayToMap(program.semanticDiagnosticsPerFile, value => toPath(isString(value) ? value : value[0]), value => isString(value) ? emptyArray : value[1]),
1145-
hasReusableDiagnostic: true
1169+
hasReusableDiagnostic: true,
1170+
affectedFilesPendingEmit: map(program.affectedFilesPendingEmit, value => toPath(value[0])),
1171+
affectedFilesPendingEmitKind: program.affectedFilesPendingEmit && arrayToMap(program.affectedFilesPendingEmit, value => toPath(value[0]), value => value[1]),
1172+
affectedFilesPendingEmitIndex: program.affectedFilesPendingEmit && 0,
11461173
};
11471174
return {
11481175
getState: () => state,
@@ -1165,6 +1192,7 @@ namespace ts {
11651192
getCurrentDirectory: notImplemented,
11661193
emitNextAffectedFile: notImplemented,
11671194
getSemanticDiagnosticsOfNextAffectedFile: notImplemented,
1195+
emitBuildInfo: notImplemented,
11681196
close: noop,
11691197
};
11701198

@@ -1195,6 +1223,7 @@ namespace ts {
11951223
getDeclarationDiagnostics: (sourceFile, cancellationToken) => getProgram().getDeclarationDiagnostics(sourceFile, cancellationToken),
11961224
getSemanticDiagnostics: (sourceFile, cancellationToken) => getProgram().getSemanticDiagnostics(sourceFile, cancellationToken),
11971225
emit: (sourceFile, writeFile, cancellationToken, emitOnlyDts, customTransformers) => getProgram().emit(sourceFile, writeFile, cancellationToken, emitOnlyDts, customTransformers),
1226+
emitBuildInfo: (writeFile, cancellationToken) => getProgram().emitBuildInfo(writeFile, cancellationToken),
11981227
getAllDependencies: notImplemented,
11991228
getCurrentDirectory: () => getProgram().getCurrentDirectory(),
12001229
close: noop,

src/compiler/builderPublic.ts

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ namespace ts {
9999
* in that order would be used to write the files
100100
*/
101101
emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult;
102+
/*@internal*/
103+
emitBuildInfo(writeFile?: WriteFileCallback, cancellationToken?: CancellationToken): EmitResult;
102104
/**
103105
* Get the current directory of the program
104106
*/

src/compiler/builderState.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ namespace ts {
403403
export function getAllDependencies(state: BuilderState, programOfThisState: Program, sourceFile: SourceFile): readonly string[] {
404404
const compilerOptions = programOfThisState.getCompilerOptions();
405405
// With --out or --outFile all outputs go into single file, all files depend on each other
406-
if (compilerOptions.outFile || compilerOptions.out) {
406+
if (outFile(compilerOptions)) {
407407
return getAllFileNames(state, programOfThisState);
408408
}
409409

@@ -519,7 +519,7 @@ namespace ts {
519519
const compilerOptions = programOfThisState.getCompilerOptions();
520520
// If `--out` or `--outFile` is specified, any new emit will result in re-emitting the entire project,
521521
// so returning the file itself is good enough.
522-
if (compilerOptions && (compilerOptions.out || compilerOptions.outFile)) {
522+
if (compilerOptions && outFile(compilerOptions)) {
523523
return [sourceFileWithUpdatedShape];
524524
}
525525
return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape);
@@ -534,7 +534,7 @@ namespace ts {
534534
}
535535

536536
const compilerOptions = programOfThisState.getCompilerOptions();
537-
if (compilerOptions && (compilerOptions.isolatedModules || compilerOptions.out || compilerOptions.outFile)) {
537+
if (compilerOptions && (compilerOptions.isolatedModules || outFile(compilerOptions))) {
538538
return [sourceFileWithUpdatedShape];
539539
}
540540

src/compiler/checker.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1355,7 +1355,7 @@ namespace ts {
13551355
const declContainer = getEnclosingBlockScopeContainer(declaration);
13561356
if (declarationFile !== useFile) {
13571357
if ((moduleKind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) ||
1358-
(!compilerOptions.outFile && !compilerOptions.out) ||
1358+
(!outFile(compilerOptions)) ||
13591359
isInTypeQuery(usage) ||
13601360
declaration.flags & NodeFlags.Ambient) {
13611361
// nodes are in different files and order cannot be determined
@@ -5204,7 +5204,7 @@ namespace ts {
52045204
const links = getSymbolLinks(symbol);
52055205
let specifier = links.specifierCache && links.specifierCache.get(contextFile.path);
52065206
if (!specifier) {
5207-
const isBundle = (compilerOptions.out || compilerOptions.outFile);
5207+
const isBundle = !!outFile(compilerOptions);
52085208
// For declaration bundles, we need to generate absolute paths relative to the common source dir for imports,
52095209
// just like how the declaration emitter does for the ambient module declarations - we can easily accomplish this
52105210
// using the `baseUrl` compiler option (which we would otherwise never use in declaration emit) and a non-relative
@@ -7873,7 +7873,7 @@ namespace ts {
78737873
(resolvedSymbol || symbol).exports!.forEach((s, name) => {
78747874
const exportedMember = members.get(name)!;
78757875
if (exportedMember && exportedMember !== s) {
7876-
if (s.flags & SymbolFlags.Value) {
7876+
if (s.flags & SymbolFlags.Value && exportedMember.flags & SymbolFlags.Value) {
78777877
// If the member has an additional value-like declaration, union the types from the two declarations,
78787878
// but issue an error if they occurred in two different files. The purpose is to support a JS file with
78797879
// a pattern like:

src/compiler/emitter.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace ts {
2525
includeBuildInfo?: boolean) {
2626
const sourceFiles = isArray(sourceFilesOrTargetSourceFile) ? sourceFilesOrTargetSourceFile : getSourceFilesToEmit(host, sourceFilesOrTargetSourceFile, forceDtsEmit);
2727
const options = host.getCompilerOptions();
28-
if (options.outFile || options.out) {
28+
if (outFile(options)) {
2929
const prepends = host.getPrependNodes();
3030
if (sourceFiles.length || prepends.length) {
3131
const bundle = createBundle(sourceFiles, prepends);
@@ -45,7 +45,7 @@ namespace ts {
4545
}
4646
}
4747
if (includeBuildInfo) {
48-
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(host.getCompilerOptions());
48+
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
4949
if (buildInfoPath) return action({ buildInfoPath }, /*sourceFileOrBundle*/ undefined);
5050
}
5151
}
@@ -55,7 +55,7 @@ namespace ts {
5555
const configFile = options.configFilePath;
5656
if (!isIncrementalCompilation(options)) return undefined;
5757
if (options.tsBuildInfoFile) return options.tsBuildInfoFile;
58-
const outPath = options.outFile || options.out;
58+
const outPath = outFile(options);
5959
let buildInfoExtensionLess: string;
6060
if (outPath) {
6161
buildInfoExtensionLess = removeFileExtension(outPath);
@@ -74,7 +74,7 @@ namespace ts {
7474

7575
/*@internal*/
7676
export function getOutputPathsForBundle(options: CompilerOptions, forceDtsPaths: boolean): EmitFileNames {
77-
const outPath = options.outFile || options.out!;
77+
const outPath = outFile(options)!;
7878
const jsFilePath = options.emitDeclarationOnly ? undefined : outPath;
7979
const sourceMapFilePath = jsFilePath && getSourceMapFilePath(jsFilePath, options);
8080
const declarationFilePath = (forceDtsPaths || getEmitDeclarations(options)) ? removeFileExtension(outPath) + Extension.Dts : undefined;
@@ -210,7 +210,7 @@ namespace ts {
210210
/*@internal*/
211211
export function getAllProjectOutputs(configFile: ParsedCommandLine, ignoreCase: boolean): readonly string[] {
212212
const { addOutput, getOutputs } = createAddOutput();
213-
if (configFile.options.outFile || configFile.options.out) {
213+
if (outFile(configFile.options)) {
214214
getSingleOutputFileNames(configFile, addOutput);
215215
}
216216
else {
@@ -226,7 +226,7 @@ namespace ts {
226226
inputFileName = normalizePath(inputFileName);
227227
Debug.assert(contains(commandLine.fileNames, inputFileName), `Expected fileName to be present in command line`);
228228
const { addOutput, getOutputs } = createAddOutput();
229-
if (commandLine.options.outFile || commandLine.options.out) {
229+
if (outFile(commandLine.options)) {
230230
getSingleOutputFileNames(commandLine, addOutput);
231231
}
232232
else {
@@ -237,7 +237,7 @@ namespace ts {
237237

238238
/*@internal*/
239239
export function getFirstProjectOutput(configFile: ParsedCommandLine, ignoreCase: boolean): string {
240-
if (configFile.options.outFile || configFile.options.out) {
240+
if (outFile(configFile.options)) {
241241
const { jsFilePath } = getOutputPathsForBundle(configFile.options, /*forceDtsPaths*/ false);
242242
return Debug.checkDefined(jsFilePath, `project ${configFile.options.configFilePath} expected to have at least one output`);
243243
}
@@ -404,7 +404,7 @@ namespace ts {
404404
const sourceFiles = isSourceFile(sourceFileOrBundle) ? [sourceFileOrBundle] : sourceFileOrBundle.sourceFiles;
405405
const filesForEmit = forceDtsEmit ? sourceFiles : filter(sourceFiles, isSourceFileNotJson);
406406
// Setup and perform the transformation to retrieve declarations from the input files
407-
const inputListOrBundle = (compilerOptions.outFile || compilerOptions.out) ? [createBundle(filesForEmit, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : undefined)] : filesForEmit;
407+
const inputListOrBundle = outFile(compilerOptions) ? [createBundle(filesForEmit, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : undefined)] : filesForEmit;
408408
if (emitOnlyDtsFiles && !getEmitDeclarations(compilerOptions)) {
409409
// Checker wont collect the linked aliases since thats only done when declaration is enabled.
410410
// Do that here when emitting only dts files

0 commit comments

Comments
 (0)