/// <summary>
 /// Wrapper method that calls Resolver.GetQuickInfo
 /// </summary>
 internal string GetQuickInfoForToken(ParseResult parseResult, int parserLine, int parserColumn, IMetadataDisplayInfoProvider metadataDisplayInfoProvider)
 {
     if (parseResult == null || metadataDisplayInfoProvider == null)
     {
         return(null);
     }
     Babel.CodeObjectQuickInfo quickInfo = Resolver.GetQuickInfo(
         parseResult, parserLine, parserColumn, metadataDisplayInfoProvider);
     return(quickInfo?.Text);
 }
        /// <summary>
        /// Get quick info hover tooltips for the current position
        /// </summary>
        /// <param name="textDocumentPosition"></param>
        /// <param name="scriptFile"></param>
        internal Hover GetHoverItem(TextDocumentPosition textDocumentPosition, ScriptFile scriptFile)
        {
            int startLine   = textDocumentPosition.Position.Line;
            int startColumn = TextUtilities.PositionOfPrevDelimeter(
                scriptFile.Contents,
                textDocumentPosition.Position.Line,
                textDocumentPosition.Position.Character);
            int endColumn = textDocumentPosition.Position.Character;

            ScriptParseInfo scriptParseInfo = GetScriptParseInfo(textDocumentPosition.TextDocument.Uri);

            if (scriptParseInfo != null && scriptParseInfo.ParseResult != null)
            {
                if (Monitor.TryEnter(scriptParseInfo.BuildingMetadataLock))
                {
                    try
                    {
                        QueueItem queueItem = this.BindingQueue.QueueBindingOperation(
                            key: scriptParseInfo.ConnectionKey,
                            bindingTimeout: LanguageService.HoverTimeout,
                            bindOperation: (bindingContext, cancelToken) =>
                        {
                            // get the current quick info text
                            Babel.CodeObjectQuickInfo quickInfo = Resolver.GetQuickInfo(
                                scriptParseInfo.ParseResult,
                                startLine + 1,
                                endColumn + 1,
                                bindingContext.MetadataDisplayInfoProvider);

                            // convert from the parser format to the VS Code wire format
                            return(AutoCompleteHelper.ConvertQuickInfoToHover(
                                       quickInfo,
                                       startLine,
                                       startColumn,
                                       endColumn));
                        });

                        queueItem.ItemProcessed.WaitOne();
                        return(queueItem.GetResultAsT <Hover>());
                    }
                    finally
                    {
                        Monitor.Exit(scriptParseInfo.BuildingMetadataLock);
                    }
                }
            }

            // return null if there isn't a tooltip for the current location
            return(null);
        }
        /// <summary>
        /// Converts a SQL Parser QuickInfo object into a VS Code Hover object
        /// </summary>
        /// <param name="quickInfo"></param>
        /// <param name="row"></param>
        /// <param name="startColumn"></param>
        /// <param name="endColumn"></param>
        internal static Hover ConvertQuickInfoToHover(
            Babel.CodeObjectQuickInfo quickInfo,
            int row,
            int startColumn,
            int endColumn)
        {
            // convert from the parser format to the VS Code wire format
            var markedStrings = new MarkedString[1];

            if (quickInfo != null)
            {
                markedStrings[0] = new MarkedString()
                {
                    Language = "SQL",
                    Value    = quickInfo.Text
                };

                return(new Hover()
                {
                    Contents = markedStrings,
                    Range = new Range
                    {
                        Start = new Position
                        {
                            Line = row,
                            Character = startColumn
                        },
                        End = new Position
                        {
                            Line = row,
                            Character = endColumn
                        }
                    }
                });
            }
            else
            {
                return(null);
            }
        }