From 04be1cd83a987249b0503d676fa967d953332055 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 30 Sep 2008 15:59:28 +0000 Subject: [PATCH] Add cache for MemberLookupHelper.GetTypeInheritanceTree. Improves performance when there are many extension methods available for code completion. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3574 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/MemberLookupHelper.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs index e5bcfc5113..46566ff33e 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs @@ -669,6 +669,15 @@ namespace ICSharpCode.SharpDevelop.Dom } } + readonly static Dictionary> getTypeInheritanceTreeCache = new Dictionary>(); + + static void ClearGetTypeInheritanceTreeCache() + { + lock (getTypeInheritanceTreeCache) { + getTypeInheritanceTreeCache.Clear(); + } + } + /// /// Gets all types the specified type inherits from (all classes and interfaces). /// Unlike the class inheritance tree, this method takes care of type arguments and calculates the type @@ -679,6 +688,12 @@ namespace ICSharpCode.SharpDevelop.Dom if (typeToListInheritanceTreeFor == null) throw new ArgumentNullException("typeToListInheritanceTreeFor"); + lock (getTypeInheritanceTreeCache) { + IEnumerable result; + if (getTypeInheritanceTreeCache.TryGetValue(typeToListInheritanceTreeFor, out result)) + return result; + } + IClass classToListInheritanceTreeFor = typeToListInheritanceTreeFor.GetUnderlyingClass(); if (classToListInheritanceTreeFor == null) return new IReturnType[] { typeToListInheritanceTreeFor }; @@ -727,6 +742,12 @@ namespace ICSharpCode.SharpDevelop.Dom currentClass = nextType.GetUnderlyingClass(); } } while (nextType != null); + lock (getTypeInheritanceTreeCache) { + if (getTypeInheritanceTreeCache.Count == 0) { + DomCache.RegisterForClear(ClearGetTypeInheritanceTreeCache); + } + getTypeInheritanceTreeCache[typeToListInheritanceTreeFor] = visitedList; + } return visitedList; } #endregion