blob: ecd4f3f1f2bee0db62f703a2e1ba8fd3bdb28dcd [file] [log] [blame] [edit]
import 'package:meta/meta.dart';
import '../../context/context.dart';
import '../../context/result.dart';
import '../../core/parser.dart';
import '../../parser/utils/labeled.dart';
import '../combinator/delegate.dart';
extension LabelParserExtension<R> on Parser<R> {
/// Returns a parser that simply defers to its delegate, but that
/// has a [label] for debugging purposes.
@useResult
LabeledParser<R> labeled(String label) => LabelParser<R>(this, label);
}
/// A parser that always defers to its delegate, but that also holds a label
/// for debugging purposes.
class LabelParser<R> extends DelegateParser<R, R> implements LabeledParser<R> {
LabelParser(super.delegate, this.label);
/// Label of this parser.
@override
final String label;
@override
Result<R> parseOn(Context context) => delegate.parseOn(context);
@override
int fastParseOn(String buffer, int position) =>
delegate.fastParseOn(buffer, position);
@override
LabelParser<R> copy() => LabelParser<R>(delegate, label);
@override
bool hasEqualProperties(LabelParser<R> other) =>
super.hasEqualProperties(other) && label == other.label;
@override
String toString() => '${super.toString()}[$label]';
}