From 5459d6b022087d417f149ec7d67cbb2823d23251 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Jul 2020 16:55:52 +0200 Subject: [PATCH] #2064: Improve performance of RequiredNamespaceCollector by skipping repeated IType.GetAllBaseTypes() calls. --- ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs b/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs index 8e7922292..878edf8fe 100644 --- a/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs +++ b/ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs @@ -17,6 +17,7 @@ namespace ICSharpCode.Decompiler.CSharp static readonly Decompiler.TypeSystem.GenericContext genericContext = default; readonly HashSet namespaces; + readonly HashSet visitedTypes = new HashSet(); public RequiredNamespaceCollector(HashSet namespaces) { @@ -141,13 +142,15 @@ namespace ICSharpCode.Decompiler.CSharp void CollectNamespacesForTypeReference(IType type) { + if (!visitedTypes.Add(type)) + return; switch (type) { case ParameterizedType parameterizedType: namespaces.Add(parameterizedType.Namespace); CollectNamespacesForTypeReference(parameterizedType.GenericType); foreach (var arg in parameterizedType.TypeArguments) CollectNamespacesForTypeReference(arg); - break; + return; // no need to collect base types again case TypeWithElementType typeWithElementType: CollectNamespacesForTypeReference(typeWithElementType.ElementType); break;