public TypeSymbolInfo(ITypeSymbol type) { RealType = type; Accessibility = type.DeclaredAccessibility.ConvertToStructure(); Namespace = type.ContainingNamespace?.ToDisplayString(); if (type is INamedTypeSymbol namedType) { IsGenericType = namedType.IsGenericType; IsAbstract = namedType.IsAbstract; TypeArguments = EnumerableExtensions.CreateLazyImmutableArray <ITypeSymbolInfo>(() => namedType.TypeArguments.Select(i => new TypeSymbolInfo(i))); TypeParameters = EnumerableExtensions.CreateLazyImmutableArray <ITypeParameterSymbolInfo>(() => namedType.TypeParameters.Select(i => new TypeParameterSymbolInfo(i))); if (IsGenericType) { genericDefinitionName = new Lazy <string>(() => $"{(RealType.ContainingType == null ? RealType.ContainingNamespace.ToDisplayString() : RealType.ContainingType.ToDisplayString())}.{Name}<{TypeParameters.Skip(1).Select(i => ",").DefaultIfEmpty("").Aggregate((i, j) => i + j)}>"); } else { genericDefinitionName = new Lazy <string>(() => string.Empty); } } else { TypeArguments = EnumerableExtensions.EmptyImmutableArray <ITypeSymbolInfo>(); TypeParameters = EnumerableExtensions.EmptyImmutableArray <ITypeParameterSymbolInfo>(); } Attributes = EnumerableExtensions.CreateLazyImmutableArray(() => RealType.GetAttributes() .Select(AotSymbolExtensions.ConvertToStructure) .Where(i => i != null)); Interfaces = EnumerableExtensions.CreateLazyImmutableArray <ITypeSymbolInfo>(() => RealType.AllInterfaces.Select(i => new TypeSymbolInfo(i))); Members = EnumerableExtensions.CreateLazyImmutableArray(() => RealType.GetMembers() .Select(AotSymbolExtensions.ConvertToStructure) .Where(i => i != null)); }