Path: blob/main/extensions/copilot/src/extension/prompt/node/test2Impl.tsx
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { PromptElement, PromptElementProps, PromptSizing } from '@vscode/prompt-tsx';6import assert from 'assert';7import type * as vscode from 'vscode';8import { IIgnoreService } from '../../../platform/ignore/common/ignoreService';9import { IWorkspaceService } from '../../../platform/workspace/common/workspaceService';10import { CancellationToken } from '../../../util/vs/base/common/cancellation';11import { URI } from '../../../util/vs/base/common/uri';12import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';13import { ITestGenInfo } from '../../intents/node/testIntent/testInfoStorage';14import { Tag } from '../../prompts/node/base/tag';15import { DocumentSummarizer } from '../../prompts/node/inline/summarizedDocument/summarizeDocumentHelpers';16import { CodeBlock } from '../../prompts/node/panel/safeElements';17import { PromptReference } from '../common/conversation';18import { IDocumentContext } from './documentContext';19import { TestFileFinder, isTestFile } from './testFiles';2021type Props = PromptElementProps<{22/**23* Document here is expected to be a test file.24*/25documentContext: IDocumentContext;26/**27* Src (ie impl) file to include if already known.28*/29srcFile?: ITestGenInfo;30}>;3132/**33* @remark Respects copilot-ignore.34*/35export class Test2Impl extends PromptElement<Props> {3637constructor(38props: Props,39@IInstantiationService private readonly instaService: IInstantiationService,40@IIgnoreService private readonly ignoreService: IIgnoreService,41@IWorkspaceService private readonly workspaceService: IWorkspaceService,42) {43super(props);44}4546override async render(state: void, sizing: PromptSizing) {4748const { documentContext, srcFile, } = this.props;4950assert(isTestFile(documentContext.document), 'Test2Impl must be invoked on a test file.');5152let candidateFile: URI | undefined;53let selection: vscode.Range | undefined;5455if (srcFile) {56candidateFile = srcFile.uri;57selection = srcFile.target;58} else {59// @ulugbekna: find file that this test file corresponds to60const finder = this.instaService.createInstance(TestFileFinder);61candidateFile = await finder.findFileForTestFile(documentContext.document, CancellationToken.None);62}6364if (candidateFile === undefined || await this.ignoreService.isCopilotIgnored(candidateFile)) {65return undefined;66}6768const doc = await this.workspaceService.openTextDocumentAndSnapshot(candidateFile);6970const docSummarizer = this.instaService.createInstance(DocumentSummarizer);7172const summarizedDoc = await docSummarizer.summarizeDocument(73doc,74documentContext.fileIndentInfo,75selection,76sizing.tokenBudget,77);7879const references = [new PromptReference(candidateFile)];8081return (82<Tag name='codeToTest' priority={this.props.priority}>83<references value={references} />84Below is the file located at {candidateFile.path}:<br />85<CodeBlock86code={summarizedDoc.text}87uri={candidateFile}88languageId={documentContext.document.languageId}89/>90</Tag>91);92}9394}959697