public SignatureHelpProcessor(ISymbolGuesser symbolGuesser, DafnyDocument document, SignatureHelpParams request, CancellationToken cancellationToken) { _symbolGuesser = symbolGuesser; _document = document; _request = request; _cancellationToken = cancellationToken; }
public async Task <SignatureHelp> Handle(SignatureHelpParams signatureHelpParams, CancellationToken token) { return(await Task.Run(() => { var def = new SignatureHelp(); if (_languageServer.LastParse == null) { return def; } var script = _languageServer.LastParse.ScriptFromUri(signatureHelpParams.TextDocument.Uri.ToUri()); if (script == null) { return def; } // Get all signatures in the file. OverloadChooser signature = script.GetSignatures() // Only get the ranges that have the caret inside them. .Where(sig => sig.CallRange.IsInside(signatureHelpParams.Position)) // Order by the size of the ranges. .OrderBy(sig => sig.CallRange) // Choose the first signature. .FirstOrDefault(); if (signature != null) { return signature.GetSignatureHelp(signatureHelpParams.Position); } return def; })); }
public Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken token) { var(document, position) = _workspace.GetLogicalDocument(request); var signatureHelpService = _workspace.Services.GetService <SignatureHelpService>(); return(signatureHelpService.GetResultAsync(document, position, token)); }
public override Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { DafnyDocument?document; if (!_documents.TryGetDocument(request.TextDocument, out document)) { _logger.LogWarning("location requested for unloaded document {}", request.TextDocument.Uri); return(Task.FromResult(new SignatureHelp())); } return(Task.FromResult(new SignatureHelpProcessor(_symbolGuesser, document, request, cancellationToken).Process())); }
public async override Task <SignatureHelp?> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { var document = await documents.GetDocumentAsync(request.TextDocument); if (document == null) { logger.LogWarning("location requested for unloaded document {DocumentUri}", request.TextDocument.Uri); return(null); } return(new SignatureHelpProcessor(symbolGuesser, document, request, cancellationToken).Process()); }
public async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { _logger.LogDebug("SignatureHelp request canceled for file: {0}", request.TextDocument.Uri); return(new SignatureHelp()); } ScriptFile scriptFile = _workspaceService.GetFile(request.TextDocument.Uri); ParameterSetSignatures parameterSets = await _symbolsService.FindParameterSetsInFileAsync( scriptFile, (int)request.Position.Line + 1, (int)request.Position.Character + 1, _powerShellContextService).ConfigureAwait(false); if (parameterSets == null) { return(new SignatureHelp()); } var signatures = new SignatureInformation[parameterSets.Signatures.Length]; for (int i = 0; i < signatures.Length; i++) { var parameters = new List <ParameterInformation>(); foreach (ParameterInfo param in parameterSets.Signatures[i].Parameters) { parameters.Add(CreateParameterInfo(param)); } signatures[i] = new SignatureInformation { Label = parameterSets.CommandName + " " + parameterSets.Signatures[i].SignatureText, Documentation = null, Parameters = parameters, }; } return(new SignatureHelp { Signatures = signatures, ActiveParameter = null, ActiveSignature = 0 }); }
public async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { ScriptFile scriptFile = _workspaceService.GetFile( request.TextDocument.Uri.ToString()); ParameterSetSignatures parameterSets = await _symbolsService.FindParameterSetsInFileAsync( scriptFile, (int)request.Position.Line + 1, (int)request.Position.Character + 1, _powerShellContextService); SignatureInformation[] signatures = s_emptySignatureResult; if (parameterSets != null) { signatures = new SignatureInformation[parameterSets.Signatures.Length]; for (int i = 0; i < signatures.Length; i++) { var parameters = new ParameterInformation[parameterSets.Signatures[i].Parameters.Count()]; int j = 0; foreach (ParameterInfo param in parameterSets.Signatures[i].Parameters) { parameters[j] = CreateParameterInfo(param); j++; } signatures[i] = new SignatureInformation { Label = parameterSets.CommandName + " " + parameterSets.Signatures[i].SignatureText, Documentation = null, Parameters = parameters, }; } } return(new SignatureHelp { Signatures = signatures, ActiveParameter = null, ActiveSignature = 0 }); }
public override Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { log.LogDebug($"SignatureHelp requested at {request.Position.ToLineChr()}."); var rhetosDocument = rhetosWorkspace.GetRhetosDocument(request.TextDocument.Uri); if (rhetosDocument == null) { return(Task.FromResult <SignatureHelp>(null)); } var signatures = rhetosDocument.GetSignatureHelpAtPosition(request.Position.ToLineChr()); if (signatures.signatures == null) { return(Task.FromResult <SignatureHelp>(null)); } ParameterInformation FromRhetosParameter(ConceptMember conceptMember) => new ParameterInformation() { Documentation = "", Label = new ParameterInformationLabel(ConceptInfoType.ConceptMemberDescription(conceptMember)) }; SignatureInformation FromRhetosSignature(RhetosSignature rhetosSignature) => new SignatureInformation() { Documentation = rhetosSignature.Documentation, Label = rhetosSignature.Signature, Parameters = new Container <ParameterInformation>(rhetosSignature.Parameters.Select(FromRhetosParameter)) }; var signatureHelp = new SignatureHelp() { Signatures = new Container <SignatureInformation>(signatures.signatures.Select(FromRhetosSignature)), ActiveSignature = signatures.activeSignature ?? 100, ActiveParameter = signatures.activeParameter ?? 100 }; return(Task.FromResult(signatureHelp)); }
public override async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken token) { var omnisharpRequest = new SignatureHelpRequest { FileName = Helpers.FromUri(request.TextDocument.Uri), Column = Convert.ToInt32(request.Position.Character), Line = Convert.ToInt32(request.Position.Line) }; var omnisharpResponse = await _signatureHandler.Handle(omnisharpRequest); if (omnisharpResponse == null || !omnisharpResponse.Signatures.Any()) { return(null); } var containerSignatures = omnisharpResponse.Signatures.Select(x => new SignatureInformation { Documentation = x.Documentation, Label = x.Label, Parameters = new Container <ParameterInformation>(x.Parameters.Select(param => new ParameterInformation { Documentation = param.Documentation, Label = param.Label })) }); var signatures = new Container <SignatureInformation>(containerSignatures); return(new SignatureHelp { ActiveParameter = omnisharpResponse.ActiveParameter, ActiveSignature = omnisharpResponse.ActiveSignature, Signatures = signatures }); }
public static Task <SignatureHelp> SignatureHelp(this ILanguageClientDocument mediator, SignatureHelpParams @params, CancellationToken cancellationToken = default) { return(mediator.SendRequest(@params, cancellationToken)); }
public override Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { var currentHash = Hash.StringHash(request.TextDocument.Uri.GetFileSystemPath()); var pos = request.Position; TreeSitter.GetSignature(currentHash, pos.Line, pos.Character, out var signatureArrayPtr, out var parameterCount, out var activeParameter, out var errorCount, out var errorRanges); if (signatureArrayPtr.ToInt64() == 0) { return(Task.FromResult(new SignatureHelp())); } var signaturePtr = System.Runtime.InteropServices.Marshal.ReadIntPtr(signatureArrayPtr); var signature = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(signaturePtr); SignatureInformation info = new SignatureInformation(); info.Label = signature; var paramList = new List <ParameterInformation>(); if (parameterCount > 0) { for (int i = 0; i < parameterCount; i++) { var paramInfo = new ParameterInformation(); var paramPtr = System.Runtime.InteropServices.Marshal.ReadIntPtr(signatureArrayPtr + 8 * (i + 1));; paramInfo.Label = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(paramPtr); paramList.Add(paramInfo); } } info.Parameters = new Container <ParameterInformation>(paramList); SignatureHelp help = new SignatureHelp(); help.Signatures = new Container <SignatureInformation>(info); help.ActiveParameter = activeParameter; help.ActiveSignature = 0; if (errorCount > 0) { List <Diagnostic> diagnostics = new List <Diagnostic>(); PublishDiagnosticsParams diagnosticsParams = new PublishDiagnosticsParams(); diagnosticsParams.Uri = request.TextDocument.Uri; unsafe { for (int i = 0; i < errorCount; i++) { Range * errors = (Range *)errorRanges; var error = errors[i]; Diagnostic diagnostic = new Diagnostic(); diagnostic.Message = "Extra argument"; diagnostic.Range = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Range( new Position(error.startLine, error.startCol), new Position(error.endLine, error.endCol)); diagnostics.Add(diagnostic); } } diagnoser.Add(request.TextDocument.Uri, 1, diagnostics); } else { diagnoser.Add(request.TextDocument.Uri, 1, new List <Diagnostic>()); } return(Task.FromResult(help)); }
public async Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { var documentPath = DocumentUri.GetFileSystemPath(request.TextDocument.Uri); if (string.IsNullOrEmpty(documentPath)) { return(new SignatureHelp()); } var(rootScope, tc) = buffers.GetScope(documentPath); if (rootScope == null) { return(new SignatureHelp()); } var scope = GetCurrentScope(rootScope, (int)request.Position.Character, (int)request.Position.Line, documentPath); var text = buffers.GetBuffer(documentPath); var charIdx = (int)request.Position.Character; var lineIdx = (int)request.Position.Line; var lines = text.Split(System.Environment.NewLine); var line = default(string); if (lineIdx >= 0 && lineIdx < lines.Length) { line = lines[lineIdx]; } if (line == null) { return(new SignatureHelp()); } charIdx = System.Math.Clamp(charIdx, 0, line.Length - 1); int activeParam = 0; while (charIdx >= 0 && line[charIdx] != '(') { if (line[charIdx] == ',') { activeParam++; } charIdx--; } if (charIdx >= 0 && charIdx < line.Length) { if (line[charIdx] == '(') { charIdx--; } } List <string> query = new List <string>(); while (true) { var current = ""; while (charIdx >= 0 && Token.isIdentifierChar(line[charIdx])) { current = line[charIdx] + current; charIdx--; } if (string.IsNullOrWhiteSpace(current)) { break; } else { query.Add(current); } while (charIdx >= 0 && char.IsWhiteSpace(line[charIdx])) { charIdx--; } if (charIdx <= 0 || line[charIdx] != '.') { break; } charIdx--; } List <string> modPath = new List <string>(); if (line.ElementAtOrDefault(charIdx) == ':' && line.ElementAtOrDefault(charIdx - 1) == ':') { charIdx -= 2; while (true) { var current = ""; while (charIdx >= 0 && Token.isIdentifierChar(line[charIdx])) { current = line[charIdx] + current; charIdx--; } if (string.IsNullOrWhiteSpace(current)) { break; } else { modPath.Add(current); } while (charIdx >= 0 && char.IsWhiteSpace(line[charIdx])) { charIdx--; } if (charIdx <= 1 || line[charIdx] != ':' || line[charIdx - 1] != ':') { break; } charIdx -= 2; } } if (query.Count > 0) { Scope.OverloadedVariableDefinition vd = null; FrontendStructType st = null; for (int i = query.Count - 1; i >= 0; --i) { var current = query[i]; FrontendType vt; if (i == query.Count - 1) { if (modPath.Count > 0) { scope = scope.GetModule(modPath)?.scope; if (scope == null) { break; } } if (i == 0) { vd = scope.GetVar(current, Token.Undefined); } else { var v = scope.GetVar(current, Token.Undefined)?.First; if (v == null) { st = null; break; } if (v.node == null) { vt = v.type; } else { vt = tc.GetNodeType(v.node); } st = vt as FrontendStructType; if (st == null && vt is FrontendPointerType pt) { st = pt.elementType as FrontendStructType; } if (st == null) { break; } } } else { if (i == 0) { vd = scope.GetVar(current, Token.Undefined); } else { var f = st.fields.Where(f => f.name == current).FirstOrDefault(); if (f == null) { st = null; break; } vt = f.type; st = vt as FrontendStructType; if (st == null && vt is FrontendPointerType pt) { st = pt.elementType as FrontendStructType; } if (st == null) { break; } } } } if (vd != null) { var infos = new List <SignatureInformation>(); foreach (var v in vd.variables) { FrontendFunctionType ft; if (v.node == null) { ft = v.type as FrontendFunctionType; } else { ft = tc.GetNodeType(v.node) as FrontendFunctionType; } if (ft != null) { var info = new SignatureInformation(); var parameInfos = new List <ParameterInformation>(); var funName = ft.funName; if (string.IsNullOrEmpty(funName)) { funName = v.name; } var funString = $"{funName}("; for (int i = 0; i < ft.parameters.Count; ++i) { var p = ft.parameters[i]; var paramString = $"{p.name}: {p.type}"; parameInfos.Add( new ParameterInformation() { Label = paramString, } ); funString += paramString; if (i < ft.parameters.Count - 1) { funString += "; "; } } funString += $") => {ft.returnType}"; info.Label = funString; info.Parameters = parameInfos; infos.Add(info); } } var result = new SignatureHelp { ActiveParameter = activeParam, Signatures = new Container <SignatureInformation>(infos) }; return(result); } } return(new SignatureHelp()); }
public override Task <SignatureHelp?> Handle(SignatureHelpParams request, CancellationToken cancellationToken) {
public override Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) => _handler.Invoke(request, cancellationToken);
public abstract Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken);
public static Task <SignatureHelp> SignatureHelp(this ILanguageClientDocument mediator, SignatureHelpParams @params) { return(mediator.SendRequest <SignatureHelpParams, SignatureHelp>(DocumentNames.SignatureHelp, @params)); }
public override RpcResult SignatureHelp(SignatureHelpParams args) { BHLSPWorkspace.self.TryAddDocument(args.textDocument.uri); if (BHLSPWorkspace.self.FindDocument(args.textDocument.uri) is BHLTextDocument document) { int line = (int)args.position.line; int character = (int)args.position.character; int start = document.GetIndex(line); int stop = document.GetIndex(line, character); var text = document.text; var txtLine = text.Substring(start, stop - start); string funcName = string.Empty; uint activeParameter = 0; if (txtLine.IndexOf("func", StringComparison.Ordinal) == -1) { string pattern = @"[a-zA-Z_][a-zA-Z_0-9]*\({1}.*?"; MatchCollection matches = Regex.Matches(txtLine, pattern, RegexOptions.Multiline); for (int i = matches.Count - 1; i >= 0; i--) { var m = matches[i]; if (m.Index < character) { string v = m.Value; int len = v.Length - 1; if (len > 0) { funcName = txtLine.Substring(m.Index, len); var funcDeclStr = txtLine.Substring(m.Index, Math.Max(0, character - m.Index)); activeParameter = (uint)Math.Max(0, funcDeclStr.Split(',').Length - 1); break; } } } } bhlParser.FuncDeclContext funcDecl = null; if (!string.IsNullOrEmpty(funcName)) { foreach (var doc in BHLSPWorkspace.self.ForEachBhlImports(document)) { if (doc.FuncDecls.ContainsKey(funcName)) { funcDecl = doc.FuncDecls[funcName]; break; } } } if (funcDecl != null) { SignatureInformation signInfo = GetFuncSignInfo(funcDecl); signInfo.activeParameter = activeParameter; var result = new SignatureHelp(); result.activeSignature = 0; result.signatures = new[] { signInfo }; result.activeParameter = signInfo.activeParameter; return(RpcResult.Success(result)); } } return(RpcResult.Success()); }
public Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { var doc = bufferManager.GetBuffer(request.TextDocument.Uri.AbsolutePath); if (doc == null) { return(null); } var line = doc.GetMethodCall(request.Position).Trim(); if (rxFuncDef.IsMatch(line)) { return(null); } var contextLine = line; contextLine = rxStringValues.Replace(contextLine, ""); var oldLen = -1; while (contextLine.Length != oldLen) { oldLen = contextLine.Length; contextLine = rxFuncCall.Replace(contextLine, ""); } var idxOfParen = contextLine.LastIndexOf('('); if (idxOfParen < 0) { return(NullSignatureHelp); } string word = null; for (var i = idxOfParen - 1; i > 0; i--) { var c = contextLine[i]; if (!BufferedDocument.IsIdentifier(c)) { var start = i + 1; word = contextLine.Substring(start, idxOfParen - start); break; } } if (word == null) { word = contextLine.Substring(0, idxOfParen); } word = word.Trim(); var sigCtx = contextLine.Substring(idxOfParen + 1); var func = (Function)documentsManager.GetGlobalSymbols() .FirstOrDefault(x => x is Function && x.Name.Equals(word, StringComparison.OrdinalIgnoreCase)); if (func != null) { var signatureHelp = new SignatureHelp { Signatures = new Container <SignatureInformation>(new SignatureInformation { Label = func.ToString(), Parameters = new Container <ParameterInformation>(func.Parameters.Select(x => new ParameterInformation { Label = x.ToString(), })), Documentation = func.Documentation, }), ActiveParameter = sigCtx.Count(x => x == ','), ActiveSignature = 0 }; return(Task.FromResult(signatureHelp)); } return(NullSignatureHelp); }
public abstract RpcResult SignatureHelp(SignatureHelpParams args);
public Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) { try { var scriptFile = _projectManager.GetScriptForFilePath(request.TextDocument.Uri.ToFilePath()); if (scriptFile == null) { return(Task.FromResult <SignatureHelp>(null)); } var requestPosition = request.Position.ToPosition(); var functionCallExpression = scriptFile.Node.GetDescendantNodeOfTypeAtPosition <FunctionCallExpressionNode>(requestPosition); if (functionCallExpression == null) { return(Task.FromResult <SignatureHelp>(null)); } var functionSymbol = functionCallExpression.Identifier.GetDeclaredOrReferencedSymbol(); if (functionSymbol == null) { return(Task.FromResult <SignatureHelp>(null)); } var activeParameterIndex = functionCallExpression.GetFunctionParameterIndexAtPosition(requestPosition); var displayTextEmitter = new DisplayTextEmitter(); var displayText = functionSymbol is FunctionSymbol asFunctionSymbol? displayTextEmitter.GetDisplayTextForFunction(asFunctionSymbol) : functionSymbol is EventSymbol asEventSymbol? displayTextEmitter.GetDisplayTextForEvent(asEventSymbol) : null; if (displayText == null) { return(Task.FromResult <SignatureHelp>(null)); } return(Task.FromResult(new SignatureHelp() { ActiveParameter = activeParameterIndex, Signatures = new SignatureInformation[] { new SignatureInformation() { Documentation = displayText.Documentation, Label = $"{displayText.ShortNamePrefix}({displayText.Parameters.Select(p => p.Text).Join(", ")})", Parameters = displayText.Parameters.Select(p => new ParameterInformation() { Label = p.Text }).ToArray() } } })); } catch (Exception e) { _logger.LogWarning(e, "Error while handling request."); } return(Task.FromResult <SignatureHelp>(null)); }