diff --git a/src/jsonhandler.h b/src/jsonhandler.h index 9f41d8572664ed7a6abce345ba3d7393692b460a..8a914f0ad5c256ebd824660c0cb21234fd07f6f1 100644 --- a/src/jsonhandler.h +++ b/src/jsonhandler.h @@ -1,6 +1,7 @@ #ifndef JSONHANDLER_H #define JSONHANDLER_H +#include #include #include #include @@ -17,6 +18,8 @@ struct Result { bool success = false; int error_pos = -1; + int errorColumn = -1; + int errorLine = -1; int error_code = -1; std::string error_str; std::string response; @@ -33,7 +36,7 @@ class JsonHandler { ParseOptions m_parseOptions{}; - public: +public: explicit JsonHandler(const ParseOptions &options); ~JsonHandler() = default; @@ -53,6 +56,7 @@ inline auto JsonHandler::ParseJson(const std::string &jsonText, rj::StringBuffer bool success = false; rj::Reader reader; rj::StringStream ss(jsonText.c_str()); + rj::CursorStreamWrapper cursorStreamWrapper(ss); // TODO: Find some better way constexpr auto flgBase_commemt = flgBase | rj::kParseCommentsFlag; @@ -61,22 +65,22 @@ inline auto JsonHandler::ParseJson(const std::string &jsonText, rj::StringBuffer if (m_parseOptions.bIgnoreComment && m_parseOptions.bIgnoreTrailingComma) { - success = reader.Parse(ss, handler) && sb.GetString(); + success = reader.Parse(cursorStreamWrapper, handler) && sb.GetString(); } else if (!m_parseOptions.bIgnoreComment && m_parseOptions.bIgnoreTrailingComma) { - success = reader.Parse(ss, handler) && sb.GetString(); + success = reader.Parse(cursorStreamWrapper, handler) && sb.GetString(); } else if (m_parseOptions.bIgnoreComment && !m_parseOptions.bIgnoreTrailingComma) { - success = reader.Parse(ss, handler) && sb.GetString(); + success = reader.Parse(cursorStreamWrapper, handler) && sb.GetString(); } else if (!m_parseOptions.bIgnoreComment && !m_parseOptions.bIgnoreTrailingComma) { - success = reader.Parse(ss, handler) && sb.GetString(); + success = reader.Parse(cursorStreamWrapper, handler) && sb.GetString(); } if (success) @@ -91,6 +95,8 @@ inline auto JsonHandler::ParseJson(const std::string &jsonText, rj::StringBuffer retVal.success = false; retVal.error_str = rj::GetParseError_En(reader.GetParseErrorCode()); retVal.error_pos = static_cast(reader.GetErrorOffset()); + retVal.errorColumn = static_cast(cursorStreamWrapper.GetColumn()); + retVal.errorLine = static_cast(cursorStreamWrapper.GetLine() - 1); retVal.error_code = reader.GetParseErrorCode(); retVal.response.clear(); } @@ -98,4 +104,4 @@ inline auto JsonHandler::ParseJson(const std::string &jsonText, rj::StringBuffer return retVal; } -#endif // JSONHANDLER_H +#endif // JSONHANDLER_H diff --git a/src/nddjsonplugin.cpp b/src/nddjsonplugin.cpp index 37b44dd1136769db8d6681de8a257e0f15ebcda5..aed5a411871bd1f839e29801b4b3cacb85adb6da 100644 --- a/src/nddjsonplugin.cpp +++ b/src/nddjsonplugin.cpp @@ -146,14 +146,18 @@ void NDDJsonPlugin::reportError(const Result &result) return; } - auto start = scintillaEditor_->getSelectionStart() + result.error_pos; - auto end = start + scintillaEditor_->getSelectionEnd(); + // auto start = scintillaEditor_->getSelectionStart() + result.error_pos; + // auto end = start + scintillaEditor_->getSelectionEnd(); - scintillaEditor_->makeSelection(start, end); + // scintillaEditor_->makeSelection(start, end); // Intimate user std::string err; - err += "\n\nError: (" + std::to_string(result.error_code) + " : " + result.error_str + ")"; + // err += "\n\nError: (" + std::to_string(result.error_code) + " : " + result.error_str + ")"; + err += "\n\nError(line " + std::to_string(result.errorLine) + ", column " + std::to_string(result.errorColumn) + + "): " + result.error_str; + + scintillaEditor_->setCurrentCurPos(result.errorLine, result.errorColumn, result.error_str); showMessage( "JSON Viewer: Error", diff --git a/src/scintillaeditor.cpp b/src/scintillaeditor.cpp index aecd2c90df01e5db391fed797fed735f7f881e01..9398b1783e8f24ef76d6ed746dee80a7d7bf7303 100644 --- a/src/scintillaeditor.cpp +++ b/src/scintillaeditor.cpp @@ -73,6 +73,11 @@ auto ScintillaEditor::getSelectionEnd() const -> size_t auto ScintillaEditor::getEOL() const -> unsigned { auto scintilla_ = scintillaCallback_(); + if (!scintilla_) + { + return {}; + } + auto eolMode = scintilla_->SendScintilla(QsciScintillaBase::SCI_GETEOLMODE); return eolMode; } @@ -80,6 +85,10 @@ auto ScintillaEditor::getEOL() const -> unsigned auto ScintillaEditor::getIndent() const -> std::tuple { auto scintilla_ = scintillaCallback_(); + if (!scintilla_) + { + return {}; + } bool useTabs = scintilla_->SendScintilla(QsciScintillaBase::SCI_GETUSETABS); char indentChar = useTabs ? '\t' : ' '; unsigned indentLen = @@ -91,6 +100,11 @@ auto ScintillaEditor::getIndent() const -> std::tuple void ScintillaEditor::refreshSelectionPos() { auto scintilla_ = scintillaCallback_(); + if (!scintilla_) + { + return; + } + startPos_ = scintilla_->SendScintilla(QsciScintillaBase::SCI_GETSELECTIONSTART); endPos_ = scintilla_->SendScintilla(QsciScintillaBase::SCI_GETSELECTIONEND); @@ -102,7 +116,23 @@ void ScintillaEditor::refreshSelectionPos() void ScintillaEditor::replaceAll(const std::string &text) const { auto scintilla_ = scintillaCallback_(); + if (!scintilla_) + { + return; + } + scintilla_->selectAll(); scintilla_->replaceSelectedText(text.c_str()); scintilla_->setCursorPosition(0, 0); } +void ScintillaEditor::setCurrentCurPos(int line, int column, const std::string &annotateString) +{ + auto scintilla_ = scintillaCallback_(); + if (!scintilla_) + { + return; + } + + scintilla_->setCursorPosition(line, column); + // scintilla_->setMarginText(line, annotateString.c_str(), 0); +} diff --git a/src/scintillaeditor.h b/src/scintillaeditor.h index 00cfa29d70fe527a5f9b687359015b546cc6933a..468045d529c833dfa93e548f1ffab8947ef644fa 100644 --- a/src/scintillaeditor.h +++ b/src/scintillaeditor.h @@ -5,19 +5,22 @@ #ifndef JSONVIEW_SCINTILLAEDITOR_H #define JSONVIEW_SCINTILLAEDITOR_H -#include #include +#include class QsciScintilla; class ScintillaEditor { - public: - explicit ScintillaEditor(const std::function& cb); +public: + explicit ScintillaEditor(const std::function &cb); ~ScintillaEditor() = default; - public: +public: + void setCurrentCurPos(int line, int column, const std::string &annotateString = {}); + +public: [[nodiscard]] std::string getJsonText(); [[nodiscard]] bool isJsonFile() const; @@ -36,14 +39,14 @@ class ScintillaEditor [[nodiscard]] auto getIndent() const -> std::tuple; - private: +private: void refreshSelectionPos(); - private: +private: std::function scintillaCallback_; size_t startPos_ = 0; size_t endPos_ = 0; }; -#endif // JSONVIEW_SCINTILLAEDITOR_H +#endif // JSONVIEW_SCINTILLAEDITOR_H