summaryrefslogtreecommitdiff
path: root/src/libs
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-07-20 14:23:46 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-07-20 14:23:46 +0200
commitc9bc1e7c64fb73e8148b65dfe7a4521121331efc (patch)
tree273d33a86c629d95024db201b450d05e22309945 /src/libs
parent99e862cfc9b39dc5bddd0efddf7d7c7a219b5107 (diff)
downloadqt-creator-c9bc1e7c64fb73e8148b65dfe7a4521121331efc.tar.gz
Revert "Try to fix the type rewriter."
This reverts commit 33b19f0210cd6ab1504071912caee91a95515c7c.
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/cplusplus/CppRewriter.cpp104
-rw-r--r--src/libs/cplusplus/CppRewriter.h59
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp5
3 files changed, 59 insertions, 109 deletions
diff --git a/src/libs/cplusplus/CppRewriter.cpp b/src/libs/cplusplus/CppRewriter.cpp
index 9b28a8102c..26c11596dd 100644
--- a/src/libs/cplusplus/CppRewriter.cpp
+++ b/src/libs/cplusplus/CppRewriter.cpp
@@ -34,7 +34,6 @@
#include <Literals.h>
#include <Names.h>
#include <Scope.h>
-#include <cplusplus/Overview.h>
#include <QtCore/QVarLengthArray>
#include <QtCore/QDebug>
@@ -121,7 +120,7 @@ public:
{
FullySpecifiedType ty = rewrite->env->apply(type->name(), rewrite);
if (! ty->isUndefinedType())
- temps.append(ty);
+ temps.append(rewrite->rewriteType(ty));
else {
const Name *name = rewrite->rewriteName(type->name());
temps.append(control()->namedType(name));
@@ -287,57 +286,39 @@ public: // attributes
RewriteName rewriteName;
};
-SubstitutionEnvironment::SubstitutionEnvironment()
- : _scope(0)
+ContextSubstitution::ContextSubstitution(const LookupContext &context, Scope *scope)
+ : _context(context), _scope(scope)
{
}
-FullySpecifiedType SubstitutionEnvironment::apply(const Name *name, Rewrite *rewrite) const
+ContextSubstitution::~ContextSubstitution()
{
- 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();
}
-void SubstitutionEnvironment::enter(Substitution *subst)
+FullySpecifiedType ContextSubstitution::apply(const Name *name, Rewrite *rewrite) const
{
- _substs.append(subst);
-}
+ const QList<LookupItem> candidates = _context.lookup(name, _scope);
-void SubstitutionEnvironment::leave()
-{
- _substs.removeLast();
-}
+ foreach (const LookupItem &r, candidates) {
+ Symbol *s = r.declaration();
+ if (s->isDeclaration() && s->isTypedef()) {
+ qDebug() << "resolved typedef:" << s->fileName() << s->line() << s->column();
-Scope *SubstitutionEnvironment::scope() const
-{
- return _scope;
-}
+ qDebug() << "scope is:" << r.scope()->owner()->fileName()
+ << r.scope()->owner()->line()
+ << r.scope()->owner()->column();
-Scope *SubstitutionEnvironment::switchScope(Scope *scope)
-{
- Scope *previous = _scope;
- _scope = scope;
- return previous;
-}
+ ContextSubstitution subst(_context, s->scope());
+ rewrite->env->enter(&subst);
+ FullySpecifiedType ty = rewrite->rewriteType(s->type());
+ rewrite->env->leave();
-const LookupContext &SubstitutionEnvironment::context() const
-{
- return _context;
+ return ty;
+ }
+ }
+ return FullySpecifiedType();
}
-void SubstitutionEnvironment::setContext(const LookupContext &context)
-{
- _context = context;
-}
SubstitutionMap::SubstitutionMap()
{
@@ -366,49 +347,6 @@ 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)
diff --git a/src/libs/cplusplus/CppRewriter.h b/src/libs/cplusplus/CppRewriter.h
index 988b92f3a6..0e21061128 100644
--- a/src/libs/cplusplus/CppRewriter.h
+++ b/src/libs/cplusplus/CppRewriter.h
@@ -51,27 +51,51 @@ public:
class CPLUSPLUS_EXPORT SubstitutionEnvironment
{
Q_DISABLE_COPY(SubstitutionEnvironment)
+ QList<Substitution *> substs;
public:
- SubstitutionEnvironment();
-
- FullySpecifiedType apply(const Name *name, Rewrite *rewrite) const;
-
- void enter(Substitution *subst);
- void leave();
+ SubstitutionEnvironment() {}
+
+ FullySpecifiedType 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();
+ }
+
+ void enter(Substitution *subst)
+ {
+ substs.append(subst);
+ }
+
+ void leave()
+ {
+ substs.removeLast();
+ }
+};
- Scope *scope() const;
- Scope *switchScope(Scope *scope);
+class CPLUSPLUS_EXPORT ContextSubstitution: public Substitution
+{
+public:
+ ContextSubstitution(const LookupContext &context, Scope *scope);
+ virtual ~ContextSubstitution();
- const LookupContext &context() const;
- void setContext(const LookupContext &context);
+ virtual FullySpecifiedType apply(const Name *name, Rewrite *rewrite) const;
private:
- QList<Substitution *> _substs;
- Scope *_scope;
LookupContext _context;
+ Scope *_scope;
};
+
class CPLUSPLUS_EXPORT SubstitutionMap: public Substitution
{
public:
@@ -85,17 +109,6 @@ private:
QList<QPair<const Name *, FullySpecifiedType> > _map;
};
-class CPLUSPLUS_EXPORT UseQualifiedNames: public Substitution
-{
-public:
- UseQualifiedNames();
- virtual ~UseQualifiedNames();
-
- virtual FullySpecifiedType apply(const Name *name, Rewrite *rewrite) const;
-};
-
-
-
CPLUSPLUS_EXPORT FullySpecifiedType rewriteType(const FullySpecifiedType &type,
SubstitutionEnvironment *env,
Control *control);
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 8bbdb8f05a..651af19871 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -568,10 +568,9 @@ QList<LookupItem> ResolveExpression::getMembers(ClassOrNamespace *binding, const
}
SubstitutionEnvironment env;
- if (m.scope())
- env.switchScope(m.scope());
- env.setContext(_context);
+ ContextSubstitution ctxSubst(_context, m.scope());
+ env.enter(&ctxSubst);
env.enter(&map);
FullySpecifiedType instantiatedTy = rewriteType(decl->type(), &env, _context.control().data());