1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 19:08:07 +08:00
Files
CMake/Source/cmJSONState.h
Martin Duffy f134468a98 JSON: Improve JSON error message formatting
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
2025-03-13 10:44:31 -04:00

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;
};