// Copyright (c) 2018, 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';
import 'package:analysis_server/src/flutter/flutter_outline_computer.dart';
import 'package:analysis_server/src/protocol_server.dart' as protocol;
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/generated/source.dart';

void sendFlutterNotificationOutline(
    AnalysisServer server,
    String file,
    String content,
    LineInfo lineInfo,
    CompilationUnit dartUnit,
    TypeProvider typeProvider) {
  _sendNotification(server, () {
    var computer = new FlutterOutlineComputer(
        file, content, lineInfo, dartUnit, typeProvider);
    protocol.FlutterOutline outline = computer.compute();
    // send notification
    var params = new protocol.FlutterOutlineParams(file, outline,
        instrumentedCode: computer.instrumentedCode);
    server.sendNotification(params.toNotification());
  });
}

/**
 * Runs the given notification producing function [f], catching exceptions.
 */
void _sendNotification(AnalysisServer server, f()) {
  ServerPerformanceStatistics.notices.makeCurrentWhile(() {
    try {
      f();
    } catch (exception, stackTrace) {
      server.sendServerErrorNotification(
          'Failed to send notification', exception, stackTrace);
    }
  });
}
