public SignatureHelpProcessor(ISymbolGuesser symbolGuesser, DafnyDocument document, SignatureHelpParams request, CancellationToken cancellationToken)
 {
     _symbolGuesser     = symbolGuesser;
     _document          = document;
     _request           = request;
     _cancellationToken = cancellationToken;
 }
Example #2
0
        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()));
        }
Example #5
0
        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());
        }
Example #6
0
        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
            });
        }
Example #8
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
            });
        }
Example #10
0
 public static Task <SignatureHelp> SignatureHelp(this ILanguageClientDocument mediator, SignatureHelpParams @params, CancellationToken cancellationToken = default)
 {
     return(mediator.SendRequest(@params, cancellationToken));
 }
Example #11
0
        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));
        }
Example #12
0
    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)
 {
Example #14
0
 public override Task <SignatureHelp> Handle(SignatureHelpParams request, CancellationToken cancellationToken) => _handler.Invoke(request, cancellationToken);
Example #15
0
 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));
 }
Example #17
0
        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);
        }
Example #19
0
 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));
        }