From 758df61673282f4f1bb4f3aa011c312ca02977a1 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 6 Apr 2017 03:28:45 -0700 Subject: [PATCH 1/2] Handle package reference version ranges in .csproj files --- src/OmniSharp.MSBuild/MSBuildProjectSystem.cs | 60 ++++++++++++------- .../ProjectFile/PackageReference.cs | 9 ++- .../ProjectFile/ProjectFileInfo.cs | 9 ++- .../ProjectFile/PropertyConverter.cs | 5 +- 4 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs b/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs index 8411fc73c7..b391016fa3 100644 --- a/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs +++ b/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs @@ -495,24 +495,6 @@ private void UpdateReferences(Project project, IList references) } } - private List CreatePackageDependencies(IEnumerable packageReferences) - { - var list = new List(); - - foreach (var packageReference in packageReferences) - { - var dependency = new PackageDependency - { - Name = packageReference.Identity.Id, - Version = packageReference.Identity.Version?.ToNormalizedString() - }; - - list.Add(dependency); - } - - return list; - } - private void CheckForUnresolvedDependences(ProjectFileInfo projectFileInfo, ProjectFileInfo previousProjectFileInfo = null, bool allowAutoRestore = false) { List unresolvedDependencies; @@ -534,14 +516,14 @@ private void CheckForUnresolvedDependences(ProjectFileInfo projectFileInfo, Proj // Did the project file change? Diff the package references and see if there are unresolved dependencies. if (previousProjectFileInfo != null) { - var packageReferencesToRemove = new HashSet(previousProjectFileInfo.PackageReferences); + var remainingPackageReferences = new HashSet(previousProjectFileInfo.PackageReferences); var packageReferencesToAdd = new HashSet(); foreach (var packageReference in projectFileInfo.PackageReferences) { - if (packageReferencesToRemove.Contains(packageReference)) + if (remainingPackageReferences.Contains(packageReference)) { - packageReferencesToRemove.Remove(packageReference); + remainingPackageReferences.Remove(packageReference); } else { @@ -549,7 +531,7 @@ private void CheckForUnresolvedDependences(ProjectFileInfo projectFileInfo, Proj } } - unresolvedPackageReferences = packageReferencesToAdd.Concat(packageReferencesToRemove); + unresolvedPackageReferences = packageReferencesToAdd.Concat(remainingPackageReferences); } else { @@ -561,7 +543,7 @@ private void CheckForUnresolvedDependences(ProjectFileInfo projectFileInfo, Proj var lockFile = lockFileFormat.Read(projectFileInfo.ProjectAssetsFile); unresolvedPackageReferences = projectFileInfo.PackageReferences - .Where(pr => lockFile.GetLibrary(pr.Identity.Id, pr.Identity.Version) == null); + .Where(pr => !ContainsPackageReference(lockFile, pr)); } unresolvedDependencies = CreatePackageDependencies(unresolvedPackageReferences); @@ -583,6 +565,38 @@ private void CheckForUnresolvedDependences(ProjectFileInfo projectFileInfo, Proj } } + private List CreatePackageDependencies(IEnumerable packageReferences) + { + var list = new List(); + + foreach (var packageReference in packageReferences) + { + var dependency = new PackageDependency + { + Name = packageReference.Identity.Id, + Version = packageReference.Identity.VersionRange.ToNormalizedString() + }; + + list.Add(dependency); + } + + return list; + } + + private static bool ContainsPackageReference(LockFile lockFile, PackageReference reference) + { + foreach (var library in lockFile.Libraries) + { + if (string.Equals(library.Name, reference.Identity.Id) && + reference.Identity.VersionRange.Satisfies(library.Version)) + { + return true; + } + } + + return false; + } + private void FireUnresolvedDependenciesEvent(ProjectFileInfo projectFileInfo, List unresolvedDependencies) { _eventEmitter.Emit(EventTypes.UnresolvedDependencies, diff --git a/src/OmniSharp.MSBuild/ProjectFile/PackageReference.cs b/src/OmniSharp.MSBuild/ProjectFile/PackageReference.cs index 3aa08698e4..9ff7b276e4 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/PackageReference.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/PackageReference.cs @@ -5,21 +5,20 @@ namespace OmniSharp.MSBuild.ProjectFile { public class PackageReference : IEquatable { - public PackageIdentity Identity { get; } + public PackageDependency Identity { get; } public bool IsImplicitlyDefined { get; } - public PackageReference(PackageIdentity identity, bool isImplicitlyDefined) + public PackageReference(PackageDependency dependency, bool isImplicitlyDefined) { - this.Identity = identity; + this.Identity = dependency; this.IsImplicitlyDefined = isImplicitlyDefined; } public override string ToString() { - var version = Identity.HasVersion ? ", " + Identity.Version.ToNormalizedString() : string.Empty; var implicitSuffix = IsImplicitlyDefined ? " (implicit)" : string.Empty; - return Identity.Id + version + implicitSuffix; + return Identity.Id + ", " + Identity.VersionRange + implicitSuffix; } public bool Equals(PackageReference other) diff --git a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs index db6af30d7d..e7f5fd06f5 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs @@ -9,7 +9,6 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.Extensions.Logging; using NuGet.Packaging.Core; -using OmniSharp.Models; using OmniSharp.Options; using OmniSharp.Utilities; @@ -114,7 +113,7 @@ public static ProjectFileInfo Create( string solutionDirectory, ILogger logger, MSBuildOptions options = null, - ICollection diagnostics = null, + ICollection diagnostics = null, bool isUnityProject = false) { if (!File.Exists(projectFilePath)) @@ -250,11 +249,11 @@ private static IList GetPackageReferences(ICollection Date: Thu, 6 Apr 2017 04:43:27 -0700 Subject: [PATCH 2/2] Rename PackageReference.Identity -> PackageReference.Dependency --- src/OmniSharp.MSBuild/MSBuildProjectSystem.cs | 8 ++++---- src/OmniSharp.MSBuild/ProjectFile/PackageReference.cs | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs b/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs index b391016fa3..885b10900d 100644 --- a/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs +++ b/src/OmniSharp.MSBuild/MSBuildProjectSystem.cs @@ -573,8 +573,8 @@ private List CreatePackageDependencies(IEnumerable { - public PackageDependency Identity { get; } + public PackageDependency Dependency { get; } public bool IsImplicitlyDefined { get; } public PackageReference(PackageDependency dependency, bool isImplicitlyDefined) { - this.Identity = dependency; + this.Dependency = dependency; this.IsImplicitlyDefined = isImplicitlyDefined; } @@ -18,12 +18,12 @@ public override string ToString() { var implicitSuffix = IsImplicitlyDefined ? " (implicit)" : string.Empty; - return Identity.Id + ", " + Identity.VersionRange + implicitSuffix; + return Dependency.Id + ", " + Dependency.VersionRange + implicitSuffix; } public bool Equals(PackageReference other) { - if (!Identity.Equals(other.Identity)) + if (!Dependency.Equals(other.Dependency)) { return false; } @@ -33,7 +33,7 @@ public bool Equals(PackageReference other) public override int GetHashCode() { - return this.Identity.GetHashCode() + (IsImplicitlyDefined ? 1 : 0); + return this.Dependency.GetHashCode() + (IsImplicitlyDefined ? 1 : 0); } } }