private static void ParseAssemblySymbols(ParseResult disco, ISymbol symbol)
        {
            foreach (var attrData in symbol.GetAttributes())
            {
                var attrClassSymbol = attrData.AttributeClass;

                // handle errors
                if (attrClassSymbol is IErrorTypeSymbol)
                {
                    continue;
                }
                if (attrData.AttributeConstructor == null)
                {
                    continue;
                }

                var attrClassName = SymbolDisplay.ToDisplayString(attrClassSymbol);
                switch (attrClassName)
                {
                case "Umbraco.ModelsBuilder.IgnoreContentTypeAttribute":
                    var contentAliasToIgnore = (string)attrData.ConstructorArguments[0].Value;
                    // see notes in IgnoreContentTypeAttribute
                    //var ignoreContent = (bool)attrData.ConstructorArguments[1].Value;
                    //var ignoreMixin = (bool)attrData.ConstructorArguments[1].Value;
                    //var ignoreMixinProperties = (bool)attrData.ConstructorArguments[1].Value;
                    disco.SetIgnoredContent(contentAliasToIgnore /*, ignoreContent, ignoreMixin, ignoreMixinProperties*/);
                    break;

                case "Umbraco.ModelsBuilder.RenameContentTypeAttribute":
                    var contentAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                    var contentRenamed       = (string)attrData.ConstructorArguments[1].Value;
                    disco.SetRenamedContent(contentAliasToRename, contentRenamed, false);
                    break;

                case "Umbraco.ModelsBuilder.ModelsBaseClassAttribute":
                    var modelsBaseClass = (INamedTypeSymbol)attrData.ConstructorArguments[0].Value;
                    if (modelsBaseClass is IErrorTypeSymbol)
                    {
                        throw new Exception($"Invalid base class type \"{modelsBaseClass.Name}\".");
                    }
                    disco.SetModelsBaseClassName(SymbolDisplay.ToDisplayString(modelsBaseClass));
                    break;

                case "Umbraco.ModelsBuilder.ModelsNamespaceAttribute":
                    var modelsNamespace = (string)attrData.ConstructorArguments[0].Value;
                    disco.SetModelsNamespace(modelsNamespace);
                    break;

                case "Umbraco.ModelsBuilder.ModelsUsingAttribute":
                    var usingNamespace = (string)attrData.ConstructorArguments[0].Value;
                    disco.SetUsingNamespace(usingNamespace);
                    break;
                }
            }
        }
        private static void ParseClassSymbols(ParseResult disco, ISymbol symbol)
        {
            foreach (var attrData in symbol.GetAttributes())
            {
                var attrClassSymbol = attrData.AttributeClass;

                // handle errors
                if (attrClassSymbol is IErrorTypeSymbol)
                {
                    continue;
                }
                if (attrData.AttributeConstructor == null)
                {
                    continue;
                }

                var attrClassName = SymbolDisplay.ToDisplayString(attrClassSymbol);
                switch (attrClassName)
                {
                case "Umbraco.ModelsBuilder.IgnorePropertyTypeAttribute":
                    var propertyAliasToIgnore = (string)attrData.ConstructorArguments[0].Value;
                    disco.SetIgnoredProperty(symbol.Name /*SymbolDisplay.ToDisplayString(symbol)*/, propertyAliasToIgnore);
                    break;

                case "Umbraco.ModelsBuilder.RenamePropertyTypeAttribute":
                    var propertyAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                    var propertyRenamed       = (string)attrData.ConstructorArguments[1].Value;
                    disco.SetRenamedProperty(symbol.Name /*SymbolDisplay.ToDisplayString(symbol)*/, propertyAliasToRename, propertyRenamed);
                    break;

                // that one causes all sorts of issues with references to Umbraco.Core in Roslyn
                //case "Umbraco.Core.Models.PublishedContent.PublishedContentModelAttribute":
                //    var contentAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                //    disco.SetRenamedContent(contentAliasToRename, symbol.Name /*SymbolDisplay.ToDisplayString(symbol)*/);
                //    break;
                case "Umbraco.ModelsBuilder.ImplementContentTypeAttribute":
                    var contentAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                    disco.SetRenamedContent(contentAliasToRename, symbol.Name, true /*SymbolDisplay.ToDisplayString(symbol)*/);
                    break;
                }
            }
        }
        private static void ParseAssemblySymbols(ParseResult disco, ISymbol symbol)
        {
            foreach (var attrData in symbol.GetAttributes())
            {
                var attrClassSymbol = attrData.AttributeClass;

                // handle errors
                if (attrClassSymbol is IErrorTypeSymbol) continue;
                if (attrData.AttributeConstructor == null) continue;

                var attrClassName = SymbolDisplay.ToDisplayString(attrClassSymbol);
                switch (attrClassName)
                {
                    case "Umbraco.ModelsBuilder.IgnoreContentTypeAttribute":
                        var contentAliasToIgnore = (string)attrData.ConstructorArguments[0].Value;
                        // see notes in IgnoreContentTypeAttribute
                        //var ignoreContent = (bool)attrData.ConstructorArguments[1].Value;
                        //var ignoreMixin = (bool)attrData.ConstructorArguments[1].Value;
                        //var ignoreMixinProperties = (bool)attrData.ConstructorArguments[1].Value;
                        disco.SetIgnoredContent(contentAliasToIgnore /*, ignoreContent, ignoreMixin, ignoreMixinProperties*/);
                        break;

                    case "Umbraco.ModelsBuilder.RenameContentTypeAttribute":
                        var contentAliasToRename = (string) attrData.ConstructorArguments[0].Value;
                        var contentRenamed = (string)attrData.ConstructorArguments[1].Value;
                        disco.SetRenamedContent(contentAliasToRename, contentRenamed, false);
                        break;

                    case "Umbraco.ModelsBuilder.ModelsBaseClassAttribute":
                        var modelsBaseClass = (INamedTypeSymbol) attrData.ConstructorArguments[0].Value;
                        if (modelsBaseClass is IErrorTypeSymbol)
                            throw new Exception(string.Format("Invalid base class type \"{0}\".", modelsBaseClass.Name));
                        disco.SetModelsBaseClassName(SymbolDisplay.ToDisplayString(modelsBaseClass));
                        break;

                    case "Umbraco.ModelsBuilder.ModelsNamespaceAttribute":
                        var modelsNamespace= (string) attrData.ConstructorArguments[0].Value;
                        disco.SetModelsNamespace(modelsNamespace);
                        break;

                    case "Umbraco.ModelsBuilder.ModelsUsingAttribute":
                        var usingNamespace = (string)attrData.ConstructorArguments[0].Value;
                        disco.SetUsingNamespace(usingNamespace);
                        break;
                }
            }
        }
        private static void ParseClassSymbols(ParseResult disco, ISymbol symbol)
        {
            foreach (var attrData in symbol.GetAttributes())
            {
                var attrClassSymbol = attrData.AttributeClass;

                // handle errors
                if (attrClassSymbol is IErrorTypeSymbol) continue;
                if (attrData.AttributeConstructor == null) continue;

                var attrClassName = SymbolDisplay.ToDisplayString(attrClassSymbol);
                switch (attrClassName)
                {
                    case "Umbraco.ModelsBuilder.IgnorePropertyTypeAttribute":
                        var propertyAliasToIgnore = (string)attrData.ConstructorArguments[0].Value;
                        disco.SetIgnoredProperty(symbol.Name /*SymbolDisplay.ToDisplayString(symbol)*/, propertyAliasToIgnore);
                        break;
                    case "Umbraco.ModelsBuilder.RenamePropertyTypeAttribute":
                        var propertyAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                        var propertyRenamed = (string)attrData.ConstructorArguments[1].Value;
                        disco.SetRenamedProperty(symbol.Name /*SymbolDisplay.ToDisplayString(symbol)*/, propertyAliasToRename, propertyRenamed);
                        break;
                    // that one causes all sorts of issues with references to Umbraco.Core in Roslyn
                    //case "Umbraco.Core.Models.PublishedContent.PublishedContentModelAttribute":
                    //    var contentAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                    //    disco.SetRenamedContent(contentAliasToRename, symbol.Name /*SymbolDisplay.ToDisplayString(symbol)*/);
                    //    break;
                    case "Umbraco.ModelsBuilder.ImplementContentTypeAttribute":
                        var contentAliasToRename = (string)attrData.ConstructorArguments[0].Value;
                        disco.SetRenamedContent(contentAliasToRename, symbol.Name, true /*SymbolDisplay.ToDisplayString(symbol)*/);
                        break;
                }
            }
        }