diff --git a/apps/remix-ide-e2e/src/tests/generalSettings.test.ts b/apps/remix-ide-e2e/src/tests/generalSettings.test.ts index a3ddde4d1d..cff0a64686 100644 --- a/apps/remix-ide-e2e/src/tests/generalSettings.test.ts +++ b/apps/remix-ide-e2e/src/tests/generalSettings.test.ts @@ -178,8 +178,8 @@ const remixIdeThemes = { primary: '#2A9FD6', secondary: '#555', success: '#77B300', - info: '#9933CC', - warning: '#FF8800', - danger: '#CC0000' + info: '#93C', + warning: '#F80', + danger: '#C00' } } diff --git a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts index fa4c9ff375..587faa82b1 100644 --- a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts +++ b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts @@ -57,8 +57,22 @@ module.exports = { browser .addFile('Untitled7.sol', sources[6]['browser/Untitled7.sol']) .clickLaunchIcon('fileExplorers') - .verifyContracts(['test11', 'ERC20', 'SafeMath'], {wait: 10000}) - .end() + .verifyContracts(['test11', 'ERC20', 'SafeMath'], {wait: 10000}) + }, + + 'Test switch to a github import from a solidity warning': function (browser: NightwatchBrowser) { + browser + .setSolidityCompilerVersion('soljson-v0.7.4+commit.3f05b770.js') + .addFile('Untitled8.sol', sources[7]['browser/Untitled8.sol']) + .clickLaunchIcon('fileExplorers') + .clickLaunchIcon('solidity') + .waitForElementPresent('[data-id="compiledErrors"] div:nth-child(3)') + .click('[data-id="compiledErrors"] div:nth-child(3)') // select the second warning which point to ERC20 code + .getEditorValue((content) => { + browser.assert.ok(content.indexOf(`contract ERC20 is Context, IERC20`) != -1, + 'current displayed content should be from the ERC20 source code') + }) + .end() }, tearDown: sauce } @@ -85,5 +99,8 @@ const sources = [ }, { 'browser/Untitled7.sol': {content: 'import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/token/ERC20/ERC20.sol"; contract test11 {}'} + }, + { + 'browser/Untitled8.sol': {content: 'import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/master/contracts/token/ERC20/ERC20.sol"; contract test12 {}'} } ] diff --git a/apps/remix-ide/src/app/ui/renderer.js b/apps/remix-ide/src/app/ui/renderer.js index e948adbc9f..7669470387 100644 --- a/apps/remix-ide/src/app/ui/renderer.js +++ b/apps/remix-ide/src/app/ui/renderer.js @@ -81,18 +81,24 @@ Renderer.prototype.error = function (message, container, opt) { text = message.innerText } - var errLocation = text.match(/^([^:]*):([0-9]*):(([0-9]*):)? /) - if ((!opt.errFile || !opt.errCol || !opt.errLine) && errLocation) { - errLocation = parseRegExError(errLocation) - opt.errFile = errLocation.errFile - opt.errLine = errLocation.errLine - opt.errCol = errLocation.errCol - } + // ^ e.g: + // browser/gm.sol: Warning: Source file does not specify required compiler version! Consider adding "pragma solidity ^0.6.12 + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/introspection/IERC1820Registry.sol:3:1: ParserError: Source file requires different compiler version (current compiler is 0.7.4+commit.3f05b770.Emscripten.clang) - note that nightly builds are considered to be strictly less than the released version + + // extract line / column + let position = text.match(/^(.*?):([0-9]*?):([0-9]*?)?/) + opt.errLine = position ? parseInt(position[2]) - 1 : -1 + opt.errCol = position ? parseInt(position[3]) : -1 + - if (!opt.noAnnotations && errLocation) { - this._error(errLocation.errFile, { - row: errLocation.errLine, - column: errLocation.errCol, + // extract file + position = text.match(/^(https:.*?|http:.*?|.*?):/) + opt.errFile = position ? position[1] : '' + + if (!opt.noAnnotations && opt.errFile) { + this._error(opt.errFile, { + row: opt.errLine, + column: opt.errCol, text: text, type: opt.type }) @@ -107,7 +113,7 @@ Renderer.prototype.error = function (message, container, opt) { $error.click((ev) => { if (opt.click) { opt.click(message) - } else if (opt.errFile && opt.errLine && opt.errCol) { + } else if (opt.errFile !== undefined && opt.errLine !== undefined && opt.errCol !== undefined) { this._errorClick(opt.errFile, opt.errLine, opt.errCol) } }) @@ -119,12 +125,4 @@ Renderer.prototype.error = function (message, container, opt) { }) } -function parseRegExError (err) { - return { - errFile: err[1], - errLine: parseInt(err[2], 10) - 1, - errCol: err[4] ? parseInt(err[4], 10) : 0 - } -} - module.exports = Renderer