You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.8 KiB
73 lines
1.8 KiB
2 years ago
|
/* 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>
|
||
|
|
||
|
#include "cmStringAlgorithms.h"
|
||
|
|
||
|
namespace Json {
|
||
|
class Value;
|
||
|
}
|
||
|
|
||
|
class cmJSONState
|
||
|
{
|
||
|
using Location = struct
|
||
|
{
|
||
|
int line;
|
||
|
int column;
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
using JsonPair = std::pair<const std::string, const Json::Value*>;
|
||
|
cmJSONState() = default;
|
||
|
cmJSONState(const std::string& filename, Json::Value* root);
|
||
|
void AddError(std::string const& errMsg);
|
||
|
void AddErrorAtValue(std::string const& errMsg, const Json::Value* 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);
|
||
|
const Json::Value* value_after(std::string const& key);
|
||
|
void push_stack(std::string const& key, const Json::Value* 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
|
||
|
{
|
||
|
std::string output = message;
|
||
|
if (location.line > 0) {
|
||
|
output = cmStrCat("Error: @", location.line, ",", location.column,
|
||
|
": ", output);
|
||
|
}
|
||
|
return output;
|
||
|
}
|
||
|
Location GetLocation() const { return location; }
|
||
|
|
||
|
private:
|
||
|
Location location;
|
||
|
std::string message;
|
||
|
};
|
||
|
|
||
|
std::vector<JsonPair> parseStack;
|
||
|
std::vector<Error> errors;
|
||
|
std::string doc;
|
||
|
|
||
|
private:
|
||
|
std::string GetJsonContext(Location loc);
|
||
|
Location LocateInDocument(ptrdiff_t offset);
|
||
|
};
|