Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/System.Web/System.Web.Compilation/UserControlCompiler.cs')
-rw-r--r--mcs/class/System.Web/System.Web.Compilation/UserControlCompiler.cs115
1 files changed, 115 insertions, 0 deletions
diff --git a/mcs/class/System.Web/System.Web.Compilation/UserControlCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/UserControlCompiler.cs
new file mode 100644
index 00000000000..7f76477bc07
--- /dev/null
+++ b/mcs/class/System.Web/System.Web.Compilation/UserControlCompiler.cs
@@ -0,0 +1,115 @@
+//
+// System.Web.Compilation.UserControlCompiler
+//
+// Authors:
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)
+//
+// (C) 2002 Ximian, Inc (http://www.ximian.com)
+//
+using System;
+using System.IO;
+using System.Reflection;
+using System.Web.UI;
+using System.Web.Util;
+
+namespace System.Web.Compilation
+{
+ class UserControlCompiler : BaseCompiler
+ {
+ UserControlParser userControlParser;
+ string sourceFile;
+ string targetFile;
+
+ internal UserControlCompiler (UserControlParser userControlParser)
+ {
+ this.userControlParser = userControlParser;
+ }
+
+ public override Type GetCompiledType ()
+ {
+ string inputFile = userControlParser.InputFile;
+ sourceFile = GenerateSourceFile (userControlParser);
+
+ CachingCompiler compiler = new CachingCompiler (this);
+ CompilationResult result = new CompilationResult (sourceFile);
+ result.Options = options;
+ if (compiler.Compile (result) == false)
+ throw new CompilationException (result);
+
+ if (result.Data is Type) {
+ targetFile = result.OutputFile;
+ return (Type) result.Data;
+ }
+
+ Assembly assembly = Assembly.LoadFrom (result.OutputFile);
+ Type [] types = assembly.GetTypes ();
+ foreach (Type t in types) {
+ if (t.IsSubclassOf (typeof (UserControl))) {
+ if (result.Data != null)
+ throw new CompilationException ("More that 1 user control!!!", result);
+ result.Data = t;
+ }
+ }
+
+ return result.Data as Type;
+ }
+
+ public override string Key {
+ get {
+ return userControlParser.InputFile;
+ }
+ }
+
+ public override string SourceFile {
+ get {
+ return sourceFile;
+ }
+ }
+
+ public override string TargetFile {
+ get {
+ if (targetFile == null)
+ targetFile = Path.ChangeExtension (sourceFile, ".dll");
+
+ return targetFile;
+ }
+ }
+
+ public static Type CompileUserControlType (UserControlParser userControlParser)
+ {
+ CompilationCacheItem item = CachingCompiler.GetCached (userControlParser.InputFile);
+ if (item != null && item.Result != null) {
+ if (item.Result != null) {
+ userControlParser.Options = item.Result.Options;
+ return item.Result.Data as Type;
+ }
+
+ throw new CompilationException (item.Result);
+ }
+
+ UserControlCompiler pc = new UserControlCompiler (userControlParser);
+ return pc.GetCompiledType ();
+ }
+
+ string GenerateSourceFile (UserControlParser userControlParser)
+ {
+ string inputFile = userControlParser.InputFile;
+
+ AspGenerator generator = new AspGenerator (inputFile);
+ generator.Context = userControlParser.Context;
+ generator.BaseType = userControlParser.BaseType.ToString ();
+ generator.ProcessElements ();
+ userControlParser.Text = generator.GetCode ().ReadToEnd ();
+ options = generator.Options;
+
+ //FIXME: should get Tmp dir for this application
+ string csName = Path.GetTempFileName () + ".cs";
+ WebTrace.WriteLine ("Writing {0}", csName);
+ StreamWriter output = new StreamWriter (File.OpenWrite (csName));
+ output.Write (userControlParser.Text);
+ output.Close ();
+ return csName;
+ }
+ }
+}
+