diff options
author | Alexey Shekhirin <a.shekhirin@gmail.com> | 2022-04-14 03:33:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-14 02:33:13 +0200 |
commit | 2001d1b65ebef08355d52159146a9f3513b26c0f (patch) | |
tree | f9c90b64be96edbdc9929503659b7d5076714ec5 /lib/compilers/solidity.js | |
parent | 89894f3e6732c6aba1d1c240e9ae15cd235223a5 (diff) | |
download | compiler-explorer-2001d1b65ebef08355d52159146a9f3513b26c0f.tar.gz compiler-explorer-2001d1b65ebef08355d52159146a9f3513b26c0f.zip |
Add support for Solidity (#3507)gh-2350
* feat(compilers): Solidity support MVP
* don't concat userOptions in optionsForFilter
* fixes after review
* Update etc/config/solidity.defaults.properties
Co-authored-by: Rubén Rincón Blanco <ruben@rinconblanco.es>
Co-authored-by: Rubén Rincón Blanco <ruben@rinconblanco.es>
Diffstat (limited to 'lib/compilers/solidity.js')
-rw-r--r-- | lib/compilers/solidity.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/lib/compilers/solidity.js b/lib/compilers/solidity.js new file mode 100644 index 000000000..6053de4ce --- /dev/null +++ b/lib/compilers/solidity.js @@ -0,0 +1,97 @@ +// Copyright (c) 2022, Compiler Explorer Authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import path from 'path'; + +import _ from 'underscore'; + +import { BaseCompiler } from '../base-compiler'; + +import { ClangParser } from './argument-parsers'; + +export class SolidityCompiler extends BaseCompiler { + static get key() { return 'solidity'; } + + getSharedLibraryPathsAsArguments() { + return []; + } + + getArgumentParser() { + return ClangParser; + } + + optionsForFilter(filters, outputFilename, userOptions) { + return [ + '--combined-json', 'asm', // We use it instead of `--asm-json` to have compacted json + '-o', 'contracts', + ]; + } + + isCfgCompiler(/*compilerVersion*/) { + return false; + } + + getOutputFilename(dirPath) { + return path.join(dirPath, 'contracts/combined.json'); + } + + processAsm(result) { + // Handle "error" documents. + if (!result.asm.includes('\n') && result.asm[0] === '<') { + return {asm: [{text: result.asm}]}; + } + + return { + asm: Object.entries(JSON.parse(result.asm).contracts) + .sort(([_name1, data1], [_name2, data2]) => + data1.asm['.code'][0].begin - data2.asm['.code'][0].begin, + ) + .map(([name, data]) => { + const processOpcodes = (opcodes, indent) => opcodes + .map(opcode => + `${opcode.name}${opcode.value !== undefined ? ` ${opcode.value}` : ''}`, + ) + .map(opcode => + (indent || '') + (opcode.startsWith('tag') ? opcode : `\t${opcode}`), + ); + + return [ + `// ${_.last(name.split(':'))}`, + '.code', + processOpcodes(data.asm['.code']), + '.data', + Object.entries(data.asm['.data']).map(([id, {'.code': code}]) => [ + `\t${id}:`, + '\t\t.code', + processOpcodes(code, '\t\t'), + ]), + '\n', + ]; + }) + .flat(Infinity) + .slice(0, -1) + .map(line => ({text: line})), + }; + } +} |