mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Properly assign source names for AST import.
This commit is contained in:
		
							parent
							
								
									f75b55071e
								
							
						
					
					
						commit
						01dc77e5a2
					
				| @ -22,31 +22,31 @@ | |||||||
| #include <boost/algorithm/string.hpp> | #include <boost/algorithm/string.hpp> | ||||||
| 
 | 
 | ||||||
| using namespace solidity; | using namespace solidity; | ||||||
| namespace solidity::langutil | using namespace solidity::langutil; | ||||||
| { | using namespace std; | ||||||
| 
 | 
 | ||||||
| SourceLocation const parseSourceLocation(std::string const& _input, std::string const& _sourceName, size_t _maxIndex) | SourceLocation solidity::langutil::parseSourceLocation(string const& _input, vector<shared_ptr<string const>> const& _sourceNames) | ||||||
| { | { | ||||||
| 	// Expected input: "start:length:sourceindex"
 | 	// Expected input: "start:length:sourceindex"
 | ||||||
| 	enum SrcElem: size_t { Start, Length, Index }; | 	enum SrcElem: size_t { Start, Length, Index }; | ||||||
| 
 | 
 | ||||||
| 	std::vector<std::string> pos; | 	vector<string> pos; | ||||||
| 
 | 
 | ||||||
| 	boost::algorithm::split(pos, _input, boost::is_any_of(":")); | 	boost::algorithm::split(pos, _input, boost::is_any_of(":")); | ||||||
| 
 | 
 | ||||||
| 	// TODO What to do with sourceIndex?
 |  | ||||||
| 	solAssert(pos.size() == 3, "SourceLocation string must have 3 colon separated numeric fields."); | 	solAssert(pos.size() == 3, "SourceLocation string must have 3 colon separated numeric fields."); | ||||||
| 	auto const sourceIndex = stoi(pos[Index]); | 	auto const sourceIndex = stoi(pos[Index]); | ||||||
| 
 | 
 | ||||||
| 	astAssert( | 	astAssert( | ||||||
| 		sourceIndex == -1 || _maxIndex >= static_cast<size_t>(sourceIndex), | 		sourceIndex == -1 || (0 <= sourceIndex && static_cast<size_t>(sourceIndex) < _sourceNames.size()), | ||||||
| 		"'src'-field ill-formatted or src-index too high" | 		"'src'-field ill-formatted or src-index too high" | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	int start = stoi(pos[Start]); | 	int start = stoi(pos[Start]); | ||||||
| 	int end = start + stoi(pos[Length]); | 	int end = start + stoi(pos[Length]); | ||||||
| 
 | 
 | ||||||
| 	return SourceLocation{start, end, std::make_shared<std::string>(_sourceName)}; | 	SourceLocation result{start, end, {}}; | ||||||
| } | 	if (sourceIndex != -1) | ||||||
| 
 | 		result.sourceName = _sourceNames.at(static_cast<size_t>(sourceIndex)); | ||||||
|  | 	return result; | ||||||
| } | } | ||||||
|  | |||||||
| @ -106,10 +106,9 @@ struct SourceLocation | |||||||
| 	std::shared_ptr<std::string const> sourceName; | 	std::shared_ptr<std::string const> sourceName; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| SourceLocation const parseSourceLocation( | SourceLocation parseSourceLocation( | ||||||
| 	std::string const& _input, | 	std::string const& _input, | ||||||
| 	std::string const& _sourceName, | 	std::vector<std::shared_ptr<std::string const>> const& _sourceNames | ||||||
| 	size_t _maxIndex = std::numeric_limits<size_t>::max() |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /// Stream output for Location (used e.g. in boost exceptions).
 | /// Stream output for Location (used e.g. in boost exceptions).
 | ||||||
|  | |||||||
| @ -57,14 +57,12 @@ ASTPointer<T> ASTJsonImporter::nullOrCast(Json::Value const& _json) | |||||||
| 
 | 
 | ||||||
| map<string, ASTPointer<SourceUnit>> ASTJsonImporter::jsonToSourceUnit(map<string, Json::Value> const& _sourceList) | map<string, ASTPointer<SourceUnit>> ASTJsonImporter::jsonToSourceUnit(map<string, Json::Value> const& _sourceList) | ||||||
| { | { | ||||||
| 	m_sourceList = _sourceList; |  | ||||||
| 	for (auto const& src: _sourceList) | 	for (auto const& src: _sourceList) | ||||||
| 		m_sourceLocations.emplace_back(make_shared<string const>(src.first)); | 		m_sourceNames.emplace_back(make_shared<string const>(src.first)); | ||||||
| 	for (auto const& srcPair: m_sourceList) | 	for (auto const& srcPair: _sourceList) | ||||||
| 	{ | 	{ | ||||||
| 		astAssert(!srcPair.second.isNull(), ""); | 		astAssert(!srcPair.second.isNull(), ""); | ||||||
| 		astAssert(member(srcPair.second,"nodeType") == "SourceUnit", "The 'nodeType' of the highest node must be 'SourceUnit'."); | 		astAssert(member(srcPair.second,"nodeType") == "SourceUnit", "The 'nodeType' of the highest node must be 'SourceUnit'."); | ||||||
| 		m_currentSourceName = srcPair.first; |  | ||||||
| 		m_sourceUnits[srcPair.first] = createSourceUnit(srcPair.second, srcPair.first); | 		m_sourceUnits[srcPair.first] = createSourceUnit(srcPair.second, srcPair.first); | ||||||
| 	} | 	} | ||||||
| 	return m_sourceUnits; | 	return m_sourceUnits; | ||||||
| @ -94,14 +92,14 @@ SourceLocation const ASTJsonImporter::createSourceLocation(Json::Value const& _n | |||||||
| { | { | ||||||
| 	astAssert(member(_node, "src").isString(), "'src' must be a string"); | 	astAssert(member(_node, "src").isString(), "'src' must be a string"); | ||||||
| 
 | 
 | ||||||
| 	return solidity::langutil::parseSourceLocation(_node["src"].asString(), m_currentSourceName, m_sourceLocations.size()); | 	return solidity::langutil::parseSourceLocation(_node["src"].asString(), m_sourceNames); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| SourceLocation ASTJsonImporter::createNameSourceLocation(Json::Value const& _node) | SourceLocation ASTJsonImporter::createNameSourceLocation(Json::Value const& _node) | ||||||
| { | { | ||||||
| 	astAssert(member(_node, "nameLocation").isString(), "'nameLocation' must be a string"); | 	astAssert(member(_node, "nameLocation").isString(), "'nameLocation' must be a string"); | ||||||
| 
 | 
 | ||||||
| 	return solidity::langutil::parseSourceLocation(_node["nameLocation"].asString(), m_currentSourceName, m_sourceLocations.size()); | 	return solidity::langutil::parseSourceLocation(_node["nameLocation"].asString(), m_sourceNames); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template<class T> | template<class T> | ||||||
| @ -616,7 +614,7 @@ ASTPointer<InlineAssembly> ASTJsonImporter::createInlineAssembly(Json::Value con | |||||||
| 	astAssert(m_evmVersion == evmVersion, "Imported tree evm version differs from configured evm version!"); | 	astAssert(m_evmVersion == evmVersion, "Imported tree evm version differs from configured evm version!"); | ||||||
| 
 | 
 | ||||||
| 	yul::Dialect const& dialect = yul::EVMDialect::strictAssemblyForEVM(evmVersion.value()); | 	yul::Dialect const& dialect = yul::EVMDialect::strictAssemblyForEVM(evmVersion.value()); | ||||||
| 	shared_ptr<yul::Block> operations = make_shared<yul::Block>(yul::AsmJsonImporter(m_currentSourceName).createBlock(member(_node, "AST"))); | 	shared_ptr<yul::Block> operations = make_shared<yul::Block>(yul::AsmJsonImporter(m_sourceNames).createBlock(member(_node, "AST"))); | ||||||
| 	return createASTNode<InlineAssembly>( | 	return createASTNode<InlineAssembly>( | ||||||
| 		_node, | 		_node, | ||||||
| 		nullOrASTString(_node, "documentation"), | 		nullOrASTString(_node, "documentation"), | ||||||
|  | |||||||
| @ -152,13 +152,10 @@ private: | |||||||
| 	///@}
 | 	///@}
 | ||||||
| 
 | 
 | ||||||
| 	// =========== member variables ===============
 | 	// =========== member variables ===============
 | ||||||
| 	/// Stores filepath as sourcenames to AST in JSON format
 | 	/// list of source names, order by source index
 | ||||||
| 	std::map<std::string, Json::Value> m_sourceList; | 	std::vector<std::shared_ptr<std::string const>> m_sourceNames; | ||||||
| 	/// list of filepaths (used as sourcenames)
 |  | ||||||
| 	std::vector<std::shared_ptr<std::string const>> m_sourceLocations; |  | ||||||
| 	/// filepath to AST
 | 	/// filepath to AST
 | ||||||
| 	std::map<std::string, ASTPointer<SourceUnit>> m_sourceUnits; | 	std::map<std::string, ASTPointer<SourceUnit>> m_sourceUnits; | ||||||
| 	std::string m_currentSourceName; |  | ||||||
| 	/// IDs already used by the nodes
 | 	/// IDs already used by the nodes
 | ||||||
| 	std::set<int64_t> m_usedIDs; | 	std::set<int64_t> m_usedIDs; | ||||||
| 	/// Configured EVM version
 | 	/// Configured EVM version
 | ||||||
|  | |||||||
| @ -45,7 +45,7 @@ SourceLocation const AsmJsonImporter::createSourceLocation(Json::Value const& _n | |||||||
| { | { | ||||||
| 	yulAssert(member(_node, "src").isString(), "'src' must be a string"); | 	yulAssert(member(_node, "src").isString(), "'src' must be a string"); | ||||||
| 
 | 
 | ||||||
| 	return solidity::langutil::parseSourceLocation(_node["src"].asString(), m_sourceName); | 	return solidity::langutil::parseSourceLocation(_node["src"].asString(), m_sourceNames); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template <class T> | template <class T> | ||||||
|  | |||||||
| @ -38,7 +38,9 @@ namespace solidity::yul | |||||||
| class AsmJsonImporter | class AsmJsonImporter | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	explicit AsmJsonImporter(std::string _sourceName) : m_sourceName(std::move(_sourceName)) {} | 	explicit AsmJsonImporter(std::vector<std::shared_ptr<std::string const>> const& _sourceNames): | ||||||
|  | 		m_sourceNames(_sourceNames) | ||||||
|  | 	{} | ||||||
| 	yul::Block createBlock(Json::Value const& _node); | 	yul::Block createBlock(Json::Value const& _node); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| @ -70,8 +72,7 @@ private: | |||||||
| 	yul::Break createBreak(Json::Value const& _node); | 	yul::Break createBreak(Json::Value const& _node); | ||||||
| 	yul::Continue createContinue(Json::Value const& _node); | 	yul::Continue createContinue(Json::Value const& _node); | ||||||
| 
 | 
 | ||||||
| 	std::string m_sourceName; | 	std::vector<std::shared_ptr<std::string const>> const& m_sourceNames; | ||||||
| 
 |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user