2
2
arrayFrom ,
3
3
compareStringsCaseSensitive ,
4
4
Debug ,
5
+ identity ,
5
6
noop ,
6
7
} from "./_namespaces/ts" ;
7
8
import {
@@ -22,6 +23,7 @@ interface ProjectData {
22
23
projectProgramVersion : Project [ "projectProgramVersion" ] ;
23
24
autoImportProviderHost : Project [ "autoImportProviderHost" ] ;
24
25
noDtsResolutionProject : Project [ "noDtsResolutionProject" ] ;
26
+ originalConfiguredProjects : Project [ "originalConfiguredProjects" ] ;
25
27
}
26
28
27
29
interface ScriptInfoData {
@@ -38,20 +40,14 @@ enum Diff {
38
40
Deleted = " *deleted*" ,
39
41
}
40
42
41
- type StateItemLog = [ string , string [ ] , string [ ] ? ] ;
43
+ type StateItemLog = [ string , ... string [ ] [ ] ] ;
42
44
43
45
export function patchServiceForStateBaseline ( service : ProjectService ) {
44
46
if ( ! service . logger . isTestLogger || ! service . logger . hasLevel ( LogLevel . verbose ) ) return ;
45
47
if ( service . baseline !== noop ) return ; // Already patched
46
48
47
49
const projects = new Map < Project , ProjectData > ( ) ;
48
50
const scriptInfos = new Map < ScriptInfo , ScriptInfoData > ( ) ;
49
- const allPropertiesOfProjectData : ( keyof ProjectData & keyof Project ) [ ] = [
50
- "projectStateVersion" ,
51
- "projectProgramVersion" ,
52
- "autoImportProviderHost" ,
53
- "noDtsResolutionProject" ,
54
- ] ;
55
51
const logger = service . logger as LoggerWithInMemoryLogs ;
56
52
service . baseline = title => {
57
53
const projectLogs = baselineProjects ( ) ;
@@ -67,10 +63,9 @@ export function patchServiceForStateBaseline(service: ProjectService) {
67
63
if ( ! logs ) return ;
68
64
logger . log ( title ) ;
69
65
logs . sort ( ( a , b ) => compareStringsCaseSensitive ( a [ 0 ] , b [ 0 ] ) )
70
- . forEach ( ( [ title , propertyLogs , additionalPropertyLogs ] ) => {
66
+ . forEach ( ( [ title , ... propertyLogs ] ) => {
71
67
logger . log ( title ) ;
72
- propertyLogs . forEach ( s => logger . log ( s ) ) ;
73
- additionalPropertyLogs ?. forEach ( s => logger . log ( s ) ) ;
68
+ propertyLogs . forEach ( p => p . forEach ( s => logger . log ( s ) ) ) ;
74
69
} ) ;
75
70
logger . log ( "" ) ;
76
71
}
@@ -86,22 +81,28 @@ export function patchServiceForStateBaseline(service: ProjectService) {
86
81
if ( project . noDtsResolutionProject ) auxiliaryProjects . push ( project . noDtsResolutionProject ) ;
87
82
let projectDiff = newOrDeleted ( project , projects , data ) ;
88
83
const projectPropertyLogs = [ ] as string [ ] ;
89
- allPropertiesOfProjectData . forEach ( key => {
90
- let value : Project [ typeof key ] | string = project [ key ] ;
91
- if ( key === "autoImportProviderHost" || key === "noDtsResolutionProject" ) {
92
- if ( project [ key ] ) value = ( project [ key ] as Project ) . projectName ;
93
- else if ( project [ key ] === undefined && data ?. [ key ] === undefined ) return ;
94
- }
95
- projectDiff = printProperty ( PrintPropertyWhen . Always , data , key , project [ key ] , projectDiff , projectPropertyLogs , value ) ;
96
- } ) ;
97
- logs . push ( [ `${ project . projectName } (${ ProjectKind [ project . projectKind ] } )${ projectDiff } ` , projectPropertyLogs ] ) ;
98
- return projectDiff ;
84
+ projectDiff = printProperty ( PrintPropertyWhen . Always , data , "projectStateVersion" , project . projectStateVersion , projectDiff , projectPropertyLogs ) ;
85
+ projectDiff = printProperty ( PrintPropertyWhen . Always , data , "projectProgramVersion" , project . projectProgramVersion , projectDiff , projectPropertyLogs ) ;
86
+ projectDiff = printProperty ( PrintPropertyWhen . DefinedOrChangedOrNew , data , "autoImportProviderHost" , project . autoImportProviderHost , projectDiff , projectPropertyLogs , project . autoImportProviderHost ? project . autoImportProviderHost . projectName : project . autoImportProviderHost ) ;
87
+ projectDiff = printProperty ( PrintPropertyWhen . DefinedOrChangedOrNew , data , "noDtsResolutionProject" , project . noDtsResolutionProject , projectDiff , projectPropertyLogs , project . noDtsResolutionProject ? project . noDtsResolutionProject . projectName : project . noDtsResolutionProject ) ;
88
+ return printSetPropertyAndCreateStatementLog (
89
+ logs ,
90
+ `${ project . projectName } (${ ProjectKind [ project . projectKind ] } )` ,
91
+ PrintPropertyWhen . DefinedOrChangedOrNew ,
92
+ "originalConfiguredProjects" ,
93
+ projectPropertyLogs ,
94
+ projectDiff ,
95
+ project . originalConfiguredProjects ,
96
+ data ?. originalConfiguredProjects ,
97
+ identity ,
98
+ ) ;
99
99
} ,
100
100
project => ( {
101
101
projectStateVersion : project . projectStateVersion ,
102
102
projectProgramVersion : project . projectProgramVersion ,
103
103
autoImportProviderHost : project . autoImportProviderHost ,
104
104
noDtsResolutionProject : project . noDtsResolutionProject ,
105
+ originalConfiguredProjects : project . originalConfiguredProjects && new Set ( project . originalConfiguredProjects ) ,
105
106
} ) ,
106
107
) ;
107
108
}
@@ -117,41 +118,24 @@ export function patchServiceForStateBaseline(service: ProjectService) {
117
118
infoDiff = printProperty ( PrintPropertyWhen . Changed , data , "open" , isOpen , infoDiff , infoPropertyLogs ) ;
118
119
infoDiff = printProperty ( PrintPropertyWhen . Always , data , "version" , info . textStorage . getVersion ( ) , infoDiff , infoPropertyLogs ) ;
119
120
infoDiff = printProperty ( PrintPropertyWhen . TruthyOrChangedOrNew , data , "pendingReloadFromDisk" , info . textStorage . pendingReloadFromDisk , infoDiff , infoPropertyLogs ) ;
120
- const containingProjectsLogs = [ ] as string [ ] ;
121
- let containingProjectsDiff = Diff . None ;
122
- const defaultProject = isOpen && info . containingProjects . length ? info . getDefaultProject ( ) : undefined ;
123
- info . containingProjects . forEach ( project =>
124
- containingProjectsDiff = printPropertyWorker (
125
- PrintPropertyWhen . Always ,
126
- ` ${ project . projectName } ${ defaultProject === project ? " *default*" : "" } ` ,
127
- containingProjectsLogs ,
128
- containingProjectsDiff ,
129
- ! ! data && ! data . containingProjects . has ( project ) ,
130
- Diff . New ,
131
- project ,
132
- )
133
- ) ;
134
- const infoProjects = new Set ( info . containingProjects ) ;
135
- data ?. containingProjects . forEach ( project => {
136
- if ( infoProjects . has ( project ) ) return ;
137
- containingProjectsDiff = Diff . Change ;
138
- containingProjectsLogs . push ( ` ${ project . projectName } ${ Diff . Deleted } ` ) ;
139
- } ) ;
140
- infoDiff = printPropertyWorker (
121
+ let defaultProject : Project | undefined ;
122
+ try {
123
+ if ( isOpen ) defaultProject = info . getDefaultProject ( ) ;
124
+ }
125
+ catch ( e ) {
126
+ Debug . assert ( e . message === "No Project." ) ;
127
+ }
128
+ return printSetPropertyAndCreateStatementLog (
129
+ logs ,
130
+ `${ info . fileName } ${ isOpen ? " (Open)" : "" } ` ,
141
131
PrintPropertyWhen . Always ,
142
- ` containingProjects: ${ info . containingProjects . length } ` ,
132
+ " containingProjects" ,
143
133
infoPropertyLogs ,
144
134
infoDiff ,
145
- ! ! containingProjectsDiff ,
146
- Diff . Change ,
147
- info . containingProjects ,
135
+ new Set ( info . containingProjects ) ,
136
+ data ?. containingProjects ,
137
+ project => ` ${ project . projectName } ${ defaultProject === project ? " *default*" : "" } ` ,
148
138
) ;
149
- logs . push ( [
150
- `${ info . fileName } ${ isOpen ? " (Open)" : "" } ${ infoDiff } ` ,
151
- infoPropertyLogs ,
152
- containingProjectsLogs ,
153
- ] ) ;
154
- return infoDiff ;
155
139
} ,
156
140
info => ( {
157
141
open : info . isScriptOpen ( ) ,
@@ -201,6 +185,7 @@ export function patchServiceForStateBaseline(service: ProjectService) {
201
185
Always ,
202
186
TruthyOrChangedOrNew ,
203
187
Changed ,
188
+ DefinedOrChangedOrNew ,
204
189
}
205
190
function printProperty < Data , Key extends keyof Data & string > (
206
191
printWhen : PrintPropertyWhen ,
@@ -222,6 +207,45 @@ export function patchServiceForStateBaseline(service: ProjectService) {
222
207
) ;
223
208
}
224
209
210
+ function printSetPropertyValueWorker < T > (
211
+ printWhen : PrintPropertyWhen . Always | PrintPropertyWhen . DefinedOrChangedOrNew ,
212
+ propertyName : string ,
213
+ propertyLogs : string [ ] ,
214
+ dataDiff : Diff ,
215
+ propertyValue : Set < T > | undefined ,
216
+ dataValue : Set < T > | undefined ,
217
+ toStringPropertyValue : ( v : T ) => string ,
218
+ ) {
219
+ const setPropertyLogs = [ ] as string [ ] ;
220
+ let setPropertyDiff = Diff . None ;
221
+ propertyValue ?. forEach ( p =>
222
+ setPropertyDiff = printPropertyWorker (
223
+ PrintPropertyWhen . Always ,
224
+ ` ${ toStringPropertyValue ( p ) } ` ,
225
+ setPropertyLogs ,
226
+ setPropertyDiff ,
227
+ dataDiff !== Diff . New && ! dataValue ?. has ( p ) ,
228
+ Diff . New ,
229
+ p ,
230
+ )
231
+ ) ;
232
+ dataValue ?. forEach ( p => {
233
+ if ( propertyValue ?. has ( p ) ) return ;
234
+ setPropertyDiff = Diff . Change ;
235
+ setPropertyLogs . push ( ` ${ toStringPropertyValue ( p ) } ${ Diff . Deleted } ` ) ;
236
+ } ) ;
237
+ dataDiff = printPropertyWorker (
238
+ printWhen ,
239
+ `${ propertyName } : ${ propertyValue ?. size || 0 } ` ,
240
+ propertyLogs ,
241
+ dataDiff ,
242
+ ! ! setPropertyDiff ,
243
+ Diff . Change ,
244
+ propertyValue ,
245
+ ) ;
246
+ return { dataDiff, setPropertyLogs } ;
247
+ }
248
+
225
249
function printPropertyWorker (
226
250
printWhen : PrintPropertyWhen ,
227
251
stringValue : string ,
@@ -242,10 +266,41 @@ export function patchServiceForStateBaseline(service: ProjectService) {
242
266
break ;
243
267
case PrintPropertyWhen . Always :
244
268
break ;
269
+ case PrintPropertyWhen . DefinedOrChangedOrNew :
270
+ if ( value === undefined && ! propertyDiff ) return result ;
271
+ break ;
245
272
default :
246
273
Debug . assertNever ( printWhen ) ;
247
274
}
248
275
propertyLogs . push ( ` ${ stringValue } ${ propertyDiff } ` ) ;
249
276
return result ;
250
277
}
278
+
279
+ function printSetPropertyAndCreateStatementLog < T > (
280
+ logs : StateItemLog [ ] ,
281
+ header : string ,
282
+ printWhen : PrintPropertyWhen . Always | PrintPropertyWhen . DefinedOrChangedOrNew ,
283
+ propertyName : string ,
284
+ propertyLogs : string [ ] ,
285
+ dataDiff : Diff ,
286
+ propertyValue : Set < T > | undefined ,
287
+ dataValue : Set < T > | undefined ,
288
+ toStringPropertyValue : ( v : T ) => string ,
289
+ ) {
290
+ const result = printSetPropertyValueWorker (
291
+ printWhen ,
292
+ propertyName ,
293
+ propertyLogs ,
294
+ dataDiff ,
295
+ propertyValue ,
296
+ dataValue ,
297
+ toStringPropertyValue ,
298
+ ) ;
299
+ logs . push ( [
300
+ `${ header } ${ result . dataDiff } ` ,
301
+ propertyLogs ,
302
+ result . setPropertyLogs ,
303
+ ] ) ;
304
+ return result . dataDiff ;
305
+ }
251
306
}
0 commit comments