1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-20 12:05:07 +00:00

HackStudio: Highlight matching pairs of [ and ] as well

Also refactor the token pair matching code a little bit to not repeat
ourselves so much. :^)
This commit is contained in:
Andreas Kling 2019-11-23 17:48:20 +01:00
parent fc14bdd442
commit 8f9a522c37
2 changed files with 29 additions and 27 deletions

View file

@ -172,7 +172,7 @@ void Editor::mousemove_event(GMouseEvent& event)
GApplication::the().hide_tooltip();
}
void Editor::highlight_matching_curlies_or_parens()
void Editor::highlight_matching_token_pair()
{
enum class Direction {
Forward,
@ -210,38 +210,40 @@ void Editor::highlight_matching_curlies_or_parens()
update();
};
struct MatchingTokenPair {
CppToken::Type open;
CppToken::Type close;
};
MatchingTokenPair pairs[] = {
{ CppToken::Type::LeftCurly, CppToken::Type::RightCurly },
{ CppToken::Type::LeftParen, CppToken::Type::RightParen },
{ CppToken::Type::LeftBracket, CppToken::Type::RightBracket },
};
for (int i = 0; i < document().spans().size(); ++i) {
auto& span = const_cast<GTextDocumentSpan&>(document().spans().at(i));
auto token_type = (CppToken::Type)((uintptr_t)span.data);
if (token_type == CppToken::Type::LeftCurly && span.range.start() == cursor()) {
auto buddy = find_span_of_type(i, CppToken::Type::RightCurly, CppToken::Type::LeftCurly, Direction::Forward);
if (buddy != -1)
make_buddies(i, buddy);
return;
}
if (token_type == CppToken::Type::LeftParen && span.range.start() == cursor()) {
auto buddy = find_span_of_type(i, CppToken::Type::RightParen, CppToken::Type::LeftParen, Direction::Forward);
if (buddy != -1)
make_buddies(i, buddy);
return;
for (auto& pair : pairs) {
if (token_type == pair.open && span.range.start() == cursor()) {
auto buddy = find_span_of_type(i, pair.close, pair.open, Direction::Forward);
if (buddy != -1)
make_buddies(i, buddy);
return;
}
}
auto right_of_end = span.range.end();
right_of_end.set_column(right_of_end.column() + 1);
if (token_type == CppToken::Type::RightCurly && right_of_end == cursor()) {
auto buddy = find_span_of_type(i, CppToken::Type::LeftCurly, CppToken::Type::RightCurly, Direction::Backward);
if (buddy != -1)
make_buddies(i, buddy);
return;
}
if (token_type == CppToken::Type::RightParen && right_of_end == cursor()) {
auto buddy = find_span_of_type(i, CppToken::Type::LeftParen, CppToken::Type::RightParen, Direction::Backward);
if (buddy != -1)
make_buddies(i, buddy);
return;
for (auto& pair : pairs) {
if (token_type == pair.close && right_of_end == cursor()) {
auto buddy = find_span_of_type(i, pair.open, pair.close, Direction::Backward);
if (buddy != -1)
make_buddies(i, buddy);
return;
}
}
}
}
@ -256,11 +258,11 @@ void Editor::cursor_did_change()
m_has_brace_buddies = false;
update();
}
highlight_matching_curlies_or_parens();
highlight_matching_token_pair();
}
void Editor::notify_did_rehighlight()
{
m_has_brace_buddies = false;
highlight_matching_curlies_or_parens();
highlight_matching_token_pair();
}