Ejemplo n.º 1
0
        private IEnumerable<AssetIdentifier> DiscoverAssets(IAssetResolver assetResolver,
                                                            IEnumerable<Assembly> assemblies)
        {
            TraceSources.GeneratorSource.TraceEvent(TraceEventType.Start, 0, "Discovering assets");
            HashSet<AssetIdentifier> distinctSet = new HashSet<AssetIdentifier>();
            IFilterContext filterContext = new FilterContext(this._cache, assetResolver, FilterState.Discovery);

            // find and filter all types from all assemblies 
            foreach (Assembly asm in assemblies)
            {
                foreach (Type t in asm.GetTypes())
                {
                    // check if type survives filtering
                    AssetIdentifier typeAsset = AssetIdentifier.FromMemberInfo(t);

                    if (this.IsFiltered(filterContext, typeAsset)) 
                        continue;

                    /* type was not filtered */
                    TraceSources.GeneratorSource.TraceEvent(TraceEventType.Information, 0, "{0}", typeAsset.AssetId);

                    // generate namespace hierarchy
                    if (!string.IsNullOrEmpty(t.Namespace))
                    {
                        Version nsVersion = t.Module.Assembly.GetName().Version;

                        string[] fragments = t.Namespace.Split('.');
                        for (int i = fragments.Length; i > 0; i--)
                        {
                            string ns = string.Join(".", fragments, 0, i);
                            AssetIdentifier nsAsset = AssetIdentifier.FromNamespace(ns, nsVersion);
                            if (distinctSet.Add(nsAsset))
                                yield return nsAsset;
                        }
                    }

                    if (distinctSet.Add(typeAsset))
                        yield return typeAsset;


                    MemberInfo[] members =
                        t.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public |
                                     BindingFlags.NonPublic);

                    foreach (MemberInfo member in members)
                    {
                        AssetIdentifier memberAsset = AssetIdentifier.FromMemberInfo(member);
                        if (this.IsFiltered(filterContext, memberAsset)) 
                            continue;

                        TraceSources.GeneratorSource.TraceEvent(TraceEventType.Information, 0, "{0}",
                                                                memberAsset.AssetId);
                        if (distinctSet.Add(memberAsset))
                            yield return memberAsset;
                    }
                }

                yield return AssetIdentifier.FromAssembly(asm);
            }

            TraceSources.GeneratorSource.TraceEvent(TraceEventType.Stop, 0, "Discovering assets");
        }
Ejemplo n.º 2
0
        public bool IsFiltered(AssetIdentifier assetId)
        {
            IFilterContext filterContext = new FilterContext(this.Cache, this.AssetResolver, FilterState.Generating);
            for (int i = 0; i < this._filters.Length; i++)
            {
                if (this._filters[i].Filter(filterContext, assetId))
                {
                    TraceSources.GeneratorSource.TraceEvent(TraceEventType.Verbose,
                                        0,
                                        "{0} - Filtered by {1}",
                                        assetId.AssetId, this._filters[i]);
                    return true;
                }
            }

            return false;
        }
Ejemplo n.º 3
0
        public bool IsFiltered(AssetIdentifier assetId)
        {
            IFilterContext filterContext = new FilterContext(this.AssetResolver);
            for (int i = 0; i < this._filters.Length; i++)
            {
                if (this._filters[i].Filter(filterContext, assetId))
                    return true;
            }

            return false;
        }
Ejemplo n.º 4
0
        private IEnumerable<AssetIdentifier> DiscoverAssets(IAssetResolver assetResolver,
                                                            IEnumerable<Assembly> assemblies)
        {
            TraceSources.GeneratorSource.TraceEvent(TraceEventType.Start, 0, "Discovering assets");
            HashSet<AssetIdentifier> distinctSet = new HashSet<AssetIdentifier>();
            IFilterContext filterContext = new FilterContext(assetResolver);

            // find and filter all types from all assemblies 
            foreach (Assembly asm in assemblies)
            {
                foreach (Type t in asm.GetTypes())
                {
                    // generate namespace hierarchy

                    if (!string.IsNullOrEmpty(t.Namespace))
                    {
                        Version nsVersion = t.Module.Assembly.GetName().Version;

                        string[] fragments = t.Namespace.Split('.');
                        for (int i = fragments.Length; i > 0; i--)
                        {
                            string ns = string.Join(".", fragments, 0, i);
                            AssetIdentifier nsAsset = AssetIdentifier.FromNamespace(ns, nsVersion);
                            if (distinctSet.Add(nsAsset))
                                yield return nsAsset;
                        }
                    }

                    // Debug.Write("Type: " + t.Name);
                    // check if type survives filtering
                    bool filtered = false;
                    AssetIdentifier typeAsset = AssetIdentifier.FromMemberInfo(t);
                    foreach (IAssetFilter filter in this.AssetFilters)
                    {
                        if (filter.Filter(filterContext, typeAsset))
                        {
                            filtered = true;
                            TraceSources.GeneratorSource.TraceEvent(TraceEventType.Verbose, 0, "{0} - Filtered by {1}",
                                                                    typeAsset.AssetId, filter);

                            break;
                        }
                    }

                    if (!filtered)
                    {
                        /* type was not filtered */
                        TraceSources.GeneratorSource.TraceEvent(TraceEventType.Information, 0, "{0}", typeAsset.AssetId);

                        if (distinctSet.Add(typeAsset))
                            yield return typeAsset;


                        MemberInfo[] members =
                            t.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public |
                                         BindingFlags.NonPublic);

                        // Debug.Indent();
                        foreach (MemberInfo member in members)
                        {
                            // Debug.Write("Member: " + member.Name);
                            filtered = false;
                            AssetIdentifier memberAsset = AssetIdentifier.FromMemberInfo(member);
                            foreach (IAssetFilter filter in this.AssetFilters)
                            {
                                if (filter.Filter(filterContext, memberAsset))
                                {
                                    filtered = true;
                                    TraceSources.GeneratorSource.TraceEvent(TraceEventType.Verbose, 0,
                                                                            "{0} - Filtered by {1}", memberAsset.AssetId,
                                                                            filter);


// Debug.WriteLine(" - Filtered by " + filter.ToString());
                                    break;
                                }
                            }

                            if (!filtered)
                            {
                                // Debug.WriteLine(" - Added");
                                TraceSources.GeneratorSource.TraceEvent(TraceEventType.Information, 0, "{0}",
                                                                        memberAsset.AssetId);
                                if (distinctSet.Add(memberAsset))
                                    yield return memberAsset;
                            }
                        }


// Debug.Unindent();
                    }
                }

                yield return AssetIdentifier.FromAssembly(asm);
            }

            TraceSources.GeneratorSource.TraceEvent(TraceEventType.Stop, 0, "Discovering assets");
        }