blob: 3932428874afd9743f6f9aaebe03e72a0dd5e967 [file] [log] [blame]
// 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_FUNCTIONS_H_
#define VERIBLE_VERILOG_CST_FUNCTIONS_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 "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/tree_utils.h"
#include "verilog/CST/verilog_nonterminals.h"
#include "verilog/CST/verilog_treebuilder_utils.h"
namespace verilog {
// Construct a function header CST node, without the trailing ';'.
template <typename T0, typename T1, typename T2, typename T3, typename T4>
verible::SymbolPtr MakeFunctionHeader(T0 &&qualifiers, T1 &&function_start,
T2 &&lifetime, T3 &&return_type_id,
T4 &&ports) {
verible::CheckOptionalSymbolAsNode(qualifiers, NodeEnum::kQualifierList);
ExpectString(function_start, "function");
verible::CheckOptionalSymbolAsNode(ports, NodeEnum::kParenGroup);
return verible::MakeTaggedNode(
NodeEnum::kFunctionHeader, std::forward<T0>(qualifiers),
std::forward<T1>(function_start), std::forward<T2>(lifetime),
std::forward<T3>(
return_type_id) /* flattens to separate type and id nodes */,
std::forward<T4>(ports));
}
// Construct a function header CST node, with the trailing ';'.
template <typename T0, typename T1, typename T2, typename T3, typename T4,
typename T5>
verible::SymbolPtr MakeFunctionHeader(T0 &&qualifiers, T1 &&function_start,
T2 &&lifetime, T3 &&return_type_id,
T4 &&ports, T5 &&semicolon) {
ExpectString(semicolon, ";");
return ExtendNode(
MakeFunctionHeader(
std::forward<T0>(qualifiers), std::forward<T1>(function_start),
std::forward<T2>(lifetime),
std::forward<T3>(
return_type_id) /* flattens to separate type and id nodes */,
std::forward<T4>(ports)),
std::forward<T5>(semicolon));
}
template <typename T0, typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8, typename T9>
verible::SymbolPtr MakeFunctionDeclaration(T0 &&qualifiers, T1 &&function_start,
T2 &&lifetime, T3 &&return_type_id,
T4 &&ports, T5 &&semicolon,
T6 &&function_items, T7 &&body,
T8 &&function_end, T9 &&label) {
ExpectString(function_end, "endfunction");
return verible::MakeTaggedNode(
NodeEnum::kFunctionDeclaration,
MakeFunctionHeader(
std::forward<T0>(qualifiers), std::forward<T1>(function_start),
std::forward<T2>(lifetime),
std::forward<T3>(
return_type_id) /* flattens to separate type and id nodes */,
std::forward<T4>(ports), std::forward<T5>(semicolon)),
std::forward<T6>(function_items), std::forward<T7>(body),
std::forward<T8>(function_end), std::forward<T9>(label));
}
// Find all function declarations, including class method declarations.
std::vector<verible::TreeSearchMatch> FindAllFunctionDeclarations(
const verible::Symbol &);
// Find all function headers (in declarations and prototypes).
std::vector<verible::TreeSearchMatch> FindAllFunctionHeaders(
const verible::Symbol &);
// Find all function prototypes (extern, pure virtual).
std::vector<verible::TreeSearchMatch> FindAllFunctionPrototypes(
const verible::Symbol &);
// Find all function (or Task) calls.
std::vector<verible::TreeSearchMatch> FindAllFunctionOrTaskCalls(
const verible::Symbol &);
// Find all function (or Task) calls extension e.g class_name.function_call().
std::vector<verible::TreeSearchMatch> FindAllFunctionOrTaskCallsExtension(
const verible::Symbol &);
// Find all constructor prototypes.
std::vector<verible::TreeSearchMatch> FindAllConstructorPrototypes(
const verible::Symbol &);
// Returns the function declaration header (return type, id, ports)
const verible::SyntaxTreeNode *GetFunctionHeader(
const verible::Symbol &function_decl);
// Returns the function prototype header (return type, id, ports)
const verible::SyntaxTreeNode *GetFunctionPrototypeHeader(
const verible::Symbol &function_decl);
// FunctionHeader accessors
// Returns the function lifetime of the function header.
const verible::Symbol *GetFunctionHeaderLifetime(
const verible::Symbol &function_header);
// Returns the parenthesis group containing the formal ports list, or nullptr.
const verible::Symbol *GetFunctionHeaderFormalPortsGroup(
const verible::Symbol &function_header);
// Returns the return type of the function header.
const verible::Symbol *GetFunctionHeaderReturnType(
const verible::Symbol &function_header);
// Returns the id of the function header.
const verible::Symbol *GetFunctionHeaderId(
const verible::Symbol &function_header);
// FunctionDeclaration acccessors
// Returns the function lifetime of the node.
const verible::Symbol *GetFunctionLifetime(
const verible::Symbol &function_decl);
// Returns the parenthesis group containing the formal ports list, or nullptr.
const verible::Symbol *GetFunctionFormalPortsGroup(
const verible::Symbol &function_decl);
// Returns the return type of the function declaration.
const verible::Symbol *GetFunctionReturnType(
const verible::Symbol &function_decl);
// Returns the id of the function declaration.
const verible::Symbol *GetFunctionId(const verible::Symbol &function_decl);
// Returns leaf node for function name.
// e.g. function my_fun(); return leaf node for "my_fun".
const verible::SyntaxTreeLeaf *GetFunctionName(const verible::Symbol &);
// Returns local root node from node tagged with kFunctionCall.
const verible::SyntaxTreeNode *GetLocalRootFromFunctionCall(
const verible::Symbol &);
// Return the node spanning identifier for the function call node.
// e.g from "pkg::get()" returns the node spanning "pkg::get".
const verible::SyntaxTreeNode *GetIdentifiersFromFunctionCall(
const verible::Symbol &function_call);
// Returns leaf node for function name in function call.
// e.g my_function(); return leaf node for "my_function".
const verible::SyntaxTreeLeaf *GetFunctionCallName(const verible::Symbol &);
// Returns leaf node for function name in function call extension.
// e.g class_name.my_function(); return leaf node for "my_function".
const verible::SyntaxTreeLeaf *GetFunctionCallNameFromCallExtension(
const verible::Symbol &);
// Returns the function declaration body.
const verible::SyntaxTreeNode *GetFunctionBlockStatementList(
const verible::Symbol &);
// Return the node spanning the paren group of function call.
// e.g my_function(a, b, c) return the node spanning (a, b, c).
const verible::SyntaxTreeNode *GetParenGroupFromCall(const verible::Symbol &);
// Return the node spanning the paren group of function call extension.
// e.g my_class.my_function(a, b, c) return the node spanning (a, b, c).
const verible::SyntaxTreeNode *GetParenGroupFromCallExtension(
const verible::Symbol &);
// Returns leaf node for the "new" keyword of a constructor prototype.
const verible::SyntaxTreeLeaf *GetConstructorPrototypeNewKeyword(
const verible::Symbol &);
} // namespace verilog
#endif // VERIBLE_VERILOG_CST_FUNCTIONS_H_