blob: feca11aedbe51d4a7cda035488b63529f6e9d57d [file] [log] [blame]
// Copyright (c) 2015, 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.
/**
* Support for client code that interacts with the analysis domain of an
* analysis server.
*
* Plugins can gain access to the request handler that implements the analysis
* domain in order to extend the functionality of that domain. The class
* [AnalysisDomain] defines the API of the analysis domain that plugins can use.
*
* If a plugin is interested in gaining access to the analysis domain, it should
* register a function by including code like the following in the plugin's
* registerExtensions method:
*
* AnalysisDomain analysisDomain;
*
* @override
* void registerExtensions(RegisterExtension registerExtension) {
* ...
* registerExtension(
* SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID,
* (AnalysisDomain domain) => analysisDomain = domain);
* ...
* }
*/
library analysis_server.plugin.analysis.analysis_domain;
import 'dart:async';
import 'package:analysis_server/plugin/protocol/protocol.dart'
show AnalysisService;
import 'package:analysis_server/src/plugin/server_plugin.dart';
import 'package:analyzer/src/generated/engine.dart'
show AnalysisContext, ComputedResult;
import 'package:analyzer/src/generated/source.dart' show Source;
import 'package:analyzer/task/model.dart' show ResultDescriptor;
import 'package:plugin/plugin.dart';
/**
* The identifier of the extension point that allows plugins to get access to an
* [AnalysisDomain]. The object used as an extension must be a
* [SetAnalysisDomain].
*/
final String SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID = Plugin.join(
ServerPlugin.UNIQUE_IDENTIFIER,
ServerPlugin.SET_ANALISYS_DOMAIN_EXTENSION_POINT);
/**
* A function that is invoked after the analysis domain has been created and is
* initialized.
*/
typedef void SetAnalysisDomain(AnalysisDomain domain);
/**
* An object that gives plugins access to the analysis domain of the analysis
* server.
*
* Clients are not expected to subtype this class.
*/
abstract class AnalysisDomain {
/**
* Return the stream that is notified when a new value for the given
* [result] is computed.
*
* This method should be used by plugins that need to perform some additional
* processing after analysis has completed. One example would be a plugin that
* needed to send a notification to the client because some data was now
* invalidated.
*/
Stream<ComputedResult> onResultComputed(ResultDescriptor result);
/**
* Schedule sending the given [service] notifications for the given [source]
* in the given [context].
*/
void scheduleNotification(
AnalysisContext context, Source source, AnalysisService service);
}