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