async provideCompletionItems()

in src/issues/userCompletionProvider.ts [20:95]


	async provideCompletionItems(
		document: vscode.TextDocument,
		position: vscode.Position,
		token: vscode.CancellationToken,
		context: vscode.CompletionContext,
	): Promise<vscode.CompletionItem[]> {
		// If the suggest was not triggered by the trigger character, require that the previous character be the trigger character
		if (
			document.languageId !== 'scminput' &&
			document.uri.scheme !== NEW_ISSUE_SCHEME &&
			position.character > 0 &&
			context.triggerKind === vscode.CompletionTriggerKind.Invoke &&
			document.getText(new vscode.Range(position.with(undefined, position.character - 1), position)) !== '@'
		) {
			return [];
		}

		// If the suggest was not triggered  by the trigger character and it's in a new issue file, make sure it's on the Assignees line.
		if (
			(document.uri.scheme === NEW_ISSUE_SCHEME) &&
			(context.triggerKind === vscode.CompletionTriggerKind.Invoke) &&
			(document.getText(new vscode.Range(position.with(undefined, 0), position.with(undefined, ASSIGNEES.length))) !== ASSIGNEES)
		) {
			return [];
		}

		if (
			context.triggerKind === vscode.CompletionTriggerKind.TriggerCharacter &&
			vscode.workspace
				.getConfiguration(ISSUES_CONFIGURATION)
				.get<string[]>('ignoreUserCompletionTrigger', [])
				.find(value => value === document.languageId)
		) {
			return [];
		}

		if (document.languageId !== 'scminput' && !(await isComment(document, position))) {
			return [];
		}

		let range: vscode.Range = new vscode.Range(position, position);
		if (position.character - 1 >= 0) {
			const wordAtPos = document.getText(new vscode.Range(position.translate(0, -1), position));
			if (wordAtPos === '@') {
				range = new vscode.Range(position.translate(0, -1), position);
			}
		}
		const uri =
			document.uri.scheme === NEW_ISSUE_SCHEME
				? extractIssueOriginFromQuery(document.uri) ?? document.uri
				: document.languageId === 'scminput'
					? getRootUriFromScmInputUri(document.uri)
					: document.uri;
		if (!uri) {
			return [];
		}

		const repoUri = this.manager.getManagerForFile(uri)?.repository.rootUri ?? uri;

		const completionItems: vscode.CompletionItem[] = [];
		(await this.stateManager.getUserMap(repoUri)).forEach(item => {
			const completionItem: UserCompletion = new UserCompletion(
				{ label: item.login, description: item.name }, vscode.CompletionItemKind.User);
			completionItem.insertText = `@${item.login}`;
			completionItem.login = item.login;
			completionItem.uri = repoUri;
			completionItem.range = range;
			completionItem.detail = item.name;
			completionItem.filterText = `@ ${item.login} ${item.name}`;
			if (document.uri.scheme === NEW_ISSUE_SCHEME) {
				completionItem.commitCharacters = [' ', ','];
			}
			completionItems.push(completionItem);
		});
		return completionItems;
	}