// Copyright (c) 2012, 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.

part of yaml;

/// Takes a parsed and composed YAML document (what the spec calls the
/// "representation graph") and creates native Dart objects that represent that
/// document.
class _Constructor extends _Visitor {
  /// The root node of the representation graph.
  _Node root;

  /// Map from anchor names to the most recent Dart node with that anchor.
  Map<String, dynamic> anchors;

  _Constructor(this.root) : this.anchors = {};

  /// Runs the Constructor to produce a Dart object.
  construct() => root.visit(this);

  /// Returns the value of a scalar.
  visitScalar(_ScalarNode scalar) => scalar.value;

  /// Converts a sequence into a List of Dart objects.
  visitSequence(_SequenceNode seq) {
    var anchor = getAnchor(seq);
    if (anchor != null) return anchor;
    var dartSeq = setAnchor(seq, []);
    dartSeq.addAll(super.visitSequence(seq));
    return dartSeq;
  }

  /// Converts a mapping into a Map of Dart objects.
  visitMapping(_MappingNode map) {
    var anchor = getAnchor(map);
    if (anchor != null) return anchor;
    var dartMap = setAnchor(map, new YamlMap());
    super.visitMapping(map).forEach((k, v) { dartMap[k] = v; });
    return dartMap;
  }

  /// Returns the Dart object that already represents [anchored], if such a
  /// thing exists.
  getAnchor(_Node anchored) {
    if (anchored.anchor == null) return null;
    if (anchors.containsKey(anchored.anchor)) return anchors[anchored.anchor];
  }

  /// Records that [value] is the Dart object representing [anchored].
  setAnchor(_Node anchored, value) {
    if (anchored.anchor == null) return value;
    anchors[anchored.anchor] = value;
    return value;
  }
}
