Browse Source

Util: Calculate JSON line number before lexing

master
Riyyi 3 years ago
parent
commit
bc01b34e58
  1. 10
      src/util/json/job.cpp
  2. 2
      src/util/json/job.h
  3. 3
      src/util/json/lexer.cpp

10
src/util/json/job.cpp

@ -4,6 +4,7 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <algorithm> // count
#include <sstream> // istringstream #include <sstream> // istringstream
#include <string> // getline #include <string> // getline
@ -13,6 +14,8 @@ namespace Json {
Job::Job(const std::string& input) Job::Job(const std::string& input)
: m_input(input) : m_input(input)
// FIXME: handle case where the file doenst have a trailing newline
, m_lineNumbersWidth(std::to_string(std::count(m_input.begin(), m_input.end(), '\n') - 1).length())
{ {
} }
@ -47,6 +50,13 @@ void Job::printErrorLine(Token token, const char* message)
break; break;
} }
} }
// Replace tab indentation with spaces
size_t oldLineLength = line.length();
size_t tabs = line.find_first_not_of('\t');
if (tabs > 0 && tabs < line.size()) {
line = std::string(tabs * 4, ' ') + line.substr(tabs);
}
token.column += line.length() - oldLineLength;
// JSON line // JSON line
std::string lineFormat = " %" std::string lineFormat = " %"

2
src/util/json/job.h

@ -30,8 +30,6 @@ public:
void printErrorLine(Token token, const char* message); void printErrorLine(Token token, const char* message);
void setLineNumbersWidth(size_t width) { m_lineNumbersWidth = width; }
const std::string& input() { return m_input; } const std::string& input() { return m_input; }
private: private:

3
src/util/json/lexer.cpp

@ -113,9 +113,6 @@ void Lexer::analyze()
m_index++; m_index++;
m_column++; m_column++;
} }
// FIXME: handle case where the file doenst have a trailing newline
m_job->setLineNumbersWidth(std::to_string(m_line - 1).length());
} }
// ----------------------------------------- // -----------------------------------------

Loading…
Cancel
Save