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);
}
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;
}
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);
}
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);
}
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));
}
}
Aggregations