Merge pull request #1773 from ethereum/ASTEntry

Ast entry
This commit is contained in:
chriseth 2017-03-17 17:24:58 +01:00 committed by GitHub
commit c37397c178
2 changed files with 50 additions and 3 deletions

View File

@ -39,6 +39,21 @@ void ASTJsonConverter::addJsonNode(
initializer_list<pair<string const, Json::Value const>> _attributes,
bool _hasChildren = false
)
{
ASTJsonConverter::addJsonNode(
_node,
_nodeName,
std::vector<pair<string const, Json::Value const>>(_attributes),
_hasChildren
);
}
void ASTJsonConverter::addJsonNode(
ASTNode const& _node,
string const& _nodeName,
std::vector<pair<string const, Json::Value const>> const& _attributes,
bool _hasChildren = false
)
{
Json::Value node;
@ -183,11 +198,18 @@ bool ASTJsonConverter::visit(FunctionDefinition const& _node)
bool ASTJsonConverter::visit(VariableDeclaration const& _node)
{
addJsonNode(_node, "VariableDeclaration", {
std::vector<pair<string const, Json::Value const>> attributes = {
make_pair("name", _node.name()),
make_pair("type", type(_node))
}, true);
make_pair("type", type(_node)),
make_pair("constant", _node.isConstant()),
make_pair("storageLocation", location(_node.referenceLocation())),
make_pair("visibility", visibility(_node.visibility()))
};
if (m_inEvent)
attributes.push_back(make_pair("indexed", _node.isIndexed()));
addJsonNode(_node, "VariableDeclaration", attributes, true);
return true;
}
bool ASTJsonConverter::visit(ModifierDefinition const& _node)
@ -209,6 +231,7 @@ bool ASTJsonConverter::visit(TypeName const&)
bool ASTJsonConverter::visit(EventDefinition const& _node)
{
m_inEvent = true;
addJsonNode(_node, "EventDefinition", { make_pair("name", _node.name()) }, true);
return true;
}
@ -502,6 +525,7 @@ void ASTJsonConverter::endVisit(ModifierInvocation const&)
void ASTJsonConverter::endVisit(EventDefinition const&)
{
m_inEvent = false;
goUp();
}
@ -670,6 +694,21 @@ string ASTJsonConverter::visibility(Declaration::Visibility const& _visibility)
}
}
string ASTJsonConverter::location(VariableDeclaration::Location _location)
{
switch (_location)
{
case VariableDeclaration::Location::Default:
return "default";
case VariableDeclaration::Location::Storage:
return "storage";
case VariableDeclaration::Location::Memory:
return "memory";
default:
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Unknown declaration location."));
}
}
string ASTJsonConverter::type(Expression const& _expression)
{
return _expression.annotation().type ? _expression.annotation().type->toString() : "Unknown";

View File

@ -151,8 +151,15 @@ private:
std::initializer_list<std::pair<std::string const, Json::Value const>> _attributes,
bool _hasChildren
);
void addJsonNode(
ASTNode const& _node,
std::string const& _nodeName,
std::vector<std::pair<std::string const, Json::Value const>> const& _attributes,
bool _hasChildren
);
std::string sourceLocationToString(SourceLocation const& _location) const;
std::string visibility(Declaration::Visibility const& _visibility);
std::string location(VariableDeclaration::Location _location);
std::string type(Expression const& _expression);
std::string type(VariableDeclaration const& _varDecl);
inline void goUp()
@ -161,6 +168,7 @@ private:
m_jsonNodePtrs.pop();
}
bool m_inEvent = false; ///< whether we are currently inside an event or not
bool processed = false;
Json::Value m_astJson;
std::stack<Json::Value*> m_jsonNodePtrs;