Chromium Code Reviews| Index: pkg/analysis_server/lib/src/domain_context.dart |
| diff --git a/pkg/analysis_server/lib/src/domain_context.dart b/pkg/analysis_server/lib/src/domain_context.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c9893ba5bcda91bd12592858f918fbe9d9fffe3d |
| --- /dev/null |
| +++ b/pkg/analysis_server/lib/src/domain_context.dart |
| @@ -0,0 +1,204 @@ |
| +// Copyright (c) 2014, 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 domain.context; |
| + |
| +import 'package:analyzer/src/generated/engine.dart'; |
| +import 'package:analyzer/src/generated/source.dart'; |
| + |
| +import 'analysis_server.dart'; |
| +import 'protocol.dart'; |
| + |
| +/** |
| + * Instances of the class [ContextDomainHandler] implement a [RequestHandler] |
| + * that handles requests in the server domain. |
|
danrubel
2014/01/22 01:04:07
server domain -> context domain ?
Brian Wilkerson
2014/01/24 21:49:27
Done
|
| + */ |
| +class ContextDomainHandler implements RequestHandler { |
| + /** |
| + * The name of the context.applyChanges request. |
| + */ |
| + static const String APPLY_CHANGES_NAME = 'context.applyChanges'; |
| + |
| + /** |
| + * The name of the context.setOptions request. |
| + */ |
| + static const String SET_OPTIONS_NAME = 'context.setOptions'; |
| + |
| + /** |
| + * The name of the context.setPrioritySources request. |
| + */ |
| + static const String SET_PRIORITY_SOURCES_NAME = 'context.setPrioritySources'; |
| + |
| + /** |
| + * The name of the changes parameter. |
| + */ |
| + static const String CHANGES_PARAM = 'changes'; |
| + |
| + /** |
| + * The name of the contextId parameter. |
| + */ |
| + static const String CONTEXT_ID_PARAM = 'contextId'; |
| + |
| + /** |
| + * The name of the options parameter. |
| + */ |
| + static const String OPTIONS_PARAM = 'options'; |
| + |
| + /** |
| + * The name of the sources parameter. |
| + */ |
| + static const String SOURCES_PARAM = 'sources'; |
| + |
| + /** |
| + * The name of the cacheSize option. |
| + */ |
| + static const String CACHE_SIZE_OPTION = 'cacheSize'; |
| + |
| + /** |
| + * The name of the generateHints option. |
| + */ |
| + static const String GENERATE_HINTS_OPTION = 'generateHints'; |
| + |
| + /** |
| + * The name of the generateDart2jsHints option. |
| + */ |
| + static const String GENERATE_DART2JS_OPTION = 'generateDart2jsHints'; |
| + |
| + /** |
| + * The name of the provideErrors option. |
| + */ |
| + static const String PROVIDE_ERRORS_OPTION = 'provideErrors'; |
| + |
| + /** |
| + * The name of the provideNavigation option. |
| + */ |
| + static const String PROVIDE_NAVIGATION_OPTION = 'provideNavigation'; |
| + |
| + /** |
| + * The name of the provideOutline option. |
| + */ |
| + static const String PROVIDE_OUTLINE_OPTION = 'provideOutline'; |
| + |
| + /** |
| + * The analysis server that is using this handler to process requests. |
| + */ |
| + final AnalysisServer server; |
| + |
| + /** |
| + * Initialize a newly created handler to handle requests for the given [server]. |
| + */ |
| + ContextDomainHandler(this.server); |
| + |
| + @override |
| + Response handleRequest(Request request) { |
| + try { |
| + String requestName = request.method; |
| + if (requestName == APPLY_CHANGES_NAME) { |
| + applyChanges(request); |
| + } else if (requestName == SET_OPTIONS_NAME) { |
| + setOptions(request); |
| + } else if (requestName == SET_PRIORITY_SOURCES_NAME) { |
| + setPrioritySources(request); |
| + } |
| + } on RequestFailure catch (exception) { |
| + return exception.response; |
| + } |
| + } |
| + |
| + /** |
| + * Inform the specified context that the changes encoded in the change set |
| + * have been made. Any invalidated analysis results will be flushed from the |
| + * context. |
| + */ |
| + Response applyChanges(Request request) { |
| + AnalysisContext context = getAnalysisContext(request); |
| + Map<String, Object> changesData = request.getRequiredParameter(CHANGES_PARAM); |
| + ChangeSet changeSet = createChangeSet(changesData); |
| + |
| + context.applyChanges(changeSet); |
| + } |
| + |
| + /** |
| + * Convert the given JSON object into a [ChangeSet]. |
| + */ |
| + ChangeSet createChangeSet(Map<String, Object> jsonData) { |
| + // TODO(brianwilkerson) Implement this. |
| + return null; |
| + } |
| + |
| + /** |
| + * Set the options controlling analysis within a context to the given set of |
| + * options. |
| + */ |
| + Response setOptions(Request request) { |
| + AnalysisContext context = getAnalysisContext(request); |
| + |
| + context.analysisOptions = createAnalysisOptions(request); |
| + } |
| + |
| + /** |
| + * Return the set of analysis options associated with the given [request], or |
| + * throw a [RequestFailure] exception if the analysis options are not valid. |
| + */ |
| + AnalysisOptions createAnalysisOptions(Request request) { |
| + Map<String, Object> optionsData = request.getRequiredParameter(OPTIONS_PARAM); |
| + AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
| + optionsData.forEach((String key, Object value) { |
| + if (key == CACHE_SIZE_OPTION) { |
| + options.cacheSize = request.toInt(value); |
| + } else if (key == GENERATE_HINTS_OPTION) { |
| + options.hint = request.toBool(value); |
| + } else if (key == GENERATE_DART2JS_OPTION) { |
| + options.dart2jsHint = request.toBool(value); |
| + } else if (key == PROVIDE_ERRORS_OPTION) { |
| +// options.provideErrors = toBool(request, value); |
| + } else if (key == PROVIDE_NAVIGATION_OPTION) { |
| +// options.provideNavigation = toBool(request, value); |
| + } else if (key == PROVIDE_OUTLINE_OPTION) { |
| +// options.provideOutline = toBool(request, value); |
| + } else { |
| + throw new RequestFailure(new Response.unknownAnalysisOption(request, key)); |
| + } |
| + }); |
| + return options; |
| + } |
| + |
| + /** |
| + * Set the priority sources in the specified context to the sources in the |
| + * given array. |
| + */ |
| + Response setPrioritySources(Request request) { |
| + AnalysisContext context = getAnalysisContext(request); |
| + List<String> sourcesData = request.getRequiredParameter(SOURCES_PARAM); |
| + List<Source> sources = convertToSources(context.sourceFactory, sourcesData); |
| + |
| + context.analysisPriorityOrder = sources; |
| + } |
| + |
| + /** |
| + * Convert the given list of strings into a list of sources owned by the given |
| + * [sourceFactory]. |
| + */ |
| + List<Source> convertToSources(SourceFactory sourceFactory, List<String> sourcesData) { |
| + List<Source> sources = new List<Source>(); |
| + sourcesData.forEach((String string) { |
| + sources.add(sourceFactory.fromEncoding(string)); |
| + }); |
| + return sources; |
| + } |
| + |
| + /** |
| + * Return the analysis context specified by the given request, or throw a |
| + * [RequestFailure] exception if either there is no specified context or if |
| + * the specified context does not exist. |
| + */ |
| + AnalysisContext getAnalysisContext(Request request) { |
| + String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM); |
| + AnalysisContext context = server.contextMap[contextId]; |
| + if (context == null) { |
| + throw new RequestFailure(new Response.contextDoesNotExist(request)); |
| + } |
| + return context; |
| + } |
| +} |