6f15530536
Change-Id: I908e15b4820eab0e8375994ce3cebfac332306f3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141581 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
78 lines
2.9 KiB
Dart
78 lines
2.9 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;
|
|
}
|
|
var 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) {
|
|
var 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) {
|
|
var 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 (var 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) {
|
|
var oldPaths = _subscriptions[service];
|
|
for (var path in paths) {
|
|
if (!oldPaths.contains(path)) {
|
|
newSubscriptions
|
|
.putIfAbsent(path, () => <AnalysisService>[])
|
|
.add(service);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
_subscriptions = subscriptions;
|
|
return newSubscriptions;
|
|
}
|
|
}
|