public ITypeDefinitionModel CreateTypeDefinitionModel(IEntityModelContext context, params IUnresolvedTypeDefinition[] parts) { var model = new TypeDefinitionModel(context, parts[0]); for (int i = 1; i < parts.Length; i++) { model.Update(null, parts[i]); } return(model); }
public void Update(IList <IUnresolvedTypeDefinition> oldTypes, IList <IUnresolvedTypeDefinition> newTypes) { List <ITypeDefinitionModel> oldModels = null; List <ITypeDefinitionModel> newModels = null; bool[] oldTypeDefHandled = null; if (oldTypes != null) { oldTypeDefHandled = new bool[oldTypes.Count]; } if (newTypes != null) { foreach (var newPart in newTypes) { TypeDefinitionModel model = FindModel(newPart.Name, newPart.TypeParameters.Count); if (model != null) { // Existing type changed // Find a matching old part: IUnresolvedTypeDefinition oldPart = null; if (oldTypes != null) { for (int i = 0; i < oldTypeDefHandled.Length; i++) { if (oldTypeDefHandled[i]) { continue; } if (oldTypes[i].Name == newPart.Name && oldTypes[i].TypeParameters.Count == newPart.TypeParameters.Count) { oldTypeDefHandled[i] = true; oldPart = oldTypes[i]; break; } } } model.Update(oldPart, newPart); } else { // New type added model = new TypeDefinitionModel(context, newPart); list.Add(model); if (newModels == null) { newModels = new List <ITypeDefinitionModel>(); } newModels.Add(model); } } } // Remove all old parts that weren't updated: if (oldTypes != null) { for (int i = 0; i < oldTypeDefHandled.Length; i++) { if (!oldTypeDefHandled[i]) { IUnresolvedTypeDefinition oldPart = oldTypes[i]; TypeDefinitionModel model = FindModel(oldPart.Name, oldPart.TypeParameters.Count); if (model != null) { // Remove the part from the model if (model.Parts.Count > 1) { model.Update(oldPart, null); } else { list.Remove(model); if (oldModels == null) { oldModels = new List <ITypeDefinitionModel>(); } oldModels.Add(model); } } } } } // Raise the event if necessary: if (collectionChangedEvent.ContainsHandlers && (oldModels != null || newModels != null)) { IReadOnlyCollection <ITypeDefinitionModel> emptyList = EmptyList <ITypeDefinitionModel> .Instance; collectionChangedEvent.Fire(oldModels ?? emptyList, newModels ?? emptyList); } }