forked from qt-creator/qt-creator
@@ -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;
|
||||
FullySpecifiedType ContextSubstitution::apply(const Name *name, Rewrite *rewrite) const
|
||||
{
|
||||
const QList<LookupItem> candidates = _context.lookup(name, _scope);
|
||||
|
||||
foreach (const LookupItem &r, candidates) {
|
||||
Symbol *s = r.declaration();
|
||||
if (s->isDeclaration() && s->isTypedef()) {
|
||||
qDebug() << "resolved typedef:" << s->fileName() << s->line() << s->column();
|
||||
|
||||
qDebug() << "scope is:" << r.scope()->owner()->fileName()
|
||||
<< r.scope()->owner()->line()
|
||||
<< r.scope()->owner()->column();
|
||||
|
||||
ContextSubstitution subst(_context, s->scope());
|
||||
rewrite->env->enter(&subst);
|
||||
FullySpecifiedType ty = rewrite->rewriteType(s->type());
|
||||
rewrite->env->leave();
|
||||
|
||||
return ty;
|
||||
}
|
||||
}
|
||||
|
||||
return FullySpecifiedType();
|
||||
}
|
||||
|
||||
void SubstitutionEnvironment::enter(Substitution *subst)
|
||||
{
|
||||
_substs.append(subst);
|
||||
}
|
||||
|
||||
void SubstitutionEnvironment::leave()
|
||||
{
|
||||
_substs.removeLast();
|
||||
}
|
||||
|
||||
Scope *SubstitutionEnvironment::scope() const
|
||||
{
|
||||
return _scope;
|
||||
}
|
||||
|
||||
Scope *SubstitutionEnvironment::switchScope(Scope *scope)
|
||||
{
|
||||
Scope *previous = _scope;
|
||||
_scope = scope;
|
||||
return previous;
|
||||
}
|
||||
|
||||
const LookupContext &SubstitutionEnvironment::context() const
|
||||
{
|
||||
return _context;
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
@@ -51,27 +51,51 @@ public:
|
||||
class CPLUSPLUS_EXPORT SubstitutionEnvironment
|
||||
{
|
||||
Q_DISABLE_COPY(SubstitutionEnvironment)
|
||||
QList<Substitution *> substs;
|
||||
|
||||
public:
|
||||
SubstitutionEnvironment();
|
||||
SubstitutionEnvironment() {}
|
||||
|
||||
FullySpecifiedType apply(const Name *name, Rewrite *rewrite) const;
|
||||
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);
|
||||
|
||||
void enter(Substitution *subst);
|
||||
void leave();
|
||||
FullySpecifiedType ty = subst->apply(name, rewrite);
|
||||
if (! ty->isUndefinedType())
|
||||
return ty;
|
||||
}
|
||||
}
|
||||
|
||||
Scope *scope() const;
|
||||
Scope *switchScope(Scope *scope);
|
||||
return FullySpecifiedType();
|
||||
}
|
||||
|
||||
const LookupContext &context() const;
|
||||
void setContext(const LookupContext &context);
|
||||
void enter(Substitution *subst)
|
||||
{
|
||||
substs.append(subst);
|
||||
}
|
||||
|
||||
void leave()
|
||||
{
|
||||
substs.removeLast();
|
||||
}
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ContextSubstitution: public Substitution
|
||||
{
|
||||
public:
|
||||
ContextSubstitution(const LookupContext &context, Scope *scope);
|
||||
virtual ~ContextSubstitution();
|
||||
|
||||
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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include <cplusplus/Overview.h>
|
||||
#include <cplusplus/TypeOfExpression.h>
|
||||
#include <cplusplus/DependencyTable.h>
|
||||
#include <cplusplus/CppRewriter.h>
|
||||
|
||||
#include <TranslationUnit.h>
|
||||
#include <ASTVisitor.h>
|
||||
@@ -1547,18 +1546,8 @@ 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(tn);
|
||||
QString ty = oo(result.first().type());
|
||||
if (! ty.isEmpty()) {
|
||||
const QChar ch = ty.at(ty.size() - 1);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user