diff options
author | Christian <c@ethdev.com> | 2015-01-28 15:50:53 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-04-22 17:33:25 +0800 |
commit | 83cc8dfe008341948306fd38e5405429753cb8d0 (patch) | |
tree | f9e8fca70aad6cbea6681f445414bb763a1637cd | |
parent | a44bcb6909478543151cac871fdbbc4909ad54aa (diff) | |
download | dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.gz dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.bz2 dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.lz dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.xz dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.zst dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.zip |
JSON compiler.
-rw-r--r-- | ASTJsonConverter.cpp | 17 | ||||
-rw-r--r-- | ASTJsonConverter.h | 5 | ||||
-rw-r--r-- | Compiler.h | 4 | ||||
-rw-r--r-- | CompilerContext.h | 4 | ||||
-rw-r--r-- | CompilerStack.cpp | 7 | ||||
-rw-r--r-- | CompilerStack.h | 3 |
6 files changed, 30 insertions, 10 deletions
diff --git a/ASTJsonConverter.cpp b/ASTJsonConverter.cpp index c30e4ca2..be89de92 100644 --- a/ASTJsonConverter.cpp +++ b/ASTJsonConverter.cpp @@ -78,10 +78,16 @@ ASTJsonConverter::ASTJsonConverter(ASTNode const& _ast): m_ast(&_ast) void ASTJsonConverter::print(ostream& _stream) { - m_ast->accept(*this); + process(); _stream << m_astJson; } +Json::Value const& ASTJsonConverter::json() +{ + process(); + return m_astJson; +} + bool ASTJsonConverter::visit(ImportDirective const& _node) { addJsonNode("Import", { make_pair("file", _node.getIdentifier())}); @@ -460,9 +466,16 @@ void ASTJsonConverter::endVisit(Literal const&) { } +void ASTJsonConverter::process() +{ + if (!processed) + m_ast->accept(*this); + processed = true; +} + string ASTJsonConverter::getType(Expression const& _expression) { - return (_expression.getType()) ? _expression.getType()->toString() : "Unknown"; + return (_expression.getType()) ? _expression.getType()->toString() : "Unknown"; } } diff --git a/ASTJsonConverter.h b/ASTJsonConverter.h index 30a92e66..56502ab3 100644 --- a/ASTJsonConverter.h +++ b/ASTJsonConverter.h @@ -44,6 +44,7 @@ public: ASTJsonConverter(ASTNode const& _ast); /// Output the json representation of the AST to _stream. void print(std::ostream& _stream); + Json::Value const& json(); bool visit(ImportDirective const& _node) override; bool visit(ContractDefinition const& _node) override; @@ -114,6 +115,7 @@ public: void endVisit(Literal const&) override; private: + void process(); void addKeyValue(Json::Value& _obj, std::string const& _key, std::string const& _val); void addJsonNode(std::string const& _nodeName, 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."); m_jsonNodePtrs.pop(); - }; + } + bool processed = false; Json::Value m_astJson; std::stack<Json::Value*> m_jsonNodePtrs; std::string m_source; @@ -43,9 +43,9 @@ public: bytes getRuntimeBytecode() { return m_runtimeContext.getAssembledBytecode(m_optimize);} /// @arg _sourceCodes is the map of input files to source code strings /// @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 eth::AssemblyItems const& getAssemblyItems() const { return m_context.getAssembly().getItems(); } diff --git a/CompilerContext.h b/CompilerContext.h index 34a3f97c..0ca6369d 100644 --- a/CompilerContext.h +++ b/CompilerContext.h @@ -123,9 +123,9 @@ public: eth::Assembly const& getAssembly() const { return m_asm; } /// @arg _sourceCodes is the map of input files to source code strings /// @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(); } diff --git a/CompilerStack.cpp b/CompilerStack.cpp index d6274e2c..a2a17831 100644 --- a/CompilerStack.cpp +++ b/CompilerStack.cpp @@ -184,13 +184,16 @@ dev::h256 CompilerStack::getContractCodeHash(string const& _contractName) const 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); if (contract.compiler) - contract.compiler->streamAssembly(_outStream, _sourceCodes, _inJsonFormat); + return contract.compiler->streamAssembly(_outStream, _sourceCodes, _inJsonFormat); else + { _outStream << "Contract not fully implemented" << endl; + return Json::Value(); + } } string const& CompilerStack::getInterface(string const& _contractName) const diff --git a/CompilerStack.h b/CompilerStack.h index 2e7c217d..6f90a846 100644 --- a/CompilerStack.h +++ b/CompilerStack.h @@ -28,6 +28,7 @@ #include <memory> #include <vector> #include <boost/noncopyable.hpp> +#include <json/json.h> #include <libdevcore/Common.h> #include <libdevcore/FixedHash.h> @@ -104,7 +105,7 @@ public: /// @arg _sourceCodes is the map of input files to source code strings /// @arg _inJsonFromat shows whether the out should be in Json format /// 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. /// Prerequisite: Successful call to parse or compile. |