File: AddPackage\InstallPackageDirectlyCodeActionOperation.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// 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;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.Packaging;
 
namespace Microsoft.CodeAnalysis.AddPackage;
 
/// <summary>
/// Operation responsible purely for installing a nuget package with a specific 
/// version, or a the latest version of a nuget package.  Is not responsible
/// for adding an import to user code.
/// </summary>
internal sealed class InstallPackageDirectlyCodeActionOperation : CodeActionOperation
{
    private readonly Document _document;
    private readonly IPackageInstallerService _installerService;
    private readonly string? _source;
    private readonly string _packageName;
    private readonly string? _versionOpt;
    private readonly bool _includePrerelease;
    private readonly bool _isLocal;
    private readonly List<string> _projectsWithMatchingVersion = [];
 
    public InstallPackageDirectlyCodeActionOperation(
        IPackageInstallerService installerService,
        Document document,
        string? source,
        string packageName,
        string? versionOpt,
        bool includePrerelease,
        bool isLocal)
    {
        _installerService = installerService;
        _document = document;
        _source = source;
        _packageName = packageName;
        _versionOpt = versionOpt;
        _includePrerelease = includePrerelease;
        _isLocal = isLocal;
 
        if (versionOpt != null)
        {
            const int projectsToShow = 5;
            var otherProjects = installerService.GetProjectsWithInstalledPackage(
                _document.Project.Solution, packageName, versionOpt).ToList();
            _projectsWithMatchingVersion.AddRange(otherProjects.Take(projectsToShow).Select(p => p.Name));
            if (otherProjects.Count > projectsToShow)
                _projectsWithMatchingVersion.Add("...");
        }
    }
 
    public override string Title => _versionOpt == null
        ? string.Format(FeaturesResources.Find_and_install_latest_version_of_0, _packageName)
        : _isLocal
            ? string.Format(FeaturesResources.Use_locally_installed_0_version_1_This_version_used_in_colon_2, _packageName, _versionOpt, string.Join(", ", _projectsWithMatchingVersion))
            : string.Format(FeaturesResources.Install_0_1, _packageName, _versionOpt);
 
    internal override bool ApplyDuringTests => true;
 
    internal override Task<bool> TryApplyAsync(
        Workspace workspace, Solution originalSolution, IProgress<CodeAnalysisProgress> progressTracker, CancellationToken cancellationToken)
    {
        return _installerService.TryInstallPackageAsync(
            workspace, _document.Id, _source, _packageName,
            _versionOpt, _includePrerelease, progressTracker, cancellationToken);
    }
}