Index: editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/analysis/model/AnalysisServerDataImpl.java |
diff --git a/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/analysis/model/AnalysisServerDataImpl.java b/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/analysis/model/AnalysisServerDataImpl.java |
index 0e009e08e0ff0eaaffd566084b967053dc3c7c37..906a15e895a02341a1ec51efd1136c12d6303d68 100644 |
--- a/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/analysis/model/AnalysisServerDataImpl.java |
+++ b/editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/internal/analysis/model/AnalysisServerDataImpl.java |
@@ -15,6 +15,7 @@ |
package com.google.dart.tools.core.internal.analysis.model; |
import com.google.common.collect.ImmutableMap; |
+import com.google.common.collect.ImmutableSet; |
import com.google.common.collect.Maps; |
import com.google.common.collect.Sets; |
import com.google.dart.engine.source.Source; |
@@ -22,7 +23,9 @@ import com.google.dart.server.AnalysisServer; |
import com.google.dart.server.ListSourceSet; |
import com.google.dart.server.NavigationRegion; |
import com.google.dart.server.NotificationKind; |
+import com.google.dart.server.Outline; |
import com.google.dart.tools.core.analysis.model.AnalysisServerData; |
+import com.google.dart.tools.core.analysis.model.AnalysisServerOutlineListener; |
import java.util.Map; |
import java.util.Set; |
@@ -36,6 +39,7 @@ import java.util.Set; |
public class AnalysisServerDataImpl implements AnalysisServerData { |
private final Map<String, Map<Source, NavigationRegion[]>> navigationData = Maps.newHashMap(); |
private final Map<String, Set<Source>> navigationSubscriptions = Maps.newHashMap(); |
+ private final Map<String, Map<Source, Set<AnalysisServerOutlineListener>>> outlineSubscriptions = Maps.newHashMap(); |
private AnalysisServer server; |
@@ -52,15 +56,6 @@ public class AnalysisServerDataImpl implements AnalysisServerData { |
return sourceRegions; |
} |
- public void internalComputedNavigation(String contextId, Source source, NavigationRegion[] targets) { |
- Map<Source, NavigationRegion[]> contextRegions = navigationData.get(contextId); |
- if (contextRegions == null) { |
- contextRegions = Maps.newHashMap(); |
- navigationData.put(contextId, contextRegions); |
- } |
- contextRegions.put(source, targets); |
- } |
- |
/** |
* Deletes all the data associated with the given context. |
*/ |
@@ -91,6 +86,27 @@ public class AnalysisServerDataImpl implements AnalysisServerData { |
} |
@Override |
+ public void subscribeOutline(String contextId, Source source, |
+ AnalysisServerOutlineListener listener) { |
+ Map<Source, Set<AnalysisServerOutlineListener>> sourceSubscriptions = outlineSubscriptions.get(contextId); |
+ if (sourceSubscriptions == null) { |
+ sourceSubscriptions = Maps.newHashMap(); |
+ outlineSubscriptions.put(contextId, sourceSubscriptions); |
+ } |
+ Set<AnalysisServerOutlineListener> subscriptions = sourceSubscriptions.get(source); |
+ if (subscriptions == null) { |
+ subscriptions = Sets.newHashSet(); |
+ sourceSubscriptions.put(source, subscriptions); |
+ } |
+ if (subscriptions.add(listener)) { |
+ Set<Source> sourceSet = sourceSubscriptions.keySet(); |
+ server.subscribe( |
+ contextId, |
+ ImmutableMap.of(NotificationKind.OUTLINE, ListSourceSet.create(sourceSet))); |
+ } |
+ } |
+ |
+ @Override |
public void unsubscribeNavigation(String contextId, Source source) { |
Set<Source> sources = navigationSubscriptions.get(contextId); |
if (sources == null) { |
@@ -102,4 +118,50 @@ public class AnalysisServerDataImpl implements AnalysisServerData { |
ImmutableMap.of(NotificationKind.NAVIGATION, ListSourceSet.create(sources))); |
} |
} |
+ |
+ @Override |
+ public void unsubscribeOutline(String contextId, Source source, |
+ AnalysisServerOutlineListener listener) { |
+ Map<Source, Set<AnalysisServerOutlineListener>> sourceSubscriptions = outlineSubscriptions.get(contextId); |
+ if (sourceSubscriptions == null) { |
+ return; |
+ } |
+ Set<AnalysisServerOutlineListener> subscriptions = sourceSubscriptions.get(source); |
+ if (subscriptions == null) { |
+ return; |
+ } |
+ if (subscriptions.remove(listener)) { |
+ if (subscriptions.isEmpty()) { |
+ sourceSubscriptions.remove(source); |
+ Set<Source> sourceSet = sourceSubscriptions.keySet(); |
+ server.subscribe( |
+ contextId, |
+ ImmutableMap.of(NotificationKind.OUTLINE, ListSourceSet.create(sourceSet))); |
+ } |
+ } |
+ } |
+ |
+ void internalComputedNavigation(String contextId, Source source, NavigationRegion[] targets) { |
+ Map<Source, NavigationRegion[]> contextRegions = navigationData.get(contextId); |
+ if (contextRegions == null) { |
+ contextRegions = Maps.newHashMap(); |
+ navigationData.put(contextId, contextRegions); |
+ } |
+ contextRegions.put(source, targets); |
+ } |
+ |
+ void internalComputedOutline(String contextId, Source source, Outline outline) { |
+ Map<Source, Set<AnalysisServerOutlineListener>> sourceSubscriptions = outlineSubscriptions.get(contextId); |
+ if (sourceSubscriptions == null) { |
+ return; |
+ } |
+ Set<AnalysisServerOutlineListener> subscriptions = sourceSubscriptions.get(source); |
+ if (subscriptions == null) { |
+ return; |
+ } |
+ subscriptions = ImmutableSet.copyOf(subscriptions); |
+ for (AnalysisServerOutlineListener listener : subscriptions) { |
+ listener.computedOutline(contextId, source, outline); |
+ } |
+ } |
} |