mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-06 02:55:49 +03:00
LanguageServers/Cpp: Complete Preprocessor definitions
Preprocessor definitions now appear in the AutoComplete suggestions box as well as in the Locator.
This commit is contained in:
parent
5b22f6f45a
commit
7bf6eca9d8
Notes:
sideshowbarker
2024-07-18 21:25:34 +09:00
Author: https://github.com/itamar8910 Commit: https://github.com/SerenityOS/serenity/commit/7bf6eca9d81 Pull-request: https://github.com/SerenityOS/serenity/pull/5755
BIN
Base/res/icons/hackstudio/Preprocessor.png
Normal file
BIN
Base/res/icons/hackstudio/Preprocessor.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
@ -163,6 +163,13 @@ Vector<GUI::AutocompleteProvider::Entry> ParserAutoComplete::autocomplete_name(c
|
|||||||
suggestions.append({ name.to_string(), partial_text.length(), GUI::AutocompleteProvider::CompletionKind::Identifier });
|
suggestions.append({ name.to_string(), partial_text.length(), GUI::AutocompleteProvider::CompletionKind::Identifier });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto& preprocessor_name : document.parser().definitions().keys()) {
|
||||||
|
if (preprocessor_name.starts_with(partial_text)) {
|
||||||
|
suggestions.append({ preprocessor_name.to_string(), partial_text.length(), GUI::AutocompleteProvider::CompletionKind::PreprocessorDefinition });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return suggestions;
|
return suggestions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,9 +282,11 @@ NonnullRefPtrVector<Declaration> ParserAutoComplete::get_declarations_in_outer_s
|
|||||||
continue;
|
continue;
|
||||||
declarations.append(get_declarations_in_outer_scope_including_headers(*included_document));
|
declarations.append(get_declarations_in_outer_scope_including_headers(*included_document));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& decl : document.parser().root_node()->declarations()) {
|
for (auto& decl : document.parser().root_node()->declarations()) {
|
||||||
declarations.append(decl);
|
declarations.append(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return declarations;
|
return declarations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,6 +383,11 @@ void ParserAutoComplete::update_declared_symbols(const DocumentData& document)
|
|||||||
for (auto& decl : document.parser().root_node()->declarations()) {
|
for (auto& decl : document.parser().root_node()->declarations()) {
|
||||||
declarations.append({ decl.name(), { document.filename(), decl.start().line, decl.start().column }, type_of_declaration(decl) });
|
declarations.append({ decl.name(), { document.filename(), decl.start().line, decl.start().column }, type_of_declaration(decl) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto& definition : document.preprocessor().definitions()) {
|
||||||
|
declarations.append({ definition.key, { document.filename(), definition.value.line, definition.value.column }, GUI::AutocompleteProvider::DeclarationType::PreprocessorDefinition });
|
||||||
|
}
|
||||||
|
|
||||||
set_declarations_of_document(document.filename(), move(declarations));
|
set_declarations_of_document(document.filename(), move(declarations));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +417,6 @@ OwnPtr<ParserAutoComplete::DocumentData> ParserAutoComplete::create_document_dat
|
|||||||
all_definitions.set(move(item.key), move(item.value));
|
all_definitions.set(move(item.key), move(item.value));
|
||||||
|
|
||||||
for (auto include : document_data->preprocessor().included_paths()) {
|
for (auto include : document_data->preprocessor().included_paths()) {
|
||||||
|
|
||||||
auto included_document = get_or_create_document_data(document_path_from_include_path(include));
|
auto included_document = get_or_create_document_data(document_path_from_include_path(include));
|
||||||
if (!included_document)
|
if (!included_document)
|
||||||
continue;
|
continue;
|
||||||
|
@ -86,6 +86,7 @@ public:
|
|||||||
static GUI::Icon class_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Class.png"));
|
static GUI::Icon class_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Class.png"));
|
||||||
static GUI::Icon function_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Function.png"));
|
static GUI::Icon function_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Function.png"));
|
||||||
static GUI::Icon variable_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Variable.png"));
|
static GUI::Icon variable_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Variable.png"));
|
||||||
|
static GUI::Icon preprocessor_icon(Gfx::Bitmap::load_from_file("/res/icons/hackstudio/Preprocessor.png"));
|
||||||
switch (suggestion.as_symbol_declaration.value().type) {
|
switch (suggestion.as_symbol_declaration.value().type) {
|
||||||
case GUI::AutocompleteProvider::DeclarationType::Struct:
|
case GUI::AutocompleteProvider::DeclarationType::Struct:
|
||||||
return struct_icon;
|
return struct_icon;
|
||||||
@ -95,6 +96,8 @@ public:
|
|||||||
return function_icon;
|
return function_icon;
|
||||||
case GUI::AutocompleteProvider::DeclarationType::Variable:
|
case GUI::AutocompleteProvider::DeclarationType::Variable:
|
||||||
return variable_icon;
|
return variable_icon;
|
||||||
|
case GUI::AutocompleteProvider::DeclarationType::PreprocessorDefinition:
|
||||||
|
return preprocessor_icon;
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -105,10 +105,14 @@ void Preprocessor::handle_preprocessor_line(const StringView& line)
|
|||||||
if (m_state == State::Normal) {
|
if (m_state == State::Normal) {
|
||||||
auto key = lexer.consume_until(' ');
|
auto key = lexer.consume_until(' ');
|
||||||
consume_whitespace();
|
consume_whitespace();
|
||||||
|
|
||||||
DefinedValue value;
|
DefinedValue value;
|
||||||
|
value.line = m_line_index;
|
||||||
|
|
||||||
auto string_value = lexer.consume_all();
|
auto string_value = lexer.consume_all();
|
||||||
if (!string_value.is_empty())
|
if (!string_value.is_empty())
|
||||||
value.value = string_value;
|
value.value = string_value;
|
||||||
|
|
||||||
m_definitions.set(key, value);
|
m_definitions.set(key, value);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -43,6 +43,8 @@ public:
|
|||||||
|
|
||||||
struct DefinedValue {
|
struct DefinedValue {
|
||||||
Optional<StringView> value;
|
Optional<StringView> value;
|
||||||
|
size_t line {0};
|
||||||
|
size_t column {0};
|
||||||
};
|
};
|
||||||
using Definitions = HashMap<StringView, DefinedValue>;
|
using Definitions = HashMap<StringView, DefinedValue>;
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ public:
|
|||||||
|
|
||||||
enum class CompletionKind {
|
enum class CompletionKind {
|
||||||
Identifier,
|
Identifier,
|
||||||
|
PreprocessorDefinition,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Language {
|
enum class Language {
|
||||||
@ -66,7 +67,8 @@ public:
|
|||||||
Function,
|
Function,
|
||||||
Struct,
|
Struct,
|
||||||
Class,
|
Class,
|
||||||
Variable
|
Variable,
|
||||||
|
PreprocessorDefinition,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Declaration {
|
struct Declaration {
|
||||||
|
Loading…
Reference in New Issue
Block a user