@@ -1106,10 +1106,10 @@ function reportMacCrashes(): void {
11061106fs . readFile ( path . resolve ( crashFolder , filename ) , 'utf8' , ( err , data ) => {
11071107if ( err ) {
11081108// Try again?
1109- fs . readFile ( path . resolve ( crashFolder , filename ) , 'utf8' , handleCrashFileRead ) ;
1109+ fs . readFile ( path . resolve ( crashFolder , filename ) , 'utf8' , handleMacCrashFileRead ) ;
11101110return ;
11111111}
1112- handleCrashFileRead ( err , data ) ;
1112+ handleMacCrashFileRead ( err , data ) ;
11131113} ) ;
11141114} , 5000 ) ;
11151115} ) ;
@@ -1120,15 +1120,22 @@ function reportMacCrashes(): void {
11201120}
11211121}
11221122
1123- function logCrashTelemetry ( data :string ) :void {
1123+ let previousMacCrashData :string ;
1124+ let previousMacCrashCount :number = 0 ;
1125+
1126+ function logMacCrashTelemetry ( data :string ) :void {
11241127const crashObject :{ [ key :string ] :string } = { } ;
1128+ const crashCountObject :{ [ key :string ] :number } = { } ;
11251129crashObject [ "CrashingThreadCallStack" ] = data ;
1126- telemetry . logLanguageServerEvent ( "MacCrash" , crashObject , undefined ) ;
1130+ previousMacCrashCount = data === previousMacCrashData ?previousMacCrashCount + 1 :0 ;
1131+ previousMacCrashData = data ;
1132+ crashCountObject [ "CrashCount" ] = previousMacCrashCount ;
1133+ telemetry . logLanguageServerEvent ( "MacCrash" , crashObject , crashCountObject ) ;
11271134}
11281135
1129- function handleCrashFileRead ( err :NodeJS . ErrnoException | undefined | null , data :string ) :void {
1136+ function handleMacCrashFileRead ( err :NodeJS . ErrnoException | undefined | null , data :string ) :void {
11301137if ( err ) {
1131- return logCrashTelemetry ( "readFile: " + err . code ) ;
1138+ return logMacCrashTelemetry ( "readFile: " + err . code ) ;
11321139}
11331140
11341141// Extract the crashing process version, because the version might not match
@@ -1145,15 +1152,15 @@ function handleCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data
11451152const crashStart :string = " Crashed:" ;
11461153let startCrash :number = data . indexOf ( crashStart ) ;
11471154if ( startCrash < 0 ) {
1148- return logCrashTelemetry ( "No crash start" ) ;
1155+ return logMacCrashTelemetry ( "No crash start" ) ;
11491156}
11501157startCrash += crashStart . length + 1 ; // Skip past crashStart.
11511158let endCrash :number = data . indexOf ( "Thread " , startCrash ) ;
11521159if ( endCrash < 0 ) {
11531160endCrash = data . length - 1 ; // Not expected, but just in case.
11541161}
11551162if ( endCrash <= startCrash ) {
1156- return logCrashTelemetry ( "No crash end" ) ;
1163+ return logMacCrashTelemetry ( "No crash end" ) ;
11571164}
11581165data = data . substr ( startCrash , endCrash - startCrash ) ;
11591166
@@ -1191,7 +1198,7 @@ function handleCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data
11911198data = data . substr ( 0 , 8189 ) + "..." ;
11921199}
11931200
1194- logCrashTelemetry ( data ) ;
1201+ logMacCrashTelemetry ( data ) ;
11951202}
11961203
11971204export function deactivate ( ) :Thenable < void > {