Example #1
0
 public void compileSourceCode(string sourceCode)
 {
     if (sourceCode.valid().isFalse())
     {
         "in CSharp_FastCompiler,compileSourceCode, provided sourceCode code was empty".error();
         this.raise_OnCompileFail();
     }
     else
     {
         if (getCachedAssemblyForCode_and_RaiseEvents(sourceCode))
         {
             return;
         }
         // we need to do make sure we include any extra references included in the code
         var astCSharp = new Ast_CSharp(sourceCode);
         astCSharp.mapCodeO2References(CompilerOptions);
         compileSourceCode(sourceCode, false);
     }
 }
Example #2
0
        ///
        /// <summary>
        /// Returns a compilable C# file from and Snippet
        ///
        /// Dev Note:this code needs to be refactored (since it is too big and complex)
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public string tryToCreateCSharpCodeWith_Class_Method_WithMethodText(string code)
        {
            if (code.empty())
            {
                return(null);
            }
            code = code.line();                 // make sure there is an empty line at the end

            try
            {
                //handle special incudes in source code
                var lines = code.fix_CRLF().lines();
                foreach (var originalLine in lines)
                {
                    var line = originalLine;
                    if (originalLine.starts("//O2Include:"))
                    {
                        var includeText  = line.subString_After("//O2Include:");
                        var file         = includeText;
                        var baseFile     = CompilerOptions.SourceCodeFile ?? PublicDI.CurrentScript;
                        var parentFolder = baseFile.parentFolder();
                        if (parentFolder.notValid())
                        {
                            "[CSharpFastCompiled] in O2Include mapping, could not get parent folder of current script".error();
                        }
                        var resolvedFile = CompileEngine.findFileOnLocalScriptFolder(file, parentFolder);
                        if (resolvedFile.fileExists())
                        {
                            var fileContents = resolvedFile.contents();
                            code = code.Replace(line, line.line().add(fileContents).line());
                        }
                        else
                        {
                            "[CSharpFastCompiled] in O2Include mapping, could not a mapping for: {0}".error(includeText);
                        }
                    }
                    ;
                }

                var snippetParser = new SnippetParser(SupportedLanguage.CSharp);

                var parsedCode = snippetParser.Parse(code);
                this.astErrors(snippetParser.errors());

                this.compilationUnit(new CompilationUnit());

                if (parsedCode is BlockStatement || parsedCode is CompilationUnit)
                {
                    Ast_CSharp astCSharp;
                    if (parsedCode is BlockStatement)
                    {
                        // map parsedCode into a new type and method
                        var blockStatement = (BlockStatement)parsedCode;

                        var csharpCode = blockStatement.ast_CSharp_CreateCompilableClass(snippetParser, code,
                                                                                         CompilerOptions, CompilerArtifacts, ExecutionOptions);

                        this.astDetails(new Ast_CSharp(csharpCode).AstDetails);
                        this.createdFromSnippet(true);
                        DebugMode.ifDebug("Ast parsing was OK");
                        this.sourceCode(csharpCode);
                        this.raise_OnAstOK();

                        return(csharpCode);
                    }


                    this.compilationUnit((CompilationUnit)parsedCode);
                    if (this.compilationUnit().Children.Count == 0)
                    {
                        return(null);
                    }

                    astCSharp = new Ast_CSharp(this.compilationUnit(), snippetParser.Specials);
                    // add the comments from the original code

                    astCSharp.mapCodeO2References(CompilerOptions);
                    this.createdFromSnippet(false);

                    // create sourceCode using Ast_CSharp & AstDetails
                    if (this.compilationUnit().Children.Count > 0)
                    {
                        // reset the astCSharp.AstDetails object
                        astCSharp.mapAstDetails();
                        // add the comments from the original code
                        astCSharp.ExtraSpecials.AddRange(snippetParser.Specials);

                        this.sourceCode(astCSharp.AstDetails.CSharpCode);

                        //once we have the created SourceCode we need to create a new AST with it
                        var tempAstDetails = new Ast_CSharp(this.sourceCode()).AstDetails;
                        //note we should try to add back the specials here (so that comments make it to the generated code
                        this.astDetails(tempAstDetails);
                        DebugMode.ifDebug("Ast parsing was OK");
                        this.raise_OnAstOK();
                        return(this.sourceCode());
                    }
                }
            }
            catch (Exception ex)
            {
                DebugMode.ifError("in createCSharpCodeWith_Class_Method_WithMethodText:{0}", ex.Message);
            }
            return(null);
        }