Skip to content
This repository was archived by the owner on May 20, 2026. It is now read-only.

Commit 1c66ed1

Browse files
authored
nes: speculative: debug log tree improvements (#4213)
* nes: spec: fix logcontext name printing * nes: speculative: don't merge parent and single child into one * nes: speculative: log context clickable * nes: speculative: log context with tracing
1 parent 250833f commit 1c66ed1

1 file changed

Lines changed: 36 additions & 12 deletions

File tree

src/extension/inlineEdits/node/nextEditProvider.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { DocumentHistory, HistoryContext, IHistoryContextProvider } from '../../
1818
import { IXtabHistoryEditEntry, NesXtabHistoryTracker } from '../../../platform/inlineEdits/common/workspaceEditTracker/nesXtabHistoryTracker';
1919
import { ILogger, ILogService, LogTarget } from '../../../platform/log/common/logService';
2020
import { CapturingToken } from '../../../platform/requestLogger/common/capturingToken';
21-
import { IRequestLogger } from '../../../platform/requestLogger/node/requestLogger';
21+
import { IRequestLogger, LoggedRequestKind } from '../../../platform/requestLogger/node/requestLogger';
2222
import { ISnippyService } from '../../../platform/snippy/common/snippyService';
2323
import { IExperimentationService } from '../../../platform/telemetry/common/nullExperimentationService';
2424
import { ErrorUtils } from '../../../util/common/errors';
@@ -992,20 +992,24 @@ export class NextEditProvider extends Disposable implements INextEditProvider<Ne
992992
}
993993

994994
private async _triggerSpeculativeRequest(suggestion: NextEditResult): Promise<void> {
995-
const logger = this._logger.createSubLogger('_triggerSpeculativeRequest');
996-
997995
const result = suggestion.result;
998996
if (!result?.edit) {
999-
logger.trace('no edit in suggestion result');
1000997
return;
1001998
}
1002999

10031000
const docId = result.targetDocumentId;
10041001
if (!docId) {
1005-
logger.trace('no target document ID in suggestion result');
10061002
return;
10071003
}
10081004

1005+
const logContext = new InlineEditRequestLogContext(docId.uri, 0, undefined);
1006+
1007+
const sw = new StopWatch();
1008+
const logger = this._logger.createSubLogger('_triggerSpeculativeRequest')
1009+
.withExtraTarget(LogTarget.fromCallback((_level, msg) => {
1010+
logContext.trace(`[${Math.floor(sw.elapsed()).toString().padStart(4, ' ')}ms] ${msg}`);
1011+
}));
1012+
10091013
// Compute the post-edit document content
10101014
const postEditContent = result.edit.replace(result.documentBeforeEdits.value);
10111015
const preciseEdit = result.edit.removeCommonSuffixPrefix(result.documentBeforeEdits.value);
@@ -1074,9 +1078,6 @@ export class NextEditProvider extends Disposable implements INextEditProvider<Ne
10741078
return;
10751079
}
10761080

1077-
// Create a speculative request
1078-
// Use a dummy version since this is speculative and we don't have the actual post-edit version
1079-
const logContext = new InlineEditRequestLogContext(docId.uri, 0, undefined);
10801081
const req = new NextEditFetchRequest(`sp-${suggestion.source.opportunityId}`, logContext, undefined, true, `sp-${generateUuid()}`);
10811082

10821083
logger.trace(`triggering speculative request for post-edit state (opportunityId=${req.opportunityId}, headerRequestId=${req.headerRequestId})`);
@@ -1125,11 +1126,13 @@ export class NextEditProvider extends Disposable implements INextEditProvider<Ne
11251126
{ triggeredBySpeculativeRequest, isSubsequentEdit }: { triggeredBySpeculativeRequest: boolean; isSubsequentEdit: boolean },
11261127
parentLogger: ILogger
11271128
): Promise<StatelessNextEditRequest<CachedOrRebasedEdit> | undefined> {
1128-
const logger = parentLogger.createSubLogger('_createSpeculativeRequest');
11291129
const curDocId = doc.id;
11301130

11311131
const recording = this._debugRecorder?.getRecentLog();
11321132
const logContext = req.log;
1133+
logContext.setStatelessNextEditProviderId(this._statelessNextEditProvider.ID);
1134+
1135+
const logger = parentLogger.createSubLogger('_createSpeculativeRequest');
11331136

11341137
const activeDocAndIdx = historyContext.getDocumentAndIdx(curDocId);
11351138
if (!activeDocAndIdx) {
@@ -1213,14 +1216,22 @@ export class NextEditProvider extends Disposable implements INextEditProvider<Ne
12131216
undefined, // providerRequestStartDateTime
12141217
);
12151218

1219+
logContext.setRequestInput(nextEditRequest);
1220+
12161221
logger.trace('starting speculative provider call');
12171222

12181223
// Start the provider call - this runs in the background and populates the cache
1219-
const label = `NES | spec | ${basename(doc.id.toUri().fsPath)} (v${doc.version})`;
1224+
const label = `NES | spec | ${basename(doc.id.toUri().fsPath)} (v${doc.version.get()})`;
12201225

1221-
const capturingToken = new CapturingToken(label, undefined, true, true);
1226+
const capturingToken = new CapturingToken(label, undefined, false, true);
12221227

1223-
void this._requestLogger.captureInvocation(capturingToken, () => this._runSpeculativeProviderCall(nextEditRequest, projectedDocuments, curDocId, req, logger));
1228+
void this._requestLogger.captureInvocation(capturingToken, async () => {
1229+
try {
1230+
await this._runSpeculativeProviderCall(nextEditRequest, projectedDocuments, curDocId, req, logger);
1231+
} finally {
1232+
this._addLogContextEntry(logContext, label);
1233+
}
1234+
});
12241235

12251236
return nextEditRequest;
12261237
}
@@ -1413,6 +1424,19 @@ export class NextEditProvider extends Disposable implements INextEditProvider<Ne
14131424
this._snippyService.handlePostInsertion(docId.toUri(), suggestion.result.documentBeforeEdits, suggestion.result.edit);
14141425
}
14151426

1427+
private _addLogContextEntry(logContext: InlineEditRequestLogContext, debugNameOverride?: string): void {
1428+
if (!logContext.includeInLogTree) {
1429+
return;
1430+
}
1431+
this._requestLogger.addEntry({
1432+
type: LoggedRequestKind.MarkdownContentRequest,
1433+
debugName: debugNameOverride ?? logContext.getDebugName(),
1434+
icon: logContext.getIcon(),
1435+
startTimeMs: logContext.time,
1436+
markdownContent: logContext.toLogDocument(),
1437+
});
1438+
}
1439+
14161440
public clearCache() {
14171441
this._nextEditCache.clear();
14181442
this._rejectionCollector.clear();

0 commit comments

Comments
 (0)