private TypePrinter GetTypePrinter(GeneratorKind kind, BindingContext context)
        {
            TypePrinter typePrinter;

            switch (kind)
            {
            case GeneratorKind.C:
                typePrinter = new CppTypePrinter(Context)
                {
                    PrintFlavorKind = CppTypePrintFlavorKind.C
                };
                break;

            case GeneratorKind.CPlusPlus:
            case GeneratorKind.QuickJS:
            case GeneratorKind.NAPI:
            case GeneratorKind.TypeScript:
                typePrinter = new CppTypePrinter(Context);
                break;

            case GeneratorKind.CLI:
                typePrinter = new CLITypePrinter(Context);
                break;

            case GeneratorKind.CSharp:
                typePrinter = new CSharpTypePrinter(Context);
                break;

            default:
                throw new System.NotImplementedException();
            }

            return(typePrinter);
        }
예제 #2
0
파일: Flood.cs 프로젝트: aldyjepara/flood
        void GenerateEquals(Class @class, Block block, Method method)
        {
            var equalsOverride = @class.Methods.FirstOrDefault(m =>
            {
                var expansions = m.PreprocessedEntities.OfType <MacroExpansion>();
                return(expansions.Any(e => e.Text == "FLD_EQUALS"));
            });

            if (equalsOverride == null)
            {
                return;
            }

            var cliTypePrinter = new CLITypePrinter(Driver);
            var cppTypePrinter = new CppTypePrinter(Driver.TypeDatabase);
            var paramCppType   = equalsOverride.Parameters[0].Visit(cppTypePrinter);
            var classCppType   = @class.Visit(cppTypePrinter);
            var classCliType   = @class.Visit(cliTypePrinter);

            block.Text.StringBuilder.Clear();
            block.WriteLine("if (!object) return false;");
            block.WriteLine("auto obj = dynamic_cast<{0}>({1});",
                            classCliType, method.Parameters[0].Name);
            block.NewLine();

            block.WriteLine("if (!obj) return false;");
            block.WriteLine("auto param = ({0})obj->NativePtr;", paramCppType);
            block.WriteLine("return (({0}*)NativePtr)->{1}(param);",
                            classCppType, equalsOverride.OriginalName);
        }
예제 #3
0
        void GenerateEquals(Class @class, Block block, Method method)
        {
            var cliTypePrinter = new CLITypePrinter(Context);
            var classCliType   = @class.Visit(cliTypePrinter);

            block.WriteLine("if (!object) return false;");
            block.WriteLine("auto obj = dynamic_cast<{0}>({1});",
                            classCliType, method.Parameters[0].Name);
            block.NewLine();

            block.WriteLine("if (!obj) return false;");
            block.Write("return __Instance == obj->__Instance;");
        }
예제 #4
0
        void GenerateEquals(Class @class, Block block, Method method)
        {
            var cliTypePrinter = new CLITypePrinter(Driver);
            var classCliType = @class.Visit(cliTypePrinter);

            block.WriteLine("if (!object) return false;");
            block.WriteLine("auto obj = dynamic_cast<{0}>({1});",
                classCliType, method.Parameters[0].Name);
            block.NewLine();

            block.WriteLine("if (!obj) return false;");
            block.Write("return __Instance == obj->__Instance;");
        }
예제 #5
0
        public override bool VisitASTContext(ASTContext context)
        {
            TypePrinter typePrinter = null;

            switch (Options.GeneratorKind)
            {
            case GeneratorKind.CLI:
                typePrinter = new CLITypePrinter(Context);
                break;

            case GeneratorKind.CSharp:
                typePrinter = new CSharpTypePrinter(Context);
                break;
            }
            DeclarationName.ParameterTypeComparer.TypePrinter = typePrinter;
            return(base.VisitASTContext(context));
        }
예제 #6
0
 protected CLITextTemplate(Driver driver, IEnumerable<TranslationUnit> units)
     : base(driver, units)
 {
     TypePrinter = new CLITypePrinter(driver);
     Includes = new HashSet<Include>();
 }
예제 #7
0
 protected CLITemplate(BindingContext context, IEnumerable<TranslationUnit> units)
     : base(context, units)
 {
     TypePrinter = new CLITypePrinter(context);
     Includes = new HashSet<Include>();
 }
예제 #8
0
        public void GenerateClassGenericMethods(Class @class)
        {
            var printer = TypePrinter;
            var oldCtx = printer.Context;

            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.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.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.Context = oldCtx;
        }
예제 #9
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(Driver);
                var cliArgs = cliTypePrinter.VisitParameters(@event.Parameters, hasNames: true);

                WriteLine("void raise({0});", cliArgs);
                WriteCloseBraceIndent();
                PopIndent();
            }
        }
예제 #10
0
 private string ToCLITypeName(Declaration decl)
 {
     var typePrinter = new CLITypePrinter(Context.Driver);
     return typePrinter.VisitDeclaration(decl);
 }
예제 #11
0
 public CLIGenerator(Driver driver)
     : base(driver)
 {
     typePrinter = new CLITypePrinter(driver);
     Type.TypePrinterDelegate += type => type.Visit(typePrinter);
 }
예제 #12
0
 protected CLITextTemplate(Driver driver, TranslationUnit unit)
     : base(driver, unit)
 {
     TypePrinter = new CLITypePrinter(driver);
     Includes = new HashSet<Include>();
 }
예제 #13
0
파일: Flood.cs 프로젝트: chartly/flood
        void GenerateEquals(Class @class, Block block, Method method)
        {
            var equalsOverride = @class.Methods.FirstOrDefault(m =>
            {
                var expansions = m.PreprocessedEntities.OfType<MacroExpansion>();
                return expansions.Any(e => e.Text == "FLD_EQUALS");
            });

            if (equalsOverride == null)
                return;

            var cliTypePrinter = new CLITypePrinter(Driver);
            var cppTypePrinter = new CppTypePrinter(Driver.TypeDatabase);
            var paramCppType = equalsOverride.Parameters[0].Visit(cppTypePrinter);
            var classCppType = @class.Visit(cppTypePrinter);
            var classCliType = @class.Visit(cliTypePrinter);

            block.Text.StringBuilder.Clear();
            block.WriteLine("if (!object) return false;");
            block.WriteLine("auto obj = dynamic_cast<{0}>({1});",
                classCliType, method.Parameters[0].Name);
            block.NewLine();

            block.WriteLine("if (!obj) return false;");
            block.WriteLine("auto param = ({0})obj->NativePtr;", paramCppType);
            block.WriteLine("return (({0}*)NativePtr)->{1}(param);",
                classCppType, equalsOverride.OriginalName);
        }
예제 #14
0
 public CLIGenerator(Driver driver) : base(driver)
 {
     typePrinter = new CLITypePrinter(driver);
 }
예제 #15
0
 public void Init()
 {
     ParseLibrary("CLITypes.h");
     printer = new CLITypePrinter(Driver, new CLITypePrinterContext());
 }
예제 #16
0
 public CLIGenerator(BindingContext context) : base(context)
 {
     typePrinter = new CLITypePrinter(context);
 }