public void WorkspaceProjectChanged_MadeDirty_RetainsComputedState_NotifiesListeners_AndStartsBackgroundWorker()
        {
            // Arrange
            ProjectManager.HostProjectAdded(HostProject);
            ProjectManager.WorkspaceProjectAdded(WorkspaceProject);
            ProjectManager.Reset();

            // Generate the update
            var snapshot      = ProjectManager.GetSnapshot(HostProject);
            var updateContext = snapshot.CreateUpdateContext();

            ProjectManager.ProjectUpdated(updateContext);
            ProjectManager.Reset();

            var project = WorkspaceProject.WithAssemblyName("Test1"); // Simulate a project change

            // Act
            ProjectManager.WorkspaceProjectChanged(project);

            // Assert
            snapshot = ProjectManager.GetSnapshot(project);
            Assert.True(snapshot.IsDirty);

            Assert.False(ProjectManager.ListenersNotified);
            Assert.True(ProjectManager.WorkerStarted);
        }
Ejemplo n.º 2
0
        public void ProjectState_WithWorkspaceProject_Changed()
        {
            // Arrange
            var original = ProjectState.Create(Workspace.Services, HostProject, WorkspaceProject)
                           .WithAddedHostDocument(Documents[2], DocumentState.EmptyLoader)
                           .WithAddedHostDocument(Documents[1], DocumentState.EmptyLoader);

            // Force init
            GC.KeepAlive(original.ProjectEngine);
            GC.KeepAlive(original.TagHelpers);

            var changed = WorkspaceProject.WithAssemblyName("Test1");

            // Act
            var state = original.WithWorkspaceProject(changed);

            // Assert
            Assert.NotEqual(original.Version, state.Version);
            Assert.Same(changed, state.WorkspaceProject);

            Assert.Same(original.ProjectEngine, state.ProjectEngine);
            Assert.NotSame(original.TagHelpers, state.TagHelpers);

            Assert.NotSame(original.Documents[Documents[1].FilePath], state.Documents[Documents[1].FilePath]);
            Assert.NotSame(original.Documents[Documents[1].FilePath], state.Documents[Documents[1].FilePath]);
        }
        protected void AddDepProject(WorkspaceProject depProject)
        {
            ALProjectSymbolsLibrary library = new ALProjectSymbolsLibrary(this.PackageSymbolsCache, this.ALExtensionProxy, false,
                                                                          depProject.ProjectPath, this.PackagesPath);

            library.Load(false);
            if (library.Root != null)
            {
                library.Root.kind = ALSymbolKind.Package;
            }
            this.Dependencies.Add(library);
        }
Ejemplo n.º 4
0
        public void WorkspaceProjectChanged_WithoutHostProject_IgnoresWorkspaceProject()
        {
            // Arrange
            ProjectManager.WorkspaceProjectAdded(WorkspaceProject);
            ProjectManager.Reset();

            var project = WorkspaceProject.WithAssemblyName("Test1"); // Simulate a project change

            // Act
            ProjectManager.WorkspaceProjectChanged(project);

            // Assert
            Assert.Empty(ProjectManager.Projects);

            Assert.Null(ProjectManager.ListenersNotifiedOf);
        }
        public async Task <Metadata> CreateMetadataForProject(WorkspaceProject project)
        {
            string projectName = project.Name;
            var    begin       = new WorkDoneProgressBegin
            {
                Title      = "Avalonia",
                Message    = "Loading metadata for " + projectName,
                Percentage = 0
            };

            using IWorkDoneObserver manager = await _languageServer.WorkDoneManager.Create(begin);


            var outputDllPath = project.OutputFile;

            if (outputDllPath == null)
            {
                manager.OnNext(new WorkDoneProgressReport
                {
                    Message    = "Failed to load metadata for " + projectName + ", building project may solve the problem",
                    Percentage = 100
                });
            }

            var metadata = await CreateMetadataForAssembly(outputDllPath);

            manager.Dispose();

            if (metadata != null)
            {
                manager.OnNext(new WorkDoneProgressReport
                {
                    Message    = "Loaded metadata for " + projectName,
                    Percentage = 100,
                });
            }
            else
            {
                manager.OnNext(new WorkDoneProgressReport
                {
                    Message    = "Failed to load metadata for " + projectName,
                    Percentage = 100
                });
            }

            return(metadata);
        }
Ejemplo n.º 6
0
        public void WorkspaceProjectChanged_WithHostProject_NotifiesListenters()
        {
            // Arrange
            ProjectManager.HostProjectAdded(HostProject);
            ProjectManager.WorkspaceProjectAdded(WorkspaceProject);
            ProjectManager.Reset();

            // Act
            ProjectManager.WorkspaceProjectChanged(WorkspaceProject.WithAssemblyName("Test1"));

            // Assert
            var snapshot = ProjectManager.GetSnapshot(WorkspaceProject);

            Assert.True(snapshot.IsInitialized);

            Assert.Equal(ProjectChangeKind.ProjectChanged, ProjectManager.ListenersNotifiedOf);
        }
Ejemplo n.º 7
0
        public async Task WorkspaceProjectChange_CachesOutput()
        {
            // Arrange
            var original =
                ProjectState.Create(Workspace.Services, HostProject)
                .WithAddedHostDocument(HostDocument, DocumentState.EmptyLoader);

            var(originalOutput, originalInputVersion, originalOutputVersion) = await GetOutputAsync(original, HostDocument);

            // Act
            var state = original.WithWorkspaceProject(WorkspaceProject.WithAssemblyName("Test2"));

            // Assert
            var(actualOutput, actualInputVersion, actualOutputVersion) = await GetOutputAsync(state, HostDocument);

            Assert.Same(originalOutput, actualOutput);
            Assert.Equal(originalInputVersion, actualInputVersion);
            Assert.Equal(originalOutputVersion, actualOutputVersion);
            Assert.Equal(await state.GetComputedStateVersionAsync(new DefaultProjectSnapshot(state)), actualInputVersion);
        }
        public void HostProjectBuildComplete_FindsChangedWorkspaceProject_AndStartsBackgroundWorker()
        {
            // Arrange
            Assert.True(Workspace.TryApplyChanges(WorkspaceProject.Solution));
            ProjectManager.HostProjectAdded(HostProject);
            var project = WorkspaceProject.WithAssemblyName("Test1"); // Simulate a project change

            ProjectManager.WorkspaceProjectAdded(project);
            ProjectManager.Reset();

            // Act
            ProjectManager.HostProjectBuildComplete(HostProject);

            // Assert
            var snapshot = ProjectManager.GetSnapshot(HostProject);

            Assert.True(snapshot.IsDirty);
            Assert.True(snapshot.IsInitialized);

            Assert.False(ProjectManager.ListenersNotified);
            Assert.True(ProjectManager.WorkerStarted);
        }
Ejemplo n.º 9
0
        public void ProjectState_WithWorkspaceProject_CallsWorkspaceProjectChangeOnDocumentState()
        {
            // Arrange
            var callCount = 0;

            var documents = new Dictionary <string, DocumentState>();

            documents[Documents[1].FilePath] = TestDocumentState.Create(Workspace.Services, Documents[1], onWorkspaceProjectChange: () => callCount++);
            documents[Documents[2].FilePath] = TestDocumentState.Create(Workspace.Services, Documents[2], onWorkspaceProjectChange: () => callCount++);

            var original = ProjectState.Create(Workspace.Services, HostProject, WorkspaceProject);

            original.Documents = documents;

            var changed = WorkspaceProject.WithAssemblyName("Test1");

            // Act
            var state = original.WithWorkspaceProject(changed);

            // Assert
            Assert.NotEqual(original.Version, state.Version);
            Assert.Equal(2, callCount);
        }
        public void ProjectUpdated_WhenWorkspaceProjectChanged_StillDirty_WithoutSignificantChanges_DoesNotNotifyListeners_AndStartsBackgroundWorker()
        {
            // Arrange
            ProjectManager.HostProjectAdded(HostProject);
            ProjectManager.WorkspaceProjectAdded(WorkspaceProject);
            ProjectManager.Reset();

            // Generate an update based on the original state
            var snapshot      = ProjectManager.GetSnapshot(HostProject);
            var updateContext = snapshot.CreateUpdateContext();

            ProjectManager.ProjectUpdated(updateContext);
            ProjectManager.Reset();

            var project = WorkspaceProject.WithAssemblyName("Test1"); // Simulate a project change

            ProjectManager.WorkspaceProjectChanged(project);
            ProjectManager.Reset();

            // Now start computing another update
            snapshot      = ProjectManager.GetSnapshot(HostProject);
            updateContext = snapshot.CreateUpdateContext();

            project = project.WithAssemblyName("Test2"); // Simulate a project change
            ProjectManager.WorkspaceProjectChanged(project);
            ProjectManager.Reset();

            // Act
            ProjectManager.ProjectUpdated(updateContext); // Still dirty because the project changed while computing the update

            // Assert
            snapshot = ProjectManager.GetSnapshot(project);
            Assert.True(snapshot.IsDirty);

            Assert.False(ProjectManager.ListenersNotified);
            Assert.True(ProjectManager.WorkerStarted);
        }
        protected void ProcessDependencies(ALProjectFile projectFile, bool forceReload)
        {
            //load list of packages
            ALAppPackageFileInfosCollection packageFiles = new ALAppPackageFileInfosCollection();

            packageFiles.LoadFromFolder(this.PackagesPath);

            //collect list of projects from other folders
            WorkspaceProjectsCollection workspaceProjects = null;

            if ((this.WorkspaceFolders != null) && (this.WorkspaceFolders.Length > 1))
            {
                workspaceProjects = new WorkspaceProjectsCollection(this.WorkspaceFolders);
                workspaceProjects.Load();
            }

            //collect packages
            if (projectFile.dependencies != null)
            {
                for (int i = 0; i < projectFile.dependencies.Length; i++)
                {
                    bool workspaceProjectFound = false;
                    if (workspaceProjects != null)
                    {
                        WorkspaceProject depProject = workspaceProjects.FindByReference(projectFile.dependencies[i].appId,
                                                                                        projectFile.dependencies[i].publisher, projectFile.dependencies[i].name, projectFile.dependencies[i].version);
                        if (depProject != null)
                        {
                            workspaceProjectFound = true;
                            this.AddDepProject(depProject);
                        }
                    }

                    if (!workspaceProjectFound)
                    {
                        this.AddPackage(packageFiles, projectFile.dependencies[i].publisher,
                                        projectFile.dependencies[i].name, projectFile.dependencies[i].version, forceReload);
                    }
                }
            }

            //collect system packages
            if (!String.IsNullOrWhiteSpace(projectFile.application))
            {
                this.AddPackage(packageFiles, "Microsoft", "Application", projectFile.application, forceReload);
            }

            if (!String.IsNullOrWhiteSpace(projectFile.platform))
            {
                this.AddPackage(packageFiles, "Microsoft", "System", projectFile.platform, forceReload);
            }

            if (!String.IsNullOrWhiteSpace(projectFile.test))
            {
                this.AddPackage(packageFiles, "Microsoft", "Test", projectFile.test, forceReload);
            }

            //collect dependencies

            if (this.Dependencies.Count > 0)
            {
                ALSymbolInformation dependenciesList = new ALSymbolInformation(ALSymbolKind.Dependencies, "Dependencies");
                for (int i = 0; i < this.Dependencies.Count; i++)
                {
                    dependenciesList.AddChildSymbol(this.Dependencies[i].Root);
                }
                this.Root.AddChildSymbol(dependenciesList);
            }
        }