Skip to content
Snippets Groups Projects
Commit 056db856 authored by Orgad Shaneh's avatar Orgad Shaneh Committed by Orgad Shaneh
Browse files

CppEditor: Accept LookupContext in virtual function lookup


Required for correct resolving of first virtual appearance

Change-Id: I2307027f769fb2f4c0942f4aa4e0d2b5327562b5
Reviewed-by: default avatarNikolai Kosjar <nikolai.kosjar@digia.com>
parent a28005da
No related branches found
No related tags found
No related merge requests found
...@@ -128,11 +128,13 @@ bool VirtualFunctionHelper::canLookupVirtualFunctionOverrides(Function *function ...@@ -128,11 +128,13 @@ bool VirtualFunctionHelper::canLookupVirtualFunctionOverrides(Function *function
if (IdExpressionAST *idExpressionAST = m_baseExpressionAST->asIdExpression()) { if (IdExpressionAST *idExpressionAST = m_baseExpressionAST->asIdExpression()) {
NameAST *name = idExpressionAST->name; NameAST *name = idExpressionAST->name;
const bool nameIsQualified = name && name->asQualifiedName(); const bool nameIsQualified = name && name->asQualifiedName();
result = !nameIsQualified && FunctionHelper::isVirtualFunction(function, m_snapshot); result = !nameIsQualified && FunctionHelper::isVirtualFunction(
function, LookupContext(m_document, m_snapshot));
} else if (MemberAccessAST *memberAccessAST = m_baseExpressionAST->asMemberAccess()) { } else if (MemberAccessAST *memberAccessAST = m_baseExpressionAST->asMemberAccess()) {
NameAST *name = memberAccessAST->member_name; NameAST *name = memberAccessAST->member_name;
const bool nameIsQualified = name && name->asQualifiedName(); const bool nameIsQualified = name && name->asQualifiedName();
if (!nameIsQualified && FunctionHelper::isVirtualFunction(function, m_snapshot)) { if (!nameIsQualified && FunctionHelper::isVirtualFunction(
function, LookupContext(m_document, m_snapshot))) {
TranslationUnit *unit = m_expressionDocument->translationUnit(); TranslationUnit *unit = m_expressionDocument->translationUnit();
QTC_ASSERT(unit, return false); QTC_ASSERT(unit, return false);
m_accessTokenKind = unit->tokenKind(memberAccessAST->access_token); m_accessTokenKind = unit->tokenKind(memberAccessAST->access_token);
......
...@@ -210,7 +210,7 @@ IAssistProcessor *VirtualFunctionAssistProvider::createProcessor() const ...@@ -210,7 +210,7 @@ IAssistProcessor *VirtualFunctionAssistProvider::createProcessor() const
enum VirtualType { Virtual, PureVirtual }; enum VirtualType { Virtual, PureVirtual };
static bool isVirtualFunction_helper(const Function *function, static bool isVirtualFunction_helper(const Function *function,
const Snapshot &snapshot, const LookupContext &context,
VirtualType virtualType) VirtualType virtualType)
{ {
if (!function) if (!function)
...@@ -222,24 +222,20 @@ static bool isVirtualFunction_helper(const Function *function, ...@@ -222,24 +222,20 @@ static bool isVirtualFunction_helper(const Function *function,
if (function->isVirtual()) if (function->isVirtual())
return true; return true;
const QString filePath = QString::fromUtf8(function->fileName(), function->fileNameLength()); QList<LookupItem> results = context.lookup(function->name(), function->enclosingScope());
if (Document::Ptr document = snapshot.document(filePath)) { if (!results.isEmpty()) {
LookupContext context(document, snapshot); const bool isDestructor = function->name()->isDestructorNameId();
QList<LookupItem> results = context.lookup(function->name(), function->enclosingScope()); foreach (const LookupItem &item, results) {
if (!results.isEmpty()) { if (Symbol *symbol = item.declaration()) {
const bool isDestructor = function->name()->isDestructorNameId(); if (Function *functionType = symbol->type()->asFunctionType()) {
foreach (const LookupItem &item, results) { if (functionType->name()->isDestructorNameId() != isDestructor)
if (Symbol *symbol = item.declaration()) { continue;
if (Function *functionType = symbol->type()->asFunctionType()) { if (functionType == function) // already tested
if (functionType->name()->isDestructorNameId() != isDestructor) continue;
continue; if (functionType->isFinal())
if (functionType == function) // already tested return false;
continue; if (functionType->isVirtual())
if (functionType->isFinal()) return true;
return false;
if (functionType->isVirtual())
return true;
}
} }
} }
} }
...@@ -248,14 +244,14 @@ static bool isVirtualFunction_helper(const Function *function, ...@@ -248,14 +244,14 @@ static bool isVirtualFunction_helper(const Function *function,
return false; return false;
} }
bool FunctionHelper::isVirtualFunction(const Function *function, const Snapshot &snapshot) bool FunctionHelper::isVirtualFunction(const Function *function, const LookupContext &context)
{ {
return isVirtualFunction_helper(function, snapshot, Virtual); return isVirtualFunction_helper(function, context, Virtual);
} }
bool FunctionHelper::isPureVirtualFunction(const Function *function, const Snapshot &snapshot) bool FunctionHelper::isPureVirtualFunction(const Function *function, const LookupContext &context)
{ {
return isVirtualFunction_helper(function, snapshot, PureVirtual); return isVirtualFunction_helper(function, context, PureVirtual);
} }
QList<Symbol *> FunctionHelper::overrides(Function *function, Class *functionsClass, QList<Symbol *> FunctionHelper::overrides(Function *function, Class *functionsClass,
...@@ -342,6 +338,7 @@ void CppEditorPlugin::test_functionhelper_virtualFunctions() ...@@ -342,6 +338,7 @@ void CppEditorPlugin::test_functionhelper_virtualFunctions()
// Iterate through Function symbols // Iterate through Function symbols
Snapshot snapshot; Snapshot snapshot;
snapshot.insert(document); snapshot.insert(document);
const LookupContext context(document, snapshot);
Control *control = document->translationUnit()->control(); Control *control = document->translationUnit()->control();
Symbol **end = control->lastSymbol(); Symbol **end = control->lastSymbol();
for (Symbol **it = control->firstSymbol(); it != end; ++it) { for (Symbol **it = control->firstSymbol(); it != end; ++it) {
...@@ -349,8 +346,8 @@ void CppEditorPlugin::test_functionhelper_virtualFunctions() ...@@ -349,8 +346,8 @@ void CppEditorPlugin::test_functionhelper_virtualFunctions()
if (const Function *function = symbol->asFunction()) { if (const Function *function = symbol->asFunction()) {
QTC_ASSERT(!virtualityList.isEmpty(), return); QTC_ASSERT(!virtualityList.isEmpty(), return);
Virtuality virtuality = virtualityList.takeFirst(); Virtuality virtuality = virtualityList.takeFirst();
if (FunctionHelper::isVirtualFunction(function, snapshot)) { if (FunctionHelper::isVirtualFunction(function, context)) {
if (FunctionHelper::isPureVirtualFunction(function, snapshot)) if (FunctionHelper::isPureVirtualFunction(function, context))
QCOMPARE(virtuality, PureVirtual); QCOMPARE(virtuality, PureVirtual);
else else
QCOMPARE(virtuality, Virtual); QCOMPARE(virtuality, Virtual);
......
...@@ -74,10 +74,10 @@ class FunctionHelper ...@@ -74,10 +74,10 @@ class FunctionHelper
{ {
public: public:
static bool isVirtualFunction(const CPlusPlus::Function *function, static bool isVirtualFunction(const CPlusPlus::Function *function,
const CPlusPlus::Snapshot &snapshot); const CPlusPlus::LookupContext &context);
static bool isPureVirtualFunction(const CPlusPlus::Function *function, static bool isPureVirtualFunction(const CPlusPlus::Function *function,
const CPlusPlus::Snapshot &snapshot); const CPlusPlus::LookupContext &context);
static QList<CPlusPlus::Symbol *> overrides(CPlusPlus::Function *function, static QList<CPlusPlus::Symbol *> overrides(CPlusPlus::Function *function,
CPlusPlus::Class *functionsClass, CPlusPlus::Class *functionsClass,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment