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

LibCodeComprehension: Re-organize code comprehension related code

This moves all code comprehension-related code to a new library,
LibCodeComprehension.

This also moves some types related to code comprehension tasks (such as
autocomplete, find declaration) out of LibGUI and into
LibCodeComprehension.
This commit is contained in:
Itamar 2022-05-14 17:09:24 +03:00 committed by Andreas Kling
parent a2c34554cd
commit b35293d945
65 changed files with 685 additions and 491 deletions

View file

@ -1012,9 +1012,9 @@ void Parser::print_tokens() const
}
}
Vector<Parser::TodoEntry> Parser::get_todo_entries() const
Vector<CodeComprehension::TodoEntry> Parser::get_todo_entries() const
{
Vector<TodoEntry> ret;
Vector<CodeComprehension::TodoEntry> ret;
for (auto& token : m_tokens) {
if (token.type() == Token::Type::Comment) {
if (token.text().contains("TODO")) {

View file

@ -10,6 +10,7 @@
#include "AST.h"
#include "Preprocessor.h"
#include <AK/Noncopyable.h>
#include <LibCodeComprehension/Types.h>
#include <LibCpp/Lexer.h>
namespace Cpp {
@ -35,13 +36,7 @@ public:
Vector<Token> const& tokens() const { return m_tokens; }
Vector<String> const& errors() const { return m_errors; }
struct TodoEntry {
String content;
String filename;
size_t line { 0 };
size_t column { 0 };
};
Vector<TodoEntry> get_todo_entries() const;
Vector<CodeComprehension::TodoEntry> get_todo_entries() const;
Vector<Token> tokens_in_range(Position start, Position end) const;

View file

@ -15,7 +15,7 @@ namespace Cpp {
void SemanticSyntaxHighlighter::rehighlight(Palette const& palette)
{
Vector<GUI::AutocompleteProvider::TokenInfo> new_tokens_info;
Vector<CodeComprehension::TokenInfo> new_tokens_info;
auto text = m_client->get_text();
{
Threading::MutexLocker locker(m_lock);
@ -39,7 +39,7 @@ void SemanticSyntaxHighlighter::rehighlight(Palette const& palette)
// An improvement over this could be only including the tokens that are in edited text ranges in the diff.
auto diff_hunks = Diff::from_text(previous.view(), current.view());
for (auto& token : current_tokens) {
new_tokens_info.append(GUI::AutocompleteProvider::TokenInfo { GUI::AutocompleteProvider::TokenInfo::SemanticType::Unknown,
new_tokens_info.append(CodeComprehension::TokenInfo { CodeComprehension::TokenInfo::SemanticType::Unknown,
token.start().line, token.start().column, token.end().line, token.end().column });
}
size_t previous_token_index = 0;
@ -67,47 +67,47 @@ void SemanticSyntaxHighlighter::rehighlight(Palette const& palette)
update_spans(new_tokens_info, palette);
}
static Syntax::TextStyle style_for_token_type(Gfx::Palette const& palette, GUI::AutocompleteProvider::TokenInfo::SemanticType type)
static Syntax::TextStyle style_for_token_type(Gfx::Palette const& palette, CodeComprehension::TokenInfo::SemanticType type)
{
switch (type) {
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Unknown:
case CodeComprehension::TokenInfo::SemanticType::Unknown:
return { palette.base_text(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Keyword:
case CodeComprehension::TokenInfo::SemanticType::Keyword:
return { palette.syntax_keyword(), true };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Type:
case CodeComprehension::TokenInfo::SemanticType::Type:
return { palette.syntax_type(), true };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Identifier:
case CodeComprehension::TokenInfo::SemanticType::Identifier:
return { palette.syntax_identifier(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::String:
case CodeComprehension::TokenInfo::SemanticType::String:
return { palette.syntax_string(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Number:
case CodeComprehension::TokenInfo::SemanticType::Number:
return { palette.syntax_number(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::IncludePath:
case CodeComprehension::TokenInfo::SemanticType::IncludePath:
return { palette.syntax_preprocessor_value(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::PreprocessorStatement:
case CodeComprehension::TokenInfo::SemanticType::PreprocessorStatement:
return { palette.syntax_preprocessor_statement(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Comment:
case CodeComprehension::TokenInfo::SemanticType::Comment:
return { palette.syntax_comment(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Function:
case CodeComprehension::TokenInfo::SemanticType::Function:
return { palette.syntax_function(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Variable:
case CodeComprehension::TokenInfo::SemanticType::Variable:
return { palette.syntax_variable(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::CustomType:
case CodeComprehension::TokenInfo::SemanticType::CustomType:
return { palette.syntax_custom_type(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Namespace:
case CodeComprehension::TokenInfo::SemanticType::Namespace:
return { palette.syntax_namespace(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Member:
case CodeComprehension::TokenInfo::SemanticType::Member:
return { palette.syntax_member(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::Parameter:
case CodeComprehension::TokenInfo::SemanticType::Parameter:
return { palette.syntax_parameter(), false };
case GUI::AutocompleteProvider::TokenInfo::SemanticType::PreprocessorMacro:
case CodeComprehension::TokenInfo::SemanticType::PreprocessorMacro:
return { palette.syntax_preprocessor_value(), false };
default:
VERIFY_NOT_REACHED();
return { palette.base_text(), false };
}
}
void SemanticSyntaxHighlighter::update_spans(Vector<GUI::AutocompleteProvider::TokenInfo> const& tokens_info, Gfx::Palette const& pallete)
void SemanticSyntaxHighlighter::update_spans(Vector<CodeComprehension::TokenInfo> const& tokens_info, Gfx::Palette const& pallete)
{
Vector<GUI::TextDocumentSpan> spans;
for (auto& token : tokens_info) {
@ -118,7 +118,7 @@ void SemanticSyntaxHighlighter::update_spans(Vector<GUI::AutocompleteProvider::T
auto style = style_for_token_type(pallete, token.type);
span.attributes.color = style.color;
span.attributes.bold = style.bold;
span.is_skippable = token.type == GUI::AutocompleteProvider::TokenInfo::SemanticType::Whitespace;
span.is_skippable = token.type == CodeComprehension::TokenInfo::SemanticType::Whitespace;
span.data = static_cast<u64>(token.type);
spans.append(span);
}
@ -130,7 +130,7 @@ void SemanticSyntaxHighlighter::update_spans(Vector<GUI::AutocompleteProvider::T
m_client->do_update();
}
void SemanticSyntaxHighlighter::update_tokens_info(Vector<GUI::AutocompleteProvider::TokenInfo> tokens_info)
void SemanticSyntaxHighlighter::update_tokens_info(Vector<CodeComprehension::TokenInfo> tokens_info)
{
{
Threading::MutexLocker locker(m_lock);
@ -145,22 +145,21 @@ void SemanticSyntaxHighlighter::update_tokens_info(Vector<GUI::AutocompleteProvi
bool SemanticSyntaxHighlighter::is_identifier(u64 token_type) const
{
using GUI::AutocompleteProvider;
auto type = static_cast<AutocompleteProvider::TokenInfo::SemanticType>(token_type);
auto type = static_cast<CodeComprehension::TokenInfo::SemanticType>(token_type);
return type == AutocompleteProvider::TokenInfo::SemanticType::Identifier
|| type == AutocompleteProvider::TokenInfo::SemanticType::Function
|| type == AutocompleteProvider::TokenInfo::SemanticType::Variable
|| type == AutocompleteProvider::TokenInfo::SemanticType::CustomType
|| type == AutocompleteProvider::TokenInfo::SemanticType::Namespace
|| type == AutocompleteProvider::TokenInfo::SemanticType::Member
|| type == AutocompleteProvider::TokenInfo::SemanticType::Parameter
|| type == AutocompleteProvider::TokenInfo::SemanticType::PreprocessorMacro;
return type == CodeComprehension::TokenInfo::SemanticType::Identifier
|| type == CodeComprehension::TokenInfo::SemanticType::Function
|| type == CodeComprehension::TokenInfo::SemanticType::Variable
|| type == CodeComprehension::TokenInfo::SemanticType::CustomType
|| type == CodeComprehension::TokenInfo::SemanticType::Namespace
|| type == CodeComprehension::TokenInfo::SemanticType::Member
|| type == CodeComprehension::TokenInfo::SemanticType::Parameter
|| type == CodeComprehension::TokenInfo::SemanticType::PreprocessorMacro;
}
bool SemanticSyntaxHighlighter::is_navigatable(u64 token_type) const
{
return static_cast<GUI::AutocompleteProvider::TokenInfo::SemanticType>(token_type) == GUI::AutocompleteProvider::TokenInfo::SemanticType::IncludePath;
return static_cast<CodeComprehension::TokenInfo::SemanticType>(token_type) == CodeComprehension::TokenInfo::SemanticType::IncludePath;
}
}

View file

@ -27,7 +27,7 @@ public:
virtual Syntax::Language language() const override { return Syntax::Language::Cpp; }
virtual void rehighlight(Palette const&) override;
void update_tokens_info(Vector<GUI::AutocompleteProvider::TokenInfo>);
void update_tokens_info(Vector<CodeComprehension::TokenInfo>);
virtual bool is_cpp_semantic_highlighter() const override { return true; }
@ -36,10 +36,10 @@ protected:
virtual bool token_types_equal(u64 token1, u64 token2) const override { return m_simple_syntax_highlighter.token_types_equal(token1, token2); };
private:
void update_spans(Vector<GUI::AutocompleteProvider::TokenInfo> const&, Gfx::Palette const&);
void update_spans(Vector<CodeComprehension::TokenInfo> const&, Gfx::Palette const&);
Cpp::SyntaxHighlighter m_simple_syntax_highlighter;
Vector<GUI::AutocompleteProvider::TokenInfo> m_tokens_info;
Vector<CodeComprehension::TokenInfo> m_tokens_info;
String m_saved_tokens_text;
Vector<Token> m_saved_tokens;
Threading::Mutex m_lock;