LibGUI: Parse #include statements separately

This commit is contained in:
Oriko 2020-03-12 00:17:29 +02:00 committed by Andreas Kling
parent b13417ddb4
commit d8a73dd979
Notes: sideshowbarker 2024-07-19 08:45:27 +09:00
3 changed files with 36 additions and 0 deletions

View File

@ -345,8 +345,40 @@ Vector<CppToken> CppLexer::lex()
}
if (ch == '#') {
begin_token();
consume();
if (is_valid_first_character_of_identifier(peek()))
while (peek() && is_valid_nonfirst_character_of_identifier(peek()))
consume();
auto directive = StringView(m_input.characters_without_null_termination() + token_start_index, m_index - token_start_index);
if (directive == "#include") {
commit_token(CppToken::Type::IncludeStatement);
begin_token();
while (isspace(peek()))
consume();
commit_token(CppToken::Type::Whitespace);
begin_token();
if (peek() == '<' || peek() == '"') {
char closing = consume() == '<' ? '>' : '"';
while (peek() != closing && peek() != '\n')
consume();
if (consume() == '\n') {
commit_token(CppToken::Type::IncludePath);
continue;
} else {
commit_token(CppToken::Type::IncludePath);
begin_token();
}
}
}
while (peek() && peek() != '\n')
consume();
commit_token(CppToken::Type::PreprocessorStatement);
continue;
}

View File

@ -35,6 +35,8 @@ namespace GUI {
__TOKEN(Unknown) \
__TOKEN(Whitespace) \
__TOKEN(PreprocessorStatement) \
__TOKEN(IncludeStatement) \
__TOKEN(IncludePath) \
__TOKEN(LeftParen) \
__TOKEN(RightParen) \
__TOKEN(LeftCurly) \

View File

@ -23,10 +23,12 @@ static TextStyle style_for_token_type(CppToken::Type type)
case CppToken::Type::SingleQuotedString:
case CppToken::Type::Integer:
case CppToken::Type::Float:
case CppToken::Type::IncludePath:
return { Color::from_rgb(0x800000) };
case CppToken::Type::EscapeSequence:
return { Color::from_rgb(0x800080), &Gfx::Font::default_bold_fixed_width_font() };
case CppToken::Type::PreprocessorStatement:
case CppToken::Type::IncludeStatement:
return { Color::from_rgb(0x008080) };
case CppToken::Type::Comment:
return { Color::from_rgb(0x008000) };