Skip to content

Commit

Permalink
HackStudio+LanguageServers/Cpp: Show scope of symbols in Locator
Browse files Browse the repository at this point in the history
  • Loading branch information
itamar8910 authored and awesomekling committed Mar 23, 2021
1 parent 6054a41 commit 84e34d7
Show file tree
Hide file tree
Showing 10 changed files with 52 additions and 13 deletions.
4 changes: 4 additions & 0 deletions Base/home/anon/Source/little/other.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "other.h"
#include <stdio.h>

namespace MyNamespace {

int func()
{
int x = 1;
Expand All @@ -12,3 +14,5 @@ int func()
printf("x+y: %d\n", x + y);
return x + y;
}

}
5 changes: 5 additions & 0 deletions Base/home/anon/Source/little/other.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@

namespace MyNamespace {

int func();

#define USE_VAR2
Expand All @@ -12,3 +15,5 @@ struct StructInHeader {
int var3;
#endif
};

}
5 changes: 5 additions & 0 deletions Userland/DevTools/HackStudio/AutoCompleteResponse.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ inline bool encode(Encoder& encoder, const GUI::AutocompleteProvider::Declaratio
if (!encode(encoder, declaration.position))
return false;
encoder << (u32)declaration.type;
encoder << declaration.scope;
return true;
}

Expand All @@ -109,10 +110,14 @@ inline bool decode(Decoder& decoder, GUI::AutocompleteProvider::Declaration& dec

if (!decode(decoder, declaration.position))
return false;

u32 type;
if (!decoder.decode(type))
return false;

if (!decoder.decode(declaration.scope))
return false;

declaration.type = static_cast<GUI::AutocompleteProvider::DeclarationType>(type);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,7 @@ NonnullRefPtrVector<Declaration> ParserAutoComplete::get_global_declarations(con

for (auto& decl : node.declarations()) {
declarations.append(decl);
if(decl.is_namespace())
{
if (decl.is_namespace()) {
declarations.append(get_global_declarations(decl));
}
}
Expand Down Expand Up @@ -410,13 +409,12 @@ void ParserAutoComplete::update_declared_symbols(const DocumentData& document)
{
Vector<GUI::AutocompleteProvider::Declaration> declarations;

for(auto& decl : get_global_declarations(*document.parser().root_node()))
{
declarations.append({ decl.name(), { document.filename(), decl.start().line, decl.start().column }, type_of_declaration(decl) });
for (auto& decl : get_global_declarations(*document.parser().root_node())) {
declarations.append({ decl.name(), { document.filename(), decl.start().line, decl.start().column }, type_of_declaration(decl), scope_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 });
declarations.append({ definition.key, { document.filename(), definition.value.line, definition.value.column }, GUI::AutocompleteProvider::DeclarationType::PreprocessorDefinition, {} });
}

set_declarations_of_document(document.filename(), move(declarations));
Expand Down Expand Up @@ -460,4 +458,27 @@ OwnPtr<ParserAutoComplete::DocumentData> ParserAutoComplete::create_document_dat
return document_data;
}

String ParserAutoComplete::scope_of_declaration(const Declaration& decl)
{

auto parent = decl.parent();
if (!parent)
return {};

if (!parent->is_declaration())
return {};

auto& parent_decl = static_cast<Declaration&>(*parent);

if (parent_decl.is_namespace()) {
auto& containing_namespace = static_cast<NamespaceDeclaration&>(parent_decl);
auto scope_of_parent = scope_of_declaration(parent_decl);
if (scope_of_parent.is_null())
return containing_namespace.m_name;
return String::formatted("{}::{}", scope_of_parent, containing_namespace.m_name);
}

return {};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ class ParserAutoComplete : public AutoCompleteEngine {
String document_path_from_include_path(const StringView& include_path) const;
void update_declared_symbols(const DocumentData&);
GUI::AutocompleteProvider::DeclarationType type_of_declaration(const Declaration&);
String scope_of_declaration(const Declaration&);
Optional<GUI::AutocompleteProvider::ProjectLocation> find_preprocessor_definition(const DocumentData&, const GUI::TextPosition&);

OwnPtr<DocumentData> create_document_data(String&& text, const String& filename);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ void AutoComplete::update_declared_symbols(const DocumentData& document)

if (!name.is_empty()) {
dbgln("Found variable {}", name);
declarations.append({ move(name), { filename, entry.name->position().start_line.line_number, entry.name->position().start_line.line_column }, GUI::AutocompleteProvider::DeclarationType::Variable });
declarations.append({ move(name), { filename, entry.name->position().start_line.line_number, entry.name->position().start_line.line_column }, GUI::AutocompleteProvider::DeclarationType::Variable, {} });
}
}
::Shell::AST::NodeVisitor::visit(node);
Expand All @@ -242,7 +242,7 @@ void AutoComplete::update_declared_symbols(const DocumentData& document)
void visit(const ::Shell::AST::FunctionDeclaration* node) override
{
dbgln("Found function {}", node->name().name);
declarations.append({ node->name().name, { filename, node->position().start_line.line_number, node->position().start_line.line_column }, GUI::AutocompleteProvider::DeclarationType::Function });
declarations.append({ node->name().name, { filename, node->position().start_line.line_number, node->position().start_line.line_column }, GUI::AutocompleteProvider::DeclarationType::Function, {} });
}

const String& filename;
Expand Down
9 changes: 6 additions & 3 deletions Userland/DevTools/HackStudio/Locator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ class LocatorSuggestionModel final : public GUI::Model {
return GUI::FileIconProvider::icon_for_path(suggestion.as_filename.value());
}
if (suggestion.is_symbol_declaration()) {
if (index.column() == Column::Name)
return suggestion.as_symbol_declaration.value().name;
if (index.column() == Column::Name) {
if (suggestion.as_symbol_declaration.value().scope.is_null())
return suggestion.as_symbol_declaration.value().name;
return String::formatted("{}::{}", suggestion.as_symbol_declaration.value().scope, suggestion.as_symbol_declaration.value().name);
}
if (index.column() == Column::Filename)
return suggestion.as_symbol_declaration.value().position.file;
if (index.column() == Column::Icon) {
Expand Down Expand Up @@ -225,7 +228,7 @@ void Locator::update_suggestions()

for (auto& item : m_document_to_declarations) {
for (auto& decl : item.value) {
if (decl.name.contains(typed_text, CaseSensitivity::CaseInsensitive))
if (decl.name.contains(typed_text, CaseSensitivity::CaseInsensitive) || decl.scope.contains(typed_text, CaseSensitivity::CaseInsensitive))
suggestions.append((LocatorSuggestionModel::Suggestion::create_symbol_declaration(decl)));
}
}
Expand Down
2 changes: 1 addition & 1 deletion Userland/Libraries/LibCpp/AST.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class ASTNode : public RefCounted<ASTNode> {
virtual bool is_variable_or_parameter_declaration() const { return false; }
virtual bool is_function_call() const { return false; }
virtual bool is_type() const { return false; }
virtual bool is_declaration() const { return false; }

protected:
ASTNode(ASTNode* parent, Optional<Position> start, Optional<Position> end, const String& filename)
Expand Down Expand Up @@ -113,7 +114,6 @@ class Statement : public ASTNode {
virtual ~Statement() override = default;
virtual const char* class_name() const override { return "Statement"; }

virtual bool is_declaration() const { return false; }
virtual NonnullRefPtrVector<Declaration> declarations() const override;

protected:
Expand Down
1 change: 0 additions & 1 deletion Userland/Libraries/LibCpp/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ class Parser final {
NonnullRefPtrVector<Declaration> parse_declarations_in_translation_unit(ASTNode& parent);
RefPtr<Declaration> parse_single_declaration_in_translation_unit(ASTNode& parent);


bool match(Token::Type);
Token consume(Token::Type);
Token consume();
Expand Down
1 change: 1 addition & 0 deletions Userland/Libraries/LibGUI/AutocompleteProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class AutocompleteProvider {
String name;
ProjectLocation position;
DeclarationType type;
String scope;
};

virtual void provide_completions(Function<void(Vector<Entry>)>) = 0;
Expand Down

0 comments on commit 84e34d7

Please sign in to comment.