Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task<IEnumerable<Project>> EnvDTESolutionUtility.GetAllEnvDTEProjectsAsync(DTE dte)', validate parameter 'dte' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.EnvDTESolutionUtility.GetAllEnvDTEProjectsAsync(EnvDTE.DTE)~System.Threading.Tasks.Task{System.Collections.Generic.IEnumerable{EnvDTE.Project}}")]
[assembly: SuppressMessage("Build", "CA1031:Modify 'GetFrameworkAssemblies' to catch a more specific allowed exception type, or rethrow the exception.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.FrameworkAssemblyResolver.GetFrameworkAssemblies(System.String)~System.Collections.Generic.List{NuGet.PackageManagement.VisualStudio.FrameworkAssembly}")]
[assembly: SuppressMessage("Build", "CA1031:Modify 'RemoveReferenceAsync' to catch a more specific allowed exception type, or rethrow the exception.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.FSharpProjectSystem.RemoveReferenceAsync(System.String)~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'LegacyPackageReferenceProject.LegacyPackageReferenceProject(IVsProjectAdapter vsProjectAdapter, string projectId, INuGetProjectServices projectServices, IVsProjectThreadingService threadingService)', validate parameter 'vsProjectAdapter' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.LegacyPackageReferenceProject.#ctor(NuGet.VisualStudio.IVsProjectAdapter,System.String,NuGet.ProjectManagement.INuGetProjectServices,NuGet.PackageManagement.VisualStudio.IVsProjectThreadingService)")]
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task LegacyPackageReferenceProject.AddFileToProjectAsync(string filePath)', validate parameter 'filePath' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.LegacyPackageReferenceProject.AddFileToProjectAsync(System.String)~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Build", "CA1822:Member GetConfigFilePaths does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.LegacyPackageReferenceProject.GetConfigFilePaths(NuGet.Configuration.ISettings)~System.Collections.Generic.IList{System.String}")]
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task<bool> LegacyPackageReferenceProject.UninstallPackageAsync(PackageIdentity packageIdentity, INuGetProjectContext _, CancellationToken token)', validate parameter 'packageIdentity' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.PackageManagement.VisualStudio.LegacyPackageReferenceProject.UninstallPackageAsync(NuGet.Packaging.Core.PackageIdentity,NuGet.ProjectManagement.INuGetProjectContext,System.Threading.CancellationToken)~System.Threading.Tasks.Task{System.Boolean}")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using NuGet.Common;
using NuGet.Frameworks;
using NuGet.LibraryModel;
using NuGet.PackageManagement.VisualStudio.Projects;
using NuGet.ProjectManagement;
using NuGet.ProjectModel;
using NuGet.Versioning;
Expand All @@ -32,12 +33,14 @@ internal class VsManagedLanguagesProjectSystemServices :
, IProjectSystemCapabilities
, IProjectSystemReferencesReader
, IProjectSystemReferencesService
, ILegacyPackageReferenceProjectServices
{
private static readonly string[] ReferenceMetadata;

private readonly IVsProjectAdapter _vsProjectAdapter;
private readonly IVsProjectThreadingService _threadingService;
private readonly VSProject4 _vsProject4;

public VSProject4 Project4 { get; }

public bool SupportsPackageReferences => true;

Expand Down Expand Up @@ -85,7 +88,7 @@ public VsManagedLanguagesProjectSystemServices(

_vsProjectAdapter = vsProjectAdapter;
_threadingService = threadingService;
_vsProject4 = vsProject4;
Project4 = vsProject4;

ScriptService = new VsProjectScriptHostService(vsProjectAdapter, scriptExecutor);

Expand All @@ -99,7 +102,7 @@ public async Task<IEnumerable<LibraryDependency>> GetPackageReferencesAsync(

await _threadingService.JoinableTaskFactory.SwitchToMainThreadAsync();

var installedPackages = _vsProject4.PackageReferences?.InstalledPackages;
var installedPackages = Project4.PackageReferences?.InstalledPackages;

if (installedPackages == null)
{
Expand All @@ -113,7 +116,7 @@ public async Task<IEnumerable<LibraryDependency>> GetPackageReferencesAsync(
.Where(r => !string.IsNullOrEmpty(r))
.Select(installedPackage =>
{
if (_vsProject4.PackageReferences.TryGetReference(
if (Project4.PackageReferences.TryGetReference(
installedPackage,
ReferenceMetadata,
out var version,
Expand Down Expand Up @@ -141,13 +144,13 @@ public async Task<IEnumerable<ProjectRestoreReference>> GetProjectReferencesAsyn
{
await _threadingService.JoinableTaskFactory.SwitchToMainThreadAsync();

if (_vsProject4.References == null)
if (Project4.References == null)
{
return Array.Empty<ProjectRestoreReference>();
}

var references = new List<ProjectRestoreReference>();
foreach (Reference6 r in _vsProject4.References.Cast<Reference6>())
foreach (Reference6 r in Project4.References.Cast<Reference6>())
{
if (r.SourceProject != null && await EnvDTEProjectUtility.IsSupportedAsync(r.SourceProject))
{
Expand Down Expand Up @@ -317,7 +320,7 @@ private void AddOrUpdatePackageReference(string packageName, VersionRange packag
// - specify a metadata element name with a value => add/replace that metadata item on the package reference
// - specify a metadata element name with no value => remove that metadata item from the project reference
// - don't specify a particular metadata name => if it exists on the package reference, don't change it (e.g. for user defined metadata)
_vsProject4.PackageReferences.AddOrUpdate(
Project4.PackageReferences.AddOrUpdate(
packageName,
packageVersion.OriginalString ?? packageVersion.ToShortString(),
metadataElements,
Expand All @@ -330,7 +333,7 @@ public async Task RemovePackageReferenceAsync(string packageName)

await _threadingService.JoinableTaskFactory.SwitchToMainThreadAsync();

_vsProject4.PackageReferences.Remove(packageName);
Project4.PackageReferences.Remove(packageName);
}

private bool IsCentralPackageManagementVersionsEnabled()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using NuGet.ProjectManagement;
using VSLangProj150;

namespace NuGet.PackageManagement.VisualStudio.Projects;

public interface ILegacyPackageReferenceProjectServices : INuGetProjectServices
{
VSProject4 Project4 { get; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Threading;
using NuGet.Commands;
using NuGet.Commands.Restore;
using NuGet.Commands.Restore.Utility;
using NuGet.Common;
using NuGet.Configuration;
using NuGet.Frameworks;
using NuGet.LibraryModel;
using NuGet.PackageManagement.VisualStudio.Projects;
using NuGet.PackageManagement.VisualStudio.Utility;
using NuGet.Packaging;
using NuGet.Packaging.Core;
Expand All @@ -41,14 +44,17 @@ public sealed class LegacyPackageReferenceProject : PackageReferenceProject<Dict
{
private readonly IVsProjectAdapter _vsProjectAdapter;
private readonly IVsProjectThreadingService _threadingService;
private readonly bool _usePackageSpecFactory;
private readonly ILegacyPackageReferenceProjectServices _projectServices;

public NuGetFramework TargetFramework { get; }

public LegacyPackageReferenceProject(
IVsProjectAdapter vsProjectAdapter,
string projectId,
INuGetProjectServices projectServices,
IVsProjectThreadingService threadingService)
ILegacyPackageReferenceProjectServices projectServices,
IVsProjectThreadingService threadingService,
bool usePackageSpecFactory)
: base(vsProjectAdapter.ProjectName,
vsProjectAdapter.UniqueName,
vsProjectAdapter.FullProjectPath)
Expand All @@ -69,18 +75,23 @@ public LegacyPackageReferenceProject(
InternalMetadata.Add(NuGetProjectMetadataKeys.ProjectId, projectId);

ProjectServices = projectServices;
_projectServices = projectServices;

_usePackageSpecFactory = usePackageSpecFactory;
}

public LegacyPackageReferenceProject(
IVsProjectAdapter vsProjectAdapter,
string projectId,
INuGetProjectServices projectServices,
ILegacyPackageReferenceProjectServices projectServices,
IVsProjectThreadingService threadingService,
NuGetFramework targetFramework)
NuGetFramework targetFramework,
bool usePackageSpecFactory)
: this(vsProjectAdapter,
projectId,
projectServices,
threadingService)
threadingService,
usePackageSpecFactory)
{
Assumes.NotNull(targetFramework);
TargetFramework = targetFramework;
Expand Down Expand Up @@ -431,6 +442,18 @@ private IList<string> GetConfigFilePaths(ISettings settings)
/// Emulates a JSON deserialization from project.json to PackageSpec in a post-project.json world
/// </summary>
private async Task<PackageSpec> GetPackageSpecAsync(ISettings settings)
{
if (_usePackageSpecFactory)
{
return await GetPackageSpecWithFactoryAsync(settings);
}
else
{
return await GetPackageSpecClassicAsync(settings);
}
}

private async Task<PackageSpec> GetPackageSpecClassicAsync(ISettings settings)
{
await _threadingService.JoinableTaskFactory.SwitchToMainThreadAsync();

Expand Down Expand Up @@ -595,6 +618,14 @@ private async Task<PackageSpec> GetPackageSpecAsync(ISettings settings)
};
}

private async Task<PackageSpec> GetPackageSpecWithFactoryAsync(ISettings settings)
{
await _threadingService.JoinableTaskFactory.SwitchToMainThreadAsync();
IProject project = new LegacyProjectAdapter(_vsProjectAdapter, _projectServices.Project4);
PackageSpec packageSpec = PackageSpecFactory.GetPackageSpec(project, settings);
return packageSpec;
}

internal static ImmutableArray<LibraryDependency> ApplyCentralVersionInformation(ImmutableArray<LibraryDependency> packageReferences, IReadOnlyDictionary<string, CentralPackageVersion> centralPackageVersions)
{
if (packageReferences.IsDefault)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
using Microsoft;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Utilities;
using NuGet.Commands.Restore.Utility;
using NuGet.Common;
using NuGet.Frameworks;
using NuGet.ProjectManagement;
using NuGet.ProjectModel;
Expand All @@ -27,6 +29,7 @@ public sealed class LegacyPackageReferenceProjectProvider : INuGetProjectProvide

private readonly IVsProjectThreadingService _threadingService;
private readonly Lazy<IScriptExecutor> _scriptExecutor;
private readonly bool _usePackageSpecFactory;

public RuntimeTypeHandle ProjectType => typeof(LegacyPackageReferenceProject).TypeHandle;

Expand All @@ -36,20 +39,24 @@ public LegacyPackageReferenceProjectProvider(
Lazy<IScriptExecutor> scriptExecutor)
: this(AsyncServiceProvider.GlobalProvider,
threadingService,
scriptExecutor)
scriptExecutor,
EnvironmentVariableWrapper.Instance)
{ }

public LegacyPackageReferenceProjectProvider(
IAsyncServiceProvider vsServiceProvider,
IVsProjectThreadingService threadingService,
Lazy<IScriptExecutor> scriptExecutor)
Lazy<IScriptExecutor> scriptExecutor,
IEnvironmentVariableReader environmentVariableReader)
{
Assumes.Present(vsServiceProvider);
Assumes.Present(threadingService);
Assumes.Present(scriptExecutor);
Assumes.Present(environmentVariableReader);

_threadingService = threadingService;
_scriptExecutor = scriptExecutor;
_usePackageSpecFactory = !bool.FalseString.Equals(PackageSpecFactory.EnvironmentVariableName, StringComparison.OrdinalIgnoreCase);
}

public NuGetProject TryCreateNuGetProject(
Expand All @@ -75,13 +82,14 @@ public NuGetProject TryCreateNuGetProject(
vsProjectAdapter.ProjectId,
projectServices,
_threadingService,
targetFramework);
targetFramework,
_usePackageSpecFactory);
}

/// <summary>
/// Is this project a non-CPS package reference based csproj?
/// </summary>
private INuGetProjectServices TryCreateProjectServices(
private VsManagedLanguagesProjectSystemServices TryCreateProjectServices(
IVsProjectAdapter vsProjectAdapter, bool forceCreate)
{
ThreadHelper.ThrowIfNotOnUIThread();
Expand Down
Loading