summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/CppRewriter.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-07-19 20:12:16 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-07-19 20:12:16 +0200
commit33b19f0210cd6ab1504071912caee91a95515c7c (patch)
tree58a0e1ea6da2f12005f5916ee967680349e47088 /src/libs/cplusplus/CppRewriter.cpp
parent55936532c295a3eea221ac6aaca7353f41761c76 (diff)
downloadqt-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.cpp104
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)