﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.LanguageService;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;

namespace Microsoft.CodeAnalysis.QuickInfo
{
    /// <summary>
    /// A service that is used to determine the appropriate quick info for a position in a document.
    /// </summary>
    public abstract class QuickInfoService : ILanguageService
    {
        // Prevent inheritance outside of Roslyn.
        internal QuickInfoService()
        {
        }

        /// <summary>
        /// Gets the appropriate <see cref="QuickInfoService"/> for the specified document.
        /// </summary>
        public static QuickInfoService? GetService(Document? document)
            => document?.GetLanguageService<QuickInfoService>();

        /// <summary>
        /// Gets the <see cref="QuickInfoItem"/> associated with position in the document.
        /// </summary>
        public Task<QuickInfoItem?> GetQuickInfoAsync(
            Document document,
            int position,
            CancellationToken cancellationToken = default)
        {
            Debug.Fail("For backwards API compat only, should not be called");
            return GetQuickInfoAsync(document, position, SymbolDescriptionOptions.Default, cancellationToken);
        }

        internal virtual Task<QuickInfoItem?> GetQuickInfoAsync(
            Document document,
            int position,
            SymbolDescriptionOptions options,
            CancellationToken cancellationToken)
        {
            return SpecializedTasks.Null<QuickInfoItem>();
        }
    }
}
