Index: analyzer/lib/src/generated/utilities_collection.dart |
diff --git a/analyzer/lib/src/generated/utilities_collection.dart b/analyzer/lib/src/generated/utilities_collection.dart |
deleted file mode 100644 |
index e8abbbd1e83d2781df568c9e5b23baf529889692..0000000000000000000000000000000000000000 |
--- a/analyzer/lib/src/generated/utilities_collection.dart |
+++ /dev/null |
@@ -1,746 +0,0 @@ |
-// Copyright (c) 2014, 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. |
- |
-// This code was auto-generated, is not intended to be edited, and is subject to |
-// significant change. Please see the README file for more information. |
- |
-library engine.utilities.collection; |
- |
-import "dart:math" as math; |
-import 'dart:collection'; |
- |
-import 'java_core.dart'; |
-import 'scanner.dart' show Token; |
- |
-/** |
- * The class `BooleanArray` defines methods for operating on integers as if they were arrays |
- * of booleans. These arrays can be indexed by either integers or by enumeration constants. |
- */ |
-class BooleanArray { |
- /** |
- * Return the value of the element at the given index. |
- * |
- * @param array the array being accessed |
- * @param index the index of the element being accessed |
- * @return the value of the element at the given index |
- * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive |
- */ |
- static bool get(int array, int index) { |
- _checkIndex(index); |
- return (array & (1 << index)) > 0; |
- } |
- |
- /** |
- * Return the value of the element at the given index. |
- * |
- * @param array the array being accessed |
- * @param index the index of the element being accessed |
- * @return the value of the element at the given index |
- * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive |
- */ |
- static bool getEnum(int array, Enum index) => get(array, index.ordinal); |
- |
- /** |
- * Set the value of the element at the given index to the given value. |
- * |
- * @param array the array being modified |
- * @param index the index of the element being set |
- * @param value the value to be assigned to the element |
- * @return the updated value of the array |
- * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive |
- */ |
- static int set(int array, int index, bool value) { |
- _checkIndex(index); |
- if (value) { |
- return array | (1 << index); |
- } else { |
- return array & ~(1 << index); |
- } |
- } |
- |
- /** |
- * Set the value of the element at the given index to the given value. |
- * |
- * @param array the array being modified |
- * @param index the index of the element being set |
- * @param value the value to be assigned to the element |
- * @return the updated value of the array |
- * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive |
- */ |
- static int setEnum(int array, Enum index, bool value) => |
- set(array, index.ordinal, value); |
- |
- /** |
- * Throw an exception if the index is not within the bounds allowed for an integer-encoded array |
- * of boolean values. |
- * |
- * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive |
- */ |
- static void _checkIndex(int index) { |
- if (index < 0 || index > 30) { |
- throw new RangeError("Index not between 0 and 30: $index"); |
- } |
- } |
-} |
- |
-/** |
- * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are |
- * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an |
- * edge from any node to any other node, including itself, but will not represent multiple edges |
- * between the same pair of nodes. |
- * |
- * @param N the type of the nodes in the graph |
- */ |
-class DirectedGraph<N> { |
- /** |
- * The table encoding the edges in the graph. An edge is represented by an entry mapping the head |
- * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping |
- * the node to an empty set of tails. |
- */ |
- HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>(); |
- |
- /** |
- * Return `true` if this graph is empty. |
- * |
- * @return `true` if this graph is empty |
- */ |
- bool get isEmpty => _edges.isEmpty; |
- |
- /** |
- * Return the number of nodes in this graph. |
- * |
- * @return the number of nodes in this graph |
- */ |
- int get nodeCount => _edges.length; |
- |
- /** |
- * Return a set of all nodes in the graph. |
- */ |
- Set<N> get nodes => _edges.keys.toSet(); |
- |
- /** |
- * Add an edge from the given head node to the given tail node. Both nodes will be a part of the |
- * graph after this method is invoked, whether or not they were before. |
- * |
- * @param head the node at the head of the edge |
- * @param tail the node at the tail of the edge |
- */ |
- void addEdge(N head, N tail) { |
- // |
- // First, ensure that the tail is a node known to the graph. |
- // |
- if (_edges[tail] == null) { |
- _edges[tail] = new HashSet<N>(); |
- } |
- // |
- // Then create the edge. |
- // |
- HashSet<N> tails = _edges[head]; |
- if (tails == null) { |
- tails = new HashSet<N>(); |
- _edges[head] = tails; |
- } |
- tails.add(tail); |
- } |
- |
- /** |
- * Add the given node to the set of nodes in the graph. |
- * |
- * @param node the node to be added |
- */ |
- void addNode(N node) { |
- HashSet<N> tails = _edges[node]; |
- if (tails == null) { |
- _edges[node] = new HashSet<N>(); |
- } |
- } |
- |
- /** |
- * Run a topological sort of the graph. Since the graph may contain cycles, this results in a list |
- * of strongly connected components rather than a list of nodes. The nodes in each strongly |
- * connected components only have edges that point to nodes in the same component or earlier |
- * components. |
- */ |
- List<List<N>> computeTopologicalSort() { |
- DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this); |
- return finder.computeTopologicalSort(); |
- } |
- |
- /** |
- * Return true if the graph contains at least one path from `source` to `destination`. |
- */ |
- bool containsPath(N source, N destination) { |
- HashSet<N> nodesVisited = new HashSet<N>(); |
- return _containsPathInternal(source, destination, nodesVisited); |
- } |
- |
- /** |
- * Return a list of nodes that form a cycle containing the given node. If the node is not part of |
- * this graph, then a list containing only the node itself will be returned. |
- * |
- * @return a list of nodes that form a cycle containing the given node |
- */ |
- List<N> findCycleContaining(N node) { |
- if (node == null) { |
- throw new IllegalArgumentException(); |
- } |
- DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this); |
- return finder.componentContaining(node); |
- } |
- |
- /** |
- * Return a set containing the tails of edges that have the given node as their head. The set will |
- * be empty if there are no such edges or if the node is not part of the graph. Clients must not |
- * modify the returned set. |
- * |
- * @param head the node at the head of all of the edges whose tails are to be returned |
- * @return a set containing the tails of edges that have the given node as their head |
- */ |
- Set<N> getTails(N head) { |
- HashSet<N> tails = _edges[head]; |
- if (tails == null) { |
- return new HashSet<N>(); |
- } |
- return tails; |
- } |
- |
- /** |
- * Remove all of the given nodes from this graph. As a consequence, any edges for which those |
- * nodes were either a head or a tail will also be removed. |
- * |
- * @param nodes the nodes to be removed |
- */ |
- void removeAllNodes(List<N> nodes) { |
- for (N node in nodes) { |
- removeNode(node); |
- } |
- } |
- |
- /** |
- * Remove the edge from the given head node to the given tail node. If there was no such edge then |
- * the graph will be unmodified: the number of edges will be the same and the set of nodes will be |
- * the same (neither node will either be added or removed). |
- * |
- * @param head the node at the head of the edge |
- * @param tail the node at the tail of the edge |
- * @return `true` if the graph was modified as a result of this operation |
- */ |
- void removeEdge(N head, N tail) { |
- HashSet<N> tails = _edges[head]; |
- if (tails != null) { |
- tails.remove(tail); |
- } |
- } |
- |
- /** |
- * Remove the given node from this graph. As a consequence, any edges for which that node was |
- * either a head or a tail will also be removed. |
- * |
- * @param node the node to be removed |
- */ |
- void removeNode(N node) { |
- _edges.remove(node); |
- for (HashSet<N> tails in _edges.values) { |
- tails.remove(node); |
- } |
- } |
- |
- /** |
- * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there |
- * are no edges that have that node as the head of the edge) and remove it from this graph. Return |
- * the node that was removed, or `null` if there are no such nodes either because the graph |
- * is empty or because every node in the graph has at least one outgoing edge. As a consequence of |
- * removing the node from the graph any edges for which that node was a tail will also be removed. |
- * |
- * @return the sink node that was removed |
- */ |
- N removeSink() { |
- N sink = _findSink(); |
- if (sink == null) { |
- return null; |
- } |
- removeNode(sink); |
- return sink; |
- } |
- |
- bool _containsPathInternal(N source, N destination, HashSet<N> nodesVisited) { |
- if (identical(source, destination)) { |
- return true; |
- } |
- HashSet<N> tails = _edges[source]; |
- if (tails != null) { |
- nodesVisited.add(source); |
- for (N tail in tails) { |
- if (!nodesVisited.contains(tail)) { |
- if (_containsPathInternal(tail, destination, nodesVisited)) { |
- return true; |
- } |
- } |
- } |
- } |
- return false; |
- } |
- |
- /** |
- * Return one node that has no outgoing edges (that is, for which there are no edges that have |
- * that node as the head of the edge), or `null` if there are no such nodes. |
- * |
- * @return a sink node |
- */ |
- N _findSink() { |
- for (N key in _edges.keys) { |
- if (_edges[key].isEmpty) return key; |
- } |
- return null; |
- } |
-} |
- |
-/** |
- * Instances of the class `NodeInfo` are used by the [SccFinder] to maintain |
- * information about the nodes that have been examined. |
- * |
- * @param N the type of the nodes corresponding to the entries |
- */ |
-class DirectedGraph_NodeInfo<N> { |
- /** |
- * The depth of this node. |
- */ |
- int index = 0; |
- |
- /** |
- * The depth of the first node in a cycle. |
- */ |
- int lowlink = 0; |
- |
- /** |
- * A flag indicating whether the corresponding node is on the stack. Used to remove the need for |
- * searching a collection for the node each time the question needs to be asked. |
- */ |
- bool onStack = false; |
- |
- /** |
- * The component that contains the corresponding node. |
- */ |
- List<N> component; |
- |
- /** |
- * Initialize a newly created information holder to represent a node at the given depth. |
- * |
- * @param depth the depth of the node being represented |
- */ |
- DirectedGraph_NodeInfo(int depth) { |
- index = depth; |
- lowlink = depth; |
- onStack = false; |
- } |
-} |
- |
-/** |
- * Instances of the class `SccFinder` implement Tarjan's Algorithm for finding the strongly |
- * connected components in a graph. |
- */ |
-class DirectedGraph_SccFinder<N> { |
- /** |
- * The graph to work with. |
- */ |
- final DirectedGraph<N> _graph; |
- |
- /** |
- * The index used to uniquely identify the depth of nodes. |
- */ |
- int _index = 0; |
- |
- /** |
- * The stack of nodes that are being visited in order to identify components. |
- */ |
- List<N> _stack = new List<N>(); |
- |
- /** |
- * A table mapping nodes to information about the nodes that is used by this algorithm. |
- */ |
- HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap = |
- new HashMap<N, DirectedGraph_NodeInfo<N>>(); |
- |
- /** |
- * A list of all strongly connected components found, in topological sort order (each node in a |
- * strongly connected component only has edges that point to nodes in the same component or |
- * earlier components). |
- */ |
- List<List<N>> _allComponents = new List<List<N>>(); |
- |
- /** |
- * Initialize a newly created finder. |
- */ |
- DirectedGraph_SccFinder(this._graph) : super(); |
- |
- /** |
- * Return a list containing the nodes that are part of the strongly connected component that |
- * contains the given node. |
- * |
- * @param node the node used to identify the strongly connected component to be returned |
- * @return the nodes that are part of the strongly connected component that contains the given |
- * node |
- */ |
- List<N> componentContaining(N node) => _strongConnect(node).component; |
- |
- /** |
- * Run Tarjan's algorithm and return the resulting list of strongly connected components. The |
- * list is in topological sort order (each node in a strongly connected component only has edges |
- * that point to nodes in the same component or earlier components). |
- */ |
- List<List<N>> computeTopologicalSort() { |
- for (N node in _graph._edges.keys.toSet()) { |
- DirectedGraph_NodeInfo<N> nodeInfo = _nodeMap[node]; |
- if (nodeInfo == null) { |
- _strongConnect(node); |
- } |
- } |
- return _allComponents; |
- } |
- |
- /** |
- * Remove and return the top-most element from the stack. |
- * |
- * @return the element that was removed |
- */ |
- N _pop() { |
- N node = _stack.removeAt(_stack.length - 1); |
- _nodeMap[node].onStack = false; |
- return node; |
- } |
- |
- /** |
- * Add the given node to the stack. |
- * |
- * @param node the node to be added to the stack |
- */ |
- void _push(N node) { |
- _nodeMap[node].onStack = true; |
- _stack.add(node); |
- } |
- |
- /** |
- * Compute the strongly connected component that contains the given node as well as any |
- * components containing nodes that are reachable from the given component. |
- * |
- * @param v the node from which the search will begin |
- * @return the information about the given node |
- */ |
- DirectedGraph_NodeInfo<N> _strongConnect(N v) { |
- // |
- // Set the depth index for v to the smallest unused index |
- // |
- DirectedGraph_NodeInfo<N> vInfo = new DirectedGraph_NodeInfo<N>(_index++); |
- _nodeMap[v] = vInfo; |
- _push(v); |
- // |
- // Consider successors of v |
- // |
- HashSet<N> tails = _graph._edges[v]; |
- if (tails != null) { |
- for (N w in tails) { |
- DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w]; |
- if (wInfo == null) { |
- // Successor w has not yet been visited; recurse on it |
- wInfo = _strongConnect(w); |
- vInfo.lowlink = math.min(vInfo.lowlink, wInfo.lowlink); |
- } else if (wInfo.onStack) { |
- // Successor w is in stack S and hence in the current SCC |
- vInfo.lowlink = math.min(vInfo.lowlink, wInfo.index); |
- } |
- } |
- } |
- // |
- // If v is a root node, pop the stack and generate an SCC |
- // |
- if (vInfo.lowlink == vInfo.index) { |
- List<N> component = new List<N>(); |
- N w; |
- do { |
- w = _pop(); |
- component.add(w); |
- _nodeMap[w].component = component; |
- } while (!identical(w, v)); |
- _allComponents.add(component); |
- } |
- return vInfo; |
- } |
-} |
- |
-/** |
- * The class `ListUtilities` defines utility methods useful for working with [List |
- ]. |
- */ |
-class ListUtilities { |
- /** |
- * Add all of the elements in the given array to the given list. |
- * |
- * @param list the list to which the elements are to be added |
- * @param elements the elements to be added to the list |
- */ |
- static void addAll(List list, List<Object> elements) { |
- int count = elements.length; |
- for (int i = 0; i < count; i++) { |
- list.add(elements[i]); |
- } |
- } |
-} |
- |
-/** |
- * The interface `MapIterator` defines the behavior of objects that iterate over the entries |
- * in a map. |
- * |
- * This interface defines the concept of a current entry and provides methods to access the key and |
- * value in the current entry. When an iterator is first created it will be positioned before the |
- * first entry and there is no current entry until [moveNext] is invoked. When all of the |
- * entries have been accessed there will also be no current entry. |
- * |
- * There is no guarantee made about the order in which the entries are accessible. |
- */ |
-abstract class MapIterator<K, V> { |
- /** |
- * Return the key associated with the current element. |
- * |
- * @return the key associated with the current element |
- * @throws NoSuchElementException if there is no current element |
- */ |
- K get key; |
- |
- /** |
- * Return the value associated with the current element. |
- * |
- * @return the value associated with the current element |
- * @throws NoSuchElementException if there is no current element |
- */ |
- V get value; |
- |
- /** |
- * Set the value associated with the current element to the given value. |
- * |
- * @param newValue the new value to be associated with the current element |
- * @throws NoSuchElementException if there is no current element |
- */ |
- void set value(V newValue); |
- |
- /** |
- * Advance to the next entry in the map. Return `true` if there is a current element that |
- * can be accessed after this method returns. It is safe to invoke this method even if the |
- * previous invocation returned `false`. |
- * |
- * @return `true` if there is a current element that can be accessed |
- */ |
- bool moveNext(); |
-} |
- |
-/** |
- * Instances of the class `MultipleMapIterator` implement an iterator that can be used to |
- * sequentially access the entries in multiple maps. |
- */ |
-class MultipleMapIterator<K, V> implements MapIterator<K, V> { |
- /** |
- * The iterators used to access the entries. |
- */ |
- List<MapIterator<K, V>> _iterators; |
- |
- /** |
- * The index of the iterator currently being used to access the entries. |
- */ |
- int _iteratorIndex = -1; |
- |
- /** |
- * The current iterator, or `null` if there is no current iterator. |
- */ |
- MapIterator<K, V> _currentIterator; |
- |
- /** |
- * Initialize a newly created iterator to return the entries from the given maps. |
- * |
- * @param maps the maps containing the entries to be iterated |
- */ |
- MultipleMapIterator(List<Map<K, V>> maps) { |
- int count = maps.length; |
- _iterators = new List<MapIterator<K, V>>(count); |
- for (int i = 0; i < count; i++) { |
- _iterators[i] = new SingleMapIterator<K, V>(maps[i]); |
- } |
- } |
- |
- @override |
- K get key { |
- if (_currentIterator == null) { |
- throw new NoSuchElementException(); |
- } |
- return _currentIterator.key; |
- } |
- |
- @override |
- V get value { |
- if (_currentIterator == null) { |
- throw new NoSuchElementException(); |
- } |
- return _currentIterator.value; |
- } |
- |
- @override |
- void set value(V newValue) { |
- if (_currentIterator == null) { |
- throw new NoSuchElementException(); |
- } |
- _currentIterator.value = newValue; |
- } |
- |
- @override |
- bool moveNext() { |
- if (_iteratorIndex < 0) { |
- if (_iterators.length == 0) { |
- _currentIterator = null; |
- return false; |
- } |
- if (_advanceToNextIterator()) { |
- return true; |
- } else { |
- _currentIterator = null; |
- return false; |
- } |
- } |
- if (_currentIterator.moveNext()) { |
- return true; |
- } else if (_advanceToNextIterator()) { |
- return true; |
- } else { |
- _currentIterator = null; |
- return false; |
- } |
- } |
- |
- /** |
- * Under the assumption that there are no more entries that can be returned using the current |
- * iterator, advance to the next iterator that has entries. |
- * |
- * @return `true` if there is a current iterator that has entries |
- */ |
- bool _advanceToNextIterator() { |
- _iteratorIndex++; |
- while (_iteratorIndex < _iterators.length) { |
- MapIterator<K, V> iterator = _iterators[_iteratorIndex]; |
- if (iterator.moveNext()) { |
- _currentIterator = iterator; |
- return true; |
- } |
- _iteratorIndex++; |
- } |
- return false; |
- } |
-} |
- |
-/** |
- * Instances of the class `SingleMapIterator` implement an iterator that can be used to access |
- * the entries in a single map. |
- */ |
-class SingleMapIterator<K, V> implements MapIterator<K, V> { |
- /** |
- * The [Map] containing the entries to be iterated over. |
- */ |
- final Map<K, V> _map; |
- |
- /** |
- * The iterator used to access the entries. |
- */ |
- Iterator<K> _keyIterator; |
- |
- /** |
- * The current key, or `null` if there is no current key. |
- */ |
- K _currentKey; |
- |
- /** |
- * The current value. |
- */ |
- V _currentValue; |
- |
- /** |
- * Initialize a newly created iterator to return the entries from the given map. |
- * |
- * @param map the map containing the entries to be iterated over |
- */ |
- SingleMapIterator(this._map) { |
- this._keyIterator = _map.keys.iterator; |
- } |
- |
- @override |
- K get key { |
- if (_currentKey == null) { |
- throw new NoSuchElementException(); |
- } |
- return _currentKey; |
- } |
- |
- @override |
- V get value { |
- if (_currentKey == null) { |
- throw new NoSuchElementException(); |
- } |
- if (_currentValue == null) { |
- _currentValue = _map[_currentKey]; |
- } |
- return _currentValue; |
- } |
- |
- @override |
- void set value(V newValue) { |
- if (_currentKey == null) { |
- throw new NoSuchElementException(); |
- } |
- _currentValue = newValue; |
- _map[_currentKey] = newValue; |
- } |
- |
- @override |
- bool moveNext() { |
- if (_keyIterator.moveNext()) { |
- _currentKey = _keyIterator.current; |
- _currentValue = null; |
- return true; |
- } else { |
- _currentKey = null; |
- return false; |
- } |
- } |
- |
- /** |
- * Returns a new [SingleMapIterator] instance for the given [Map]. |
- */ |
- static SingleMapIterator forMap(Map map) => new SingleMapIterator(map); |
-} |
- |
-/** |
- * Instances of the class `TokenMap` map one set of tokens to another set of tokens. |
- */ |
-class TokenMap { |
- /** |
- * A table mapping tokens to tokens. This should be replaced by a more performant implementation. |
- * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a |
- * cursor indicating where to start searching. |
- */ |
- HashMap<Token, Token> _map = new HashMap<Token, Token>(); |
- |
- /** |
- * Return the token that is mapped to the given token, or `null` if there is no token |
- * corresponding to the given token. |
- * |
- * @param key the token being mapped to another token |
- * @return the token that is mapped to the given token |
- */ |
- Token get(Token key) => _map[key]; |
- |
- /** |
- * Map the key to the value. |
- * |
- * @param key the token being mapped to the value |
- * @param value the token to which the key will be mapped |
- */ |
- void put(Token key, Token value) { |
- _map[key] = value; |
- } |
-} |