diff --git a/duchain/expressionvisitor.cpp b/duchain/expressionvisitor.cpp --- a/duchain/expressionvisitor.cpp +++ b/duchain/expressionvisitor.cpp @@ -415,6 +415,10 @@ } else { usingDeclaration(node->classConstant, DeclarationPointer()); } + QString str(stringForNode(node->classConstant).toLower()); + if (str == "class") { + m_result.setType(AbstractType::Ptr(new IntegralType(IntegralType::TypeString))); + } } else { m_result.setType(AbstractType::Ptr()); } diff --git a/duchain/tests/expressionparser.h b/duchain/tests/expressionparser.h --- a/duchain/tests/expressionparser.h +++ b/duchain/tests/expressionparser.h @@ -60,6 +60,8 @@ void stringAsArray_data(); void stringAsArray(); void classMemberOnInstantiation(); + void classNameConstant_data(); + void classNameConstant(); }; } diff --git a/duchain/tests/expressionparser.cpp b/duchain/tests/expressionparser.cpp --- a/duchain/tests/expressionparser.cpp +++ b/duchain/tests/expressionparser.cpp @@ -631,5 +631,35 @@ QCOMPARE(IntegralType::Ptr::staticCast(res.type())->dataType(), static_cast(IntegralType::TypeString)); } +void TestExpressionParser::classNameConstant_data() +{ + QTest::addColumn("NSconst"); + + QTest::newRow("fullNamespace") << "\\NS\\ClassName::class"; + QTest::newRow("normalNamespace") << "NS\\ClassName::class"; + QTest::newRow("inNamespace") << "$n"; +} + +void TestExpressionParser::classNameConstant() +{ + QFETCH(QString, NSconst); + + // 0 1 2 3 4 5 6 7 + // 01234567890123456789012345678901234567890123456789012345678901234567890123456789 + QByteArray method("problems().isEmpty()); + + ExpressionParser p(true); + + ExpressionEvaluationResult res = p.evaluateType(NSconst.toUtf8(), DUContextPointer(top), CursorInRevision(1, 0)); + QVERIFY(res.type()); + QCOMPARE(IntegralType::Ptr::staticCast(res.type())->dataType(), static_cast(IntegralType::TypeString)); +} + } diff --git a/parser/php.g b/parser/php.g --- a/parser/php.g +++ b/parser/php.g @@ -826,9 +826,13 @@ -> scalar ;; constant=namespacedIdentifier - ( PAAMAYIM_NEKUDOTAYIM classConstant=identifier | 0 ) + ( PAAMAYIM_NEKUDOTAYIM classConstant=classConstant | 0 ) -> constantOrClassConst ;; + CLASS + | identifier +-> classConstant ;; + #encaps=encaps* -> encapsList ;;