blob: e8a5dde13a0bcb523eeebdfb691cc0e430736b57 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
/**
* An object that manages the subscriptions for analysis results.
*
* Clients may not extend, implement or mix-in this class.
*/
class SubscriptionManager {
/**
* The current set of subscriptions.
*/
Map<AnalysisService, List<String>> _subscriptions;
/**
* Initialize a newly created subscription manager to have no subscriptions.
*/
SubscriptionManager();
/**
* Return `true` if the file with the given [filePath] has a subscription for
* the given [service].
*/
bool hasSubscriptionForFile(String filePath, AnalysisService service) {
if (_subscriptions == null) {
return false;
}
List<String> files = _subscriptions[service];
return files != null && files.contains(filePath);
}
/**
* Return a list of the services for which the file with the given [filePath]
* has been subscribed.
*/
List<AnalysisService> servicesForFile(String filePath) {
List<AnalysisService> services = <AnalysisService>[];
if (_subscriptions != null) {
_subscriptions.forEach((AnalysisService service, List<String> files) {
if (files.contains(filePath)) {
services.add(service);
}
});
}
return services;
}
/**
* Set the current set of subscriptions to those described by the given map of
* [subscriptions]. Return a map representing the subset of the subscriptions
* that are new. These are the subscriptions for which a notification should
* be sent. The returned map is keyed by the path of each file for which
* notifications should be send and has values representing the list of
* services that were added for that file.
*/
Map<String, List<AnalysisService>> setSubscriptions(
Map<AnalysisService, List<String>> subscriptions) {
Map<String, List<AnalysisService>> newSubscriptions =
<String, List<AnalysisService>>{};
if (_subscriptions == null) {
// This is the first time subscriptions have been set, so all of the
// subscriptions are new.
subscriptions.forEach((AnalysisService service, List<String> paths) {
for (String path in paths) {
newSubscriptions
.putIfAbsent(path, () => <AnalysisService>[])
.add(service);
}
});
} else {
// The subscriptions have been changed, to we need to compute the
// difference.
subscriptions.forEach((AnalysisService service, List<String> paths) {
List<String> oldPaths = _subscriptions[service];
for (String path in paths) {
if (!oldPaths.contains(path)) {
newSubscriptions
.putIfAbsent(path, () => <AnalysisService>[])
.add(service);
}
}
});
}
_subscriptions = subscriptions;
return newSubscriptions;
}
}