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

// @dart = 2.10

part of 'serialization.dart';

/// Helper for looking up object library data from an [ir.Component] node.
class ComponentLookup {
  final ir.Component _component;

  /// Cache of [_LibraryData] for libraries in [_component].
  Map<Uri, _LibraryData> _libraryMap;

  ComponentLookup(this._component);

  /// Returns the [_LibraryData] object for the library with the [canonicalUri].
  _LibraryData getLibraryDataByUri(Uri canonicalUri) {
    if (_libraryMap == null) {
      _libraryMap = {};
      for (ir.Library library in _component.libraries) {
        _libraryMap[library.importUri] = _LibraryData(library);
      }
    }
    _LibraryData data = _libraryMap[canonicalUri];
    assert(data != null, "No library found for $canonicalUri.");
    return data;
  }
}

/// Returns a name uniquely identifying a member within its enclosing library
/// or class.
String _computeMemberName(ir.Member member) {
  // This should mostly be empty except when serializing the name of nSM
  // forwarders (see dartbug.com/33732).
  String libraryPrefix = member.name.isPrivate &&
          member.name.libraryName != member.enclosingLibrary.reference
      ? '${member.name.libraryName.canonicalName.name}:'
      : '';
  String name = member.name.text;
  if (member is ir.Constructor) {
    name = '.$name';
  } else if (member is ir.Procedure) {
    if (member.kind == ir.ProcedureKind.Factory) {
      name = '.$name';
    } else if (member.kind == ir.ProcedureKind.Setter) {
      name += "=";
    }
  }
  return '${libraryPrefix}${name}';
}

/// Helper for looking up classes and members from an [ir.Library] node.
class _LibraryData {
  /// The [ir.Library] that defines the library.
  final ir.Library node;

  /// Cache of [_ClassData] for classes in this library.
  Map<String, _ClassData> _classesByName;
  Map<ir.Class, _ClassData> _classesByNode;

  /// Cache of [ir.Typedef] nodes for typedefs in this library.
  Map<String, ir.Typedef> _typedefs;

  /// Cache of [_MemberData] for members in this library.
  Map<String, _MemberData> _membersByName;
  Map<ir.Member, _MemberData> _membersByNode;

  _LibraryData(this.node);

  void _ensureClasses() {
    if (_classesByName == null) {
      _classesByName = {};
      _classesByNode = {};
      for (ir.Class cls in node.classes) {
        assert(
            !_classesByName.containsKey(cls.name),
            "Duplicate class '${cls.name}' in $_classesByName "
            "trying to add $cls.");
        assert(
            !_classesByNode.containsKey(cls),
            "Duplicate class '${cls.name}' in $_classesByNode "
            "trying to add $cls.");
        _classesByNode[cls] = _classesByName[cls.name] = _ClassData(cls);
      }
    }
  }

  /// Returns the [_ClassData] for the class [name] in this library.
  _ClassData lookupClassByName(String name) {
    _ensureClasses();
    return _classesByName[name];
  }

  /// Returns the [_ClassData] for the class [node] in this library.
  _ClassData lookupClassByNode(ir.Class node) {
    _ensureClasses();
    return _classesByNode[node];
  }

  ir.Typedef lookupTypedef(String name) {
    if (_typedefs == null) {
      _typedefs = {};
      for (ir.Typedef typedef in node.typedefs) {
        assert(
            !_typedefs.containsKey(typedef.name),
            "Duplicate typedef '${typedef.name}' in $_typedefs "
            "trying to add $typedef.");
        _typedefs[typedef.name] = typedef;
      }
    }
    return _typedefs[name];
  }

  void _ensureMembers() {
    if (_membersByName == null) {
      _membersByName = {};
      _membersByNode = {};
      for (ir.Member member in node.members) {
        String name = _computeMemberName(member);
        if (name == null) continue;
        assert(
            !_membersByName.containsKey(name),
            "Duplicate member '$name' in $_membersByName "
            "trying to add $member.");
        assert(
            !_membersByNode.containsKey(member),
            "Duplicate member '$name' in $_membersByNode "
            "trying to add $member.");
        _membersByNode[member] = _membersByName[name] = _MemberData(member);
      }
    }
  }

  /// Returns the [_MemberData] for the member uniquely identified by [name] in
  /// this library.
  _MemberData lookupMemberDataByName(String name) {
    _ensureMembers();
    return _membersByName[name];
  }

  /// Returns the [_MemberData] for the member [node] in this library.
  _MemberData lookupMemberDataByNode(ir.Member node) {
    _ensureMembers();
    return _membersByNode[node];
  }

  @override
  String toString() => '_LibraryData($node(${identityHashCode(node)}))';
}

/// Helper for looking up members from an [ir.Class] node.
class _ClassData {
  /// The [ir.Class] that defines the class.
  final ir.Class node;

  /// Cache of [_MemberData] for members in this class.
  Map<String, _MemberData> _membersByName;
  Map<ir.Member, _MemberData> _membersByNode;

  _ClassData(this.node);

  void _ensureMembers() {
    if (_membersByName == null) {
      _membersByName = {};
      _membersByNode = {};
      for (ir.Member member in node.members) {
        String name = _computeMemberName(member);
        if (name == null) continue;
        assert(
            !_membersByName.containsKey(name),
            "Duplicate member '$name' in $_membersByName "
            "trying to add $member.");
        assert(
            !_membersByNode.containsKey(member),
            "Duplicate member '$name' in $_membersByNode "
            "trying to add $member.");
        _membersByNode[member] = _membersByName[name] = _MemberData(member);
      }
    }
  }

  /// Returns the [_MemberData] for the member uniquely identified by [name] in
  /// this class.
  _MemberData lookupMemberDataByName(String name) {
    _ensureMembers();
    return _membersByName[name];
  }

  /// Returns the [_MemberData] for the member [node] in this class.
  _MemberData lookupMemberDataByNode(ir.Member node) {
    _ensureMembers();
    return _membersByNode[node];
  }

  @override
  String toString() => '_ClassData($node(${identityHashCode(node)}))';
}

/// Helper for looking up child [ir.TreeNode]s of a [ir.Member] node.
class _MemberData {
  /// The [ir.Member] that defines the member.
  final ir.Member node;

  /// Cached index to [ir.TreeNode] map used for deserialization of
  /// [ir.TreeNode]s.
  Map<int, ir.TreeNode> _indexToNodeMap;

  /// Cached [ir.TreeNode] to index map used for serialization of
  /// [ir.TreeNode]s.
  Map<ir.TreeNode, int> _nodeToIndexMap;

  /// Cached [ir.ConstantExpression] to [_ConstantNodeIndexerVisitor] map used
  /// for fast serialization/deserialization of constant references.
  Map<ir.ConstantExpression, _ConstantNodeIndexerVisitor> _constantIndexMap;

  _MemberData(this.node);

  void _ensureMaps() {
    if (_indexToNodeMap == null) {
      _indexToNodeMap = {};
      _nodeToIndexMap = {};
      node.accept(_TreeNodeIndexerVisitor(_indexToNodeMap, _nodeToIndexMap));
    }
  }

  _ConstantNodeIndexerVisitor _createConstantIndexer(
      ir.ConstantExpression node) {
    _ConstantNodeIndexerVisitor indexer = _ConstantNodeIndexerVisitor();
    node.constant.accept(indexer);
    return indexer;
  }

  ir.Constant getConstantByIndex(ir.ConstantExpression node, int index) {
    _constantIndexMap ??= {};
    _ConstantNodeIndexerVisitor indexer =
        _constantIndexMap[node] ??= _createConstantIndexer(node);
    return indexer.getConstant(index);
  }

  int getIndexByConstant(ir.ConstantExpression node, ir.Constant constant) {
    _constantIndexMap ??= {};
    _ConstantNodeIndexerVisitor indexer =
        _constantIndexMap[node] ??= _createConstantIndexer(node);
    return indexer.getIndex(constant);
  }

  /// Returns the [ir.TreeNode] corresponding to [index] in this member.
  ir.TreeNode getTreeNodeByIndex(int index) {
    _ensureMaps();
    ir.TreeNode treeNode = _indexToNodeMap[index];
    assert(treeNode != null, "No TreeNode found for index $index in $node.");
    return treeNode;
  }

  /// Returns the index corresponding to [ir.TreeNode] in this member.
  int getIndexByTreeNode(ir.TreeNode node) {
    _ensureMaps();
    int index = _nodeToIndexMap[node];
    assert(index != null, "No index found for ${node.runtimeType}.");
    return index;
  }

  @override
  String toString() => '_MemberData($node(${identityHashCode(node)}))';
}
