// 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_CST_PARAMETERS_H_
#define VERIBLE_VERILOG_CST_PARAMETERS_H_

// See comment at the top
// verilog/CST/verilog_treebuilder_utils.h that explains use
// of std::forward in Make* helper functions.

#include <utility>
#include <vector>

#include "absl/strings/string_view.h"
#include "common/analysis/syntax_tree_search.h"
#include "common/text/concrete_syntax_leaf.h"
#include "common/text/concrete_syntax_tree.h"
#include "common/text/symbol.h"
#include "common/text/token_info.h"
#include "common/text/tree_utils.h"
#include "common/util/logging.h"
#include "verilog/CST/verilog_nonterminals.h"
#include "verilog/parser/verilog_token_enum.h"

namespace verilog {

// Creates a node tagged kParamType.
// From "parameter type [dim] id [dim] = value;",
// this node spans "type [dim] id [dim]."
template <typename T0, typename T1, typename T2, typename T3>
verible::SymbolPtr MakeParamTypeDeclaration(T0&& type_info,
                                            T1&& packed_dimensions,
                                            T2&& identifier,
                                            T3&& unpacked_dimensions) {
  CHECK(verible::SymbolCastToNode(*ABSL_DIE_IF_NULL(type_info))
            .MatchesTag(NodeEnum::kTypeInfo));
  return verible::MakeTaggedNode(
      NodeEnum::kParamType, std::forward<T0>(type_info),
      std::forward<T1>(packed_dimensions), std::forward<T2>(identifier),
      std::forward<T3>(unpacked_dimensions));
}

// Creates a node tagged kTypeInfo, which holds the parameter type information.
template <typename T0, typename T1, typename T2>
verible::SymbolPtr MakeTypeInfoNode(T0&& primitive_type, T1&& signed_unsigned,
                                    T2&& user_defined_type) {
  return verible::MakeTaggedNode(
      NodeEnum::kTypeInfo, std::forward<T0>(primitive_type),
      std::forward<T1>(signed_unsigned), std::forward<T2>(user_defined_type));
}

// Finds all parameter/localparam declarations.
std::vector<verible::TreeSearchMatch> FindAllParamDeclarations(
    const verible::Symbol&);

// Finds all nodes tagged with kParamByName.
std::vector<verible::TreeSearchMatch> FindAllNamedParams(
    const verible::Symbol&);

// Returns the token_enum of the parameter keyword from the node
// kParamDeclaration (either TK_parameter or TK_localparam).
verilog_tokentype GetParamKeyword(const verible::Symbol&);

// Returns a pointer to either TK_type or kParamType node, which holds the param
// type, id, and dimensions info for that parameter.
const verible::Symbol* GetParamTypeSymbol(const verible::Symbol&);

// Returns a pointer to the symbol holding the node kTypeInfo under the node
// kParamDeclaration.
const verible::Symbol* GetParamTypeInfoSymbol(const verible::Symbol&);

// Get right-hand side of a parameter assignment expression.
const verible::Symbol* GetParamAssignExpression(const verible::Symbol& symbol);

// Returns the token of the declared parameter.
const verible::TokenInfo* GetParameterNameToken(const verible::Symbol&);

// Returns all tokens for a parameter declaration.
std::vector<const verible::TokenInfo*> GetAllParameterNameTokens(
    const verible::Symbol&);

// Get the token info for a given kParameterAssign node symbol
const verible::TokenInfo* GetAssignedParameterNameToken(
    const verible::Symbol& symbol);

// Get the symbols for all kParameterAssign nodes
std::vector<const verible::Symbol*> GetAllAssignedParameterSymbols(
    const verible::Symbol& root);

// Returns the token of the SymbolIdentifier from the node kParamDeclaration.
// Used specifically for 'parameter type' declarations.
const verible::TokenInfo* GetSymbolIdentifierFromParamDeclaration(
    const verible::Symbol&);

// Returns true if the parameter is a parameter type declaration from the node
// kParamDeclaration.
bool IsParamTypeDeclaration(const verible::Symbol&);

// Returns a pointer to the symbol holding the node kTypeAssignment under the
// node kParamDeclaration.
const verible::SyntaxTreeNode* GetTypeAssignmentFromParamDeclaration(
    const verible::Symbol&);

// Returns a pointer to the identifier leaf holding the SymbolIdentifier under
// the node kTypeAssignment.
const verible::SyntaxTreeLeaf* GetIdentifierLeafFromTypeAssignment(
    const verible::Symbol&);

// Returns a pointer to the expression node holding under the node
// kTypeAssignment.
// e.g from "class m(type x = y)" returns the node spanning "y".
const verible::SyntaxTreeNode* GetExpressionFromTypeAssignment(
    const verible::Symbol&);

// Returns true if the node kTypeInfo is empty (all children are nullptr).
bool IsTypeInfoEmpty(const verible::Symbol&);

// Return the node spanning param name from a node tagged with kParamByName.
// e.g from "module_type #(.N(x))" return the leaf spanning "N".
const verible::SyntaxTreeLeaf* GetNamedParamFromActualParam(
    const verible::Symbol&);

// Return the node spanning the paren group from a node tagged with
// kParamByName.
// e.g from "module_type #(.N(x))" return the leaf spanning "(x)".
const verible::SyntaxTreeNode* GetParenGroupFromActualParam(
    const verible::Symbol&);

}  // namespace verilog

#endif  // VERIBLE_VERILOG_CST_PARAMETERS_H_
