mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Structure type json using "components".
This commit is contained in:
parent
36a90289e6
commit
7e1b9c1652
@ -136,25 +136,25 @@ Json::Value ABI::formatType(string const& _name, Type const& _type, bool _forLib
|
||||
suffix = string("[") + arrayType->length().str() + "]";
|
||||
solAssert(arrayType->baseType(), "");
|
||||
Json::Value subtype = formatType("", *arrayType->baseType(), _forLibrary);
|
||||
if (subtype["type"].isString() && !subtype.isMember("subtype"))
|
||||
ret["type"] = subtype["type"].asString() + suffix;
|
||||
else
|
||||
if (subtype.isMember("components"))
|
||||
{
|
||||
ret["type"] = suffix;
|
||||
solAssert(!subtype.isMember("subtype"), "");
|
||||
ret["subtype"] = subtype["type"];
|
||||
ret["type"] = subtype["type"].asString() + suffix;
|
||||
ret["components"] = subtype["components"];
|
||||
}
|
||||
else
|
||||
ret["type"] = subtype["type"].asString() + suffix;
|
||||
}
|
||||
}
|
||||
else if (StructType const* structType = dynamic_cast<StructType const*>(&_type))
|
||||
{
|
||||
ret["type"] = Json::arrayValue;
|
||||
ret["type"] = string();
|
||||
ret["components"] = Json::arrayValue;
|
||||
for (auto const& member: structType->members(nullptr))
|
||||
{
|
||||
solAssert(member.type, "");
|
||||
auto t = member.type->interfaceType(_forLibrary);
|
||||
solAssert(t, "");
|
||||
ret["type"].append(formatType(member.name, *t, _forLibrary));
|
||||
ret["components"].append(formatType(member.name, *t, _forLibrary));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -950,32 +950,39 @@ BOOST_AUTO_TEST_CASE(return_structs)
|
||||
}
|
||||
)";
|
||||
char const* interface = R"(
|
||||
[
|
||||
{
|
||||
[{
|
||||
"constant" : false,
|
||||
"payable": false,
|
||||
"inputs": [],
|
||||
"name": "f",
|
||||
"outputs": [{
|
||||
"name": "x",
|
||||
"type": "uint256"
|
||||
}, {
|
||||
"name": "s",
|
||||
"type": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}, {
|
||||
"name": "sub",
|
||||
"subtype": [{
|
||||
"name": "x",
|
||||
"type": "uint256[2]"
|
||||
}],
|
||||
"type": "[]"
|
||||
}]
|
||||
}],
|
||||
"inputs" : [],
|
||||
"name" : "f",
|
||||
"outputs" : [
|
||||
{
|
||||
"name" : "x",
|
||||
"type" : "uint256"
|
||||
},
|
||||
{
|
||||
"components" : [
|
||||
{
|
||||
"name" : "a",
|
||||
"type" : "uint256"
|
||||
},
|
||||
{
|
||||
"components" : [
|
||||
{
|
||||
"name" : "x",
|
||||
"type" : "uint256[2]"
|
||||
}
|
||||
],
|
||||
"name" : "sub",
|
||||
"type" : "[]"
|
||||
}
|
||||
],
|
||||
"name" : "s",
|
||||
"type" : ""
|
||||
}
|
||||
],
|
||||
"payable" : false,
|
||||
"type" : "function"
|
||||
}
|
||||
]
|
||||
}]
|
||||
)";
|
||||
checkInterface(text, interface);
|
||||
}
|
||||
@ -990,28 +997,33 @@ BOOST_AUTO_TEST_CASE(return_structs_with_contracts)
|
||||
}
|
||||
)";
|
||||
char const* interface = R"(
|
||||
[
|
||||
{
|
||||
"constant" : false,
|
||||
"payable": false,
|
||||
[{
|
||||
"constant": false,
|
||||
"inputs": [],
|
||||
"name": "f",
|
||||
"outputs" : [{
|
||||
"name" : "s",
|
||||
"type" : [{
|
||||
"name" : "x",
|
||||
"type" : "address[]"
|
||||
}, {
|
||||
"name" : "y",
|
||||
"type" : "address"
|
||||
}]
|
||||
}, {
|
||||
"name" : "c",
|
||||
"type" : "address"
|
||||
}],
|
||||
"type" : "function"
|
||||
}
|
||||
]
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"name": "x",
|
||||
"type": "address[]"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "s",
|
||||
"type": ""
|
||||
},
|
||||
{
|
||||
"name": "c",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"payable": false,
|
||||
"type": "function"
|
||||
}]
|
||||
)";
|
||||
checkInterface(text, interface);
|
||||
}
|
||||
@ -1025,36 +1037,49 @@ BOOST_AUTO_TEST_CASE(event_structs)
|
||||
event E(T t, S s);
|
||||
}
|
||||
)";
|
||||
char const* interface = R"(
|
||||
[{
|
||||
"anonymous" : false,
|
||||
"inputs" : [{
|
||||
"indexed" : false,
|
||||
"name" : "t",
|
||||
"type" : [{
|
||||
"name" : "x",
|
||||
"type" : "uint256[2]"
|
||||
}]
|
||||
}, {
|
||||
"indexed" : false,
|
||||
"name" : "s",
|
||||
"type" : [{
|
||||
"name" : "a",
|
||||
"type" : "uint256"
|
||||
}, {
|
||||
"name" : "sub",
|
||||
"subtype" : [{
|
||||
"name" : "x",
|
||||
"type" : "uint256[2]"
|
||||
}],
|
||||
"type" : "[]"
|
||||
}, {
|
||||
"name" : "b",
|
||||
"type" : "bytes"
|
||||
}]
|
||||
}],
|
||||
"name" : "E",
|
||||
"type" : "event"
|
||||
char const *interface = R"(
|
||||
[{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"name": "x",
|
||||
"type": "uint256[2]"
|
||||
}
|
||||
],
|
||||
"indexed": false,
|
||||
"name": "t",
|
||||
"type": ""
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"name": "x",
|
||||
"type": "uint256[2]"
|
||||
}
|
||||
],
|
||||
"name": "sub",
|
||||
"type": "[]"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "bytes"
|
||||
}
|
||||
],
|
||||
"indexed": false,
|
||||
"name": "s",
|
||||
"type": ""
|
||||
}
|
||||
],
|
||||
"name": "E",
|
||||
"type": "event"
|
||||
}]
|
||||
)";
|
||||
checkInterface(text, interface);
|
||||
@ -1072,38 +1097,50 @@ BOOST_AUTO_TEST_CASE(structs_in_libraries)
|
||||
)";
|
||||
char const* interface = R"(
|
||||
[{
|
||||
"constant" : false,
|
||||
"inputs" : [{
|
||||
"name" : "s",
|
||||
"type" : [{
|
||||
"name" : "a",
|
||||
"type" : "uint256"
|
||||
}, {
|
||||
"name" : "sub",
|
||||
"subtype" : [{
|
||||
"name" : "x",
|
||||
"type" : "uint256[2]"
|
||||
}],
|
||||
"type" : "[]"
|
||||
}, {
|
||||
"name" : "b",
|
||||
"type" : "bytes"
|
||||
}]
|
||||
}],
|
||||
"name" : "g",
|
||||
"outputs" : [],
|
||||
"payable" : false,
|
||||
"type" : "function"
|
||||
}, {
|
||||
"constant" : false,
|
||||
"inputs" : [{
|
||||
"name" : "s",
|
||||
"type" : "L.S storage"
|
||||
}],
|
||||
"name" : "f",
|
||||
"outputs" : [],
|
||||
"payable" : false,
|
||||
"type" : "function"
|
||||
"constant": false,
|
||||
"inputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"name": "x",
|
||||
"type": "uint256[2]"
|
||||
}
|
||||
],
|
||||
"name": "sub",
|
||||
"type": "[]"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "bytes"
|
||||
}
|
||||
],
|
||||
"name": "s",
|
||||
"type": ""
|
||||
}
|
||||
],
|
||||
"name": "g",
|
||||
"outputs": [],
|
||||
"payable": false,
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"constant": false,
|
||||
"inputs": [
|
||||
{
|
||||
"name": "s",
|
||||
"type": "L.S storage"
|
||||
}
|
||||
],
|
||||
"name": "f",
|
||||
"outputs": [],
|
||||
"payable": false,
|
||||
"type": "function"
|
||||
}]
|
||||
)";
|
||||
checkInterface(text, interface);
|
||||
|
Loading…
Reference in New Issue
Block a user