aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
authorChristian Kamm <[email protected]>2011-10-31 12:09:27 +0100
committerChristian Kamm <[email protected]>2011-10-31 14:00:27 +0100
commit0021c4c3eea6582d01d25a7fd674129b7c9fcadf (patch)
tree532a4db9d74116fb979532691d86b06098f1cfea /src/libs/cplusplus/LookupContext.cpp
parente202e4b8e0c891c362c29905e2f310ff9ee02279 (diff)
C++ insert def: Fix bug when minimizing name.
Constructors would not get the correct name before. Now rewriting the function's name is not done by going through the 'rewrite type' func- tionality but rather by minimizing the symbol's name directly. Task-number: QTCREATORBUG-6223 Change-Id: I3c25e414337937f5dd0f54570c899ca2ca21d2ef Reviewed-by: Leandro T. C. Melo <[email protected]>
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp64
1 files changed, 27 insertions, 37 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index f4089d1bec2..88110c5da26 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -157,50 +157,40 @@ QList<const Name *> LookupContext::path(Symbol *symbol)
return names;
}
-
-const Name *LookupContext::minimalName(const Name *name,
- Scope *scope,
- ClassOrNamespace *target) const
+static bool symbolIdentical(Symbol *s1, Symbol *s2)
{
- Q_UNUSED(name);
- Q_UNUSED(scope);
- Q_UNUSED(target);
-
- qWarning() << "TODO:" << Q_FUNC_INFO;
- return name;
+ if (!s1 || !s2)
+ return false;
+ if (s1->line() != s2->line())
+ return false;
+ if (s1->column() != s2->column())
+ return false;
-#if 0
- Q_ASSERT(name);
- Q_ASSERT(source);
- Q_ASSERT(target);
+ return QByteArray(s1->fileName()) == QByteArray(s2->fileName());
+}
- QList<Symbol *> symbols = lookup(name, source);
- if (symbols.isEmpty())
- return 0;
+const Name *LookupContext::minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control)
+{
+ const Name *n = 0;
+ QList<const Name *> names = LookupContext::fullyQualifiedName(symbol);
- Symbol *canonicalSymbol = symbols.first();
- std::vector<const Name *> fqNames = fullyQualifiedName(canonicalSymbol).toVector().toStdVector();
- if (const QualifiedNameId *qId = name->asQualifiedNameId())
- fqNames.push_back(qId->name());
- else
- fqNames.push_back(name);
-
- const QualifiedNameId *lastWorking = 0;
- for (unsigned i = 0; i < fqNames.size(); ++i) {
- const QualifiedNameId *newName = control()->qualifiedNameId(&fqNames[i],
- fqNames.size() - i);
- QList<Symbol *> candidates = target->lookup(newName);
- if (candidates.contains(canonicalSymbol))
- lastWorking = newName;
+ for (int i = names.size() - 1; i >= 0; --i) {
+ if (! n)
+ n = names.at(i);
else
- break;
+ n = control->qualifiedNameId(names.at(i), n);
+
+ // once we're qualified enough to get the same symbol, break
+ if (target) {
+ const QList<LookupItem> tresults = target->lookup(n);
+ foreach (const LookupItem &tr, tresults) {
+ if (symbolIdentical(tr.declaration(), symbol))
+ return n;
+ }
+ }
}
- if (lastWorking && lastWorking->nameCount() == 1)
- return lastWorking->nameAt(0);
- else
- return lastWorking;
-#endif
+ return n;
}