public CLITypePrinter(Driver driver) { Driver = driver; TypeMapDatabase = driver.TypeDatabase; Options = driver.Options; Context = new CLITypePrinterContext(); }
public void GenerateClassGenericMethods(Class @class) { var printer = TypePrinter as CLITypePrinter; var oldCtx = printer.Context; PushIndent(); foreach (var template in @class.Templates) { if (template.Ignore) { continue; } var functionTemplate = template as FunctionTemplate; if (functionTemplate == null) { continue; } var function = functionTemplate.TemplatedFunction; var typeCtx = new CLITypePrinterContext() { Kind = TypePrinterContextKind.Template, Declaration = template }; printer.Context = typeCtx; var typePrinter = new CLITypePrinter(Driver, typeCtx); var retType = function.ReturnType.Type.Visit(typePrinter, function.ReturnType.Qualifiers); var typeNamesStr = ""; var paramNames = template.Parameters.Select(param => param.Name).ToList(); if (paramNames.Any()) { typeNamesStr = "typename " + string.Join(", typename ", paramNames); } WriteLine("generic<{0}>", typeNamesStr); WriteLine("{0} {1}({2});", retType, SafeIdentifier(function.Name), GenerateParametersList(function.Parameters)); } PopIndent(); printer.Context = oldCtx; }
private void GenerateFunctionTemplate(FunctionTemplate template) { var printer = TypePrinter; var oldCtx = printer.TypePrinterContext; PushBlock(CLIBlockKind.Template); var function = template.TemplatedFunction; var typeCtx = new CLITypePrinterContext() { Kind = TypePrinterContextKind.Template, Declaration = template }; printer.TypePrinterContext = typeCtx; var typePrinter = new CLITypePrinter(Context, typeCtx); var retType = function.ReturnType.Type.Visit(typePrinter, function.ReturnType.Qualifiers); 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); printer.TypePrinterContext = oldCtx; }
private void GenerateFunctionTemplate(FunctionTemplate template, Class @class) { var printer = TypePrinter as CLITypePrinter; var oldCtx = printer.Context; var function = template.TemplatedFunction; var typeCtx = new CLITypePrinterContext() { Kind = TypePrinterContextKind.Template, Declaration = template }; printer.Context = typeCtx; var typePrinter = new CLITypePrinter(Driver, typeCtx); var retType = function.ReturnType.Type.Visit(typePrinter, function.ReturnType.Qualifiers); var typeNamesStr = ""; var paramNames = template.Parameters.Select(param => param.Name).ToList(); if (paramNames.Any()) { typeNamesStr = "typename " + string.Join(", typename ", paramNames); } WriteLine("generic<{0}>", typeNamesStr); WriteLine("{0} {1}::{2}({3})", retType, QualifiedIdentifier(@class), SafeIdentifier(function.Name), GenerateParametersList(function.Parameters)); WriteStartBraceIndent(); GenerateFunctionCall(function, @class); WriteCloseBraceIndent(); NewLine(); printer.Context = oldCtx; }
public CLITypePrinter(Driver driver, CLITypePrinterContext context) : this(driver) { Context = context; }
public CLITypePrinter(BindingContext context, CLITypePrinterContext typePrinterContext) : this(context) { TypePrinterContext = typePrinterContext; }
public CLITypePrinter(BindingContext context) { Context = context; TypePrinterContext = new CLITypePrinterContext(); }
public void GenerateClassGenericMethods(Class @class) { var printer = TypePrinter; var oldCtx = printer.TypePrinterContext; PushIndent(); foreach (var template in @class.Templates) { if (!template.IsGenerated) { continue; } var functionTemplate = template as FunctionTemplate; if (functionTemplate == null) { continue; } PushBlock(CLIBlockKind.Template); var function = functionTemplate.TemplatedFunction; var typeCtx = new CLITypePrinterContext() { Kind = TypePrinterContextKind.Template, Declaration = template }; printer.TypePrinterContext = typeCtx; var typePrinter = new CLITypePrinter(Context, typeCtx); var retType = function.ReturnType.Type.Visit(typePrinter, function.ReturnType.Qualifiers); 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); } PopIndent(); printer.TypePrinterContext = oldCtx; }