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:
parent
a2c34554cd
commit
b35293d945
65 changed files with 685 additions and 491 deletions
|
@ -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")) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue