diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 74d40da43..bc6be6008 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -83,7 +83,6 @@ map, FunctionTypePointer> ContractDefinition::getInterfaceFunctions map, FunctionTypePointer> exportedFunctions; for (auto const& it: exportedFunctionList) - // exportedFunctions.insert(make_pair(std::get<0>(it), FunctionDescription(std::get<1>(it), std::get<2>(it)))); exportedFunctions.insert(it); solAssert(exportedFunctionList.size() == exportedFunctions.size(), @@ -139,12 +138,12 @@ void ContractDefinition::checkIllegalOverrides() const } } -vector, shared_ptr>> const& ContractDefinition::getInterfaceFunctionList() const +vector, FunctionTypePointer>> const& ContractDefinition::getInterfaceFunctionList() const { if (!m_interfaceFunctionList) { set functionsSeen; - m_interfaceFunctionList.reset(new vector, shared_ptr>>()); + m_interfaceFunctionList.reset(new vector, FunctionTypePointer>>()); for (ContractDefinition const* contract: getLinearizedBaseContracts()) { for (ASTPointer const& f: contract->getDefinedFunctions()) diff --git a/libsolidity/AST.h b/libsolidity/AST.h index 9ea6c144b..6c207290c 100755 --- a/libsolidity/AST.h +++ b/libsolidity/AST.h @@ -156,6 +156,37 @@ private: Declaration const* m_scope; }; +/** + * Abstract class that is added to each AST node that can store local variables. + */ +class VariableScope +{ +public: + void addLocalVariable(VariableDeclaration const& _localVariable) { m_localVariables.push_back(&_localVariable); } + std::vector const& getLocalVariables() const { return m_localVariables; } + +private: + std::vector m_localVariables; +}; + +/** + * Abstract class that is added to each AST node that can receive documentation. + */ +class Documented +{ +public: + explicit Documented(ASTPointer const& _documentation): m_documentation(_documentation) {} + + /// @return A shared pointer of an ASTString. + /// Can contain a nullptr in which case indicates absence of documentation + ASTPointer const& getDocumentation() const { return m_documentation; } + +protected: + ASTPointer m_documentation; +}; + +/// @} + /** * Definition of a contract. This is the only AST nodes where child nodes are not visited in * document order. It first visits all struct declarations, then all variable declarations and diff --git a/libsolidity/Compiler.cpp b/libsolidity/Compiler.cpp index 33a71bca0..79672ca10 100644 --- a/libsolidity/Compiler.cpp +++ b/libsolidity/Compiler.cpp @@ -160,7 +160,7 @@ void Compiler::appendFunctionSelector(ContractDefinition const& _contract) for (auto const& it: interfaceFunctions) { - FunctionTypePointer functionType = it.second; + FunctionTypePointer const& functionType = it.second; m_context << callDataUnpackerEntryPoints.at(it.first); eth::AssemblyItem returnTag = m_context.pushNewTag(); appendCalldataUnpacker(functionType->getParameterTypes()); diff --git a/libsolidity/InterfaceHandler.cpp b/libsolidity/InterfaceHandler.cpp index dd569946a..4d3ec4d50 100644 --- a/libsolidity/InterfaceHandler.cpp +++ b/libsolidity/InterfaceHandler.cpp @@ -60,6 +60,7 @@ std::unique_ptr InterfaceHandler::getABIInterface(ContractDefinitio return params; }; + solAssert(it.second->getDeclaration(), "All function interface types should contain a declaration"); method["name"] = it.second->getDeclaration()->getName(); method["constant"] = it.second->isConstant(); method["inputs"] = populateParameters(it.second->getParameterNames(), diff --git a/libsolidity/Types.cpp b/libsolidity/Types.cpp index e7765e1b7..38caaf8ff 100644 --- a/libsolidity/Types.cpp +++ b/libsolidity/Types.cpp @@ -591,7 +591,7 @@ u256 StructType::getStorageOffsetOfMember(string const& _name) const FunctionType::FunctionType(FunctionDefinition const& _function, bool _isInternal): m_location(_isInternal ? Location::INTERNAL : Location::EXTERNAL), m_isConstant(_function.isDeclaredConst()), - m_declaration(&_function) + m_declaration(&_function) { TypePointers params; vector paramNames; @@ -641,6 +641,9 @@ bool FunctionType::operator==(Type const& _other) const if (m_location != other.m_location) return false; + if (m_isConstant != other.isConstant()) + return false; + if (m_parameterTypes.size() != other.m_parameterTypes.size() || m_returnParameterTypes.size() != other.m_returnParameterTypes.size()) return false; @@ -763,7 +766,7 @@ vector const FunctionType::getReturnParameterTypeNames() const ASTPointer FunctionType::getDocumentation() const { - auto function = dynamic_cast(m_declaration); + auto function = dynamic_cast(m_declaration); if (function) return function->getDocumentation();