blob: 3a4dca4a7e4625d6f8c2b5df5ae1a66874c0ea98 [file] [log] [blame]
// 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 services.completion.computer.dart.combinator;
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart' hide Element,
ElementKind;
import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
/**
* A computer for calculating `completion.getSuggestions` request results
* for the import combinators show and hide.
*/
class CombinatorComputer extends DartCompletionComputer {
_CombinatorSuggestionBuilder builder;
@override
bool computeFast(DartCompletionRequest request) {
builder = request.node.accept(new _CombinatorAstVisitor(request));
return builder == null;
}
@override
Future<bool> computeFull(DartCompletionRequest request) {
if (builder != null) {
return builder.execute(request.node);
}
return new Future.value(false);
}
}
/**
* A visitor for determining which imported classes and top level variables
* should be suggested and building those suggestions.
*/
class _CombinatorAstVisitor extends
GeneralizingAstVisitor<_CombinatorSuggestionBuilder> {
final DartCompletionRequest request;
_CombinatorAstVisitor(this.request);
@override
_CombinatorSuggestionBuilder visitCombinator(Combinator node) {
return new _CombinatorSuggestionBuilder(
request,
CompletionSuggestionKind.IDENTIFIER);
}
@override
_CombinatorSuggestionBuilder visitNode(AstNode node) {
return null;
}
@override
_CombinatorSuggestionBuilder visitSimpleIdentifier(SimpleIdentifier node) {
return node.parent.accept(this);
}
}
/**
* A `_CombinatorSuggestionBuilder` determines which imported classes
* and top level variables should be suggested and builds those suggestions.
* This operation is instantiated during `computeFast`
* and calculates the suggestions during `computeFull`.
*/
class _CombinatorSuggestionBuilder extends LibraryElementSuggestionBuilder {
_CombinatorSuggestionBuilder(DartCompletionRequest request,
CompletionSuggestionKind kind)
: super(request, kind);
Future<bool> execute(AstNode node) {
var directive = node.getAncestor((parent) => parent is NamespaceDirective);
if (directive is NamespaceDirective) {
LibraryElement library = directive.uriElement;
if (library != null) {
library.visitChildren(this);
}
}
return new Future.value(false);
}
}