in experimental/adaptive-tool/server/lu/src/providers/completion.ts [32:178]
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.isLuFile(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 (/\[[^\]]*\]\([^)]*$/.test(curLineContent)) {
// []() import suggestion
const paths = Array.from(new Set(LuFilesStatus.luFilesOfWorkspace));
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.isEntityType(curLineContent)) {
// const entityTypes: string[] = EntityTypesObj.EntityType;
// entityTypes.forEach(entity => {
// const item = {
// label: entity,
// kind: CompletionItemKind.Keyword,
// insertText: `${entity}`,
// documentation: `Enitity type: ${entity}`,
// };
// completionList.push(item);
// });
// }
if (matchingPattern.isPrebuiltEntity(curLineContent)) {
const prebuiltTypes: string[] = EntityTypesObj.Prebuilt;
prebuiltTypes.forEach(entity => {
const item = {
label: entity,
kind: CompletionItemKind.Keyword,
insertText: `${entity}`,
documentation: `Prebuilt enitity: ${entity}`,
};
completionList.push(item);
});
}
if (matchingPattern.isRegexEntity(curLineContent)) {
const item = {
label: 'RegExp Entity',
kind: CompletionItemKind.Keyword,
insertText: `//`,
documentation: `regex enitity`,
};
completionList.push(item);
}
if (matchingPattern.isEntityName(curLineContent)) {
const item = {
label: 'hasRoles?',
kind: CompletionItemKind.Keyword,
insertText: `hasRoles`,
documentation: `Entity name hasRole?`,
};
completionList.push(item);
const item2 = {
label: 'usesFeature?',
kind: CompletionItemKind.Keyword,
insertText: `usesFeature`,
documentation: `Entity name usesFeature?`,
};
completionList.push(item2);
}
if (matchingPattern.isPhraseListEntity(curLineContent)) {
const item = {
label: 'interchangeable synonyms?',
kind: CompletionItemKind.Keyword,
insertText: `interchangeable`,
documentation: `interchangeable synonyms as part of the entity definition`,
};
completionList.push(item);
}
if (matchingPattern.isEntityType(curLineContent)) {
// @ can be followed by entity like ml, regex or entity
const entityTypes: string[] = EntityTypesObj.EntityType;
entityTypes.forEach(entity => {
const item = {
label: entity,
kind: CompletionItemKind.Keyword,
insertText: `${entity}`,
documentation: `Enitity type: ${entity}`,
};
completionList.push(item);
});
return extractLUISContent(fullContent).then(
luisJson => {
if (!luisJson) {
return extractLUISContent(textExceptCurLine).then(
newluisJson => {
return addEntities(newluisJson, completionList);}
);
} else {
return addEntities(luisJson, completionList);
}
}
);
}
// completion for entities and patterns, use the text without current line due to usually it will cause parser errors, the luisjson will be undefined
if (completionList.length === 0){
return extractLUISContent(fullContent).then(
luisJson => {
if (!luisJson) {
extractLUISContent(textExceptCurLine).then(
newluisJson => {
return processSuggestions(newluisJson, curLineContent, fullContent);}
)
} else {
return processSuggestions(luisJson, curLineContent, fullContent)
}
}
);
}
return completionList;
}