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 | ||||
| { | ||||
| 	solAssert(bound(), "Function is not bound."); | ||||
|  | ||||
| @ -915,10 +915,8 @@ public: | ||||
| 
 | ||||
| 	TypePointers parameterTypes() const; | ||||
| 	std::vector<std::string> parameterNames() const; | ||||
| 	std::vector<std::string> const parameterTypeNames(bool _addDataLocation) const; | ||||
| 	TypePointers const& returnParameterTypes() const { return m_returnParameterTypes; } | ||||
| 	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
 | ||||
| 	TypePointer const& selfType() const; | ||||
| 
 | ||||
|  | ||||
| @ -30,20 +30,6 @@ Json::Value InterfaceHandler::abiInterface(ContractDefinition const& _contractDe | ||||
| { | ||||
| 	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()) | ||||
| 	{ | ||||
| 		auto externalFunctionType = it.second->interfaceFunctionType(); | ||||
| @ -52,13 +38,15 @@ Json::Value InterfaceHandler::abiInterface(ContractDefinition const& _contractDe | ||||
| 		method["name"] = it.second->declaration().name(); | ||||
| 		method["constant"] = it.second->isConstant(); | ||||
| 		method["payable"] = it.second->isPayable(); | ||||
| 		method["inputs"] = populateParameters( | ||||
| 		method["inputs"] = formatTypeList( | ||||
| 			externalFunctionType->parameterNames(), | ||||
| 			externalFunctionType->parameterTypeNames(_contractDef.isLibrary()) | ||||
| 			externalFunctionType->parameterTypes(), | ||||
| 			_contractDef.isLibrary() | ||||
| 		); | ||||
| 		method["outputs"] = populateParameters( | ||||
| 		method["outputs"] = formatTypeList( | ||||
| 			externalFunctionType->returnParameterNames(), | ||||
| 			externalFunctionType->returnParameterTypeNames(_contractDef.isLibrary()) | ||||
| 			externalFunctionType->returnParameterTypes(), | ||||
| 			_contractDef.isLibrary() | ||||
| 		); | ||||
| 		abi.append(method); | ||||
| 	} | ||||
| @ -69,9 +57,10 @@ Json::Value InterfaceHandler::abiInterface(ContractDefinition const& _contractDe | ||||
| 		auto externalFunction = FunctionType(*_contractDef.constructor(), false).interfaceFunctionType(); | ||||
| 		solAssert(!!externalFunction, ""); | ||||
| 		method["payable"] = externalFunction->isPayable(); | ||||
| 		method["inputs"] = populateParameters( | ||||
| 		method["inputs"] = formatTypeList( | ||||
| 			externalFunction->parameterNames(), | ||||
| 			externalFunction->parameterTypeNames(_contractDef.isLibrary()) | ||||
| 			externalFunction->parameterTypes(), | ||||
| 			_contractDef.isLibrary() | ||||
| 		); | ||||
| 		abi.append(method); | ||||
| 	} | ||||
| @ -179,6 +168,25 @@ Json::Value InterfaceHandler::devDocumentation(ContractDefinition const& _contra | ||||
| 	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 value; | ||||
|  | ||||
| @ -37,6 +37,8 @@ namespace solidity | ||||
| 
 | ||||
| // Forward declarations
 | ||||
| class ContractDefinition; | ||||
| class Type; | ||||
| using TypePointer = std::shared_ptr<Type const>; | ||||
| struct DocTag; | ||||
| enum class DocumentationType: uint8_t; | ||||
| 
 | ||||
| @ -84,6 +86,14 @@ public: | ||||
| 	static Json::Value devDocumentation(ContractDefinition const& _contractDef); | ||||
| 
 | ||||
| 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.
 | ||||
| 	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); | ||||
| 	FunctionTypePointer function = retrieveFunctionBySignature(*contract, "foo()"); | ||||
| 	BOOST_REQUIRE(function && function->hasDeclaration()); | ||||
| 	auto returnParams = function->returnParameterTypeNames(false); | ||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0), "uint256"); | ||||
| 	auto returnParams = function->returnParameterTypes(); | ||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "uint256"); | ||||
| 	BOOST_CHECK(function->isConstant()); | ||||
| 
 | ||||
| 	function = retrieveFunctionBySignature(*contract, "map(uint256)"); | ||||
| 	BOOST_REQUIRE(function && function->hasDeclaration()); | ||||
| 	auto params = function->parameterTypeNames(false); | ||||
| 	BOOST_CHECK_EQUAL(params.at(0), "uint256"); | ||||
| 	returnParams = function->returnParameterTypeNames(false); | ||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0), "bytes4"); | ||||
| 	auto params = function->parameterTypes(); | ||||
| 	BOOST_CHECK_EQUAL(params.at(0)->canonicalName(false), "uint256"); | ||||
| 	returnParams = function->returnParameterTypes(); | ||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "bytes4"); | ||||
| 	BOOST_CHECK(function->isConstant()); | ||||
| 
 | ||||
| 	function = retrieveFunctionBySignature(*contract, "multiple_map(uint256,uint256)"); | ||||
| 	BOOST_REQUIRE(function && function->hasDeclaration()); | ||||
| 	params = function->parameterTypeNames(false); | ||||
| 	BOOST_CHECK_EQUAL(params.at(0), "uint256"); | ||||
| 	BOOST_CHECK_EQUAL(params.at(1), "uint256"); | ||||
| 	returnParams = function->returnParameterTypeNames(false); | ||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0), "bytes4"); | ||||
| 	params = function->parameterTypes(); | ||||
| 	BOOST_CHECK_EQUAL(params.at(0)->canonicalName(false), "uint256"); | ||||
| 	BOOST_CHECK_EQUAL(params.at(1)->canonicalName(false), "uint256"); | ||||
| 	returnParams = function->returnParameterTypes(); | ||||
| 	BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "bytes4"); | ||||
| 	BOOST_CHECK(function->isConstant()); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user