blob: f8d3701bfb73a4b06244c70c5c30ae135e16df27 [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();
Map<StructuralParameter, StructuralParameter>
_structuralParameterAssumptionMap =
new Map<StructuralParameter, StructuralParameter>.identity();
void _addAssumption(TypeParameter a, TypeParameter b) {
assert(!_assumptionMap.containsKey(a));
_assumptionMap[a] = b;
}
void _addStructuralParameterAssumption(
StructuralParameter a, StructuralParameter b) {
assert(!_structuralParameterAssumptionMap.containsKey(a));
_structuralParameterAssumptionMap[a] = b;
}
/// Assume that [a] and [b] are equivalent.
void assume(TypeParameter a, TypeParameter b) {
_addAssumption(a, b);
}
/// Assume that [a] and [b] are equivalent.
void assumeStructuralParameter(StructuralParameter a, StructuralParameter b) {
_addStructuralParameterAssumption(a, b);
}
void _removeStructuralParameterAssumption(
StructuralParameter a, StructuralParameter b) {
StructuralParameter? assumption =
_structuralParameterAssumptionMap.remove(a);
assert(identical(assumption, b));
}
/// Remove the assumption that [a] and [b] are equivalent.
// TODO(cstefantsova): Is this method needed?
void forgetStructuralParameter(StructuralParameter a, StructuralParameter b) {
_removeStructuralParameterAssumption(a, b);
}
/// Returns `true` if [a] and [b] are assumed to be equivalent.
bool isAssumed(TypeParameter a, TypeParameter b) {
return identical(_assumptionMap[a], b);
}
/// Returns `true` if [a] and [b] are assumed to be equivalent.
// TODO(cstefantsova): Is this method needed?
bool isAssumedStructuralParameter(
StructuralParameter a, StructuralParameter b) {
return identical(_structuralParameterAssumptionMap[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();
}
}