| // 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) { |
| var outline = Outline(element, offset, length, offset, length); |
| if (outlineStack.isEmpty) { |
| outlines.add(outline); |
| } else { |
| var children = outlineStack.last.children; |
| if (children == null) { |
| children = <Outline>[]; |
| outlineStack.last.children = children; |
| } |
| children.add(outline); |
| } |
| outlineStack.add(outline); |
| } |
| } |