|
36 | 36 |
|
37 | 37 | #include <json/json.h> |
38 | 38 |
|
| 39 | +#include <range/v3/span.hpp> |
| 40 | +#include <range/v3/view/transform.hpp> |
| 41 | + |
39 | 42 | #include <memory> |
40 | 43 | #include <optional> |
41 | 44 | #include <string> |
@@ -496,7 +499,13 @@ class ContractDefinition: public Declaration, public StructurallyDocumented, pub |
496 | 499 | std::vector<EnumDefinition const*> definedEnums() const { return filteredNodes<EnumDefinition>(m_subNodes); } |
497 | 500 | std::vector<VariableDeclaration const*> stateVariables() const { return filteredNodes<VariableDeclaration>(m_subNodes); } |
498 | 501 | std::vector<ModifierDefinition const*> functionModifiers() const { return filteredNodes<ModifierDefinition>(m_subNodes); } |
499 | | - std::vector<FunctionDefinition const*> definedFunctions() const { return filteredNodes<FunctionDefinition>(m_subNodes); } |
| 502 | + auto definedFunctions() const { |
| 503 | + return definedFunctionsByName() | ranges::views::transform([](auto const& _item) { return _item.second; }); |
| 504 | + } |
| 505 | + auto definedFunctions(std::string const& _name) const { |
| 506 | + auto&& [b, e] = definedFunctionsByName().equal_range(_name); |
| 507 | + return ranges::span<decltype(*b)>(b, e) | ranges::views::transform([](auto const& _item) { return _item.second; }); |
| 508 | + } |
500 | 509 | std::vector<EventDefinition const*> events() const { return filteredNodes<EventDefinition>(m_subNodes); } |
501 | 510 | std::vector<EventDefinition const*> const& interfaceEvents() const; |
502 | 511 | /// @returns all errors defined in this contract or any base contract |
@@ -546,13 +555,16 @@ class ContractDefinition: public Declaration, public StructurallyDocumented, pub |
546 | 555 | FunctionDefinition const* nextConstructor(ContractDefinition const& _mostDerivedContract) const; |
547 | 556 |
|
548 | 557 | private: |
| 558 | + std::multimap<std::string, FunctionDefinition const*> const& definedFunctionsByName() const; |
| 559 | + |
549 | 560 | std::vector<ASTPointer<InheritanceSpecifier>> m_baseContracts; |
550 | 561 | std::vector<ASTPointer<ASTNode>> m_subNodes; |
551 | 562 | ContractKind m_contractKind; |
552 | 563 | bool m_abstract{false}; |
553 | 564 |
|
554 | 565 | util::LazyInit<std::vector<std::pair<util::FixedHash<4>, FunctionTypePointer>>> m_interfaceFunctionList[2]; |
555 | 566 | util::LazyInit<std::vector<EventDefinition const*>> m_interfaceEvents; |
| 567 | + util::LazyInit<std::multimap<std::string, FunctionDefinition const*>> m_definedFunctionsByName; |
556 | 568 | }; |
557 | 569 |
|
558 | 570 | /** |
|
0 commit comments