anchor.diff:   * [ExecutableElement], its parameters, and operations on them.
    */
   class _ExecutableParameters {
  -  final AnalysisSession session;
     final AstProvider astProvider;
     final ExecutableElement executable;
   
  
positive.code:       element = invocation.methodName.staticElement;
      }
      if (element is ExecutableElement) {
        return new _ExecutableParameters._(session, astProvider, element);
      } else {
        return null;
      }
    }
  
    _ExecutableParameters._(this.session, this.astProvider, this.executable) {
      for (var parameter in executable.parameters) {
        if (parameter.isNotOptional) {
          required.add(parameter);
  
negative.code:   }
  
    Future<Null> _addFix_addMissingParameter() async {
      // The error is reported on ArgumentList.
      if (node is! ArgumentList) {
        return;
      }
      ArgumentList argumentList = node;
      List<Expression> arguments = argumentList.arguments;
  
      // Prepare the invoked element.
      var context = new _ExecutableParameters(astProvider, node.parent);
      if (context == null) {
        return;
      }
  
      // prepare the argument to add a new parameter for
      int numRequired = context.required.length;
      if (numRequired >= arguments.length) {
        return;
      }
      Expression argument = arguments[numRequired];
  
      Future<void> addParameter(
          FixKind kind, int offset, String prefix, String suffix) async {
        if (offset != null) {
          var changeBuilder = new DartChangeBuilder(session);
          await changeBuilder.addFileEdit(context.file, (builder) {
            builder.addInsertion(offset, (builder) {
              builder.write(prefix);
              builder.writeParameterMatchingArgument(
                  argument, numRequired, new Set<String>());
              builder.write(suffix);
            });
          });
          _addFixFromBuilder(changeBuilder, kind);
        }
      }
  
      // Suggest adding a required parameter.
      {
        var kind = DartFixKind.ADD_MISSING_PARAMETER_REQUIRED;
        if (context.required.isNotEmpty) {
          var prevNode = await context.getParameterNode(context.required.last);
          await addParameter(kind, prevNode?.end, ', ', '');
        } else {
          var parameterList = await context.getParameterList();
          var offset = parameterList?.leftParenthesis?.end;
          var suffix = context.executable.parameters.isNotEmpty ? ', ' : '';
          await addParameter(kind, offset, '', suffix);
        }
      }
  
      // Suggest adding the first optional positional parameter.
      if (context.optionalPositional.isEmpty && context.named.isEmpty) {
        var kind = DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL;
        var prefix = context.required.isNotEmpty ? ', [' : '[';
        if (context.required.isNotEmpty) {
          var prevNode = await context.getParameterNode(context.required.last);
          await addParameter(kind, prevNode?.end, prefix, ']');
        } else {
          var parameterList = await context.getParameterList();
          var offset = parameterList?.leftParenthesis?.end;
          await addParameter(kind, offset, prefix, ']');
        }
      }
    }
  