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