@@ -86,6 +86,7 @@ namespace ts.server {
8686 export const Format = "format" ;
8787 export const Formatonkey = "formatonkey" ;
8888 export const Geterr = "geterr" ;
89+ export const GeterrForProject = "geterrForProject" ;
8990 export const NavBar = "navbar" ;
9091 export const Navto = "navto" ;
9192 export const Occurrences = "occurrences" ;
@@ -344,15 +345,15 @@ namespace ts.server {
344345 }
345346
346347 getProjectInfo ( fileName : string , needFileNameList : boolean ) : protocol . ProjectInfo {
347- fileName = ts . normalizePath ( fileName )
348- let project = this . projectService . getProjectForFile ( fileName )
348+ fileName = ts . normalizePath ( fileName ) ;
349+ let project = this . projectService . getProjectForFile ( fileName ) ;
349350
350351 let projectInfo : protocol . ProjectInfo = {
351352 configFileName : project . projectFilename
352353 }
353354
354355 if ( needFileNameList ) {
355- projectInfo . fileNameList = project . getFileNameList ( ) ;
356+ projectInfo . fileNames = project . getFileNames ( ) ;
356357 }
357358
358359 return projectInfo ;
@@ -836,6 +837,51 @@ namespace ts.server {
836837 } ) ) ;
837838 }
838839
840+ getDiagnosticsForProject ( delay : number , fileName : string ) {
841+ let { configFileName, fileNames : fileNamesInProject } = this . getProjectInfo ( fileName , true ) ;
842+ // No need to analyze lib.d.ts
843+ fileNamesInProject = fileNamesInProject . filter ( ( value , index , array ) => value . indexOf ( "lib.d.ts" ) < 0 ) ;
844+
845+ // Sort the file name list to make the recently touched files come first
846+ let highPriorityFiles : string [ ] = [ ] ;
847+ let mediumPriorityFiles : string [ ] = [ ] ;
848+ let lowPriorityFiles : string [ ] = [ ] ;
849+ let veryLowPriorityFiles : string [ ] = [ ] ;
850+ let normalizedFileName = ts . normalizePath ( fileName ) ;
851+ let project = this . projectService . getProjectForFile ( normalizedFileName ) ;
852+ for ( let fileNameInProject of fileNamesInProject ) {
853+ if ( this . getCanonicalFileName ( fileNameInProject ) == this . getCanonicalFileName ( fileName ) )
854+ highPriorityFiles . push ( fileNameInProject ) ;
855+ else {
856+ let info = this . projectService . getScriptInfo ( fileNameInProject ) ;
857+ if ( ! info || ! info . isOpen ) {
858+ if ( fileNameInProject . indexOf ( ".d.ts" ) > 0 )
859+ veryLowPriorityFiles . push ( fileNameInProject ) ;
860+ else
861+ lowPriorityFiles . push ( fileNameInProject ) ;
862+ }
863+ else
864+ mediumPriorityFiles . push ( fileNameInProject ) ;
865+ }
866+ }
867+
868+ fileNamesInProject = highPriorityFiles . concat ( mediumPriorityFiles ) . concat ( lowPriorityFiles ) . concat ( veryLowPriorityFiles ) ;
869+
870+ if ( fileNamesInProject . length > 0 ) {
871+ let checkList = fileNamesInProject . map < PendingErrorCheck > ( ( fileName : string ) => {
872+ let normalizedFileName = ts . normalizePath ( fileName ) ;
873+ return { fileName : normalizedFileName , project } ;
874+ } ) ;
875+ this . updateErrorCheck ( checkList , this . changeSeq , ( n ) => n == this . changeSeq , delay ) ;
876+ }
877+ }
878+
879+ getCanonicalFileName ( fileName : string ) {
880+ let name = this . host . useCaseSensitiveFileNames ? fileName : fileName . toLowerCase ( ) ;
881+ this . logger . info ( ts . normalizePath ( name ) ) ;
882+ return ts . normalizePath ( name ) ;
883+ }
884+
839885 exit ( ) {
840886 }
841887
@@ -919,6 +965,13 @@ namespace ts.server {
919965 responseRequired = false ;
920966 break ;
921967 }
968+ case CommandNames . GeterrForProject : {
969+ this . logger . info ( request . arguments ) ;
970+ let { file, delay } = < protocol . GeterrForProjectRequestArgs > request . arguments ;
971+ response = this . getDiagnosticsForProject ( delay , file ) ;
972+ responseRequired = false ;
973+ break ;
974+ }
922975 case CommandNames . Change : {
923976 var changeArgs = < protocol . ChangeRequestArgs > request . arguments ;
924977 this . change ( changeArgs . line , changeArgs . offset , changeArgs . endLine , changeArgs . endOffset ,
0 commit comments