Beispiel #1
0
        public override System.Reflection.Assembly CompileMultiple(Hashtable scriptNamesAndCode)
        {
            bool      bUseTemporaryFiles = true;
            ArrayList files = new ArrayList();             //for easier deletion after compile

            this._compiler.Parameters.Input.Clear();

            foreach (DictionaryEntry de in scriptNamesAndCode)
            {
                string nameID = (string)de.Key;
                string code   = (string)de.Value;

                if (bUseTemporaryFiles)
                {
                    string tempName = "__boo_" + nameID + ".boo";
                    Endogine.Files.FileReadWrite.Write(tempName, code);

                    System.IO.FileInfo file = new System.IO.FileInfo(tempName);
                    files.Add(file);

                    this._compiler.Parameters.Input.Add(new FileInput(tempName));
                }
                else
                {
                    //TODO: why is this StreamReader closed???
                    StringInput inp = new StringInput(nameID, code);
                    inp.Open();
                    this._compiler.Parameters.Input.Add(inp);
                }
            }

            Boo.Lang.Compiler.CompilerContext context = this._compiler.Run();

            if (bUseTemporaryFiles)
            {
                //foreach (System.IO.FileInfo file in files)
                //	file.Delete();
            }


            //The main module name is always filename+Module in pascal case;
            //this file is actually RunBooModule!
            //Using duck-typing, we can directly invoke static methods
            //Without having to do the typical System.Reflection voodoo.

            string[] errors;
            if (context.GeneratedAssembly == null)
            {
                errors = new string[context.Errors.Count];
                string sErrors = "Boo compiler errors\r\n";                 // for "+nameID+":\r\n";
                for (int i = 0; i < context.Errors.Count; i++)
                {
                    Boo.Lang.Compiler.CompilerError err = context.Errors[i];
                    string sError = err.LexicalInfo.FileName + "(" + err.LexicalInfo.Line + "," + err.LexicalInfo.Column + ")" + "\r\n" + err.Message;

                    if (System.IO.File.Exists(err.LexicalInfo.FileName))
                    {
                        sError += "Source:\r\n";
                        System.IO.StreamReader rd = new System.IO.StreamReader(err.LexicalInfo.FileName);
                        string   sFileContents    = rd.ReadToEnd();
                        string[] sLines           = sFileContents.Split("\r\n".ToCharArray());
                        if (err.LexicalInfo.Line > 0)
                        {
                            sError += sLines[(err.LexicalInfo.Line - 1) * 2] + "\r\n";
                        }
                        sError += sLines[err.LexicalInfo.Line * 2];
                    }

                    errors[i] = sError;
                    sErrors  += sError + "\r\n";
                }
                throw new Exception(sErrors);
            }
            else
            {
                foreach (DictionaryEntry de in scriptNamesAndCode)
                {
                    string nameID = (string)de.Key;
                    this._classToAssembly[nameID] = context.GeneratedAssembly;
                }
            }
            return(context.GeneratedAssembly);
        }