/// <summary>
        /// Configure store events to add assembly references when modules or the mainboard are added to the diagram
        /// </summary>
        private void SetupAssemblyReferencing()
        {
            //Get the DTE Project from the IVsHierarchy
            project = GetProject();

            if (project != null)
            {
                //Get the MF version we are running under (e.g. 4.1 or 4.2)
                var prop = project.Properties.Item("TargetFrameworkMoniker");
                if (prop != null)
                {
                    ProjectMFVersion = ParseTargetVersion(prop.Value as string);
                }

                StoreGadgeteerCoreVersionNumber();
                var vsproject = (VSProject2)project.Object;
                referencesEvents = vsproject.Events.ReferencesEvents;
                if (referencesEvents != null)
                {
                    referencesEvents.ReferenceAdded   += ReferencesEvents_ReferenceChangeHandler;
                    referencesEvents.ReferenceRemoved += ReferencesEvents_ReferenceChangeHandler;
                    referencesEvents.ReferenceChanged += ReferencesEvents_ReferenceChangeHandler;
                }

                //This is how the DSL objects access the MF version being used
                this.Store.PropertyBag[GadgeteerModel.ProjectMicroframeworkVersionKey] = ProjectMFVersion;

                //Hookup to Module creation events
                var hardware = this.Store.DomainDataDirectory.FindDomainClass(GadgeteerHardware.DomainClassId);
                this.Store.EventManagerDirectory.ElementAdded.Add(hardware, new EventHandler <ElementAddedEventArgs>(GadgeteerHardwareAdded));
                this.Store.EventManagerDirectory.ElementDeleted.Add(hardware, new EventHandler <ElementDeletedEventArgs>(GadgeteerHardwareDeleted));
            }
        }
Exemplo n.º 2
0
 void SetupEvents(VSProject vsProject)
 {
     _events = vsProject.Events.ReferencesEvents;
     _events.ReferenceAdded += r =>
     {
         var p = r.SourceProject;
         if (p != null)
         {
             References.Add(p);
         }
         _service._treeRebuildQueued = true;
     };
     _events.ReferenceRemoved += r =>
     {
         var p = r.SourceProject;
         if (p != null)
         {
             References.Remove(p);
         }
         _service._treeRebuildQueued = true;
     };
     _events.ReferenceChanged += delegate
     {
         RescanQueued = true;
     };
 }
Exemplo n.º 3
0
 public static void Init()
 {
     _dteEvents      = DteExtensions.DTE.Events;
     _documentEvents = _dteEvents.DocumentEvents;
     _documentEvents.DocumentSaved += DocumentEventsOnDocumentSaved;
     _buildEvents = _dteEvents.BuildEvents;
     _buildEvents.OnBuildBegin    += BuildEventsOnOnBuildBegin;
     _solutionEvents               = _dteEvents.SolutionEvents;
     _solutionEvents.Opened       += SolutionEventsOnOpened;
     _solutionEvents.AfterClosing += SolutionEventsOnAfterClosing;
     _referencesEvents             = ((ReferencesEvents)_dteEvents.GetObject("CSharpReferencesEvents"));
 }
Exemplo n.º 4
0
        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            if (this.referencesEvents != null)
            {
                this.referencesEvents.ReferenceAdded   -= this.ReferencesUpdated;
                this.referencesEvents.ReferenceChanged -= this.ReferencesUpdated;
                this.referencesEvents.ReferenceRemoved -= this.ReferencesUpdated;
                this.referencesEvents = null;
            }

            if (this.importsEvents != null)
            {
                this.importsEvents.ImportAdded   -= this.ImportsUpdated;
                this.importsEvents.ImportRemoved -= this.ImportsUpdated;
                this.importsEvents = null;
            }

            if (this.watchers != null)
            {
                foreach (var watcher in this.watchers)
                {
                    watcher.Changed -= this.FileChanged;
                    watcher.Renamed -= this.FileChanged;
                    watcher.Deleted -= this.FileChanged;
                    watcher.Created -= this.FileChanged;

                    watcher.Dispose();
                }

                this.watchers.Clear();
                this.watchers = null;
            }

            if (this.intellisenseSession != null)
            {
                if (this.handler != null)
                {
                    this.intellisenseSession.DocumentUpdated -= this.handler.Handler;
                    this.handler = null;
                }

                this.intellisenseSession = null;
            }

            if (this.appDomain != null)
            {
                AppDomain.Unload(this.appDomain);
            }

            this.appDomain = null;
        }
        public void StopTracking()
        {
            if (referencesEvents == null)
                return;

            referencesEvents.ReferenceAdded -= ReferencesEventsOnReferenceAdded;
            referencesEvents.ReferenceRemoved -= ReferencesEventsOnReferenceRemoved;
            referencesEvents.ReferenceChanged -= ReferencesEventsOnReferenceChanged;

            dteWithEvents.FileChangeEventsListener.FileChanged -= FileChangedOnDisk;
            referencesEvents = null;

            timer.Change(Timeout.Infinite, Timeout.Infinite);
            triggerReferenceChangedTimer.Change(Timeout.Infinite, Timeout.Infinite);
            filesChangedOnDisk.Clear();
        }
        public void StartTracking()
        {
            if (project == null)
                return;

            referencesEvents = project.Events.ReferencesEvents;
            referencesEvents.ReferenceAdded += ReferencesEventsOnReferenceAdded;
            referencesEvents.ReferenceRemoved += ReferencesEventsOnReferenceRemoved;
            referencesEvents.ReferenceChanged += ReferencesEventsOnReferenceChanged;

            dteWithEvents.FileChangeEventsListener.FileChanged += FileChangedOnDisk;

            foreach (var reference in project.References.OfType<Reference>())
            {
                StartListeningToReference(reference);
            }
        }
Exemplo n.º 7
0
            public void CheckForLoadedStateChanges()
            {
                var project = Project.GetObjectSafe <VSProject>();

                if (project != null && _events == null)
                {
                    SetupEvents(project);
                    Rescan();
                }
                if (project == null && _events != null)
                {
                    _events = null;
                    References.Clear();
                    _service._treeRebuildQueued = true;
                    TargetPathUpdateQueued      = true;
                }
            }
Exemplo n.º 8
0
        /// <summary>
        /// Initialize new instance of <see cref="VsProjectAssembly" /> from given <see cref="Project" />.
        /// </summary>
        /// <param name="assemblyProject">Project that will be represented by initialized assembly.</param>
        /// <param name="vs">The visual studio services.</param>
        /// <param name="namesProvider">The <see cref="CodeElement"/> names provider.</param>
        /// <param name="infoBuilder">The method signature information builder.</param>
        /// <param name="itemBuilder">The method item builder.</param>
        public VsProjectAssembly(Project assemblyProject, VisualStudioServices vs,
                                 CodeElementNamesProvider namesProvider, MethodInfoBuilder infoBuilder, MethodItemBuilder itemBuilder)
        {
            VS = vs;
            _assemblyProject = assemblyProject.Object as VSProject;
            _referenceEvents = _assemblyProject.Events.ReferencesEvents;
            _namesProvider   = namesProvider;
            Searcher         = new CodeElementSearcher(this);

            InfoBuilder = infoBuilder;
            ItemBuilder = itemBuilder;

            InfoBuilder.Initialize(this);
            ItemBuilder.Initialize(this);

            OnTypeSystemInitialized += initializeAssembly;
        }
Exemplo n.º 9
0
        public void StopTracking()
        {
            if (referencesEvents == null)
            {
                return;
            }

            referencesEvents.ReferenceAdded   -= ReferencesEventsOnReferenceAdded;
            referencesEvents.ReferenceRemoved -= ReferencesEventsOnReferenceRemoved;
            referencesEvents.ReferenceChanged -= ReferencesEventsOnReferenceChanged;

            dteWithEvents.FileChangeEventsListener.FileChanged -= FileChangedOnDisk;
            referencesEvents = null;

            timer.Change(Timeout.Infinite, Timeout.Infinite);
            triggerReferenceChangedTimer.Change(Timeout.Infinite, Timeout.Infinite);
            filesChangedOnDisk.Clear();
        }
Exemplo n.º 10
0
        public void StartTracking()
        {
            if (project == null)
            {
                return;
            }

            referencesEvents = project.Events.ReferencesEvents;
            referencesEvents.ReferenceAdded   += ReferencesEventsOnReferenceAdded;
            referencesEvents.ReferenceRemoved += ReferencesEventsOnReferenceRemoved;
            referencesEvents.ReferenceChanged += ReferencesEventsOnReferenceChanged;

            dteWithEvents.FileChangeEventsListener.FileChanged += FileChangedOnDisk;

            foreach (var reference in project.References.OfType <Reference>())
            {
                StartListeningToReference(reference);
            }
        }
Exemplo n.º 11
0
        protected override void OnDocumentClosing(EventArgs e)
        {
            //If the doc data is dirty we need to generate the code before the file closes. Otherwise we can leave the model and the code file
            //out of sync
            if (IsDocDirty)
            {
                RunCodeGeneration();
            }

            base.OnDocumentClosing(e);

            if (referencesEvents != null)
            {
                referencesEvents.ReferenceAdded   -= ReferencesEvents_ReferenceChangeHandler;
                referencesEvents.ReferenceRemoved -= ReferencesEvents_ReferenceChangeHandler;
                referencesEvents.ReferenceChanged -= ReferencesEvents_ReferenceChangeHandler;
                referencesEvents = null;
            }
        }
            /// <summary>
            /// Initializes a new instance of the <see cref="ProjectListener"/> class.
            /// </summary>
            /// <param name="project">The project.</param>
            public ProjectListener(SolutionManagerService solutionManager, ProjectNode project, EventHandler<ProjectChangedEventArg> callback)
            {
                Debug.Assert(project != null);
                _solutionManager = solutionManager;
                Name = project.UniqueName;
                VSProject prj = project.VSProject;
                if (prj == null)
                {
                    _referencesEvents = null;
                    return;
                }

                _referencesEvents = prj.Events.ReferencesEvents;
                _referencesEvents.ReferenceAdded += new _dispReferencesEvents_ReferenceAddedEventHandler(OnReferenceAdded);
                _referencesEvents.ReferenceChanged += new _dispReferencesEvents_ReferenceChangedEventHandler(OnReferenceChanged);
                _referencesEvents.ReferenceRemoved += new _dispReferencesEvents_ReferenceRemovedEventHandler(OnReferenceRemoved);
                _callback = callback;
                _enabled = true;
            }
Exemplo n.º 13
0
        /// <summary>
        /// Initializes the proxy.
        /// </summary>
        /// <param name="projectId">
        /// The project id.
        /// </param>
        private void Init(string projectId)
        {
            Task.Run(() =>
            {
                try
                {
                    var visualStudioProject = IntellisenseProxy.GetVisualStudioProjectByUniqueName(projectId);
                    var projectName         = "Unknown project";
                    var configFile          = (string)null;
                    var assemblies          = new string[0];

                    if (visualStudioProject != null)
                    {
                        projectName = visualStudioProject.Project.Name;

                        try
                        {
                            this.referencesEvents = visualStudioProject.Events.ReferencesEvents;

                            this.referencesEvents.ReferenceAdded   += this.ReferencesUpdated;
                            this.referencesEvents.ReferenceChanged += this.ReferencesUpdated;
                            this.referencesEvents.ReferenceRemoved += this.ReferencesUpdated;
                        }
                        catch (NotImplementedException)
                        {
                            //// CPS does not have reference events.
                        }

                        try
                        {
                            this.importsEvents                = visualStudioProject.Events.ImportsEvents;
                            this.importsEvents.ImportAdded   += this.ImportsUpdated;
                            this.importsEvents.ImportRemoved += this.ImportsUpdated;
                        }
                        catch (NotImplementedException)
                        {
                            //// CPS does not have import events.
                        }

                        configFile = visualStudioProject.Project.ProjectItems.OfType <ProjectItem>().FirstOrDefault(i => i.Name.EndsWith(".config", StringComparison.OrdinalIgnoreCase))?.FileNames[0];

                        assemblies = visualStudioProject.References.Cast <Reference>()
                                     .Where(r =>
                        {
                            try
                            {
                                return(!string.IsNullOrEmpty(r.Path));
                            }
                            catch
                            {
                                return(false);
                            }
                        })
                                     .Select(r => r.Path)
                                     .ToArray();
                    }

                    var setupInfomation = AppDomain.CurrentDomain.SetupInformation;

                    setupInfomation.ApplicationBase    = string.Empty;
                    setupInfomation.ConfigurationFile  = configFile;
                    setupInfomation.LoaderOptimization = LoaderOptimization.SingleDomain;

                    AppDomain.CurrentDomain.AssemblyResolve += IntellisenseProxy.AppDomainFix;

                    this.appDomain = AppDomain.CreateDomain($"Intellisense project {projectName} domain", null, setupInfomation);

                    object[] arguments =
                    {
                        assemblies,
                        typeof(ConnectQlContext).Assembly.Location
                    };

                    this.watchPaths = assemblies
                                      .Concat(new[]
                    {
                        configFile
                    }).ToArray();

                    this.WatchPaths(this.watchPaths);

                    this.handler = new RemoteEventHandler <byte[]>(this.IntellisenseSessionOnDocumentUpdated);

                    this.intellisenseSession = (AppDomainIntellisenseSession)this.appDomain.CreateInstanceFromAndUnwrap(
                        typeof(AppDomainIntellisenseSession).Assembly.Location,
                        typeof(AppDomainIntellisenseSession).FullName ?? string.Empty,
                        false,
                        BindingFlags.CreateInstance,
                        null,
                        arguments,
                        CultureInfo.CurrentCulture,
                        null);

                    this.intellisenseSession.DocumentUpdated += this.handler.Handler;

                    this.Initialized?.Invoke(this, EventArgs.Empty);
                }
                catch (Exception)
                {
                    this.Dispose();

                    Task.Run(async() =>
                    {
                        await Task.Delay(TimeSpan.FromSeconds(1));

                        this.Init(projectId);
                    });
                }
                finally
                {
                    AppDomain.CurrentDomain.AssemblyResolve -= IntellisenseProxy.AppDomainFix;
                }
            });
        }