// https://microsoft.github.io/language-server-protocol/specification#textDocument_hover static string GetHover(string json) { dynamic inputJson = JsonConvert.DeserializeObject(json); string document = inputJson.textDocument; int line = inputJson.caret.line; int character = inputJson.caret.character; Pos caret = new Pos(line, character); var parser = ParserData.GetParser(document, new Parse.Pos(caret.line, caret.character)); Hover hover = null; if (parser.Success && parser.Bav.SelectedNode.Count > 0) { switch (parser.Bav.SelectedNode[0]) { case MethodNode methodNode: var type = Translate.GetMethodType(parser.UserMethods, methodNode.Name); if (type == null) { hover = null; } Parameter[] parameters; if (type == Translate.MethodType.Method) { parameters = Element.GetMethod(methodNode.Name).GetCustomAttributes <Parameter>() .ToArray(); } else if (type == Translate.MethodType.CustomMethod) { parameters = CustomMethods.GetCustomMethod(methodNode.Name).GetCustomAttributes <Parameter>() .ToArray(); } else if (type == Translate.MethodType.UserMethod) { parameters = UserMethod.GetUserMethod(parser.UserMethods, methodNode.Name).Parameters; } else { parameters = null; } if (parameters != null) { hover = new Hover(new MarkupContent(MarkupContent.Markdown, methodNode.Name + "(" + Parameter.ParameterGroupToString(parameters) + ")")) { range = methodNode.Range } } ; break; default: hover = null; break; } } return(JsonConvert.SerializeObject(hover)); }