@@ -245,7 +245,12 @@ namespace ts {
245245 }
246246 } ) ;
247247
248- if ( oldCompilerOptions && compilerOptionsAffectEmit ( compilerOptions , oldCompilerOptions ) ) {
248+ // If the global file is removed, add all files as changed
249+ if ( useOldState && forEachEntry ( oldState ! . fileInfos , ( info , sourceFilePath ) => info . affectsGlobalScope && ! state . fileInfos . has ( sourceFilePath ) ) ) {
250+ BuilderState . getAllFilesExcludingDefaultLibraryFile ( state , newProgram , /*firstSourceFile*/ undefined )
251+ . forEach ( file => state . changedFilesSet . set ( file . resolvedPath , true ) ) ;
252+ }
253+ else if ( oldCompilerOptions && compilerOptionsAffectEmit ( compilerOptions , oldCompilerOptions ) ) {
249254 // Add all files to affectedFilesPendingEmit since emit changed
250255 newProgram . getSourceFiles ( ) . forEach ( f => addToAffectedFilesPendingEmit ( state , f . resolvedPath , BuilderFileEmit . Full ) ) ;
251256 Debug . assert ( ! state . seenAffectedFiles || ! state . seenAffectedFiles . size ) ;
@@ -701,7 +706,7 @@ namespace ts {
701706 const fileInfos : MapLike < BuilderState . FileInfo > = { } ;
702707 state . fileInfos . forEach ( ( value , key ) => {
703708 const signature = state . currentAffectedFilesSignatures && state . currentAffectedFilesSignatures . get ( key ) ;
704- fileInfos [ relativeToBuildInfo ( key ) ] = signature === undefined ? value : { version : value . version , signature } ;
709+ fileInfos [ relativeToBuildInfo ( key ) ] = signature === undefined ? value : { version : value . version , signature, affectsGlobalScope : value . affectsGlobalScope } ;
705710 } ) ;
706711
707712 const result : ProgramBuildInfo = {
@@ -710,37 +715,39 @@ namespace ts {
710715 } ;
711716 if ( state . referencedMap ) {
712717 const referencedMap : MapLike < string [ ] > = { } ;
713- state . referencedMap . forEach ( ( value , key ) => {
714- referencedMap [ relativeToBuildInfo ( key ) ] = arrayFrom ( value . keys ( ) , relativeToBuildInfo ) ;
715- } ) ;
718+ for ( const key of arrayFrom ( state . referencedMap . keys ( ) ) . sort ( compareStringsCaseSensitive ) ) {
719+ referencedMap [ relativeToBuildInfo ( key ) ] = arrayFrom ( state . referencedMap . get ( key ) ! . keys ( ) , relativeToBuildInfo ) . sort ( compareStringsCaseSensitive ) ;
720+ }
716721 result . referencedMap = referencedMap ;
717722 }
718723
719724 if ( state . exportedModulesMap ) {
720725 const exportedModulesMap : MapLike < string [ ] > = { } ;
721- state . exportedModulesMap . forEach ( ( value , key ) => {
726+ for ( const key of arrayFrom ( state . exportedModulesMap . keys ( ) ) . sort ( compareStringsCaseSensitive ) ) {
722727 const newValue = state . currentAffectedFilesExportedModulesMap && state . currentAffectedFilesExportedModulesMap . get ( key ) ;
723728 // Not in temporary cache, use existing value
724- if ( newValue === undefined ) exportedModulesMap [ relativeToBuildInfo ( key ) ] = arrayFrom ( value . keys ( ) , relativeToBuildInfo ) ;
729+ if ( newValue === undefined ) exportedModulesMap [ relativeToBuildInfo ( key ) ] = arrayFrom ( state . exportedModulesMap . get ( key ) ! . keys ( ) , relativeToBuildInfo ) . sort ( compareStringsCaseSensitive ) ;
725730 // Value in cache and has updated value map, use that
726- else if ( newValue ) exportedModulesMap [ relativeToBuildInfo ( key ) ] = arrayFrom ( newValue . keys ( ) , relativeToBuildInfo ) ;
727- } ) ;
731+ else if ( newValue ) exportedModulesMap [ relativeToBuildInfo ( key ) ] = arrayFrom ( newValue . keys ( ) , relativeToBuildInfo ) . sort ( compareStringsCaseSensitive ) ;
732+ }
728733 result . exportedModulesMap = exportedModulesMap ;
729734 }
730735
731736 if ( state . semanticDiagnosticsPerFile ) {
732737 const semanticDiagnosticsPerFile : ProgramBuildInfoDiagnostic [ ] = [ ] ;
733- // Currently not recording actual errors since those mean no emit for tsc --build
734- state . semanticDiagnosticsPerFile . forEach ( ( value , key ) => semanticDiagnosticsPerFile . push (
735- value . length ?
736- [
737- relativeToBuildInfo ( key ) ,
738- state . hasReusableDiagnostic ?
739- value as readonly ReusableDiagnostic [ ] :
740- convertToReusableDiagnostics ( value as readonly Diagnostic [ ] , relativeToBuildInfo )
741- ] :
742- relativeToBuildInfo ( key )
743- ) ) ;
738+ for ( const key of arrayFrom ( state . semanticDiagnosticsPerFile . keys ( ) ) . sort ( compareStringsCaseSensitive ) ) {
739+ const value = state . semanticDiagnosticsPerFile . get ( key ) ! ;
740+ semanticDiagnosticsPerFile . push (
741+ value . length ?
742+ [
743+ relativeToBuildInfo ( key ) ,
744+ state . hasReusableDiagnostic ?
745+ value as readonly ReusableDiagnostic [ ] :
746+ convertToReusableDiagnostics ( value as readonly Diagnostic [ ] , relativeToBuildInfo )
747+ ] :
748+ relativeToBuildInfo ( key )
749+ ) ;
750+ }
744751 result . semanticDiagnosticsPerFile = semanticDiagnosticsPerFile ;
745752 }
746753
0 commit comments