Пример #1
0
        public Task <Hover> Handle(HoverParams request, CancellationToken cancellationToken)
        {
            try
            {
                var scriptFile = _projectManager.GetScriptForFilePath(request.TextDocument.Uri.ToFilePath());
                if (scriptFile == null)
                {
                    return(Task.FromResult <Hover>(null));
                }

                var identifier = scriptFile.Node.GetDescendantNodeOfTypeAtPosition <IdentifierNode>(request.Position.ToPosition());
                if (identifier == null)
                {
                    return(Task.FromResult <Hover>(null));
                }

                var symbol = identifier.GetDeclaredOrReferencedSymbol();
                if (symbol == null)
                {
                    return(Task.FromResult <Hover>(null));
                }

                var displayText = new DisplayTextEmitter().GetDisplayText(symbol);

                return(Task.FromResult(new Hover()
                {
                    Contents = new MarkedStringsOrMarkupContent(DisplayTextToMarkupContent(displayText)),
                    Range = identifier.Range.ToRange()
                }));
            }
            catch (Exception e)
            {
                _logger.LogWarning(e, "Error while handling request.");
            }

            return(Task.FromResult <Hover>(null));
        }
        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));
        }