@@ -330,10 +330,25 @@ class CompletionAcceptedCommand implements Command {
330330
331331 public constructor (
332332 private readonly onCompletionAccepted : ( item : vscode . CompletionItem ) => void ,
333+ private readonly telemetryReporter : TelemetryReporter ,
333334 ) { }
334335
335336 public execute ( item : vscode . CompletionItem ) {
336337 this . onCompletionAccepted ( item ) ;
338+ if ( item instanceof MyCompletionItem ) {
339+ /* __GDPR__
340+ "completions.accept" : {
341+ "isPackageJsonImport" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
342+ "${include}": [
343+ "${TypeScriptCommonProperties}"
344+ ]
345+ }
346+ */
347+ this . telemetryReporter . logTelemetry ( 'completions.accept' , {
348+ // @ts -expect-error - remove after TS 4.0 protocol update
349+ isPackageJsonImport : item . tsEntry . isPackageJsonImport ? 'true' : undefined ,
350+ } ) ;
351+ }
337352 }
338353}
339354
@@ -422,7 +437,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
422437 ) {
423438 commandManager . register ( new ApplyCompletionCodeActionCommand ( this . client ) ) ;
424439 commandManager . register ( new CompositeCommand ( ) ) ;
425- commandManager . register ( new CompletionAcceptedCommand ( onCompletionAccepted ) ) ;
440+ commandManager . register ( new CompletionAcceptedCommand ( onCompletionAccepted , this . telemetryReporter ) ) ;
426441 }
427442
428443 public async provideCompletionItems (
@@ -471,34 +486,18 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
471486 let dotAccessorContext : DotAccessorContext | undefined ;
472487 let entries : ReadonlyArray < Proto . CompletionEntry > ;
473488 let metadata : any | undefined ;
489+ let response : ServerResponse . Response < Proto . CompletionInfoResponse > | undefined ;
490+ let duration : number | undefined ;
474491 if ( this . client . apiVersion . gte ( API . v300 ) ) {
475492 const startTime = Date . now ( ) ;
476- let response : ServerResponse . Response < Proto . CompletionInfoResponse > | undefined ;
477493 try {
478494 response = await this . client . interruptGetErr ( ( ) => this . client . execute ( 'completionInfo' , args , token ) ) ;
479495 } finally {
480- const duration : number = Date . now ( ) - startTime ;
481-
482- /* __GDPR__
483- "completions.execute" : {
484- "duration" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
485- "type" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
486- "count" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
487- "updateGraphDurationMs" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
488- "${include}": [
489- "${TypeScriptCommonProperties}"
490- ]
491- }
492- */
493- this . telemetryReporter . logTelemetry ( 'completions.execute' , {
494- duration : duration ,
495- type : response ?. type ?? 'unknown' ,
496- count : response ?. type === 'response' && response . body ? response . body . entries . length : 0 ,
497- updateGraphDurationMs : response ?. type === 'response' ? response . performanceData ?. updateGraphDurationMs : undefined ,
498- } ) ;
496+ duration = Date . now ( ) - startTime ;
499497 }
500498
501499 if ( response . type !== 'response' || ! response . body ) {
500+ this . logCompletionsTelemetry ( duration , response ) ;
502501 return null ;
503502 }
504503 isNewIdentifierLocation = response . body . isNewIdentifierLocation ;
@@ -536,15 +535,47 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
536535 useFuzzyWordRangeLogic : this . client . apiVersion . lt ( API . v390 ) ,
537536 } ;
538537
538+ let includesPackageJsonImport = false ;
539539 const items : MyCompletionItem [ ] = [ ] ;
540540 for ( let entry of entries ) {
541541 if ( ! shouldExcludeCompletionEntry ( entry , completionConfiguration ) ) {
542542 items . push ( new MyCompletionItem ( position , document , entry , completionContext , metadata ) ) ;
543+ // @ts -expect-error - remove after TS 4.0 protocol update
544+ includesPackageJsonImport = ! ! entry . isPackageJsonImport ;
543545 }
544546 }
547+ if ( duration !== undefined ) {
548+ this . logCompletionsTelemetry ( duration , response , includesPackageJsonImport ) ;
549+ }
545550 return new vscode . CompletionList ( items , isIncomplete ) ;
546551 }
547552
553+ private logCompletionsTelemetry (
554+ duration : number ,
555+ response : ServerResponse . Response < Proto . CompletionInfoResponse > | undefined ,
556+ includesPackageJsonImport ?: boolean
557+ ) {
558+ /* __GDPR__
559+ "completions.execute" : {
560+ "duration" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
561+ "type" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
562+ "count" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
563+ "updateGraphDurationMs" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
564+ "includesPackageJsonImport" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
565+ "${include}": [
566+ "${TypeScriptCommonProperties}"
567+ ]
568+ }
569+ */
570+ this . telemetryReporter . logTelemetry ( 'completions.execute' , {
571+ duration : duration ,
572+ type : response ?. type ?? 'unknown' ,
573+ count : response ?. type === 'response' && response . body ? response . body . entries . length : 0 ,
574+ updateGraphDurationMs : response ?. type === 'response' ? response . performanceData ?. updateGraphDurationMs : undefined ,
575+ includesPackageJsonImport : includesPackageJsonImport ? 'true' : undefined ,
576+ } ) ;
577+ }
578+
548579 private getTsTriggerCharacter ( context : vscode . CompletionContext ) : Proto . CompletionsTriggerCharacter | undefined {
549580 switch ( context . triggerCharacter ) {
550581 case '@' : // Workaround for https://github.com/Microsoft/TypeScript/issues/27321
0 commit comments