in src/completion/completionProvider.ts [33:126]
public async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, _token: vscode.CancellationToken, _context: vscode.CompletionContext): Promise<vscode.CompletionItem[] | vscode.CompletionList | undefined> {
const documentText: string = document.getText();
const cursorOffset: number = document.offsetAt(position);
const currentNode: ElementNode | undefined = getCurrentNode(documentText, cursorOffset);
if (currentNode === undefined || currentNode.contentStart === undefined) {
return undefined;
}
const targetRange: vscode.Range = new vscode.Range(document.positionAt(currentNode.contentStart), position);
switch (currentNode.tag) {
case XmlTagName.GroupId: {
const siblingNodes: ElementNode[] = _.get(currentNode, "parent.children", []);
const artifactIdNode: ElementNode | undefined = siblingNodes.find(elem => elem.tag === XmlTagName.ArtifactId);
const groupIdHint: string = currentNode.text ? currentNode.text : "";
const artifactIdHint: string = artifactIdNode && artifactIdNode.text ? artifactIdNode.text : "";
const centralItems: vscode.CompletionItem[] = await centralProvider.getGroupIdCandidates(groupIdHint, artifactIdHint);
const indexItems: vscode.CompletionItem[] = await indexProvider.getGroupIdCandidates(groupIdHint, artifactIdHint);
const localItems: vscode.CompletionItem[] = await localProvider.getGroupIdCandidates(groupIdHint, artifactIdHint);
const mergedItems: vscode.CompletionItem[] = this.deDuplicate(centralItems, indexItems, localItems, (item) => item.insertText);
mergedItems.forEach(item => item.range = targetRange);
return new vscode.CompletionList(mergedItems, _.isEmpty(centralItems));
}
case XmlTagName.ArtifactId: {
const siblingNodes: ElementNode[] = _.get(currentNode, "parent.children", []);
const groupIdNode: ElementNode | undefined = siblingNodes.find(elem => elem.tag === XmlTagName.GroupId);
const groupIdHint: string = groupIdNode && groupIdNode.text ? groupIdNode.text : "";
const artifactIdHint: string = currentNode.text ? currentNode.text : "";
const centralItems: vscode.CompletionItem[] = await centralProvider.getArtifactIdCandidates(groupIdHint, artifactIdHint);
const indexItems: vscode.CompletionItem[] = await indexProvider.getArtifactIdCandidates(groupIdHint, artifactIdHint);
const localItems: vscode.CompletionItem[] = await localProvider.getArtifactIdCandidates(groupIdHint, artifactIdHint);
let mergedItems: vscode.CompletionItem[] = [];
const ID_SEPARATOR: string = ":";
// tslint:disable-next-line: restrict-plus-operands
mergedItems = this.deDuplicate(centralItems, indexItems, localItems, (item) => _.get(item, "data.groupId") + ID_SEPARATOR + item.insertText);
mergedItems = this.reserveGidMatch(mergedItems, groupIdHint);
if (groupIdNode && groupIdNode.contentStart !== undefined && groupIdNode.contentEnd !== undefined) {
for (const item of mergedItems) {
const matchedGroupId: string = _.get(item, "data.groupId");
if (matchedGroupId) {
const groupIdRange: vscode.Range = new vscode.Range(document.positionAt(groupIdNode.contentStart), document.positionAt(groupIdNode.contentEnd));
item.additionalTextEdits = [new vscode.TextEdit(groupIdRange, matchedGroupId)];
}
}
}
mergedItems.forEach(item => item.range = targetRange);
return new vscode.CompletionList(mergedItems, _.isEmpty(centralItems));
}
case XmlTagName.Version: {
const siblingNodes: ElementNode[] = _.get(currentNode, "parent.children", []);
const groupIdNode: ElementNode | undefined = siblingNodes.find(elem => elem.tag === XmlTagName.GroupId);
const artifactIdNode: ElementNode | undefined = siblingNodes.find(elem => elem.tag === XmlTagName.ArtifactId);
const groupIdHint: string | undefined = groupIdNode?.text || DEFAULT_GROUP_ID;
const artifactIdHint: string | undefined = artifactIdNode?.text;
if (!groupIdHint || !artifactIdHint) {
return [];
}
const centralItems: vscode.CompletionItem[] = await centralProvider.getVersionCandidates(groupIdHint, artifactIdHint);
const indexItems: vscode.CompletionItem[] = await indexProvider.getVersionCandidates(groupIdHint, artifactIdHint);
const localItems: vscode.CompletionItem[] = await localProvider.getVersionCandidates(groupIdHint, artifactIdHint);
const mergedItems: vscode.CompletionItem[] = this.deDuplicate(centralItems, indexItems, localItems, (item) => item.insertText);
mergedItems.forEach(item => item.range = targetRange);
return new vscode.CompletionList(mergedItems, false);
}
case XmlTagName.Dependencies: {
const snippetItem: vscode.CompletionItem = new vscode.CompletionItem("dependency", vscode.CompletionItemKind.Snippet);
const snippetContent: string = trimBrackets(dependencySnippetString, documentText, cursorOffset);
const dependencySnippet: vscode.SnippetString = new vscode.SnippetString(snippetContent);
snippetItem.insertText = dependencySnippet;
snippetItem.detail = "Maven Snippet";
snippetItem.command = {
title: "selected", command: COMMAND_COMPLETION_ITEM_SELECTED,
arguments: [{ completeFor: "dependency", source: "snippet" }]
};
return new vscode.CompletionList([snippetItem], false);
}
case XmlTagName.Plugins: {
const snippetItem: vscode.CompletionItem = new vscode.CompletionItem("plugin", vscode.CompletionItemKind.Snippet);
const snippetContent: string = trimBrackets(pluginSnippetString, documentText, cursorOffset);
const pluginSnippet: vscode.SnippetString = new vscode.SnippetString(snippetContent);
snippetItem.insertText = pluginSnippet;
snippetItem.detail = "Maven Snippet";
snippetItem.command = {
title: "selected", command: COMMAND_COMPLETION_ITEM_SELECTED,
arguments: [{ completeFor: "plugin", source: "snippet" }]
};
return new vscode.CompletionList([snippetItem], false);
}
default:
return undefined;
}
}