| Index: mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart
|
| diff --git a/mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart b/mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..be96ba4d532a22fe1d6fe476e4f694d28be90d1d
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart
|
| @@ -0,0 +1,155 @@
|
| +// 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.
|
| +
|
| +library yaml.yaml_node_wrapper;
|
| +
|
| +import 'dart:collection';
|
| +
|
| +import 'package:collection/collection.dart' as pkg_collection;
|
| +import 'package:source_span/source_span.dart';
|
| +
|
| +import 'null_span.dart';
|
| +import 'style.dart';
|
| +import 'yaml_node.dart';
|
| +
|
| +/// A wrapper that makes a normal Dart map behave like a [YamlMap].
|
| +class YamlMapWrapper extends MapBase
|
| + with pkg_collection.UnmodifiableMapMixin
|
| + implements YamlMap {
|
| + final CollectionStyle style = CollectionStyle.ANY;
|
| +
|
| + final Map _dartMap;
|
| +
|
| + final SourceSpan span;
|
| +
|
| + final Map<dynamic, YamlNode> nodes;
|
| +
|
| + Map get value => this;
|
| +
|
| + Iterable get keys => _dartMap.keys;
|
| +
|
| + YamlMapWrapper(Map dartMap, sourceUrl)
|
| + : this._(dartMap, new NullSpan(sourceUrl));
|
| +
|
| + YamlMapWrapper._(Map dartMap, SourceSpan span)
|
| + : _dartMap = dartMap,
|
| + span = span,
|
| + nodes = new _YamlMapNodes(dartMap, span);
|
| +
|
| + operator [](Object key) {
|
| + var value = _dartMap[key];
|
| + if (value is Map) return new YamlMapWrapper._(value, span);
|
| + if (value is List) return new YamlListWrapper._(value, span);
|
| + return value;
|
| + }
|
| +
|
| + int get hashCode => _dartMap.hashCode;
|
| +
|
| + operator ==(Object other) =>
|
| + other is YamlMapWrapper && other._dartMap == _dartMap;
|
| +}
|
| +
|
| +/// The implementation of [YamlMapWrapper.nodes] as a wrapper around the Dart
|
| +/// map.
|
| +class _YamlMapNodes extends MapBase<dynamic, YamlNode>
|
| + with pkg_collection.UnmodifiableMapMixin<dynamic, YamlNode> {
|
| + final Map _dartMap;
|
| +
|
| + final SourceSpan _span;
|
| +
|
| + Iterable get keys => _dartMap.keys.map((key) =>
|
| + new YamlScalar.internal(key, _span, ScalarStyle.ANY));
|
| +
|
| + _YamlMapNodes(this._dartMap, this._span);
|
| +
|
| + YamlNode operator [](Object key) {
|
| + // Use "as" here because key being assigned to invalidates type propagation.
|
| + if (key is YamlScalar) key = (key as YamlScalar).value;
|
| + if (!_dartMap.containsKey(key)) return null;
|
| + return _nodeForValue(_dartMap[key], _span);
|
| + }
|
| +
|
| + int get hashCode => _dartMap.hashCode;
|
| +
|
| + operator ==(Object other) =>
|
| + other is _YamlMapNodes && other._dartMap == _dartMap;
|
| +}
|
| +
|
| +// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
|
| +/// A wrapper that makes a normal Dart list behave like a [YamlList].
|
| +class YamlListWrapper extends ListBase implements YamlList {
|
| + final CollectionStyle style = CollectionStyle.ANY;
|
| +
|
| + final List _dartList;
|
| +
|
| + final SourceSpan span;
|
| +
|
| + final List<YamlNode> nodes;
|
| +
|
| + List get value => this;
|
| +
|
| + int get length => _dartList.length;
|
| +
|
| + set length(int index) {
|
| + throw new UnsupportedError("Cannot modify an unmodifiable List.");
|
| + }
|
| +
|
| + YamlListWrapper(List dartList, sourceUrl)
|
| + : this._(dartList, new NullSpan(sourceUrl));
|
| +
|
| + YamlListWrapper._(List dartList, SourceSpan span)
|
| + : _dartList = dartList,
|
| + span = span,
|
| + nodes = new _YamlListNodes(dartList, span);
|
| +
|
| + operator [](int index) {
|
| + var value = _dartList[index];
|
| + if (value is Map) return new YamlMapWrapper._(value, span);
|
| + if (value is List) return new YamlListWrapper._(value, span);
|
| + return value;
|
| + }
|
| +
|
| + operator []=(int index, value) {
|
| + throw new UnsupportedError("Cannot modify an unmodifiable List.");
|
| + }
|
| +
|
| + int get hashCode => _dartList.hashCode;
|
| +
|
| + operator ==(Object other) =>
|
| + other is YamlListWrapper && other._dartList == _dartList;
|
| +}
|
| +
|
| +// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
|
| +/// The implementation of [YamlListWrapper.nodes] as a wrapper around the Dart
|
| +/// list.
|
| +class _YamlListNodes extends ListBase<YamlNode> {
|
| + final List _dartList;
|
| +
|
| + final SourceSpan _span;
|
| +
|
| + int get length => _dartList.length;
|
| +
|
| + set length(int index) {
|
| + throw new UnsupportedError("Cannot modify an unmodifiable List.");
|
| + }
|
| +
|
| + _YamlListNodes(this._dartList, this._span);
|
| +
|
| + YamlNode operator [](int index) => _nodeForValue(_dartList[index], _span);
|
| +
|
| + operator []=(int index, value) {
|
| + throw new UnsupportedError("Cannot modify an unmodifiable List.");
|
| + }
|
| +
|
| + int get hashCode => _dartList.hashCode;
|
| +
|
| + operator ==(Object other) =>
|
| + other is _YamlListNodes && other._dartList == _dartList;
|
| +}
|
| +
|
| +YamlNode _nodeForValue(value, SourceSpan span) {
|
| + if (value is Map) return new YamlMapWrapper._(value, span);
|
| + if (value is List) return new YamlListWrapper._(value, span);
|
| + return new YamlScalar.internal(value, span, ScalarStyle.ANY);
|
| +}
|
|
|