blob: 47fba6765eab65fc9a07f32fd1b2ffbeb059d076 [file] [log] [blame]
// 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);
}
}