[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdev-ruby/gsoc] duchain: Created a helper function for registering module mixins. Updated tests.
From:       Miquel_Sabaté <mikisabate () gmail ! com>
Date:       2012-05-31 19:29:56
Message-ID: 20120531192956.8DF9BA60C8 () git ! kde ! org
[Download RAW message or body]

Git commit 25240319e742fe14c933fa38155cd670bf8f91ee by Miquel Sabaté.
Committed on 31/05/2012 at 18:48.
Pushed by mssola into branch 'gsoc'.

Created a helper function for registering module mixins. Updated tests.

M  +21   -11   duchain/builders/declarationbuilder.cpp
M  +2    -0    duchain/builders/declarationbuilder.h
M  +3    -3    duchain/declarations/classdeclaration.cpp
M  +2    -1    duchain/declarations/classdeclaration.h
M  +7    -3    duchain/tests/duchain.cpp

http://commits.kde.org/kdev-ruby/25240319e742fe14c933fa38155cd670bf8f91ee

diff --git a/duchain/builders/declarationbuilder.cpp b/duchain/builders/declarationbuilder.cpp
index d6a5957..6e567b0 100644
--- a/duchain/builders/declarationbuilder.cpp
+++ b/duchain/builders/declarationbuilder.cpp
@@ -425,18 +425,9 @@ void DeclarationBuilder::visitInclude(RubyAst *node)
     ModuleDeclaration *decl = getModuleDeclaration(module);
 
     // Register module mix-in
-    if (lastClassModule) {
-        ModuleDeclaration *current = dynamic_cast<ModuleDeclaration *>(lastClassModule);
-        if (current) {
-            ModuleMixin mixin;
-            mixin.included = true;
-            mixin.module = decl->indexedType();
-            current->addModuleMixin(mixin);
-        }
-    } else {
-        // TODO: register to the Kernel module
-    }
+    registerModuleMixin(decl->indexedType(), true);
 
+    // Include the instance methods
     if (decl) {
         QList<MethodDeclaration *> iMethods = getDeclaredMethods(decl);
         foreach (MethodDeclaration *md, iMethods) {
@@ -458,6 +449,10 @@ void DeclarationBuilder::visitExtend(RubyAst *node)
     RubyAst *module = new RubyAst(node->tree->r, node->context);
     ModuleDeclaration *decl = getModuleDeclaration(module);
 
+    // Register module mix-in
+    registerModuleMixin(decl->indexedType(), false);
+
+    // Include the class methods
     if (decl) {
         QList<MethodDeclaration *> eMethods = getDeclaredMethods(decl);
         foreach (MethodDeclaration *md, eMethods) {
@@ -628,6 +623,21 @@ ModuleDeclaration * DeclarationBuilder::getModuleDeclaration(const RubyAst *modu
     return lastDecl;
 }
 
+void DeclarationBuilder::registerModuleMixin(IndexedType type, bool include)
+{
+    if (lastClassModule) {
+        ModuleDeclaration *current = dynamic_cast<ModuleDeclaration *>(lastClassModule);
+        if (current) {
+            ModuleMixin mixin;
+            mixin.included = include;
+            mixin.module = type;
+            current->addModuleMixin(mixin);
+        }
+    } else {
+        // TODO: register to the Kernel module
+    }
+}
+
 KDevelop::QualifiedIdentifier DeclarationBuilder::identifierForNode(NameAst *node)
 {
     if (!node)
diff --git a/duchain/builders/declarationbuilder.h b/duchain/builders/declarationbuilder.h
index ab67596..7fe034d 100644
--- a/duchain/builders/declarationbuilder.h
+++ b/duchain/builders/declarationbuilder.h
@@ -108,6 +108,8 @@ private:
 
     QStack<KDevelop::Declaration::AccessPolicy> m_accessPolicyStack;
 
+    void registerModuleMixin(KDevelop::IndexedType type, bool include);
+
 private:
     EditorIntegrator *m_editor;
 };
diff --git a/duchain/declarations/classdeclaration.cpp b/duchain/declarations/classdeclaration.cpp
index d8beb58..4045f1a 100644
--- a/duchain/declarations/classdeclaration.cpp
+++ b/duchain/declarations/classdeclaration.cpp
@@ -44,17 +44,17 @@ ClassDeclaration::ClassDeclaration(ModuleDeclarationData &data)
 
 void ClassDeclaration::setBaseClass(KDevelop::IndexedType base)
 {
-    m_baseClass = base;
+    d_func_dynamic()->baseClass = base;
 }
 
 void ClassDeclaration::clearBaseClass()
 {
-    m_baseClass = KDevelop::IndexedType(0);
+    d_func_dynamic()->baseClass = KDevelop::IndexedType(0);
 }
 
 KDevelop::IndexedType ClassDeclaration::baseClass() const
 {
-    return m_baseClass;
+    return d_func()->baseClass;
 }
 
 } // End of namespace Ruby
diff --git a/duchain/declarations/classdeclaration.h b/duchain/declarations/classdeclaration.h
index 04fd48e..b3d10cb 100644
--- a/duchain/declarations/classdeclaration.h
+++ b/duchain/declarations/classdeclaration.h
@@ -46,6 +46,8 @@ public:
     {
         
     }
+
+    KDevelop::IndexedType baseClass;
 };
 
 class KDEVRUBYDUCHAIN_EXPORT ClassDeclaration : public ModuleDeclaration
@@ -77,7 +79,6 @@ public:
 
 private:
     DUCHAIN_DECLARE_DATA(ClassDeclaration)
-    KDevelop::IndexedType m_baseClass;
 };
 
 } // End of namespace Ruby
diff --git a/duchain/tests/duchain.cpp b/duchain/tests/duchain.cpp
index 6c4329f..020c8e5 100644
--- a/duchain/tests/duchain.cpp
+++ b/duchain/tests/duchain.cpp
@@ -662,8 +662,8 @@ void TestDUChain::checkSubClassing()
     QCOMPARE(final->internalContext()->childContexts().count(), 0);
     QCOMPARE(final->internalContext()->importedParentContexts().count(), 1);
     QCOMPARE(final->internalContext()->localScopeIdentifier(), QualifiedIdentifier("Final"));
-    QCOMPARE(final->baseClassesSize(), 1u);
-    QCOMPARE(final->baseClasses()[0].baseClass, base->indexedType());
+    QVERIFY(final->baseClass());
+    QCOMPARE(final->baseClass(), base->indexedType());
 }
 
 void TestDUChain::checkDeclarationsOnSubClass()
@@ -810,7 +810,11 @@ void TestDUChain::include1()
     DUChainWriteLocker lock(DUChain::lock());
 
     Declaration *obj = top->findLocalDeclarations(Identifier("Klass")).first();
-    QVERIFY(obj->internalContext()->localDeclarations(obj->topContext()).size() == 1);
+    ModuleDeclaration *md = dynamic_cast<ModuleDeclaration *>(obj);
+    QVERIFY(md);
+    QCOMPARE(md->internalContext()->localDeclarations(md->topContext()).size(), 1);
+    QCOMPARE(md->moduleMixinsSize(), 1u);
+    QCOMPARE(md->moduleMixins()[0].module.type<StructureType>()->qualifiedIdentifier(), QualifiedIdentifier("AA::BB"));
 }
 
 void TestDUChain::include2()

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic