Browse Source

HackStudio+LibCpp: Include class members in Locator

Itamar 4 years ago
parent
commit
c6c83bd80e

+ 15 - 9
Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp

@@ -308,6 +308,11 @@ NonnullRefPtrVector<Declaration> ParserAutoComplete::get_global_declarations(con
         if (decl.is_namespace()) {
             declarations.append(get_global_declarations(decl));
         }
+        if (decl.is_struct_or_class()) {
+            for (auto& member_decl : static_cast<StructOrClassDeclaration&>(decl).declarations()) {
+                declarations.append(member_decl);
+            }
+        }
     }
 
     return declarations;
@@ -511,7 +516,6 @@ OwnPtr<ParserAutoComplete::DocumentData> ParserAutoComplete::create_document_dat
 
 String ParserAutoComplete::scope_of_declaration(const Declaration& decl)
 {
-
     auto parent = decl.parent();
     if (!parent)
         return {};
@@ -521,15 +525,17 @@ String ParserAutoComplete::scope_of_declaration(const Declaration& decl)
 
     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);
-    }
+    auto parent_scope = scope_of_declaration(parent_decl);
+    String containing_scope;
+    if (parent_decl.is_namespace())
+        containing_scope = static_cast<NamespaceDeclaration&>(parent_decl).m_name;
+    if (parent_decl.is_struct_or_class())
+        containing_scope = static_cast<StructOrClassDeclaration&>(parent_decl).name();
 
-    return {};
+    if (parent_scope.is_null())
+        return containing_scope;
+
+    return String::formatted("{}::{}", parent_scope, containing_scope);
 }
 
 }

+ 7 - 0
Userland/Libraries/LibCpp/AST.cpp

@@ -309,6 +309,13 @@ void StructOrClassDeclaration::dump(size_t indent) const
         member.dump(indent + 1);
     }
 }
+NonnullRefPtrVector<Declaration> StructOrClassDeclaration::declarations() const
+{
+    NonnullRefPtrVector<Declaration> declarations;
+    for (auto& member : m_members)
+        declarations.append(member);
+    return declarations;
+}
 
 void MemberDeclaration::dump(size_t indent) const
 {

+ 1 - 3
Userland/Libraries/LibCpp/AST.h

@@ -521,7 +521,6 @@ public:
     {
     }
 
-    StringView m_name;
     Vector<StringView> m_entries;
 };
 
@@ -537,7 +536,6 @@ public:
     }
 
     RefPtr<Type> m_type;
-    StringView m_name;
     RefPtr<Expression> m_initial_value;
 };
 
@@ -549,6 +547,7 @@ public:
     virtual bool is_struct_or_class() const override { return true; }
     virtual bool is_struct() const override { return m_type == Type::Struct; }
     virtual bool is_class() const override { return m_type == Type::Class; }
+    virtual NonnullRefPtrVector<Declaration> declarations() const override;
 
     enum class Type {
         Struct,
@@ -683,7 +682,6 @@ public:
 
     virtual NonnullRefPtrVector<Declaration> declarations() const override { return m_declarations; }
 
-    StringView m_name;
     NonnullRefPtrVector<Declaration> m_declarations;
 };