diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-07-19 20:12:16 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-07-19 20:12:16 +0200 |
commit | 33b19f0210cd6ab1504071912caee91a95515c7c (patch) | |
tree | 58a0e1ea6da2f12005f5916ee967680349e47088 /src/libs/cplusplus/CppRewriter.cpp | |
parent | 55936532c295a3eea221ac6aaca7353f41761c76 (diff) | |
download | qt-creator-33b19f0210cd6ab1504071912caee91a95515c7c.tar.gz |
Try to fix the type rewriter.
Diffstat (limited to 'src/libs/cplusplus/CppRewriter.cpp')
-rw-r--r-- | src/libs/cplusplus/CppRewriter.cpp | 104 |
1 files changed, 83 insertions, 21 deletions
diff --git a/src/libs/cplusplus/CppRewriter.cpp b/src/libs/cplusplus/CppRewriter.cpp index 26c11596dd..9b28a8102c 100644 --- a/src/libs/cplusplus/CppRewriter.cpp +++ b/src/libs/cplusplus/CppRewriter.cpp @@ -34,6 +34,7 @@ #include <Literals.h> #include <Names.h> #include <Scope.h> +#include <cplusplus/Overview.h> #include <QtCore/QVarLengthArray> #include <QtCore/QDebug> @@ -120,7 +121,7 @@ public: { FullySpecifiedType ty = rewrite->env->apply(type->name(), rewrite); if (! ty->isUndefinedType()) - temps.append(rewrite->rewriteType(ty)); + temps.append(ty); else { const Name *name = rewrite->rewriteName(type->name()); temps.append(control()->namedType(name)); @@ -286,39 +287,57 @@ public: // attributes RewriteName rewriteName; }; -ContextSubstitution::ContextSubstitution(const LookupContext &context, Scope *scope) - : _context(context), _scope(scope) +SubstitutionEnvironment::SubstitutionEnvironment() + : _scope(0) { } -ContextSubstitution::~ContextSubstitution() +FullySpecifiedType SubstitutionEnvironment::apply(const Name *name, Rewrite *rewrite) const { + if (name) { + for (int index = _substs.size() - 1; index != -1; --index) { + const Substitution *subst = _substs.at(index); + + FullySpecifiedType ty = subst->apply(name, rewrite); + if (! ty->isUndefinedType()) + return ty; + } + } + + return FullySpecifiedType(); } -FullySpecifiedType ContextSubstitution::apply(const Name *name, Rewrite *rewrite) const +void SubstitutionEnvironment::enter(Substitution *subst) { - const QList<LookupItem> candidates = _context.lookup(name, _scope); + _substs.append(subst); +} - foreach (const LookupItem &r, candidates) { - Symbol *s = r.declaration(); - if (s->isDeclaration() && s->isTypedef()) { - qDebug() << "resolved typedef:" << s->fileName() << s->line() << s->column(); +void SubstitutionEnvironment::leave() +{ + _substs.removeLast(); +} - qDebug() << "scope is:" << r.scope()->owner()->fileName() - << r.scope()->owner()->line() - << r.scope()->owner()->column(); +Scope *SubstitutionEnvironment::scope() const +{ + return _scope; +} - ContextSubstitution subst(_context, s->scope()); - rewrite->env->enter(&subst); - FullySpecifiedType ty = rewrite->rewriteType(s->type()); - rewrite->env->leave(); +Scope *SubstitutionEnvironment::switchScope(Scope *scope) +{ + Scope *previous = _scope; + _scope = scope; + return previous; +} - return ty; - } - } - return FullySpecifiedType(); +const LookupContext &SubstitutionEnvironment::context() const +{ + return _context; } +void SubstitutionEnvironment::setContext(const LookupContext &context) +{ + _context = context; +} SubstitutionMap::SubstitutionMap() { @@ -347,6 +366,49 @@ FullySpecifiedType SubstitutionMap::apply(const Name *name, Rewrite *) const return FullySpecifiedType(); } + +UseQualifiedNames::UseQualifiedNames() +{ + +} + +UseQualifiedNames::~UseQualifiedNames() +{ + +} + +FullySpecifiedType UseQualifiedNames::apply(const Name *name, Rewrite *rewrite) const +{ + SubstitutionEnvironment *env = rewrite->env; + Scope *scope = env->scope(); + + if (! scope) + return FullySpecifiedType(); + + const LookupContext &context = env->context(); + Control *control = rewrite->control; + + const QList<LookupItem> results = context.lookup(name, scope); + foreach (const LookupItem &r, results) { + if (Symbol *d = r.declaration()) { + const Name *n = 0; + foreach (const Name *c, LookupContext::fullyQualifiedName(d)) { + if (! n) + n = c; + else + n = control->qualifiedNameId(n, c); + } + + return control->namedType(n); + } + + return r.type(); + } + + return FullySpecifiedType(); +} + + FullySpecifiedType CPlusPlus::rewriteType(const FullySpecifiedType &type, SubstitutionEnvironment *env, Control *control) |