diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp index acf655c82..2978fdcdb 100644 --- a/libevmasm/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -200,7 +200,7 @@ string Assembly::assemblyString(StringMap const& _sourceCodes) const Json::Value Assembly::createJsonValue(string _name, int _source, int _begin, int _end, string _value, string _jumpType) { - Json::Value value; + Json::Value value{Json::objectValue}; value["name"] = _name; value["source"] = _source; value["begin"] = _begin; @@ -222,8 +222,9 @@ string Assembly::toStringInHex(u256 _value) Json::Value Assembly::assemblyJSON(map const& _sourceIndices) const { Json::Value root; + root[".code"] = Json::arrayValue; - Json::Value& collection = root[".code"] = Json::arrayValue; + Json::Value& collection = root[".code"]; for (AssemblyItem const& i: m_items) { int sourceIndex = -1; @@ -317,7 +318,8 @@ Json::Value Assembly::assemblyJSON(map const& _sourceIndices) if (!m_data.empty() || !m_subs.empty()) { - Json::Value& data = root[".data"] = Json::objectValue; + root[".data"] = Json::objectValue; + Json::Value& data = root[".data"]; for (auto const& i: m_data) if (u256(i.first) >= m_subs.size()) data[toStringInHex((u256)i.first)] = toHex(i.second); diff --git a/libsolidity/interface/ABI.cpp b/libsolidity/interface/ABI.cpp index c4a2dfe5c..cf395ffa0 100644 --- a/libsolidity/interface/ABI.cpp +++ b/libsolidity/interface/ABI.cpp @@ -56,7 +56,7 @@ Json::Value ABI::generate(ContractDefinition const& _contractDef) FunctionType const* externalFunctionType = it.second->interfaceFunctionType(); solAssert(!!externalFunctionType, ""); - Json::Value method; + Json::Value method{Json::objectValue}; method["type"] = "function"; method["name"] = it.second->declaration().name(); method["stateMutability"] = stateMutabilityToString(externalFunctionType->stateMutability()); @@ -80,7 +80,7 @@ Json::Value ABI::generate(ContractDefinition const& _contractDef) FunctionType constrType(*constructor); FunctionType const* externalFunctionType = constrType.interfaceFunctionType(); solAssert(!!externalFunctionType, ""); - Json::Value method; + Json::Value method{Json::objectValue}; method["type"] = "constructor"; method["stateMutability"] = stateMutabilityToString(externalFunctionType->stateMutability()); method["inputs"] = formatTypeList( @@ -96,23 +96,22 @@ Json::Value ABI::generate(ContractDefinition const& _contractDef) { auto const* externalFunctionType = FunctionType(*fallbackOrReceive).interfaceFunctionType(); solAssert(!!externalFunctionType, ""); - Json::Value method; + Json::Value method{Json::objectValue}; method["type"] = TokenTraits::toString(fallbackOrReceive->kind()); method["stateMutability"] = stateMutabilityToString(externalFunctionType->stateMutability()); abi.emplace(std::move(method)); } for (auto const& it: _contractDef.interfaceEvents()) { - Json::Value event; + Json::Value event{Json::objectValue}; event["type"] = "event"; event["name"] = it->name(); event["anonymous"] = it->isAnonymous(); - Json::Value params(Json::arrayValue); + Json::Value params{Json::arrayValue}; for (auto const& p: it->parameters()) { Type const* type = p->annotation().type->interfaceType(false); solAssert(type, ""); - Json::Value input; auto param = formatType(p->name(), *type, *p->annotation().type, false); param["indexed"] = p->isIndexed(); params.append(std::move(param)); @@ -123,7 +122,7 @@ Json::Value ABI::generate(ContractDefinition const& _contractDef) for (ErrorDefinition const* error: _contractDef.interfaceErrors()) { - Json::Value errorJson; + Json::Value errorJson{Json::objectValue}; errorJson["type"] = "error"; errorJson["name"] = error->name(); errorJson["inputs"] = Json::arrayValue; @@ -151,7 +150,7 @@ Json::Value ABI::formatTypeList( bool _forLibrary ) { - Json::Value params(Json::arrayValue); + Json::Value params{Json::arrayValue}; solAssert(_names.size() == _encodingTypes.size(), "Names and types vector size does not match"); solAssert(_names.size() == _solidityTypes.size(), ""); for (unsigned i = 0; i < _names.size(); ++i) @@ -169,7 +168,7 @@ Json::Value ABI::formatType( bool _forLibrary ) { - Json::Value ret; + Json::Value ret{Json::objectValue}; ret["name"] = _name; ret["internalType"] = _solidityType.toString(true); string suffix = (_forLibrary && _encodingType.dataStoredIn(DataLocation::Storage)) ? " storage" : ""; diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 3b5fb8cb5..c08ba6607 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -1429,7 +1429,7 @@ CompilerStack::Source const& CompilerStack::source(string const& _sourceName) co string CompilerStack::createMetadata(Contract const& _contract, bool _forIR) const { - Json::Value meta; + Json::Value meta{Json::objectValue}; meta["version"] = 1; meta["language"] = m_importedSources ? "SolidityAST" : "Solidity"; meta["compiler"]["version"] = VersionStringStrict; diff --git a/libsolidity/interface/Natspec.cpp b/libsolidity/interface/Natspec.cpp index 402d8e15c..533cbaa3d 100644 --- a/libsolidity/interface/Natspec.cpp +++ b/libsolidity/interface/Natspec.cpp @@ -37,7 +37,7 @@ using namespace solidity::frontend; Json::Value Natspec::userDocumentation(ContractDefinition const& _contractDef) { - Json::Value doc; + Json::Value doc{Json::objectValue}; doc["version"] = Json::Value(c_natspecVersion); doc["kind"] = Json::Value("user"); @@ -50,7 +50,7 @@ Json::Value Natspec::userDocumentation(ContractDefinition const& _contractDef) if (!value.empty()) { // add the constructor, only if we have any documentation to add - Json::Value user; + Json::Value user{Json::objectValue}; user["notice"] = Json::Value(value); doc["methods"]["constructor"] = user; } @@ -90,7 +90,7 @@ Json::Value Natspec::userDocumentation(ContractDefinition const& _contractDef) string value = extractDoc(error->annotation().docTags, "notice"); if (!value.empty()) { - Json::Value errorDoc; + Json::Value errorDoc{Json::objectValue}; errorDoc["notice"] = value; doc["errors"][error->functionType(true)->externalSignature()].append(move(errorDoc)); } @@ -225,7 +225,10 @@ Json::Value Natspec::extractCustomDoc(multimap const& _tags) for (auto const& [tag, value]: _tags) if (boost::starts_with(tag, "custom")) concatenated[tag] += value.content; - Json::Value result; + // We do not want to create an object if there are no custom tags found. + if (concatenated.empty()) + return Json::nullValue; + Json::Value result{Json::objectValue}; for (auto& [tag, value]: concatenated) result[tag] = move(value); return result; diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index 1031ec7c3..7d354a405 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -59,7 +59,7 @@ Json::Value formatError( Json::Value const& _secondarySourceLocation = Json::Value() ) { - Json::Value error = Json::objectValue; + Json::Value error{Json::objectValue}; error["type"] = _type; error["component"] = _component; error["severity"] = Error::formatErrorSeverityLowercase(_severity); @@ -74,7 +74,7 @@ Json::Value formatError( Json::Value formatFatalError(string const& _type, string const& _message) { - Json::Value output = Json::objectValue; + Json::Value output{Json::objectValue}; output["errors"] = Json::arrayValue; output["errors"].append(formatError(Error::Severity::Error, _type, "general", _message)); return output; @@ -82,23 +82,22 @@ Json::Value formatFatalError(string const& _type, string const& _message) Json::Value formatSourceLocation(SourceLocation const* location) { - Json::Value sourceLocation; - if (location && location->sourceName) - { - sourceLocation["file"] = *location->sourceName; - sourceLocation["start"] = location->start; - sourceLocation["end"] = location->end; - } + if (!location || !location->sourceName) + return Json::nullValue; + Json::Value sourceLocation{Json::objectValue}; + sourceLocation["file"] = *location->sourceName; + sourceLocation["start"] = location->start; + sourceLocation["end"] = location->end; return sourceLocation; } Json::Value formatSecondarySourceLocation(SecondarySourceLocation const* _secondaryLocation) { if (!_secondaryLocation) - return {}; + return Json::nullValue; - Json::Value secondarySourceLocation = Json::arrayValue; + Json::Value secondarySourceLocation{Json::arrayValue}; for (auto const& location: _secondaryLocation->infos) { Json::Value msg = formatSourceLocation(&location.second); @@ -330,7 +329,7 @@ bool isIRRequested(Json::Value const& _outputSelection) Json::Value formatLinkReferences(std::map const& linkReferences) { - Json::Value ret(Json::objectValue); + Json::Value ret{Json::objectValue}; for (auto const& ref: linkReferences) { @@ -345,7 +344,7 @@ Json::Value formatLinkReferences(std::map const& linkRefere Json::Value fileObject = ret.get(file, Json::objectValue); Json::Value libraryArray = fileObject.get(name, Json::arrayValue); - Json::Value entry = Json::objectValue; + Json::Value entry{Json::objectValue}; entry["start"] = Json::UInt(ref.first); entry["length"] = 20; @@ -359,7 +358,7 @@ Json::Value formatLinkReferences(std::map const& linkRefere Json::Value formatImmutableReferences(map>> const& _immutableReferences) { - Json::Value ret(Json::objectValue); + Json::Value ret{Json::objectValue}; for (auto const& immutableReference: _immutableReferences) { @@ -367,7 +366,7 @@ Json::Value formatImmutableReferences(map>> co Json::Value array(Json::arrayValue); for (size_t byteOffset: byteOffsets) { - Json::Value byteRange(Json::objectValue); + Json::Value byteRange{Json::objectValue}; byteRange["start"] = Json::UInt(byteOffset); byteRange["length"] = Json::UInt(32); // immutable references are currently always 32 bytes wide array.append(byteRange); @@ -386,7 +385,7 @@ Json::Value collectEVMObject( function const& _artifactRequested ) { - Json::Value output = Json::objectValue; + Json::Value output{Json::objectValue}; if (_artifactRequested("object")) output["object"] = _object.toHex(); if (_artifactRequested("opcodes"))