blob: 6696aa4f35794ed50dfbf8cc5effd7fd9b9918dc [file] [log] [blame]
// Copyright (c) 2014, 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.
library dart_style.src.formatter_exception;
import 'package:analyzer/analyzer.dart';
import 'package:source_span/source_span.dart';
/// Thrown when one or more errors occurs while parsing the code to be
/// formatted.
class FormatterException implements Exception {
/// The [AnalysisError]s that occurred.
final List<AnalysisError> errors;
/// Creates a new FormatterException with an optional error [message].
const FormatterException(this.errors);
/// Creates a human-friendly representation of the analysis errors.
String message({bool color}) {
var buffer = new StringBuffer();
buffer.writeln("Could not format because the source could not be parsed:");
// In case we get a huge series of cascaded errors, just show the first few.
var shownErrors = errors;
if (errors.length > 10) shownErrors = errors.take(10);
for (var error in shownErrors) {
var source =;
// If the parse error is for something missing from the end of the file,
// the error position will go past the end of the source. In that case,
// just pad the source with spaces so we can report it nicely.
if (error.offset + error.length > source.length) {
source += " " * (error.offset + error.length - source.length);
var file = new SourceFile(source, url: error.source.fullName);
var span = file.span(error.offset, error.offset + error.length);
if (buffer.isNotEmpty) buffer.writeln();
buffer.write(span.message(error.message, color: color));
if (shownErrors.length != errors.length) {
buffer.write("(${errors.length - shownErrors.length} more errors...)");
return buffer.toString();
String toString() => message();