LibGUI: Fix off-by-one error in Lexer tokens

This changes the INI and GML lexers to conform to the now-fixed
rendering of syntax highlighting spans in GUI::TextEditor.

The other user of GMLToken::m_end, GMLAutocompleteProvider, has been
modified to take into account that end position columns have been
incremented by one.
This commit is contained in:
Max Wipfli 2021-06-04 00:05:33 +02:00 committed by Ali Mohammad Pur
parent e7b5dbe1ac
commit cb5a50d3f7
Notes: sideshowbarker 2024-07-18 16:53:17 +09:00
5 changed files with 6 additions and 10 deletions

View file

@ -107,7 +107,7 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
Vector<GUI::AutocompleteProvider::Entry> class_entries, identifier_entries;
switch (state) {
case Free:
if (last_seen_token && last_seen_token->m_end.column + 1 != cursor.column() && last_seen_token->m_end.line == cursor.line()) {
if (last_seen_token && last_seen_token->m_end.column != cursor.column() && last_seen_token->m_end.line == cursor.line()) {
// After some token, but with extra space, not on a new line.
// Nothing to put here.
break;
@ -121,7 +121,7 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
case InClassName:
if (class_names.is_empty())
break;
if (last_seen_token && last_seen_token->m_end.column + 1 != cursor.column() && last_seen_token->m_end.line == cursor.line()) {
if (last_seen_token && last_seen_token->m_end.column != cursor.column() && last_seen_token->m_end.line == cursor.line()) {
// After a class name, but haven't seen braces.
// TODO: Suggest braces?
break;
@ -136,7 +136,7 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
case InIdentifier: {
if (class_names.is_empty())
break;
if (last_seen_token && last_seen_token->m_end.column + 1 != cursor.column() && last_seen_token->m_end.line == cursor.line()) {
if (last_seen_token && last_seen_token->m_end.column != cursor.column() && last_seen_token->m_end.line == cursor.line()) {
// After an identifier, but with extra space
// TODO: Maybe suggest a colon?
break;
@ -158,7 +158,7 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
}
case AfterClassName: {
if (last_seen_token && last_seen_token->m_end.line == cursor.line()) {
if (last_seen_token->m_type != GUI::GMLToken::Type::Identifier || last_seen_token->m_end.column + 1 != cursor.column()) {
if (last_seen_token->m_type != GUI::GMLToken::Type::Identifier || last_seen_token->m_end.column != cursor.column()) {
// Inside braces, but on the same line as some other stuff (and not the continuation of one!)
// The user expects nothing here.
break;

View file

@ -26,7 +26,6 @@ char GMLLexer::consume()
{
VERIFY(m_index < m_input.length());
char ch = m_input[m_index++];
m_previous_position = m_position;
if (ch == '\n') {
m_position.line++;
m_position.column = 0;
@ -68,7 +67,7 @@ Vector<GMLToken> GMLLexer::lex()
token.m_view = m_input.substring_view(token_start_index, m_index - token_start_index);
token.m_type = type;
token.m_start = token_start_position;
token.m_end = m_previous_position;
token.m_end = m_position;
tokens.append(token);
};

View file

@ -63,7 +63,6 @@ private:
StringView m_input;
size_t m_index { 0 };
GMLPosition m_previous_position { 0, 0 };
GMLPosition m_position { 0, 0 };
};

View file

@ -26,7 +26,6 @@ char IniLexer::consume()
{
VERIFY(m_index < m_input.length());
char ch = m_input[m_index++];
m_previous_position = m_position;
if (ch == '\n') {
m_position.line++;
m_position.column = 0;
@ -47,9 +46,9 @@ Vector<IniToken> IniLexer::lex()
IniToken token;
token.m_type = type;
token.m_start = m_position;
consume();
token.m_end = m_position;
tokens.append(token);
consume();
};
auto begin_token = [&] {

View file

@ -62,7 +62,6 @@ private:
StringView m_input;
size_t m_index { 0 };
IniPosition m_previous_position { 0, 0 };
IniPosition m_position { 0, 0 };
};