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"); }
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; }
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; }
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"); }