private void Merge(String baseFolder, IEnumerable <FrameworkEntity> list, TextWriter writer) { if (list.Count() < 2) { this.Log(Level.Error, "Cannot merge less than 2 entities"); } IEnumerable <FrameworkEntityType> types = list.Select(e => e.type).Distinct(); if (types.Count() > 1) { this.Log(Level.Error, "Cannot merge different type of entities"); } IEnumerable <String> files = list.Select(e => e.GetPath(baseFolder, DocumentType.Model)); if (files.Count() < list.Count()) { this.Log(Level.Error, "Cannot merge because some entities have no path."); } Action <TypedEntity, TypedEntity> mergeFunctions = (t1, t2) => Merge <FunctionEntity>(t1.Functions, t2.Functions, new FunctionComparer()); Action <ClassEntity, ClassEntity> mergeMethods = (c1, c2) => Merge <MethodEntity>(c1.Methods, c2.Methods, new MethodComparer()); Action <ClassEntity, ClassEntity> mergeProperties = (c1, c2) => Merge <PropertyEntity>(c1.Properties, c2.Properties, new PropertyComparer()); if (writer != null) { foreach (var e in list) { writer.WriteLine(" Merging {0}", e.name); } } FrameworkEntityType type = types.First(); switch (type) { case FrameworkEntityType.T: LoadAndMerge <TypedEntity>(files, writer, mergeFunctions); break; case FrameworkEntityType.C: LoadAndMerge <ClassEntity>(files, writer, mergeFunctions, mergeMethods, mergeProperties); break; case FrameworkEntityType.P: LoadAndMerge <ProtocolEntity>(files, writer, mergeFunctions, mergeMethods, mergeProperties); break; } }
protected T FindAndLoad <T>(String baseFolder, IList <FrameworkEntity> entities, FrameworkEntityType type, String name, bool useCache = true) where T : BaseEntity { if (String.IsNullOrEmpty(name)) { return(null); } // Try the cache first String key = type + ":" + name; BaseEntity result = null; if (useCache && !cache.TryGetValue(key, out result)) { //this.Log (Level.Verbose, "Cache miss for '" + type + "' and name '" + name + "'"); var candidates = entities.Where(e => e.type == type && e.name == name).ToList(); FrameworkEntity candidate = candidates.FirstOrDefault(); // Print a warning if multiple if (candidates.Count > 1) { this.Log(Level.Warning, "Found several entities with the type '" + type + "' and name '" + name + "'"); } if (candidate != null) { String file = candidate.GetPath(baseFolder, DocumentType.Model); result = BaseEntity.LoadFrom <T> (file); } } else { //this.Log (Level.Verbose, "Cache hit for '" + type + "' and name '" + name + "'"); } // Add to MRU if (useCache && result != null) { cache.Add(key, result); } return(result as T); }