// 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.

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/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';

/// A contributor that produces suggestions for field formal parameters that are
/// based on the fields declared directly by the enclosing class that are not
/// already initialized. More concretely, this class produces suggestions for
/// expressions of the form `this.^` in a constructor's parameter list.
class FieldFormalContributor extends DartCompletionContributor {
  FieldFormalContributor(
    DartCompletionRequest request,
    SuggestionBuilder builder,
  ) : super(request, builder);

  @override
  Future<void> computeSuggestions() async {
    var node = request.target.containingNode;
    // TODO(brianwilkerson) We should suggest field formal parameters even if
    //  the user hasn't already typed the `this.` prefix, by including the
    //  prefix in the completion.
    if (node is! FieldFormalParameter) {
      return;
    }

    var constructor = node.thisOrAncestorOfType<ConstructorDeclaration>();
    if (constructor == null) {
      return;
    }

    // Compute the list of fields already referenced in the constructor.
    // TODO(brianwilkerson) This doesn't include fields in initializers, which
    //  shouldn't be suggested.
    var referencedFields = <String>[];
    for (var param in constructor.parameters.parameters) {
      if (param is DefaultFormalParameter) {
        param = param.parameter;
      }
      if (param is FieldFormalParameter) {
        var fieldId = param.identifier;
        if (fieldId != request.target.entity) {
          var fieldName = fieldId.name;
          if (fieldName.isNotEmpty) {
            referencedFields.add(fieldName);
          }
        }
      }
    }

    var enclosingClass = constructor.thisOrAncestorOfType<ClassDeclaration>();
    if (enclosingClass == null) {
      return;
    }

    // Add suggestions for fields that are not already referenced.
    for (var member in enclosingClass.members) {
      if (member is FieldDeclaration && !member.isStatic) {
        for (var variable in member.fields.variables) {
          var field = variable.name.staticElement;
          if (field is FieldElement) {
            var fieldName = field.name;
            if (fieldName.isNotEmpty) {
              if (!referencedFields.contains(fieldName)) {
                builder.suggestFieldFormalParameter(field);
              }
            }
          }
        }
      }
    }
  }
}
