mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 19:08:07 +08:00

This improves the output of JSON-related error messages. It adds the filename to the output and excludes the column number. This is particularly useful when there are multiple JSON files being read that could be responsible for an error, ie CMakePresets.json and CMakeUserPresets.json, or multiple instrumentation queries. Issue: #26717
65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <cstddef>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
namespace Json {
|
|
class Value;
|
|
}
|
|
|
|
class cmJSONState
|
|
{
|
|
using Location = struct
|
|
{
|
|
int line;
|
|
int column;
|
|
};
|
|
|
|
public:
|
|
using JsonPair = std::pair<std::string const, Json::Value const*>;
|
|
cmJSONState() = default;
|
|
cmJSONState(std::string jsonFile, Json::Value* root);
|
|
void AddError(std::string const& errMsg);
|
|
void AddErrorAtValue(std::string const& errMsg, Json::Value const* value);
|
|
void AddErrorAtOffset(std::string const& errMsg, std::ptrdiff_t offset);
|
|
std::string GetErrorMessage(bool showContext = true);
|
|
std::string key();
|
|
std::string key_after(std::string const& key);
|
|
Json::Value const* value_after(std::string const& key);
|
|
void push_stack(std::string const& key, Json::Value const* value);
|
|
void pop_stack();
|
|
|
|
class Error
|
|
{
|
|
public:
|
|
Error(Location loc, std::string errMsg)
|
|
: location(loc)
|
|
, message(std::move(errMsg)) {};
|
|
Error(std::string errMsg)
|
|
: location({ -1, -1 })
|
|
, message(std::move(errMsg)) {};
|
|
std::string GetErrorMessage() const { return message; }
|
|
Location GetLocation() const { return location; }
|
|
|
|
private:
|
|
Location location;
|
|
std::string message;
|
|
};
|
|
|
|
std::vector<JsonPair> parseStack;
|
|
std::vector<Error> errors;
|
|
std::string doc;
|
|
bool allowComments = false;
|
|
|
|
private:
|
|
std::string GetJsonContext(Location loc);
|
|
Location LocateInDocument(ptrdiff_t offset);
|
|
std::string Filename;
|
|
};
|