internal static void RegisterCustomExtension(ProjectModelExtensionNode node)
 {
     customNodes.Add(node);
     LoadExtensions();
 }
 internal static void UnregisterCustomExtension(ProjectModelExtensionNode node)
 {
     customNodes.Remove(node);
     LoadExtensions();
 }
        /// <summary>
        /// Ensures that this project has the extensions it requires according to its current state
        /// </summary>
        /// <remarks>
        /// This method will load new extensions that this project supports and will unload extensions that are not supported anymore.
        /// The set of extensions that a project supports may change over time, depending on the status of the project.
        /// </remarks>
        public void RefreshExtensions()
        {
            // First of all look for new extensions that should be attached

            // Get the list of nodes for which an extension has been created

            var allExtensions = extensionChain.GetAllExtensions().OfType <WorkspaceObjectExtension> ().ToList();
            var loadedNodes   = allExtensions.Select(ex => ex.SourceExtensionNode).ToList();
            var newExtensions = ImmutableList <WorkspaceObjectExtension> .Empty;

            ProjectModelExtensionNode lastAddedNode = null;

            foreach (ProjectModelExtensionNode node in GetModelExtensions(extensionContext))
            {
                // If the node already generated an extension, skip it
                if (loadedNodes.Contains(node))
                {
                    lastAddedNode = node;
                    continue;
                }

                // Maybe the node can now generate an extension for this project
                if (node.CanHandleObject(this))
                {
                    var ext = node.CreateExtension();
                    if (ext.SupportsObject(this))
                    {
                        ext.SourceExtensionNode = node;
                        newExtensions           = newExtensions.Add(ext);
                        if (lastAddedNode != null)
                        {
                            // There is an extension before this one. Find it and add the new extension after it.
                            var prevExtension = allExtensions.FirstOrDefault(ex => ex.SourceExtensionNode == lastAddedNode);
                            extensionChain.AddExtension(ext, prevExtension);
                        }
                        else
                        {
                            extensionChain.AddExtension(ext);
                        }
                        ext.Init(this);
                    }
                }
            }

            // Now dispose extensions that are not supported anymore

            foreach (var ext in allExtensions)
            {
                if (!ext.SupportsObject(this))
                {
                    ext.Dispose();
                }
            }

            foreach (var e in newExtensions)
            {
                e.OnExtensionChainCreated();
            }
            foreach (var e in newExtensions)
            {
                OnExtensionActivated(e);
            }
        }