Преглед изворни кода

LanguageServers/Cpp: Complete Preprocessor definitions

Preprocessor definitions now appear in the AutoComplete suggestions box
as well as in the Locator.
Itamar пре 4 година
родитељ
комит
7bf6eca9d8

BIN
Base/res/icons/hackstudio/Preprocessor.png


+ 14 - 1
Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp

@@ -163,6 +163,13 @@ Vector<GUI::AutocompleteProvider::Entry> ParserAutoComplete::autocomplete_name(c
             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;
 }
 
@@ -275,9 +282,11 @@ NonnullRefPtrVector<Declaration> ParserAutoComplete::get_declarations_in_outer_s
             continue;
         declarations.append(get_declarations_in_outer_scope_including_headers(*included_document));
     }
+
     for (auto& decl : document.parser().root_node()->declarations()) {
         declarations.append(decl);
     }
+
     return declarations;
 }
 
@@ -374,6 +383,11 @@ void ParserAutoComplete::update_declared_symbols(const DocumentData& document)
     for (auto& decl : document.parser().root_node()->declarations()) {
         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));
 }
 
@@ -403,7 +417,6 @@ OwnPtr<ParserAutoComplete::DocumentData> ParserAutoComplete::create_document_dat
         all_definitions.set(move(item.key), move(item.value));
 
     for (auto include : document_data->preprocessor().included_paths()) {
-
         auto included_document = get_or_create_document_data(document_path_from_include_path(include));
         if (!included_document)
             continue;

+ 3 - 0
Userland/DevTools/HackStudio/Locator.cpp

@@ -86,6 +86,7 @@ public:
                 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 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) {
                 case GUI::AutocompleteProvider::DeclarationType::Struct:
                     return struct_icon;
@@ -95,6 +96,8 @@ public:
                     return function_icon;
                 case GUI::AutocompleteProvider::DeclarationType::Variable:
                     return variable_icon;
+                case GUI::AutocompleteProvider::DeclarationType::PreprocessorDefinition:
+                    return preprocessor_icon;
                 }
                 return {};
             }

+ 4 - 0
Userland/Libraries/LibCpp/Preprocessor.cpp

@@ -105,10 +105,14 @@ void Preprocessor::handle_preprocessor_line(const StringView& line)
         if (m_state == State::Normal) {
             auto key = lexer.consume_until(' ');
             consume_whitespace();
+
             DefinedValue value;
+            value.line = m_line_index;
+
             auto string_value = lexer.consume_all();
             if (!string_value.is_empty())
                 value.value = string_value;
+
             m_definitions.set(key, value);
         }
         return;

+ 2 - 0
Userland/Libraries/LibCpp/Preprocessor.h

@@ -43,6 +43,8 @@ public:
 
     struct DefinedValue {
         Optional<StringView> value;
+        size_t line {0};
+        size_t column {0};
     };
     using Definitions = HashMap<StringView, DefinedValue>;
 

+ 3 - 1
Userland/Libraries/LibGUI/AutocompleteProvider.h

@@ -42,6 +42,7 @@ public:
 
     enum class CompletionKind {
         Identifier,
+        PreprocessorDefinition,
     };
 
     enum class Language {
@@ -66,7 +67,8 @@ public:
         Function,
         Struct,
         Class,
-        Variable
+        Variable,
+        PreprocessorDefinition,
     };
 
     struct Declaration {