Proper 'async' support for JdtLs fallback

This commit is contained in:
Kris De Volder
2018-03-26 15:33:47 -07:00
parent 13633746cb
commit 3d9752cbdb
2 changed files with 25 additions and 17 deletions

View File

@@ -47,7 +47,13 @@ public class CompositeJavaProjectFinder implements JavaProjectFinder {
@Override
public Optional<IJavaProject> find(TextDocumentIdentifier doc) {
return projectFinders.stream().map(finder -> finder.find(doc)).filter(Optional::isPresent).findFirst().orElseGet(() -> Optional.empty());
for (JavaProjectFinder finder : projectFinders) {
Optional<IJavaProject> project = finder.find(doc);
if (project.isPresent()) {
return project;
}
}
return Optional.empty();
}
}

View File

@@ -108,28 +108,30 @@ public class JdtLsProjectCache implements JavaProjectsService {
@Override
public void addListener(Listener listener) {
Assert.isLegal(initialized.isDone()); //Adding / removing listeners prior to inialization isn't supported. (If this is really needed, it can be
// bit its a bit trickier to implement that correctly)
if (initialized.isCompletedExceptionally()) {
fallback.addListener(listener);
} else {
synchronized (listeners) {
listeners.add(listener);
initialized.handle((success, failed) -> {
if (failed!=null) {
fallback.addListener(listener);
} else {
synchronized (listeners) {
listeners.add(listener);
}
}
}
return null;
});
}
@Override
public void removeListener(Listener listener) {
Assert.isLegal(initialized.isDone()); //Adding / removing listeners prior to inialization isn't supported. (If this is really needed, it can be
// bit its a bit trickier to implement that correctly)
if (initialized.isCompletedExceptionally()) {
fallback.removeListener(listener);
} else {
synchronized (listeners) {
listeners.remove(listener);
initialized.handle((success, failed) -> {
if (failed!=null) {
fallback.removeListener(listener);
} else {
synchronized (listeners) {
listeners.remove(listener);
}
}
}
return null;
});
}
private void notifyDelete(JdtLsProject deleted) {