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