// 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/analysis_server.dart' show AnalysisServer;
import 'package:analysis_server/src/domains/analysis/occurrences.dart';
import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
import 'package:analysis_server/src/protocol_server.dart' as protocol;
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';

void new_sendDartNotificationNavigation(
    AnalysisServer analysisServer, ResolvedUnitResult result) {
  var unit = result.unit;
  if (unit != null) {
    var collector = NavigationCollectorImpl();
    computeDartNavigation(
        analysisServer.resourceProvider, collector, unit, null, null);
    collector.createRegions();
    var params = protocol.AnalysisNavigationParams(
        result.path, collector.regions, collector.targets, collector.files);
    analysisServer.sendNotification(params.toNotification());
  }
}

void new_sendDartNotificationOccurrences(
    AnalysisServer analysisServer, ResolvedUnitResult result) {
  var unit = result.unit;
  if (unit != null) {
    var collector = OccurrencesCollectorImpl();
    addDartOccurrences(collector, unit);
    var params = protocol.AnalysisOccurrencesParams(
        result.path, collector.allOccurrences);
    analysisServer.sendNotification(params.toNotification());
  }
}

void new_sendErrorNotification(
    AnalysisServer analysisServer, ResolvedUnitResult result) {
  var serverErrors = protocol.doAnalysisError_listFromEngine(result);
  var params = protocol.AnalysisErrorsParams(result.path, serverErrors);
  analysisServer.sendNotification(params.toNotification());
}
