Exemplo n.º 1
0
        public static async Task ConvertFolderAsync(string sourcePath, string targetPath, ILogger logger)
        {
            try
            {
                var fs           = new FileSystem();
                var options      = new Dictionary <string, object>();
                var typeAnalysis = new AnalyzerImpl(fs, logger, options, DateTime.Now);
                typeAnalysis.Analyze(sourcePath);
                typeAnalysis.Finish();
                var types = new TypeReferenceTranslator(typeAnalysis.BuildTypeDictionary());

                var walker = new DirectoryWalker(fs, sourcePath, "*.py");
                await walker.EnumerateAsync(state =>
                {
                    foreach (var file in fs.GetFiles(state.DirectoryName, "*.py", SearchOption.TopDirectoryOnly))
                    {
                        var path   = fs.GetFullPath(file);
                        var xlator = new Translator(
                            state.Namespace,
                            fs.GetFileNameWithoutExtension(file),
                            fs,
                            logger);
                        var module = typeAnalysis.GetAstForFile(path);

                        var relativePath        = MakeRelative(sourcePath, path);
                        var targetFilePath      = Path.ChangeExtension(MakeAbsolute(targetPath, relativePath), ".py.cs");
                        var targetFileDirectory = Path.GetDirectoryName(targetFilePath);

                        if (!Directory.Exists(targetFileDirectory))
                        {
                            Directory.CreateDirectory(targetFileDirectory);
                        }

                        xlator.TranslateModuleStatements(
                            module.body.stmts,
                            types,
                            targetFilePath);
                    }
                });

                logger.Inform(Resources.Done);
            }
            catch (Exception ex)
            {
                logger.Error(Resources.ErrUnexpectedConversionError, ex.Message);
                logger.Inform(Resources.ConversionWasAborted);
            }
        }