From be2bff830e7e81a846f4e98b4b9788d2f7e3c7ab Mon Sep 17 00:00:00 2001 From: Gonzalo Paniagua Javier Date: Tue, 26 Nov 2002 02:52:25 +0000 Subject: 2002-11-26 Gonzalo Paniagua Javier * list: added/removed files. * System.Web.Compilation/AspGenerator.cs: reworked user control compilation. Provide the options as a Hashtable for use in compilation. Create the user controls in the private bin path of the domain. * System.Web.Compilation/BaseCompiler.cs: base class for the various compiler types. * System.Web.Compilation/CachingCompiler.cs: actually executes mcs and do some poor caching (it will use Cache when finished). * System.Web.Compilation/CompilationException.cs: this exception has enough information to generate a nice error page. * System.Web.Compilation/CompilationResult.cs: used in caching. * System.Web.Compilation/PageCompiler.cs: now derives from BaseCompiler * System.Web.Compilation/TemplateFactory.cs: no longer needed. * System.Web.Compilation/UserControlCompiler.cs: new class used when compiling user controls. * System.Web.Compilation/WebServiceCompiler.cs: derives from BaseCompiler. * System.Web.Mail/SmtpMail.cs: i don't wanna see that warning :-). * System.Web.UI/TemplateParser.cs: fixed BaseType. * System.Web.UI/UserControlParser.cs: helper class to compile user controls. svn path=/trunk/mcs/; revision=9191 --- mcs/class/System.Web/ChangeLog | 4 + .../System.Web.Compilation/AspGenerator.cs | 174 ++++--------- .../System.Web.Compilation/BaseCompiler.cs | 74 ++++++ .../System.Web.Compilation/CachingCompiler.cs | 156 ++++++++++++ .../System.Web/System.Web.Compilation/ChangeLog | 22 ++ .../System.Web.Compilation/CompilationException.cs | 34 +++ .../System.Web.Compilation/CompilationResult.cs | 55 +++++ .../System.Web.Compilation/PageCompiler.cs | 87 ++++++- .../System.Web.Compilation/TemplateFactory.cs | 272 --------------------- .../System.Web.Compilation/UserControlCompiler.cs | 105 ++++++++ .../System.Web.Compilation/WebServiceCompiler.cs | 64 ++++- mcs/class/System.Web/System.Web.Mail/ChangeLog | 4 + mcs/class/System.Web/System.Web.Mail/SmtpMail.cs | 2 + mcs/class/System.Web/System.Web.UI/ChangeLog | 5 + .../System.Web/System.Web.UI/TemplateParser.cs | 4 +- .../System.Web/System.Web.UI/UserControlParser.cs | 49 ++++ mcs/class/System.Web/list | 7 +- 17 files changed, 698 insertions(+), 420 deletions(-) create mode 100644 mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs create mode 100644 mcs/class/System.Web/System.Web.Compilation/CachingCompiler.cs create mode 100644 mcs/class/System.Web/System.Web.Compilation/CompilationException.cs create mode 100644 mcs/class/System.Web/System.Web.Compilation/CompilationResult.cs delete mode 100644 mcs/class/System.Web/System.Web.Compilation/TemplateFactory.cs create mode 100644 mcs/class/System.Web/System.Web.Compilation/UserControlCompiler.cs create mode 100644 mcs/class/System.Web/System.Web.UI/UserControlParser.cs diff --git a/mcs/class/System.Web/ChangeLog b/mcs/class/System.Web/ChangeLog index 67b90d91491..015e43ba022 100644 --- a/mcs/class/System.Web/ChangeLog +++ b/mcs/class/System.Web/ChangeLog @@ -1,3 +1,7 @@ +2002-11-26 Gonzalo Paniagua Javier + + * list: added/removed files. + 2002-11-20 Gonzalo Paniagua Javier * makefile.gnu: s/MONO_PATH_PREFIX/MONO_PATH/ diff --git a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs index ea8459c9ce4..b8bc9e000c3 100644 --- a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs +++ b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs @@ -271,7 +271,6 @@ class AspGenerator { private object [] parts; private ArrayListWrapper elements; - private StringBuilder buildOptions; private StringBuilder prolog; private StringBuilder declarations; private StringBuilder script; @@ -292,12 +291,14 @@ class AspGenerator private string fullPath; private static string enableSessionStateLiteral = ", System.Web.SessionState.IRequiresSessionState"; + Hashtable options; + string privateBinPath; + enum UserControlResult { OK = 0, FileNotFound = 1, - XspFailed = 2, - CompilationFailed = 3 + CompilationFailed = 2 } public AspGenerator (string pathToFile, ArrayList elements) @@ -310,6 +311,7 @@ class AspGenerator this.className = filename.Replace ('.', '_'); // Overridden by @ Page classname this.className = className.Replace ('-', '_'); this.className = className.Replace (' ', '_'); + Options ["ClassName"] = this.className; this.fullPath = Path.GetFullPath (pathToFile); /* if (IsUserControl) { @@ -322,6 +324,14 @@ class AspGenerator // //*/ this.has_form_tag = false; + AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; + privateBinPath = setup.PrivateBinPath; + if (privateBinPath == null || privateBinPath.Length == 0) + privateBinPath = "bin"; + + if (!Path.IsPathRooted (privateBinPath)) + privateBinPath = Path.Combine (setup.ApplicationBase, privateBinPath); + Init (); } @@ -350,6 +360,15 @@ class AspGenerator } } + public Hashtable Options { + get { + if (options == null) + options = new Hashtable (); + + return options; + } + } + public void AddInterface (string iface) { if (interfaces == "") { @@ -381,20 +400,18 @@ class AspGenerator constructor = new StringBuilder (); init_funcs = new StringBuilder (); epilog = new StringBuilder (); - buildOptions = new StringBuilder (); current_function = new StringBuilder (); functions = new Stack (); functions.Push (current_function); - parts = new Object [7]; - parts [0] = buildOptions; - parts [1] = prolog; - parts [2] = declarations; - parts [3] = script; - parts [4] = constructor; - parts [5] = init_funcs; - parts [6] = epilog; + parts = new Object [6]; + parts [0] = prolog; + parts [1] = declarations; + parts [2] = script; + parts [3] = constructor; + parts [4] = init_funcs; + parts [5] = epilog; prolog.Append ("namespace ASP {\n" + "\tusing System;\n" + @@ -459,6 +476,7 @@ class AspGenerator { if (att ["ClassName"] != null){ this.className = (string) att ["ClassName"]; + Options ["ClassName"] = className; } if (att ["EnableSessionState"] != null){ @@ -482,14 +500,23 @@ class AspGenerator } */ - if (att ["CompilerOptions"] != null){ - string compilerOptions = (string) att ["CompilerOptions"]; - buildOptions.AppendFormat ("//\n", compilerOptions); - } + if (att ["CompilerOptions"] != null) + Options ["CompilerOptions"] = (string) att ["CompilerOptions"]; //FIXME: add support for more attributes. } + void AddReference (string dll) + { + string references = Options ["References"] as string; + if (references == null) + references = dll; + else + references = references + " " + dll; + + Options ["References"] = references; + } + private void RegisterDirective (TagAttributes att) { string tag_prefix = (string) (att ["tagprefix"] == null ? "" : att ["tagprefix"]); @@ -503,9 +530,9 @@ class AspGenerator throw new ApplicationException ("Invalid attributes for @ Register: " + att.ToString ()); prolog.AppendFormat ("\tusing {0};\n", name_space); - string dll = "output" + Path.DirectorySeparatorChar + assembly_name + ".dll"; + string dll = privateBinPath + Path.DirectorySeparatorChar + assembly_name + ".dll"; Foundry.RegisterFoundry (tag_prefix, dll, name_space); - buildOptions.AppendFormat ("//\n", dll); + AddReference (dll); return; } @@ -532,13 +559,10 @@ class AspGenerator prolog.AppendFormat ("\tusing {0};\n", "ASP"); string dll = "output" + Path.DirectorySeparatorChar + data.assemblyName + ".dll"; Foundry.RegisterFoundry (tag_prefix, data.assemblyName, "ASP", data.className); - buildOptions.AppendFormat ("//\n", data.assemblyName); + AddReference (data.assemblyName); break; case UserControlResult.FileNotFound: throw new ApplicationException ("File '" + src + "' not found."); - case UserControlResult.XspFailed: - //TODO - throw new NotImplementedException (); case UserControlResult.CompilationFailed: //TODO: should say where the generated .cs file is for the server to //show the source and the compiler error @@ -1474,8 +1498,6 @@ class AspGenerator private void End () { - buildOptions.AppendFormat ("//\n", className); - buildOptions.Append ("\n"); classDecl = "\tpublic class " + className + " : " + parent + interfaces + " {\n"; prolog.Append ("\n" + classDecl); declarations.Append ("\t\tprivate static bool __intialized = false;\n\n"); @@ -1583,110 +1605,20 @@ class AspGenerator return data; } - string noExt = Path.GetFileNameWithoutExtension (src); - string csName = "output" + dirSeparator + "xsp_ctrl_" + noExt + ".cs"; - if (!Directory.Exists ("output")) - Directory.CreateDirectory ("output"); - - if (Xsp (src, csName) == false) { - data.result = UserControlResult.XspFailed; + string csName = Path.GetTempFileName () + ".cs"; + string dll = Path.ChangeExtension (csName, ".dll"); + UserControlCompiler compiler = new UserControlCompiler (new UserControlParser (src), csName); + Type t = compiler.GetCompiledType (); + if (t == null) { + data.result = UserControlResult.CompilationFailed; return data; } - StreamReader fileReader = new StreamReader (File.Open (csName, FileMode.Open)); - data.className = src.Replace ('.', '_'); - - StringBuilder compilerOptions = new StringBuilder ("/r:System.Web.dll /r:System.Drawing.dll "); - compilerOptions.Append ("/target:library "); - - string line; - while ((line = fileReader.ReadLine ()) != null && line != "") { - if (line.StartsWith ("// + + * AspGenerator.cs: reworked user control + compilation. Provide the options as a Hashtable for use in compilation. + Create the user controls in the private bin path of the domain. + + * BaseCompiler.cs: base class for the various compiler types. + + * CachingCompiler.cs: actually executes mcs and do some poor caching + (it will use Cache when finished). + + * CompilationException.cs: this exception has enough information to + generate a nice error page. + * CompilationResult.cs: used in caching. + + * PageCompiler.cs: now derives from BaseCompiler + + * TemplateFactory.cs: no longer needed. + + * UserControlCompiler.cs: new class used when compiling user controls. + * WebServiceCompiler.cs: derives from BaseCompiler. + 2002-11-13 Gonzalo Paniagua Javier * AspElements.cs: added ServerComment class. diff --git a/mcs/class/System.Web/System.Web.Compilation/CompilationException.cs b/mcs/class/System.Web/System.Web.Compilation/CompilationException.cs new file mode 100644 index 00000000000..43c88ab98d3 --- /dev/null +++ b/mcs/class/System.Web/System.Web.Compilation/CompilationException.cs @@ -0,0 +1,34 @@ +// +// System.Web.Compilation.CompilationException +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@ximian.com) +// +// (C) 2002 Ximian, Inc (http://www.ximian.com) +// + +using System; + +namespace System.Web.Compilation +{ + internal class CompilationException : Exception + { + CompilationResult result; + + public CompilationException (CompilationResult result) + { + this.result = result; + } + + public CompilationException (string msg, CompilationResult result) + { + this.result = result; + } + + public CompilationException (CompilationCacheItem item) + { + this.result = item.Result; + } + } +} + diff --git a/mcs/class/System.Web/System.Web.Compilation/CompilationResult.cs b/mcs/class/System.Web/System.Web.Compilation/CompilationResult.cs new file mode 100644 index 00000000000..f9770cd8e74 --- /dev/null +++ b/mcs/class/System.Web/System.Web.Compilation/CompilationResult.cs @@ -0,0 +1,55 @@ +// +// System.Web.Compilation.CompilationResult +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@ximian.com) +// +// (C) 2002 Ximian, Inc (http://www.ximian.com) +// +using System; + +namespace System.Web.Compilation +{ + internal class CompilationResult + { + int exitCode; + string output; + string outputFile; + object data; + + public CompilationResult () + { + } + + public void Reset () + { + exitCode = 0; + output = null; + } + + public int ExitCode + { + get { return exitCode; } + set { exitCode = exitCode; } + } + + public string CompilerOutput + { + get { return output; } + set { output = value; } + } + + public string OutputFile + { + get { return outputFile; } + set { outputFile = value; } + } + + public object Data + { + get { return data; } + set { data = value; } + } + } +} + diff --git a/mcs/class/System.Web/System.Web.Compilation/PageCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/PageCompiler.cs index 9fd81fefc02..c066441968f 100644 --- a/mcs/class/System.Web/System.Web.Compilation/PageCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/PageCompiler.cs @@ -7,33 +7,96 @@ // (C) 2002 Ximian, Inc (http://www.ximian.com) // using System; +using System.Collections; using System.IO; +using System.Reflection; +using System.Text; using System.Web.UI; using System.Web.Util; namespace System.Web.Compilation { - class PageCompiler + class PageCompiler : BaseCompiler { - private PageParser pageParser; + PageParser pageParser; + string sourceFile; + Hashtable options; - internal PageCompiler (PageParser pageParser) + private PageCompiler (PageParser pageParser) { this.pageParser = pageParser; } + public override Type GetCompiledType () + { + string inputFile = pageParser.InputFile; + sourceFile = GenerateSourceFile (); + + CachingCompiler compiler = new CachingCompiler (this); + CompilationResult result = new CompilationResult (); + if (compiler.Compile (result) == false) + throw new CompilationException (result); + + Assembly assembly = Assembly.LoadFrom (result.OutputFile); + Type [] types = assembly.GetTypes (); + if (types.Length != 1) + throw new CompilationException ("More than 1 Type in a page?", result); + + result.Data = types [0]; + return types [0]; + } + + public override string Key { + get { + return pageParser.InputFile; + } + } + + public override string SourceFile { + get { + return sourceFile; + } + } + + public override string CompilerOptions { + get { + if (options == null) + return base.CompilerOptions; + + StringBuilder sb = new StringBuilder (base.CompilerOptions); + string compilerOptions = options ["CompilerOptions"] as string; + if (compilerOptions != null) { + sb.Append (' '); + sb.Append (compilerOptions); + } + + string references = options ["References"] as string; + if (references == null) + return sb.ToString (); + + string [] split = references.Split (' '); + foreach (string s in split) + sb.AppendFormat (" /r:{0}", s); + + return sb.ToString (); + } + } + public static Type CompilePageType (PageParser pageParser) { - Type t = TemplateFactory.GetTypeFromSource (pageParser.InputFile, null); - if (t != null) - return t; + CompilationCacheItem item = CachingCompiler.GetCached (pageParser.InputFile); + if (item != null && item.Result != null) { + if (item.Result != null) + return item.Result.Data as Type; - string sourceFile = GenerateSourceFile (pageParser); - WebTrace.WriteLine ("Compiling {0} ({1})", sourceFile, pageParser.InputFile); - return TemplateFactory.GetTypeFromSource (pageParser.InputFile, sourceFile); + throw new CompilationException (item.Result); + } + + PageCompiler pc = new PageCompiler (pageParser); + return pc.GetCompiledType (); } - private static string GenerateSourceFile (PageParser pageParser) + string GenerateSourceFile () { string inputFile = pageParser.InputFile; @@ -41,9 +104,10 @@ namespace System.Web.Compilation AspParser parser = new AspParser (inputFile, input); parser.Parse (); AspGenerator generator = new AspGenerator (inputFile, parser.Elements); - generator.BaseType = "System.Web.UI.Page"; + generator.BaseType = pageParser.BaseType.ToString (); generator.ProcessElements (); pageParser.Text = generator.GetCode ().ReadToEnd (); + options = generator.Options; //FIXME: should get Tmp dir for this application string csName = Path.GetTempFileName () + ".cs"; @@ -55,3 +119,4 @@ namespace System.Web.Compilation } } } + diff --git a/mcs/class/System.Web/System.Web.Compilation/TemplateFactory.cs b/mcs/class/System.Web/System.Web.Compilation/TemplateFactory.cs deleted file mode 100644 index 50d10b0c58f..00000000000 --- a/mcs/class/System.Web/System.Web.Compilation/TemplateFactory.cs +++ /dev/null @@ -1,272 +0,0 @@ -// -// System.Web.Compilation.TemplateFactory -// -// Authors: -// Gonzalo Paniagua Javier (gonzalo@ximian.com) -// -// (C) 2002 Ximian, Inc (http://www.ximian.com) -// -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Text; -using System.Web.UI; -using System.Web.Util; - -//TODO: should use private bin to store dlls (when AppDomain and Assembly.Load know about it?) -namespace System.Web.Compilation -{ - class CompiledTypeData - { - string csFile; - string aspxFile; - Type type; - DateTime since; - //TODO: ArrayList fileDependencies; - - public CompiledTypeData (string aspxFile, string csFile, Type type, DateTime since) - { - this.aspxFile = aspxFile; - this.csFile = csFile; - this.type = type; - this.since = since; - - } - - public bool IsNewer (DateTime dt) - { - return (dt > since); - } - - public Type Type - { - get { return type; } - set { type = value; } - } - - public DateTime Since - { - get { return since; } - set { since = value; } - } - } - - class TemplateFactory - { - internal class PageBuilder - { - private StringBuilder cscOptions; - private string csFileName; - private string className; - public static char dirSeparator = Path.DirectorySeparatorChar; - private static Hashtable cachedData = new Hashtable (); - private static Random rnd_file = new Random (); - - private PageBuilder () - { - } - - internal PageBuilder (string fileName) - { - csFileName = fileName; - - cscOptions = new StringBuilder (); - cscOptions.Append ("/target:library "); - AddReference ("System.Data"); - AddReference ("System.Web"); - AddReference ("System.Drawing"); - } - - internal Type Build () - { - string dll; - - StreamReader st_file = new StreamReader (File.OpenRead (csFileName)); - - StringReader file_content = new StringReader (st_file.ReadToEnd ()); - st_file.Close (); - if (GetBuildOptions (file_content) == false) - return null; - - dll = rnd_file.Next () + Path.GetFileName (csFileName).Replace (".cs", ".dll"); - if (Compile (csFileName, dll) == true){ - Assembly assembly = Assembly.LoadFrom (dll); - Type type = assembly.GetType ("ASP." + className); - return type; - } - - return null; - } - - private static bool RunProcess (string exe, string arguments, string output_file, string script_file) - { - Console.WriteLine ("{0} {1}", exe, arguments); - Console.WriteLine ("Output goes to {0}", output_file); - Console.WriteLine ("Script file is {0}", script_file); - Process proc = new Process (); - - proc.StartInfo.FileName = exe; - proc.StartInfo.Arguments = arguments; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.RedirectStandardOutput = true; - proc.Start (); - string poutput = proc.StandardOutput.ReadToEnd(); - proc.WaitForExit (); - int result = proc.ExitCode; - proc.Close (); - - StreamWriter cmd_output = new StreamWriter (File.Create (output_file)); - cmd_output.Write (poutput); - cmd_output.Close (); - StreamWriter bat_output = new StreamWriter (File.Create (script_file)); - bat_output.Write (exe + " " + arguments); - bat_output.Close (); - - return (result == 0); - } - - private bool GetBuildOptions (StringReader genCode) - { - string line; - string dll; - - while ((line = genCode.ReadLine ()) != String.Empty) { - if (line.StartsWith ("// + + * SmtpMail.cs: i don't wanna see that warning :-). + 2002-04-26 Lawrence Pit * MailAttachment.cs: Implemented diff --git a/mcs/class/System.Web/System.Web.Mail/SmtpMail.cs b/mcs/class/System.Web/System.Web.Mail/SmtpMail.cs index 9884191f171..3fb1d2d8135 100644 --- a/mcs/class/System.Web/System.Web.Mail/SmtpMail.cs +++ b/mcs/class/System.Web/System.Web.Mail/SmtpMail.cs @@ -42,6 +42,7 @@ namespace System.Web.Mail throw new NotImplementedException("Mono.Mail component is work in progress"); + /* try { // TODO: possibly cache ctor info object.. Type stype = Type.GetType ("Mono.Mail.Smtp.SmtpSender"); @@ -58,6 +59,7 @@ namespace System.Web.Mail } catch (Exception) { throw new Exception ("Unable to call Mono.Mail.Smtp.SmtpSender"); } + */ } public static void Send (string from, string to, string subject, string messageText) diff --git a/mcs/class/System.Web/System.Web.UI/ChangeLog b/mcs/class/System.Web/System.Web.UI/ChangeLog index 9f9ccce876f..4fc221a013d 100644 --- a/mcs/class/System.Web/System.Web.UI/ChangeLog +++ b/mcs/class/System.Web/System.Web.UI/ChangeLog @@ -1,3 +1,8 @@ +2002-11-26 Gonzalo Paniagua Javier + + * TemplateParser.cs: fixed BaseType. + * UserControlParser.cs: helper class to compile user controls. + 2002-11-20 Gonzalo Paniagua Javier * LosFormatter.cs: added DateTime to special types. diff --git a/mcs/class/System.Web/System.Web.UI/TemplateParser.cs b/mcs/class/System.Web/System.Web.UI/TemplateParser.cs index 816fc4f201e..5a60882a1a6 100755 --- a/mcs/class/System.Web/System.Web.UI/TemplateParser.cs +++ b/mcs/class/System.Web/System.Web.UI/TemplateParser.cs @@ -16,7 +16,6 @@ namespace System.Web.UI { private string inputFile; private string text; - private Type baseType; protected abstract Type CompileIntoType (); @@ -38,8 +37,7 @@ namespace System.Web.UI internal Type BaseType { - get { return baseType; } - set { baseType = value; } + get { return DefaultBaseType; } } } } diff --git a/mcs/class/System.Web/System.Web.UI/UserControlParser.cs b/mcs/class/System.Web/System.Web.UI/UserControlParser.cs new file mode 100644 index 00000000000..b454da5c11e --- /dev/null +++ b/mcs/class/System.Web/System.Web.UI/UserControlParser.cs @@ -0,0 +1,49 @@ +// +// System.Web.UI.UserControlParser +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@ximian.com) +// +// (C) 2002 Ximian, Inc (http://www.ximian.com) +// +using System; +using System.Web; +using System.Web.Compilation; + +namespace System.Web.UI +{ + public sealed class UserControlParser : TemplateControlParser + { + internal UserControlParser (string inputFile) + { + InputFile = inputFile; + } + + public static Type GetCompiledType (string virtualPath, string inputFile, HttpContext context) + { + UserControlParser ucp = new UserControlParser (inputFile); + Type t = ucp.CompileIntoType (); + return t; + } + + protected override Type CompileIntoType () + { + return UserControlCompiler.CompileUserControlType (this); + } + + protected override Type DefaultBaseType + { + get { + return typeof (Control); + } + } + + protected override string DefaultDirectiveName + { + get { + return "control"; + } + } + } +} + diff --git a/mcs/class/System.Web/list b/mcs/class/System.Web/list index 00e9dd1524e..b79df061abe 100755 --- a/mcs/class/System.Web/list +++ b/mcs/class/System.Web/list @@ -131,6 +131,7 @@ System.Web.UI/SimpleHandlerFactory.cs System.Web.UI/TagPrefixAttribute.cs System.Web.UI/TemplateContainerAttribute.cs System.Web.UI/TemplateControlParser.cs +System.Web.UI/UserControlParser.cs System.Web.UI/ValidatorCollection.cs System.Web.UI/ValidationPropertyAttribute.cs System.Web.UI/AttributeCollection.cs @@ -353,7 +354,11 @@ System.Web.Compilation/AspElements.cs System.Web.Compilation/AspGenerator.cs System.Web.Compilation/AspParser.cs System.Web.Compilation/AspTokenizer.cs +System.Web.Compilation/BaseCompiler.cs +System.Web.Compilation/CachingCompiler.cs +System.Web.Compilation/CompilationResult.cs +System.Web.Compilation/CompilationException.cs System.Web.Compilation/PageCompiler.cs -System.Web.Compilation/TemplateFactory.cs +System.Web.Compilation/UserControlCompiler.cs System.Web.Compilation/WebServiceCompiler.cs System.Web.Handlers/TraceHandler.cs -- cgit v1.2.3