Commit a4561646 authored by Thorbjørn Lindeijer's avatar Thorbjørn Lindeijer
Browse files

Simplify finding the best match for switching to definition

Also make sure it searches for the best match in all files that define
potential matching definitions.
parent a72042ab
......@@ -1429,12 +1429,6 @@ void CPPEditor::jumpToDefinition()
openLink(findLinkAt(textCursor()));
}
struct DefinitionScore
{
Function *f;
int score;
};
Symbol *CPPEditor::findDefinition(Symbol *symbol)
{
if (symbol->isFunction())
......@@ -1473,6 +1467,9 @@ Symbol *CPPEditor::findDefinition(Symbol *symbol)
// a dummy document.
Document::Ptr expressionDocument = Document::create("<empty>");
Function *bestMatch = 0;
int bestScore = -1;
QMapIterator<QString, QList<Function *> > it(functionDefinitions);
while (it.hasNext()) {
it.next();
......@@ -1480,52 +1477,43 @@ Symbol *CPPEditor::findDefinition(Symbol *symbol)
// get the instance of the document.
Document::Ptr thisDocument = snapshot.document(it.key());
QList<DefinitionScore> definitionScores;
foreach (Function *f, it.value()) {
DefinitionScore score;
score.score = 0; // current function's score
score.f = f; // current function
int score = 0; // current function's score
int funTyArgsCount = funTy->argumentCount();
int fArgsCount = f->argumentCount();
const int funTyArgsCount = funTy->argumentCount();
const int fArgsCount = f->argumentCount();
// max score if arguments count equals
if (funTyArgsCount == fArgsCount)
score.score += funTyArgsCount + 1;
score += funTyArgsCount + 1;
else
score.score += (funTyArgsCount < fArgsCount) ? funTyArgsCount : fArgsCount;
score += (funTyArgsCount < fArgsCount) ? funTyArgsCount : fArgsCount;
// +1 to score for every equal parameter
unsigned minCount = (funTyArgsCount < fArgsCount) ? funTyArgsCount : fArgsCount;
for (unsigned i = 0; i < minCount; ++i)
if (Symbol *funTyArg = funTy->argumentAt(i))
if (Symbol *fArg = f->argumentAt(i))
if (funTyArg->type().isEqualTo(fArg->type())) {
score.score++;
if (funTyArg->type().isEqualTo(fArg->type()))
score++;
if (score > bestScore) {
// create a lookup context
const LookupContext context(f, expressionDocument,
thisDocument, snapshot);
// search the matching definition for the function declaration `symbol'.
foreach (Symbol *s, context.resolve(f->name())) {
if (s == symbol) {
bestMatch = f;
bestScore = score;
}
definitionScores.append(score);
}
// looking for max score
if (!definitionScores.isEmpty()) {
DefinitionScore maxScore = definitionScores.first();
foreach (const DefinitionScore& score, definitionScores) {
if (maxScore.score < score.score)
maxScore = score;
}
}
// create a lookup context
const LookupContext context(maxScore.f, expressionDocument,
thisDocument, snapshot);
// search the matching definition for the function declaration `symbol'.
foreach (Symbol *s, context.resolve(maxScore.f->name()))
if (s == symbol)
return maxScore.f;
}
}
return 0;
return bestMatch;
}
unsigned CPPEditor::editorRevision() const
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment