3
using System.CodeDom.Compiler;
4
using System.Collections.Generic;
7
using System.Web.Razor;
8
using System.Web.Razor.Generator;
9
using System.Web.Razor.Parser;
10
using System.Web.Razor.Parser.SyntaxTree;
11
using System.Web.WebPages;
13
namespace MonoDevelop.RazorGenerator
15
delegate void RazorCodeTransformer (
16
RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace,
17
CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod);
19
class RazorHost : RazorEngineHost
21
private readonly RazorCodeTransformer[] _transformers;
22
private readonly string _fullPath;
23
private readonly CodeDomProvider _codeDomProvider;
24
private readonly CodeGeneratorOptions _codeGeneratorOptions;
25
private string _defaultClassName;
27
public RazorHost(string fullPath, CodeDomProvider codeDomProvider = null,
28
RazorCodeTransformer[] transformers = null, CodeGeneratorOptions codeGeneratorOptions = null)
29
: base(RazorCodeLanguage.GetLanguageByExtension(".cshtml"))
33
throw new ArgumentNullException("fullPath");
35
_transformers = transformers;
37
_codeDomProvider = codeDomProvider ?? new Microsoft.CSharp.CSharpCodeProvider ();
38
base.DefaultNamespace = "ASP";
39
EnableLinePragmas = true;
41
base.GeneratedClassContext = new GeneratedClassContext(
42
executeMethodName: GeneratedClassContext.DefaultExecuteMethodName,
43
writeMethodName: GeneratedClassContext.DefaultWriteMethodName,
44
writeLiteralMethodName: GeneratedClassContext.DefaultWriteLiteralMethodName,
45
writeToMethodName: "WriteTo",
46
writeLiteralToMethodName: "WriteLiteralTo",
47
templateTypeName: typeof(HelperResult).FullName,
48
defineSectionMethodName: "DefineSection",
49
beginContextMethodName: "BeginContext",
50
endContextMethodName: "EndContext"
53
ResolveUrlMethodName = "Href"
56
_codeGeneratorOptions = codeGeneratorOptions ?? new CodeGeneratorOptions () {
57
// HACK: we use true, even though razor uses false, to work around a mono bug where it omits the
58
// line ending after "#line hidden", resulting in the unparseable "#line hiddenpublic"
59
BlankLinesBetweenMembers = true,
61
// matches Razor built-in settings
62
IndentString = String.Empty,
66
public CodeDomProvider CodeDomProvider {
67
get { return _codeDomProvider; }
70
public CodeGeneratorOptions CodeGeneratorOptions {
71
get { return _codeGeneratorOptions; }
74
public string FullPath
76
get { return _fullPath; }
79
public override string DefaultClassName
83
return _defaultClassName ?? GetClassName();
87
if (!String.Equals(value, "__CompiledTemplate", StringComparison.OrdinalIgnoreCase))
89
// By default RazorEngineHost assigns the name __CompiledTemplate. We'll ignore this assignment
90
_defaultClassName = value;
95
public Func<RazorHost,ParserBase> ParserFactory { get; set; }
97
public RazorCodeGenerator CodeGenerator { get; set; }
99
public bool EnableLinePragmas { get; set; }
101
public string GenerateCode (out CompilerErrorCollection errors)
103
errors = new CompilerErrorCollection ();
106
RazorTemplateEngine engine = new RazorTemplateEngine(this);
109
GeneratorResults results = null;
112
Stream stream = File.OpenRead(_fullPath);
113
using (var reader = new StreamReader(stream, Encoding.Default, detectEncodingFromByteOrderMarks: true))
115
results = engine.GenerateCode(reader, className: DefaultClassName, rootNamespace: DefaultNamespace, sourceFileName: _fullPath);
117
} catch (Exception e) {
118
errors.Add (new CompilerError (FullPath, 1, 1, null, e.ToString ()));
119
//Returning null signifies that generation has failed
124
foreach (RazorError error in results.ParserErrors) {
125
errors.Add (new CompilerError (FullPath, error.Location.LineIndex + 1, error.Location.CharacterIndex + 1, null, error.Message));
130
using (StringWriter writer = new StringWriter()) {
132
writer.WriteLine("#pragma warning disable 1591");
133
_codeDomProvider.GenerateCodeFromCompileUnit(results.GeneratedCode, writer, _codeGeneratorOptions);
134
writer.WriteLine("#pragma warning restore 1591");
135
return writer.ToString();
137
} catch (Exception e) {
138
errors.Add (new CompilerError (FullPath, 1, 1, null, e.ToString ()));
139
//Returning null signifies that generation has failed
144
public override void PostProcessGeneratedCode(CodeGeneratorContext context)
146
if (_transformers == null) {
149
foreach (var t in _transformers) {
150
t (this, context.CompileUnit, context.Namespace, context.GeneratedClass, context.TargetMethod);
154
public override RazorCodeGenerator DecorateCodeGenerator(RazorCodeGenerator incomingCodeGenerator)
156
var codeGenerator = CodeGenerator ?? base.DecorateCodeGenerator(incomingCodeGenerator);
157
codeGenerator.GenerateLinePragmas = EnableLinePragmas;
158
return codeGenerator;
161
public override ParserBase DecorateCodeParser(ParserBase incomingCodeParser)
163
return ParserFactory != null? ParserFactory (this) : base.DecorateCodeParser(incomingCodeParser);
166
protected virtual string GetClassName()
168
string filename = Path.GetFileNameWithoutExtension(_fullPath);
169
return ParserHelpers.SanitizeClassName(filename);
b'\\ No newline at end of file'