mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Refactor json return type generation.
This commit is contained in:
		
							parent
							
								
									ff8008cdf7
								
							
						
					
					
						commit
						a9c6ff4ac8
					
				| @ -2512,24 +2512,6 @@ FunctionTypePointer FunctionType::asMemberFunction(bool _inLibrary, bool _bound) | |||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| vector<string> const FunctionType::parameterTypeNames(bool _addDataLocation) const |  | ||||||
| { |  | ||||||
| 	vector<string> names; |  | ||||||
| 	for (TypePointer const& t: parameterTypes()) |  | ||||||
| 		names.push_back(t->canonicalName(_addDataLocation)); |  | ||||||
| 
 |  | ||||||
| 	return names; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| vector<string> const FunctionType::returnParameterTypeNames(bool _addDataLocation) const |  | ||||||
| { |  | ||||||
| 	vector<string> names; |  | ||||||
| 	for (TypePointer const& t: m_returnParameterTypes) |  | ||||||
| 		names.push_back(t->canonicalName(_addDataLocation)); |  | ||||||
| 
 |  | ||||||
| 	return names; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| TypePointer const& FunctionType::selfType() const | TypePointer const& FunctionType::selfType() const | ||||||
| { | { | ||||||
| 	solAssert(bound(), "Function is not bound."); | 	solAssert(bound(), "Function is not bound."); | ||||||
|  | |||||||
| @ -915,10 +915,8 @@ public: | |||||||
| 
 | 
 | ||||||
| 	TypePointers parameterTypes() const; | 	TypePointers parameterTypes() const; | ||||||
| 	std::vector<std::string> parameterNames() const; | 	std::vector<std::string> parameterNames() const; | ||||||
| 	std::vector<std::string> const parameterTypeNames(bool _addDataLocation) const; |  | ||||||
| 	TypePointers const& returnParameterTypes() const { return m_returnParameterTypes; } | 	TypePointers const& returnParameterTypes() const { return m_returnParameterTypes; } | ||||||
| 	std::vector<std::string> const& returnParameterNames() const { return m_returnParameterNames; } | 	std::vector<std::string> const& returnParameterNames() const { return m_returnParameterNames; } | ||||||
| 	std::vector<std::string> const returnParameterTypeNames(bool _addDataLocation) const; |  | ||||||
| 	/// @returns the "self" parameter type for a bound function
 | 	/// @returns the "self" parameter type for a bound function
 | ||||||
| 	TypePointer const& selfType() const; | 	TypePointer const& selfType() const; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -30,20 +30,6 @@ Json::Value InterfaceHandler::abiInterface(ContractDefinition const& _contractDe | |||||||
| { | { | ||||||
| 	Json::Value abi(Json::arrayValue); | 	Json::Value abi(Json::arrayValue); | ||||||
| 
 | 
 | ||||||
| 	auto populateParameters = [](vector<string> const& _paramNames, vector<string> const& _paramTypes) |  | ||||||
| 	{ |  | ||||||
| 		Json::Value params(Json::arrayValue); |  | ||||||
| 		solAssert(_paramNames.size() == _paramTypes.size(), "Names and types vector size does not match"); |  | ||||||
| 		for (unsigned i = 0; i < _paramNames.size(); ++i) |  | ||||||
| 		{ |  | ||||||
| 			Json::Value param; |  | ||||||
| 			param["name"] = _paramNames[i]; |  | ||||||
| 			param["type"] = _paramTypes[i]; |  | ||||||
| 			params.append(param); |  | ||||||
| 		} |  | ||||||
| 		return params; |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	for (auto it: _contractDef.interfaceFunctions()) | 	for (auto it: _contractDef.interfaceFunctions()) | ||||||
| 	{ | 	{ | ||||||
| 		auto externalFunctionType = it.second->interfaceFunctionType(); | 		auto externalFunctionType = it.second->interfaceFunctionType(); | ||||||
| @ -52,13 +38,15 @@ Json::Value InterfaceHandler::abiInterface(ContractDefinition const& _contractDe | |||||||
| 		method["name"] = it.second->declaration().name(); | 		method["name"] = it.second->declaration().name(); | ||||||
| 		method["constant"] = it.second->isConstant(); | 		method["constant"] = it.second->isConstant(); | ||||||
| 		method["payable"] = it.second->isPayable(); | 		method["payable"] = it.second->isPayable(); | ||||||
| 		method["inputs"] = populateParameters( | 		method["inputs"] = formatTypeList( | ||||||
| 			externalFunctionType->parameterNames(), | 			externalFunctionType->parameterNames(), | ||||||
| 			externalFunctionType->parameterTypeNames(_contractDef.isLibrary()) | 			externalFunctionType->parameterTypes(), | ||||||
|  | 			_contractDef.isLibrary() | ||||||
| 		); | 		); | ||||||
| 		method["outputs"] = populateParameters( | 		method["outputs"] = formatTypeList( | ||||||
| 			externalFunctionType->returnParameterNames(), | 			externalFunctionType->returnParameterNames(), | ||||||
| 			externalFunctionType->returnParameterTypeNames(_contractDef.isLibrary()) | 			externalFunctionType->returnParameterTypes(), | ||||||
|  | 			_contractDef.isLibrary() | ||||||
| 		); | 		); | ||||||
| 		abi.append(method); | 		abi.append(method); | ||||||
| 	} | 	} | ||||||
| @ -69,9 +57,10 @@ Json::Value InterfaceHandler::abiInterface(ContractDefinition const& _contractDe | |||||||
| 		auto externalFunction = FunctionType(*_contractDef.constructor(), false).interfaceFunctionType(); | 		auto externalFunction = FunctionType(*_contractDef.constructor(), false).interfaceFunctionType(); | ||||||
| 		solAssert(!!externalFunction, ""); | 		solAssert(!!externalFunction, ""); | ||||||
| 		method["payable"] = externalFunction->isPayable(); | 		method["payable"] = externalFunction->isPayable(); | ||||||
| 		method["inputs"] = populateParameters( | 		method["inputs"] = formatTypeList( | ||||||
| 			externalFunction->parameterNames(), | 			externalFunction->parameterNames(), | ||||||
| 			externalFunction->parameterTypeNames(_contractDef.isLibrary()) | 			externalFunction->parameterTypes(), | ||||||
|  | 			_contractDef.isLibrary() | ||||||
| 		); | 		); | ||||||
| 		abi.append(method); | 		abi.append(method); | ||||||
| 	} | 	} | ||||||
| @ -179,6 +168,25 @@ Json::Value InterfaceHandler::devDocumentation(ContractDefinition const& _contra | |||||||
| 	return doc; | 	return doc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Json::Value InterfaceHandler::formatTypeList( | ||||||
|  | 	vector<string> const& _names, | ||||||
|  | 	vector<TypePointer> const& _types, | ||||||
|  | 	bool _forLibrary | ||||||
|  | ) | ||||||
|  | { | ||||||
|  | 	Json::Value params(Json::arrayValue); | ||||||
|  | 	solAssert(_names.size() == _types.size(), "Names and types vector size does not match"); | ||||||
|  | 	for (unsigned i = 0; i < _names.size(); ++i) | ||||||
|  | 	{ | ||||||
|  | 		solAssert(_types[i], ""); | ||||||
|  | 		Json::Value param; | ||||||
|  | 		param["name"] = _names[i]; | ||||||
|  | 		param["type"] = _types[i]->canonicalName(_forLibrary); | ||||||
|  | 		params.append(param); | ||||||
|  | 	} | ||||||
|  | 	return params; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| string InterfaceHandler::extractDoc(multimap<string, DocTag> const& _tags, string const& _name) | string InterfaceHandler::extractDoc(multimap<string, DocTag> const& _tags, string const& _name) | ||||||
| { | { | ||||||
| 	string value; | 	string value; | ||||||
|  | |||||||
| @ -37,6 +37,8 @@ namespace solidity | |||||||
| 
 | 
 | ||||||
| // Forward declarations
 | // Forward declarations
 | ||||||
| class ContractDefinition; | class ContractDefinition; | ||||||
|  | class Type; | ||||||
|  | using TypePointer = std::shared_ptr<Type const>; | ||||||
| struct DocTag; | struct DocTag; | ||||||
| enum class DocumentationType: uint8_t; | enum class DocumentationType: uint8_t; | ||||||
| 
 | 
 | ||||||
| @ -84,6 +86,14 @@ public: | |||||||
| 	static Json::Value devDocumentation(ContractDefinition const& _contractDef); | 	static Json::Value devDocumentation(ContractDefinition const& _contractDef); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  | 	/// @returns a json value suitable for a list of types in function input or output
 | ||||||
|  | 	/// parameters or other places. If @a _forLibrary is true, complex types are referenced
 | ||||||
|  | 	/// by name, otherwise they are anonymously expanded.
 | ||||||
|  | 	static Json::Value formatTypeList( | ||||||
|  | 		std::vector<std::string> const& _names, | ||||||
|  | 		std::vector<TypePointer> const& _types, | ||||||
|  | 		bool _forLibrary | ||||||
|  | 	); | ||||||
| 	/// @returns concatenation of all content under the given tag name.
 | 	/// @returns concatenation of all content under the given tag name.
 | ||||||
| 	static std::string extractDoc(std::multimap<std::string, DocTag> const& _tags, std::string const& _name); | 	static std::string extractDoc(std::multimap<std::string, DocTag> const& _tags, std::string const& _name); | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -1102,25 +1102,25 @@ BOOST_AUTO_TEST_CASE(state_variable_accessors) | |||||||
| 	BOOST_REQUIRE((contract = retrieveContract(source, 0)) != nullptr); | 	BOOST_REQUIRE((contract = retrieveContract(source, 0)) != nullptr); | ||||||
| 	FunctionTypePointer function = retrieveFunctionBySignature(*contract, "foo()"); | 	FunctionTypePointer function = retrieveFunctionBySignature(*contract, "foo()"); | ||||||
| 	BOOST_REQUIRE(function && function->hasDeclaration()); | 	BOOST_REQUIRE(function && function->hasDeclaration()); | ||||||
| 	auto returnParams = function->returnParameterTypeNames(false); | 	auto returnParams = function->returnParameterTypes(); | ||||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0), "uint256"); | 	BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "uint256"); | ||||||
| 	BOOST_CHECK(function->isConstant()); | 	BOOST_CHECK(function->isConstant()); | ||||||
| 
 | 
 | ||||||
| 	function = retrieveFunctionBySignature(*contract, "map(uint256)"); | 	function = retrieveFunctionBySignature(*contract, "map(uint256)"); | ||||||
| 	BOOST_REQUIRE(function && function->hasDeclaration()); | 	BOOST_REQUIRE(function && function->hasDeclaration()); | ||||||
| 	auto params = function->parameterTypeNames(false); | 	auto params = function->parameterTypes(); | ||||||
| 	BOOST_CHECK_EQUAL(params.at(0), "uint256"); | 	BOOST_CHECK_EQUAL(params.at(0)->canonicalName(false), "uint256"); | ||||||
| 	returnParams = function->returnParameterTypeNames(false); | 	returnParams = function->returnParameterTypes(); | ||||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0), "bytes4"); | 	BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "bytes4"); | ||||||
| 	BOOST_CHECK(function->isConstant()); | 	BOOST_CHECK(function->isConstant()); | ||||||
| 
 | 
 | ||||||
| 	function = retrieveFunctionBySignature(*contract, "multiple_map(uint256,uint256)"); | 	function = retrieveFunctionBySignature(*contract, "multiple_map(uint256,uint256)"); | ||||||
| 	BOOST_REQUIRE(function && function->hasDeclaration()); | 	BOOST_REQUIRE(function && function->hasDeclaration()); | ||||||
| 	params = function->parameterTypeNames(false); | 	params = function->parameterTypes(); | ||||||
| 	BOOST_CHECK_EQUAL(params.at(0), "uint256"); | 	BOOST_CHECK_EQUAL(params.at(0)->canonicalName(false), "uint256"); | ||||||
| 	BOOST_CHECK_EQUAL(params.at(1), "uint256"); | 	BOOST_CHECK_EQUAL(params.at(1)->canonicalName(false), "uint256"); | ||||||
| 	returnParams = function->returnParameterTypeNames(false); | 	returnParams = function->returnParameterTypes(); | ||||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0), "bytes4"); | 	BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "bytes4"); | ||||||
| 	BOOST_CHECK(function->isConstant()); | 	BOOST_CHECK(function->isConstant()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user