aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp')
-rw-r--r--src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp53
1 files changed, 37 insertions, 16 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)