blob: 1d96904b467c18d08e1a4f9c740e44bc650479eb [file] [log] [blame]
// Copyright (c) 2020, 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 '../ast.dart';
/// Pairs of [TypeParameter]s that are currently assumed to be
/// equivalent.
///
/// This is used to compute the equivalence relation on types coinductively.
class Assumptions {
Map<TypeParameter, TypeParameter> _assumptionMap =
new Map<TypeParameter, TypeParameter>.identity();
void _addAssumption(TypeParameter a, TypeParameter b) {
assert(!_assumptionMap.containsKey(a));
_assumptionMap[a] = b;
}
/// Assume that [a] and [b] are equivalent.
void assume(TypeParameter a, TypeParameter b) {
_addAssumption(a, b);
}
void _removeAssumption(TypeParameter a, TypeParameter b) {
TypeParameter? assumption = _assumptionMap.remove(a);
assert(identical(assumption, b));
}
/// Remove the assumption that [a] and [b] are equivalent.
void forget(TypeParameter a, TypeParameter b) {
_removeAssumption(a, b);
}
/// Returns `true` if [a] and [b] are assumed to be equivalent.
bool isAssumed(TypeParameter a, TypeParameter b) {
return identical(_assumptionMap[a], b);
}
@override
String toString() {
StringBuffer sb = new StringBuffer();
sb.write('Assumptions(');
String comma = '';
_assumptionMap.forEach((TypeParameter a, TypeParameter b) {
sb.write('$comma$a (${identityHashCode(a)})->'
'$b (${identityHashCode(b)})');
comma = ',';
});
sb.write(')');
return sb.toString();
}
}