diff --git a/duchain/builders/contextbuilder.cpp b/duchain/builders/contextbuilder.cpp --- a/duchain/builders/contextbuilder.cpp +++ b/duchain/builders/contextbuilder.cpp @@ -248,6 +248,9 @@ Q_ASSERT(!parameters->inSymbolTable()); visitParameterList(node->parameters); + if (node->returnType) { + visitReturnType(node->returnType); + } closeContext(); if ( !m_isInternalFunctions && node->methodBody ) { @@ -275,6 +278,9 @@ Q_ASSERT(!parameters->inSymbolTable()); visitParameterList(node->parameters); + if (node->returnType) { + visitReturnType(node->returnType); + } closeContext(); if ( !m_isInternalFunctions && node->functionBody ) { @@ -296,6 +302,9 @@ Q_ASSERT(!parameters->inSymbolTable()); visitParameterList(node->parameters); + if (node->returnType) { + visitReturnType(node->returnType); + } closeContext(); DUContext* imported = nullptr; diff --git a/duchain/builders/usebuilder.h b/duchain/builders/usebuilder.h --- a/duchain/builders/usebuilder.h +++ b/duchain/builders/usebuilder.h @@ -68,6 +68,7 @@ void visitUnaryExpression( UnaryExpressionAst* node ) override; void visitUseNamespace(UseNamespaceAst* node) override; void openNamespace(NamespaceDeclarationStatementAst* parent, IdentifierAst* node, const IdentifierPair& identifier, const KDevelop::RangeInRevision& range) override; + void visitReturnType(ReturnTypeAst* node) override; private: void buildNamespaceUses(Php::NamespacedIdentifierAst* node, Php::DeclarationType lastType = Php::ClassDeclarationType); diff --git a/duchain/builders/usebuilder.cpp b/duchain/builders/usebuilder.cpp --- a/duchain/builders/usebuilder.cpp +++ b/duchain/builders/usebuilder.cpp @@ -272,4 +272,10 @@ } } +void UseBuilder::visitReturnType(ReturnTypeAst* node) { + if (node->objectType) { + buildNamespaceUses(node->objectType); + } +} + } diff --git a/duchain/tests/uses.h b/duchain/tests/uses.h --- a/duchain/tests/uses.h +++ b/duchain/tests/uses.h @@ -85,6 +85,8 @@ void classNameString(); void useTrait(); void exceptionFinally(); + void returnTypeClassFunction(); + void returnTypeFunction(); }; } diff --git a/duchain/tests/uses.cpp b/duchain/tests/uses.cpp --- a/duchain/tests/uses.cpp +++ b/duchain/tests/uses.cpp @@ -1221,5 +1221,27 @@ << RangeInRevision(0, 37, 0, 39)); } +void TestUses::returnTypeClassFunction() { + QByteArray method("localDeclarations().at(0); + QCOMPARE(a->identifier().toString(), QString("a")); + compareUses(a, QList() << RangeInRevision(0, 29, 0, 30) << RangeInRevision(0, 50, 0, 54)); +} + +void TestUses::returnTypeFunction() { + QByteArray method("localDeclarations().at(0); + QCOMPARE(a->identifier().toString(), QString("a")); + compareUses(a, QList() << RangeInRevision(0, 30, 0, 31)); +} + }