[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