blob: 64cf6b8a559f55f1aa311dc057a7e1071a3a6ddc [file] [log] [blame]
// Copyright (c) 2017, 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 'package:kernel/ast.dart' as ir;
import 'package:kernel/class_hierarchy.dart' as ir;
import 'package:kernel/core_types.dart' as ir;
import 'package:kernel/type_algebra.dart' as ir;
import 'package:kernel/type_environment.dart' as ir;
import '../serialization/serialization.dart';
class StaticTypeCache {
static const String tag = 'static-type-cache';
final Map<ir.Expression, ir.DartType> _expressionTypes;
final Map<ir.ForInStatement, ir.DartType> _forInIteratorTypes;
const StaticTypeCache(
[this._expressionTypes = const {}, this._forInIteratorTypes]);
factory StaticTypeCache.readFromDataSource(DataSource source) {
source.begin(tag);
Map<ir.Expression, ir.DartType> expressionTypes =
source.readTreeNodeMap(source.readDartTypeNode);
Map<ir.ForInStatement, ir.DartType> forInIteratorTypes =
source.readTreeNodeMap(source.readDartTypeNode, emptyAsNull: true);
source.end(tag);
return new StaticTypeCache(expressionTypes, forInIteratorTypes);
}
void writeToDataSink(DataSink sink) {
sink.begin(tag);
sink.writeTreeNodeMap(_expressionTypes, sink.writeDartTypeNode);
sink.writeTreeNodeMap(_forInIteratorTypes, sink.writeDartTypeNode,
allowNull: true);
sink.end(tag);
}
ir.DartType operator [](ir.Expression node) => _expressionTypes[node];
ir.DartType getForInIteratorType(ir.ForInStatement node) {
return _forInIteratorTypes != null ? _forInIteratorTypes[node] : null;
}
}