blob: b62d893e261f2682073482f8277012af709d25c3 [file] [log] [blame]
import 'package:meta/meta.dart';
import '../../context/context.dart';
import '../../context/result.dart';
import '../../core/parser.dart';
import '../../parser/utils/resolvable.dart';
/// Internal implementation of a reference parser.
@immutable
class ReferenceParser<R> extends Parser<R> implements ResolvableParser<R> {
ReferenceParser(this.function, this.arguments);
final Function function;
final List arguments;
@override
Parser<R> resolve() => Function.apply(function, arguments);
@override
Result<R> parseOn(Context context) =>
throw UnsupportedError('References cannot be parsed.');
@override
ReferenceParser<R> copy() =>
throw UnsupportedError('References cannot be copied.');
@override
bool operator ==(Object other) {
if (other is ReferenceParser) {
if (function != other.function ||
arguments.length != other.arguments.length) {
return false;
}
for (var i = 0; i < arguments.length; i++) {
final a = arguments[i], b = other.arguments[i];
if (a is Parser &&
a is! ReferenceParser &&
b is Parser &&
b is! ReferenceParser) {
// for parsers do a deep equality check
if (!a.isEqualTo(b)) {
return false;
}
} else {
// for everything else just do standard equality
if (a != b) {
return false;
}
}
}
return true;
}
return false;
}
@override
int get hashCode => function.hashCode;
}