From 7bf6eca9d81ca5ac4176a4533c8bf3cce03252dc Mon Sep 17 00:00:00 2001 From: Itamar Date: Sat, 13 Mar 2021 09:50:33 +0200 Subject: [PATCH] LanguageServers/Cpp: Complete Preprocessor definitions Preprocessor definitions now appear in the AutoComplete suggestions box as well as in the Locator. --- Base/res/icons/hackstudio/Preprocessor.png | Bin 0 -> 2267 bytes .../LanguageServers/Cpp/ParserAutoComplete.cpp | 15 ++++++++++++++- Userland/DevTools/HackStudio/Locator.cpp | 3 +++ Userland/Libraries/LibCpp/Preprocessor.cpp | 4 ++++ Userland/Libraries/LibCpp/Preprocessor.h | 2 ++ Userland/Libraries/LibGUI/AutocompleteProvider.h | 4 +++- 6 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 Base/res/icons/hackstudio/Preprocessor.png diff --git a/Base/res/icons/hackstudio/Preprocessor.png b/Base/res/icons/hackstudio/Preprocessor.png new file mode 100644 index 0000000000000000000000000000000000000000..45edf08aa1e956bba8c733c9cdb890832febadb6 GIT binary patch literal 2267 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s-Q>#KEN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsHU}zd2P!ljqOzE>lL&h8D{?@7JSX(BJLdl{_RK8*&XnwR;gnpI)o13< zJ%4MS-Ch`MARjMy>aot1?c7fVlB{{;WcZaAo;~p0d4-JAq4we%kE<+}=luG`^|z4O z+IU-iUZ~@gV4o$7r3ve28T~qDr}5?5^aYy>G|T@5A$>PT|C=+>iPWN=eG7)?rHq}PS&_UUhLjX zN2&CJGh5lS4O^7)m%aujELp^eazU*qy)chpAD)yOy;+3T&@`mKNT>`DM+S zoi&{&WalsBHPAP2k>K7Lnk+4_uyTr&KCAty=w_P(TnatYXYq>b?8_4}z0{q1l66Z$ zyvy#nvm3sZ)(LVwkX7X2RQS-T5~Q^Lj2DZm6ob~2Uey9tCK2Uwj+2fmjM5g25!Q18 zcYP~*V%x95sj^5VFk$jihBX38Z`_*?ws}pFNb1qd+A<^Ab5c`t`_d(ut+y8~a$Kwy zYI-)xM<-%SN>>IlJYK(XD&n*{{ zynSbHz2o&@_L5abmI0jaySB)8=Hp+A=eJXQ1_pI*t8} zQnFWmIAy)PENyyb)w^r4-s@)J@`umdYFclrulPE3+wImH-wrJe*8gDl zMla$WS-%9vfM+Dq;QH%I%73Hu(wOZ#-;Ol)G3$twJ98HsccwA`f+9$I)yOIFi)6zX{(9Ps`-MtgxfATKzL)OYuXKbzFv4w%u*;HFI9 zDoZEjPd#b7&Tg8zevZqp8%LJ$HZo1%L7!@3fv*?Pz6u^@S^oW&hq5^T70*;_9y+ z-Y5$UztpGx`t1M8)mz_xFkbmGVBhmz^O>DBhI6*+a|YZ!H+goHcj^391shHJ6db3v zo!fdgF+O0A*kiF^(|#}2IA)iclnKuTdyidlUZJTJzPb9Ky#Bkk7y92DHRs>|u;tu; zFIW9lS?vKjC#+=n&r~qfa{QBj`*r8ednXy@rn(=Uy`}x?PqX4lbr0s7~?dXL<(({m@h-=@N`_0B81t{dwgE;;IQxX5~) ziGkCsZ^!3-d~q`MUG0zQYIlYHil!Go&QAZm_M5*-mpTjUk-YcEI-^AkPj8>U{C|1m zl2>KF7dWkVm~^jC@sTgL^TTf*cedYnw_f9gdP~Wp*qMbN>d#$t+ozzC>zVAK6t5;=)p39!V>{=bvi@~uV{%ZbXp-ARcf&F3->IE zNh0Fz2e&?Wa6IYi!K0Dk?BR|Ae;5jji-Srg3jLoh5_P1a;7)(}ce(QS3=0EOXI(Yr z%h;8h7UXF-JzmgxJ%>^cqsxQ|GgHra1xf9D{92B2-@T)i)Bf+Ycb^}%K|(;FGkr$l zts}3G1kc`fuyVe|sZ*Q0YW!@{F0ppX?_5{$=h)6Cn+_N+PBSxhmr)h-mR(a~pgmja zqe`LA)sj=Y`4h1DwTbA@_vJu3)83X@GF+k)JYH&a?x0^ut_WDNaj_~jT09B zUD98F;;Z+QpcA2t%ExWY7C4sueNg{lcl7ERGd@f@xnWzVWe% zf5QXgf~DL4O7kZCn*60Ix?7g<@9hIeOQVCoHJp}B_;7N9@6D-ACap<=750nsPccu7 zUQmAZ_1dldm)RA(W0&SPG&?73ak-go_x|0>H*fD7ul-lYkh{NV>G7p|n-~}v*pj^6 zT^K$wSTZ~{$SqjKz`(#+;1OBOz@VoL!i*J5?aLS#7}!fZeO=j~GV=(DYa4ERZ^*#F zAX(xXQR1ARo12KSwK+%d#Qb zcHZ7&H%`7|+%UUW;OzYCMieX} zf|FXMk8L$%&^u$HEPHsGZ^+dboouhKm03?-aQkLz?Ba#mMw>OSZ4u>(Ewq(Q-d)b^ z94@hIl~S}@g_f3>)pN!Q4LhTizE?_9*)^)Qt;+Mi_td5OiC*H_%6~=l$Ncqgx_(Hj l)$T5R|67|cD)PC1%FoFX7N07oGB7YOc)I$ztaD0e0svwgFJ1ru literal 0 HcmV?d00001 diff --git a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp index 27d936b028..9f6ac5aa49 100644 --- a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp +++ b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp @@ -163,6 +163,13 @@ Vector 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 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::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; diff --git a/Userland/DevTools/HackStudio/Locator.cpp b/Userland/DevTools/HackStudio/Locator.cpp index 994600eab2..b796b2ddd4 100644 --- a/Userland/DevTools/HackStudio/Locator.cpp +++ b/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 {}; } diff --git a/Userland/Libraries/LibCpp/Preprocessor.cpp b/Userland/Libraries/LibCpp/Preprocessor.cpp index 5f4f2c29ae..4d3fc2f82f 100644 --- a/Userland/Libraries/LibCpp/Preprocessor.cpp +++ b/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; diff --git a/Userland/Libraries/LibCpp/Preprocessor.h b/Userland/Libraries/LibCpp/Preprocessor.h index e5702b396a..3ae0d35083 100644 --- a/Userland/Libraries/LibCpp/Preprocessor.h +++ b/Userland/Libraries/LibCpp/Preprocessor.h @@ -43,6 +43,8 @@ public: struct DefinedValue { Optional value; + size_t line {0}; + size_t column {0}; }; using Definitions = HashMap; diff --git a/Userland/Libraries/LibGUI/AutocompleteProvider.h b/Userland/Libraries/LibGUI/AutocompleteProvider.h index 3c7fa4cc76..98ae75a89e 100644 --- a/Userland/Libraries/LibGUI/AutocompleteProvider.h +++ b/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 {