// 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/file_system/file_system.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
    hide AnalysisError;
import 'package:analyzer_plugin/utilities/outline/outline.dart';

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

  @override
  final ResolvedUnitResult result;

  /**
   * Initialize a newly create request with the given data.
   */
  DartOutlineRequestImpl(this.resourceProvider, this.result);

  @override
  String get path => result.path;
}

/**
 * A concrete implementation of [OutlineCollector].
 */
class OutlineCollectorImpl implements OutlineCollector {
  /**
   * A list containing the top-level outline nodes.
   */
  List<Outline> outlines = <Outline>[];

  /**
   * A stack keeping track of the outline nodes that have been started but not
   * yet ended.
   */
  List<Outline> outlineStack = <Outline>[];

  @override
  void endElement() {
    outlineStack.removeLast();
  }

  @override
  void startElement(Element element, int offset, int length) {
    Outline outline = new Outline(element, offset, length, offset, length);
    if (outlineStack.isEmpty) {
      outlines.add(outline);
    } else {
      List<Outline> children = outlineStack.last.children;
      if (children == null) {
        children = <Outline>[];
        outlineStack.last.children = children;
      }
      children.add(outline);
    }
    outlineStack.add(outline);
  }
}
