public void GenerateClassGenericMethods(Class @class) { Indent(); foreach (var template in @class.Templates) { if (!template.IsGenerated) { continue; } var functionTemplate = template as FunctionTemplate; if (functionTemplate == null) { continue; } PushBlock(BlockKind.Template); var function = functionTemplate.TemplatedFunction; var typePrinter = new CLITypePrinter(Context); typePrinter.PushContext(TypePrinterContextKind.Template); var retType = function.ReturnType.Visit(typePrinter); var typeNames = ""; var paramNames = template.Parameters.Select(param => param.Name).ToList(); if (paramNames.Any()) { typeNames = "typename " + string.Join(", typename ", paramNames); } Write("generic<{0}>", typeNames); // Process the generic type constraints var constraints = new List <string>(); foreach (var param in template.Parameters.OfType <TypeTemplateParameter>()) { if (string.IsNullOrWhiteSpace(param.Constraint)) { continue; } constraints.Add(string.Format("{0} : {1}", param.Name, param.Constraint)); } if (constraints.Any()) { Write(" where {0}", string.Join(", ", constraints)); } NewLine(); WriteLine("{0} {1}({2});", retType, function.Name, GenerateParametersList(function.Parameters)); PopBlock(NewLineKind.BeforeNextBlock); } Unindent(); }
private void GenerateFunctionTemplate(FunctionTemplate template) { PushBlock(BlockKind.Template); var function = template.TemplatedFunction; var typePrinter = new CLITypePrinter(Context) { Declaration = template }; typePrinter.PushContext(TypePrinterContextKind.Template); var retType = function.ReturnType.Visit(typePrinter); var typeNames = ""; var paramNames = template.Parameters.Select(param => param.Name).ToList(); if (paramNames.Any()) { typeNames = "typename " + string.Join(", typename ", paramNames); } WriteLine("generic<{0}>", typeNames); WriteLine("{0} {1}::{2}({3})", retType, QualifiedIdentifier(function.Namespace), function.Name, GenerateParametersList(function.Parameters)); WriteStartBraceIndent(); var @class = function.Namespace as Class; GenerateFunctionCall(function, @class); WriteCloseBraceIndent(); NewLine(); PopBlock(NewLineKind.BeforeNextBlock); }