/* * Copyright (c) 2021, Itamar S. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace LanguageServers::Cpp { using namespace ::Cpp; class CppComprehensionEngine : public CodeComprehensionEngine { public: CppComprehensionEngine(const FileDB& filedb); virtual Vector get_suggestions(const String& file, const GUI::TextPosition& autocomplete_position) override; virtual void on_edit(const String& file) override; virtual void file_opened([[maybe_unused]] const String& file) override; virtual Optional find_declaration_of(const String& filename, const GUI::TextPosition& identifier_position) override; private: struct DocumentData { const String& filename() const { return m_filename; } const String& text() const { return m_text; } const Preprocessor& preprocessor() const { VERIFY(m_preprocessor); return *m_preprocessor; } Preprocessor& preprocessor() { VERIFY(m_preprocessor); return *m_preprocessor; } const Parser& parser() const { VERIFY(m_parser); return *m_parser; } Parser& parser() { VERIFY(m_parser); return *m_parser; } String m_filename; String m_text; OwnPtr m_preprocessor; OwnPtr m_parser; // FIXME: This HashTable must be re-computed if a declaration from a header file is modified HashTable> m_declarations_from_headers; }; Vector autocomplete_property(const DocumentData&, const MemberExpression&, const String partial_text) const; Vector autocomplete_name(const DocumentData&, const ASTNode&, const String& partial_text) const; String type_of(const DocumentData&, const Expression&) const; String type_of_property(const DocumentData&, const Identifier&) const; String type_of_variable(const Identifier&) const; bool is_property(const ASTNode&) const; bool is_empty_property(const DocumentData&, const ASTNode&, const Position& autocomplete_position) const; RefPtr find_declaration_of(const DocumentData&, const ASTNode&) const; enum class RecurseIntoScopes { No, Yes }; NonnullRefPtrVector get_available_declarations(const DocumentData&, const ASTNode&, RecurseIntoScopes) const; struct PropertyInfo { StringView name; RefPtr type; }; Vector properties_of_type(const DocumentData& document, const String& type) const; NonnullRefPtrVector get_global_declarations_including_headers(const DocumentData&, RecurseIntoScopes) const; NonnullRefPtrVector get_global_declarations(const DocumentData&, RecurseIntoScopes) const; NonnullRefPtrVector get_declarations_recursive(const ASTNode&) const; const DocumentData* get_document_data(const String& file) const; const DocumentData* get_or_create_document_data(const String& file); void set_document_data(const String& file, OwnPtr&& data); OwnPtr create_document_data_for(const String& file); String document_path_from_include_path(const StringView& include_path) const; void update_declared_symbols(DocumentData&); GUI::AutocompleteProvider::DeclarationType type_of_declaration(const Declaration&); String scope_of_declaration(const Declaration&) const; String scope_of_name_or_identifier(const ASTNode& node) const; Optional find_preprocessor_definition(const DocumentData&, const GUI::TextPosition&); OwnPtr create_document_data(String&& text, const String& filename); Optional> try_autocomplete_property(const DocumentData&, const ASTNode&, Optional containing_token) const; Optional> try_autocomplete_name(const DocumentData&, const ASTNode&, Optional containing_token) const; HashMap> m_documents; }; }