From 1d7ac2aba95228c8b810e271f05e8e85f0ec82fa Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Fri, 9 Oct 2015 07:25:28 -0700 Subject: [PATCH] Fix FileCodeModel's usage of CleanableWeakComHandleTable when an a key is in the table but the value is null --- .../Interop/CleanableWeakComHandleTable.cs | 8 +++---- .../Core/Impl/CodeModel/FileCodeModel.cs | 21 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/VisualStudio/Core/Def/Implementation/Interop/CleanableWeakComHandleTable.cs b/src/VisualStudio/Core/Def/Implementation/Interop/CleanableWeakComHandleTable.cs index bc3e58eb19a..f04c771aeae 100644 --- a/src/VisualStudio/Core/Def/Implementation/Interop/CleanableWeakComHandleTable.cs +++ b/src/VisualStudio/Core/Def/Implementation/Interop/CleanableWeakComHandleTable.cs @@ -197,11 +197,11 @@ public TValue Remove(TKey key) _deadKeySet.Remove(key); } - TValue value; - if (TryGetValue(key, out value)) + WeakComHandle handle; + if (_table.TryGetValue(key, out handle)) { _table.Remove(key); - return value; + return handle.ComAggregateObject; } return null; @@ -215,7 +215,7 @@ public bool TryGetValue(TKey key, out TValue value) if (_table.TryGetValue(key, out handle)) { value = handle.ComAggregateObject; - return value != null; + return true; } value = null; diff --git a/src/VisualStudio/Core/Impl/CodeModel/FileCodeModel.cs b/src/VisualStudio/Core/Impl/CodeModel/FileCodeModel.cs index d75690700aa..eb2680616b3 100644 --- a/src/VisualStudio/Core/Impl/CodeModel/FileCodeModel.cs +++ b/src/VisualStudio/Core/Impl/CodeModel/FileCodeModel.cs @@ -206,20 +206,21 @@ internal T GetOrCreateCodeElement(SyntaxNode node) EnvDTE.CodeElement codeElement; if (_codeElementTable.TryGetValue(nodeKey, out codeElement)) { - var element = ComAggregate.TryGetManagedObject(codeElement); - if (element.IsValidNode()) + if (codeElement != null) { - if (codeElement is T) + var element = ComAggregate.TryGetManagedObject(codeElement); + if (element.IsValidNode()) { - return (T)codeElement; - } + if (codeElement is T) + { + return (T)codeElement; + } - throw new InvalidOperationException($"Found a valid code element for {nodeKey}, but it is not of type, {typeof(T).ToString()}"); - } - else - { - _codeElementTable.Remove(nodeKey); + throw new InvalidOperationException($"Found a valid code element for {nodeKey}, but it is not of type, {typeof(T).ToString()}"); + } } + + _codeElementTable.Remove(nodeKey); } } -- GitLab