Example #1
0
        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();
        }
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 GenerateEventRaise(Event @event, Class @class)
        {
            var typePrinter = new CLITypePrinter(Context);
            var args        = typePrinter.VisitParameters(@event.Parameters, hasNames: true);

            WriteLine("void {0}::{1}::raise({2})", QualifiedIdentifier(@class),
                      @event.Name, args);

            WriteOpenBraceAndIndent();

            var paramNames = @event.Parameters.Select(param => param.Name).ToList();

            WriteLine("_{0}({1});", @event.Name, string.Join(", ", paramNames));

            UnindentAndWriteCloseBrace();
        }
Example #4
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 #5
0
        public override void GenerateClassEvents(Class @class)
        {
            foreach (var @event in @class.Events)
            {
                if ([email protected])
                {
                    continue;
                }

                typePrinter.PushContext(TypePrinterContextKind.Native);
                var cppArgs = typePrinter.VisitParameters(@event.Parameters, hasNames: true);
                typePrinter.PopContext();

                WriteLine("private:");
                Indent();

                var delegateName = string.Format("_{0}Delegate", @event.Name);
                WriteLine("delegate void {0}({1});", delegateName, cppArgs);
                WriteLine("{0}^ {0}Instance;", delegateName);

                WriteLine("void _{0}Raise({1});", @event.Name, cppArgs);
                WriteLine("{0} _{1};", @event.Type, @event.Name);

                Unindent();
                WriteLine("public:");
                Indent();

                WriteLine("event {0} {1}", @event.Type, @event.Name);
                WriteOpenBraceAndIndent();

                WriteLine("void add({0} evt);", @event.Type);
                WriteLine("void remove({0} evt);", @event.Type);

                var cliTypePrinter = new CLITypePrinter(Context);
                var cliArgs        = cliTypePrinter.VisitParameters(@event.Parameters, hasNames: true);

                WriteLine("void raise({0});", cliArgs);
                UnindentAndWriteCloseBrace();
                Unindent();
            }
        }
Example #6
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 #7
0
        public void GenerateClassEvents(Class @class)
        {
            foreach (var @event in @class.Events)
            {
                if ([email protected])
                {
                    continue;
                }

                var cppTypePrinter = new CppTypePrinter();
                var cppArgs        = cppTypePrinter.VisitParameters(@event.Parameters, hasNames: true);

                WriteLine("private:");
                PushIndent();

                var delegateName = string.Format("_{0}Delegate", @event.Name);
                WriteLine("delegate void {0}({1});", delegateName, cppArgs);
                WriteLine("{0}^ {0}Instance;", delegateName);

                WriteLine("void _{0}Raise({1});", @event.Name, cppArgs);
                WriteLine("{0} _{1};", @event.Type, @event.Name);

                PopIndent();
                WriteLine("public:");
                PushIndent();

                WriteLine("event {0} {1}", @event.Type, @event.Name);
                WriteStartBraceIndent();

                WriteLine("void add({0} evt);", @event.Type);
                WriteLine("void remove({0} evt);", @event.Type);

                var cliTypePrinter = new CLITypePrinter(Context);
                var cliArgs        = cliTypePrinter.VisitParameters(@event.Parameters, hasNames: true);

                WriteLine("void raise({0});", cliArgs);
                WriteCloseBraceIndent();
                PopIndent();
            }
        }
Example #8
0
        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));

            WriteOpenBraceAndIndent();

            var @class = function.Namespace as Class;

            GenerateFunctionCall(function, @class);

            UnindentAndWriteCloseBrace();
            NewLine();

            PopBlock(NewLineKind.BeforeNextBlock);
        }
Example #9
0
        private string ToCLITypeName(Declaration decl)
        {
            var typePrinter = new CLITypePrinter(Context.Driver);

            return(typePrinter.VisitDeclaration(decl));
        }
Example #10
0
 protected CLITemplate(BindingContext context, IEnumerable <TranslationUnit> units)
     : base(context, units)
 {
     TypePrinter = new CLITypePrinter(context);
     Includes    = new HashSet <Include>();
 }
Example #11
0
 protected CLITextTemplate(Driver driver, IEnumerable <TranslationUnit> units)
     : base(driver, units)
 {
     TypePrinter = new CLITypePrinter(driver);
     Includes    = new HashSet <Include>();
 }
 protected CLITextTemplate(Driver driver, TranslationUnit unit)
     : base(driver, unit)
 {
     TypePrinter = new CLITypePrinter(driver);
     Includes    = new HashSet <Include>();
 }
Example #13
0
 public CLIGenerator(Driver driver) : base(driver)
 {
     typePrinter = new CLITypePrinter(driver);
     Type.TypePrinterDelegate += type => type.Visit(typePrinter);
 }
Example #14
0
 public CLIGenerator(BindingContext context) : base(context)
 {
     typePrinter = new CLITypePrinter(context);
 }
Example #15
0
 public CLIGenerator(Driver driver) : base(driver)
 {
     typePrinter = new CLITypePrinter(driver);
 }
Example #16
0
        public void GenerateClassGenericMethods(Class @class)
        {
            var printer = TypePrinter;
            var oldCtx  = printer.Context;

            PushIndent();
            foreach (var template in @class.Templates)
            {
                if (template.Ignore)
                {
                    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.Context = typeCtx;

                var typePrinter = new CLITypePrinter(Driver, 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)
                {
                    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, SafeIdentifier(function.Name),
                          GenerateParametersList(function.Parameters));

                PopBlock(NewLineKind.BeforeNextBlock);
            }
            PopIndent();

            printer.Context = oldCtx;
        }