mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 10:27:35 +00:00
LanguageServers/Cpp: ParserAutoComplete engine inspects header files
... and performs preprocessing on the source code before parsing. To support this, we are now able to keep track of multiple files in the autocomplete engine. We re-parse a file whenever it is edited.
This commit is contained in:
parent
02038a0ede
commit
72fdab7bfb
4 changed files with 170 additions and 48 deletions
|
@ -26,41 +26,59 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "LibCpp/AST.h"
|
||||
#include "AutoCompleteEngine.h"
|
||||
#include "FileDB.h"
|
||||
#include <AK/String.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <DevTools/HackStudio/AutoCompleteResponse.h>
|
||||
#include <LibCpp/AST.h>
|
||||
#include <LibCpp/Parser.h>
|
||||
#include <LibCpp/Preprocessor.h>
|
||||
#include <LibGUI/TextPosition.h>
|
||||
|
||||
namespace LanguageServers::Cpp {
|
||||
|
||||
using namespace ::Cpp;
|
||||
|
||||
class ParserAutoComplete {
|
||||
class ParserAutoComplete : public AutoCompleteEngine {
|
||||
public:
|
||||
ParserAutoComplete(const String& code);
|
||||
ParserAutoComplete(const FileDB& filedb);
|
||||
|
||||
Vector<GUI::AutocompleteProvider::Entry> get_suggestions(const GUI::TextPosition& autocomplete_position) const;
|
||||
virtual Vector<GUI::AutocompleteProvider::Entry> 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;
|
||||
|
||||
private:
|
||||
Vector<GUI::AutocompleteProvider::Entry> autocomplete_property(const MemberExpression&, const StringView partial_text) const;
|
||||
Vector<GUI::AutocompleteProvider::Entry> autocomplete_identifier(const ASTNode&) const;
|
||||
String type_of(const Expression&) const;
|
||||
String type_of_property(const Identifier&) const;
|
||||
struct DocumentData {
|
||||
DocumentData(String&& text);
|
||||
String text;
|
||||
Preprocessor preprocessor;
|
||||
Parser parser;
|
||||
};
|
||||
|
||||
Vector<GUI::AutocompleteProvider::Entry> autocomplete_property(const DocumentData&, const MemberExpression&, const StringView partial_text) const;
|
||||
Vector<GUI::AutocompleteProvider::Entry> autocomplete_identifier(const DocumentData&, const ASTNode&) 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 ASTNode&, const Position& autocomplete_position) const;
|
||||
bool is_empty_property(const DocumentData&, const ASTNode&, const Position& autocomplete_position) const;
|
||||
|
||||
struct PropertyInfo {
|
||||
StringView name;
|
||||
RefPtr<Type> type;
|
||||
};
|
||||
Vector<PropertyInfo> properties_of_type(const String& type) const;
|
||||
Vector<PropertyInfo> properties_of_type(const DocumentData& document, const String& type) const;
|
||||
NonnullRefPtrVector<Declaration> get_declarations_in_outer_scope_including_headers(const DocumentData& document) const;
|
||||
|
||||
private:
|
||||
String m_code;
|
||||
Cpp::Parser m_parser;
|
||||
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<DocumentData>&& data);
|
||||
|
||||
OwnPtr<DocumentData> create_document_data_for(const String& file);
|
||||
String document_path_from_include_path(const StringView& include_path) const;
|
||||
|
||||
HashMap<String, OwnPtr<DocumentData>> m_documents;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue