Merge pull request #4734 from ethereum/astUpdate

JSON AST: replace ``isConstructor`` by ``kind`` which also supports fallbacks
This commit is contained in:
chriseth 2018-10-08 21:47:27 +02:00 committed by GitHub
commit 7ff9a27979
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 575 additions and 11 deletions

View File

@ -36,6 +36,7 @@ Breaking Changes:
* General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode. * General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode.
* General: Disallow combining hex numbers with unit denominations (e.g. ``0x1e wei``). This was already the case in the experimental 0.5.0 mode. * General: Disallow combining hex numbers with unit denominations (e.g. ``0x1e wei``). This was already the case in the experimental 0.5.0 mode.
* JSON AST: Remove ``constant`` and ``payable`` fields (the information is encoded in the ``stateMutability`` field). * JSON AST: Remove ``constant`` and ``payable`` fields (the information is encoded in the ``stateMutability`` field).
* JSON AST: Replace the ``isConstructor`` field by a new ``kind`` field, which can be ``constructor``, ``fallback`` or ``function``.
* Interface: Remove "clone contract" feature. The ``--clone-bin`` and ``--combined-json clone-bin`` commandline options are not available anymore. * Interface: Remove "clone contract" feature. The ``--clone-bin`` and ``--combined-json clone-bin`` commandline options are not available anymore.
* Name Resolver: Do not exclude public state variables when looking for conflicting declarations. * Name Resolver: Do not exclude public state variables when looking for conflicting declarations.
* Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence. * Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence.

View File

@ -325,17 +325,19 @@ bool ASTJsonConverter::visit(FunctionDefinition const& _node)
std::vector<pair<string, Json::Value>> attributes = { std::vector<pair<string, Json::Value>> attributes = {
make_pair("name", _node.name()), make_pair("name", _node.name()),
make_pair("documentation", _node.documentation() ? Json::Value(*_node.documentation()) : Json::nullValue), make_pair("documentation", _node.documentation() ? Json::Value(*_node.documentation()) : Json::nullValue),
make_pair("kind", _node.isConstructor() ? "constructor" : (_node.isFallback() ? "fallback" : "function")),
make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())), make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())),
make_pair("superFunction", idOrNull(_node.annotation().superFunction)), make_pair("superFunction", idOrNull(_node.annotation().superFunction)),
make_pair("visibility", Declaration::visibilityToString(_node.visibility())), make_pair("visibility", Declaration::visibilityToString(_node.visibility())),
make_pair("parameters", toJson(_node.parameterList())), make_pair("parameters", toJson(_node.parameterList())),
make_pair("isConstructor", _node.isConstructor()),
make_pair("returnParameters", toJson(*_node.returnParameterList())), make_pair("returnParameters", toJson(*_node.returnParameterList())),
make_pair("modifiers", toJson(_node.modifiers())), make_pair("modifiers", toJson(_node.modifiers())),
make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue), make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue),
make_pair("implemented", _node.isImplemented()), make_pair("implemented", _node.isImplemented()),
make_pair("scope", idOrNull(_node.scope())) make_pair("scope", idOrNull(_node.scope()))
}; };
if (m_legacy)
attributes.emplace_back("isConstructor", _node.isConstructor());
setJsonNode(_node, "FunctionDefinition", std::move(attributes)); setJsonNode(_node, "FunctionDefinition", std::move(attributes));
return false; return false;
} }

View File

@ -0,0 +1,70 @@
{
"absolutePath" : "a",
"exportedSymbols" :
{
"C" :
[
5
]
},
"id" : 6,
"nodeType" : "SourceUnit",
"nodes" :
[
{
"baseContracts" : [],
"contractDependencies" : [],
"contractKind" : "contract",
"documentation" : null,
"fullyImplemented" : true,
"id" : 5,
"linearizedBaseContracts" :
[
5
],
"name" : "C",
"nodeType" : "ContractDefinition",
"nodes" :
[
{
"body" :
{
"id" : 3,
"nodeType" : "Block",
"src" : "35:4:1",
"statements" : []
},
"documentation" : null,
"id" : 4,
"implemented" : true,
"kind" : "constructor",
"modifiers" : [],
"name" : "",
"nodeType" : "FunctionDefinition",
"parameters" :
{
"id" : 1,
"nodeType" : "ParameterList",
"parameters" : [],
"src" : "25:2:1"
},
"returnParameters" :
{
"id" : 2,
"nodeType" : "ParameterList",
"parameters" : [],
"src" : "35:0:1"
},
"scope" : 5,
"src" : "14:25:1",
"stateMutability" : "nonpayable",
"superFunction" : null,
"visibility" : "public"
}
],
"scope" : 6,
"src" : "0:41:1"
}
],
"src" : "0:42:1"
}

View File

@ -0,0 +1,4 @@
contract C {
constructor() public {
}
}

View File

@ -0,0 +1,110 @@
{
"attributes" :
{
"absolutePath" : "a",
"exportedSymbols" :
{
"C" :
[
5
]
}
},
"children" :
[
{
"attributes" :
{
"baseContracts" :
[
null
],
"contractDependencies" :
[
null
],
"contractKind" : "contract",
"documentation" : null,
"fullyImplemented" : true,
"linearizedBaseContracts" :
[
5
],
"name" : "C",
"scope" : 6
},
"children" :
[
{
"attributes" :
{
"documentation" : null,
"implemented" : true,
"isConstructor" : true,
"kind" : "constructor",
"modifiers" :
[
null
],
"name" : "",
"scope" : 5,
"stateMutability" : "nonpayable",
"superFunction" : null,
"visibility" : "public"
},
"children" :
[
{
"attributes" :
{
"parameters" :
[
null
]
},
"children" : [],
"id" : 1,
"name" : "ParameterList",
"src" : "25:2:1"
},
{
"attributes" :
{
"parameters" :
[
null
]
},
"children" : [],
"id" : 2,
"name" : "ParameterList",
"src" : "35:0:1"
},
{
"attributes" :
{
"statements" :
[
null
]
},
"children" : [],
"id" : 3,
"name" : "Block",
"src" : "35:4:1"
}
],
"id" : 4,
"name" : "FunctionDefinition",
"src" : "14:25:1"
}
],
"id" : 5,
"name" : "ContractDefinition",
"src" : "0:41:1"
}
],
"id" : 6,
"name" : "SourceUnit",
"src" : "0:42:1"
}

View File

@ -147,7 +147,7 @@
"documentation" : "Some comment on fn.", "documentation" : "Some comment on fn.",
"id" : 14, "id" : 14,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "fn", "name" : "fn",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -108,6 +108,7 @@
"documentation" : "Some comment on fn.", "documentation" : "Some comment on fn.",
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -0,0 +1,70 @@
{
"absolutePath" : "a",
"exportedSymbols" :
{
"C" :
[
5
]
},
"id" : 6,
"nodeType" : "SourceUnit",
"nodes" :
[
{
"baseContracts" : [],
"contractDependencies" : [],
"contractKind" : "contract",
"documentation" : null,
"fullyImplemented" : true,
"id" : 5,
"linearizedBaseContracts" :
[
5
],
"name" : "C",
"nodeType" : "ContractDefinition",
"nodes" :
[
{
"body" :
{
"id" : 3,
"nodeType" : "Block",
"src" : "43:5:1",
"statements" : []
},
"documentation" : null,
"id" : 4,
"implemented" : true,
"kind" : "fallback",
"modifiers" : [],
"name" : "",
"nodeType" : "FunctionDefinition",
"parameters" :
{
"id" : 1,
"nodeType" : "ParameterList",
"parameters" : [],
"src" : "23:2:1"
},
"returnParameters" :
{
"id" : 2,
"nodeType" : "ParameterList",
"parameters" : [],
"src" : "43:0:1"
},
"scope" : 5,
"src" : "15:33:1",
"stateMutability" : "payable",
"superFunction" : null,
"visibility" : "external"
}
],
"scope" : 6,
"src" : "0:50:1"
}
],
"src" : "0:51:1"
}

View File

@ -0,0 +1,4 @@
contract C {
function() external payable {
}
}

View File

@ -0,0 +1,110 @@
{
"attributes" :
{
"absolutePath" : "a",
"exportedSymbols" :
{
"C" :
[
5
]
}
},
"children" :
[
{
"attributes" :
{
"baseContracts" :
[
null
],
"contractDependencies" :
[
null
],
"contractKind" : "contract",
"documentation" : null,
"fullyImplemented" : true,
"linearizedBaseContracts" :
[
5
],
"name" : "C",
"scope" : 6
},
"children" :
[
{
"attributes" :
{
"documentation" : null,
"implemented" : true,
"isConstructor" : false,
"kind" : "fallback",
"modifiers" :
[
null
],
"name" : "",
"scope" : 5,
"stateMutability" : "payable",
"superFunction" : null,
"visibility" : "external"
},
"children" :
[
{
"attributes" :
{
"parameters" :
[
null
]
},
"children" : [],
"id" : 1,
"name" : "ParameterList",
"src" : "23:2:1"
},
{
"attributes" :
{
"parameters" :
[
null
]
},
"children" : [],
"id" : 2,
"name" : "ParameterList",
"src" : "43:0:1"
},
{
"attributes" :
{
"statements" :
[
null
]
},
"children" : [],
"id" : 3,
"name" : "Block",
"src" : "43:5:1"
}
],
"id" : 4,
"name" : "FunctionDefinition",
"src" : "15:33:1"
}
],
"id" : 5,
"name" : "ContractDefinition",
"src" : "0:50:1"
}
],
"id" : 6,
"name" : "SourceUnit",
"src" : "0:51:1"
}

View File

@ -0,0 +1,70 @@
{
"absolutePath" : "a",
"exportedSymbols" :
{
"C" :
[
5
]
},
"id" : 6,
"nodeType" : "SourceUnit",
"nodes" :
[
{
"baseContracts" : [],
"contractDependencies" : [],
"contractKind" : "contract",
"documentation" : null,
"fullyImplemented" : true,
"id" : 5,
"linearizedBaseContracts" :
[
5
],
"name" : "C",
"nodeType" : "ContractDefinition",
"nodes" :
[
{
"body" :
{
"id" : 3,
"nodeType" : "Block",
"src" : "34:2:1",
"statements" : []
},
"documentation" : null,
"id" : 4,
"implemented" : true,
"kind" : "fallback",
"modifiers" : [],
"name" : "",
"nodeType" : "FunctionDefinition",
"parameters" :
{
"id" : 1,
"nodeType" : "ParameterList",
"parameters" : [],
"src" : "22:2:1"
},
"returnParameters" :
{
"id" : 2,
"nodeType" : "ParameterList",
"parameters" : [],
"src" : "34:0:1"
},
"scope" : 5,
"src" : "14:22:1",
"stateMutability" : "nonpayable",
"superFunction" : null,
"visibility" : "external"
}
],
"scope" : 6,
"src" : "0:38:1"
}
],
"src" : "0:39:1"
}

View File

@ -0,0 +1,3 @@
contract C {
function() external {}
}

View File

@ -0,0 +1,110 @@
{
"attributes" :
{
"absolutePath" : "a",
"exportedSymbols" :
{
"C" :
[
5
]
}
},
"children" :
[
{
"attributes" :
{
"baseContracts" :
[
null
],
"contractDependencies" :
[
null
],
"contractKind" : "contract",
"documentation" : null,
"fullyImplemented" : true,
"linearizedBaseContracts" :
[
5
],
"name" : "C",
"scope" : 6
},
"children" :
[
{
"attributes" :
{
"documentation" : null,
"implemented" : true,
"isConstructor" : false,
"kind" : "fallback",
"modifiers" :
[
null
],
"name" : "",
"scope" : 5,
"stateMutability" : "nonpayable",
"superFunction" : null,
"visibility" : "external"
},
"children" :
[
{
"attributes" :
{
"parameters" :
[
null
]
},
"children" : [],
"id" : 1,
"name" : "ParameterList",
"src" : "22:2:1"
},
{
"attributes" :
{
"parameters" :
[
null
]
},
"children" : [],
"id" : 2,
"name" : "ParameterList",
"src" : "34:0:1"
},
{
"attributes" :
{
"statements" :
[
null
]
},
"children" : [],
"id" : 3,
"name" : "Block",
"src" : "34:2:1"
}
],
"id" : 4,
"name" : "FunctionDefinition",
"src" : "14:22:1"
}
],
"id" : 5,
"name" : "ContractDefinition",
"src" : "0:38:1"
}
],
"id" : 6,
"name" : "SourceUnit",
"src" : "0:39:1"
}

View File

@ -37,7 +37,7 @@
"documentation" : null, "documentation" : null,
"id" : 16, "id" : 16,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -41,6 +41,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -142,7 +142,7 @@
"documentation" : null, "documentation" : null,
"id" : 10, "id" : 10,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -41,6 +41,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -148,7 +148,7 @@
"documentation" : null, "documentation" : null,
"id" : 13, "id" : 13,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -83,6 +83,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -97,7 +97,7 @@
"documentation" : null, "documentation" : null,
"id" : 13, "id" : 13,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : "modifiers" :
[ [
{ {

View File

@ -105,6 +105,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"name" : "F", "name" : "F",
"scope" : 14, "scope" : 14,
"stateMutability" : "nonpayable", "stateMutability" : "nonpayable",

View File

@ -97,7 +97,7 @@
"documentation" : null, "documentation" : null,
"id" : 13, "id" : 13,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : "modifiers" :
[ [
{ {

View File

@ -105,6 +105,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"name" : "F", "name" : "F",
"scope" : 14, "scope" : 14,
"stateMutability" : "nonpayable", "stateMutability" : "nonpayable",

View File

@ -89,7 +89,7 @@
"documentation" : null, "documentation" : null,
"id" : 7, "id" : 7,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -41,6 +41,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -93,7 +93,7 @@
"documentation" : null, "documentation" : null,
"id" : 9, "id" : 9,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -41,6 +41,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -105,7 +105,7 @@
"documentation" : null, "documentation" : null,
"id" : 10, "id" : 10,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -41,6 +41,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null

View File

@ -127,7 +127,7 @@
"documentation" : null, "documentation" : null,
"id" : 10, "id" : 10,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "kind" : "function",
"modifiers" : [], "modifiers" : [],
"name" : "f", "name" : "f",
"nodeType" : "FunctionDefinition", "nodeType" : "FunctionDefinition",

View File

@ -41,6 +41,7 @@
"documentation" : null, "documentation" : null,
"implemented" : true, "implemented" : true,
"isConstructor" : false, "isConstructor" : false,
"kind" : "function",
"modifiers" : "modifiers" :
[ [
null null