91 lines
3.0 KiB
Dart
91 lines
3.0 KiB
Dart
// 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;
|
|
}
|
|
}
|