コード例 #1
0
        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
ファイル: CLITextTemplate.cs プロジェクト: daxiazh/CppSharp
 protected CLITextTemplate(Driver driver, IEnumerable<TranslationUnit> units)
     : base(driver, units)
 {
     TypePrinter = new CLITypePrinter(driver);
     Includes = new HashSet<Include>();
 }
コード例 #7
0
ファイル: CLITemplate.cs プロジェクト: ddobrev/CppSharp
 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
ファイル: CLIMarshal.cs プロジェクト: corefan/CppSharp
 private string ToCLITypeName(Declaration decl)
 {
     var typePrinter = new CLITypePrinter(Context.Driver);
     return typePrinter.VisitDeclaration(decl);
 }
コード例 #11
0
ファイル: CLIGenerator.cs プロジェクト: jijamw/CppSharp
 public CLIGenerator(Driver driver)
     : base(driver)
 {
     typePrinter = new CLITypePrinter(driver);
     Type.TypePrinterDelegate += type => type.Visit(typePrinter);
 }
コード例 #12
0
ファイル: CLITextTemplate.cs プロジェクト: kidleon/CppSharp
 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
ファイル: CLIGenerator.cs プロジェクト: tritao/CppSharp
 public CLIGenerator(Driver driver) : base(driver)
 {
     typePrinter = new CLITypePrinter(driver);
 }
コード例 #15
0
ファイル: TestCLITypePrinter.cs プロジェクト: cDoru/CppSharp
 public void Init()
 {
     ParseLibrary("CLITypes.h");
     printer = new CLITypePrinter(Driver, new CLITypePrinterContext());
 }
コード例 #16
0
ファイル: CLIGenerator.cs プロジェクト: ddobrev/CppSharp
 public CLIGenerator(BindingContext context) : base(context)
 {
     typePrinter = new CLITypePrinter(context);
 }