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

PageCompiler.cs « System.Web.Compilation « System.Web « class « mcs - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c066441968fb424caebb16f8db5494df89368f04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
// System.Web.Compilation.PageCompiler
//
// Authors:
//	Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (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 : BaseCompiler
	{
		PageParser pageParser;
		string sourceFile;
		Hashtable options;

		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)
		{
			CompilationCacheItem item = CachingCompiler.GetCached (pageParser.InputFile);
			if (item != null && item.Result != null) {
				if (item.Result != null)
					return item.Result.Data as Type;

				throw new CompilationException (item.Result);
			}

			PageCompiler pc = new PageCompiler (pageParser);
			return pc.GetCompiledType ();
		}

		string GenerateSourceFile ()
		{
			string inputFile = pageParser.InputFile;

			Stream input = File.OpenRead (inputFile);
			AspParser parser = new AspParser (inputFile, input);
			parser.Parse ();
			AspGenerator generator = new AspGenerator (inputFile, parser.Elements);
			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";
			WebTrace.WriteLine ("Writing {0}", csName);
			StreamWriter output = new StreamWriter (File.OpenWrite (csName));
			output.Write (pageParser.Text);
			output.Close ();
			return csName;
		}
	}
}