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()))
			));
		}
예제 #3
0
        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()))
                                             ));
        }
예제 #4
0
 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);
        }
예제 #7
0
        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 ();
					}
				}
			}
		}
예제 #10
0
 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());
 }