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
*/
#include <algorithm> // count
#include <sstream> // istringstream
#include <string> // getline
@ -13,6 +14,8 @@ namespace Json {
Job::Job(const std::string& 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;
}
}
// 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
std::string lineFormat = " %"

2
src/util/json/job.h

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

3
src/util/json/lexer.cpp

@ -113,9 +113,6 @@ void Lexer::analyze()
m_index++;
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