/* This file is part of TON Blockchain Library. TON Blockchain Library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. TON Blockchain Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with TON Blockchain Library. If not, see . */ #pragma once #include "src-file.h" #include "fwd-declarations.h" #include "td/utils/Status.h" #include namespace tolk { // when a function is declared `f`, this "" is represented as this class // (not at AST, but at symbol storage level) struct GenericsDeclaration { struct GenericsItem { std::string_view nameT; explicit GenericsItem(std::string_view nameT) : nameT(nameT) {} }; explicit GenericsDeclaration(std::vector&& itemsT) : itemsT(std::move(itemsT)) {} const std::vector itemsT; std::string as_human_readable() const; size_t size() const { return itemsT.size(); } bool has_nameT(std::string_view nameT) const { return find_nameT(nameT) != -1; } int find_nameT(std::string_view nameT) const; std::string get_nameT(int idx) const { return static_cast(itemsT[idx].nameT); } }; // when a function call is `f()`, this "" is represented as this class struct GenericsInstantiation { const std::vector substitutions; // for genericTs const SrcLocation loc; // first instantiation location explicit GenericsInstantiation(SrcLocation loc, std::vector&& substitutions) : substitutions(std::move(substitutions)) , loc(loc) { } }; std::string generate_instantiated_name(const std::string& orig_name, const std::vector& substitutions); td::Result> deduce_substitutionTs_on_generic_func_call(const FunctionData* called_fun, std::vector&& arg_types, TypePtr return_hint); const FunctionData* instantiate_generic_function(SrcLocation loc, const FunctionData* fun_ref, const std::string& inst_name, std::vector&& substitutionTs); } // namespace tolk