@@ -154,7 +154,6 @@ namespace ts.projectSystem {
154154 params . executingFilePath || getExecutingFilePathFromLibFile ( ) ,
155155 params . currentDirectory || "/" ,
156156 fileOrFolderList ) ;
157- host . createFileOrFolder ( safeList , /*createParentDirectory*/ true ) ;
158157 return host ;
159158 }
160159
@@ -355,7 +354,8 @@ namespace ts.projectSystem {
355354 reloadFS ( filesOrFolders : FileOrFolder [ ] ) {
356355 this . filesOrFolders = filesOrFolders ;
357356 this . fs = createFileMap < FSEntry > ( ) ;
358- for ( const fileOrFolder of filesOrFolders ) {
357+ // always inject safelist file in the list of files
358+ for ( const fileOrFolder of filesOrFolders . concat ( safeList ) ) {
359359 const path = this . toPath ( fileOrFolder . path ) ;
360360 const fullPath = getNormalizedAbsolutePath ( fileOrFolder . path , this . currentDirectory ) ;
361361 if ( typeof fileOrFolder . content === "string" ) {
@@ -1585,6 +1585,104 @@ namespace ts.projectSystem {
15851585 projectService . closeClientFile ( file1 . path ) ;
15861586 checkNumberOfProjects ( projectService , { configuredProjects : 0 } ) ;
15871587 } ) ;
1588+
1589+ it ( "language service disabled events are triggered" , ( ) => {
1590+ const f1 = {
1591+ path : "/a/app.js" ,
1592+ content : "let x = 1;"
1593+ } ;
1594+ const f2 = {
1595+ path : "/a/largefile.js" ,
1596+ content : ""
1597+ } ;
1598+ const config = {
1599+ path : "/a/jsconfig.json" ,
1600+ content : "{}"
1601+ } ;
1602+ const configWithExclude = {
1603+ path : config . path ,
1604+ content : JSON . stringify ( { exclude : [ "largefile.js" ] } )
1605+ } ;
1606+ const host = createServerHost ( [ f1 , f2 , config ] ) ;
1607+ const originalGetFileSize = host . getFileSize ;
1608+ host . getFileSize = ( filePath : string ) =>
1609+ filePath === f2 . path ? server . maxProgramSizeForNonTsFiles + 1 : originalGetFileSize . call ( host , filePath ) ;
1610+
1611+ let lastEvent : server . ProjectLanguageServiceStateEvent ;
1612+ const session = createSession ( host , /*typingsInstaller*/ undefined , e => {
1613+ if ( e . eventName === server . ConfigFileDiagEvent || e . eventName === server . ContextEvent ) {
1614+ return ;
1615+ }
1616+ assert . equal ( e . eventName , server . ProjectLanguageServiceStateEvent ) ;
1617+ lastEvent = < server . ProjectLanguageServiceStateEvent > e ;
1618+ } ) ;
1619+ session . executeCommand ( < protocol . OpenRequest > {
1620+ seq : 0 ,
1621+ type : "request" ,
1622+ command : "open" ,
1623+ arguments : { file : f1 . path }
1624+ } ) ;
1625+ const projectService = session . getProjectService ( ) ;
1626+ checkNumberOfProjects ( projectService , { configuredProjects : 1 } ) ;
1627+ const project = projectService . configuredProjects [ 0 ] ;
1628+ assert . isFalse ( project . languageServiceEnabled , "Language service enabled" ) ;
1629+ assert . isTrue ( ! ! lastEvent , "should receive event" ) ;
1630+ assert . equal ( lastEvent . data . project , project , "project name" ) ;
1631+ assert . isFalse ( lastEvent . data . languageServiceEnabled , "Language service state" ) ;
1632+
1633+ host . reloadFS ( [ f1 , f2 , configWithExclude ] ) ;
1634+ host . triggerFileWatcherCallback ( config . path , /*removed*/ false ) ;
1635+
1636+ checkNumberOfProjects ( projectService , { configuredProjects : 1 } ) ;
1637+ assert . isTrue ( project . languageServiceEnabled , "Language service enabled" ) ;
1638+ assert . equal ( lastEvent . data . project , project , "project" ) ;
1639+ assert . isTrue ( lastEvent . data . languageServiceEnabled , "Language service state" ) ;
1640+ } ) ;
1641+
1642+ it ( "syntactic features work even if language service is disabled" , ( ) => {
1643+ const f1 = {
1644+ path : "/a/app.js" ,
1645+ content : "let x = 1;"
1646+ } ;
1647+ const f2 = {
1648+ path : "/a/largefile.js" ,
1649+ content : ""
1650+ } ;
1651+ const config = {
1652+ path : "/a/jsconfig.json" ,
1653+ content : "{}"
1654+ } ;
1655+ const host = createServerHost ( [ f1 , f2 , config ] ) ;
1656+ const originalGetFileSize = host . getFileSize ;
1657+ host . getFileSize = ( filePath : string ) =>
1658+ filePath === f2 . path ? server . maxProgramSizeForNonTsFiles + 1 : originalGetFileSize . call ( host , filePath ) ;
1659+ let lastEvent : server . ProjectLanguageServiceStateEvent ;
1660+ const session = createSession ( host , /*typingsInstaller*/ undefined , e => {
1661+ if ( e . eventName === server . ConfigFileDiagEvent ) {
1662+ return ;
1663+ }
1664+ assert . equal ( e . eventName , server . ProjectLanguageServiceStateEvent ) ;
1665+ lastEvent = < server . ProjectLanguageServiceStateEvent > e ;
1666+ } ) ;
1667+ session . executeCommand ( < protocol . OpenRequest > {
1668+ seq : 0 ,
1669+ type : "request" ,
1670+ command : "open" ,
1671+ arguments : { file : f1 . path }
1672+ } ) ;
1673+
1674+ const projectService = session . getProjectService ( ) ;
1675+ checkNumberOfProjects ( projectService , { configuredProjects : 1 } ) ;
1676+ const project = projectService . configuredProjects [ 0 ] ;
1677+ assert . isFalse ( project . languageServiceEnabled , "Language service enabled" ) ;
1678+ assert . isTrue ( ! ! lastEvent , "should receive event" ) ;
1679+ assert . equal ( lastEvent . data . project , project , "project name" ) ;
1680+ assert . isFalse ( lastEvent . data . languageServiceEnabled , "Language service state" ) ;
1681+
1682+ const options = projectService . getFormatCodeOptions ( ) ;
1683+ const edits = project . getLanguageService ( ) . getFormattingEditsForDocument ( f1 . path , options ) ;
1684+ assert . deepEqual ( edits , [ { span : createTextSpan ( /*start*/ 7 , /*length*/ 3 ) , newText : " " } ] ) ;
1685+ } ) ;
15881686 } ) ;
15891687
15901688 describe ( "Proper errors" , ( ) => {
0 commit comments