Hello community,

here is the log from the commit of package kdevelop5-plugin-php for 
openSUSE:Factory checked in at 2019-01-15 09:15:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kdevelop5-plugin-php (Old)
 and      /work/SRC/openSUSE:Factory/.kdevelop5-plugin-php.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kdevelop5-plugin-php"

Tue Jan 15 09:15:41 2019 rev:12 rq:660854 version:5.3.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/kdevelop5-plugin-php/kdevelop5-plugin-php.changes    
    2018-11-26 10:22:33.313574133 +0100
+++ 
/work/SRC/openSUSE:Factory/.kdevelop5-plugin-php.new.28833/kdevelop5-plugin-php.changes
     2019-01-15 09:15:45.470269969 +0100
@@ -1,0 +2,9 @@
+Sat Dec 22 19:18:24 UTC 2018 - [email protected]
+
+- New upstream release 5.3.1
+  * Fix handling of array indexes after ClassNameReferences
+    (kde#401278)
+  * Fix syntax support for dynamic member access (kde#400294)
+- Run spec-cleaner
+
+-------------------------------------------------------------------

Old:
----
  kdev-php-5.3.0.tar.xz

New:
----
  kdev-php-5.3.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kdevelop5-plugin-php.spec ++++++
--- /var/tmp/diff_new_pack.fgSDqd/_old  2019-01-15 09:15:46.374269129 +0100
+++ /var/tmp/diff_new_pack.fgSDqd/_new  2019-01-15 09:15:46.378269125 +0100
@@ -18,16 +18,15 @@
 
 # for compatibility with Leap 42.3 which doesn't have this macro yet
 %{!?_kf5_debugdir: %global _kf5_debugdir %{_kf5_configdir}}
-
 %define rname   kdev-php
 %define rversion 5.3
 Name:           kdevelop5-plugin-php
-Version:        5.3.0
+Version:        5.3.1
 Release:        0
 Summary:        PHP plugin for Kdevelop5 Integrated Development Environment
-License:        GPL-2.0+
+License:        GPL-2.0-or-later
 Group:          Development/Tools/IDE
-Url:            http://www.kdevelop.org
+URL:            http://www.kdevelop.org
 Source0:        
http://download.kde.org/stable/kdevelop/%{version}/src/%{rname}-%{version}.tar.xz
 BuildRequires:  extra-cmake-modules
 BuildRequires:  kcmutils-devel
@@ -41,10 +40,9 @@
 BuildRequires:  pkgconfig(Qt5Core)
 BuildRequires:  pkgconfig(Qt5Test)
 BuildRequires:  pkgconfig(Qt5Widgets)
-Conflicts:      kdevelop4-plugin-php
 Requires:       kdevelop5
 Recommends:     %{name}-lang
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
+Conflicts:      kdevelop4-plugin-php
 
 %description
 PHP plugin for Kdevelop Integrated Development Environment
@@ -72,12 +70,12 @@
 Summary:        Translations for package %{name}
 Group:          System/Localization
 Requires:       %{name} = %{version}
-Provides:       %{name}-lang-all = %{version}
 Supplements:    packageand(bundle-lang-other:%{name})
-BuildArch:      noarch
 # Language file conflicts
-Conflicts:      kdevelop4-plugins-php-doc
 Conflicts:      kdevelop4-plugins-php
+Conflicts:      kdevelop4-plugins-php-doc
+Provides:       %{name}-lang-all = %{version}
+BuildArch:      noarch
 
 %description lang
 Provides translations to the package %{name}
@@ -97,7 +95,6 @@
 %postun -p /sbin/ldconfig
 
 %files
-%defattr(-,root,root)
 %license COPYING
 %doc AUTHORS HACKING TODO
 %{_kf5_appstreamdir}/org.kde.kdev-php.metainfo.xml
@@ -113,6 +110,5 @@
 %{_kf5_cmakedir}/KDevPHP/
 
 %files lang -f %{name}.lang
-%defattr(-,root,root)
 
 %changelog

++++++ kdev-php-5.3.0.tar.xz -> kdev-php-5.3.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/CMakeLists.txt 
new/kdev-php-5.3.1/CMakeLists.txt
--- old/kdev-php-5.3.0/CMakeLists.txt   2018-10-25 10:31:46.000000000 +0200
+++ new/kdev-php-5.3.1/CMakeLists.txt   2018-12-06 10:53:12.000000000 +0100
@@ -3,7 +3,7 @@
 
 set(KDEVPHP_VERSION_MAJOR 5)
 set(KDEVPHP_VERSION_MINOR 3)
-set(KDEVPHP_VERSION_PATCH 0)
+set(KDEVPHP_VERSION_PATCH 1)
 project(kdev-php VERSION 
"${KDEVPHP_VERSION_MAJOR}.${KDEVPHP_VERSION_MINOR}.${KDEVPHP_VERSION_PATCH}")
 
 find_package (ECM "5.14.0" REQUIRED NO_MODULE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/docs/kcm_kdevphpdocs.desktop.cmake 
new/kdev-php-5.3.1/docs/kcm_kdevphpdocs.desktop.cmake
--- old/kdev-php-5.3.0/docs/kcm_kdevphpdocs.desktop.cmake       2018-10-25 
10:31:25.000000000 +0200
+++ new/kdev-php-5.3.1/docs/kcm_kdevphpdocs.desktop.cmake       2018-12-06 
10:52:47.000000000 +0100
@@ -37,3 +37,4 @@
 Name[uk]=Документація з PHP
 Name[x-test]=xxPHP Documentationxx
 Name[zh_CN]=PHP 文档
+Name[zh_TW]=PHP 文件
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/docs/kdevphpdocs.json 
new/kdev-php-5.3.1/docs/kdevphpdocs.json
--- old/kdev-php-5.3.0/docs/kdevphpdocs.json    2018-10-25 10:31:25.000000000 
+0200
+++ new/kdev-php-5.3.1/docs/kdevphpdocs.json    2018-12-06 10:52:47.000000000 
+0100
@@ -25,7 +25,8 @@
                 "Name[tr]": "Milian Wolff",
                 "Name[uk]": "Milian Wolff",
                 "Name[x-test]": "xxMilian Wolffxx",
-                "Name[zh_CN]": "Milian Wolff"
+                "Name[zh_CN]": "Milian Wolff",
+                "Name[zh_TW]": "Milian Wolff"
             }
         ],
         "Category": "Documentation",
@@ -51,6 +52,7 @@
         "Description[uk]": "За допомогою цього додатка можна інтегрувати 
документацію PHP.net.",
         "Description[x-test]": "xxThis plugin integrates PHP.net online 
documentation.xx",
         "Description[zh_CN]": "此插件集成了 PHP.net 的在线文档。",
+        "Description[zh_TW]": "此外掛程式整合了 PHP.net 線上文件。",
         "Icon": "application-x-php",
         "Id": "kdevphpdocs",
         "License": "GPL",
@@ -78,6 +80,7 @@
         "Name[uk]": "Документація з PHP",
         "Name[x-test]": "xxPHP Documentationxx",
         "Name[zh_CN]": "PHP 文档",
+        "Name[zh_TW]": "PHP 文件",
         "ServiceTypes": [
             "KDevelop/Plugin"
         ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/duchain/expressionvisitor.cpp 
new/kdev-php-5.3.1/duchain/expressionvisitor.cpp
--- old/kdev-php-5.3.0/duchain/expressionvisitor.cpp    2018-10-25 
10:31:25.000000000 +0200
+++ new/kdev-php-5.3.1/duchain/expressionvisitor.cpp    2018-12-06 
10:52:47.000000000 +0100
@@ -697,20 +697,32 @@
 {
     //don't call DefaultVisitor::visitStaticMember(node);
     //because we would end up in 
visitCompoundVariableWithSimpleIndirectReference
-    if (node->staticProperty->staticProperty->variable->variable) {
-        DUContext* context = findClassContext(node->className);
-        if (context) {
-            useDeclaration(node->staticProperty->staticProperty->variable, 
context);
-        } else {
-            usingDeclaration(node->className, DeclarationPointer());
+    if (node->staticProperty && node->staticProperty->staticProperty) {
+        if (node->staticProperty->staticProperty->variable) {
+            DUContext* context = findClassContext(node->className);
+            if (context) {
+                useDeclaration(node->staticProperty->staticProperty->variable, 
context);
+            } else {
+                usingDeclaration(node->className, DeclarationPointer());
+                m_result.setType(AbstractType::Ptr());
+            }
+        } else if (node->staticProperty->staticProperty->expr) {
+            const QualifiedIdentifier id = 
identifierForNamespace(node->className, m_editor);
+            DeclarationPointer declaration = 
findDeclarationImport(ClassDeclarationType, id);
+            
usingDeclaration(node->className->namespaceNameSequence->back()->element, 
declaration);
+            buildNamespaceUses(node->className, id);
+
+            visitExpr(node->staticProperty->staticProperty->expr);
+
             m_result.setType(AbstractType::Ptr());
         }
-        if (node->staticProperty->offsetItemsSequence) {
-            const KDevPG::ListNode< DimListItemAst* >* it = 
node->staticProperty->offsetItemsSequence->front();
-            do {
-                visitDimListItem(it->element);
-            } while(it->hasNext() && (it = it->next));
-        }
+    }
+
+    if (node->staticProperty && node->staticProperty->offsetItemsSequence) {
+        const KDevPG::ListNode< DimListItemAst* >* it = 
node->staticProperty->offsetItemsSequence->front();
+        do {
+            visitDimListItem(it->element);
+        } while(it->hasNext() && (it = it->next));
     }
 }
 
@@ -719,11 +731,18 @@
     if (node->staticProperty) {
         DUContext* context = findClassContext(node->className->identifier);
 
-        if (context) {
-            useDeclaration(node->staticProperty->staticProperty->variable, 
context);
+        if (context && node->staticProperty && 
node->staticProperty->staticProperty) {
+            if (node->staticProperty->staticProperty->variable) {
+                // static properties (object::$property)
+                useDeclaration(node->staticProperty->staticProperty->variable, 
context);
+            } else if (node->staticProperty->staticProperty->expr) {
+                // variable static properties (object::${$property})
+                visitExpr(node->staticProperty->staticProperty->expr);
+                usingDeclaration(node->className, DeclarationPointer());
+            }
         }
 
-        if (node->staticProperty->offsetItemsSequence) {
+        if (node->staticProperty && node->staticProperty->offsetItemsSequence) 
{
             const KDevPG::ListNode< DimListItemAst* >* dim_it = 
node->staticProperty->offsetItemsSequence->front();
             do {
                 visitDimListItem(dim_it->element);
@@ -749,24 +768,24 @@
                         && 
it->element->property->variableWithoutObjects->variable->variable) {
                     VariableIdentifierAst *varnode = 
it->element->property->variableWithoutObjects->variable->variable;
                     useDeclaration(varnode, m_currentContext);
+                } else if (it->element->property && 
it->element->property->variableWithoutObjects
+                        && 
it->element->property->variableWithoutObjects->variable->expr) {
+                        // variable dynamic properties ($object->${$property})
+                        
visitExpr(it->element->property->variableWithoutObjects->variable->expr);
                 } else if (!m_result.allDeclarations().isEmpty()) {
-                    // handle array indices after normal/static properties 
($object->property[$index] // $object::$property[$index])
-                    if (it->element->property && 
it->element->property->objectDimList && 
it->element->property->objectDimList->offsetItemsSequence) {
-                        const KDevPG::ListNode< DimListItemAst* >* dim_it = 
it->element->property->objectDimList->offsetItemsSequence->front();
-                        do {
-                            visitDimListItem(dim_it->element);
-                        } while(dim_it->hasNext() && (dim_it = dim_it->next));
-                    } else if (it->element->staticProperty && 
it->element->staticProperty->offsetItemsSequence) {
-                        const KDevPG::ListNode< DimListItemAst* >* dim_it = 
it->element->staticProperty->offsetItemsSequence->front();
-                        do {
-                            visitDimListItem(dim_it->element);
-                        } while(dim_it->hasNext() && (dim_it = dim_it->next));
+                    // Handle dynamic static properties first, as they don't 
need a class context
+                    if (it->element->staticProperty && 
it->element->staticProperty->staticProperty
+                      && it->element->staticProperty->staticProperty->expr) {
+                        // variable static properties ($object::${$property})
+                        
visitExpr(it->element->staticProperty->staticProperty->expr);
+                        usingDeclaration(it->element->staticProperty, 
DeclarationPointer());
                     }
 
                     type = 
m_result.allDeclarations().last()->type<StructureType>();
 
                     if (!type) {
                         context = nullptr;
+                        visitClassNameReferenceDimListItems(it->element);
                         continue;
                     }
 
@@ -776,6 +795,7 @@
 
                     if (!declaration) {
                         context = nullptr;
+                        visitClassNameReferenceDimListItems(it->element);
                         continue;
                     }
 
@@ -783,10 +803,12 @@
 
                     if (!context || context->type() != DUContext::Class) {
                         context = nullptr;
+                        visitClassNameReferenceDimListItems(it->element);
                         continue;
                     }
 
-                    if (it->element->staticProperty) {
+                    if (it->element->staticProperty && 
it->element->staticProperty->staticProperty
+                      && 
it->element->staticProperty->staticProperty->variable) {
                         // static properties ($object::$property)
                         VariableIdentifierAst *varnode = 
it->element->staticProperty->staticProperty->variable;
                         useDeclaration(varnode, context);
@@ -798,6 +820,8 @@
                     } else {
                         context = nullptr;
                     }
+
+                    visitClassNameReferenceDimListItems(it->element);
                 }
             } while(it->hasNext() && (it = it->next));
         }
@@ -805,6 +829,22 @@
 
 }
 
+void ExpressionVisitor::visitClassNameReferenceDimListItems(ClassPropertyAst* 
node)
+{
+    // handle array indices after normal/static properties 
($object->property[$index] // $object::$property[$index])
+    if (node->property && node->property->objectDimList && 
node->property->objectDimList->offsetItemsSequence) {
+        const KDevPG::ListNode< DimListItemAst* >* dim_it = 
node->property->objectDimList->offsetItemsSequence->front();
+        do {
+            visitDimListItem(dim_it->element);
+        } while(dim_it->hasNext() && (dim_it = dim_it->next));
+    } else if (node->staticProperty && 
node->staticProperty->offsetItemsSequence) {
+        const KDevPG::ListNode< DimListItemAst* >* dim_it = 
node->staticProperty->offsetItemsSequence->front();
+        do {
+            visitDimListItem(dim_it->element);
+        } while(dim_it->hasNext() && (dim_it = dim_it->next));
+    }
+}
+
 void ExpressionVisitor::visitUnaryExpression(UnaryExpressionAst* node)
 {
     DefaultVisitor::visitUnaryExpression(node);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/duchain/expressionvisitor.h 
new/kdev-php-5.3.1/duchain/expressionvisitor.h
--- old/kdev-php-5.3.0/duchain/expressionvisitor.h      2018-10-25 
10:31:25.000000000 +0200
+++ new/kdev-php-5.3.1/duchain/expressionvisitor.h      2018-12-06 
10:52:47.000000000 +0100
@@ -68,6 +68,7 @@
     void visitVariableProperty(VariablePropertyAst *node) override;
     void visitStaticMember(StaticMemberAst* node) override;
     void visitClassNameReference(ClassNameReferenceAst* node) override;
+    void visitClassNameReferenceDimListItems(ClassPropertyAst* node);
     void visitUnaryExpression(UnaryExpressionAst* node) override;
     void visitAdditiveExpressionRest(AdditiveExpressionRestAst* node) override;
     void visitVariable(VariableAst* node) override;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/duchain/helper.cpp 
new/kdev-php-5.3.1/duchain/helper.cpp
--- old/kdev-php-5.3.0/duchain/helper.cpp       2018-10-25 10:31:25.000000000 
+0200
+++ new/kdev-php-5.3.1/duchain/helper.cpp       2018-12-06 10:52:47.000000000 
+0100
@@ -571,9 +571,8 @@
 
     if (node->isVariadic != -1) {
         auto *container = new IndexedContainer();
-        const IndexedString *containerType = new IndexedString("array");
         container->addEntry(type);
-        container->setPrettyName(*containerType);
+        container->setPrettyName(IndexedString("array"));
         type = AbstractType::Ptr(container);
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/duchain/tests/uses.cpp 
new/kdev-php-5.3.1/duchain/tests/uses.cpp
--- old/kdev-php-5.3.0/duchain/tests/uses.cpp   2018-10-25 10:31:25.000000000 
+0200
+++ new/kdev-php-5.3.1/duchain/tests/uses.cpp   2018-12-06 10:52:47.000000000 
+0100
@@ -390,6 +390,26 @@
     compareUses(top->localDeclarations().at(1), RangeInRevision(0, 52, 0, 56));
 }
 
+void TestUses::dynamicStaticMemberVariable()
+{
+    //                 0         1         2         3         4         5     
    6         7
+    //                 
01234567890123456789012345678901234567890123456789012345678901234567890123456789
+    QByteArray method("<? class A { public static $foo; } $var='foo'; 
A::${$var};");
+    TopDUContext* top = parse(method, DumpAll);
+    DUChainReleaser releaseTop(top);
+    DUChainWriteLocker lock(DUChain::lock());
+
+    Declaration* dec = top->localDeclarations().at(0);
+    QCOMPARE(dec->identifier(), Identifier("a"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(0, 47, 0, 48));
+
+    dec = top->localDeclarations().at(1);
+    QCOMPARE(dec->identifier(), Identifier("var"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(0, 52, 0, 56));
+}
+
 void TestUses::constant()
 {
     //                 0         1         2         3         4         5     
    6         7
@@ -1333,6 +1353,98 @@
                     << RangeInRevision(3, 38, 3, 42));
 }
 
+void TestUses::instanceofDynamicStaticProperty()
+{
+    //                         0         1         2         3         4       
  5
+    //                         
012345678901234567890123456789012345678901234567890123456789
+    TopDUContext* top = parse("<? class A { /** @var B **/ public $foo; }\n"
+                              "class B { /** @var A **/ public $bar; }\n"
+                              "$foo = 'foo'; $bar = 'bar';\n"
+                              "$a = new A(); $a instanceof 
$a::${$foo}::${$bar}::${$foo};\n", DumpNone);
+
+    QVERIFY(top);
+    DUChainReleaser releaseTop(top);
+    DUChainWriteLocker lock;
+
+    QVERIFY(top->problems().isEmpty());
+
+    QVERIFY(!top->parentContext());
+    QCOMPARE(top->childContexts().count(), 2);
+    QCOMPARE(top->localDeclarations().count(), 5);
+
+    Declaration* dec = top->localDeclarations().at(0);
+    QCOMPARE(dec->identifier(), Identifier("a"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 9, 3, 10));
+
+    dec = top->localDeclarations().at(4);
+    QCOMPARE(dec->identifier(), Identifier("a"));
+    StructureType::Ptr classType = dec->type<StructureType>();
+    QVERIFY(classType);
+    QCOMPARE(classType->qualifiedIdentifier(), QualifiedIdentifier("a"));
+    QVERIFY(classType->equals(dec->abstractType().data()));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 14, 3, 16)
+                    << RangeInRevision(3, 28, 3, 30));
+
+    dec = top->localDeclarations().at(2);
+    QCOMPARE(dec->identifier(), Identifier("foo"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 34, 3, 38)
+                    << RangeInRevision(3, 52, 3, 56));
+
+    dec = top->localDeclarations().at(3);
+    QCOMPARE(dec->identifier(), Identifier("bar"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 43, 3, 47));
+}
+
+void TestUses::instanceofDynamicVariableProperty()
+{
+    //                         0         1         2         3         4       
  5
+    //                         
012345678901234567890123456789012345678901234567890123456789
+    TopDUContext* top = parse("<? class A { /** @var B **/ public $foo; }\n"
+                              "class B { /** @var A **/ public $bar; }\n"
+                              "$foo = 'foo'; $bar = 'bar';\n"
+                              "$a = new A(); $a instanceof 
$a->${$foo}->${$bar}->${$foo};\n", DumpNone);
+
+    QVERIFY(top);
+    DUChainReleaser releaseTop(top);
+    DUChainWriteLocker lock;
+
+    QVERIFY(top->problems().isEmpty());
+
+    QVERIFY(!top->parentContext());
+    QCOMPARE(top->childContexts().count(), 2);
+    QCOMPARE(top->localDeclarations().count(), 5);
+
+    Declaration* dec = top->localDeclarations().at(0);
+    QCOMPARE(dec->identifier(), Identifier("a"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 9, 3, 10));
+
+    dec = top->localDeclarations().at(4);
+    QCOMPARE(dec->identifier(), Identifier("a"));
+    StructureType::Ptr classType = dec->type<StructureType>();
+    QVERIFY(classType);
+    QCOMPARE(classType->qualifiedIdentifier(), QualifiedIdentifier("a"));
+    QVERIFY(classType->equals(dec->abstractType().data()));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 14, 3, 16)
+                    << RangeInRevision(3, 28, 3, 30));
+
+    dec = top->localDeclarations().at(2);
+    QCOMPARE(dec->identifier(), Identifier("foo"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 34, 3, 38)
+                    << RangeInRevision(3, 52, 3, 56));
+
+    dec = top->localDeclarations().at(3);
+    QCOMPARE(dec->identifier(), Identifier("bar"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(3, 43, 3, 47));
+}
+
 void TestUses::instanceofPropertyArrayAccess()
 {
     //                         0         1         2         3         4       
  5
@@ -1376,6 +1488,39 @@
     QVERIFY(dec->uses().isEmpty());
 }
 
+void TestUses::dimListAfterClassNameReference()
+{
+    //                         0         1         2         3         4       
  5
+    //                         
012345678901234567890123456789012345678901234567890123456789
+    TopDUContext* top = parse("<? class A { /** @var array **/ public $foo;\n"
+                              "public function bar() { $object = new 
$this->foo[$index]; }\n"
+                              "}\n", DumpNone);
+
+    QVERIFY(top);
+    DUChainReleaser releaseTop(top);
+    DUChainWriteLocker lock;
+
+    QVERIFY(top->problems().isEmpty());
+
+    QVERIFY(!top->parentContext());
+    QCOMPARE(top->childContexts().count(), 1);
+    QCOMPARE(top->localDeclarations().count(), 1);
+
+    Declaration* dec = top->localDeclarations().at(0);
+    QCOMPARE(dec->identifier(), Identifier("a"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(1, 38, 1, 43));
+
+    QCOMPARE(top->childContexts().at(0)->localDeclarations().count(), 2);
+    QCOMPARE(top->childContexts().at(0)->childContexts().count(), 2);
+    
QCOMPARE(top->childContexts().at(0)->childContexts().at(1)->localDeclarations().count(),
 1);
+
+    dec = top->childContexts().at(0)->localDeclarations().at(0);
+    QCOMPARE(dec->identifier(), Identifier("foo"));
+    compareUses(dec, QList<RangeInRevision>()
+                    << RangeInRevision(1, 45, 1, 48));
+}
+
 void TestUses::classNameString()
 {
     //                 0         1         2         3         4         5     
    6         7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/duchain/tests/uses.h 
new/kdev-php-5.3.1/duchain/tests/uses.h
--- old/kdev-php-5.3.0/duchain/tests/uses.h     2018-10-25 10:31:25.000000000 
+0200
+++ new/kdev-php-5.3.1/duchain/tests/uses.h     2018-12-06 10:52:47.000000000 
+0100
@@ -53,6 +53,7 @@
     void interfaceExtendsMultiple();
     void staticMemberFunctionCall();
     void staticMemberVariable();
+    void dynamicStaticMemberVariable();
     void constant();
     void classConstant();
     void classParent();
@@ -89,7 +90,10 @@
     void instanceofStaticProperty();
     void instanceofMixedProperty();
     void instanceofVariableProperty();
+    void instanceofDynamicStaticProperty();
+    void instanceofDynamicVariableProperty();
     void instanceofPropertyArrayAccess();
+    void dimListAfterClassNameReference();
     void classNameString();
     void useTrait();
     void exceptionFinally();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/kdevphpsupport.json 
new/kdev-php-5.3.1/kdevphpsupport.json
--- old/kdev-php-5.3.0/kdevphpsupport.json      2018-10-25 10:31:25.000000000 
+0200
+++ new/kdev-php-5.3.1/kdevphpsupport.json      2018-12-06 10:52:47.000000000 
+0100
@@ -25,6 +25,7 @@
         "Description[uk]": "Підтримка мови PHP",
         "Description[x-test]": "xxPHP Language Supportxx",
         "Description[zh_CN]": "PHP 语言支持",
+        "Description[zh_TW]": "PHP 語言支援",
         "Icon": "application-x-php",
         "Id": "KDevPhpSupport",
         "Name": "PHP Language Support",
@@ -51,6 +52,7 @@
         "Name[uk]": "Підтримка мови PHP",
         "Name[x-test]": "xxPHP Language Supportxx",
         "Name[zh_CN]": "Php 语言支持",
+        "Name[zh_TW]": "PHP 語言支援",
         "ServiceTypes": [
             "KDevelop/Plugin"
         ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/org.kde.kdev-php.metainfo.xml 
new/kdev-php-5.3.1/org.kde.kdev-php.metainfo.xml
--- old/kdev-php-5.3.0/org.kde.kdev-php.metainfo.xml    2018-10-25 
10:31:25.000000000 +0200
+++ new/kdev-php-5.3.1/org.kde.kdev-php.metainfo.xml    2018-12-06 
10:52:47.000000000 +0100
@@ -20,6 +20,7 @@
   <name xml:lang="sv">KDevelop PHP-stöd</name>
   <name xml:lang="uk">Підтримка PHP KDevelop</name>
   <name xml:lang="x-test">xxKDevelop PHP Supportxx</name>
+  <name xml:lang="zh-CN">KDevelop PHP 支持</name>
   <summary>PHP language support for KDevelop</summary>
   <summary xml:lang="ca">Implementació del llenguatge PHP al KDevelop</summary>
   <summary xml:lang="ca-valencia">Implementació del llenguatge PHP al 
KDevelop</summary>
@@ -38,6 +39,7 @@
   <summary xml:lang="sv">Stöd för språket PHP i KDevelop</summary>
   <summary xml:lang="uk">Підтримка мови PHP у KDevelop</summary>
   <summary xml:lang="x-test">xxPHP language support for KDevelopxx</summary>
+  <summary xml:lang="zh-CN">KDevelop 的 PHP 语言支持</summary>
   <project_license>GPL-2.0+</project_license>
   <metadata_license>CC0-1.0</metadata_license>
   <url type="homepage">https://kdevelop.org</url>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/po/en_GB/kdevphp.po 
new/kdev-php-5.3.1/po/en_GB/kdevphp.po
--- old/kdev-php-5.3.0/po/en_GB/kdevphp.po      2018-10-25 10:31:36.000000000 
+0200
+++ new/kdev-php-5.3.1/po/en_GB/kdevphp.po      2018-12-06 10:53:00.000000000 
+0100
@@ -2,13 +2,13 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Andrew Coles <[email protected]>, 2009, 2010.
-# Steve Allewell <[email protected]>, 2014, 2015, 2016, 2017.
+# Steve Allewell <[email protected]>, 2014, 2015, 2016, 2017, 2018.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2018-08-26 06:19+0200\n"
-"PO-Revision-Date: 2017-11-26 20:50+0000\n"
+"PO-Revision-Date: 2018-10-27 20:36+0100\n"
 "Last-Translator: Steve Allewell <[email protected]>\n"
 "Language-Team: British English <[email protected]>\n"
 "Language: en_GB\n"
@@ -144,10 +144,9 @@
 #: duchain/builders/declarationbuilder.cpp:230
 #: duchain/builders/declarationbuilder.cpp:845
 #: duchain/builders/declarationbuilder.cpp:884
-#, fuzzy, kde-format
-#| msgid "Cannot use '%1' as '%2' because the name is already in use."
+#, kde-format
 msgid "Cannot use '%1' as class name as it is reserved"
-msgstr "Cannot use '%1' as '%2' because the name is already in use."
+msgstr "Cannot use '%1' as class name as it is reserved"
 
 #: duchain/builders/declarationbuilder.cpp:353
 #, kde-format
@@ -213,13 +212,14 @@
 "A class constant must not be called 'class'; it is reserved for class name "
 "fetching"
 msgstr ""
+"A class constant must not be called 'class'; it is reserved for class name "
+"fetching"
 
 #: duchain/builders/declarationbuilder.cpp:730
 #: duchain/builders/declarationbuilder.cpp:756
-#, fuzzy, kde-format
-#| msgid "Cannot use 'static' as method modifier"
+#, kde-format
 msgid "Cannot use 'abstract' as method modifier"
-msgstr "Cannot use 'static' as method modifier"
+msgstr "Cannot use 'abstract' as method modifier"
 
 #: duchain/builders/declarationbuilder.cpp:733
 #: duchain/builders/declarationbuilder.cpp:759
@@ -244,11 +244,9 @@
 msgstr "Default value for parameters with a class type hint can only be NULL."
 
 #: duchain/builders/declarationbuilder.cpp:822
-#, fuzzy, kde-format
-#| msgid ""
-#| "Default value for parameters with a class type hint can only be NULL."
+#, kde-format
 msgid "Default value for parameters with an object type can only be NULL."
-msgstr "Default value for parameters with a class type hint can only be NULL."
+msgstr "Default value for parameters with an object type can only be NULL."
 
 #: duchain/builders/declarationbuilder.cpp:850
 #, kde-format
@@ -291,16 +289,14 @@
 msgstr "Cannot re-assign $this."
 
 #: duchain/builders/declarationbuilder.cpp:1262
-#, fuzzy, kde-format
-#| msgid "Cannot redeclare private property %1 from this context."
+#, kde-format
 msgid "Cannot access private property %1"
-msgstr "Cannot redeclare private property %1 from this context."
+msgstr "Cannot access private property %1"
 
 #: duchain/builders/declarationbuilder.cpp:1265
-#, fuzzy, kde-format
-#| msgid "Cannot redeclare protected property %1 from this context."
+#, kde-format
 msgid "Cannot access protected property %1"
-msgstr "Cannot redeclare protected property %1 from this context."
+msgstr "Cannot access protected property %1"
 
 #: duchain/builders/declarationbuilder.cpp:1411
 #, kde-format
@@ -318,15 +314,14 @@
 msgstr "Cannot use '%1' as '%2' because the name is already in use."
 
 #: duchain/builders/declarationbuilder.cpp:1662
-#, fuzzy, kde-format
-#| msgid "Cannot use '%1' as '%2' because the name is already in use."
+#, kde-format
 msgid "Cannot use %1 as %2 because '%2' is a special class name"
-msgstr "Cannot use '%1' as '%2' because the name is already in use."
+msgstr "Cannot use %1 as %2 because '%2' is a special class name"
 
 #: duchain/builders/declarationbuilder.cpp:1672
 #, kde-format
 msgid "The 'yield' expression can only be used inside a function"
-msgstr ""
+msgstr "The 'yield' expression can only be used inside a function"
 
 #: duchain/builders/usebuilder.cpp:207
 #, kde-format
@@ -377,10 +372,9 @@
 msgstr "empty (not inside a class)"
 
 #: duchain/navigation/magicconstantnavigationcontext.cpp:83
-#, fuzzy, kde-format
-#| msgid "empty (not inside a class)"
+#, kde-format
 msgid "empty (not inside a trait)"
-msgstr "empty (not inside a class)"
+msgstr "empty (not inside a trait)"
 
 #: duchain/navigation/magicconstantnavigationcontext.cpp:102
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/po/zh_CN/kdevphp.po 
new/kdev-php-5.3.1/po/zh_CN/kdevphp.po
--- old/kdev-php-5.3.0/po/zh_CN/kdevphp.po      2018-10-25 10:31:46.000000000 
+0200
+++ new/kdev-php-5.3.1/po/zh_CN/kdevphp.po      2018-12-06 10:53:12.000000000 
+0100
@@ -9,7 +9,7 @@
 "Project-Id-Version: kdeorg\n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2018-08-26 06:19+0200\n"
-"PO-Revision-Date: 2018-10-09 18:49\n"
+"PO-Revision-Date: 2018-11-12 09:25\n"
 "Last-Translator: guoyunhe <[email protected]>\n"
 "Language-Team: Chinese Simplified\n"
 "Language: zh_CN\n"
@@ -51,7 +51,7 @@
 #: docs/phpdocsconfig.ui:20
 #, kde-format
 msgid "PHP Manual Integration"
-msgstr ""
+msgstr "PHP 手册整合"
 
 #. i18n: ectx: property (text), widget (QLabel, PhpDocNote)
 #: docs/phpdocsconfig.ui:36
@@ -220,13 +220,13 @@
 #: duchain/builders/declarationbuilder.cpp:759
 #, kde-format
 msgid "Cannot use 'final' as method modifier"
-msgstr ""
+msgstr "无法将“final”用做方法修饰符"
 
 #: duchain/builders/declarationbuilder.cpp:736
 #: duchain/builders/declarationbuilder.cpp:762
 #, kde-format
 msgid "Cannot use 'static' as method modifier"
-msgstr ""
+msgstr "无法将“static”用做方法修饰符"
 
 #: duchain/builders/declarationbuilder.cpp:811
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/po/zh_TW/kdevphp.po 
new/kdev-php-5.3.1/po/zh_TW/kdevphp.po
--- old/kdev-php-5.3.0/po/zh_TW/kdevphp.po      2018-10-25 10:31:46.000000000 
+0200
+++ new/kdev-php-5.3.1/po/zh_TW/kdevphp.po      2018-12-06 10:53:12.000000000 
+0100
@@ -5,19 +5,20 @@
 # Frank Weng (a.k.a. Franklin) <[email protected]>, 2009, 2010.
 # Franklin Weng <[email protected]>, 2010.
 # Franklin Weng <[email protected]>, 2012, 2013, 2014.
+# pan93412 <[email protected]>, 2018.
 msgid ""
 msgstr ""
 "Project-Id-Version: kdevphp\n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2018-08-26 06:19+0200\n"
-"PO-Revision-Date: 2014-04-23 14:56+0800\n"
-"Last-Translator: Franklin Weng <franklin at goodhorse dot idv dot tw>\n"
-"Language-Team: Chinese Traditional <[email protected]>\n"
+"PO-Revision-Date: 2018-12-02 23:39+0800\n"
+"Last-Translator: pan93412 <[email protected]>\n"
+"Language-Team: Chinese <[email protected]>\n"
 "Language: zh_TW\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #, kde-format
@@ -54,7 +55,7 @@
 
 #. i18n: ectx: property (text), widget (QLabel, PhpDocNote)
 #: docs/phpdocsconfig.ui:36
-#, kde-format
+#, fuzzy, kde-format
 msgid ""
 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/";
 "REC-html40/strict.dtd\">\n"
@@ -71,29 +72,41 @@
 "your choice. Make sure you downloaded the <span style=\" font-style:italic;"
 "\">\"Many HTML files\"</span> package.</p></body></html>"
 msgstr ""
+"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/";
+"REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
+"\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:8pt; font-"
+"weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-"
+"right:0px; -qt-block-indent:0; text-indent:0px;\">預設會使用遠端線上的 <a "
+"href=\"http://php.net\";><span style=\" text-decoration: underline; color:"
+"#0000ff;\">PHP 文件</span></a>。不過您可以設定使用本地端的文件複本,也許是您"
+"選擇的語言。請確定您下載了 <span style=\" font-style:italic;\">\"HTML "
+"format, many files\"</span> 套件。</p></body></html>"
 
 #. i18n: ectx: property (text), widget (QLabel, PhpDocLocationLabel)
 #: docs/phpdocsconfig.ui:57
 #, kde-format
 msgid "Location:"
-msgstr ""
+msgstr "位置:"
 
 #: docs/phpdocsmodel.cpp:110
 #, kde-format
 msgid "<lost declaration>"
-msgstr ""
+msgstr "<遺失的宣告>"
 
 #: docs/phpdocsplugin.cpp:221
-#, fuzzy, kde-format
-#| msgid "PHPUnit Integration"
+#, kde-format
 msgid "PHP Documentation"
-msgstr "PHPUnit 整合"
+msgstr "PHP 文件"
 
 #. i18n: ectx: label, entry (phpDocLocation), group (PHP Documentation)
 #: docs/phpdocssettings.kcfg:10
 #, kde-format
 msgid "Specifies the location of the PHP documentation to use."
-msgstr ""
+msgstr "指定 PHP 文件使用的位置。"
 
 #. i18n: ectx: tooltip, entry (phpDocLocation), group (PHP Documentation)
 #: docs/phpdocssettings.kcfg:13
@@ -104,6 +117,9 @@
 "contains the\n"
 "                 PHP documentation in HTML format with many files."
 msgstr ""
+"PHP 文件使用的位置。您可以用遠端的網址,如 http://php.net,或是本地端的目";
+"錄,\n"
+"目錄中要包含 PHP 文件,以多個 HTML 檔案的方式存放。"
 
 #. i18n: ectx: whatsthis, entry (phpDocLocation), group (PHP Documentation)
 #: docs/phpdocssettings.kcfg:15
@@ -111,12 +127,12 @@
 msgid ""
 "Make sure local copies are downloaded in HTML format with many files.\n"
 "        "
-msgstr ""
+msgstr "請確定本地端複本是以多個 HTML 檔案的方式存放。"
 
 #: docs/phpdocumentationwidget.cpp:74
 #, kde-format
 msgid "...loading documentation..."
-msgstr ""
+msgstr "... 載入文件中 ..."
 
 #: duchain/builders/contextbuilder.cpp:461
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdev-php-5.3.0/testprovider/kdevphpunitprovider.json 
new/kdev-php-5.3.1/testprovider/kdevphpunitprovider.json
--- old/kdev-php-5.3.0/testprovider/kdevphpunitprovider.json    2018-10-25 
10:31:25.000000000 +0200
+++ new/kdev-php-5.3.1/testprovider/kdevphpunitprovider.json    2018-12-06 
10:52:47.000000000 +0100
@@ -7,6 +7,7 @@
                 "Name[ca]": "Miha Čančula",
                 "Name[cs]": "Miha Čančula",
                 "Name[de]": "Miha Čančula",
+                "Name[en_GB]": "Miha Čančula",
                 "Name[es]": "Miha Čančula",
                 "Name[fr]": "Miha Čančula",
                 "Name[it]": "Miha Čančula",
@@ -18,7 +19,8 @@
                 "Name[sv]": "Miha Čančula",
                 "Name[uk]": "Miha Čančula",
                 "Name[x-test]": "xxMiha Čančulaxx",
-                "Name[zh_CN]": "Miha Čančula"
+                "Name[zh_CN]": "Miha Čančula",
+                "Name[zh_TW]": "Miha Čančula"
             }
         ],
         "Category": "Testing",
@@ -27,6 +29,7 @@
         "Description[ca]": "Cerca i executa proves del PHPUnit.",
         "Description[cs]": "Hledá a spouští testy PHPUnit.",
         "Description[de]": "Sucht und führt PHPUnit-Tests aus.",
+        "Description[en_GB]": "Finds and runs PHPUnit tests.",
         "Description[es]": "Encuentra y ejecuta pruebas PHPUnit.",
         "Description[fr]": "Trouve et exécute des tests « PHPUnit ».",
         "Description[it]": "Trova ed esegue i test PHPUnit.",
@@ -39,6 +42,7 @@
         "Description[uk]": "Знаходить і запускає перевірки PHPUnit.",
         "Description[x-test]": "xxFinds and runs PHPUnit tests.xx",
         "Description[zh_CN]": "查找并运行 PHPUnit 测试",
+        "Description[zh_TW]": "尋找並執行 PHPUnit 測試。",
         "Icon": "application-x-php",
         "Id": "kdevphpunitprovider",
         "License": "GPL",
@@ -47,6 +51,7 @@
         "Name[ca]": "Integració del PHPUnit",
         "Name[cs]": "Integrace PHPUnit",
         "Name[de]": "PHPUnit-Integration",
+        "Name[en_GB]": "PHPUnit Integration",
         "Name[es]": "Integración de PHPUnit",
         "Name[fr]": "Intégration de « PHPUnit »",
         "Name[it]": "Integrazione PHPUnit",
@@ -59,6 +64,7 @@
         "Name[uk]": "Інтеграція з PHPUnit",
         "Name[x-test]": "xxPHPUnit Integrationxx",
         "Name[zh_CN]": "PHPUnit 集成",
+        "Name[zh_TW]": "PHPUnit 整合",
         "ServiceTypes": [
             "KDevelop/Plugin"
         ]


Reply via email to