public async Task <CompletionList> Handle(CompletionParams request, CancellationToken cancellationToken) { var text = _workspaceService.GetMarineFileBuffer(request.TextDocument.Uri.Path); var tokens = new LexicalAnalyzer().GetTokens(text); var result = new SyntaxAnalyzer().Parse(tokens); var tasks = new List <Task <IEnumerable <CompletionItem> > >(); FuncDefinitionAst currentFuncDefAst = null; if (result.programAst != null) { currentFuncDefAst = await Task.Run(() => GetCurrentFunctionAst(result.programAst, request.Position), cancellationToken); if (currentFuncDefAst != null) { tasks.Add(Task.Run(() => CreateFunctions(result.programAst), cancellationToken)); tasks.Add(Task.Run(() => CreateFunctionParamaters(currentFuncDefAst), cancellationToken)); tasks.Add(Task.Run(() => CreateVariables(currentFuncDefAst, request.Position), cancellationToken)); tasks.Add(Task.Run(CreateKeywords, cancellationToken)); } } tasks.Add(Task.Run(() => CreateSnippets(currentFuncDefAst), cancellationToken)); return(new CompletionList((await Task.WhenAll(tasks)).SelectMany(e => e))); }