mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
JSON compiler.
This commit is contained in:
parent
a44bcb6909
commit
83cc8dfe00
@ -78,10 +78,16 @@ ASTJsonConverter::ASTJsonConverter(ASTNode const& _ast): m_ast(&_ast)
|
|||||||
|
|
||||||
void ASTJsonConverter::print(ostream& _stream)
|
void ASTJsonConverter::print(ostream& _stream)
|
||||||
{
|
{
|
||||||
m_ast->accept(*this);
|
process();
|
||||||
_stream << m_astJson;
|
_stream << m_astJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Json::Value const& ASTJsonConverter::json()
|
||||||
|
{
|
||||||
|
process();
|
||||||
|
return m_astJson;
|
||||||
|
}
|
||||||
|
|
||||||
bool ASTJsonConverter::visit(ImportDirective const& _node)
|
bool ASTJsonConverter::visit(ImportDirective const& _node)
|
||||||
{
|
{
|
||||||
addJsonNode("Import", { make_pair("file", _node.getIdentifier())});
|
addJsonNode("Import", { make_pair("file", _node.getIdentifier())});
|
||||||
@ -460,6 +466,13 @@ void ASTJsonConverter::endVisit(Literal const&)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTJsonConverter::process()
|
||||||
|
{
|
||||||
|
if (!processed)
|
||||||
|
m_ast->accept(*this);
|
||||||
|
processed = true;
|
||||||
|
}
|
||||||
|
|
||||||
string ASTJsonConverter::getType(Expression const& _expression)
|
string ASTJsonConverter::getType(Expression const& _expression)
|
||||||
{
|
{
|
||||||
return (_expression.getType()) ? _expression.getType()->toString() : "Unknown";
|
return (_expression.getType()) ? _expression.getType()->toString() : "Unknown";
|
||||||
|
@ -44,6 +44,7 @@ public:
|
|||||||
ASTJsonConverter(ASTNode const& _ast);
|
ASTJsonConverter(ASTNode const& _ast);
|
||||||
/// Output the json representation of the AST to _stream.
|
/// Output the json representation of the AST to _stream.
|
||||||
void print(std::ostream& _stream);
|
void print(std::ostream& _stream);
|
||||||
|
Json::Value const& json();
|
||||||
|
|
||||||
bool visit(ImportDirective const& _node) override;
|
bool visit(ImportDirective const& _node) override;
|
||||||
bool visit(ContractDefinition const& _node) override;
|
bool visit(ContractDefinition const& _node) override;
|
||||||
@ -114,6 +115,7 @@ public:
|
|||||||
void endVisit(Literal const&) override;
|
void endVisit(Literal const&) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void process();
|
||||||
void addKeyValue(Json::Value& _obj, std::string const& _key, std::string const& _val);
|
void addKeyValue(Json::Value& _obj, std::string const& _key, std::string const& _val);
|
||||||
void addJsonNode(std::string const& _nodeName,
|
void addJsonNode(std::string const& _nodeName,
|
||||||
std::initializer_list<std::pair<std::string const, std::string const>> _list,
|
std::initializer_list<std::pair<std::string const, std::string const>> _list,
|
||||||
@ -123,8 +125,9 @@ private:
|
|||||||
{
|
{
|
||||||
solAssert(!m_jsonNodePtrs.empty(), "Uneven json nodes stack. Internal error.");
|
solAssert(!m_jsonNodePtrs.empty(), "Uneven json nodes stack. Internal error.");
|
||||||
m_jsonNodePtrs.pop();
|
m_jsonNodePtrs.pop();
|
||||||
};
|
}
|
||||||
|
|
||||||
|
bool processed = false;
|
||||||
Json::Value m_astJson;
|
Json::Value m_astJson;
|
||||||
std::stack<Json::Value*> m_jsonNodePtrs;
|
std::stack<Json::Value*> m_jsonNodePtrs;
|
||||||
std::string m_source;
|
std::string m_source;
|
||||||
|
@ -43,9 +43,9 @@ public:
|
|||||||
bytes getRuntimeBytecode() { return m_runtimeContext.getAssembledBytecode(m_optimize);}
|
bytes getRuntimeBytecode() { return m_runtimeContext.getAssembledBytecode(m_optimize);}
|
||||||
/// @arg _sourceCodes is the map of input files to source code strings
|
/// @arg _sourceCodes is the map of input files to source code strings
|
||||||
/// @arg _inJsonFromat shows whether the out should be in Json format
|
/// @arg _inJsonFromat shows whether the out should be in Json format
|
||||||
void streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
|
Json::Value streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
|
||||||
{
|
{
|
||||||
m_context.streamAssembly(_stream, _sourceCodes, _inJsonFormat);
|
return m_context.streamAssembly(_stream, _sourceCodes, _inJsonFormat);
|
||||||
}
|
}
|
||||||
/// @returns Assembly items of the normal compiler context
|
/// @returns Assembly items of the normal compiler context
|
||||||
eth::AssemblyItems const& getAssemblyItems() const { return m_context.getAssembly().getItems(); }
|
eth::AssemblyItems const& getAssemblyItems() const { return m_context.getAssembly().getItems(); }
|
||||||
|
@ -123,9 +123,9 @@ public:
|
|||||||
eth::Assembly const& getAssembly() const { return m_asm; }
|
eth::Assembly const& getAssembly() const { return m_asm; }
|
||||||
/// @arg _sourceCodes is the map of input files to source code strings
|
/// @arg _sourceCodes is the map of input files to source code strings
|
||||||
/// @arg _inJsonFormat shows whether the out should be in Json format
|
/// @arg _inJsonFormat shows whether the out should be in Json format
|
||||||
void streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
|
Json::Value streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
|
||||||
{
|
{
|
||||||
m_asm.stream(_stream, "", _sourceCodes, _inJsonFormat);
|
return m_asm.stream(_stream, "", _sourceCodes, _inJsonFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes getAssembledBytecode(bool _optimize = false) { return m_asm.optimise(_optimize).assemble(); }
|
bytes getAssembledBytecode(bool _optimize = false) { return m_asm.optimise(_optimize).assemble(); }
|
||||||
|
@ -184,13 +184,16 @@ dev::h256 CompilerStack::getContractCodeHash(string const& _contractName) const
|
|||||||
return dev::sha3(getRuntimeBytecode(_contractName));
|
return dev::sha3(getRuntimeBytecode(_contractName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName, StringMap _sourceCodes, bool _inJsonFormat) const
|
Json::Value CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName, StringMap _sourceCodes, bool _inJsonFormat) const
|
||||||
{
|
{
|
||||||
Contract const& contract = getContract(_contractName);
|
Contract const& contract = getContract(_contractName);
|
||||||
if (contract.compiler)
|
if (contract.compiler)
|
||||||
contract.compiler->streamAssembly(_outStream, _sourceCodes, _inJsonFormat);
|
return contract.compiler->streamAssembly(_outStream, _sourceCodes, _inJsonFormat);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
_outStream << "Contract not fully implemented" << endl;
|
_outStream << "Contract not fully implemented" << endl;
|
||||||
|
return Json::Value();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string const& CompilerStack::getInterface(string const& _contractName) const
|
string const& CompilerStack::getInterface(string const& _contractName) const
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
|
#include <json/json.h>
|
||||||
#include <libdevcore/Common.h>
|
#include <libdevcore/Common.h>
|
||||||
#include <libdevcore/FixedHash.h>
|
#include <libdevcore/FixedHash.h>
|
||||||
|
|
||||||
@ -104,7 +105,7 @@ public:
|
|||||||
/// @arg _sourceCodes is the map of input files to source code strings
|
/// @arg _sourceCodes is the map of input files to source code strings
|
||||||
/// @arg _inJsonFromat shows whether the out should be in Json format
|
/// @arg _inJsonFromat shows whether the out should be in Json format
|
||||||
/// Prerequisite: Successful compilation.
|
/// Prerequisite: Successful compilation.
|
||||||
void streamAssembly(std::ostream& _outStream, std::string const& _contractName = "", StringMap _sourceCodes = StringMap(), bool _inJsonFormat = false) const;
|
Json::Value streamAssembly(std::ostream& _outStream, std::string const& _contractName = "", StringMap _sourceCodes = StringMap(), bool _inJsonFormat = false) const;
|
||||||
|
|
||||||
/// Returns a string representing the contract interface in JSON.
|
/// Returns a string representing the contract interface in JSON.
|
||||||
/// Prerequisite: Successful call to parse or compile.
|
/// Prerequisite: Successful call to parse or compile.
|
||||||
|
Loading…
Reference in New Issue
Block a user