Example #1
0
        string getCSharpCode(string cshtmlFilePath, string rootNamespace)
        {
            var basePath            = Path.GetDirectoryName(cshtmlFilePath);
            var fileName            = Path.GetFileName(cshtmlFilePath);
            var fileNameNoExtension = Path.GetFileNameWithoutExtension(fileName);
            var codeLang            = new CSharpRazorCodeLanguage();
            var host = new RazorEngineHost(codeLang);

            host.DefaultBaseClass      = "TchApp.Razor.TchRazorPage";
            host.GeneratedClassContext = new GeneratedClassContext(
                executeMethodName: GeneratedClassContext.DefaultExecuteMethodName,
                writeMethodName: GeneratedClassContext.DefaultWriteMethodName,
                writeLiteralMethodName: GeneratedClassContext.DefaultWriteLiteralMethodName,
                writeToMethodName: "WriteTo",
                writeLiteralToMethodName: "WriteLiteralTo",
                templateTypeName: "HelperResult",
                defineSectionMethodName: "DefineSection",
                generatedTagHelperContext: new GeneratedTagHelperContext());
            var engine = new RazorTemplateEngine(host);

            var cshtmlContent = File.ReadAllText(cshtmlFilePath);

            var generatorResults = engine.GenerateCode(
                input: new StringReader(cshtmlContent),
                className: fileNameNoExtension,
                rootNamespace: Path.GetFileName(rootNamespace),
                sourceFileName: fileName);

            var generatedCode = generatorResults.GeneratedCode;

            return(generatedCode);
        }
Example #2
0
        public static ParsedTemplate parse(string sourceFilename, string cshtmlContent, string effectiveTemplateClassName, Type modelType)
        {
            var csCodeLanguage = new CSharpRazorCodeLanguage();
            var templateHost   = new RazorEngineHost(csCodeLanguage, () => new HtmlMarkupParser());

            var concreteBaseClassType = getBaseClassTypeFromModel(modelType);

            templateHost.DefaultBaseClass = concreteBaseClassType.FullName;

            var templateEngine = new RazorTemplateEngine(templateHost);

            var trimmedcshtmlContent = HeaderLines.trim(cshtmlContent);

            GeneratorResults res;

            using (var input = new StringReader(trimmedcshtmlContent))
            {
                res = templateEngine.GenerateCode(input, effectiveTemplateClassName, GeneratedTemplateNamespace, sourceFilename);
            }

            if (!res.Success)
            {
                throw new Exception("Failed to generate code");
            }

            var compileUnit             = res.GeneratedCode;
            var fullyQualifiedClassName = GeneratedTemplateNamespace + "." + effectiveTemplateClassName;

            return(new ParsedTemplate(fullyQualifiedClassName, compileUnit));
        }
        public void CodeDomProviderTypeReturnsVBCodeProvider() {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Assert
            Assert.AreEqual(typeof(CSharpCodeProvider), service.CodeDomProviderType);
        }
Example #4
0
        public PreprocessResult PreprocessRazorTemplate(string content, string className, string classNamespace)
        {
            var language  = new CSharpRazorCodeLanguage();
            var razorHost = new RazorEngineHost(language)
            {
                DefaultBaseClass      = typeof(TemplateBase).FullName,
                DefaultNamespace      = classNamespace,
                DefaultClassName      = className,
                GeneratedClassContext = new GeneratedClassContext(
                    nameof(TemplateBase.ExecuteAsync),
                    nameof(TemplateBase.Write),
                    nameof(TemplateBase.WriteLiteral),
                    new GeneratedTagHelperContext())
            };

            razorHost.NamespaceImports.Add(classNamespace);

            var razorEngine      = new RazorTemplateEngine(razorHost);
            var generatorResults = razorEngine.GenerateCode(new StringReader(content));

            if (!generatorResults.Success)
            {
                throw new Exception(string.Join(Environment.NewLine, generatorResults.ParserErrors.Select(x => x.Message)));
            }

            var preprocessResult = new PreprocessResult()
            {
                PreprocessedContent = generatorResults.GeneratedCode,
                References          = _host.StandardImports.ToList(),
            };

            return(preprocessResult);
        }
        private static object Compile(string code, string name)
        {
            var cacheKey           = (name ?? DynamicallyGeneratedClassName) + GetHash(code);
            var generatedClassName = name != null?name.Strip(c => !c.IsLetter() && !Char.IsDigit(c)) : DynamicallyGeneratedClassName;

            Assembly assembly;

            if (_cache.TryGetValue(cacheKey, out assembly))
            {
                return(assembly.CreateInstance(NamespaceForDynamicClasses + "." + generatedClassName));
            }

            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language)
            {
                DefaultBaseClass = "RazorTemplateBase<dynamic>",
                DefaultClassName = generatedClassName,
                DefaultNamespace = NamespaceForDynamicClasses
            };

            foreach (var n in DefaultNamespaces)
            {
                host.NamespaceImports.Add(n);
            }

            var engine        = new RazorTemplateEngine(host);
            var razorTemplate = engine.GenerateCode(new StringReader(code));

            assembly = CreateCompiledAssemblyFor(razorTemplate.GeneratedCode, name);
            _cache.TryAdd(cacheKey, assembly);

            return(assembly.CreateInstance(NamespaceForDynamicClasses + "." + generatedClassName));
        }
        public void CodeTreeWithUsings()
        {
            var syntaxTreeNode = new Mock<Span>(new SpanBuilder());
            var language = new CSharpRazorCodeLanguage();
            var host = new CodeGenTestHost(language);
            var codeBuilderContext = new CodeBuilderContext(
                host,
                "TestClass",
                "TestNamespace",
                "Foo.cs",
                shouldGenerateLinePragmas: false,
                errorSink: new ErrorSink());
            codeBuilderContext.CodeTreeBuilder.AddUsingChunk("FakeNamespace1", syntaxTreeNode.Object);
            codeBuilderContext.CodeTreeBuilder.AddUsingChunk("FakeNamespace2.SubNamespace", syntaxTreeNode.Object);
            var codeBuilder = new CodeGenTestCodeBuilder(codeBuilderContext);

            // Act
            var result = codeBuilder.Build();

            BaselineWriter.WriteBaseline(
                @"test\Microsoft.AspNet.Razor.Test\TestFiles\CodeGenerator\CS\Output\CSharpCodeBuilder.cs",
                result.Code);

            var expectedOutput = TestFile.Create("TestFiles/CodeGenerator/CS/Output/CSharpCodeBuilder.cs").ReadAllText();

            // Assert
            Assert.Equal(expectedOutput, result.Code);
        }
Example #7
0
        public void CodeTreeWithUsings()
        {
            var syntaxTreeNode     = new Mock <Span>(new SpanBuilder());
            var language           = new CSharpRazorCodeLanguage();
            var host               = new RazorEngineHost(language);
            var codeBuilderContext = new CodeBuilderContext(
                host,
                "TestClass",
                "TestNamespace",
                "Foo.cs",
                shouldGenerateLinePragmas: false);

            codeBuilderContext.CodeTreeBuilder.AddUsingChunk("FakeNamespace1", syntaxTreeNode.Object);
            codeBuilderContext.CodeTreeBuilder.AddUsingChunk("FakeNamespace2.SubNamespace", syntaxTreeNode.Object);
            var codeBuilder = language.CreateCodeBuilder(codeBuilderContext);

            // Act
            var result = codeBuilder.Build();

            BaselineWriter.WriteBaseline(
                @"test\Microsoft.AspNet.Razor.Test\TestFiles\CodeGenerator\CS\Output\CSharpCodeBuilder.cs",
                result.Code);

            var expectedOutput = TestFile.Create("TestFiles/CodeGenerator/CS/Output/CSharpCodeBuilder.cs").ReadAllText();

            // Assert
            Assert.Equal(expectedOutput, result.Code);
        }
        private static GeneratorResults GenerateCode <TModel>(string classFullName, string template, IEnumerable <string> additionalNamespaceImports)
        {
            var    lastIndexOf    = classFullName.LastIndexOf('.');
            string classNamespace = classFullName.Substring(0, lastIndexOf);
            string className      = classFullName.Substring(lastIndexOf + 1);

            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language)
            {
                DefaultBaseClass = typeof(RazorGeneratorBase <TModel>).FullName,
                DefaultClassName = className,
                DefaultNamespace = classNamespace,
            };

            host.NamespaceImports.Add("System");
            host.NamespaceImports.Add("System.Dynamic");
            host.NamespaceImports.Add("System.Text");
            host.NamespaceImports.Add("System.Linq");
            host.NamespaceImports.Add(typeof(TModel).Namespace ?? throw new InvalidOperationException());
            if (additionalNamespaceImports != null)
            {
                foreach (var additionalNamespaceImport in additionalNamespaceImports)
                {
                    host.NamespaceImports.Add(additionalNamespaceImport);
                }
            }
            var engine = new RazorTemplateEngine(host);

            var tr = new StringReader(template); // here is where the string come in place
            GeneratorResults razorTemplate = engine.GenerateCode(tr);

            return(razorTemplate);
        }
Example #9
0
        private Type GenerateTemplateTypes <T>(string templateName)
        {
            var source = ContentReader.ReadTemplate(templateName);

            var className = templateName.Replace(".", "_");

            // determine language, pass into generateAssembly
            RazorCodeLanguage codeLanguage;

            switch (templateName.Substring(templateName.LastIndexOf(".")))
            {
            case ".cshtml":
                codeLanguage = new CSharpRazorCodeLanguage();
                break;

            case ".vbhtml":
                codeLanguage = new VBRazorCodeLanguage();
                break;

            default:
                throw new ApplicationException("Unsupported Template language. Either .cshtml or .vbhtml");
            }

            var razorEngine = CreateRazorEngine <T>(codeLanguage);

            var assembly = GenerateAssembly <T>(razorEngine, className, source);

            return(assembly.GetType(NamespaceName + "." + className, true, false));
        }
        public void CodeDomProviderTypeReturnsVBCodeProvider()
        {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Assert
            Assert.Equal(typeof(CSharpCodeProvider), service.CodeDomProviderType);
        }
Example #11
0
        private static RazorTemplateEngine CreateRazorTemplateEngine()
        {
            var language = new CSharpRazorCodeLanguage();
            var host     = new SimpleRazorEngineHost(language);
            var engine   = new RazorTemplateEngine(host);

            return(engine);
        }
Example #12
0
        /// <summary>
        /// Generates code for a razor template in the specified namespace.
        /// </summary>
        /// <param name="cshtmlFilePath">Full path to razor template.</param>
        /// <param name="rootNamespace">Root namespace for razor-generated class.</param>
        private void GenerateCodeFile(string cshtmlFilePath, string rootNamespace)
        {
            var basePath            = Path.GetDirectoryName(cshtmlFilePath);
            var fileName            = Path.GetFileName(cshtmlFilePath);
            var fileNameNoExtension = Path.GetFileNameWithoutExtension(fileName);
            var codeLang            = new CSharpRazorCodeLanguage();
            var host = new RazorEngineHost(codeLang);

            host.GeneratedClassContext = new GeneratedClassContext(
                executeMethodName: GeneratedClassContext.DefaultExecuteMethodName,
                writeMethodName: GeneratedClassContext.DefaultWriteMethodName,
                writeLiteralMethodName: GeneratedClassContext.DefaultWriteLiteralMethodName,
                writeToMethodName: "WriteTo",
                writeLiteralToMethodName: "WriteLiteralTo",
                templateTypeName: "HelperResult",
                defineSectionMethodName: "DefineSection",
                generatedTagHelperContext: new GeneratedTagHelperContext());
            var engine = new RazorTemplateEngine(host);

            using (var fileStream = File.OpenText(cshtmlFilePath))
            {
                var code = engine.GenerateCode(
                    input: fileStream,
                    className: fileNameNoExtension,
                    rootNamespace: rootNamespace,
                    sourceFileName: fileName);

                var source = code.GeneratedCode;
                source = CopyrightHeader + "\r\n\r\n" + source;
                var startIndex = 0;
                while (startIndex < source.Length)
                {
                    var startMatch = @"<%$ include: ";
                    var endMatch   = @" %>";
                    startIndex = source.IndexOf(startMatch, startIndex);
                    if (startIndex == -1)
                    {
                        break;
                    }
                    var endIndex = source.IndexOf(endMatch, startIndex);
                    if (endIndex == -1)
                    {
                        break;
                    }
                    var includeFileName = source.Substring(startIndex + startMatch.Length,
                                                           endIndex - (startIndex + startMatch.Length));
                    Console.WriteLine("    Inlining file {0}", includeFileName);
                    var replacement =
                        File.ReadAllText(Path.Combine(basePath, includeFileName))
                        .Replace("\"", "\\\"")
                        .Replace("\r\n", "\\r\\n");
                    source = source.Substring(0, startIndex) + replacement +
                             source.Substring(endIndex + endMatch.Length);
                    startIndex = startIndex + replacement.Length;
                }
                File.WriteAllText(Path.Combine(basePath, string.Format("{0}.cs", fileNameNoExtension)), source);
            }
        }
        public void CreateCodeParserReturnsNewCSharpCodeParser() {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Act
            ParserBase parser = service.CreateCodeParser();

            // Assert
            Assert.IsNotNull(parser);
            Assert.IsInstanceOfType(parser, typeof(CSharpCodeParser));
        }
        public void ConstructorWithCodeLanguageSetsPropertiesAppropriately() {
            // Arrange
            RazorCodeLanguage language = new CSharpRazorCodeLanguage();
            
            // Act
            RazorEngineHost host = new RazorEngineHost(language);

            // Assert
            VerifyCommonDefaults(host);
            Assert.AreSame(language, host.CodeLanguage);
            Assert.IsInstanceOfType(host.CreateMarkupParser(), typeof(HtmlMarkupParser));
        }
        public void CreateCodeParserReturnsNewCSharpCodeParser()
        {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Act
            ParserBase parser = service.CreateCodeParser();

            // Assert
            Assert.NotNull(parser);
            Assert.IsType<CSharpCodeParser>(parser);
        }
        public void CreateCodeParserReturnsNewCSharpCodeParser()
        {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Act
            ParserBase parser = service.CreateCodeParser();

            // Assert
            Assert.IsNotNull(parser);
            Assert.IsInstanceOfType(parser, typeof(CSharpCodeParser));
        }
        public void CreateCodeParserReturnsNewCSharpCodeParser()
        {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Act
            ParserBase parser = service.CreateCodeParser();

            // Assert
            Assert.NotNull(parser);
            Assert.IsType <CSharpCodeParser>(parser);
        }
Example #18
0
        public void ConstructorWithCodeLanguageSetsPropertiesAppropriately()
        {
            // Arrange
            var language = new CSharpRazorCodeLanguage();

            // Act
            var host = new RazorEngineHost(language);

            // Assert
            VerifyCommonDefaults(host);
            Assert.Same(language, host.CodeLanguage);
            Assert.IsType <HtmlMarkupParser>(host.CreateMarkupParser());
        }
Example #19
0
        public void ConstructorWithCodeLanguageSetsPropertiesAppropriately()
        {
            // Arrange
            var language = new CSharpRazorCodeLanguage();

            // Act
            var host = new RazorEngineHost(language);

            // Assert
            VerifyCommonDefaults(host);
            Assert.Same(language, host.CodeLanguage);
            Assert.IsType<HtmlMarkupParser>(host.CreateMarkupParser());
        }
Example #20
0
        public void ConstructorWithCodeLanguageSetsPropertiesAppropriately()
        {
            // Arrange
            RazorCodeLanguage language = new CSharpRazorCodeLanguage();

            // Act
            RazorEngineHost host = new RazorEngineHost(language);

            // Assert
            VerifyCommonDefaults(host);
            Assert.AreSame(language, host.CodeLanguage);
            Assert.IsInstanceOfType(host.CreateMarkupParser(), typeof(HtmlMarkupParser));
        }
        public void ConstructorWithCodeLanguageAndMarkupParserSetsPropertiesAppropriately() {
            // Arrange
            RazorCodeLanguage language = new CSharpRazorCodeLanguage();
            MarkupParser expected = new HtmlMarkupParser();

            // Act
            RazorEngineHost host = new RazorEngineHost(language, () => expected);

            // Assert
            VerifyCommonDefaults(host);
            Assert.AreSame(language, host.CodeLanguage);
            Assert.AreSame(expected, host.CreateMarkupParser());
        }
Example #22
0
        public void ConstructorWithCodeLanguageAndMarkupParserSetsPropertiesAppropriately()
        {
            // Arrange
            RazorCodeLanguage language = new CSharpRazorCodeLanguage();
            ParserBase        expected = new HtmlMarkupParser();

            // Act
            RazorEngineHost host = new RazorEngineHost(language, () => expected);

            // Assert
            VerifyCommonDefaults(host);
            Assert.Same(language, host.CodeLanguage);
            Assert.Same(expected, host.CreateMarkupParser());
        }
Example #23
0
        static void Run()
        {
            // ホスト作成
            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language)
            {
                DefaultBaseClass = nameof(Legacy) + "." + nameof(LegacyTemplateBase),
                DefaultClassName = "Generated",
                DefaultNamespace = "RazorTemplate",
                // 生成されるメソッド名の指定(これはデフォルトと同じものを指定している)
                GeneratedClassContext = new GeneratedClassContext(
                    nameof(LegacyTemplateBase.Execute),
                    nameof(LegacyTemplateBase.Write),
                    nameof(LegacyTemplateBase.WriteLiteral)
                    )
            };

            // デフォルトで挿入する名前空間を追加
            host.NamespaceImports.Add(nameof(System));

            var engine = new RazorTemplateEngine(host);

            using (var reader = new StreamReader(File.OpenRead("../../../Page.cshtml")))
            {
                // コードDOM生成
                var generatorResults = engine.GenerateCode(reader);
                System.CodeDom.CodeCompileUnit unit = generatorResults.GeneratedCode;
                var provider = new CSharpCodeProvider();

                // 表示用
                provider.GenerateCodeFromCompileUnit(unit, Console.Out, new CodeGeneratorOptions());
                Console.WriteLine("------------------------------------------------------------------------");

                // 使用アセンブリ参照
                var parameters = new CompilerParameters();
                parameters.ReferencedAssemblies.Add("System.Core.dll");
                parameters.ReferencedAssemblies.Add(typeof(LegacyTemplateBase).Assembly.Location);

                // コンパイル
                var compilerResults = provider.CompileAssemblyFromDom(parameters, unit);

                // 実行
                var typeName        = host.DefaultNamespace + "." + host.DefaultClassName;
                var instance        = compilerResults.CompiledAssembly.CreateInstance(typeName) as LegacyTemplateBase;
                var generatedString = instance.Generate();

                // 結果表示
                Console.Write(generatedString);
            }
        }
Example #24
0
        public void ChunkTreeWithUsings()
        {
            var syntaxTreeNode       = new Mock <Span>(new SpanBuilder());
            var language             = new CSharpRazorCodeLanguage();
            var host                 = new CodeGenTestHost(language);
            var codeGeneratorContext = new CodeGeneratorContext(
                host,
                "TestClass",
                "TestNamespace",
                "Foo.cs",
                shouldGenerateLinePragmas: false,
                errorSink: new ErrorSink());

            codeGeneratorContext.ChunkTreeBuilder.AddUsingChunk("FakeNamespace1", syntaxTreeNode.Object);
            codeGeneratorContext.ChunkTreeBuilder.AddUsingChunk("FakeNamespace2.SubNamespace", syntaxTreeNode.Object);
            var codeGenerator = new CodeGenTestCodeGenerator(codeGeneratorContext);
            var testFile      = TestFile.Create("TestFiles/CodeGenerator/Output/CSharpCodeGenerator.cs");

            string expectedOutput;

#if GENERATE_BASELINES
            if (testFile.Exists())
            {
                expectedOutput = testFile.ReadAllText();
            }
            else
            {
                expectedOutput = null;
            }
#else
            expectedOutput = testFile.ReadAllText();
#endif

            // Act
            var result = codeGenerator.Generate();

            // Assert
#if GENERATE_BASELINES
            // Update baseline files if files do not already match.
            if (!string.Equals(expectedOutput, result.Code, StringComparison.Ordinal))
            {
                BaselineWriter.WriteBaseline(
                    @"test\Microsoft.AspNet.Razor.Test\TestFiles\CodeGenerator\Output\CSharpCodeGenerator.cs",
                    result.Code);
            }
#else
            Assert.Equal(expectedOutput, result.Code);
#endif
        }
        private static void GenerateCodeFile(string cshtmlFilePath, string targetPath, string rootNamespace, string defaultBaseClass)
        {
            var basePath      = Path.GetDirectoryName(cshtmlFilePath);
            var fileName      = Path.GetFileName(cshtmlFilePath);
            var cleanFileName = CleanFileName(Path.GetFileNameWithoutExtension(fileName));
            var codeLang      = new CSharpRazorCodeLanguage();
            var host          = new RazorEngineHost(codeLang);

            host.GeneratedClassContext = new GeneratedClassContext(
                executeMethodName: GeneratedClassContext.DefaultExecuteMethodName,
                writeMethodName: GeneratedClassContext.DefaultWriteMethodName,
                writeLiteralMethodName: GeneratedClassContext.DefaultWriteLiteralMethodName,
                writeToMethodName: "WriteTo",
                writeLiteralToMethodName: "WriteLiteralTo",
                templateTypeName: "HelperResult",
                generatedTagHelperContext: new GeneratedTagHelperContext());

            var engine = new RazorTemplateEngine(host);

            var source = File.ReadAllText(cshtmlFilePath);

            var modelType = GetModelType(source);

            if (!string.IsNullOrEmpty(modelType))
            {
                host.DefaultBaseClass = $"{defaultBaseClass}<{modelType}>"; // BaseClass<T>
            }
            else
            {
                host.DefaultBaseClass = defaultBaseClass;
            }

            source = RemoveAnnotations(source, rootNamespace);
            source = RemoveExtraWhitespace(source);

            using (var fileStream = File.OpenText(cshtmlFilePath))
            {
                var code = engine.GenerateCode(
                    input: new StringReader(source),
                    className: cleanFileName,
                    rootNamespace: rootNamespace,
                    sourceFileName: fileName);

                var output = code.GeneratedCode;
                output = InlineIncludedFiles(basePath, output);
                File.WriteAllText(Path.Combine(targetPath, string.Format($"{cleanFileName}.cs")), output);
            }
        }
        private object Compile(string code, string name, Type modelType, IDictionary <string, object> parameters)
        {
            var cacheKey           = (name ?? DynamicallyGeneratedClassName) + GetHash(code);
            var generatedClassName = name != null?name.Strip(c => !c.IsLetter() && !Char.IsDigit(c)) : DynamicallyGeneratedClassName;

            var assembly = _cache.Get(cacheKey, ctx => {
                _signals.When(ForceRecompile);

                var modelTypeName = "dynamic";
                var reader        = new StringReader(code);
                var builder       = new StringBuilder();

                // A hack to remove any @model directive as it's MVC-specific and compiler does not recognize it.
                // We should use this information to compile a strongly-typed template in the future
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    var trimmedLine = line.TrimStart(' ', '\t', '\n', '\r');
                    if (trimmedLine.StartsWith("@model "))
                    {
                        modelTypeName = trimmedLine.Substring("@model ".Length).Trim();
                        continue;
                    }

                    builder.AppendLine(line);
                }

                var language = new CSharpRazorCodeLanguage();
                var host     = new RazorEngineHost(language)
                {
                    DefaultBaseClass = "RazorTemplateBase<" + modelTypeName + ">",
                    DefaultClassName = generatedClassName,
                    DefaultNamespace = NamespaceForDynamicClasses
                };

                foreach (var n in DefaultNamespaces)
                {
                    host.NamespaceImports.Add(n);
                }

                var engine           = new RazorTemplateEngine(host);
                var razorTemplate    = engine.GenerateCode(new StringReader(builder.ToString()));
                var compiledAssembly = CreateCompiledAssemblyFor(razorTemplate.GeneratedCode, name);
                return(compiledAssembly);
            });

            return(assembly.CreateInstance(NamespaceForDynamicClasses + "." + generatedClassName));
        }
Example #27
0
        private GeneratorResults GenerateCode()
        {
            var codeLang = new CSharpRazorCodeLanguage();

            var host = new RazorEngineHost(codeLang)
            {
                DefaultBaseClass = "Thriot.Framework.Mails.TemplatingEngine.BaseView",
                DefaultClassName = "Template",
                DefaultNamespace = "CompiledRazor",
                NamespaceImports = { "System" }
            };

            var engine = new RazorTemplateEngine(host);

            return(engine.GenerateCode(new StringReader(_template)));
        }
        public void CreateCodeGeneratorParserListenerReturnsNewCSharpCodeGeneratorParserListener() {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Act
            RazorEngineHost host = new RazorEngineHost(service);
            RazorCodeGenerator generator = service.CreateCodeGenerator("Foo", "Bar", "Baz", host);

            // Assert
            Assert.IsNotNull(generator);
            Assert.IsInstanceOfType(generator, typeof(CSharpRazorCodeGenerator));
            Assert.AreEqual("Foo", generator.ClassName);
            Assert.AreEqual("Bar", generator.RootNamespaceName);
            Assert.AreEqual("Baz", generator.SourceFileName);
            Assert.AreSame(host, generator.Host);
        }
Example #29
0
        public LoveSyntaxTree Parse(TextReader source)
        {
            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language)
            {
            };
            var parser  = new RazorTemplateEngine(host);
            var results = parser.ParseTemplate(source);

            //var debugText = RazorDebugView.ToDebug(results);

            var tree     = VisitTree(results);
            var treeText = tree.ToString();

            return(tree);
        }
        public void ChunkTreeWithUsings()
        {
            var syntaxTreeNode = new Mock<Span>(new SpanBuilder());
            var language = new CSharpRazorCodeLanguage();
            var host = new CodeGenTestHost(language);
            var codeGeneratorContext = new CodeGeneratorContext(
                host,
                "TestClass",
                "TestNamespace",
                "Foo.cs",
                shouldGenerateLinePragmas: false,
                errorSink: new ErrorSink());
            codeGeneratorContext.ChunkTreeBuilder.AddUsingChunk("FakeNamespace1", syntaxTreeNode.Object);
            codeGeneratorContext.ChunkTreeBuilder.AddUsingChunk("FakeNamespace2.SubNamespace", syntaxTreeNode.Object);
            var codeGenerator = new CodeGenTestCodeGenerator(codeGeneratorContext);
            var testFile = TestFile.Create("TestFiles/CodeGenerator/Output/CSharpCodeGenerator.cs");

            string expectedOutput;
#if GENERATE_BASELINES
            if (testFile.Exists())
            {
                expectedOutput = testFile.ReadAllText();
            }
            else
            {
                expectedOutput = null;
            }
#else
            expectedOutput = testFile.ReadAllText();
#endif

            // Act
            var result = codeGenerator.Generate();

            // Assert
#if GENERATE_BASELINES
            // Update baseline files if files do not already match.
            if (!string.Equals(expectedOutput, result.Code, StringComparison.Ordinal))
            {
                BaselineWriter.WriteBaseline(
                    @"test\Microsoft.AspNet.Razor.Test\TestFiles\CodeGenerator\Output\CSharpCodeGenerator.cs",
                    result.Code);
            }
#else
            Assert.Equal(expectedOutput, result.Code);
#endif
        }
Example #31
0
        public static RazorTemplateEngine CreateEngine()
        {
            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language);

            host.DefaultBaseClass = typeof(RazorTemplate <Context>).FullName;
            host.DefaultNamespace = "RazorOutput";
            host.DefaultClassName = "Template";
            host.NamespaceImports.Add("System");
            host.NamespaceImports.Add("System.IO");
            //host.NamespaceImports.Add("System.Linq");
            // host.NamespaceImports.Add("System.Text.RegularExpressions");

            var engine = new RazorTemplateEngine(host);

            return(engine);
        }
        public void CreateCodeBuilder_ReturnsNewCSharpCodeBuilder()
        {
            // Arrange
            var language = new CSharpRazorCodeLanguage();
            var host = new RazorEngineHost(language);
            var context = CodeGeneratorContext.Create(host,
                                                      "myclass",
                                                      "myns",
                                                      string.Empty,
                                                      shouldGenerateLinePragmas: false);

            // Act
            var generator = language.CreateCodeBuilder(context);

            // Assert
            Assert.IsType<CSharpCodeBuilder>(generator);
        }
Example #33
0
        public void CreateChunkGeneratorParserListenerReturnsNewCSharpChunkGeneratorParserListener()
        {
            // Arrange
            var service = new CSharpRazorCodeLanguage();

            // Act
            var host = new RazorEngineHost(service);
            var generator = service.CreateChunkGenerator("Foo", "Bar", "Baz", host);

            // Assert
            Assert.NotNull(generator);
            Assert.IsType<RazorChunkGenerator>(generator);
            Assert.Equal("Foo", generator.ClassName);
            Assert.Equal("Bar", generator.RootNamespaceName);
            Assert.Equal("Baz", generator.SourceFileName);
            Assert.Same(host, generator.Host);
        }
        public void CreateCodeBuilder_ReturnsNewCSharpCodeBuilder()
        {
            // Arrange
            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language);
            var context  = CodeGeneratorContext.Create(host,
                                                       "myclass",
                                                       "myns",
                                                       string.Empty,
                                                       shouldGenerateLinePragmas: false);

            // Act
            var generator = language.CreateCodeBuilder(context);

            // Assert
            Assert.IsType <CSharpCodeBuilder>(generator);
        }
        public void CreateCodeGeneratorParserListenerReturnsNewCSharpCodeGeneratorParserListener()
        {
            // Arrange
            RazorCodeLanguage service = new CSharpRazorCodeLanguage();

            // Act
            RazorEngineHost    host      = new RazorEngineHost(service);
            RazorCodeGenerator generator = service.CreateCodeGenerator("Foo", "Bar", "Baz", host);

            // Assert
            Assert.NotNull(generator);
            Assert.IsType <CSharpRazorCodeGenerator>(generator);
            Assert.Equal("Foo", generator.ClassName);
            Assert.Equal("Bar", generator.RootNamespaceName);
            Assert.Equal("Baz", generator.SourceFileName);
            Assert.Same(host, generator.Host);
        }
        public Assembly Compile(IEnumerable <TemplateMetadata> templates, Type baseClass)
        {
            var metadataReferences = typeof(ConsulTemplateBase).GetTypeInfo()
                                     .Assembly
                                     .GetReferencedAssemblies()
                                     .Select(Assembly.Load)
                                     .Concat(new[] { typeof(ConsulTemplateBase).GetTypeInfo().Assembly })
                                     .Select(assembly => assembly.Location)
                                     .Select(location => MetadataReference.CreateFromFile(location))
                                     .Concat(new[]
            {
                MetadataReference.CreateFromFile(Path.Combine(
                                                     Path.GetDirectoryName(typeof(Enumerable).GetTypeInfo().Assembly.Location), "mscorlib.dll")),
                MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location)
            })
                                     .ToArray();

            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language)
            {
                DefaultBaseClass = baseClass.FullName,
                DefaultNamespace = "ConsulRazor.CompiledRazorTemplates",
            };

            // Everyone needs the System namespace, right?
            host.NamespaceImports.Add("System");
            host.NamespaceImports.Add("System.Linq");
            var engine      = new RazorTemplateEngine(host);
            var syntaxTrees = templates.Select(metadata =>
            {
                using (var templateStream = File.OpenRead(metadata.FullPath))
                {
                    var generatorResults = engine.GenerateCode(new StreamReader(templateStream), metadata.ClassName,
                                                               metadata.Namespace, metadata.Filename);

                    return(CSharpSyntaxTree.ParseText(generatorResults.GeneratedCode));
                }
            })
                              .ToArray();

            var compilation = CSharpCompilation.Create("ConsulRazor.CompiledRazorTemplates", syntaxTrees,
                                                       metadataReferences, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            return(CompileCompilation(compilation));
        }
Example #37
0
        /// <summary>
        /// 创建DLL文件 重复方法 则覆盖
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="razorTemplate">razor语法的Html模板</param>
        /// <param name="model">实体一般Model</param>
        /// <param name="keyName">dll名称不含后缀</param>
        /// <param name="dllDir">dll生成目录</param>
        public static void CreateDLL <T>(string razorTemplate, T model, string keyName, string dllDir = ".")
        {
            //1、创建一个C#的对象
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

            var  check     = KuRazor.CheckModel(model);
            Type modelType = check.Item2;

            modelType = modelType ?? typeof(System.Dynamic.DynamicObject);
            Type templateType = typeof(TemplateBase <>);

            RazorCodeLanguage language = new CSharpRazorCodeLanguage();
            RazorEngineHost   host     = new RazorEngineHost(language);

            host.DefaultBaseClass = KuRazor.BuildTypeName(templateType, modelType);
            host.DefaultClassName = keyName;
            host.DefaultNamespace = "KuRazorCommon.Dynamic";
            List <string> namespaceImports = new List <string>();

            namespaceImports.Add("System");
            namespaceImports.Add("System.Collections.Generic");
            namespaceImports.Add("System.Linq");
            foreach (string ns in namespaceImports)
            {
                host.NamespaceImports.Add(ns);
            }
            RazorTemplateEngine engine = new RazorTemplateEngine(host);
            GeneratorResults    razorResult;

            using (var reader = new StringReader(razorTemplate))
                razorResult = engine.GenerateCode(reader);
            CodeCompileUnit razorCode = razorResult.GeneratedCode;

            string generatedCode;
            var    builder = new StringBuilder();

            using (var writer = new StringWriter(builder, CultureInfo.InvariantCulture))
            {
                provider.GenerateCodeFromCompileUnit(razorCode, writer, new CodeGeneratorOptions());
                generatedCode = builder.ToString();
            }

            string          dllName = string.Format("{0}.dll", keyName);
            CompilerResults results = CompileCode(provider, generatedCode, dllName, dllDir);
        }
Example #38
0
        private static void GenerateCodeFile(string cshtmlFilePath)
        {
            var basePath            = Path.GetDirectoryName(cshtmlFilePath);
            var fileName            = Path.GetFileName(cshtmlFilePath);
            var fileNameNoExtension = Path.GetFileNameWithoutExtension(fileName);
            var codeLang            = new CSharpRazorCodeLanguage();
            var host = new RazorEngineHost(codeLang);

            host.DefaultBaseClass = "Microsoft.AspNet.Diagnostics.Views.BaseView";
            var engine = new RazorTemplateEngine(host);

            using (var fileStream = File.OpenText(cshtmlFilePath))
            {
                var code = engine.GenerateCode(
                    input: fileStream,
                    className: fileNameNoExtension,
                    rootNamespace: "Microsoft.AspNet.Diagnostics.Entity.Views",
                    sourceFileName: fileName);

                var source     = code.GeneratedCode;
                var startIndex = 0;
                while (startIndex < source.Length)
                {
                    var startMatch = @"<%$ include: ";
                    var endMatch   = @" %>";
                    startIndex = source.IndexOf(startMatch, startIndex);
                    if (startIndex == -1)
                    {
                        break;
                    }
                    var endIndex = source.IndexOf(endMatch, startIndex);
                    if (endIndex == -1)
                    {
                        break;
                    }
                    var includeFileName = source.Substring(startIndex + startMatch.Length, endIndex - (startIndex + startMatch.Length));
                    includeFileName = SanitizeFileName(includeFileName);
                    Console.WriteLine("    Inlining file {0}", includeFileName);
                    var replacement = File.ReadAllText(Path.Combine(basePath, includeFileName)).Replace("\"", "\\\"").Replace("\r\n", "\\r\\n");
                    source     = source.Substring(0, startIndex) + replacement + source.Substring(endIndex + endMatch.Length);
                    startIndex = startIndex + replacement.Length;
                }
                File.WriteAllText(Path.Combine(basePath, string.Format("{0}.cs", fileNameNoExtension)), source);
            }
        }
        private static RazorTemplateEngine CreateRazorTemplateEngine()
        {
            var language = new CSharpRazorCodeLanguage();
            var host     = new SimpleRazorEngineHost(language)
            {
                DefaultBaseClass = "SimpleTemplateBase",
                DefaultClassName = "SimpleView",
                DefaultNamespace = "SimpleRazor",
            };

            foreach (string nameSpace in DefaultNamespaceImports)
            {
                host.NamespaceImports.Add(nameSpace);
            }
            var engine = new RazorTemplateEngine(host);

            return(engine);
        }
Example #40
0
        public static CodeGeneratorContext CreateCodeGeneratorContext()
        {
            var language = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(language);
            var chunkGeneratorContext = new ChunkGeneratorContext
                                        (
                host,
                _testClass,
                _testNamespace,
                _testFile,
                shouldGenerateLinePragmas: false
                                        );

            var codeGeneratorContext = new CodeGeneratorContext(
                chunkGeneratorContext,
                errorSink: new ErrorSink());

            return(codeGeneratorContext);
        }
Example #41
0
        static void Main(string[] args)
        {
            const string rootNamespace       = "RazorOnConsole";
            var          viewPath            = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Views\Index.cshtml");
            var          basePath            = Path.GetDirectoryName(viewPath);
            var          fileName            = Path.GetFileName(viewPath);
            var          fileNameNoExtension = Path.GetFileNameWithoutExtension(fileName);

            using (var file = File.Create(fileNameNoExtension + ".html")) { new Index {
                                                                                Model = "foobarfoo"
                                                                            }.ExecuteAsync(file).Wait(); }

            var codeLang = new CSharpRazorCodeLanguage();
            var host     = new RazorEngineHost(codeLang)
            {
                DefaultBaseClass      = "RazorOnConsole.Views.BaseView",
                GeneratedClassContext = new GeneratedClassContext(
                    executeMethodName: GeneratedClassContext.DefaultExecuteMethodName,
                    writeMethodName: GeneratedClassContext.DefaultWriteMethodName,
                    writeLiteralMethodName: GeneratedClassContext.DefaultWriteLiteralMethodName,
                    writeToMethodName: "WriteTo",
                    writeLiteralToMethodName: "WriteLiteralTo",
                    templateTypeName: "HelperResult",
                    defineSectionMethodName: "DefineSection",
                    generatedTagHelperContext: new GeneratedTagHelperContext())
            };

            host.NamespaceImports.Add("System");

            var engine = new RazorTemplateEngine(host);

            using (var fileStream = File.OpenText(viewPath))
            {
                GeneratorResults code = engine.GenerateCode(
                    input: fileStream,
                    className: fileNameNoExtension,
                    rootNamespace: rootNamespace,
                    sourceFileName: fileName);

                string source = code.GeneratedCode;
                File.WriteAllText(Path.Combine(basePath, @"..\..\..\", "Views", string.Format("{0}.cs", fileNameNoExtension)), source);
            }
        }