mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #9078 from a3d4/fix-tabs-in-formatter
Fix tabs in SolcReferenceFormatterHuman
This commit is contained in:
		
						commit
						ebf5a8702f
					
				| @ -23,6 +23,7 @@ | ||||
| #include <liblangutil/Exceptions.h> | ||||
| #include <libsolutil/UTF8.h> | ||||
| #include <iomanip> | ||||
| #include <string_view> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace solidity; | ||||
| @ -30,6 +31,20 @@ using namespace solidity::langutil; | ||||
| using namespace solidity::util; | ||||
| using namespace solidity::util::formatting; | ||||
| 
 | ||||
| namespace | ||||
| { | ||||
| 
 | ||||
| std::string replaceNonTabs(std::string_view _utf8Input, char _filler) | ||||
| { | ||||
| 	std::string output; | ||||
| 	for (char const c: _utf8Input) | ||||
| 		if ((c & 0xc0) != 0x80) | ||||
| 			output.push_back(c == '\t' ? '\t' : _filler); | ||||
| 	return output; | ||||
| } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| AnsiColorized SourceReferenceFormatterHuman::normalColored() const | ||||
| { | ||||
| 	return AnsiColorized(m_stream, m_colored, {WHITE}); | ||||
| @ -85,6 +100,8 @@ void SourceReferenceFormatterHuman::printSourceLocation(SourceReference const& _ | ||||
| 	frameColored() << "-->"; | ||||
| 	m_stream << ' ' << _ref.sourceName << ':' << line << ':' << (_ref.position.column + 1) << ":\n"; | ||||
| 
 | ||||
| 	string_view text = _ref.text; | ||||
| 
 | ||||
| 	if (!_ref.multiline) | ||||
| 	{ | ||||
| 		int const locationLength = _ref.endColumn - _ref.startColumn; | ||||
| @ -96,21 +113,15 @@ void SourceReferenceFormatterHuman::printSourceLocation(SourceReference const& _ | ||||
| 
 | ||||
| 		// line 2:
 | ||||
| 		frameColored() << line << " |"; | ||||
| 		m_stream << ' ' << _ref.text.substr(0, _ref.startColumn); | ||||
| 		highlightColored() << _ref.text.substr(_ref.startColumn, locationLength); | ||||
| 		m_stream << _ref.text.substr(_ref.endColumn) << '\n'; | ||||
| 		m_stream << ' ' << text.substr(0, _ref.startColumn); | ||||
| 		highlightColored() << text.substr(_ref.startColumn, locationLength); | ||||
| 		m_stream << text.substr(_ref.endColumn) << '\n'; | ||||
| 
 | ||||
| 		// line 3:
 | ||||
| 		m_stream << leftpad << ' '; | ||||
| 		frameColored() << '|'; | ||||
| 		m_stream << ' '; | ||||
| 
 | ||||
| 		for_each( | ||||
| 			_ref.text.cbegin(), | ||||
| 			_ref.text.cbegin() + numCodepoints(_ref.text.substr(0, _ref.startColumn)), | ||||
| 			[this](char ch) { m_stream << (ch == '\t' ? '\t' : ' '); } | ||||
| 		); | ||||
| 		diagColored() << string(numCodepoints(_ref.text.substr(_ref.startColumn, locationLength)), '^'); | ||||
| 		m_stream << ' ' << replaceNonTabs(text.substr(0, _ref.startColumn), ' '); | ||||
| 		diagColored() << replaceNonTabs(text.substr(_ref.startColumn, locationLength), '^'); | ||||
| 		m_stream << '\n'; | ||||
| 	} | ||||
| 	else | ||||
| @ -122,13 +133,13 @@ void SourceReferenceFormatterHuman::printSourceLocation(SourceReference const& _ | ||||
| 
 | ||||
| 		// line 2:
 | ||||
| 		frameColored() << line << " |"; | ||||
| 		m_stream << ' ' << _ref.text.substr(0, _ref.startColumn); | ||||
| 		highlightColored() << _ref.text.substr(_ref.startColumn) << '\n'; | ||||
| 		m_stream << ' ' << text.substr(0, _ref.startColumn); | ||||
| 		highlightColored() << text.substr(_ref.startColumn) << '\n'; | ||||
| 
 | ||||
| 		// line 3:
 | ||||
| 		m_stream << leftpad << ' '; | ||||
| 		frameColored() << '|'; | ||||
| 		m_stream << ' ' << string(_ref.startColumn, ' '); | ||||
| 		m_stream << ' ' << replaceNonTabs(text.substr(0, _ref.startColumn), ' '); | ||||
| 		diagColored() << "^ (Relevant source part starts here and spans across multiple lines)."; | ||||
| 		m_stream << '\n'; | ||||
| 	} | ||||
|  | ||||
| @ -138,13 +138,4 @@ bool validateUTF8(std::string const& _input, size_t& _invalidPosition) | ||||
| 	return validateUTF8(reinterpret_cast<unsigned char const*>(_input.c_str()), _input.length(), _invalidPosition); | ||||
| } | ||||
| 
 | ||||
| size_t numCodepoints(std::string const& _utf8EncodedInput) | ||||
| { | ||||
| 	size_t codepoint = 0; | ||||
| 	for (char c: _utf8EncodedInput) | ||||
| 		codepoint += (c & 0xc0) != 0x80; | ||||
| 
 | ||||
| 	return codepoint; | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -38,6 +38,4 @@ inline bool validateUTF8(std::string const& _input) | ||||
| 	return validateUTF8(_input, invalidPos); | ||||
| } | ||||
| 
 | ||||
| size_t numCodepoints(std::string const& _utf8EncodedInput); | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -1,11 +0,0 @@ | ||||
| Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information. | ||||
| --> message_format_utf16/input.sol | ||||
| 
 | ||||
| Warning: Source file does not specify required compiler version! | ||||
| --> message_format_utf16/input.sol | ||||
| 
 | ||||
| Warning: Statement has no effect. | ||||
|  --> message_format_utf16/input.sol:2:58: | ||||
|   | | ||||
| 2 | /* ©©©©ᄅ©©©©© 2017 */ constructor () public { "©©©©ᄅ©©©©©" ; } | ||||
|   |                                               ^^^^^^^^^^^^ | ||||
| @ -1,3 +0,0 @@ | ||||
| contract Foo { | ||||
| /* ©©©©ᄅ©©©©© 2017 */ constructor () public { "©©©©ᄅ©©©©©" ; } | ||||
| } | ||||
							
								
								
									
										35
									
								
								test/cmdlineTests/message_format_utf8/err
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								test/cmdlineTests/message_format_utf8/err
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information. | ||||
| --> message_format_utf8/input.sol | ||||
| 
 | ||||
| Warning: Source file does not specify required compiler version! | ||||
| --> message_format_utf8/input.sol | ||||
| 
 | ||||
| Warning: Statement has no effect. | ||||
|  --> message_format_utf8/input.sol:2:58: | ||||
|   | | ||||
| 2 | /* ©©©©ᄅ©©©©© 2017 */ constructor () public { "©©©©ᄅ©©©©©" ; } | ||||
|   |                                               ^^^^^^^^^^^^ | ||||
| 
 | ||||
| Warning: Statement has no effect. | ||||
|  --> message_format_utf8/input.sol:6:25: | ||||
|   | | ||||
| 6 |                         "S = π × r²"; | ||||
|   |                         ^^^^^^^^^^^^ | ||||
| 
 | ||||
| Warning: Statement has no effect. | ||||
|  --> message_format_utf8/input.sol:7:39: | ||||
|   | | ||||
| 7 | /* ₀₁₂₃₄⁵⁶⁷⁸⁹ */		"∑ 1/n! ≈ 2.7";                 // tabs in-between | ||||
|   |                 		^^^^^^^^^^^^^^ | ||||
| 
 | ||||
| Warning: Statement has no effect. | ||||
|  --> message_format_utf8/input.sol:8:30: | ||||
|   | | ||||
| 8 | /* Ŀŏŗėɯ ïƥŝʉɱ */		"μὴ		χεῖρον		βέλτιστον"; // tabs in-between and inside | ||||
|   |                  		^^^		^^^^^^		^^^^^^^^^^ | ||||
| 
 | ||||
| Warning: Function state mutability can be restricted to pure | ||||
|   --> message_format_utf8/input.sol:12:2: | ||||
|    | | ||||
| 12 | 	function selector() public returns(uint) { // starts with tab | ||||
|    | 	^ (Relevant source part starts here and spans across multiple lines). | ||||
							
								
								
									
										15
									
								
								test/cmdlineTests/message_format_utf8/input.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								test/cmdlineTests/message_format_utf8/input.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| contract Foo { | ||||
| /* ©©©©ᄅ©©©©© 2017 */ constructor () public { "©©©©ᄅ©©©©©" ; } | ||||
| 
 | ||||
|     function f() public pure { | ||||
| 
 | ||||
|                         "S = π × r²"; | ||||
| /* ₀₁₂₃₄⁵⁶⁷⁸⁹ */		"∑ 1/n! ≈ 2.7";                 // tabs in-between | ||||
| /* Ŀŏŗėɯ ïƥŝʉɱ */		"μὴ		χεῖρον		βέλτιστον"; // tabs in-between and inside | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 	function selector() public returns(uint) { // starts with tab | ||||
| 		return 0; | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user