Search in sources :

Example 16 with WorkspaceConfigSnapshot

use of org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot in project n4js by eclipse.

the class WorkspaceConfigAllContainerState method getVisibleContainerHandles.

@Override
public List<String> getVisibleContainerHandles(String containerHandle) {
    WorkspaceConfigSnapshot ws = getWorkspaceConfig();
    ProjectConfigSnapshot project = ws != null ? ws.findProjectByID(containerHandle) : null;
    if (project == null) {
        return Collections.singletonList(containerHandle);
    }
    Set<String> visible = project.getDependencies();
    Set<String> visibleAndSelf = new LinkedHashSet<>();
    visibleAndSelf.add(containerHandle);
    visibleAndSelf.addAll(visible);
    return ImmutableList.copyOf(visibleAndSelf);
}
Also used : LinkedHashSet(java.util.LinkedHashSet) WorkspaceConfigSnapshot(org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot) ProjectConfigSnapshot(org.eclipse.n4js.xtext.workspace.ProjectConfigSnapshot)

Example 17 with WorkspaceConfigSnapshot

use of org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot in project n4js by eclipse.

the class N4JSWorkspaceConfig method recomputeSemanticDependenciesIfNecessary.

/**
 * The list of {@link N4JSProjectConfig#getSemanticDependencies() semantic dependencies} of
 * {@link N4JSProjectConfig}s is tricky for three reasons:
 * <ol>
 * <li>the semantic dependencies do not contain names of non-existing projects (in case of unresolved project
 * references in the package.json),
 * <li>the order of the semantic dependencies depends on the characteristics of the target projects (mainly the
 * {@link ProjectDescription#getDefinesPackage() "defines package"} property),
 * <li>each implicitly added dependency to a definition project PI depends on the characteristics of the target
 * project PT triggering this implicit dependency (i.e. the defined project) <em>and</em> the overall workspace
 * contents (Are definition projects available in the workspace for project PT?).
 * </ol>
 * Therefore, the "semantic dependencies" of a project P can change even without a change in the
 * <code>package.json</code> file of P. To detect and apply these changes is the purpose of this method.
 */
protected WorkspaceChanges recomputeSemanticDependenciesIfNecessary(WorkspaceConfigSnapshot oldWorkspaceConfig, WorkspaceChanges changes) {
    boolean needRecompute = !changes.getAddedProjects().isEmpty() || !changes.getRemovedProjects().isEmpty() || Iterables.any(changes.getChangedProjects(), pc -> affectedByPropertyChanges(pc, oldWorkspaceConfig));
    if (needRecompute) {
        List<ProjectConfigSnapshot> projectsWithChangedSemanticDeps = new ArrayList<>();
        for (XIProjectConfig pc : getProjects()) {
            String projectID = pc.getName();
            N4JSProjectConfigSnapshot oldSnapshot = (N4JSProjectConfigSnapshot) oldWorkspaceConfig.findProjectByID(projectID);
            if (oldSnapshot == null) {
                continue;
            }
            // convert to list in next line, because we want the below #equals() check to also include the order:
            List<String> oldSemanticDeps = new ArrayList<>(oldSnapshot.getDependencies());
            List<String> newSemanticDeps = ((N4JSProjectConfig) pc).getSemanticDependencies().stream().map(ProjectDependency::getPackageName).collect(Collectors.toList());
            if (!newSemanticDeps.equals(oldSemanticDeps)) {
                ProjectConfigSnapshot newSnapshot = configSnapshotFactory.createProjectConfigSnapshot(pc);
                if (!newSnapshot.equals(oldSnapshot)) {
                    projectsWithChangedSemanticDeps.add(newSnapshot);
                }
            }
        }
        if (!projectsWithChangedSemanticDeps.isEmpty()) {
            changes = changes.merge(WorkspaceChanges.createProjectsChanged(projectsWithChangedSemanticDeps));
        }
    }
    return changes;
}
Also used : Iterables(com.google.common.collect.Iterables) ConfigSnapshotFactory(org.eclipse.n4js.xtext.workspace.ConfigSnapshotFactory) URI(org.eclipse.emf.common.util.URI) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) ProjectDependency(org.eclipse.n4js.packagejson.projectDescription.ProjectDependency) ProjectDescriptionLoader(org.eclipse.n4js.utils.ProjectDescriptionLoader) HashMultimap(com.google.common.collect.HashMultimap) N4JSGlobals(org.eclipse.n4js.N4JSGlobals) DefinitionProjectMap(org.eclipse.n4js.workspace.utils.DefinitionProjectMap) FluentIterable(com.google.common.collect.FluentIterable) Map(java.util.Map) XIWorkspaceConfig(org.eclipse.n4js.xtext.workspace.XIWorkspaceConfig) UriExtensions(org.eclipse.xtext.util.UriExtensions) Path(java.nio.file.Path) PackageJsonProperties(org.eclipse.n4js.packagejson.PackageJsonProperties) ProjectType(org.eclipse.n4js.packagejson.projectDescription.ProjectType) XIProjectConfig(org.eclipse.n4js.xtext.workspace.XIProjectConfig) FileURI(org.eclipse.n4js.workspace.locations.FileURI) ImmutableSet(com.google.common.collect.ImmutableSet) Set(java.util.Set) WorkspaceChanges(org.eclipse.n4js.xtext.workspace.WorkspaceChanges) ProjectConfigSnapshot(org.eclipse.n4js.xtext.workspace.ProjectConfigSnapshot) Collectors(java.util.stream.Collectors) WorkspaceConfigSnapshot(org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot) Sets(com.google.common.collect.Sets) Objects(java.util.Objects) List(java.util.List) IterableExtensions(org.eclipse.xtext.xbase.lib.IterableExtensions) Collections(java.util.Collections) ProjectDiscoveryHelper(org.eclipse.n4js.utils.ProjectDiscoveryHelper) ProjectDescription(org.eclipse.n4js.packagejson.projectDescription.ProjectDescription) SemanticDependencySupplier(org.eclipse.n4js.workspace.utils.SemanticDependencySupplier) ProjectConfigSnapshot(org.eclipse.n4js.xtext.workspace.ProjectConfigSnapshot) ArrayList(java.util.ArrayList) XIProjectConfig(org.eclipse.n4js.xtext.workspace.XIProjectConfig)

Example 18 with WorkspaceConfigSnapshot

use of org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot in project n4js by eclipse.

the class AbstractIdeTest method assertDependenciesOf.

/**
 * Asserts that the project with the given project ids has dependencies to the expected list of project ids.
 */
protected void assertDependenciesOf(String projectID, String... expectedProjects) {
    WorkspaceConfigSnapshot wc = concurrentIndex.getWorkspaceConfigSnapshot();
    ProjectConfigSnapshot project = wc.findProjectByID(projectID);
    ImmutableSet<String> dependencies = project.getDependencies();
    assertProjectsInWorkspace(expectedProjects, dependencies);
}
Also used : WorkspaceConfigSnapshot(org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot) ProjectConfigSnapshot(org.eclipse.n4js.xtext.workspace.ProjectConfigSnapshot)

Example 19 with WorkspaceConfigSnapshot

use of org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot in project n4js by eclipse.

the class AbstractIdeTest method assertProjectBuildOrder.

/**
 * Asserts the build order of all projects in the workspace.
 */
protected void assertProjectBuildOrder(String expectedProjectBuildOrder) {
    WorkspaceConfigSnapshot workspaceConfig = concurrentIndex.getWorkspaceConfigSnapshot();
    BuildOrderIterator iter = projectBuildOrderFactory.createBuildOrderIterator(workspaceConfig).visitAll();
    String buildOrderString = org.eclipse.n4js.utils.Strings.toString(pd -> pd.getName(), () -> iter);
    assertEquals("Project build order did not match expectation.", expectedProjectBuildOrder, buildOrderString);
}
Also used : WorkspaceConfigSnapshot(org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot) BuildOrderIterator(org.eclipse.n4js.xtext.workspace.BuildOrderIterator)

Example 20 with WorkspaceConfigSnapshot

use of org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot in project n4js by eclipse.

the class AbstractBuildOrderTest method assertBuildOrder.

final void assertBuildOrder(String buildOrder, Collection<Collection<String>> cycles) {
    WorkspaceConfigSnapshot workspaceConfig = concurrentIndex.getWorkspaceConfigSnapshot();
    BuildOrderInfo projectBuildOrderInfo = projectBuildOrderFactory.createBuildOrderInfo(workspaceConfig);
    BuildOrderIterator boIterator = projectBuildOrderFactory.createBuildOrderIterator(workspaceConfig).visitAll();
    try {
        String names = IteratorExtensions.join(boIterator, ", ", it -> it.getName());
        assertEquals(buildOrder, names);
    } catch (Exception exc) {
        throw new RuntimeException("Never happens since toString never throws an exception. Bogus xtext warning", exc);
    }
    assertEquals(cycles.size(), projectBuildOrderInfo.getProjectCycles().size());
    Set<String> expectedCycles = cycles.stream().map(it -> Strings.join(", ", it)).collect(Collectors.toSet());
    for (List<String> cycle : projectBuildOrderInfo.getProjectCycles()) {
        String detectedCycle = Strings.join(", ", cycle);
        assertTrue("Cycle " + detectedCycle + " not found in " + expectedCycles, expectedCycles.contains(detectedCycle));
    }
}
Also used : BuildOrderInfo(org.eclipse.n4js.xtext.workspace.BuildOrderInfo) Collection(java.util.Collection) BuildOrderIterator(org.eclipse.n4js.xtext.workspace.BuildOrderIterator) Assert.assertTrue(org.junit.Assert.assertTrue) Set(java.util.Set) AbstractIdeTest(org.eclipse.n4js.ide.tests.helper.server.AbstractIdeTest) Collectors(java.util.stream.Collectors) WorkspaceConfigSnapshot(org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot) IteratorExtensions(org.eclipse.xtext.xbase.lib.IteratorExtensions) Strings(org.eclipse.n4js.utils.Strings) List(java.util.List) BuildOrderInfo(org.eclipse.n4js.xtext.workspace.BuildOrderInfo) Pair(org.eclipse.xtext.xbase.lib.Pair) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) WorkspaceConfigSnapshot(org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot) BuildOrderIterator(org.eclipse.n4js.xtext.workspace.BuildOrderIterator)

Aggregations

WorkspaceConfigSnapshot (org.eclipse.n4js.xtext.workspace.WorkspaceConfigSnapshot)20 ProjectConfigSnapshot (org.eclipse.n4js.xtext.workspace.ProjectConfigSnapshot)10 URI (org.eclipse.emf.common.util.URI)7 ArrayList (java.util.ArrayList)5 BuildOrderIterator (org.eclipse.n4js.xtext.workspace.BuildOrderIterator)5 IResourceDescription (org.eclipse.xtext.resource.IResourceDescription)5 ImmutableSet (com.google.common.collect.ImmutableSet)4 LinkedHashSet (java.util.LinkedHashSet)4 Set (java.util.Set)4 Collections (java.util.Collections)3 HashSet (java.util.HashSet)3 List (java.util.List)3 FluentIterable (com.google.common.collect.FluentIterable)2 Iterables (com.google.common.collect.Iterables)2 Sets (com.google.common.collect.Sets)2 Path (java.nio.file.Path)2 Collection (java.util.Collection)2 Map (java.util.Map)2 Collectors (java.util.stream.Collectors)2 Delta (org.eclipse.xtext.resource.IResourceDescription.Delta)2