public async Task <CompletionList> Handle(CompletionParams request, CancellationToken cancellationToken) { router.Window.LogInfo("completion request"); (var code, var lines, var tree) = bufferManager.Get(request.TextDocument.Uri.ToString()); var table = bufferManager.GetTable(request.TextDocument.Uri.ToString()); int c = request.Position.Character; int l = request.Position.Line; if (lines == null) { return(new CompletionList()); } string token = lines[l][c].ToString(); int i = GetChar(l, c, code); router.Window.LogInfo(i.ToString()); var context = tree.GetFirstAtChar(i); router.Window.LogInfo(tree.ToString()); router.Window.LogInfo(i.ToString()); router.Window.LogInfo(context.ToString()); //creating items List <CompletionItem> items = new List <CompletionItem>(); if (context is FileContext) { items.Add(CreateKeyword("namespace ")); items.Add(CreateKeyword("using ")); items.Add(CreateKeyword("class ")); } else if (context is ClassBodyContext) { items.Add(CreateKeyword("var ")); items.Add(CreateKeyword("def ")); items.Add(CreateKeywordDrop("public:\n\t", request.Position)); items.Add(CreateKeywordDrop("private:\n\t", request.Position)); items.Add(CreateKeywordDrop("internal:\n\t", request.Position)); } else { GetMembers(table, items); } return(items); }