aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <[email protected]>2010-07-12 13:41:54 +0200
committerRoberto Raggi <[email protected]>2010-07-12 15:10:00 +0200
commitadfdb51660f3d4251101283efa46b6617cbe43d4 (patch)
tree7c06bc81efca2349820b3f2e69c3d30da34f2df8 /src/libs/cplusplus
parent94264617bfdda8fbfc31921dc9ba49ffff84eaeb (diff)
Recursive definition of CPlusPlus::QualifiedNameId.
Done-with: Erik Verbruggen
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r--src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp53
-rw-r--r--src/libs/cplusplus/LookupContext.cpp77
-rw-r--r--src/libs/cplusplus/NamePrettyPrinter.cpp12
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp20
4 files changed, 85 insertions, 77 deletions
diff --git a/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp b/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp
index 9c8ebfe3b58..56b05e39a69 100644
--- a/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp
+++ b/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp
@@ -256,27 +256,48 @@ private:
_type = control()->namedType(templId);
}
- virtual void visit(const QualifiedNameId *name)
+ const Name *instantiate(const Name *name)
{
- QVarLengthArray<const Name *, 8> names(name->nameCount());
- for (unsigned i = 0; i < name->nameCount(); ++i) {
- const Name *n = name->nameAt(i);
-
- if (const TemplateNameId *templId = n->asTemplateNameId()) {
- QVarLengthArray<FullySpecifiedType, 8> arguments(templId->templateArgumentCount());
- for (unsigned templateArgIndex = 0; templateArgIndex < templId->templateArgumentCount(); ++templateArgIndex) {
- FullySpecifiedType argTy = templId->templateArgumentAt(templateArgIndex);
- arguments[templateArgIndex] = q->apply(argTy);
- }
-
- n = control()->templateNameId(templId->identifier(), arguments.data(), arguments.size());
+ if (! name)
+ return name;
+
+ else if (const Name *nameId = name->asNameId()) {
+ const Identifier *id = control()->findOrInsertIdentifier(nameId->identifier()->chars(),
+ nameId->identifier()->size());
+ return control()->nameId(id);
+
+ } else if (const TemplateNameId *templId = name->asTemplateNameId()) {
+ QVarLengthArray<FullySpecifiedType, 8> arguments(templId->templateArgumentCount());
+ for (unsigned templateArgIndex = 0; templateArgIndex < templId->templateArgumentCount(); ++templateArgIndex) {
+ FullySpecifiedType argTy = templId->templateArgumentAt(templateArgIndex);
+ arguments[templateArgIndex] = q->apply(argTy);
}
+ const Identifier *id = control()->findOrInsertIdentifier(templId->identifier()->chars(),
+ templId->identifier()->size());
+ return control()->templateNameId(id, arguments.data(), arguments.size());
+
+ } else if (const QualifiedNameId *qq = name->asQualifiedNameId()) {
+ const Name *base = instantiate(qq->base());
+ const Name *name = instantiate(qq->name());
+
+ return control()->qualifiedNameId(base, name);
+
+ } else if (const OperatorNameId *op = name->asOperatorNameId()) {
+ return control()->operatorNameId(op->kind());
+
+ } else if (const ConversionNameId *c = name->asConversionNameId()) {
+ FullySpecifiedType ty = q->apply(c->type());
+ return control()->conversionNameId(ty);
- names[i] = n;
}
- const QualifiedNameId *q = control()->qualifiedNameId(names.data(), names.size(), name->isGlobal());
- _type = control()->namedType(q);
+ return 0;
+ }
+
+ virtual void visit(const QualifiedNameId *name)
+ {
+ if (const Name *n = instantiate(name))
+ _type = control()->namedType(n);
}
virtual void visit(const DestructorNameId *name)
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 4d365ae0833..3bb6ea04586 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -47,6 +47,18 @@ namespace {
using namespace CPlusPlus;
+static void addNames(const Name *name, QList<const Name *> *names)
+{
+ if (! name)
+ return;
+ else if (name->isNameId() || name->isTemplateNameId())
+ names->append(name);
+ else if (const QualifiedNameId *q = name->asQualifiedNameId()) {
+ addNames(q->base(), names);
+ addNames(q->name(), names);
+ }
+}
+
static void fullyQualifiedName_helper(Symbol *symbol, QList<const Name *> *names)
{
if (! symbol)
@@ -56,23 +68,16 @@ static void fullyQualifiedName_helper(Symbol *symbol, QList<const Name *> *names
if (symbol->name()) {
if (symbol->isClass() || symbol->isNamespace()) {
- if (const QualifiedNameId *q = symbol->name()->asQualifiedNameId()) {
- for (unsigned i = 0; i < q->nameCount(); ++i)
- names->append(q->nameAt(i));
+ addNames(symbol->name(), names);
- } else if (symbol->name()->isNameId() || symbol->name()->isTemplateNameId()) {
- names->append(symbol->name());
- }
} else if (symbol->isObjCClass() || symbol->isObjCBaseClass() || symbol->isObjCProtocol()
|| symbol->isObjCForwardClassDeclaration() || symbol->isObjCForwardProtocolDeclaration()
|| symbol->isForwardClassDeclaration()) {
- if (symbol->name())
- names->append(symbol->name());
+ addNames(symbol->name(), names);
+
} else if (symbol->isFunction()) {
- if (const QualifiedNameId *q = symbol->name()->asQualifiedNameId()) {
- for (unsigned i = 0; i < q->nameCount() - 1; ++i)
- names->append(q->nameAt(i));
- }
+ if (const QualifiedNameId *q = symbol->name()->asQualifiedNameId())
+ addNames(q->base(), names);
}
}
}
@@ -142,6 +147,9 @@ const Name *LookupContext::minimalName(const Name *name,
Scope *source,
ClassOrNamespace *target) const
{
+ qWarning() << "TODO:" << Q_FUNC_INFO;
+
+#if 0
Q_ASSERT(name);
Q_ASSERT(source);
Q_ASSERT(target);
@@ -153,7 +161,7 @@ const Name *LookupContext::minimalName(const Name *name,
Symbol *canonicalSymbol = symbols.first();
std::vector<const Name *> fqNames = fullyQualifiedName(canonicalSymbol).toVector().toStdVector();
if (const QualifiedNameId *qId = name->asQualifiedNameId())
- fqNames.push_back(qId->nameAt(qId->nameCount() - 1));
+ fqNames.push_back(qId->name());
else
fqNames.push_back(name);
@@ -172,6 +180,8 @@ const Name *LookupContext::minimalName(const Name *name,
return lastWorking->nameAt(0);
else
return lastWorking;
+#endif
+ return 0;
}
@@ -396,21 +406,11 @@ QList<Symbol *> ClassOrNamespace::lookup_helper(const Name *name, bool searchInE
if (name) {
if (const QualifiedNameId *q = name->asQualifiedNameId()) {
- ClassOrNamespace *binding = this;
-
- if (q->isGlobal())
- binding = globalNamespace();
-
- if (q->nameCount() == 1)
- return binding->find(q->unqualifiedNameId());
-
- binding = binding->lookupType(q->nameAt(0));
-
- for (unsigned index = 1; binding && index < q->nameCount() - 1; ++index)
- binding = binding->findType(q->nameAt(index));
+ if (! q->base())
+ result = globalNamespace()->find(q->name());
- if (binding)
- result = binding->find(q->unqualifiedNameId());
+ else if (ClassOrNamespace *binding = lookupType(q->base()))
+ result = binding->find(q->name());
return result;
}
@@ -533,17 +533,14 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name,
bool searchInEnclosingScope)
{
if (const QualifiedNameId *q = name->asQualifiedNameId()) {
- ClassOrNamespace *e = this;
- if (q->isGlobal())
- e = globalNamespace();
+ if (! q->base())
+ return globalNamespace()->findType(q->name());
- e = e->lookupType(q->nameAt(0));
+ else if (ClassOrNamespace *binding = lookupType(q->base()))
+ return binding->findType(q->name());
- for (unsigned index = 1; e && index < q->nameCount(); ++index)
- e = e->findType(q->nameAt(index));
-
- return e;
+ return 0;
} else if (! processed->contains(this)) {
processed->insert(this);
@@ -653,12 +650,10 @@ ClassOrNamespace *ClassOrNamespace::findOrCreateType(const Name *name)
return this;
if (const QualifiedNameId *q = name->asQualifiedNameId()) {
- ClassOrNamespace *e = this;
+ if (! q->base())
+ return globalNamespace()->findOrCreateType(q->name());
- for (unsigned i = 0; e && i < q->nameCount(); ++i)
- e = e->findOrCreateType(q->nameAt(i));
-
- return e;
+ return findOrCreateType(q->base())->findOrCreateType(q->name());
} else if (name->isNameId() || name->isTemplateNameId()) {
ClassOrNamespace *e = nestedType(name);
@@ -871,7 +866,7 @@ bool CreateBindings::visit(UsingDeclaration *u)
{
if (u->name()) {
if (const QualifiedNameId *q = u->name()->asQualifiedNameId()) {
- if (const NameId *unqualifiedId = q->unqualifiedNameId()->asNameId()) {
+ if (const NameId *unqualifiedId = q->name()->asNameId()) {
if (ClassOrNamespace *delegate = _currentClassOrNamespace->lookupType(q)) {
ClassOrNamespace *b = _currentClassOrNamespace->findOrCreateType(unqualifiedId);
b->addUsing(delegate);
diff --git a/src/libs/cplusplus/NamePrettyPrinter.cpp b/src/libs/cplusplus/NamePrettyPrinter.cpp
index 89c6ddb4764..5c6146d0e98 100644
--- a/src/libs/cplusplus/NamePrettyPrinter.cpp
+++ b/src/libs/cplusplus/NamePrettyPrinter.cpp
@@ -246,14 +246,10 @@ void NamePrettyPrinter::visit(const ConversionNameId *name)
void NamePrettyPrinter::visit(const QualifiedNameId *name)
{
- if (name->isGlobal())
- _name += QLatin1String("::");
-
- for (unsigned index = 0; index < name->nameCount(); ++index) {
- if (index != 0)
- _name += QLatin1String("::");
- _name += operator()(name->nameAt(index));
- }
+ if (name->base())
+ _name += operator()(name->base());
+ _name += QLatin1String("::");
+ _name += operator()(name->name());
}
void NamePrettyPrinter::visit(const SelectorNameId *name)
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 21fc815f031..b02b7ecf5d1 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -221,11 +221,10 @@ bool ResolveExpression::visit(NewExpressionAST *ast)
bool ResolveExpression::visit(TypeidExpressionAST *)
{
- const Name *std_type_info[2];
- std_type_info[0] = control()->nameId(control()->findOrInsertIdentifier("std"));
- std_type_info[1] = control()->nameId(control()->findOrInsertIdentifier("type_info"));
+ const Name *stdName = control()->nameId(control()->findOrInsertIdentifier("std"));
+ const Name *tiName = control()->nameId(control()->findOrInsertIdentifier("type_info"));
+ const Name *q = control()->qualifiedNameId(control()->qualifiedNameId(/* :: */ 0, stdName), tiName);
- const Name *q = control()->qualifiedNameId(std_type_info, 2, /*global=*/ true);
FullySpecifiedType ty(control()->namedType(q));
addResult(ty, _scope);
@@ -314,14 +313,11 @@ void ResolveExpression::thisObject()
addResult(ptrTy, fun->scope());
break;
} else if (const QualifiedNameId *q = fun->name()->asQualifiedNameId()) {
- const Name *nestedNameSpecifier = 0;
- if (q->nameCount() == 1 && q->isGlobal())
- nestedNameSpecifier = q->nameAt(0);
- else
- nestedNameSpecifier = control()->qualifiedNameId(q->names(), q->nameCount() - 1);
- FullySpecifiedType classTy(control()->namedType(nestedNameSpecifier));
- FullySpecifiedType ptrTy(control()->pointerType(classTy));
- addResult(ptrTy, fun->scope());
+ if (q->base()) {
+ FullySpecifiedType classTy(control()->namedType(q->base()));
+ FullySpecifiedType ptrTy(control()->pointerType(classTy));
+ addResult(ptrTy, fun->scope());
+ }
break;
}
}