diff --git a/Libraries/LibGUI/CppLexer.cpp b/Libraries/LibGUI/CppLexer.cpp index 10b7df7dca5..fcf5bd7f8c0 100644 --- a/Libraries/LibGUI/CppLexer.cpp +++ b/Libraries/LibGUI/CppLexer.cpp @@ -345,8 +345,40 @@ Vector 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; } diff --git a/Libraries/LibGUI/CppLexer.h b/Libraries/LibGUI/CppLexer.h index ae8b4d2651b..9de2e319e0b 100644 --- a/Libraries/LibGUI/CppLexer.h +++ b/Libraries/LibGUI/CppLexer.h @@ -35,6 +35,8 @@ namespace GUI { __TOKEN(Unknown) \ __TOKEN(Whitespace) \ __TOKEN(PreprocessorStatement) \ + __TOKEN(IncludeStatement) \ + __TOKEN(IncludePath) \ __TOKEN(LeftParen) \ __TOKEN(RightParen) \ __TOKEN(LeftCurly) \ diff --git a/Libraries/LibGUI/CppSyntaxHighlighter.cpp b/Libraries/LibGUI/CppSyntaxHighlighter.cpp index 116530424d7..c4a200f2703 100644 --- a/Libraries/LibGUI/CppSyntaxHighlighter.cpp +++ b/Libraries/LibGUI/CppSyntaxHighlighter.cpp @@ -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) };