// 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/src/generated/source.dart'; import 'package:analyzer_plugin/protocol/protocol.dart'; import 'package:analyzer_plugin/protocol/protocol_common.dart'; import 'package:analyzer_plugin/protocol/protocol_generated.dart'; import 'package:analyzer_plugin/src/utilities/highlights/highlights.dart'; import 'package:analyzer_plugin/utilities/generator.dart'; /// The information about a requested set of highlight regions when computing /// highlight regions in a `.dart` file. /// /// Clients may not extend, implement or mix-in this class. abstract class DartHighlightsRequest implements HighlightsRequest { /// The analysis result for the file for which the highlight regions are being /// requested. ResolvedUnitResult get result; } /// An object that [HighlightsContributor]s use to record highlight regions. /// /// Clients may not extend, implement or mix-in this class. abstract class HighlightsCollector { /// Add a highlight region corresponding to the given source [range] whose /// type is the given [type]. void addRange(SourceRange range, HighlightRegionType type); /// Add a highlight region starting at the given [offset] and having the given /// [length] whose type is the given [type]. void addRegion(int offset, int length, HighlightRegionType type); } /// An object used to produce highlight regions. /// /// Clients may implement this class when implementing plugins. abstract class HighlightsContributor { /// Contribute highlight regions into the given [collector]. void computeHighlights( HighlightsRequest request, HighlightsCollector collector); } /// A generator that will generate an 'analysis.highlights' notification. /// /// Clients may not extend, implement or mix-in this class. class HighlightsGenerator { /// The contributors to be used to generate the highlight regions. final List contributors; /// Initialize a newly created highlights generator to use the given /// [contributors]. HighlightsGenerator(this.contributors); /// Create an 'analysis.highlights' notification. If any of the contributors /// throws an exception, also create a non-fatal 'plugin.error' notification. GeneratorResult generateHighlightsNotification(HighlightsRequest request) { var notifications = []; var collector = HighlightsCollectorImpl(); for (var contributor in contributors) { try { contributor.computeHighlights(request, collector); } catch (exception, stackTrace) { notifications.add(PluginErrorParams( false, exception.toString(), stackTrace.toString()) .toNotification()); } } notifications.add(AnalysisHighlightsParams(request.path, collector.regions) .toNotification()); return GeneratorResult(null, notifications); } } /// The information about a requested set of highlight regions. /// /// Clients may not extend, implement or mix-in this class. abstract class HighlightsRequest { /// Return the path of the file for which highlight regions are being /// requested. String get path; /// Return the resource provider associated with this request. ResourceProvider get resourceProvider; }