diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-05-06 14:01:38 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-05-10 09:57:55 +0200 |
commit | 05984e71fc1d93dc65bc5aab42b5edea8f66601e (patch) | |
tree | c288716e863803390091622903785aeeae23e5fe /src/libs/cplusplus/GenTemplateInstance.cpp | |
parent | bc6828ff013318b7f33739041dc6ee035e565de2 (diff) | |
download | qt-creator-05984e71fc1d93dc65bc5aab42b5edea8f66601e.tar.gz |
Refactor a bit the lookup, it should simplify template instantiation.
Diffstat (limited to 'src/libs/cplusplus/GenTemplateInstance.cpp')
-rw-r--r-- | src/libs/cplusplus/GenTemplateInstance.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/libs/cplusplus/GenTemplateInstance.cpp b/src/libs/cplusplus/GenTemplateInstance.cpp index bb6afc6655..a9191461e1 100644 --- a/src/libs/cplusplus/GenTemplateInstance.cpp +++ b/src/libs/cplusplus/GenTemplateInstance.cpp @@ -369,11 +369,37 @@ GenTemplateInstance::GenTemplateInstance(Control *control, const Substitution &s _substitution(substitution) { } -FullySpecifiedType GenTemplateInstance::operator()(Symbol *symbol) +FullySpecifiedType GenTemplateInstance::gen(Symbol *symbol) { ApplySubstitution o(_control, symbol, _substitution); return o.apply(symbol->type()); } -Control *GenTemplateInstance::control() const -{ return _control; } +FullySpecifiedType GenTemplateInstance::instantiate(const Name *className, Symbol *candidate, Control *control) +{ + if (className) { + if (const TemplateNameId *templId = className->asTemplateNameId()) { + if (Class *klass = candidate->enclosingSymbol()->asClass()) { + GenTemplateInstance::Substitution subst; + + for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) { + FullySpecifiedType templArgTy = templId->templateArgumentAt(i); + + if (i < klass->templateParameterCount()) { + const Name *templArgName = klass->templateParameterAt(i)->name(); + + if (templArgName && templArgName->identifier()) { + const Identifier *templArgId = templArgName->identifier(); + subst.append(qMakePair(templArgId, templArgTy)); + } + } + } + + GenTemplateInstance inst(control, subst); + return inst.gen(candidate); + } + } + } + + return candidate->type(); +} |