| 1045 | } |
| 1046 | |
| 1047 | void CommandLineInterface::handleCombinedJSON() |
| 1048 | { |
| 1049 | solAssert(m_assemblyStack); |
| 1050 | solAssert( |
| 1051 | CompilerInputModes.count(m_options.input.mode) == 1 || |
| 1052 | m_options.input.mode == frontend::InputMode::EVMAssemblerJSON |
| 1053 | ); |
| 1054 | |
| 1055 | if (!m_options.compiler.combinedJsonRequests.has_value()) |
| 1056 | return; |
| 1057 | |
| 1058 | Json output; |
| 1059 | |
| 1060 | output[g_strVersion] = frontend::VersionString; |
| 1061 | std::vector<std::string> contracts = m_assemblyStack->contractNames(); |
| 1062 | |
| 1063 | if (!contracts.empty()) |
| 1064 | output[g_strContracts] = Json::object(); |
| 1065 | for (std::string const& contractName: contracts) |
| 1066 | { |
| 1067 | Json& contractData = output[g_strContracts][contractName] = Json::object(); |
| 1068 | |
| 1069 | // NOTE: The state checks here are more strict that in Standard JSON. There we allow |
| 1070 | // requesting certain outputs even if compilation fails as long as analysis went ok. |
| 1071 | if (m_compiler && m_compiler->compilationSuccessful()) |
| 1072 | { |
| 1073 | if (m_options.compiler.combinedJsonRequests->abi) |
| 1074 | contractData[g_strAbi] = m_compiler->contractABI(contractName); |
| 1075 | if (m_options.compiler.combinedJsonRequests->metadata) |
| 1076 | contractData["metadata"] = m_compiler->metadata(contractName); |
| 1077 | if (m_options.compiler.combinedJsonRequests->storageLayout) |
| 1078 | contractData[g_strStorageLayout] = m_compiler->storageLayout(contractName); |
| 1079 | if (m_options.compiler.combinedJsonRequests->transientStorageLayout) |
| 1080 | contractData[g_strTransientStorageLayout] = m_compiler->transientStorageLayout(contractName); |
| 1081 | if (m_options.compiler.combinedJsonRequests->generatedSources) |
| 1082 | contractData[g_strGeneratedSources] = m_compiler->generatedSources(contractName, false); |
| 1083 | if (m_options.compiler.combinedJsonRequests->generatedSourcesRuntime) |
| 1084 | contractData[g_strGeneratedSourcesRuntime] = m_compiler->generatedSources(contractName, true); |
| 1085 | if (m_options.compiler.combinedJsonRequests->signatureHashes) |
| 1086 | contractData[g_strSignatureHashes] = m_compiler->interfaceSymbols(contractName)["methods"]; |
| 1087 | if (m_options.compiler.combinedJsonRequests->natspecDev) |
| 1088 | contractData[g_strNatspecDev] = m_compiler->natspecDev(contractName); |
| 1089 | if (m_options.compiler.combinedJsonRequests->natspecUser) |
| 1090 | contractData[g_strNatspecUser] = m_compiler->natspecUser(contractName); |
| 1091 | } |
| 1092 | |
| 1093 | if (m_assemblyStack->compilationSuccessful()) |
| 1094 | { |
| 1095 | if (m_options.compiler.combinedJsonRequests->binary) |
| 1096 | contractData[g_strBinary] = m_assemblyStack->object(contractName).toHex(); |
| 1097 | if (m_options.compiler.combinedJsonRequests->binaryRuntime) |
| 1098 | contractData[g_strBinaryRuntime] = m_assemblyStack->runtimeObject(contractName).toHex(); |
| 1099 | if (m_options.compiler.combinedJsonRequests->opcodes) |
| 1100 | contractData[g_strOpcodes] = evmasm::disassemble(m_assemblyStack->object(contractName).bytecode, m_options.output.evmVersion); |
| 1101 | if (m_options.compiler.combinedJsonRequests->asm_) |
| 1102 | contractData[g_strAsm] = m_assemblyStack->assemblyJSON(contractName); |
| 1103 | if (m_options.compiler.combinedJsonRequests->srcMap) |
| 1104 | { |
nothing calls this directly
no test coverage detected