private static object ConvertAndRunCode( EngineWrapper engine, Microsoft.CodeAnalysis.SyntaxNode csharpAstNode, string[] requiredImports = null) { var rewritten = MultiLineLambdaRewriter.RewriteMultiLineLambdas(csharpAstNode); var pythonAst = new CSharpToPythonConvert().Visit(rewritten); var convertedCode = PythonAstPrinter.PrintPythonAst(pythonAst); var extraImports = requiredImports is null ? "" : string.Join("\r\n", requiredImports.Select(i => "import " + i)); convertedCode = "import clr\r\n" + extraImports + "\r\n" + convertedCode; if (pythonAst is PyAst.SuiteStatement suiteStmt) { var pythonStatements = suiteStmt.Statements .Where(s => !(s is PyAst.FromImportStatement || s is PyAst.ImportStatement)).ToList(); // If the AST contained only a function definition, run it if (pythonStatements.Count == 1 && pythonStatements.Single() is PyAst.FunctionDefinition funcDef) { convertedCode += $"\r\n{funcDef.Name}()"; } if (pythonStatements.Count >= 1 && pythonStatements.All(s => s is PyAst.ClassDefinition)) { var lastClassDef = (PyAst.ClassDefinition)pythonStatements.Last(); convertedCode += $"\r\n{lastClassDef.Name}()"; } } var scope = engine.Engine.CreateScope(); var source = engine.Engine.CreateScriptSourceFromString(convertedCode, Microsoft.Scripting.SourceCodeKind.AutoDetect); return(source.Execute(scope)); }
public static void Example() { var engineWrapper = new EngineWrapper(); var engine = engineWrapper.Engine; var parsedAst = ParsePythonSource(engine, "clr.Reference[System.Int32](p)").Body; var result = ConvertAndRunCode(engineWrapper, "int GetInt() { return 1.0; }"); }
public static object ConvertAndRunStatements( EngineWrapper engine, string csharpCode, string[] requiredImports = null) { var wrappedCode = "object WrapperFunc(){\r\n" + csharpCode + "\r\n})"; var csharpAst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseSyntaxTree(wrappedCode).GetRoot(); return(ConvertAndRunCode(engine, csharpAst, requiredImports)); }
public static object ConvertAndRunCode(EngineWrapper engine, string csharpCode) { var csharpAst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseSyntaxTree(csharpCode).GetRoot(); return(ConvertAndRunCode(engine, csharpAst)); }
public static object ConvertAndRunExpression(EngineWrapper engine, string csharpCode) { var csharpAst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseExpression(csharpCode); return(ConvertAndRunCode(engine, csharpAst)); }