// 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.

#nullable disable

using System.Collections.Generic;

namespace Microsoft.CodeAnalysis.Editor
{
    /// <summary>
    /// Allows editors to listen to refactoring events and take appropriate action. For example, 
    /// when VS knows about a symbol rename, it asks the Xaml language service to update xaml files
    /// </summary>
    internal interface IRefactorNotifyService
    {
        /// <summary>
        /// Notifies any interested parties that a rename action is about to happen. 
        /// Implementers can request the rename action be cancelled, in which case they should 
        /// return false or throw an exception, depending on the throwOnFailure argument. Callers 
        /// should honor cancellation requests by not applying the rename and not calling 
        /// <see cref="TryOnAfterGlobalSymbolRenamed"/>.
        /// </summary>
        /// <returns>True if the rename should proceed.</returns>
        bool TryOnBeforeGlobalSymbolRenamed(Workspace workspace, IEnumerable<DocumentId> changedDocumentIDs, ISymbol symbol, string newName, bool throwOnFailure);

        /// <summary>
        /// Notifies any interested parties that a symbol rename has been applied to the 
        /// workspace. This should only be called if <see cref="TryOnBeforeGlobalSymbolRenamed"/> was
        /// called and returned true before the symbol rename was applied to the workspace. 
        /// In the event of a failure to rename, implementers should return false or throw an
        /// exception, depending on the throwOnFailure argument.
        /// </summary>
        /// <returns>True if the rename was successful.</returns>
        bool TryOnAfterGlobalSymbolRenamed(Workspace workspace, IEnumerable<DocumentId> changedDocumentIDs, ISymbol symbol, string newName, bool throwOnFailure);
    }
}
