// Copyright (c) 2017, 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:analyzer/dart/analysis/results.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';

/**
 * A concrete implementation of [DartFixesRequest].
 */
class DartFixesRequestImpl implements DartFixesRequest {
  @override
  final ResourceProvider resourceProvider;

  @override
  final int offset;

  @override
  final List<AnalysisError> errorsToFix;

  @override
  final ResolveResult result;

  /**
   * Initialize a newly create request with the given data.
   */
  DartFixesRequestImpl(
      this.resourceProvider, this.offset, this.errorsToFix, this.result);
}

/**
 * A concrete implementation of [FixCollector].
 */
class FixCollectorImpl implements FixCollector {
  /**
   * The list of fixes that have been collected.
   */
  final Map<AnalysisError, List<PrioritizedSourceChange>> fixMap =
      <AnalysisError, List<PrioritizedSourceChange>>{};

  /**
   * Return the fixes that have been collected up to this point.
   */
  List<AnalysisErrorFixes> get fixes {
    List<AnalysisErrorFixes> fixes = <AnalysisErrorFixes>[];
    AnalyzerConverter converter = new AnalyzerConverter();
    for (AnalysisError error in fixMap.keys) {
      fixes.add(new AnalysisErrorFixes(converter.convertAnalysisError(error),
          fixes: fixMap[error]));
    }
    return fixes;
  }

  @override
  void addFix(AnalysisError error, PrioritizedSourceChange change) {
    fixMap.putIfAbsent(error, () => <PrioritizedSourceChange>[]).add(change);
  }
}
