summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/CppRewriter.cpp
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2011-07-28 21:17:28 +0200
committerChristian Kamm <christian.d.kamm@nokia.com>2011-08-08 14:47:49 +0200
commita4e85dda533c69625982287a0ad1d55bf74d5f26 (patch)
treecbf5269aba0d0659d4966cc75096c82934fa0d68 /src/libs/cplusplus/CppRewriter.cpp
parent0e54183d4d31dc34fc742503c6e0956dd1737133 (diff)
downloadqt-creator-a4e85dda533c69625982287a0ad1d55bf74d5f26.tar.gz
C++ insert definition: Use minimally qualified names.
Change-Id: I633dbc77557fc2b6563888103350612a262536ee Reviewed-on: http://codereview.qt.nokia.com/2731 Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
Diffstat (limited to 'src/libs/cplusplus/CppRewriter.cpp')
-rw-r--r--src/libs/cplusplus/CppRewriter.cpp50
1 files changed, 43 insertions, 7 deletions
diff --git a/src/libs/cplusplus/CppRewriter.cpp b/src/libs/cplusplus/CppRewriter.cpp
index 9734c17835..ba975b3cd1 100644
--- a/src/libs/cplusplus/CppRewriter.cpp
+++ b/src/libs/cplusplus/CppRewriter.cpp
@@ -373,22 +373,35 @@ FullySpecifiedType SubstitutionMap::apply(const Name *name, Rewrite *) const
}
-UseQualifiedNames::UseQualifiedNames()
+UseMinimalNames::UseMinimalNames(ClassOrNamespace *target)
+ : _target(target)
{
}
-UseQualifiedNames::~UseQualifiedNames()
+UseMinimalNames::~UseMinimalNames()
{
}
-FullySpecifiedType UseQualifiedNames::apply(const Name *name, Rewrite *rewrite) const
+static bool symbolIdentical(Symbol *s1, Symbol *s2)
+{
+ if (!s1 || !s2)
+ return false;
+ if (s1->line() != s2->line())
+ return false;
+ if (s1->column() != s2->column())
+ return false;
+
+ return QByteArray(s1->fileName()) == QByteArray(s2->fileName());
+}
+
+FullySpecifiedType UseMinimalNames::apply(const Name *name, Rewrite *rewrite) const
{
SubstitutionEnvironment *env = rewrite->env;
Scope *scope = env->scope();
- if (name->isQualifiedNameId() || name->isTemplateNameId())
+ if (name->isTemplateNameId())
return FullySpecifiedType();
if (! scope)
@@ -401,11 +414,22 @@ FullySpecifiedType UseQualifiedNames::apply(const Name *name, Rewrite *rewrite)
foreach (const LookupItem &r, results) {
if (Symbol *d = r.declaration()) {
const Name *n = 0;
- foreach (const Name *c, LookupContext::fullyQualifiedName(d)) {
+ QList<const Name *> names = LookupContext::fullyQualifiedName(d);
+ for (int i = names.size() - 1; i >= 0; --i) {
if (! n)
- n = c;
+ n = names.at(i);
else
- n = control->qualifiedNameId(n, c);
+ n = control->qualifiedNameId(names.at(i), n);
+ if (_target) {
+ // minimize the qualifications
+ const QList<LookupItem> tresults = _target->lookup(n);
+ foreach (const LookupItem &tr, tresults) {
+ if (symbolIdentical(tr.declaration(), d)) {
+ i = 0; // break outer
+ break;
+ }
+ }
+ }
}
return control->namedType(n);
@@ -418,6 +442,18 @@ FullySpecifiedType UseQualifiedNames::apply(const Name *name, Rewrite *rewrite)
}
+UseQualifiedNames::UseQualifiedNames()
+ : UseMinimalNames(0)
+{
+
+}
+
+UseQualifiedNames::~UseQualifiedNames()
+{
+
+}
+
+
FullySpecifiedType rewriteType(const FullySpecifiedType &type,
SubstitutionEnvironment *env,
Control *control)