Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1188)

Unified Diff: pkg/compiler/lib/src/kernel/indexed.dart

Issue 3004433002: Encapsulate the index based maps for entities. (Closed)
Patch Set: Updated cf. comments Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/kernel/elements.dart ('k') | pkg/compiler/lib/src/kernel/kelements.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/indexed.dart
diff --git a/pkg/compiler/lib/src/kernel/indexed.dart b/pkg/compiler/lib/src/kernel/indexed.dart
new file mode 100644
index 0000000000000000000000000000000000000000..ba81fc48c9c0732691ce042c9b4303ccbe8f52c7
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/indexed.dart
@@ -0,0 +1,147 @@
+// 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.
+
+/// Indexed entity interfaces for modeling elements derived from Kernel IR.
+
+import '../elements/entities.dart';
+
+abstract class _Indexed {
+ int _index;
+}
+
+abstract class IndexedLibrary extends _Indexed implements LibraryEntity {
+ /// Library index used for fast lookup in [KernelToElementMapBase].
+ int get libraryIndex => _index;
+}
+
+abstract class IndexedClass extends _Indexed implements ClassEntity {
+ /// Class index used for fast lookup in [KernelToElementMapBase].
+ int get classIndex => _index;
+}
+
+abstract class IndexedMember extends _Indexed implements MemberEntity {
+ /// Member index used for fast lookup in [KernelToElementMapBase].
+ int get memberIndex => _index;
+}
+
+abstract class IndexedFunction extends _Indexed
+ implements IndexedMember, FunctionEntity {}
+
+abstract class IndexedConstructor
+ implements IndexedFunction, ConstructorEntity {}
+
+abstract class IndexedField implements IndexedMember, FieldEntity {}
+
+abstract class IndexedTypeVariable extends _Indexed
+ implements TypeVariableEntity {
+ /// Type variable index used for fast lookup in [KernelToElementMapBase].
+ int get typeVariableIndex => _index;
+}
+
+abstract class IndexedTypedef extends _Indexed implements TypedefEntity {
+ /// Typedef index used for fast lookup in [KernelToElementMapBase].
+ int get typedefIndex => _index;
+}
+
+/// Base implementation for an index based map of entities of type [E].
+abstract class EntityMapBase<E extends _Indexed> {
+ List<E> _list = <E>[];
+
+ /// Returns the [index]th entity in the map.
+ E getEntity(int index) => _list[index];
+
+ /// Returns the number entities in the map.
+ int get length => _list.length;
+}
+
+/// Index based map of entities of type [E].
+class EntityMap<E extends _Indexed> extends EntityMapBase<E> {
+ /// Registers a new entity.
+ ///
+ /// [createEntity] is called to create the entity with the given index.
+ E0 register<E0 extends E>(E0 entity) {
+ assert(entity != null);
+ assert(entity._index == null);
+ entity._index = _list.length;
+ _list.add(entity);
+ return entity;
+ }
+}
+
+/// Base implementation of an index based map of entities of type [E] with a
+/// corresponding data object of type [D].
+abstract class EntityDataMapBase<E extends _Indexed, D>
+ extends EntityMapBase<E> {
+ List<D> _data = <D>[];
+
+ /// Returns the data object stored for the [index]th entity.
+ D getData(E entity) {
+ int index = entity._index;
+ if (index < length && index >= _data.length) {
+ throw new StateError(
+ 'Data is in the process of being created for ${_list[index]}.');
+ }
+ return _data[index];
+ }
+}
+
+/// Index based map of entities of type [E] with a corresponding data object
+/// of type [D].
+class EntityDataMap<E extends _Indexed, D> extends EntityDataMapBase<E, D> {
+ /// Registers a new entity with an associated data object.
+ ///
+ /// Firstly, [createEntity] is called to create the entity with the given
+ /// index. Secondly, [createData] is called with the newly created entity to
+ /// create the associated data object.
+ E0 register<E0 extends E, D0 extends D>(E0 entity, D0 data) {
+ assert(entity != null);
+ assert(entity._index == null);
+ entity._index = _list.length;
+ _list.add(entity);
+ assert(data != null);
+ _data.add(data);
+ return entity;
+ }
+}
+
+/// Base implementation for an index based of entities of type [E] with a
+/// corresponding data object of type [D] and an environment of type [V].
+abstract class EntityDataEnvMapBase<E extends _Indexed, D, V>
+ extends EntityDataMapBase<E, D> {
+ List<V> _env = <V>[];
+
+ /// Returns the environment object stored for the [index]th entity.
+ V getEnv(E entity) {
+ int index = entity._index;
+ if (index < length && index >= _env.length) {
+ throw new StateError(
+ 'Env is in the process of being created for ${_list[index]}.');
+ }
+ return _env[index];
+ }
+}
+
+/// Index based of entities of type [E] with a corresponding data object of
+/// type [D] and an environment of type [V].
+class EntityDataEnvMap<E extends _Indexed, D, V>
+ extends EntityDataEnvMapBase<E, D, V> {
+ /// Registers a new entity with an associated data object and environment.
+ ///
+ /// Firstly, [createEntity] is called to create the entity with the given
+ /// index. Secondly, [createData] is called with the newly created entity to
+ /// create the associated data object. Thirdly, [createEnv] is called with
+ /// the newly created entity to create the associated environment object.
+ E0 register<E0 extends E, D0 extends D, V0 extends V>(
+ E0 entity, D0 data, V0 env) {
+ assert(entity != null);
+ assert(entity._index == null);
+ entity._index = _list.length;
+ _list.add(entity);
+ assert(data != null);
+ _data.add(data);
+ assert(env != null);
+ _env.add(env);
+ return entity;
+ }
+}
« no previous file with comments | « pkg/compiler/lib/src/kernel/elements.dart ('k') | pkg/compiler/lib/src/kernel/kelements.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698