public static void InjectBaseClass (RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { bool generateBaseClass = generatedClass.BaseTypes.Count == 0; bool integrateHelpers = !generateBaseClass && generatedClass.BaseTypes [0].BaseType == "object"; if (!generateBaseClass && !integrateHelpers) return; if (generateBaseClass) { var baseName = generatedClass.Name + "Base"; generatedClass.BaseTypes.Add (new CodeTypeReference (baseName)); var baseClass = new CodeTypeDeclaration (baseName) { TypeAttributes = generatedClass.TypeAttributes | System.Reflection.TypeAttributes.Abstract, }; AddComments (baseClass, false, "NOTE: this is the default generated helper class. You may choose to extract it to a separate file ", "in order to customize it or share it between multiple templates, and specify the template's base ", "class via the @inherits directive." ); generatedNamespace.Types.Add (baseClass); baseClass.Members.Add (new CodeSnippetTypeMember (baseMembersString)); baseClass.Members.Add (new CodeSnippetTypeMember (baseExecuteMethodString)); } else { generatedClass.BaseTypes [0].BaseType = "System.Object"; executeMethod.Attributes = (executeMethod.Attributes & (~MemberAttributes.AccessMask | ~MemberAttributes.Override)) | MemberAttributes.Private | MemberAttributes.Final; generatedClass.Members.Add (new CodeSnippetTypeMember (baseMembersString)); } }
public static void AddGeneratedTemplateClassAttribute (RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { string tool = "RazorTemplatePreprocessor"; Version version = typeof (PreprocessedTemplateCodeTransformers).Assembly.GetName().Version; generatedClass.CustomAttributes.Add( new CodeAttributeDeclaration(typeof(System.CodeDom.Compiler.GeneratedCodeAttribute).FullName, new CodeAttributeArgument(new CodePrimitiveExpression(tool)), new CodeAttributeArgument(new CodePrimitiveExpression(version.ToString())) )); }
public static void AddGeneratedTemplateClassAttribute(RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { string tool = "RazorTemplatePreprocessor"; Version version = typeof(PreprocessedTemplateCodeTransformers).Assembly.GetName().Version; generatedClass.CustomAttributes.Add( new CodeAttributeDeclaration(typeof(System.CodeDom.Compiler.GeneratedCodeAttribute).FullName, new CodeAttributeArgument(new CodePrimitiveExpression(tool)), new CodeAttributeArgument(new CodePrimitiveExpression(version.ToString())) )); }
public static void SimplifyHelpers(RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { foreach (var method in generatedClass.Members.OfType <CodeSnippetTypeMember> ()) { using (var writer = new System.IO.StringWriter(new System.Text.StringBuilder(method.Text.Length))) { bool foundStart = false; using (var reader = new System.IO.StringReader(method.Text)) { bool lineHidden = false; string line; while ((line = reader.ReadLine()) != null) { if (!foundStart) { if (line.StartsWith("public System.Web.WebPages.HelperResult")) { foundStart = true; } else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("#line")) { break; } } if (line.StartsWith("#line")) { lineHidden = line == "#line hidden"; } if (lineHidden && line == "});") { writer.WriteLine("};"); continue; } var len = replacements.GetLength(0); for (int i = 0; i < len; i++) { var bad = replacements[i, 0]; if (line.StartsWith(bad)) { line = replacements[i, 1] + line.Substring(bad.Length); } } writer.WriteLine(line); } } if (foundStart) { method.Text = writer.ToString(); } } } }
public static RazorHost CreateHost (string fullPath) { var transformers = new RazorCodeTransformer[] { PreprocessedTemplateCodeTransformers.AddGeneratedTemplateClassAttribute, PreprocessedTemplateCodeTransformers.SimplifyHelpers, PreprocessedTemplateCodeTransformers.InjectBaseClass, PreprocessedTemplateCodeTransformers.MakePartialAndRemoveCtor, }; var host = new RazorHost (fullPath, transformers: transformers) { DefaultBaseClass = "", }; foreach (var import in defaultImports) { host.NamespaceImports.Add (import); } host.ParserFactory = (h) => new PreprocessedCSharpRazorCodeParser (); return host; }
public static RazorHost Create(string fullPath) { var transformers = new RazorCodeTransformer[] { PreprocessedTemplateCodeTransformers.AddGeneratedTemplateClassAttribute, PreprocessedTemplateCodeTransformers.SimplifyHelpers, PreprocessedTemplateCodeTransformers.InjectBaseClass, PreprocessedTemplateCodeTransformers.MakePartialAndRemoveCtor, }; var host = new RazorHost(fullPath, transformers: transformers) { DefaultBaseClass = "", EnableLinePragmas = true, }; foreach (var import in defaultImports) { host.NamespaceImports.Add(import); } host.ParserFactory = (h) => new PreprocessedCSharpRazorCodeParser(); return(host); }
public static void InjectBaseClass(RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { bool generateBaseClass = generatedClass.BaseTypes.Count == 0; bool integrateHelpers = !generateBaseClass && generatedClass.BaseTypes [0].BaseType == "object"; if (!generateBaseClass && !integrateHelpers) { return; } if (generateBaseClass) { var baseName = generatedClass.Name + "Base"; generatedClass.BaseTypes.Add(new CodeTypeReference(baseName)); var baseClass = new CodeTypeDeclaration(baseName) { TypeAttributes = generatedClass.TypeAttributes | System.Reflection.TypeAttributes.Abstract, }; AddComments(baseClass, false, "NOTE: this is the default generated helper class. You may choose to extract it to a separate file ", "in order to customize it or share it between multiple templates, and specify the template's base ", "class via the @inherits directive." ); generatedNamespace.Types.Add(baseClass); baseClass.Members.Add(new CodeSnippetTypeMember(baseMembersString)); baseClass.Members.Add(new CodeSnippetTypeMember(baseExecuteMethodString)); } else { generatedClass.BaseTypes [0].BaseType = "System.Object"; executeMethod.Attributes = (executeMethod.Attributes & (~MemberAttributes.AccessMask | ~MemberAttributes.Override)) | MemberAttributes.Private | MemberAttributes.Final; generatedClass.Members.Add(new CodeSnippetTypeMember(baseMembersString)); } }
public static void MakePartialAndRemoveCtor (RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { generatedClass.IsPartial = true; // The generated class has a constructor in there by default. generatedClass.Members.Remove (generatedClass.Members.OfType<CodeConstructor> ().Single ()); }
public static void SimplifyHelpers (RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { foreach (var method in generatedClass.Members.OfType<CodeSnippetTypeMember> ()) { using (var writer = new System.IO.StringWriter (new System.Text.StringBuilder (method.Text.Length))) { bool foundStart = false; using (var reader = new System.IO.StringReader (method.Text)) { bool lineHidden = false; string line; while ((line = reader.ReadLine ()) != null) { if (!foundStart) { if (line.StartsWith ("public System.Web.WebPages.HelperResult")) { foundStart = true; } else if (!string.IsNullOrWhiteSpace (line) && !line.StartsWith ("#line")) { break; } } if (line.StartsWith ("#line")) { lineHidden = line == "#line hidden"; } if (lineHidden && line == "});") { writer.WriteLine ("};"); continue; } var len = replacements.GetLength (0); for (int i = 0; i < len; i++) { var bad = replacements[i,0]; if (line.StartsWith (bad)) { line = replacements[i,1] + line.Substring (bad.Length); } } writer.WriteLine (line); } } if (foundStart) { method.Text = writer.ToString (); } } } }
public static void MakePartialAndRemoveCtor(RazorHost host, CodeCompileUnit codeCompileUnit, CodeNamespace generatedNamespace, CodeTypeDeclaration generatedClass, CodeMemberMethod executeMethod) { generatedClass.IsPartial = true; // The generated class has a constructor in there by default. generatedClass.Members.Remove(generatedClass.Members.OfType <CodeConstructor> ().Single()); }