// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef VERIBLE_VERILOG_ANALYSIS_DEPENDENCIES_H_
#define VERIBLE_VERILOG_ANALYSIS_DEPENDENCIES_H_

#include <functional>
#include <iosfwd>
#include <map>
#include <set>

#include "absl/strings/string_view.h"
#include "common/strings/compare.h"
#include "verilog/analysis/symbol_table.h"

namespace verilog {

// Graph of inter-file dependencies based on what root-level symbols are defined
// and referenced.
// All data members are initialized only and const and publicly accessible.
// All VerilogSourceFile pointers herein are non-nullptr.
// Internal associative structures are ordered, for determinism and linear-time
// merge/set operations.
struct FileDependencies {
  // === Types

  // A node is represented as a source file.
  // Edges are just a pair of nodes.
  using node_type = const VerilogSourceFile *;

  // A set of strings, whose memory is owned outside of this data structure.
  using SymbolNameSet = std::set<absl::string_view, verible::StringViewCompare>;

  // Sort by referenced file name.
  using FileCompare = VerilogSourceFile::Less;

  // The outer key is a referencing file [R].
  // The inner key is a defining file [D].
  // The inner value is a collection of symbols that the referencing file
  //   expects from the defining file [{S}].
  // Combined, this represents files R that depend on files D for defining
  // symbols {S}.
  using file_deps_graph_type =
      std::map<node_type, std::map<node_type, SymbolNameSet, FileCompare>,
               FileCompare>;

  struct SymbolData {
    // Which file defines this symbol (first)?
    const VerilogSourceFile *definer = nullptr;

    // Which files might reference this symbol?
    // Elements are never nullptr.
    std::set<const VerilogSourceFile *, FileCompare> referencers;
  };

  // Map of symbol name to definition and references (files).
  // string_view keys must be backed by memory that outlives this class's
  // objects.  Typically, this is owned by VerilogSourceFile inside
  // VerilogProject.
  using symbol_index_type =
      std::map<absl::string_view, SymbolData, verible::StringViewCompare>;

  // === Fields (in order of initialization and computation)
  // All fields are const-initialized and public.

  // Tracks where symbols are defined and referenced
  const symbol_index_type root_symbols_index;

  // Adjacency-list representation of dependency graph.
  const file_deps_graph_type file_deps;

  // === Methods

  // Extract dependency information from a symbol table.
  // The symbol table only needs to be built (.Build()), and need not be
  // Resolve()d.
  // Once initialized, all data members are const.
  explicit FileDependencies(const SymbolTable &symbol_table);

  bool Empty() const;

  // Visit every edge with a function.
  // This can print or export data.
  void TraverseDependencyEdges(
      const std::function<void(const node_type &, const node_type &,
                               const SymbolNameSet &)> &edge_func) const;

  std::ostream &PrintGraph(std::ostream &) const;

  // TODO: print unresolved references (no definition found)
};

std::ostream &operator<<(std::ostream &, const FileDependencies &);

}  // namespace verilog

#endif  // VERIBLE_VERILOG_ANALYSIS_DEPENDENCIES_H_
