Exemple #1
0
        public void Preprocess(Driver driver, ASTContext ctx)
        {
            ctx.IgnoreEnumWithMatchingItem("SDL_FALSE");
            ctx.IgnoreEnumWithMatchingItem("DUMMY_ENUM_VALUE");

            ctx.SetNameOfEnumWithMatchingItem("SDL_SCANCODE_UNKNOWN", "ScanCode");
            ctx.SetNameOfEnumWithMatchingItem("SDLK_UNKNOWN", "Key");
            ctx.SetNameOfEnumWithMatchingItem("KMOD_NONE", "KeyModifier");
            ctx.SetNameOfEnumWithMatchingItem("SDL_LOG_CATEGORY_CUSTOM", "LogCategory");

            ctx.GenerateEnumFromMacros("InitFlags", "SDL_INIT_(.*)").SetFlags();
            ctx.GenerateEnumFromMacros("Endianness", "SDL_(.*)_ENDIAN");
            ctx.GenerateEnumFromMacros("InputState", "SDL_RELEASED", "SDL_PRESSED");
            ctx.GenerateEnumFromMacros("AlphaState", "SDL_ALPHA_(.*)");
            ctx.GenerateEnumFromMacros("HatState", "SDL_HAT_(.*)");

            ctx.IgnoreHeadersWithName("SDL_atomic*");
            ctx.IgnoreHeadersWithName("SDL_endian*");
            ctx.IgnoreHeadersWithName("SDL_main*");
            ctx.IgnoreHeadersWithName("SDL_mutex*");
            ctx.IgnoreHeadersWithName("SDL_stdinc*");
            ctx.IgnoreHeadersWithName("SDL_error");

            ctx.IgnoreEnumWithMatchingItem("SDL_ENOMEM");
            ctx.IgnoreFunctionWithName("SDL_Error");
        }
Exemple #2
0
        public static void Run(ILibrary library)
        {
            var options = new DriverOptions();

            var Log = new TextDiagnosticPrinter();
            var driver = new Driver(options, Log);

            library.Setup(driver);
            driver.Setup();

            if(driver.Options.Verbose)
                Log.Level = DiagnosticKind.Debug;

            if (!options.Quiet)
                Log.EmitMessage("Parsing libraries...");

            if (!driver.ParseLibraries())
                return;

            if (!options.Quiet)
                Log.EmitMessage("Indexing library symbols...");

            driver.Symbols.IndexSymbols();

            if (!options.Quiet)
                Log.EmitMessage("Parsing code...");

            if (!driver.ParseCode())
                return;

            if (!options.Quiet)
                Log.EmitMessage("Processing code...");

            library.Preprocess(driver, driver.ASTContext);

            driver.SetupPasses(library);

            driver.ProcessCode();
            library.Postprocess(driver, driver.ASTContext);

            if (!options.Quiet)
                Log.EmitMessage("Generating code...");

            var outputs = driver.GenerateCode();

            foreach (var output in outputs)
            {
                foreach (var pass in driver.GeneratorOutputPasses.Passes)
                {
                    pass.Driver = driver;
                    pass.VisitGeneratorOutput(output);
                }
            }

            if (!driver.Options.DryRun)
                driver.WriteCode(outputs);

            if (driver.Options.IsCSharpGenerator)
                driver.CompileCode();
        }
Exemple #3
0
 public void Preprocess(Driver driver, ASTContext lib)
 {
     string qtModule = "Qt" + this.module;
     string moduleIncludes = Path.Combine(this.includePath, qtModule);
     foreach (TranslationUnit unit in lib.TranslationUnits.Where(u => u.FilePath != "<invalid>"))
     {
         if (Path.GetDirectoryName(unit.FilePath) != moduleIncludes)
         {
             unit.ExplicityIgnored = true;
         }
         else
         {
             IgnorePrivateDeclarations(unit);
         }
     }
     lib.SetClassAsValueType("QByteArray");
     lib.SetClassAsValueType("QListData");
     lib.SetClassAsValueType("QListData::Data");
     lib.SetClassAsValueType("QLocale");
     lib.SetClassAsValueType("QModelIndex");
     lib.SetClassAsValueType("QPoint");
     lib.SetClassAsValueType("QPointF");
     lib.SetClassAsValueType("QSize");
     lib.SetClassAsValueType("QSizeF");
     lib.SetClassAsValueType("QRect");
     lib.SetClassAsValueType("QRectF");
     lib.SetClassAsValueType("QGenericArgument");
     lib.SetClassAsValueType("QVariant");
     // TODO: remove these when their symbols have been replaced or included
     lib.IgnoreClassMethodWithName("QXmlStreamReader", "attributes");
     lib.IgnoreClassMethodWithName("QTimeZone", "offsetData");
     lib.IgnoreClassMethodWithName("QTimeZone", "nextTransition");
     lib.IgnoreClassMethodWithName("QTimeZone", "previousTransition");
 }
Exemple #4
0
        public void Setup(Driver driver)
        {
            var options = driver.Options;
            options.LibraryName = "CppSharp";
            options.DryRun = true;
            options.Headers.AddRange(new string[]
            {
                "clang/AST/Expr.h",
            });

            options.SetupXcode();
            options.MicrosoftMode = false;
            options.TargetTriple = "i686-apple-darwin12.4.0";

            options.addDefines ("__STDC_LIMIT_MACROS");
            options.addDefines ("__STDC_CONSTANT_MACROS");

            var llvmPath = Path.Combine (GetSourceDirectory ("deps"), "llvm");
            var clangPath = Path.Combine(llvmPath, "tools", "clang");

            options.addIncludeDirs(Path.Combine(llvmPath, "include"));
            options.addIncludeDirs(Path.Combine(llvmPath, "build", "include"));
            options.addIncludeDirs (Path.Combine (llvmPath, "build", "tools", "clang", "include"));
            options.addIncludeDirs(Path.Combine(clangPath, "include"));
        }
Exemple #5
0
 public void SetupPasses(Driver driver)
 {
     driver.TranslationUnitPasses.RemovePrefix("SDL_");
     driver.TranslationUnitPasses.RemovePrefix("SCANCODE_");
     driver.TranslationUnitPasses.RemovePrefix("SDLK_");
     driver.TranslationUnitPasses.RemovePrefix("KMOD_");
     driver.TranslationUnitPasses.RemovePrefix("LOG_CATEGORY_");
 }
Exemple #6
0
 public void Setup(Driver driver)
 {
     var options = driver.Options;
     options.LibraryName = "SDL";
     options.Headers.Add("SDL.h");
     options.addIncludeDirs("../../../examples/SDL/SDL-2.0/include");
     options.OutputDir = "SDL";
 }
Exemple #7
0
        public void Preprocess(Driver driver, ASTContext lib)
        {
            lib.SetClassAsValueType("CppSharp::ParserOptions");
            lib.SetClassAsValueType("CppSharp::ParserDiagnostic");
            lib.SetClassAsValueType("CppSharp::ParserResult");

            lib.RenameNamespace("CppSharp::CppParser", "Parser");
        }
Exemple #8
0
 public void Setup(Driver driver)
 {
     var options = driver.Options;
     options.LibraryName = "SDL";
     options.Headers.Add("SDL.h");
     var sdlPath = Path.Combine(GetExamplesDirectory("SDL"), "SDL-2.0/include");
     options.addIncludeDirs(sdlPath);
     options.OutputDir = "SDL";
 }
Exemple #9
0
 public void Postprocess(Driver driver, ASTContext lib)
 {
     CollectTypeDefsPerTypePass collectTypeDefsPerTypePass = new CollectTypeDefsPerTypePass();
     collectTypeDefsPerTypePass.VisitLibrary(driver.ASTContext);
     new ClearCommentsPass().VisitLibrary(driver.ASTContext);
     new GetCommentsFromQtDocsPass(this.docs, this.module, collectTypeDefsPerTypePass.TypeDefsPerType).VisitLibrary(driver.ASTContext);
     new CaseRenamePass(
         RenameTargets.Function | RenameTargets.Method | RenameTargets.Property | RenameTargets.Delegate | RenameTargets.Field,
         RenameCasePattern.UpperCamelCase).VisitLibrary(driver.ASTContext);
 }
Exemple #10
0
        public void Preprocess(Driver driver, ASTContext ctx)
        {
            ctx.RenameNamespace("CppSharp::CppParser", "Parser");

            var exprClass = ctx.FindCompleteClass ("clang::Expr");

            var exprUnit = ctx.TranslationUnits [0];
            var subclassVisitor = new SubclassVisitor (exprClass);
            exprUnit.Visit (subclassVisitor);

            var subclasses = subclassVisitor.Classes;
        }
Exemple #11
0
 public void Postprocess(Driver driver, ASTContext ctx)
 {
     ctx.SetNameOfEnumWithName("PIXELTYPE", "PixelType");
     ctx.SetNameOfEnumWithName("BITMAPORDER", "BitmapOrder");
     ctx.SetNameOfEnumWithName("PACKEDORDER", "PackedOrder");
     ctx.SetNameOfEnumWithName("ARRAYORDER", "ArrayOrder");
     ctx.SetNameOfEnumWithName("PACKEDLAYOUT", "PackedLayout");
     ctx.SetNameOfEnumWithName("PIXELFORMAT", "PixelFormats");
     ctx.SetNameOfEnumWithName("assert_state", "AssertState");
     ctx.SetClassBindName("assert_data", "AssertData");
     ctx.SetNameOfEnumWithName("eventaction", "EventAction");
     ctx.SetNameOfEnumWithName("LOG_CATEGORY", "LogCategory");
 }
Exemple #12
0
 public void Preprocess(Driver driver, ASTContext lib)
 {
     var qtModule = "Qt" + this.module;
     var moduleIncludes = Path.Combine(this.includePath, qtModule);
     foreach (var unit in lib.TranslationUnits.Where(u => u.FilePath != "<invalid>"))
     {
         if (Path.GetDirectoryName(unit.FilePath) != moduleIncludes)
         {
             LinkDeclaration(unit);
         }
         else
         {
             IgnorePrivateDeclarations(unit);
         }
     }
     lib.SetClassAsValueType("QByteArray");
     lib.SetClassAsValueType("QListData");
     lib.SetClassAsValueType("QListData::Data");
     lib.SetClassAsValueType("QLocale");
     lib.SetClassAsValueType("QModelIndex");
     lib.SetClassAsValueType("QPoint");
     lib.SetClassAsValueType("QPointF");
     lib.SetClassAsValueType("QSize");
     lib.SetClassAsValueType("QSizeF");
     lib.SetClassAsValueType("QRect");
     lib.SetClassAsValueType("QRectF");
     lib.SetClassAsValueType("QGenericArgument");
     lib.SetClassAsValueType("QGenericReturnArgument");
     lib.SetClassAsValueType("QVariant");
     lib.IgnoreClassMethodWithName("QString", "fromStdWString");
     lib.IgnoreClassMethodWithName("QString", "toStdWString");
     if (this.module == "Widgets")
     {
         // HACK: work around https://llvm.org/bugs/show_bug.cgi?id=24655
         foreach (var method in lib.FindCompleteClass("QAbstractSlider").Methods.Where(m => m.Access == AccessSpecifier.Protected))
         {
             method.AccessDecl.PreprocessedEntities.Clear();
         }
         string[] classesWithTypeEnums =
         {
             "QGraphicsEllipseItem", "QGraphicsItemGroup", "QGraphicsLineItem",
             "QGraphicsPathItem", "QGraphicsPixmapItem", "QGraphicsPolygonItem", "QGraphicsProxyWidget",
             "QGraphicsRectItem", "QGraphicsSimpleTextItem", "QGraphicsTextItem", "QGraphicsWidget"
         };
         foreach (var enumeration in classesWithTypeEnums.Select(c => lib.FindCompleteClass(c)).SelectMany(
             @class => @class.Enums.Where(e => string.IsNullOrEmpty(e.Name))))
         {
             enumeration.Name = "TypeEnum";
         }
     }
 }
Exemple #13
0
 void ILibrary.Setup(Driver driver)
 {
     // 现在先写死的路径,以方便 测试功能是否使,后面真正用到时,再写命令行来更灵活的处理绑定吧
     // 估计以后要区分 32位与64位
     // 擦: 现在的 CppSharp 只支持32位,估计以后可能支持吧
     var options = driver.Options;
     options.GeneratorKind = GeneratorKind.CSharp;
     options.LibraryName = "Common";
     options.Headers.Add(@"D:\GitSourceCode\TempCode\XunLongJiMobileServer\Common\Include\TestExportClass.h");
     options.Libraries.Add(@"D:\GitSourceCode\TempCode\XunLongJiMobileServer\Lib/Win32/Debug\Common.lib");
     options.ShowHelpText = true;
     options.OutputDir = @"d:\CppWrapper";
     options.OutputNamespace = "XLJCommon";
 }        
Exemple #14
0
 public void Setup(Driver driver)
 {
     var options = driver.Options;
     options.LibraryName = "CppSharp.CppParser.dll";
     options.GeneratorKind = Kind;
     options.Headers.Add("AST.h");
     options.Headers.Add("CppParser.h");
     var basePath = Path.Combine(GetSourceDirectory(), "CppParser");
     options.IncludeDirs.Add(basePath);
     options.Libraries.Add("CppSharp.CppParser.lib");
     options.LibraryDirs.Add(".");
     options.OutputDir = "../../../../src/CppParser/Bindings/";
     options.OutputDir += Kind.ToString();
     options.GenerateLibraryNamespace = false;
     options.CheckSymbols = false;
 }
Exemple #15
0
        public void Preprocess(Driver driver, Library lib)
        {
            // FBase.h is just an aggregrating header file, which also contains
            // a block-comment for the Base namespace.   We don't need to generate
            // any code for it.
            lib.IgnoreHeadersWithName("FBase.h");

            // We are mapping Tizen::Base::String to a standard .NET string class,
            // so don't need to generate any code for that either.
            //lib.IgnoreHeadersWithName("FBaseString.h");

            // Don't know why we are ignoring these.   Ask Joao.
            //lib.IgnoreHeadersWithName("FBaseObject.h");
            //lib.IgnoreHeadersWithName("FOspCompat.h");
            //lib.IgnoreClassWithName("Tizen::Base::Object");
        }
Exemple #16
0
        public void Setup(Driver driver)
        {
            var parserOptions = driver.ParserOptions;
            parserOptions.TargetTriple = Triple;
            parserOptions.Abi = Abi;

            var options = driver.Options;
            options.LibraryName = "CppSharp.CppParser";
            options.SharedLibraryName = "CppSharp.CppParser.dll";
            options.GeneratorKind = Kind;
            options.Headers.AddRange(new[]
            {
                "AST.h",
                "Sources.h",
                "CppParser.h"
            });
            options.Libraries.Add("CppSharp.CppParser.lib");

            if (Abi == CppAbi.Microsoft)
                parserOptions.MicrosoftMode = true;

            if (Triple.Contains("apple"))
                SetupMacOptions(parserOptions);

            if (Triple.Contains("linux"))
                SetupLinuxOptions(parserOptions);

            var basePath = Path.Combine(GetSourceDirectory("src"), "CppParser");
            parserOptions.AddIncludeDirs(basePath);
            parserOptions.AddLibraryDirs(".");

            options.OutputDir = Path.Combine(GetSourceDirectory("src"), "CppParser",
                "Bindings", Kind.ToString());

            var extraTriple = IsGnuCpp11Abi ? "-cxx11abi" : string.Empty;

            if (Kind == GeneratorKind.CSharp)
                options.OutputDir = Path.Combine(options.OutputDir, parserOptions.TargetTriple + extraTriple);

            options.OutputNamespace = string.Empty;
            options.CheckSymbols = false;
            //options.Verbose = true;
            options.UnityBuild = true;
        }
Exemple #17
0
 public void Postprocess(Driver driver, ASTContext lib)
 {
     new ClearCommentsPass().VisitLibrary(driver.ASTContext);
     new GetCommentsFromQtDocsPass(this.docs, this.module).VisitLibrary(driver.ASTContext);
     new CaseRenamePass(
         RenameTargets.Function | RenameTargets.Method | RenameTargets.Property | RenameTargets.Delegate |
         RenameTargets.Field | RenameTargets.Variable,
         RenameCasePattern.UpperCamelCase).VisitLibrary(driver.ASTContext);
     switch (this.module)
     {
         case "Core":
             var qChar = lib.FindCompleteClass("QChar");
             qChar.FindOperator(CXXOperatorKind.ExplicitConversion)
                 .First(o => o.Parameters[0].Type.IsPrimitiveType(PrimitiveType.Char))
                 .ExplicitlyIgnore();
             qChar.FindOperator(CXXOperatorKind.Conversion)
                 .First(o => o.Parameters[0].Type.IsPrimitiveType(PrimitiveType.Int))
                 .ExplicitlyIgnore();
             break;
     }
 }
Exemple #18
0
        public static void Main(string[] args)
        {
            ParseCommandLineArgs(args);

            Console.WriteLine();
            Console.WriteLine("Parsing Mono's source code...");

            var options = new DriverOptions();

            var log = new TextDiagnosticPrinter();
            var driver = new Driver(options, log);

            Setup(driver);
            driver.Setup();

            BuildParseOptions(driver);
            if (!driver.ParseCode())
                return;

            Check(driver.ASTContext);
        }
Exemple #19
0
        public void Postprocess(Driver driver, ASTContext lib)
        {
            new ClearCommentsPass().VisitASTContext(driver.Context.ASTContext);
            var modules = this.qtInfo.LibFiles.Select(l => GetModuleNameFromLibFile(l));
            var s = System.Diagnostics.Stopwatch.StartNew();
            new GetCommentsFromQtDocsPass(this.qtInfo.Docs, modules).VisitASTContext(driver.Context.ASTContext);
            System.Console.WriteLine("Documentation done in: {0}", s.Elapsed);
            new CaseRenamePass(
                RenameTargets.Function | RenameTargets.Method | RenameTargets.Property | RenameTargets.Delegate |
                RenameTargets.Field | RenameTargets.Variable,
                RenameCasePattern.UpperCamelCase).VisitASTContext(driver.Context.ASTContext);

            var qChar = lib.FindCompleteClass("QChar");
            var op = qChar.FindOperator(CXXOperatorKind.ExplicitConversion)
                .FirstOrDefault(o => o.Parameters[0].Type.IsPrimitiveType(PrimitiveType.Char));
            if (op != null)
                op.ExplicitlyIgnore();
            op = qChar.FindOperator(CXXOperatorKind.Conversion)
                .FirstOrDefault(o => o.Parameters[0].Type.IsPrimitiveType(PrimitiveType.Int));
            if (op != null)
                op.ExplicitlyIgnore();
            // QString is type-mapped to string so we only need two methods for the conversion
            // go through the methods a second time to ignore free operators moved to the class
            var qString = lib.FindCompleteClass("QString");
            foreach (var method in qString.Methods.Where(
                m => !m.Ignore && m.OriginalName != "utf16" && m.OriginalName != "fromUtf16"))
            {
                method.ExplicitlyIgnore();
            }

            foreach (var module in driver.Options.Modules)
            {
                var prefix = Platform.IsWindows ? string.Empty : "lib";
                var extension = Platform.IsWindows ? ".dll" : Platform.IsMacOS ? ".dylib" : ".so";
                var inlinesLibraryFile = string.Format("{0}{1}{2}", prefix, module.InlinesLibraryName, extension);
                var inlinesLibraryPath = Path.Combine(driver.Options.OutputDir, Platform.IsWindows ? "release" : string.Empty, inlinesLibraryFile);
                this.wrappedModules.Add(new KeyValuePair<string, string>(module.LibraryName + ".dll", inlinesLibraryPath));
            }
        }
Exemple #20
0
        public void Setup(Driver driver)
        {
            var options = driver.Options;
            options.TargetTriple = Triple;
            options.Abi = Abi;
            options.LibraryName = "CppSharp.CppParser.dll";
            options.GeneratorKind = Kind;
            options.Headers.AddRange(new[]
            {
                "AST.h",
                "Sources.h",
                "CppParser.h"
            });
            options.Libraries.Add("CppSharp.CppParser.lib");

            if (Abi == CppAbi.Microsoft)
                options.MicrosoftMode = true;

            if (Triple.Contains("apple"))
                SetupMacOptions(options);

            if (Triple.Contains("linux"))
                SetupLinuxOptions(options);

            var basePath = Path.Combine(GetSourceDirectory("src"), "CppParser");
            options.addIncludeDirs(basePath);
            options.addLibraryDirs(".");

            options.OutputDir = Path.Combine(GetSourceDirectory("src"), "CppParser",
                "Bindings", Kind.ToString());

            if (Kind == GeneratorKind.CSharp)
                options.OutputDir = Path.Combine(options.OutputDir, options.TargetTriple);

            options.GenerateLibraryNamespace = false;
            options.CheckSymbols = false;
        }
        static void SetupAndroidNDK(Driver driver, Target target)
        {
            var options = driver.Options;
            var parserOptions = driver.ParserOptions;

            var builtinsPath = GetAndroidBuiltinIncludesFolder();
            parserOptions.AddSystemIncludeDirs(builtinsPath);

            var androidNdkRoot = GetAndroidNdkPath ();
            const int androidNdkApiLevel = 21;

            var toolchainPath = Path.Combine(androidNdkRoot, "platforms",
                "android-" + androidNdkApiLevel, "arch-" + GetArchFromTriple(target.Triple),
                "usr", "include");
            parserOptions.AddSystemIncludeDirs(toolchainPath);

            parserOptions.NoBuiltinIncludes = true;
            parserOptions.NoStandardIncludes = true;
            parserOptions.TargetTriple = target.Triple;
        }
        static void SetupXcode(Driver driver, Target target)
        {
            var parserOptions = driver.ParserOptions;

            var builtinsPath = GetXcodeBuiltinIncludesFolder();
            string includePath;

            switch (target.Platform) {
            case TargetPlatform.iOS:
                includePath = GetXcodeiOSIncludesFolder();
                break;
            case TargetPlatform.WatchOS:
                includePath = GetXcodeWatchOSIncludesFolder();
                break;
            default:
                throw new ArgumentOutOfRangeException ();
            }

            parserOptions.AddSystemIncludeDirs(builtinsPath);
            parserOptions.AddSystemIncludeDirs(includePath);

            parserOptions.NoBuiltinIncludes = true;
            parserOptions.NoStandardIncludes = true;
            parserOptions.TargetTriple = target.Triple;
        }
 static void SetupToolchainPaths(Driver driver, Target target)
 {
     switch (target.Platform) {
     case TargetPlatform.Android:
         SetupAndroidNDK(driver, target);
         break;
     case TargetPlatform.iOS:
     case TargetPlatform.WatchOS:
         SetupXcode(driver, target);
         break;
     default:
         throw new ArgumentOutOfRangeException ();
     }
 }        
        static void SetupMSVC(Driver driver, string triple)
        {
            var parserOptions = driver.ParserOptions;

            parserOptions.Abi = Parser.AST.CppAbi.Microsoft;
            parserOptions.MicrosoftMode = true;

            var systemIncludeDirs = new[]
            {
                @"C:\Program Files (x86)\Windows Kits\8.1\Include\um",
                @"C:\Program Files (x86)\Windows Kits\8.1\Include\shared"
            };

            foreach (var inc in systemIncludeDirs)
                parserOptions.AddSystemIncludeDirs(inc);

            parserOptions.AddDefines("HOST_WIN32");
        }
        static void SetupMono(Driver driver, Target target)
        {
            string targetPath;
            switch (target.Platform) {
            case TargetPlatform.Android:
                targetPath = Path.Combine (MonodroidDir, XamarinAndroid ? "build-tools/mono-runtimes/obj/Debug" : "builds");
                break;
            case TargetPlatform.WatchOS:
            case TargetPlatform.iOS:
                targetPath = Path.Combine (MaccoreDir, "builds");
                break;
            default:
                throw new ArgumentOutOfRangeException ();
            }

            if (!Directory.Exists (MonoDir)) {
                MonoDir = Path.GetFullPath (Path.Combine (targetPath, "../../mono"));
            }

            var targetBuild = Path.Combine(targetPath, target.Build);

            if (!Directory.Exists(targetBuild))
                throw new Exception(string.Format("Could not find the target build directory: {0}", targetBuild));

            var includeDirs = new[]
            {
                targetBuild,
                Path.Combine(targetBuild, "eglib", "src"),
                MonoDir,
                Path.Combine(MonoDir, "mono"),
                Path.Combine(MonoDir, "mono", "mini"),
                Path.Combine(MonoDir, "eglib", "src")
            };

            foreach (var inc in includeDirs)
                driver.ParserOptions.AddIncludeDirs(inc);

            var filesToParse = new[]
            {
                Path.Combine(MonoDir, "mono", "metadata", "metadata-cross-helpers.c"),
                Path.Combine(MonoDir, "mono", "mini", "mini-cross-helpers.c"),
            };

            foreach (var file in filesToParse)
                driver.Options.Headers.Add(file);
        }
        static void Setup(Driver driver, Target target)
        {
            var options = driver.Options;
            options.DryRun = true;
            options.LibraryName = "Mono";

            var parserOptions = driver.ParserOptions;
            parserOptions.Verbose = false;
            parserOptions.MicrosoftMode = false;
            parserOptions.AddArguments("-xc");
            parserOptions.AddArguments("-std=gnu99");
            parserOptions.AddDefines("CPPSHARP");

            foreach (var define in target.Defines)
                parserOptions.AddDefines(define);

            SetupToolchainPaths(driver, target);

            SetupMono(driver, target);
        }
        static void BuildParseOptions(Driver driver, Target target)
        {
            foreach (var header in driver.Options.Headers)
            {
                var source = driver.Project.AddFile(header);
                source.Options = driver.BuildParserOptions(source);

                if (header.Contains ("mini"))
                    continue;

                source.Options.AddDefines ("HAVE_SGEN_GC");
                source.Options.AddDefines ("HAVE_MOVING_COLLECTOR");
            }
        }
        public static void Main(string[] args)
        {
            ParseCommandLineArgs(args);

            string monodroidDir;
            if (!Directory.Exists (MonodroidDir) &&
                GetParentSubDirectoryPath ("monodroid", out monodroidDir)) {
                MonodroidDir = Path.Combine (monodroidDir);
            }

            if (Directory.Exists (MonodroidDir))
                SetupAndroidTargets();

            string maccoreDir;
            if (!Directory.Exists (MaccoreDir) &&
                GetParentSubDirectoryPath ("maccore", out maccoreDir)) {
                MaccoreDir = Path.Combine (maccoreDir);
            }

            if (Directory.Exists(MaccoreDir))
                SetupiOSTargets();

            foreach (var target in Targets)
             {
                if (Abis.Any() && !Abis.Any (target.Triple.Contains))
                    continue;
                
                Console.WriteLine();
                Console.WriteLine("Processing triple: {0}", target.Triple);

                var options = new DriverOptions();

                var log = new TextDiagnosticPrinter();
                var driver = new Driver(options, log);

                Setup(driver, target);
                driver.Setup();

                BuildParseOptions(driver, target);
                if (!driver.ParseCode())
                    return;

                Dump(driver.Context.ASTContext, driver.Context.TargetInfo, target);
            }
        }
Exemple #29
0
        public void Preprocess(Driver driver, ASTContext lib)
        {
            foreach (var unit in lib.TranslationUnits.Where(u => u.IsValid))
            {
                // HACK: work around https://github.com/mono/CppSharp/issues/677
                if (unit.FileName == "locale_classes.tcc" || unit.FileName == "locale_facets.tcc")
                {
                    unit.ExplicitlyIgnore();
                }
                else
                {
                    IgnorePrivateDeclarations(unit);
                }
            }

            // QString is type-mapped to string so we only need two methods for the conversion
            var qString = lib.FindCompleteClass("QString");
            foreach (var @class in qString.Declarations)
            {
                @class.ExplicitlyIgnore();
            }
            foreach (var method in qString.Methods.Where(m => m.OriginalName != "utf16" && m.OriginalName != "fromUtf16"))
            {
                method.ExplicitlyIgnore();
            }

            // HACK: work around https://github.com/mono/CppSharp/issues/594
            lib.FindCompleteClass("QGraphicsItem").FindEnum("Extension").Access = AccessSpecifier.Public;
            lib.FindCompleteClass("QAbstractSlider").FindEnum("SliderChange").Access = AccessSpecifier.Public;
            lib.FindCompleteClass("QAbstractItemView").FindEnum("CursorAction").Access = AccessSpecifier.Public;
            lib.FindCompleteClass("QAbstractItemView").FindEnum("State").Access = AccessSpecifier.Public;
            lib.FindCompleteClass("QAbstractItemView").FindEnum("DropIndicatorPosition").Access = AccessSpecifier.Public;
            var classesWithTypeEnums = new[]
                                       {
                                           "QGraphicsEllipseItem", "QGraphicsItemGroup", "QGraphicsLineItem",
                                           "QGraphicsPathItem", "QGraphicsPixmapItem", "QGraphicsPolygonItem",
                                           "QGraphicsProxyWidget", "QGraphicsRectItem", "QGraphicsSimpleTextItem",
                                           "QGraphicsTextItem", "QGraphicsWidget", "QGraphicsSvgItem"
                                       };
            foreach (var enumeration in from @class in classesWithTypeEnums
                                        from @enum in lib.FindCompleteClass(@class).Enums
                                        where string.IsNullOrEmpty(@enum.Name)
                                        select @enum)
            {
                enumeration.Name = "TypeEnum";
            }

            // HACK: work around https://github.com/mono/CppSharp/issues/692
            foreach (var name in new[] { "QImage", "QPixmap" })
            {
                var @class = lib.FindCompleteClass(name);
                var ctorWithArray = @class.Constructors.FirstOrDefault(
                    c => c.Parameters.Count == 1 && c.Parameters[0].Type.Desugar() is ArrayType);
                if (ctorWithArray != null)
                {
                    ctorWithArray.ExplicitlyIgnore();
                }
            }
            foreach (var name in new[] { "QGraphicsScene", "QGraphicsView" })
            {
                var @class = lib.FindCompleteClass(name);
                var drawItems = @class.Methods.FirstOrDefault(m => m.OriginalName == "drawItems");
                if (drawItems != null)
                {
                    drawItems.ExplicitlyIgnore();
                }
            }
            lib.FindCompleteClass("QAbstractPlanarVideoBuffer").ExplicitlyIgnore();
            var qAbstractVideoBuffer = lib.FindCompleteClass("QAbstractVideoBuffer");
            var mapPlanes = qAbstractVideoBuffer.Methods.FirstOrDefault(m => m.OriginalName == "mapPlanes");
            if (mapPlanes != null)
            {
                mapPlanes.ExplicitlyIgnore();
            }
        }
Exemple #30
0
 public void SetupPasses(Driver driver)
 {
     driver.Context.TranslationUnitPasses.AddPass(new CompileInlinesPass(this.qtInfo.QMake, this.qtInfo.Make));
     driver.Context.TranslationUnitPasses.AddPass(new GenerateSignalEventsPass(driver.Generator));
     driver.Context.TranslationUnitPasses.AddPass(new GenerateEventEventsPass(driver.Generator));
     driver.Context.TranslationUnitPasses.AddPass(new RemoveQObjectMembersPass());
 }