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 MemberCollection(TypeDefinitionModel parent) { this.parent = parent; collectionChangedEvent = new ModelCollectionChangedEvent <MemberModel>(); }
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); } }
/// <summary> /// Updates the parse information. /// </summary> public void Update(IList <IUnresolvedTypeDefinition> oldFile, IList <IUnresolvedTypeDefinition> newFile) { List <ITypeDefinitionModel> oldModels = null; List <ITypeDefinitionModel> newModels = null; bool[] oldTypeDefHandled = null; if (oldFile.Count > 0) { oldTypeDefHandled = new bool[oldFile.Count]; } foreach (var newPart in newFile) { FullTypeName newFullTypeName = newPart.FullTypeName; TypeDefinitionModel model; if (dict.TryGetValue(newFullTypeName.TopLevelTypeName, out model)) { // Existing type changed // Find a matching old part: IUnresolvedTypeDefinition oldPart = null; if (oldTypeDefHandled != null) { for (int i = 0; i < oldTypeDefHandled.Length; i++) { if (oldTypeDefHandled[i]) { continue; } if (oldFile[i].FullTypeName == newFullTypeName) { oldTypeDefHandled[i] = true; oldPart = oldFile[i]; break; } } } model.Update(oldPart, newPart); } else { // New type added model = new TypeDefinitionModel(context, newPart); dict.Add(newFullTypeName.TopLevelTypeName, model); if (newModels == null) { newModels = new List <ITypeDefinitionModel>(); } newModels.Add(model); } } // Remove all old parts that weren't updated: if (oldTypeDefHandled != null) { for (int i = 0; i < oldTypeDefHandled.Length; i++) { if (!oldTypeDefHandled[i]) { IUnresolvedTypeDefinition oldPart = oldFile[i]; TopLevelTypeName topLevelTypeName = oldPart.FullTypeName.TopLevelTypeName; TypeDefinitionModel model; if (dict.TryGetValue(topLevelTypeName, out model)) { // Remove the part from the model if (model.Parts.Count > 1) { model.Update(oldPart, null); } else { dict.Remove(topLevelTypeName); 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); } }