use of org.eclipse.n4js.xtext.workspace.WorkspaceChanges 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;
}
Aggregations