From d27662213b90733c9702b5e418b2dea4f75fc745 Mon Sep 17 00:00:00 2001 From: Nat Ayewah Date: Wed, 27 Dec 2017 16:42:20 -0800 Subject: [PATCH] Fix TargetFramework caching and comparison in PackageRuleHandler --- .../CrossTarget/TargetFrameworkProvider.cs | 31 +++++++++++-------- .../Subscriptions/PackageRuleHandler.cs | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/CrossTarget/TargetFrameworkProvider.cs b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/CrossTarget/TargetFrameworkProvider.cs index becb11c6a2c..5c1f26cc64c 100644 --- a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/CrossTarget/TargetFrameworkProvider.cs +++ b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/CrossTarget/TargetFrameworkProvider.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.Linq; @@ -37,20 +38,17 @@ public ITargetFramework GetTargetFramework(string shortOrFullName) { lock (_targetsLock) { - // use linear search here, since there not many target frameworks and it would most efficient. - targetFramework = _cachedTargetFrameworks.FirstOrDefault(x => x.Equals(shortOrFullName)); - if (targetFramework != null) + if (!TryGetCachedTargetFramework(shortOrFullName, out targetFramework)) { - return targetFramework; - } - - var frameworkName = _nuGetFrameworkParser.ParseFrameworkName(shortOrFullName); - if (frameworkName != null) - { - var shortName = _nuGetFrameworkParser.GetShortFrameworkName(frameworkName); - targetFramework = new TargetFramework(frameworkName, shortName); - // remember target framework - there can not bee too many of them across the solution. - _cachedTargetFrameworks.Add(targetFramework); + var frameworkName = _nuGetFrameworkParser.ParseFrameworkName(shortOrFullName); + if (frameworkName != null && + !TryGetCachedTargetFramework(frameworkName.FullName, out targetFramework)) + { + var shortName = _nuGetFrameworkParser.GetShortFrameworkName(frameworkName); + targetFramework = new TargetFramework(frameworkName, shortName); + // remember target framework - there can not be too many of them across the solution. + _cachedTargetFrameworks.Add(targetFramework); + } } } } @@ -63,6 +61,13 @@ public ITargetFramework GetTargetFramework(string shortOrFullName) return targetFramework; } + private bool TryGetCachedTargetFramework(string shortOrFullName, out ITargetFramework targetFramework) + { + // use linear search here, since there not many target frameworks and it would most efficient. + targetFramework = _cachedTargetFrameworks.FirstOrDefault(x => x.Equals(shortOrFullName)); + return targetFramework != null; + } + public ITargetFramework GetNearestFramework(ITargetFramework targetFramework, IEnumerable otherFrameworks) { diff --git a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/Subscriptions/PackageRuleHandler.cs b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/Subscriptions/PackageRuleHandler.cs index d5aafb40ae5..b23ced2e609 100644 --- a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/Subscriptions/PackageRuleHandler.cs +++ b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/Tree/Dependencies/Subscriptions/PackageRuleHandler.cs @@ -149,7 +149,7 @@ private IDependencyModel GetDependencyModel( && unresolvedChanges.Contains(metadata.Name)); isTarget = metadata.IsTarget; var packageTargetFramework = TargetFrameworkProvider.GetTargetFramework(metadata.Target); - if (packageTargetFramework != targetFramework) + if (!(packageTargetFramework?.Equals(targetFramework) == true)) { return null; }