Skip to content
Snippets Groups Projects
Commit 33b19f02 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Try to fix the type rewriter.

parent 55936532
No related branches found
No related tags found
No related merge requests found
......@@ -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>
......@@ -1532,8 +1533,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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment