forked from qt-creator/qt-creator
CppEditor: Consider not only classes
... when trying to find out whether an include statement needs to be inserted for a given symbol. The previous code used to ignore e.g. function declarations, so an unneeded refactoring operation would be triggered. Fixes: QTCREATORBUG-26591 Change-Id: I5ce0bb064b6ba76e5977de73ea2697342cf74d7e Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -1944,10 +1944,10 @@ NameAST *nameUnderCursor(const QList<AST *> &path)
|
|||||||
return nameAst;
|
return nameAst;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class LookupResult { Definition, Declaration, None };
|
enum class LookupResult { Declared, ForwardDeclared, NotDeclared };
|
||||||
LookupResult lookUpDefinition(const CppQuickFixInterface &interface, const NameAST *nameAst)
|
LookupResult lookUpDefinition(const CppQuickFixInterface &interface, const NameAST *nameAst)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(nameAst && nameAst->name, return LookupResult::None);
|
QTC_ASSERT(nameAst && nameAst->name, return LookupResult::NotDeclared);
|
||||||
|
|
||||||
// Find the enclosing scope
|
// Find the enclosing scope
|
||||||
int line, column;
|
int line, column;
|
||||||
@@ -1955,7 +1955,7 @@ LookupResult lookUpDefinition(const CppQuickFixInterface &interface, const NameA
|
|||||||
doc->translationUnit()->getTokenStartPosition(nameAst->firstToken(), &line, &column);
|
doc->translationUnit()->getTokenStartPosition(nameAst->firstToken(), &line, &column);
|
||||||
Scope *scope = doc->scopeAt(line, column);
|
Scope *scope = doc->scopeAt(line, column);
|
||||||
if (!scope)
|
if (!scope)
|
||||||
return LookupResult::None;
|
return LookupResult::NotDeclared;
|
||||||
|
|
||||||
// Try to find the class/template definition
|
// Try to find the class/template definition
|
||||||
const Name *name = nameAst->name;
|
const Name *name = nameAst->name;
|
||||||
@@ -1963,21 +1963,22 @@ LookupResult lookUpDefinition(const CppQuickFixInterface &interface, const NameA
|
|||||||
foreach (const LookupItem &item, results) {
|
foreach (const LookupItem &item, results) {
|
||||||
if (Symbol *declaration = item.declaration()) {
|
if (Symbol *declaration = item.declaration()) {
|
||||||
if (declaration->isClass())
|
if (declaration->isClass())
|
||||||
return LookupResult::Definition;
|
return LookupResult::Declared;
|
||||||
if (declaration->isForwardClassDeclaration())
|
if (declaration->isForwardClassDeclaration())
|
||||||
return LookupResult::Declaration;
|
return LookupResult::ForwardDeclared;
|
||||||
if (Template *templ = declaration->asTemplate()) {
|
if (Template *templ = declaration->asTemplate()) {
|
||||||
if (Symbol *declaration = templ->declaration()) {
|
if (Symbol *declaration = templ->declaration()) {
|
||||||
if (declaration->isClass())
|
if (declaration->isClass())
|
||||||
return LookupResult::Definition;
|
return LookupResult::Declared;
|
||||||
if (declaration->isForwardClassDeclaration())
|
if (declaration->isForwardClassDeclaration())
|
||||||
return LookupResult::Declaration;
|
return LookupResult::ForwardDeclared;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return LookupResult::Declared;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return LookupResult::None;
|
return LookupResult::NotDeclared;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString templateNameAsString(const TemplateNameId *templateName)
|
QString templateNameAsString(const TemplateNameId *templateName)
|
||||||
@@ -2049,7 +2050,7 @@ void AddIncludeForUndefinedIdentifier::match(const CppQuickFixInterface &interfa
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const LookupResult lookupResult = lookUpDefinition(interface, nameAst);
|
const LookupResult lookupResult = lookUpDefinition(interface, nameAst);
|
||||||
if (lookupResult == LookupResult::Definition)
|
if (lookupResult == LookupResult::Declared)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString className;
|
QString className;
|
||||||
@@ -2095,7 +2096,7 @@ void AddIncludeForUndefinedIdentifier::match(const CppQuickFixInterface &interfa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lookupResult == LookupResult::None && indexItems.size() == 1) {
|
if (lookupResult == LookupResult::NotDeclared && indexItems.size() == 1) {
|
||||||
QString qualifiedName = Overview().prettyName(nameAst->name);
|
QString qualifiedName = Overview().prettyName(nameAst->name);
|
||||||
if (qualifiedName.startsWith("::"))
|
if (qualifiedName.startsWith("::"))
|
||||||
qualifiedName.remove(0, 2);
|
qualifiedName.remove(0, 2);
|
||||||
|
Reference in New Issue
Block a user