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

List:       kde-commits
Subject:    [kdev-php] completion: CodeCompletion ImplementationItem: extend to support member variables
From:       Niko Sams <niko.sams () gmail ! com>
Date:       2013-11-20 19:56:13
Message-ID: E1VjDsj-0005XM-9W () scm ! kde ! org
[Download RAW message or body]

Git commit acbc72c1552eaf5e8a4001572e7754c3730b4963 by Niko Sams.
Committed on 20/11/2013 at 19:53.
Pushed by nsams into branch 'master'.

CodeCompletion ImplementationItem: extend to support member variables

Example:
class A {
    protected $x = 1;
}
class B extends A {
}
this change will allow overriding $x in B by adding "protected $x = "

M  +56   -56   completion/context.cpp
M  +57   -45   completion/implementationitem.cpp
M  +2    -1    completion/implementationitem.h

http://commits.kde.org/kdev-php/acbc72c1552eaf5e8a4001572e7754c3730b4963

diff --git a/completion/context.cpp b/completion/context.cpp
index 435428a..fa3694e 100644
--- a/completion/context.cpp
+++ b/completion/context.cpp
@@ -1254,64 +1254,64 @@ QList<CompletionTreeItemPointer> CodeCompletionContext::completionItems(bool& ab
                     //TODO: always add __construct, __destruct and maby other magic functions
                     // get all visible declarations and add inherited to the completion items
                     foreach(const DeclarationDepthPair& decl, ctx->allDeclarations(ctx->range().end, \
                m_duContext->topContext(), false)) {
-                        if (decl.first->isFunctionDeclaration()) {
-                            ClassFunctionDeclaration *method = \
                dynamic_cast<ClassFunctionDeclaration*>(decl.first);
-                            if (method) {
-                                if (decl.second == 0) {
-                                    // this function is already implemented
-                                    alreadyImplemented << decl.first->indexedIdentifier().getIndex();
-                                    continue;
-                                }
-                                // skip already implemented functions
-                                if \
                (alreadyImplemented.contains(decl.first->indexedIdentifier().getIndex())) {
-                                    continue;
-                                }
-                                // skip non-static functions when requested
-                                if (filterNonStatic && !method->isStatic()) {
-                                    continue;
-                                }
-                                // skip static functions when requested
-                                if (filterStatic && method->isStatic()) {
-                                    continue;
-                                }
-                                // always skip private functions
-                                if (method->accessPolicy() == Declaration::Private) {
-                                    continue;
-                                }
-                                // skip public functions when requested
-                                if (filterPublic && method->accessPolicy() == Declaration::Public) {
-                                    // make sure no non-public base methods are added
-                                    alreadyImplemented << decl.first->indexedIdentifier().getIndex();
-                                    continue;
-                                }
-                                // skip final methods
-                                if (method->isFinal()) {
-                                    // make sure no non-final base methods are added
-                                    alreadyImplemented << decl.first->indexedIdentifier().getIndex();
-                                    continue;
-                                }
-                                // make sure we inherit or implement the base class of this method
-                                if (!method->context() || !method->context()->owner()) {
-                                    kDebug() << "invalid parent context/owner:" << method->toString();
-                                    continue;
-                                }
-                                if \
                (!currentClass->isPublicBaseClass(dynamic_cast<ClassDeclaration*>(method->context()->owner()),
                
-                                                                        m_duContext->topContext())) {
-                                    continue;
-                                }
-
-                                ImplementationItem::HelperType itype;
-                                if (method->isAbstract()) {
-                                    itype = ImplementationItem::Implement;
-                                } else {
-                                    itype = ImplementationItem::Override;
-                                }
-
-                                items << CompletionTreeItemPointer(new ImplementationItem(itype, \
                DeclarationPointer(decl.first),
-                                                                    \
                KDevelop::CodeCompletionContext::Ptr(this), decl.second));
-                                // don't add identical items twice to the completion choices
+                        ClassMemberDeclaration *member = \
dynamic_cast<ClassMemberDeclaration*>(decl.first); +                        if (member) {
+                            if (decl.second == 0) {
+                                // this function is already implemented
                                 alreadyImplemented << decl.first->indexedIdentifier().getIndex();
+                                continue;
                             }
+                            // skip already implemented functions
+                            if (alreadyImplemented.contains(decl.first->indexedIdentifier().getIndex())) \
{ +                                continue;
+                            }
+                            // skip non-static functions when requested
+                            if (filterNonStatic && !member->isStatic()) {
+                                continue;
+                            }
+                            // skip static functions when requested
+                            if (filterStatic && member->isStatic()) {
+                                continue;
+                            }
+                            // always skip private functions
+                            if (member->accessPolicy() == Declaration::Private) {
+                                continue;
+                            }
+                            // skip public functions when requested
+                            if (filterPublic && member->accessPolicy() == Declaration::Public) {
+                                // make sure no non-public base members are added
+                                alreadyImplemented << decl.first->indexedIdentifier().getIndex();
+                                continue;
+                            }
+                            // skip final members
+                            if (member->isFinal()) {
+                                // make sure no non-final base members are added
+                                alreadyImplemented << decl.first->indexedIdentifier().getIndex();
+                                continue;
+                            }
+                            // make sure we inherit or implement the base class of this member
+                            if (!member->context() || !member->context()->owner()) {
+                                kDebug() << "invalid parent context/owner:" << member->toString();
+                                continue;
+                            }
+                            if \
(!currentClass->isPublicBaseClass(dynamic_cast<ClassDeclaration*>(member->context()->owner()), +          \
m_duContext->topContext())) { +                                continue;
+                            }
+
+                            ImplementationItem::HelperType itype;
+                            if (!member->isFunctionDeclaration()) {
+                                itype = ImplementationItem::OverrideVar;
+                            } else if (member->isAbstract()) {
+                                itype = ImplementationItem::Implement;
+                            } else {
+                                itype = ImplementationItem::Override;
+                            }
+
+                            items << CompletionTreeItemPointer(new ImplementationItem(itype, \
DeclarationPointer(decl.first), +                                                                \
KDevelop::CodeCompletionContext::Ptr(this), decl.second)); +                            // don't add \
identical items twice to the completion choices +                            alreadyImplemented << \
decl.first->indexedIdentifier().getIndex();  }
                     }
                 }
diff --git a/completion/implementationitem.cpp b/completion/implementationitem.cpp
index cf6838c..d67ea54 100644
--- a/completion/implementationitem.cpp
+++ b/completion/implementationitem.cpp
@@ -55,6 +55,7 @@ QVariant ImplementationItem::data(const QModelIndex& index, int role, const Code
         if (index.column() == KTextEditor::CodeCompletionModel::Icon) {
             switch (m_type) {
             case Override:
+            case OverrideVar:
                 RETURN_CACHED_ICON("CTparents");
             case Implement:
                 RETURN_CACHED_ICON("CTsuppliers");
@@ -66,6 +67,7 @@ QVariant ImplementationItem::data(const QModelIndex& index, int role, const Code
             QString prefix;
             switch (m_type) {
             case Override:
+            case OverrideVar:
                 prefix = i18n("Override");
                 break;
             case Implement:
@@ -175,24 +177,28 @@ void ImplementationItem::execute(KTextEditor::Document* document, const KTextEdi
         bool isConstructorOrDestructor = false;
         bool isInterface = false;
 
-        if (ClassMethodDeclaration* method = \
dynamic_cast<ClassMethodDeclaration*>(m_declaration.data())) { +        if (ClassMemberDeclaration* \
                member = dynamic_cast<ClassMemberDeclaration*>(m_declaration.data())) {
             // NOTE: it should _never_ be private - but that's the completionmodel / context / worker's \
                job
             if (!modifiers.contains("public") && !modifiers.contains("protected")) {
-                if (method->accessPolicy() == Declaration::Protected) {
+                if (member->accessPolicy() == Declaration::Protected) {
                     replText += "protected ";
                 } else {
                     replText += "public ";
                 }
             }
-            if (!modifiers.contains("static") && method->isStatic()) {
+            if (!modifiers.contains("static") && member->isStatic()) {
                 replText += "static ";
             }
-            functionName = method->prettyName().str();
+            functionName = member->identifier().toString();
 
-            isConstructorOrDestructor = method->isConstructor() || method->isDestructor();
+            ClassMethodDeclaration* method = \
dynamic_cast<ClassMethodDeclaration*>(m_declaration.data()); +            if (method) {
+                functionName = method->prettyName().str();
+                isConstructorOrDestructor = method->isConstructor() || method->isDestructor();
+            }
 
-            if (method->context() && method->context()->owner()) {
-                ClassDeclaration* classDec = \
dynamic_cast<ClassDeclaration*>(method->context()->owner()); +            if (member->context() && \
member->context()->owner()) { +                ClassDeclaration* classDec = \
dynamic_cast<ClassDeclaration*>(member->context()->owner());  if (classDec) {
                     isInterface = (classDec->classType() == ClassDeclarationData::Interface);
                 }
@@ -202,52 +208,58 @@ void ImplementationItem::execute(KTextEditor::Document* document, const KTextEdi
             functionName = m_declaration->identifier().toString();
         }
 
-        if (!modifiers.contains("function")) {
-            replText += "function ";
-        }
+        if (m_type == ImplementationItem::OverrideVar) {
+            replText += "$" + functionName + " = ";
+        } else {
+            if (!modifiers.contains("function")) {
+                replText += "function ";
+            }
 
-        replText += functionName;
+            replText += functionName;
+
+            {
+                // get argument list
+                QString arguments;
+                createArgumentList(*this, arguments, 0, true);
+                replText += arguments;
+            }
 
-        {
-            // get argument list
             QString arguments;
-            createArgumentList(*this, arguments, 0, true);
-            replText += arguments;
-        }
+            QVector<Declaration*> parameters;
+            if (DUChainUtils::getArgumentContext(m_declaration.data()))
+                parameters = \
DUChainUtils::getArgumentContext(m_declaration.data())->localDeclarations(); +            arguments = \
'('; +            bool first = true;
+            foreach(Declaration* dec, parameters) {
+                if (first)
+                    first = false;
+                else
+                    arguments += ", ";
+
+                arguments += '$' + dec->identifier().toString();
+            }
+            arguments += ')';
 
-        QString arguments;
-        QVector<Declaration*> parameters;
-        if (DUChainUtils::getArgumentContext(m_declaration.data()))
-            parameters = DUChainUtils::getArgumentContext(m_declaration.data())->localDeclarations();
-        arguments = '(';
-        bool first = true;
-        foreach(Declaration* dec, parameters) {
-            if (first)
-                first = false;
-            else
-                arguments += ", ";
-
-            arguments += '$' + dec->identifier().toString();
-        }
-        arguments += ')';
+            bool voidReturnType = false;
+            if (FunctionType::Ptr::dynamicCast(m_declaration->abstractType())) {
+                AbstractType::Ptr retType = \
FunctionType::Ptr::staticCast(m_declaration->abstractType())->returnType(); +                if \
(retType->equals(new IntegralType(IntegralType::TypeVoid))) { +                    voidReturnType = true;
+                }
+            }
 
-        bool voidReturnType = false;
-        if (FunctionType::Ptr::dynamicCast(m_declaration->abstractType())) {
-            AbstractType::Ptr retType = \
                FunctionType::Ptr::staticCast(m_declaration->abstractType())->returnType();
-            if (retType->equals(new IntegralType(IntegralType::TypeVoid))) {
-                voidReturnType = true;
+            replText += QString("\n%1{\n%1    ").arg(indendation);
+            if (isInterface || m_type == ImplementationItem::Implement) {
+            } else if (!isConstructorOrDestructor && !voidReturnType) {
+                replText += QString("$ret = parent::%2%3;\n%1    return \
$ret;").arg(indendation).arg(functionName).arg(arguments); +            } else {
+                replText += QString("parent::%1%2;").arg(functionName).arg(arguments);
             }
-        }
+            replText += QString("\n%1}\n%1")
+                    .arg(indendation);
 
-        replText += QString("\n%1{\n%1    ").arg(indendation);
-        if (isInterface || m_type == ImplementationItem::Implement) {
-        } else if (!isConstructorOrDestructor && !voidReturnType) {
-            replText += QString("$ret = parent::%2%3;\n%1    return \
                $ret;").arg(indendation).arg(functionName).arg(arguments);
-        } else {
-            replText += QString("parent::%1%2;").arg(functionName).arg(arguments);
         }
-        replText += QString("\n%1}\n%1")
-                .arg(indendation);
+
 
         //TODO: properly place the cursor inside the {} part
         document->replaceText(replaceRange, replText);
diff --git a/completion/implementationitem.h b/completion/implementationitem.h
index 6763cdb..6f173fc 100644
--- a/completion/implementationitem.h
+++ b/completion/implementationitem.h
@@ -34,7 +34,8 @@ class ImplementationItem : public NormalDeclarationCompletionItem
 public:
     enum HelperType {
         Override,
-        Implement
+        Implement,
+        OverrideVar
     };
 
     explicit ImplementationItem(HelperType type, KDevelop::DeclarationPointer decl = \
KDevelop::DeclarationPointer(), KSharedPtr<KDevelop::CodeCompletionContext> context = \
KSharedPtr<KDevelop::CodeCompletionContext>(), int _inheritanceDepth = 0)


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

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