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:
Itamar 2021-03-13 09:50:33 +02:00 committed by Andreas Kling
parent 5b22f6f45a
commit 7bf6eca9d8
Notes: sideshowbarker 2024-07-18 21:25:34 +09:00
6 changed files with 26 additions and 2 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -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;

View File

@ -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 {};
} }

View File

@ -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;

View File

@ -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>;

View File

@ -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 {