blob: 049ef3e56acb672fd7bc3d512fc0e4a66785b1e7 [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.
library analysis_server.src.plugin.server_plugin;
import 'package:analysis_server/plugin/analysis/analysis_domain.dart';
import 'package:analysis_server/plugin/analysis/analyzed_files.dart';
import 'package:analysis_server/plugin/analysis/navigation/navigation.dart';
import 'package:analysis_server/plugin/analysis/navigation/navigation_core.dart';
import 'package:analysis_server/plugin/analysis/occurrences/occurrences.dart';
import 'package:analysis_server/plugin/analysis/occurrences/occurrences_core.dart';
import 'package:analysis_server/plugin/edit/assist/assist.dart';
import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
import 'package:analysis_server/plugin/edit/fix/fix.dart';
import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
import 'package:analysis_server/plugin/protocol/protocol.dart';
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/domain_analysis.dart';
import 'package:analysis_server/src/domain_completion.dart';
import 'package:analysis_server/src/domain_diagnostic.dart';
import 'package:analysis_server/src/domain_execution.dart';
import 'package:analysis_server/src/domain_server.dart';
import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analysis_server/src/provisional/completion/completion_core.dart';
import 'package:analysis_server/src/search/search_domain.dart';
import 'package:analysis_server/src/services/correction/assist_internal.dart';
import 'package:analysis_server/src/services/correction/fix_internal.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:plugin/plugin.dart';
/**
* A function that will create a request handler that can be used by the given
* [server].
*/
typedef RequestHandler RequestHandlerFactory(AnalysisServer server);
/**
* A plugin that defines the extension points and extensions that are inherently
* defined by the analysis server.
*/
class ServerPlugin implements Plugin {
/**
* The simple identifier of the extension point that allows plugins to
* register file patterns that will cause files to be analyzed.
*/
static const String ANALYZED_FILE_PATTERNS_EXTENSION_POINT =
'analyzedFilePatterns';
/**
* The simple identifier of the extension point that allows plugins to
* register assist contributors.
*/
static const String ASSIST_CONTRIBUTOR_EXTENSION_POINT = 'assistContributor';
/**
* The simple identifier of the extension point that allows plugins to
* register completion contributors.
*/
static const String COMPLETION_CONTRIBUTOR_EXTENSION_POINT =
'completionContributor';
/**
* The simple identifier of the extension point that allows plugins to
* register domains.
*/
static const String DOMAIN_EXTENSION_POINT = 'domain';
/**
* The simple identifier of the extension point that allows plugins to
* register fix contributors.
*/
static const String FIX_CONTRIBUTOR_EXTENSION_POINT = 'fixContributor';
/**
* The simple identifier of the extension point that allows plugins to
* register index contributors.
*/
static const String INDEX_CONTRIBUTOR_EXTENSION_POINT = 'indexContributor';
/**
* The simple identifier of the extension point that allows plugins to
* register navigation contributors.
*/
static const String NAVIGATION_CONTRIBUTOR_EXTENSION_POINT =
'navigationContributor';
/**
* The simple identifier of the extension point that allows plugins to
* register element occurrences.
*/
static const String OCCURRENCES_CONTRIBUTOR_EXTENSION_POINT =
'occurrencesContributor';
/**
* The simple identifier of the extension point that allows plugins to
* register analysis result listeners.
*/
static const String SET_ANALISYS_DOMAIN_EXTENSION_POINT = 'setAnalysisDomain';
/**
* The unique identifier of this plugin.
*/
static const String UNIQUE_IDENTIFIER = 'analysis_server.core';
/**
* The extension point that allows plugins to register file patterns that will
* cause files to be analyzed.
*/
ExtensionPoint<List<String>> analyzedFilePatternsExtensionPoint;
/**
* The extension point that allows plugins to register assist contributors.
*/
ExtensionPoint<AssistContributor> assistContributorExtensionPoint;
/**
* The extension point that allows plugins to register completion
* contributors.
*/
ExtensionPoint<CompletionContributorFactory>
completionContributorExtensionPoint;
/**
* The extension point that allows plugins to register domains with the
* server.
*/
ExtensionPoint<RequestHandlerFactory> domainExtensionPoint;
/**
* The extension point that allows plugins to register fix contributors with
* the server.
*/
ExtensionPoint<FixContributor> fixContributorExtensionPoint;
/**
* The extension point that allows plugins to register navigation
* contributors.
*/
ExtensionPoint<NavigationContributor> navigationContributorExtensionPoint;
/**
* The extension point that allows plugins to register occurrences
* contributors.
*/
ExtensionPoint<OccurrencesContributor> occurrencesContributorExtensionPoint;
/**
* The extension point that allows plugins to get access to the `analysis`
* domain.
*/
ExtensionPoint<SetAnalysisDomain> setAnalysisDomainExtensionPoint;
/**
* Initialize a newly created plugin.
*/
ServerPlugin();
/**
* Return a list containing all of the file patterns that can cause files to
* be analyzed.
*/
List<String> get analyzedFilePatterns {
List<String> patterns = <String>[];
for (List<String> extension
in analyzedFilePatternsExtensionPoint.extensions) {
patterns.addAll(extension);
}
return patterns;
}
/**
* Return a list containing all of the assist contributors that were
* contributed.
*/
List<AssistContributor> get assistContributors =>
assistContributorExtensionPoint.extensions;
/**
* Return a list containing all of the completion contributors that were
* contributed.
*/
Iterable<CompletionContributor> get completionContributors =>
completionContributorExtensionPoint.extensions
.map((CompletionContributorFactory factory) => factory());
/**
* Return a list containing all of the fix contributors that were contributed.
*/
List<FixContributor> get fixContributors =>
fixContributorExtensionPoint.extensions;
/**
* Return a list containing all of the navigation contributors that were
* contributed.
*/
List<NavigationContributor> get navigationContributors =>
navigationContributorExtensionPoint.extensions;
/**
* Return a list containing all of the occurrences contributors that were
* contributed.
*/
List<OccurrencesContributor> get occurrencesContributors =>
occurrencesContributorExtensionPoint.extensions;
/**
* Return a list containing all of the receivers of the `analysis` domain
* instance.
*/
List<SetAnalysisDomain> get setAnalysisDomainFunctions =>
setAnalysisDomainExtensionPoint.extensions;
@override
String get uniqueIdentifier => UNIQUE_IDENTIFIER;
/**
* Use the given [server] to create all of the domains ([RequestHandler]'s)
* that have been registered and return the newly created domains.
*/
List<RequestHandler> createDomains(AnalysisServer server) {
if (domainExtensionPoint == null) {
return <RequestHandler>[];
}
return domainExtensionPoint.extensions
.map((RequestHandlerFactory factory) => factory(server))
.toList();
}
@override
void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
analyzedFilePatternsExtensionPoint = new ExtensionPoint<List<String>>(
this, ANALYZED_FILE_PATTERNS_EXTENSION_POINT, null);
registerExtensionPoint(analyzedFilePatternsExtensionPoint);
assistContributorExtensionPoint = new ExtensionPoint<AssistContributor>(
this, ASSIST_CONTRIBUTOR_EXTENSION_POINT, null);
registerExtensionPoint(assistContributorExtensionPoint);
completionContributorExtensionPoint =
new ExtensionPoint<CompletionContributorFactory>(
this, COMPLETION_CONTRIBUTOR_EXTENSION_POINT, null);
registerExtensionPoint(completionContributorExtensionPoint);
domainExtensionPoint = new ExtensionPoint<RequestHandlerFactory>(
this, DOMAIN_EXTENSION_POINT, null);
registerExtensionPoint(domainExtensionPoint);
fixContributorExtensionPoint = new ExtensionPoint<FixContributor>(
this, FIX_CONTRIBUTOR_EXTENSION_POINT, null);
registerExtensionPoint(fixContributorExtensionPoint);
navigationContributorExtensionPoint =
new ExtensionPoint<NavigationContributor>(
this, NAVIGATION_CONTRIBUTOR_EXTENSION_POINT, null);
registerExtensionPoint(navigationContributorExtensionPoint);
occurrencesContributorExtensionPoint =
new ExtensionPoint<OccurrencesContributor>(
this, OCCURRENCES_CONTRIBUTOR_EXTENSION_POINT, null);
registerExtensionPoint(occurrencesContributorExtensionPoint);
setAnalysisDomainExtensionPoint = new ExtensionPoint<SetAnalysisDomain>(
this, SET_ANALISYS_DOMAIN_EXTENSION_POINT, null);
registerExtensionPoint(setAnalysisDomainExtensionPoint);
}
@override
void registerExtensions(RegisterExtension registerExtension) {
//
// Register analyzed file patterns.
//
List<String> patterns = <String>[
'**/*.${AnalysisEngine.SUFFIX_DART}',
'**/*.${AnalysisEngine.SUFFIX_HTML}',
'**/*.${AnalysisEngine.SUFFIX_HTM}',
'**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}',
'**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}'
];
registerExtension(ANALYZED_FILE_PATTERNS_EXTENSION_POINT_ID, patterns);
//
// Register assist contributors.
//
registerExtension(
ASSIST_CONTRIBUTOR_EXTENSION_POINT_ID, new DefaultAssistContributor());
//
// Register completion contributors.
//
// TODO(brianwilkerson) Register the completion contributors.
//registerExtension(COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID, ???);
//
// Register analysis contributors.
//
registerExtension(NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID,
new DartNavigationComputer());
registerExtension(OCCURRENCES_CONTRIBUTOR_EXTENSION_POINT_ID,
new DartOccurrencesComputer());
//
// Register domains.
//
String domainId = Plugin.join(UNIQUE_IDENTIFIER, DOMAIN_EXTENSION_POINT);
registerExtension(
domainId, (AnalysisServer server) => new ServerDomainHandler(server));
registerExtension(
domainId, (AnalysisServer server) => new AnalysisDomainHandler(server));
registerExtension(
domainId, (AnalysisServer server) => new EditDomainHandler(server));
registerExtension(
domainId, (AnalysisServer server) => new SearchDomainHandler(server));
registerExtension(domainId,
(AnalysisServer server) => new CompletionDomainHandler(server));
registerExtension(domainId,
(AnalysisServer server) => new ExecutionDomainHandler(server));
registerExtension(domainId,
(AnalysisServer server) => new DiagnosticDomainHandler(server));
//
// Register fix contributors.
//
registerExtension(
FIX_CONTRIBUTOR_EXTENSION_POINT_ID, new DefaultFixContributor());
}
}