コード例 #1
0
        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);
        }
コード例 #2
0
 public MemberCollection(TypeDefinitionModel parent)
 {
     this.parent            = parent;
     collectionChangedEvent = new ModelCollectionChangedEvent <MemberModel>();
 }
コード例 #3
0
        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);
            }
        }