ProgramTypeTable::TemplateMap::value_type ProgramTypeTable::template2Info(const TypeTable::TypeInfoMap::value_type& tt) { QStringList args = splitTemplateArgs(tt.second.m_templatePattern); TemplateMap::value_type result(args.front(), TemplateInfo()); result.second.type = &tt.second; args.pop_front(); result.second.templateArgs = args; return result; }
std::shared_ptr<DeclarationNode> TemplateFunctionDeclarationNode::instantiateWithArguments(TemplateArguments arguments) { auto template_info = TemplateInfo(defined_symbol, arguments); RebuildTreeVisitor rebuild(template_info); statements -> accept(rebuild); auto stat = rebuild.result(); auto new_return_type_info = rebuild.processTypeInfo(info_.returnTypeInfo()); auto new_formal_params = std::vector<ParamInfo>{ }; for ( auto param : info_.formalParams() ) new_formal_params.emplace_back(param.name(), rebuild.processTypeInfo(param.typeInfo())); auto new_info = FunctionDeclarationInfo(new_return_type_info, new_formal_params); auto decl = std::make_shared<FunctionDeclarationNode>(template_info.getInstName(), new_info, std::move(stat), traits_, is_unsafe); decl -> scope = scope; decl -> build_scope(); return decl; }