/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. solidity 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 General Public License for more details. You should have received a copy of the GNU General Public License along with solidity. If not, see . */ // SPDX-License-Identifier: GPL-3.0 #pragma once #include #include #include #include #include #include #include namespace solidity::frontend::experimental { struct TermBase { langutil::SourceLocation location; std::optional legacyId; Type type; }; struct Application; struct Lambda; struct InlineAssembly; struct Reference: TermBase { size_t index = std::numeric_limits::max(); std::string name; }; enum class BuiltinConstant { // TODO: sort Unit, Pair, Fun, Constrain, NamedTerm, TypeDeclaration, TypeDefinition, TypeClassDefinition, TypeClassInstantiation, FunctionDeclaration, FunctionDefinition, ContractDefinition, VariableDeclaration, VariableDefinition, Block, ReturnStatement, RegularStatement, ChainStatements, Assign, MemberAccess, Mul, Add, Void, Word, Integer, Bool, Undefined, Equal }; struct Constant: TermBase { std::variant name; }; using Term = std::variant; struct InlineAssembly: TermBase { yul::Block const& block; std::map> references; }; struct Application: TermBase { std::unique_ptr expression; std::unique_ptr argument; }; struct Lambda: TermBase { std::unique_ptr argument; std::unique_ptr value; }; template struct LocationGetter { langutil::SourceLocation operator()(T const&) const { return {}; } }; template struct LocationGetter>> { langutil::SourceLocation operator()(T const& _t) const { return _t.location; } }; template<> struct LocationGetter { langutil::SourceLocation operator()(Term const& _term) const { return std::visit([](auto const& _expression) -> langutil::SourceLocation { return LocationGetter>>{}(_expression); }, _term); } }; inline TermBase& termBase(Term& _term) { return std::visit([](auto& _term) -> TermBase& { return static_cast(_term); }, _term); } inline TermBase const& termBase(Term const& _term) { return std::visit([](auto const& _term) -> TermBase const& { return static_cast(_term); }, _term); } template langutil::SourceLocation locationOf(T const& _t) { return LocationGetter{}(_t); } struct AST { std::map, ASTCompareByID> typeDefinitions; std::map, ASTCompareByID> typeClasses; std::map, ASTCompareByID> typeClassInstantiations; std::map, ASTCompareByID> functions; std::map, ASTCompareByID> contracts; std::vector nodeById; }; }