CppComprehensionEngine.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright (c) 2021, Itamar S. <itamar8910@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <AK/String.h>
  9. #include <AK/Vector.h>
  10. #include <DevTools/HackStudio/AutoCompleteResponse.h>
  11. #include <DevTools/HackStudio/LanguageServers/CodeComprehensionEngine.h>
  12. #include <DevTools/HackStudio/LanguageServers/FileDB.h>
  13. #include <LibCpp/AST.h>
  14. #include <LibCpp/Parser.h>
  15. #include <LibCpp/Preprocessor.h>
  16. #include <LibGUI/TextPosition.h>
  17. namespace LanguageServers::Cpp {
  18. using namespace ::Cpp;
  19. class CppComprehensionEngine : public CodeComprehensionEngine {
  20. public:
  21. CppComprehensionEngine(const FileDB& filedb);
  22. virtual Vector<GUI::AutocompleteProvider::Entry> get_suggestions(const String& file, const GUI::TextPosition& autocomplete_position) override;
  23. virtual void on_edit(const String& file) override;
  24. virtual void file_opened([[maybe_unused]] const String& file) override;
  25. virtual Optional<GUI::AutocompleteProvider::ProjectLocation> find_declaration_of(const String& filename, const GUI::TextPosition& identifier_position) override;
  26. private:
  27. struct DocumentData {
  28. const String& filename() const { return m_filename; }
  29. const String& text() const { return m_text; }
  30. const Preprocessor& preprocessor() const
  31. {
  32. VERIFY(m_preprocessor);
  33. return *m_preprocessor;
  34. }
  35. Preprocessor& preprocessor()
  36. {
  37. VERIFY(m_preprocessor);
  38. return *m_preprocessor;
  39. }
  40. const Parser& parser() const
  41. {
  42. VERIFY(m_parser);
  43. return *m_parser;
  44. }
  45. Parser& parser()
  46. {
  47. VERIFY(m_parser);
  48. return *m_parser;
  49. }
  50. String m_filename;
  51. String m_text;
  52. OwnPtr<Preprocessor> m_preprocessor;
  53. OwnPtr<Parser> m_parser;
  54. // FIXME: This HashTable must be re-computed if a declaration from a header file is modified
  55. HashTable<NonnullRefPtr<Declaration>> m_declarations_from_headers;
  56. };
  57. Vector<GUI::AutocompleteProvider::Entry> autocomplete_property(const DocumentData&, const MemberExpression&, const String partial_text) const;
  58. Vector<GUI::AutocompleteProvider::Entry> autocomplete_name(const DocumentData&, const ASTNode&, const String& partial_text) const;
  59. String type_of(const DocumentData&, const Expression&) const;
  60. String type_of_property(const DocumentData&, const Identifier&) const;
  61. String type_of_variable(const Identifier&) const;
  62. bool is_property(const ASTNode&) const;
  63. bool is_empty_property(const DocumentData&, const ASTNode&, const Position& autocomplete_position) const;
  64. RefPtr<Declaration> find_declaration_of(const DocumentData&, const ASTNode&) const;
  65. enum class RecurseIntoScopes {
  66. No,
  67. Yes
  68. };
  69. NonnullRefPtrVector<Declaration> get_available_declarations(const DocumentData&, const ASTNode&, RecurseIntoScopes) const;
  70. struct PropertyInfo {
  71. StringView name;
  72. RefPtr<Type> type;
  73. };
  74. Vector<PropertyInfo> properties_of_type(const DocumentData& document, const String& type) const;
  75. NonnullRefPtrVector<Declaration> get_global_declarations_including_headers(const DocumentData&, RecurseIntoScopes) const;
  76. NonnullRefPtrVector<Declaration> get_global_declarations(const DocumentData&, RecurseIntoScopes) const;
  77. NonnullRefPtrVector<Declaration> get_declarations_recursive(const ASTNode&) const;
  78. const DocumentData* get_document_data(const String& file) const;
  79. const DocumentData* get_or_create_document_data(const String& file);
  80. void set_document_data(const String& file, OwnPtr<DocumentData>&& data);
  81. OwnPtr<DocumentData> create_document_data_for(const String& file);
  82. String document_path_from_include_path(const StringView& include_path) const;
  83. void update_declared_symbols(DocumentData&);
  84. GUI::AutocompleteProvider::DeclarationType type_of_declaration(const Declaration&);
  85. String scope_of_declaration(const Declaration&) const;
  86. String scope_of_name_or_identifier(const ASTNode& node) const;
  87. Optional<GUI::AutocompleteProvider::ProjectLocation> find_preprocessor_definition(const DocumentData&, const GUI::TextPosition&);
  88. OwnPtr<DocumentData> create_document_data(String&& text, const String& filename);
  89. Optional<Vector<GUI::AutocompleteProvider::Entry>> try_autocomplete_property(const DocumentData&, const ASTNode&, Optional<Token> containing_token) const;
  90. Optional<Vector<GUI::AutocompleteProvider::Entry>> try_autocomplete_name(const DocumentData&, const ASTNode&, Optional<Token> containing_token) const;
  91. HashMap<String, OwnPtr<DocumentData>> m_documents;
  92. };
  93. }