// 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.provisional.completion.dart.plugin;

import 'package:analysis_server/src/provisional/completion/completion.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion.dart';
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/inherited_reference_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/keyword_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/label_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/library_member_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/library_prefix_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/local_constructor_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/local_reference_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/named_constructor_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/static_member_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/type_member_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/variable_name_contributor.dart';
import 'package:plugin/plugin.dart';

/**
 * The shared dart completion plugin instance.
 */
final DartCompletionPlugin dartCompletionPlugin = new DartCompletionPlugin();

class DartCompletionPlugin implements Plugin {
  /**
   * The simple identifier of the extension point that allows plugins to
   * register Dart specific completion contributor factories.
   * Use [DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID]
   * when registering contributors.
   */
  static const String CONTRIBUTOR_EXTENSION_POINT = 'contributor';

  /**
   * The unique identifier of this plugin.
   */
  static const String UNIQUE_IDENTIFIER = 'dart.completion';

  /**
   * The extension point that allows plugins to register Dart specific
   * completion contributor factories.
   */
  ExtensionPoint<DartCompletionContributorFactory> _contributorExtensionPoint;

  /**
   * Return a list containing all of the Dart specific completion contributors.
   */
  Iterable<DartCompletionContributor> get contributors =>
      _contributorExtensionPoint.extensions.map(
          (Object factory) => (factory as DartCompletionContributorFactory)());

  @override
  String get uniqueIdentifier => UNIQUE_IDENTIFIER;

  @override
  void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
    _contributorExtensionPoint =
        new ExtensionPoint<DartCompletionContributorFactory>(
            this, CONTRIBUTOR_EXTENSION_POINT, null);
    registerExtensionPoint(_contributorExtensionPoint);
  }

  @override
  void registerExtensions(RegisterExtension registerExtension) {
    //
    // Register DartCompletionManager as a CompletionContributor
    // which delegates to all the DartCompletionContributors
    //
    registerExtension(COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new DartCompletionManager());
    //
    // Register the default DartCompletionContributors
    //
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new ArgListContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new CombinatorContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new FieldFormalContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new ImportedReferenceContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new InheritedReferenceContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new KeywordContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new LabelContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new LibraryMemberContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new LibraryPrefixContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new LocalConstructorContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new LocalLibraryContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new LocalReferenceContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new NamedConstructorContributor());
    // Revisit this contributor and these tests
    // once DartChangeBuilder API has solidified.
    // registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
    //     () => new OverrideContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new StaticMemberContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new TypeMemberContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new UriContributor());
    registerExtension(DART_COMPLETION_CONTRIBUTOR_EXTENSION_POINT_ID,
        () => new VariableNameContributor());
  }
}
