@@ -154,7 +154,6 @@ namespace ts.projectSystem {
154
154
params . executingFilePath || getExecutingFilePathFromLibFile ( ) ,
155
155
params . currentDirectory || "/" ,
156
156
fileOrFolderList ) ;
157
- host . createFileOrFolder ( safeList , /*createParentDirectory*/ true ) ;
158
157
return host ;
159
158
}
160
159
@@ -355,7 +354,8 @@ namespace ts.projectSystem {
355
354
reloadFS ( filesOrFolders : FileOrFolder [ ] ) {
356
355
this . filesOrFolders = filesOrFolders ;
357
356
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 ) ) {
359
359
const path = this . toPath ( fileOrFolder . path ) ;
360
360
const fullPath = getNormalizedAbsolutePath ( fileOrFolder . path , this . currentDirectory ) ;
361
361
if ( typeof fileOrFolder . content === "string" ) {
@@ -1585,6 +1585,104 @@ namespace ts.projectSystem {
1585
1585
projectService . closeClientFile ( file1 . path ) ;
1586
1586
checkNumberOfProjects ( projectService , { configuredProjects : 0 } ) ;
1587
1587
} ) ;
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
+ } ) ;
1588
1686
} ) ;
1589
1687
1590
1688
describe ( "Proper errors" , ( ) => {
0 commit comments