cmJSONState: Use StructuredErrors when available
When the version of JsonCpp permits it, use StructuredErrors to generate error messages for parse errors in the same style as other CMake-generated JSON error messages. Fixes: #26717
This commit is contained in:
parent
2604f5d8b3
commit
bed7e90bae
@ -4,10 +4,12 @@
|
|||||||
#include "cmJSONState.h"
|
#include "cmJSONState.h"
|
||||||
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <memory>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include <cm3p/json/reader.h>
|
#include <cm3p/json/reader.h>
|
||||||
#include <cm3p/json/value.h>
|
#include <cm3p/json/value.h>
|
||||||
|
#include <cm3p/json/version.h>
|
||||||
|
|
||||||
#include "cmsys/FStream.hxx"
|
#include "cmsys/FStream.hxx"
|
||||||
|
|
||||||
@ -35,14 +37,27 @@ cmJSONState::cmJSONState(std::string jsonFile, Json::Value* root)
|
|||||||
}
|
}
|
||||||
fin.seekg(finBegin);
|
fin.seekg(finBegin);
|
||||||
|
|
||||||
// Parse the document.
|
|
||||||
Json::CharReaderBuilder builder;
|
Json::CharReaderBuilder builder;
|
||||||
Json::CharReaderBuilder::strictMode(&builder.settings_);
|
Json::CharReaderBuilder::strictMode(&builder.settings_);
|
||||||
std::string errMsg;
|
std::string errMsg;
|
||||||
|
|
||||||
|
#if JSONCPP_VERSION_HEXA >= 0x01090600
|
||||||
|
// Has StructuredError
|
||||||
|
std::unique_ptr<Json::CharReader> const reader(builder.newCharReader());
|
||||||
|
reader->parse(doc.data(), doc.data() + doc.size(), root, &errMsg);
|
||||||
|
std::vector<Json::CharReader::StructuredError> structuredErrors =
|
||||||
|
reader->getStructuredErrors();
|
||||||
|
for (auto const& structuredError : structuredErrors) {
|
||||||
|
this->AddErrorAtOffset(structuredError.message,
|
||||||
|
structuredError.offset_start);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// No StructuredError Available, Use error string from jsonCpp
|
||||||
if (!Json::parseFromStream(builder, fin, root, &errMsg)) {
|
if (!Json::parseFromStream(builder, fin, root, &errMsg)) {
|
||||||
errMsg = cmStrCat("JSON Parse Error: ", this->Filename, ":\n", errMsg);
|
errMsg = cmStrCat("JSON Parse Error: ", this->Filename, ":\n", errMsg);
|
||||||
this->AddError(errMsg);
|
this->AddError(errMsg);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmJSONState::AddError(std::string const& errMsg)
|
void cmJSONState::AddError(std::string const& errMsg)
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
^CMake Error: Could not read presets from [^
|
^CMake Error: Could not read presets from [^
|
||||||
]*/Tests/RunCMake/CMakePresets/Comment:
|
]*/Tests/RunCMake/CMakePresets/Comment:
|
||||||
JSON Parse Error: [^
|
(CMakePresets.json:1: Syntax error: value, object or array expected.
|
||||||
|
// Comment
|
||||||
|
\^
|
||||||
|
CMakePresets.json:2: Extra non-whitespace after JSON value.
|
||||||
|
{
|
||||||
|
\^|JSON Parse Error: [^
|
||||||
]*Comment\/CMakePresets.json:
|
]*Comment\/CMakePresets.json:
|
||||||
\* Line 1, Column 1
|
\* Line 1, Column 1
|
||||||
Syntax error: value, object or array expected\.
|
Syntax error: value, object or array expected\.
|
||||||
\* Line 2, Column 1
|
\* Line 2, Column 1
|
||||||
Extra non-whitespace after JSON value\.$
|
Extra non-whitespace after JSON value\.$)
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
^Could not read/parse resource spec file [^
|
^Could not read/parse resource spec file [^
|
||||||
]*/Tests/RunCMake/CTestResourceAllocation/invalid\.json:
|
]*/Tests/RunCMake/CTestResourceAllocation/invalid\.json:
|
||||||
JSON Parse Error: [^
|
(invalid.json:1: Syntax error: value, object or array expected.
|
||||||
|
This is not a valid JSON file!
|
||||||
|
\^
|
||||||
|
invalid.json:1: Extra non-whitespace after JSON value.
|
||||||
|
This is not a valid JSON file!
|
||||||
|
\^|JSON Parse Error: [^
|
||||||
]*/Tests/RunCMake/CTestResourceAllocation/invalid\.json:
|
]*/Tests/RunCMake/CTestResourceAllocation/invalid\.json:
|
||||||
\* Line 1, Column 1
|
\* Line 1, Column 1
|
||||||
Syntax error: value, object or array expected\.
|
Syntax error: value, object or array expected\.
|
||||||
@ -8,7 +13,7 @@ JSON Parse Error: [^
|
|||||||
Extra non-whitespace after JSON value\.
|
Extra non-whitespace after JSON value\.
|
||||||
|\* Line 1, Column 1
|
|\* Line 1, Column 1
|
||||||
A valid JSON document must be either an array or an object value\.
|
A valid JSON document must be either an array or an object value\.
|
||||||
)
|
))
|
||||||
Errors while running CTest
|
Errors while running CTest
|
||||||
Output from these tests are in: [^
|
Output from these tests are in: [^
|
||||||
]*/Tests/RunCMake/CTestResourceAllocation/invalid-build/Testing/Temporary/LastTest\.log
|
]*/Tests/RunCMake/CTestResourceAllocation/invalid-build/Testing/Temporary/LastTest\.log
|
||||||
|
Loading…
Reference in New Issue
Block a user