private void AnalyzeCompilation(CompilationStartAnalysisContext context) { var analyzer = new AnalyzerImpl(this); context.RegisterCodeBlockAction(analyzer.AnalyzeCodeBlock); context.RegisterSemanticModelAction(analyzer.AnalyzeSemanticModel); }
private string XlatModule(string pyModule, string filename = "module.py") { var rdr = new StringReader(pyModule); var lex = new Lexer(filename, rdr); var par = new Parser(filename, lex); var stm = par.Parse().ToList(); var unt = new CodeCompileUnit(); var gen = new CodeGenerator(unt, "test", Path.GetFileNameWithoutExtension(filename)); var opt = new Dictionary <string, object> { { "quiet", true } }; var ana = new AnalyzerImpl(fs, logger, opt, DateTime.Now); var mod = new Module( "module", new SuiteStatement(stm, filename, 0, 0), filename, 0, 0); ana.LoadModule(mod); var types = new TypeReferenceTranslator(ana.BuildTypeDictionary()); var xlt = new ModuleTranslator(types, gen); xlt.Translate(stm); var pvd = new CSharpCodeProvider(); var writer = new StringWriter(); pvd.GenerateCodeFromCompileUnit(unt, writer, new CodeGeneratorOptions { }); return(writer.ToString()); }
public AnalyzerTests() { this.fs = new FakeFileSystem(); this.logger = new FakeLogger(); this.options = new Dictionary <string, object>(); this.nl = Environment.NewLine; this.an = new AnalyzerImpl(fs, logger, options, DateTime.Now); }
private void AnalyzeCompilation(CompilationStartAnalysisContext context) { if (!(context.Compilation.GetTypeByMetadataName("Xunit.FactAttribute") is { } factAttribute)) { return; } var analyzerImpl = new AnalyzerImpl(context.Compilation, factAttribute); context.RegisterSymbolAction(analyzerImpl.AnalyzeNamedType, SymbolKind.NamedType); }
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); } }
static void Main(string[] args) { var fs = new FileSystem(); var logger = new ConsoleLogger(); if (args.Length == 0) { var xlator = new Translator("", "module_name", fs, logger); xlator.Translate("-", Console.In, Console.Out); Console.Out.Flush(); return; } if (args[0].ToLower() == "-d") { // org.yinwang.pysonar.demos.Demo.DemoMain(args); return; } if (args[0].ToLower() == "-r") { #if !NOT_READY_FOR_TYPES var options = new Dictionary <string, object>(); var typeAnalysis = new AnalyzerImpl(fs, logger, options, DateTime.Now); typeAnalysis.Analyze("."); typeAnalysis.Finish(); TranslateModules(typeAnalysis); #else var startDir = args.Length == 2 ? args[1] : Directory.GetCurrentDirectory(); var walker = new DirectoryWalker(fs, startDir, "*.py"); walker.Enumerate(); #endif } else { foreach (var fileName in args) { var xlator = new Translator( "", fs.GetFileNameWithoutExtension(fileName), fs, new ConsoleLogger()); xlator.TranslateFile(fileName, fileName + ".cs"); } } }
public DataTypeFactory(AnalyzerImpl analyzer) { this.analyzer = analyzer; }
static void Main(string[] args) { var fs = new FileSystem(); var logger = new ConsoleLogger(); if (args.Length == 0) { var xlator = new Translator("", "module_name", fs, logger); xlator.Translate("-", Console.In, Console.Out); Console.Out.Flush(); return; } if (args[0].ToLower() == "-r") { var startDir = args.Length == 2 ? args[1] : Directory.GetCurrentDirectory(); var options = new Dictionary <string, object>(); #if !NOT_READY_FOR_TYPES var typeAnalysis = new AnalyzerImpl(fs, logger, options, DateTime.Now); typeAnalysis.Analyze(startDir); typeAnalysis.Finish(); var types = new TypeReferenceTranslator( typeAnalysis.BuildTypeDictionary()); //Console.WriteLine($"== Type dictionary: {types.Count}"); //foreach (var de in types.OrderBy(d => d.Key.ToString())) //{ // Console.WriteLine("{0}: {1} {2}", de.Key, de.Key.Start, de.Value); //} var walker = new DirectoryWalker(fs, startDir, "*.py"); walker.Enumerate(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); xlator.TranslateModuleStatements( module.body.stmts, types, Path.ChangeExtension(path, ".py.cs")); } }); #else var walker = new DirectoryWalker(fs, startDir, "*.py"); walker.Enumerate(walker.ProcessDirectoryFiles); #endif } else { foreach (var fileName in args) { var xlator = new Translator( "", fs.GetFileNameWithoutExtension(fileName), fs, new ConsoleLogger()); xlator.TranslateFile(fileName, fileName + ".cs"); } } }
static void Main(string[] args) { var fs = new FileSystem(); var logger = new ConsoleLogger(); if (args.Length == 0) { var xlator = new Translator("", "module_name", fs, logger); xlator.Translate("-", Console.In, Console.Out); Console.Out.Flush(); return; } if (args[0].ToLower() == "-r") { #if NOT_READY_FOR_TYPES var options = new Dictionary <string, object>(); var typeAnalysis = new AnalyzerImpl(fs, logger, options, DateTime.Now); typeAnalysis.Analyze("."); typeAnalysis.Finish(); var startDir = args.Length == 2 ? args[1] : Directory.GetCurrentDirectory(); var walker = new DirectoryWalker(fs, startDir, "*.py"); walker.Enumerate(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, new ConsoleLogger()); var module = typeAnalysis.GetAstForFile(path); var moduleBinding = typeAnalysis.ModuleTable.Values.SelectMany(s => s).FirstOrDefault(b => b.node == module); xlator.TranslateModuleStatements( module.body.stmts, moduleBinding.type.Table, Path.ChangeExtension(path, ".cs")); } }); #else var startDir = args.Length == 2 ? args[1] : Directory.GetCurrentDirectory(); var walker = new DirectoryWalker(fs, startDir, "*.py"); walker.Enumerate(walker.ProcessDirectoryFiles); #endif } else { foreach (var fileName in args) { var xlator = new Translator( "", fs.GetFileNameWithoutExtension(fileName), fs, new ConsoleLogger()); xlator.TranslateFile(fileName, fileName + ".cs"); } } }