Commit f895cbb4 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Sorry this was not supposed to be committed.

Revert "Revert "Try to fix the type rewriter.""

This reverts commit c9bc1e7c.
parent 3b48da93
......@@ -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)
......
......@@ -51,51 +51,27 @@ public:
class CPLUSPLUS_EXPORT SubstitutionEnvironment
{
Q_DISABLE_COPY(SubstitutionEnvironment)
QList<Substitution *> substs;
public:
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();
}
};
SubstitutionEnvironment();
class CPLUSPLUS_EXPORT ContextSubstitution: public Substitution
{
public:
ContextSubstitution(const LookupContext &context, Scope *scope);
virtual ~ContextSubstitution();
FullySpecifiedType apply(const Name *name, Rewrite *rewrite) const;
virtual FullySpecifiedType apply(const Name *name, Rewrite *rewrite) const;
void enter(Substitution *subst);
void leave();
Scope *scope() const;
Scope *switchScope(Scope *scope);
const LookupContext &context() const;
void setContext(const LookupContext &context);
private:
LookupContext _context;
QList<Substitution *> _substs;
Scope *_scope;
LookupContext _context;
};
class CPLUSPLUS_EXPORT SubstitutionMap: public Substitution
{
public:
......@@ -109,6 +85,17 @@ 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);
......
......@@ -568,9 +568,10 @@ QList<LookupItem> ResolveExpression::getMembers(ClassOrNamespace *binding, const
}
SubstitutionEnvironment env;
ContextSubstitution ctxSubst(_context, m.scope());
if (m.scope())
env.switchScope(m.scope());
env.setContext(_context);
env.enter(&ctxSubst);
env.enter(&map);
FullySpecifiedType instantiatedTy = rewriteType(decl->type(), &env, _context.control().data());
......
......@@ -37,6 +37,7 @@
#include <cplusplus/Overview.h>
#include <cplusplus/TypeOfExpression.h>
#include <cplusplus/DependencyTable.h>
#include <cplusplus/CppRewriter.h>
#include <TranslationUnit.h>
#include <ASTVisitor.h>
......@@ -1546,8 +1547,18 @@ public:
TypeOfExpression::Preprocess);
if (! result.isEmpty()) {
SubstitutionEnvironment env;
env.setContext(context());
env.switchScope(result.first().scope());
UseQualifiedNames q;
env.enter(&q);
Control *control = context().control().data();
FullySpecifiedType tn = rewriteType(result.first().type(), &env, control);
Overview oo;
QString ty = oo(result.first().type());
QString ty = oo(tn);
if (! ty.isEmpty()) {
const QChar ch = ty.at(ty.size() - 1);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment