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;
}