export function provideCompletionItems()

in experimental/adaptive-tool/server/qna/src/providers/completion.ts [29:169]


export function provideCompletionItems(_textDocumentPosition: TextDocumentPositionParams, documents: TextDocuments<TextDocument>) {
	const document = documents.get(_textDocumentPosition.textDocument.uri)!;
	const fspath = Files.uriToFilePath(document.uri);
	const position = _textDocumentPosition.position;
	const curLineContent = document?.getText({
		start: {
			line: position.line,
			character: 0
		},
		end: position
	}).toString();

	if (!util.isQnaFile(path.basename(document.uri)))
		return [];

	const fullContent = document.getText();
	const lines = fullContent.split('\n');
	const textExceptCurLine = lines
		.slice(0, position.line)
		.concat(lines.slice(position.line + 1))
		.join('\n');

	const completionList: CompletionItem[] = [];

	if (matchingPattern.isImport(curLineContent)) {
		// []() import suggestion
		const paths = Array.from(new Set(QnaFilesStatus.qnaFilesOfWorkspace));

		return paths.filter(u => u !== fspath).reduce((prev: any[], curr: string) => {
			const relativePath = path.relative(path.dirname(fspath!), curr);
			const item = {
				label: relativePath,
				kind: CompletionItemKind.Reference,
				detail: curr
			};
			prev.push(item);
			return prev;
		}, []);
	}

	if (matchingPattern.isHash(curLineContent)) {
		const item = {
			label: `#?`,
			kind: CompletionItemKind.Keyword,
			insertText: `? `,
			documentation: '',
		};

		completionList.push(item);
	}

	if (matchingPattern.isFiltersOrPrompts(curLineContent)) {
		const item1 = {
			label: `**Prompts:**`,
			kind: CompletionItemKind.Property,
			insertText: `Prompts:**`,
			documentation: 'add prompts',
		};

		completionList.push(item1);

		const item2 = {
			label: `**Filters:**`,
			kind: CompletionItemKind.Property,
			insertText: `Filters:**`,
			documentation: 'add filters',
		};

		completionList.push(item2);
	}

	if (matchingPattern.isId(curLineContent)) {
		const item = {
			label: `<a id = ""></a>`,
			kind: CompletionItemKind.Keyword,
			insertText: `a id = ""></a>`,
			documentation: 'add id for QA pair',
		};

		completionList.push(item);
	}

	if (matchingPattern.isAnswer(curLineContent)) {
		const item = {
			label: `answer placeholder`,
			kind: CompletionItemKind.Keyword,
			insertText: `\n\`\`\``,
			documentation: 'answer placeholder',
		};

		completionList.push(item);
	}

	if (matchingPattern.isQASourceOrKBName(curLineContent)) {
		const item1 = {
			label: `@qna.pair.source = `,
			kind: CompletionItemKind.Property,
			insertText: `qna.pair.source = `,
			documentation: 'add QA pair source',
		};

		completionList.push(item1);

		const item2 = {
			label: `@kb.name = `,
			kind: CompletionItemKind.Property,
			insertText: `kb.name = `,
			documentation: 'add knowledge base name',
		};

		completionList.push(item2);
	}

	if (matchingPattern.isContextOnly(curLineContent)) {
		const item = {
			label: `\`context-only\``,
			kind: CompletionItemKind.Keyword,
			insertText: `\`context-only\``,
			documentation: 'context-only mark',
		};

		completionList.push(item);
	}

	if (matchingPattern.isMultiturnReference(curLineContent)) {
		return extractQnAContent(fullContent).then(
			qnaJson => {
				if (!qnaJson) {
					return extractQnAContent(textExceptCurLine).then(
						newQnaJson => {
							return curLineContent.endsWith('?') ? addQuestions(newQnaJson, completionList) : addIds(newQnaJson, completionList);
						});
				} else {
					return curLineContent.endsWith('?') ? addQuestions(qnaJson, completionList) : addIds(qnaJson, completionList);
				}
			}
		);
	}

	return completionList;
}