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:
Christian Kamm
2011-08-16 14:31:15 +02:00
parent d2f995d8ef
commit fa0f114f74

View File

@@ -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)