From 64bb57c156b7ddd848957d8b34f4b56c34baa671 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Tue, 12 Sep 2023 12:02:45 +0200 Subject: [PATCH] fix timestamp compiler --- .../parser/services/code-parser-compiler.ts | 9 ++++--- .../services/code-parser-gas-service.ts | 5 +++- libs/remix-solidity/src/compiler/compiler.ts | 27 ++++++++++++------- libs/remix-solidity/src/compiler/types.ts | 2 +- .../editor/src/lib/providers/quickfixes.ts | 18 ++++++++++++- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/parser/services/code-parser-compiler.ts b/apps/remix-ide/src/app/plugins/parser/services/code-parser-compiler.ts index b3a1a9c322..ecd8278ca3 100644 --- a/apps/remix-ide/src/app/plugins/parser/services/code-parser-compiler.ts +++ b/apps/remix-ide/src/app/plugins/parser/services/code-parser-compiler.ts @@ -99,21 +99,24 @@ export default class CodeParserCompiler { await this.clearDecorators(result.getSourceCode().sources) } - if (!data.sources) return if (data.sources && Object.keys(data.sources).length === 0) return this.plugin.compilerAbstract = new CompilerAbstract('soljson', data, source, input) this.errorState = false + this.plugin.nodeIndex = { declarations: {}, flatReferences: {}, nodesPerFile: {}, } - + this.plugin._buildIndex(data, source) // cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository - this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult) + const extractedFiledNodes = this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult) + if(extractedFiledNodes) { + this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = extractedFiledNodes + } await this.plugin.gasService.showGasEstimates() this.plugin.emit('astFinished') } diff --git a/apps/remix-ide/src/app/plugins/parser/services/code-parser-gas-service.ts b/apps/remix-ide/src/app/plugins/parser/services/code-parser-gas-service.ts index 274466fe9c..34e86290c1 100644 --- a/apps/remix-ide/src/app/plugins/parser/services/code-parser-gas-service.ts +++ b/apps/remix-ide/src/app/plugins/parser/services/code-parser-gas-service.ts @@ -42,7 +42,10 @@ export default class CodeParserGasService { } this.plugin.currentFile = await this.plugin.call('fileManager', 'file') // cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository - this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = await this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult) + const extractedFiledNodes = await this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult) + if(extractedFiledNodes) { + this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = extractedFiledNodes + } const gasEstimates = await this.getGasEstimates(this.plugin.currentFile) diff --git a/libs/remix-solidity/src/compiler/compiler.ts b/libs/remix-solidity/src/compiler/compiler.ts index 77e50a5845..53da05881c 100644 --- a/libs/remix-solidity/src/compiler/compiler.ts +++ b/libs/remix-solidity/src/compiler/compiler.ts @@ -49,6 +49,7 @@ export class Compiler { if (success && this.state.compilationStartTime) { this.event.trigger('compilationDuration', [(new Date().getTime()) - this.state.compilationStartTime]) } + console.log('compilationStartTime to null', this.state.compilationStartTime, data) this.state.compilationStartTime = null }) @@ -81,12 +82,16 @@ export class Compiler { * @param missingInputs missing import file path list */ - internalCompile(files: Source, missingInputs?: string[]): void { + internalCompile(files: Source, missingInputs?: string[], timeStamp?: number): void { + if(timeStamp != this.state.compilationStartTime && this.state.compilerRetriggerMode == CompilerRetriggerMode.retrigger ) { + console.log('aborting compilation', timeStamp, this.state.compilationStartTime) + return + } this.gatherImports(files, missingInputs, (error, input) => { if (error) { this.state.lastCompilationResult = null this.event.trigger('compilationFinished', [false, { error: { formattedMessage: error, severity: 'error' } }, files, input, this.state.currentVersion]) - } else if (this.state.compileJSON && input) { this.state.compileJSON(input) } + } else if (this.state.compileJSON && input) { this.state.compileJSON(input, timeStamp) } }) } @@ -99,8 +104,9 @@ export class Compiler { compile(files: Source, target: string): void { this.state.target = target this.state.compilationStartTime = new Date().getTime() + console.log('compiling ' + target + '...', files, this.state.compilationStartTime) this.event.trigger('compilationStarted', []) - this.internalCompile(files) + this.internalCompile(files, null, this.state.compilationStartTime) } /** @@ -157,7 +163,7 @@ export class Compiler { * @param source Source */ - onCompilationFinished(data: CompilationResult, missingInputs?: string[], source?: SourceWithTarget, input?: string, version?: string): void { + onCompilationFinished(data: CompilationResult, missingInputs?: string[], source?: SourceWithTarget, input?: string, version?: string, timeStamp?: number): void { let noFatalErrors = true // ie warnings are ok const checkIfFatalError = (error: CompilationError) => { @@ -173,7 +179,7 @@ export class Compiler { this.event.trigger('compilationFinished', [false, data, source, input, version]) } else if (missingInputs !== undefined && missingInputs.length > 0 && source && source.sources) { // try compiling again with the new set of inputs - this.internalCompile(source.sources, missingInputs) + this.internalCompile(source.sources, missingInputs, timeStamp) } else { data = this.updateInterface(data) if (source) { @@ -183,6 +189,7 @@ export class Compiler { source: source } } + console.log('compilationFinished ', timeStamp, this.state.compilationStartTime) this.event.trigger('compilationFinished', [true, data, source, input, version]) } } @@ -291,7 +298,9 @@ export class Compiler { this.state.worker.addEventListener('message', (msg: Record<'data', MessageFromWorker>) => { const data: MessageFromWorker = msg.data + console.log('incoming message', data.timestamp, data) if (this.state.compilerRetriggerMode == CompilerRetriggerMode.retrigger && data.timestamp !== this.state.compilationStartTime) { + console.log('dropping message', data.timestamp, this.state.compilationStartTime) return } switch (data.cmd) { @@ -312,7 +321,7 @@ export class Compiler { sources = jobs[data.job].sources delete jobs[data.job] } - this.onCompilationFinished(result, data.missingInputs, sources, data.input, this.state.currentVersion) + this.onCompilationFinished(result, data.missingInputs, sources, data.input, this.state.currentVersion, data.timestamp) } break } @@ -325,7 +334,7 @@ export class Compiler { this.onCompilationFinished({ error: { formattedMessage } }) }) - this.state.compileJSON = (source: SourceWithTarget) => { + this.state.compileJSON = (source: SourceWithTarget, timeStamp: number) => { if (source && source.sources) { const { optimize, runs, evmVersion, language, useFileConfiguration, configFileContent } = this.state jobs.push({ sources: source }) @@ -342,12 +351,12 @@ export class Compiler { return } - + console.log('posting message with timestamp ', this.state.compilationStartTime, source) this.state.worker.postMessage({ cmd: 'compile', job: jobs.length - 1, input: input, - timestamp: this.state.compilationStartTime + timestamp: timeStamp }) } } diff --git a/libs/remix-solidity/src/compiler/types.ts b/libs/remix-solidity/src/compiler/types.ts index fd1158e7f0..d86e7b0b74 100644 --- a/libs/remix-solidity/src/compiler/types.ts +++ b/libs/remix-solidity/src/compiler/types.ts @@ -160,7 +160,7 @@ export enum CompilerRetriggerMode { } export interface CompilerState { - compileJSON: ((input: SourceWithTarget) => void) | null, + compileJSON: ((input: SourceWithTarget, timeStamp?: number) => void) | null, worker: any, currentVersion: string| null| undefined, compilerLicense: string| null diff --git a/libs/remix-ui/editor/src/lib/providers/quickfixes.ts b/libs/remix-ui/editor/src/lib/providers/quickfixes.ts index 93f289de08..81556e3ef7 100644 --- a/libs/remix-ui/editor/src/lib/providers/quickfixes.ts +++ b/libs/remix-ui/editor/src/lib/providers/quickfixes.ts @@ -170,5 +170,21 @@ export default { title: "Add 'calldata' to param", message: ' calldata ' } + ], + 'SyntaxError: No visibility specified. Did you intend to add "external': [ + { + id: 12, + title: "Add visibility 'external'", + message: 'external ', + nodeType: 'FunctionDefinition' + } + ], + 'DeclarationError: Receive ether function must be payable, but is "nonpayable".': [ + { + id: 13, + title: "Make function 'payable'", + message: 'payable ', + nodeType: 'FunctionDefinition' + } ] -} +} \ No newline at end of file