diff options
31 files changed, 575 insertions, 11 deletions
diff --git a/Changelog.md b/Changelog.md index fbb41ece..2d6f518c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -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: 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: 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. * Name Resolver: Do not exclude public state variables when looking for conflicting declarations. * Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence. diff --git a/libsolidity/ast/ASTJsonConverter.cpp b/libsolidity/ast/ASTJsonConverter.cpp index cadc5f28..4b282d85 100644 --- a/libsolidity/ast/ASTJsonConverter.cpp +++ b/libsolidity/ast/ASTJsonConverter.cpp @@ -325,17 +325,19 @@ bool ASTJsonConverter::visit(FunctionDefinition const& _node) std::vector<pair<string, Json::Value>> attributes = { make_pair("name", _node.name()), 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("superFunction", idOrNull(_node.annotation().superFunction)), make_pair("visibility", Declaration::visibilityToString(_node.visibility())), make_pair("parameters", toJson(_node.parameterList())), - make_pair("isConstructor", _node.isConstructor()), make_pair("returnParameters", toJson(*_node.returnParameterList())), make_pair("modifiers", toJson(_node.modifiers())), make_pair("body", _node.isImplemented() ? toJson(_node.body()) : Json::nullValue), make_pair("implemented", _node.isImplemented()), make_pair("scope", idOrNull(_node.scope())) }; + if (m_legacy) + attributes.emplace_back("isConstructor", _node.isConstructor()); setJsonNode(_node, "FunctionDefinition", std::move(attributes)); return false; } diff --git a/test/libsolidity/ASTJSON/constructor.json b/test/libsolidity/ASTJSON/constructor.json new file mode 100644 index 00000000..b0bc4201 --- /dev/null +++ b/test/libsolidity/ASTJSON/constructor.json @@ -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" +} diff --git a/test/libsolidity/ASTJSON/constructor.sol b/test/libsolidity/ASTJSON/constructor.sol new file mode 100644 index 00000000..79d04eb5 --- /dev/null +++ b/test/libsolidity/ASTJSON/constructor.sol @@ -0,0 +1,4 @@ +contract C { + constructor() public { + } +} diff --git a/test/libsolidity/ASTJSON/constructor_legacy.json b/test/libsolidity/ASTJSON/constructor_legacy.json new file mode 100644 index 00000000..0617073e --- /dev/null +++ b/test/libsolidity/ASTJSON/constructor_legacy.json @@ -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" +} diff --git a/test/libsolidity/ASTJSON/documentation.json b/test/libsolidity/ASTJSON/documentation.json index 403d4e72..ce1e0b57 100644 --- a/test/libsolidity/ASTJSON/documentation.json +++ b/test/libsolidity/ASTJSON/documentation.json @@ -147,7 +147,7 @@ "documentation" : "Some comment on fn.", "id" : 14, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "fn", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/documentation_legacy.json b/test/libsolidity/ASTJSON/documentation_legacy.json index 5a890e50..0277902f 100644 --- a/test/libsolidity/ASTJSON/documentation_legacy.json +++ b/test/libsolidity/ASTJSON/documentation_legacy.json @@ -108,6 +108,7 @@ "documentation" : "Some comment on fn.", "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/fallback.json b/test/libsolidity/ASTJSON/fallback.json new file mode 100644 index 00000000..a9c85b2f --- /dev/null +++ b/test/libsolidity/ASTJSON/fallback.json @@ -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" +} diff --git a/test/libsolidity/ASTJSON/fallback.sol b/test/libsolidity/ASTJSON/fallback.sol new file mode 100644 index 00000000..4e318892 --- /dev/null +++ b/test/libsolidity/ASTJSON/fallback.sol @@ -0,0 +1,4 @@ +contract C { + function() external payable { + } +} diff --git a/test/libsolidity/ASTJSON/fallback_legacy.json b/test/libsolidity/ASTJSON/fallback_legacy.json new file mode 100644 index 00000000..0aca3128 --- /dev/null +++ b/test/libsolidity/ASTJSON/fallback_legacy.json @@ -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" +} diff --git a/test/libsolidity/ASTJSON/fallback_payable.json b/test/libsolidity/ASTJSON/fallback_payable.json new file mode 100644 index 00000000..9d56f74b --- /dev/null +++ b/test/libsolidity/ASTJSON/fallback_payable.json @@ -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" +} diff --git a/test/libsolidity/ASTJSON/fallback_payable.sol b/test/libsolidity/ASTJSON/fallback_payable.sol new file mode 100644 index 00000000..21db99ec --- /dev/null +++ b/test/libsolidity/ASTJSON/fallback_payable.sol @@ -0,0 +1,3 @@ +contract C { + function() external {} +} diff --git a/test/libsolidity/ASTJSON/fallback_payable_legacy.json b/test/libsolidity/ASTJSON/fallback_payable_legacy.json new file mode 100644 index 00000000..7320f574 --- /dev/null +++ b/test/libsolidity/ASTJSON/fallback_payable_legacy.json @@ -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" +} diff --git a/test/libsolidity/ASTJSON/function_type.json b/test/libsolidity/ASTJSON/function_type.json index 5dbc5b80..b78d8446 100644 --- a/test/libsolidity/ASTJSON/function_type.json +++ b/test/libsolidity/ASTJSON/function_type.json @@ -37,7 +37,7 @@ "documentation" : null, "id" : 16, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/function_type_legacy.json b/test/libsolidity/ASTJSON/function_type_legacy.json index af0c42dd..72ceec81 100644 --- a/test/libsolidity/ASTJSON/function_type_legacy.json +++ b/test/libsolidity/ASTJSON/function_type_legacy.json @@ -41,6 +41,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/long_type_name_binary_operation.json b/test/libsolidity/ASTJSON/long_type_name_binary_operation.json index fe3e73d2..c6d40af2 100644 --- a/test/libsolidity/ASTJSON/long_type_name_binary_operation.json +++ b/test/libsolidity/ASTJSON/long_type_name_binary_operation.json @@ -142,7 +142,7 @@ "documentation" : null, "id" : 10, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/long_type_name_binary_operation_legacy.json b/test/libsolidity/ASTJSON/long_type_name_binary_operation_legacy.json index d78d01ff..b5333286 100644 --- a/test/libsolidity/ASTJSON/long_type_name_binary_operation_legacy.json +++ b/test/libsolidity/ASTJSON/long_type_name_binary_operation_legacy.json @@ -41,6 +41,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/long_type_name_identifier.json b/test/libsolidity/ASTJSON/long_type_name_identifier.json index 0579967c..505d260c 100644 --- a/test/libsolidity/ASTJSON/long_type_name_identifier.json +++ b/test/libsolidity/ASTJSON/long_type_name_identifier.json @@ -148,7 +148,7 @@ "documentation" : null, "id" : 13, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/long_type_name_identifier_legacy.json b/test/libsolidity/ASTJSON/long_type_name_identifier_legacy.json index a96ccef3..d3bcda56 100644 --- a/test/libsolidity/ASTJSON/long_type_name_identifier_legacy.json +++ b/test/libsolidity/ASTJSON/long_type_name_identifier_legacy.json @@ -83,6 +83,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/modifier_definition.json b/test/libsolidity/ASTJSON/modifier_definition.json index 95554f03..66359453 100644 --- a/test/libsolidity/ASTJSON/modifier_definition.json +++ b/test/libsolidity/ASTJSON/modifier_definition.json @@ -97,7 +97,7 @@ "documentation" : null, "id" : 13, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [ { diff --git a/test/libsolidity/ASTJSON/modifier_definition_legacy.json b/test/libsolidity/ASTJSON/modifier_definition_legacy.json index e1e797ba..5186912c 100644 --- a/test/libsolidity/ASTJSON/modifier_definition_legacy.json +++ b/test/libsolidity/ASTJSON/modifier_definition_legacy.json @@ -105,6 +105,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "name" : "F", "scope" : 14, "stateMutability" : "nonpayable", diff --git a/test/libsolidity/ASTJSON/modifier_invocation.json b/test/libsolidity/ASTJSON/modifier_invocation.json index 95554f03..66359453 100644 --- a/test/libsolidity/ASTJSON/modifier_invocation.json +++ b/test/libsolidity/ASTJSON/modifier_invocation.json @@ -97,7 +97,7 @@ "documentation" : null, "id" : 13, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [ { diff --git a/test/libsolidity/ASTJSON/modifier_invocation_legacy.json b/test/libsolidity/ASTJSON/modifier_invocation_legacy.json index e1e797ba..5186912c 100644 --- a/test/libsolidity/ASTJSON/modifier_invocation_legacy.json +++ b/test/libsolidity/ASTJSON/modifier_invocation_legacy.json @@ -105,6 +105,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "name" : "F", "scope" : 14, "stateMutability" : "nonpayable", diff --git a/test/libsolidity/ASTJSON/non_utf8.json b/test/libsolidity/ASTJSON/non_utf8.json index 307259e9..1852bd38 100644 --- a/test/libsolidity/ASTJSON/non_utf8.json +++ b/test/libsolidity/ASTJSON/non_utf8.json @@ -89,7 +89,7 @@ "documentation" : null, "id" : 7, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/non_utf8_legacy.json b/test/libsolidity/ASTJSON/non_utf8_legacy.json index b1f847f7..df105096 100644 --- a/test/libsolidity/ASTJSON/non_utf8_legacy.json +++ b/test/libsolidity/ASTJSON/non_utf8_legacy.json @@ -41,6 +41,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/short_type_name.json b/test/libsolidity/ASTJSON/short_type_name.json index 502c1e31..acb46157 100644 --- a/test/libsolidity/ASTJSON/short_type_name.json +++ b/test/libsolidity/ASTJSON/short_type_name.json @@ -93,7 +93,7 @@ "documentation" : null, "id" : 9, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/short_type_name_legacy.json b/test/libsolidity/ASTJSON/short_type_name_legacy.json index 761bcd3b..1f9b1968 100644 --- a/test/libsolidity/ASTJSON/short_type_name_legacy.json +++ b/test/libsolidity/ASTJSON/short_type_name_legacy.json @@ -41,6 +41,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/short_type_name_ref.json b/test/libsolidity/ASTJSON/short_type_name_ref.json index b0c3ad97..b6b7bca5 100644 --- a/test/libsolidity/ASTJSON/short_type_name_ref.json +++ b/test/libsolidity/ASTJSON/short_type_name_ref.json @@ -105,7 +105,7 @@ "documentation" : null, "id" : 10, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/short_type_name_ref_legacy.json b/test/libsolidity/ASTJSON/short_type_name_ref_legacy.json index d426a384..420b0f60 100644 --- a/test/libsolidity/ASTJSON/short_type_name_ref_legacy.json +++ b/test/libsolidity/ASTJSON/short_type_name_ref_legacy.json @@ -41,6 +41,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null diff --git a/test/libsolidity/ASTJSON/source_location.json b/test/libsolidity/ASTJSON/source_location.json index 8d8acb0f..f0ed216d 100644 --- a/test/libsolidity/ASTJSON/source_location.json +++ b/test/libsolidity/ASTJSON/source_location.json @@ -127,7 +127,7 @@ "documentation" : null, "id" : 10, "implemented" : true, - "isConstructor" : false, + "kind" : "function", "modifiers" : [], "name" : "f", "nodeType" : "FunctionDefinition", diff --git a/test/libsolidity/ASTJSON/source_location_legacy.json b/test/libsolidity/ASTJSON/source_location_legacy.json index 327cd6da..a65979d6 100644 --- a/test/libsolidity/ASTJSON/source_location_legacy.json +++ b/test/libsolidity/ASTJSON/source_location_legacy.json @@ -41,6 +41,7 @@ "documentation" : null, "implemented" : true, "isConstructor" : false, + "kind" : "function", "modifiers" : [ null |