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;