blob: cba3bd4c44181273c0bcfd17b120dae68e542435 [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.contributor.dart.combinator;
import 'dart:async';
import 'package:analysis_server/src/protocol_server.dart'
hide Element, ElementKind;
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
/**
* A contributor for calculating `completion.getSuggestions` request results
* for the import combinators show and hide.
*/
class CombinatorContributor extends DartCompletionContributor {
@override
Future<List<CompletionSuggestion>> computeSuggestions(
DartCompletionRequest request) async {
AstNode node = request.target.containingNode;
if (node is! Combinator) {
return EMPTY_LIST;
}
// Partially resolve the compilation unit
CompilationUnit unit = await request.resolveDeclarationsInScope();
// Gracefully degrade if the compilation unit could not be resolved
// e.g. detached part file or source change
if (unit == null) {
return EMPTY_LIST;
}
// Check the target since resolution may have changed it
node = request.target.containingNode;
if (node is! Combinator) {
return EMPTY_LIST;
}
// Build list of suggestions
var directive = node.getAncestor((parent) => parent is NamespaceDirective);
if (directive is NamespaceDirective) {
LibraryElement library = directive.uriElement;
if (library != null) {
LibraryElementSuggestionBuilder builder =
new LibraryElementSuggestionBuilder(
request, CompletionSuggestionKind.IDENTIFIER, false, false);
library.visitChildren(builder);
return builder.suggestions;
}
}
return EMPTY_LIST;
}
}