forked from qt-creator/qt-creator
C++: Fix function signature link for foo(void).
Change-Id: Icc8861a5127272750c5aa0b6340967ddf0a5a085 Reviewed-on: http://codereview.qt.nokia.com/3016 Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
This commit is contained in:
@@ -348,6 +348,15 @@ void FunctionDeclDefLink::showMarker(CPPEditorWidget *editor)
|
|||||||
hasMarker = true;
|
hasMarker = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// does consider foo(void) to have one argument
|
||||||
|
static int declaredArgumentCount(Function *function)
|
||||||
|
{
|
||||||
|
int c = function->memberCount();
|
||||||
|
if (c > 0 && function->memberAt(c - 1)->isBlock())
|
||||||
|
return c - 1;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot)
|
Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot)
|
||||||
{
|
{
|
||||||
Utils::ChangeSet changes;
|
Utils::ChangeSet changes;
|
||||||
@@ -438,8 +447,12 @@ Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot)
|
|||||||
Control *control = sourceContext.control().data();
|
Control *control = sourceContext.control().data();
|
||||||
Overview overview;
|
Overview overview;
|
||||||
|
|
||||||
|
const unsigned sourceArgCount = declaredArgumentCount(sourceFunction);
|
||||||
|
const unsigned newArgCount = declaredArgumentCount(newFunction);
|
||||||
|
const unsigned targetArgCount = declaredArgumentCount(targetFunction);
|
||||||
|
|
||||||
// check if parameter types or names have changed
|
// check if parameter types or names have changed
|
||||||
const unsigned existingArgs = qMin(targetFunction->argumentCount(), newFunction->argumentCount());
|
const unsigned existingArgs = qMin(targetArgCount, newArgCount);
|
||||||
ParameterDeclarationClauseAST *targetParameterDecl =
|
ParameterDeclarationClauseAST *targetParameterDecl =
|
||||||
targetFunctionDeclarator->parameter_declaration_clause;
|
targetFunctionDeclarator->parameter_declaration_clause;
|
||||||
ParameterDeclarationListAST *firstTargetParameterDeclIt =
|
ParameterDeclarationListAST *firstTargetParameterDeclIt =
|
||||||
@@ -454,7 +467,7 @@ Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot)
|
|||||||
// if new's name and type are the same as source's, forbid changes
|
// if new's name and type are the same as source's, forbid changes
|
||||||
bool allowChangeType = true;
|
bool allowChangeType = true;
|
||||||
const Name *replacementName = newParam->name();
|
const Name *replacementName = newParam->name();
|
||||||
if (i < sourceFunction->argumentCount()) {
|
if (i < sourceArgCount) {
|
||||||
Symbol *sourceParam = sourceFunction->argumentAt(i);
|
Symbol *sourceParam = sourceFunction->argumentAt(i);
|
||||||
if (newParam->type().isEqualTo(sourceParam->type()))
|
if (newParam->type().isEqualTo(sourceParam->type()))
|
||||||
allowChangeType = false;
|
allowChangeType = false;
|
||||||
@@ -499,15 +512,15 @@ Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newFunction->argumentCount() < targetFunction->argumentCount()) {
|
if (newArgCount < targetArgCount) {
|
||||||
targetParameterDeclIt = firstTargetParameterDeclIt;
|
targetParameterDeclIt = firstTargetParameterDeclIt;
|
||||||
if (targetParameterDeclIt) {
|
if (targetParameterDeclIt) {
|
||||||
if (newFunction->argumentCount() == 0) {
|
if (newArgCount == 0) {
|
||||||
changes.remove(matchFile->startOf(targetParameterDeclIt->firstToken()),
|
changes.remove(matchFile->startOf(targetParameterDeclIt->firstToken()),
|
||||||
matchFile->endOf(targetParameterDeclIt->lastToken() - 1));
|
matchFile->endOf(targetParameterDeclIt->lastToken() - 1));
|
||||||
} else {
|
} else {
|
||||||
// get the last valid argument
|
// get the last valid argument
|
||||||
for (unsigned i = 0; i < newFunction->argumentCount() - 1 && targetParameterDeclIt; ++i)
|
for (unsigned i = 0; i < newArgCount - 1 && targetParameterDeclIt; ++i)
|
||||||
targetParameterDeclIt = targetParameterDeclIt->next;
|
targetParameterDeclIt = targetParameterDeclIt->next;
|
||||||
if (targetParameterDeclIt) {
|
if (targetParameterDeclIt) {
|
||||||
const int start = matchFile->endOf(targetParameterDeclIt->value);
|
const int start = matchFile->endOf(targetParameterDeclIt->value);
|
||||||
@@ -516,9 +529,9 @@ Utils::ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (newFunction->argumentCount() > targetFunction->argumentCount()) {
|
} else if (newArgCount > targetArgCount) {
|
||||||
QString newParams;
|
QString newParams;
|
||||||
for (unsigned i = targetFunction->argumentCount(); i < newFunction->argumentCount(); ++i) {
|
for (unsigned i = targetArgCount; i < newArgCount; ++i) {
|
||||||
Symbol *param = newFunction->argumentAt(i);
|
Symbol *param = newFunction->argumentAt(i);
|
||||||
FullySpecifiedType type = rewriteType(param->type(), &env, control);
|
FullySpecifiedType type = rewriteType(param->type(), &env, control);
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
|
Reference in New Issue
Block a user