forked from qt-creator/qt-creator
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.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user