public RoslynNamedType(INamedTypeSymbol namedTypeSymbol, ParseContext context)
            : base(namedTypeSymbol, context)
        {
            Comments = context.DocumentationProvider.GetDocumentationForSymbol(NamedTypeSymbol).Summary;
            FullName = NamedTypeSymbol.GetNormalizedMetadataName();                                      // TODO May need to rethink
            FilePath = namedTypeSymbol.DeclaringSyntaxReferences.FirstOrDefault()?.SyntaxTree?.FilePath; // TODO get rid of this

            _constructedFrom = new Lazy <INamedType>(() => new RoslynNamedType(NamedTypeSymbol.ConstructedFrom, context));

            _typeArguments = new Lazy <IReadOnlyList <IType> >(() =>
            {
                List <IType> typeArgs = new List <IType>();
                foreach (ITypeSymbol typeParam in NamedTypeSymbol.TypeArguments)
                {
                    typeArgs.Add(CreateType(typeParam, context));
                }
                return(typeArgs);
            });

            _baseType = new Lazy <INamedType>(() =>
            {
                if (ParseHelper.ShouldParseBaseTypeOfType(NamedTypeSymbol))
                {
                    INamedTypeSymbol baseTypeSymbol = NamedTypeSymbol.BaseType;
                    return(new RoslynNamedType(baseTypeSymbol, context));
                }
                else
                {
                    return(null);
                }
            });

            // Properties
            _properties = new Lazy <IReadOnlyList <IProperty> >(() =>
            {
                List <IProperty> props = new List <IProperty>();
                foreach (IPropertySymbol propSymb in NamedTypeSymbol.GetMembers().OfType <IPropertySymbol>())
                {
                    if (propSymb.GetMethod.DeclaredAccessibility == Accessibility.Public)
                    {
                        RoslynProperty clientProp = new RoslynProperty(propSymb, context);
                        props.Add(clientProp);
                    }
                }
                return(props);
            });

            // fields
            _fields = new Lazy <IReadOnlyList <IField> >(() =>
            {
                List <IField> fields = new List <IField>();
                foreach (IFieldSymbol fieldSymb in NamedTypeSymbol.GetMembers().OfType <IFieldSymbol>())
                {
                    if (fieldSymb.DeclaredAccessibility == Accessibility.Public)
                    {
                        RoslynField field = new RoslynField(fieldSymb, context);
                        fields.Add(field);
                    }
                }
                return(fields);
            });

            // methods
            _methods = new Lazy <IReadOnlyList <IMethod> >(() =>
            {
                List <IMethod> methods = new List <IMethod>();
                foreach (IMethodSymbol methodSymb in NamedTypeSymbol.GetMembers().OfType <IMethodSymbol>())
                {
                    if (methodSymb.DeclaredAccessibility == Accessibility.Public)
                    {
                        RoslynMethod clientProp = new RoslynMethod(methodSymb, context);
                        methods.Add(clientProp);
                    }
                }
                return(methods);
            });

            // Attributes
            _attrs = new Lazy <IReadOnlyList <IAttributeData> >(() =>
            {
                return(RoslynAttributeData.FromSymbol(namedTypeSymbol, context));
            });

            // Interfaces
            _interfaces = new Lazy <IReadOnlyList <INamedType> >(() =>
            {
                List <INamedType> interfaces = new List <INamedType>();
                foreach (INamedTypeSymbol interfaceSym in NamedTypeSymbol.Interfaces)
                {
                    interfaces.Add(CreateNamedType(interfaceSym, context));
                }
                return(interfaces);
            });

            Flags = new TypeFlags(
                isEnum: namedTypeSymbol.TypeKind == TypeKind.Enum,
                isNullable: IsNullableType(),
                isArray: namedTypeSymbol.TypeKind == TypeKind.Array,
                isList: IsListType(),
                isDictionary: IsDictionaryType(),
                isAnonymous: TypeSymbol.IsAnonymousType,
                isInterface: TypeSymbol.TypeKind == TypeKind.Interface
                );
        }