aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/ast/ASTJsonConverter.cpp192
-rw-r--r--libsolidity/ast/ASTJsonConverter.h23
-rw-r--r--libsolidity/formal/Why3Translator.cpp9
3 files changed, 178 insertions, 46 deletions
diff --git a/libsolidity/ast/ASTJsonConverter.cpp b/libsolidity/ast/ASTJsonConverter.cpp
index c4134f4e..35fd0b7d 100644
--- a/libsolidity/ast/ASTJsonConverter.cpp
+++ b/libsolidity/ast/ASTJsonConverter.cpp
@@ -31,21 +31,10 @@ namespace dev
namespace solidity
{
-void ASTJsonConverter::addKeyValue(Json::Value& _obj, string const& _key, string const& _val)
-{
- // special handling for booleans
- if (_key == "const" || _key == "public" || _key == "local" ||
- _key == "lvalue" || _key == "local_lvalue" || _key == "prefix")
- _obj[_key] = (_val == "1") ? true : false;
- else
- // else simply add it as a string
- _obj[_key] = _val;
-}
-
void ASTJsonConverter::addJsonNode(
ASTNode const& _node,
string const& _nodeName,
- initializer_list<pair<string const, string const>> _list,
+ initializer_list<pair<string const, Json::Value const>> _attributes,
bool _hasChildren = false
)
{
@@ -54,11 +43,11 @@ void ASTJsonConverter::addJsonNode(
node["id"] = reinterpret_cast<Json::UInt64>(&_node);
node["src"] = sourceLocationToString(_node.location());
node["name"] = _nodeName;
- if (_list.size() != 0)
+ if (_attributes.size() != 0)
{
Json::Value attrs;
- for (auto& e: _list)
- addKeyValue(attrs, e.first, e.second);
+ for (auto& e: _attributes)
+ attrs[e.first] = e.second;
node["attributes"] = attrs;
}
@@ -89,11 +78,6 @@ ASTJsonConverter::ASTJsonConverter(
map<string, unsigned> _sourceIndices
): m_ast(&_ast), m_sourceIndices(_sourceIndices)
{
- Json::Value children(Json::arrayValue);
-
- m_astJson["name"] = "root";
- m_astJson["children"] = children;
- m_jsonNodePtrs.push(&m_astJson["children"]);
}
void ASTJsonConverter::print(ostream& _stream)
@@ -108,21 +92,64 @@ Json::Value const& ASTJsonConverter::json()
return m_astJson;
}
+bool ASTJsonConverter::visit(SourceUnit const&)
+{
+ Json::Value children(Json::arrayValue);
+
+ m_astJson["name"] = "SourceUnit";
+ m_astJson["children"] = children;
+ m_jsonNodePtrs.push(&m_astJson["children"]);
+
+ return true;
+}
+
bool ASTJsonConverter::visit(ImportDirective const& _node)
{
- addJsonNode(_node, "Import", { make_pair("file", _node.path())});
+ addJsonNode(_node, "ImportDirective", { make_pair("file", _node.path())});
return true;
}
bool ASTJsonConverter::visit(ContractDefinition const& _node)
{
- addJsonNode(_node, "Contract", { make_pair("name", _node.name()) }, true);
+ Json::Value linearizedBaseContracts(Json::arrayValue);
+ for (auto const& baseContract: _node.annotation().linearizedBaseContracts)
+ linearizedBaseContracts.append(reinterpret_cast<Json::UInt64>(baseContract));
+ addJsonNode(_node, "ContractDefinition", {
+ make_pair("name", _node.name()),
+ make_pair("isLibrary", _node.isLibrary()),
+ make_pair("fullyImplemented", _node.annotation().isFullyImplemented),
+ make_pair("linearizedBaseContracts", linearizedBaseContracts),
+ }, true);
+ return true;
+}
+
+bool ASTJsonConverter::visit(InheritanceSpecifier const& _node)
+{
+ addJsonNode(_node, "InheritanceSpecifier", {}, true);
+ return true;
+}
+
+bool ASTJsonConverter::visit(UsingForDirective const& _node)
+{
+ addJsonNode(_node, "UsingForDirective", {}, true);
return true;
}
bool ASTJsonConverter::visit(StructDefinition const& _node)
{
- addJsonNode(_node, "Struct", { make_pair("name", _node.name()) }, true);
+ addJsonNode(_node, "StructDefinition", { make_pair("name", _node.name()) }, true);
+ return true;
+}
+
+bool ASTJsonConverter::visit(EnumDefinition const& _node)
+{
+ addJsonNode(_node, "EnumDefinition", { make_pair("name", _node.name()) }, true);
+ return true;
+}
+
+bool ASTJsonConverter::visit(EnumValue const& _node)
+{
+ addJsonNode(_node, "EnumValue", { make_pair("name", _node.name()) });
return true;
}
@@ -134,11 +161,11 @@ bool ASTJsonConverter::visit(ParameterList const& _node)
bool ASTJsonConverter::visit(FunctionDefinition const& _node)
{
- addJsonNode(_node, "Function",
- { make_pair("name", _node.name()),
- make_pair("public", boost::lexical_cast<std::string>(_node.isPublic())),
- make_pair("const", boost::lexical_cast<std::string>(_node.isDeclaredConst())) },
- true);
+ addJsonNode(_node, "FunctionDefinition", {
+ make_pair("name", _node.name()),
+ make_pair("public", _node.isPublic()),
+ make_pair("constant", _node.isDeclaredConst())
+ }, true);
return true;
}
@@ -146,16 +173,34 @@ bool ASTJsonConverter::visit(VariableDeclaration const& _node)
{
addJsonNode(_node, "VariableDeclaration", {
make_pair("name", _node.name()),
- make_pair("name", _node.name()),
+ make_pair("type", type(_node))
}, true);
return true;
}
+bool ASTJsonConverter::visit(ModifierDefinition const& _node)
+{
+ addJsonNode(_node, "ModifierDefinition", { make_pair("name", _node.name()) }, true);
+ return true;
+}
+
+bool ASTJsonConverter::visit(ModifierInvocation const& _node)
+{
+ addJsonNode(_node, "ModifierInvocation", {}, true);
+ return true;
+}
+
bool ASTJsonConverter::visit(TypeName const&)
{
return true;
}
+bool ASTJsonConverter::visit(EventDefinition const& _node)
+{
+ addJsonNode(_node, "EventDefinition", { make_pair("name", _node.name()) }, true);
+ return true;
+}
+
bool ASTJsonConverter::visit(ElementaryTypeName const& _node)
{
addJsonNode(_node, "ElementaryTypeName", { make_pair("name", _node.typeName().toString()) });
@@ -176,6 +221,12 @@ bool ASTJsonConverter::visit(Mapping const& _node)
return true;
}
+bool ASTJsonConverter::visit(ArrayTypeName const& _node)
+{
+ addJsonNode(_node, "ArrayTypeName", {}, true);
+ return true;
+}
+
bool ASTJsonConverter::visit(InlineAssembly const& _node)
{
addJsonNode(_node, "InlineAssembly", {}, true);
@@ -188,6 +239,12 @@ bool ASTJsonConverter::visit(Block const& _node)
return true;
}
+bool ASTJsonConverter::visit(PlaceholderStatement const& _node)
+{
+ addJsonNode(_node, "PlaceholderStatement", {});
+ return true;
+}
+
bool ASTJsonConverter::visit(IfStatement const& _node)
{
addJsonNode(_node, "IfStatement", {}, true);
@@ -232,7 +289,7 @@ bool ASTJsonConverter::visit(Throw const& _node)
bool ASTJsonConverter::visit(VariableDeclarationStatement const& _node)
{
- addJsonNode(_node, "VariableDefinition", {}, true);
+ addJsonNode(_node, "VariableDefinitionStatement", {}, true);
return true;
}
@@ -266,7 +323,7 @@ bool ASTJsonConverter::visit(TupleExpression const& _node)
bool ASTJsonConverter::visit(UnaryOperation const& _node)
{
addJsonNode(_node, "UnaryOperation",
- { make_pair("prefix", boost::lexical_cast<std::string>(_node.isPrefixOperation())),
+ { make_pair("prefix", _node.isPrefixOperation()),
make_pair("operator", Token::toString(_node.getOperator())),
make_pair("type", type(_node)) },
true);
@@ -285,7 +342,7 @@ bool ASTJsonConverter::visit(BinaryOperation const& _node)
bool ASTJsonConverter::visit(FunctionCall const& _node)
{
addJsonNode(_node, "FunctionCall", {
- make_pair("type_conversion", boost::lexical_cast<std::string>(_node.annotation().isTypeConversion)),
+ make_pair("type_conversion", _node.annotation().isTypeConversion),
make_pair("type", type(_node))
}, true);
return true;
@@ -299,10 +356,10 @@ bool ASTJsonConverter::visit(NewExpression const& _node)
bool ASTJsonConverter::visit(MemberAccess const& _node)
{
- addJsonNode(_node, "MemberAccess",
- { make_pair("member_name", _node.memberName()),
- make_pair("type", type(_node)) },
- true);
+ addJsonNode(_node, "MemberAccess", {
+ make_pair("member_name", _node.memberName()),
+ make_pair("type", type(_node))
+ }, true);
return true;
}
@@ -321,21 +378,29 @@ bool ASTJsonConverter::visit(Identifier const& _node)
bool ASTJsonConverter::visit(ElementaryTypeNameExpression const& _node)
{
- addJsonNode(_node, "ElementaryTypenameExpression",
- { make_pair("value", _node.typeName().toString()), make_pair("type", type(_node)) });
+ addJsonNode(_node, "ElementaryTypenameExpression", {
+ make_pair("value", _node.typeName().toString()),
+ make_pair("type", type(_node))
+ });
return true;
}
bool ASTJsonConverter::visit(Literal const& _node)
{
char const* tokenString = Token::toString(_node.token());
- addJsonNode(_node, "Literal",
- { make_pair("string", (tokenString) ? tokenString : "null"),
- make_pair("value", _node.value()),
- make_pair("type", type(_node)) });
+ addJsonNode(_node, "Literal", {
+ make_pair("string", tokenString ? tokenString : Json::Value()),
+ make_pair("value", _node.value()),
+ make_pair("type", type(_node))
+ });
return true;
}
+void ASTJsonConverter::endVisit(SourceUnit const&)
+{
+ goUp();
+}
+
void ASTJsonConverter::endVisit(ImportDirective const&)
{
}
@@ -345,11 +410,30 @@ void ASTJsonConverter::endVisit(ContractDefinition const&)
goUp();
}
+void ASTJsonConverter::endVisit(InheritanceSpecifier const&)
+{
+ goUp();
+}
+
+void ASTJsonConverter::endVisit(UsingForDirective const&)
+{
+ goUp();
+}
+
void ASTJsonConverter::endVisit(StructDefinition const&)
{
goUp();
}
+void ASTJsonConverter::endVisit(EnumDefinition const&)
+{
+ goUp();
+}
+
+void ASTJsonConverter::endVisit(EnumValue const&)
+{
+}
+
void ASTJsonConverter::endVisit(ParameterList const&)
{
goUp();
@@ -365,6 +449,21 @@ void ASTJsonConverter::endVisit(VariableDeclaration const&)
goUp();
}
+void ASTJsonConverter::endVisit(ModifierDefinition const&)
+{
+ goUp();
+}
+
+void ASTJsonConverter::endVisit(ModifierInvocation const&)
+{
+ goUp();
+}
+
+void ASTJsonConverter::endVisit(EventDefinition const&)
+{
+ goUp();
+}
+
void ASTJsonConverter::endVisit(TypeName const&)
{
}
@@ -382,6 +481,11 @@ void ASTJsonConverter::endVisit(Mapping const&)
goUp();
}
+void ASTJsonConverter::endVisit(ArrayTypeName const&)
+{
+ goUp();
+}
+
void ASTJsonConverter::endVisit(InlineAssembly const&)
{
goUp();
@@ -392,6 +496,10 @@ void ASTJsonConverter::endVisit(Block const&)
goUp();
}
+void ASTJsonConverter::endVisit(PlaceholderStatement const&)
+{
+}
+
void ASTJsonConverter::endVisit(IfStatement const&)
{
goUp();
diff --git a/libsolidity/ast/ASTJsonConverter.h b/libsolidity/ast/ASTJsonConverter.h
index ca4d9c2d..97aa8654 100644
--- a/libsolidity/ast/ASTJsonConverter.h
+++ b/libsolidity/ast/ASTJsonConverter.h
@@ -51,18 +51,28 @@ public:
void print(std::ostream& _stream);
Json::Value const& json();
+ bool visit(SourceUnit const& _node) override;
bool visit(ImportDirective const& _node) override;
bool visit(ContractDefinition const& _node) override;
+ bool visit(InheritanceSpecifier const& _node) override;
+ bool visit(UsingForDirective const& _node) override;
bool visit(StructDefinition const& _node) override;
+ bool visit(EnumDefinition const& _node) override;
+ bool visit(EnumValue const& _node) override;
bool visit(ParameterList const& _node) override;
bool visit(FunctionDefinition const& _node) override;
bool visit(VariableDeclaration const& _node) override;
+ bool visit(ModifierDefinition const& _node) override;
+ bool visit(ModifierInvocation const& _node) override;
+ bool visit(EventDefinition const& _node) override;
bool visit(TypeName const& _node) override;
bool visit(ElementaryTypeName const& _node) override;
bool visit(UserDefinedTypeName const& _node) override;
bool visit(Mapping const& _node) override;
+ bool visit(ArrayTypeName const& _node) override;
bool visit(InlineAssembly const& _node) override;
bool visit(Block const& _node) override;
+ bool visit(PlaceholderStatement const& _node) override;
bool visit(IfStatement const& _node) override;
bool visit(WhileStatement const& _node) override;
bool visit(ForStatement const& _node) override;
@@ -85,18 +95,28 @@ public:
bool visit(ElementaryTypeNameExpression const& _node) override;
bool visit(Literal const& _node) override;
+ void endVisit(SourceUnit const&) override;
void endVisit(ImportDirective const&) override;
void endVisit(ContractDefinition const&) override;
+ void endVisit(InheritanceSpecifier const&) override;
+ void endVisit(UsingForDirective const&) override;
void endVisit(StructDefinition const&) override;
+ void endVisit(EnumDefinition const&) override;
+ void endVisit(EnumValue const&) override;
void endVisit(ParameterList const&) override;
void endVisit(FunctionDefinition const&) override;
void endVisit(VariableDeclaration const&) override;
+ void endVisit(ModifierDefinition const&) override;
+ void endVisit(ModifierInvocation const&) override;
+ void endVisit(EventDefinition const&) override;
void endVisit(TypeName const&) override;
void endVisit(ElementaryTypeName const&) override;
void endVisit(UserDefinedTypeName const&) override;
void endVisit(Mapping const&) override;
+ void endVisit(ArrayTypeName const&) override;
void endVisit(InlineAssembly const&) override;
void endVisit(Block const&) override;
+ void endVisit(PlaceholderStatement const&) override;
void endVisit(IfStatement const&) override;
void endVisit(WhileStatement const&) override;
void endVisit(ForStatement const&) override;
@@ -121,11 +141,10 @@ public:
private:
void process();
- void addKeyValue(Json::Value& _obj, std::string const& _key, std::string const& _val);
void addJsonNode(
ASTNode const& _node,
std::string const& _nodeName,
- std::initializer_list<std::pair<std::string const, std::string const>> _list,
+ std::initializer_list<std::pair<std::string const, Json::Value const>> _attributes,
bool _hasChildren
);
std::string sourceLocationToString(SourceLocation const& _location) const;
diff --git a/libsolidity/formal/Why3Translator.cpp b/libsolidity/formal/Why3Translator.cpp
index bd0a020d..e16c41ab 100644
--- a/libsolidity/formal/Why3Translator.cpp
+++ b/libsolidity/formal/Why3Translator.cpp
@@ -466,7 +466,8 @@ bool Why3Translator::visit(BinaryOperation const& _binaryOperation)
auto const& constantNumber = dynamic_cast<RationalNumberType const&>(commonType);
if (constantNumber.isFractional())
error(_binaryOperation, "Fractional numbers not supported.");
- add("(of_int " + toString(commonType.literalValue(nullptr)) + ")");
+ else
+ add("(of_int " + toString(commonType.literalValue(nullptr)) + ")");
return false;
}
static const map<Token::Value, char const*> optrans({
@@ -488,7 +489,10 @@ bool Why3Translator::visit(BinaryOperation const& _binaryOperation)
{Token::GreaterThanOrEqual, " >= "}
});
if (!optrans.count(c_op))
+ {
error(_binaryOperation, "Operator not supported.");
+ return true;
+ }
add("(");
leftExpression.accept(*this);
@@ -676,7 +680,8 @@ bool Why3Translator::visit(Literal const& _literal)
auto const& constantNumber = dynamic_cast<RationalNumberType const&>(*type);
if (constantNumber.isFractional())
error(_literal, "Fractional numbers not supported.");
- add("(of_int " + toString(type->literalValue(&_literal)) + ")");
+ else
+ add("(of_int " + toString(type->literalValue(&_literal)) + ")");
break;
}
default: