Browse Source

#2064: Improve performance of RequiredNamespaceCollector by skipping repeated IType.GetAllBaseTypes() calls.

pull/2077/head
Siegfried Pammer 5 years ago
parent
commit
5459d6b022
  1. 5
      ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs

5
ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs

@ -17,6 +17,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -17,6 +17,7 @@ namespace ICSharpCode.Decompiler.CSharp
static readonly Decompiler.TypeSystem.GenericContext genericContext = default;
readonly HashSet<string> namespaces;
readonly HashSet<IType> visitedTypes = new HashSet<IType>();
public RequiredNamespaceCollector(HashSet<string> namespaces)
{
@ -141,13 +142,15 @@ namespace ICSharpCode.Decompiler.CSharp @@ -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;

Loading…
Cancel
Save