Example #1
0
 public CLITypePrinter(Driver driver)
 {
     Driver          = driver;
     TypeMapDatabase = driver.TypeDatabase;
     Options         = driver.Options;
     Context         = new CLITypePrinterContext();
 }
Example #2
0
        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;
        }
Example #3
0
        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;
        }
Example #4
0
        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;
        }
Example #5
0
 public CLITypePrinter(Driver driver, CLITypePrinterContext context)
     : this(driver)
 {
     Context = context;
 }
Example #6
0
 public CLITypePrinter(BindingContext context, CLITypePrinterContext typePrinterContext)
     : this(context)
 {
     TypePrinterContext = typePrinterContext;
 }
Example #7
0
 public CLITypePrinter(BindingContext context)
 {
     Context            = context;
     TypePrinterContext = new CLITypePrinterContext();
 }
Example #8
0
        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;
        }