@@ -1106,7 +1106,7 @@ namespace ts.server {
11061106 return project . getLanguageService ( ) . getRenameInfo ( file , position ) ;
11071107 }
11081108
1109- private getProjects ( args : protocol . FileRequestArgs ) : Projects {
1109+ private getProjects ( args : protocol . FileRequestArgs , getScriptInfoEnsuringProjectsUptoDate ?: boolean , ignoreNoProjectError ?: boolean ) : Projects {
11101110 let projects : ReadonlyArray < Project > | undefined ;
11111111 let symLinkedProjects : MultiMap < Project > | undefined ;
11121112 if ( args . projectFileName ) {
@@ -1116,13 +1116,18 @@ namespace ts.server {
11161116 }
11171117 }
11181118 else {
1119- const scriptInfo = this . projectService . getScriptInfo ( args . file ) ! ;
1119+ const scriptInfo = getScriptInfoEnsuringProjectsUptoDate ?
1120+ this . projectService . getScriptInfoEnsuringProjectsUptoDate ( args . file ) :
1121+ this . projectService . getScriptInfo ( args . file ) ;
1122+ if ( ! scriptInfo ) {
1123+ return ignoreNoProjectError ? emptyArray : Errors . ThrowNoProject ( ) ;
1124+ }
11201125 projects = scriptInfo . containingProjects ;
11211126 symLinkedProjects = this . projectService . getSymlinkedProjects ( scriptInfo ) ;
11221127 }
11231128 // filter handles case when 'projects' is undefined
11241129 projects = filter ( projects , p => p . languageServiceEnabled && ! p . isOrphan ( ) ) ;
1125- if ( ( ! projects || ! projects . length ) && ! symLinkedProjects ) {
1130+ if ( ! ignoreNoProjectError && ( ! projects || ! projects . length ) && ! symLinkedProjects ) {
11261131 return Errors . ThrowNoProject ( ) ;
11271132 }
11281133 return symLinkedProjects ? { projects : projects ! , symLinkedProjects } : projects ! ; // TODO: GH#18217
@@ -1465,29 +1470,16 @@ namespace ts.server {
14651470 }
14661471
14671472 private getCompileOnSaveAffectedFileList ( args : protocol . FileRequestArgs ) : ReadonlyArray < protocol . CompileOnSaveAffectedFileListSingleProject > {
1468- let info : ScriptInfo | undefined ;
1469- let project : Project | undefined ;
1470- if ( args . projectFileName ) {
1471- // Do not update all projects if we are looking for specific project to compile on save
1472- project = this . projectService . findProject ( args . projectFileName ) ! ;
1473- if ( project . dirty ) project . updateGraph ( ) ;
1474- info = this . projectService . getScriptInfo ( args . file ) ;
1475- }
1476- else {
1477- info = this . projectService . getScriptInfoEnsuringProjectsUptoDate ( args . file ) ;
1478- }
1479-
1473+ const projects = this . getProjects ( args , /*getScriptInfoEnsuringProjectsUptoDate*/ true , /*ignoreNoProjectError*/ true ) ;
1474+ const info = this . projectService . getScriptInfo ( args . file ) ;
14801475 if ( ! info ) {
14811476 return emptyArray ;
14821477 }
14831478
1484- // if specified a project, we only return affected file list in this project
1485- const projects = args . projectFileName ? [ project ! ] : info . containingProjects ;
1486- const symLinkedProjects = ! args . projectFileName && this . projectService . getSymlinkedProjects ( info ) ;
14871479 return combineProjectOutput (
14881480 info ,
14891481 path => this . projectService . getScriptInfoForPath ( path ) ! ,
1490- symLinkedProjects ? { projects , symLinkedProjects } : projects ,
1482+ projects ,
14911483 ( project , info ) => {
14921484 let result : protocol . CompileOnSaveAffectedFileListSingleProject | undefined ;
14931485 if ( project . compileOnSaveEnabled && project . languageServiceEnabled && ! project . isOrphan ( ) && ! project . getCompilationSettings ( ) . noEmit ) {
0 commit comments