public void NoPageDirective_NothingWrong()
        {
            var compilationInfo = new TemplateCompilationInfo("name");
            compilationInfo.OriginalLines = ToInputLines(@"");

            var step = new ExtractPageDirectiveStep();

            step.Execute(compilationInfo);

            Assert.That(compilationInfo.OriginalLines[0].Processed, Is.False);
            Assert.That(compilationInfo.PageDirective, Is.Null);
        }
        public void TwoPageDirectives_Throws()
        {
            var compilationInfo = new TemplateCompilationInfo("name");
            compilationInfo.OriginalLines = ToInputLines(
                @"<%@Page Language=""C#""%>",
                @"<%@Page Language=""C#""%>");

            var step = new ExtractPageDirectiveStep();

            Assert.Throws<Exception>(() =>
                step.Execute(compilationInfo)
            );
        }
        public void PageDirectivewithInheritsAttribute_BaseClassIsSet()
        {
            var compilationInfo = new TemplateCompilationInfo("name");
            compilationInfo.OriginalLines = ToInputLines(@"<%@Page Language=""C#"" Inherits=""Foo""%>");

            var step = new ExtractPageDirectiveStep();

            step.Execute(compilationInfo);

            Assert.That(compilationInfo.OriginalLines[0].Processed, Is.True);
            Assert.That(compilationInfo.PageDirective, Is.Not.Null);
            Assert.That(compilationInfo.PageDirective.LineNo, Is.EqualTo(1));
            Assert.That(compilationInfo.PageDirective.BaseClass, Is.EqualTo("Foo"));
        }
        public void DummyPageDirective_FoundAndProcessed()
        {
            var compilationInfo = new TemplateCompilationInfo("name");
            compilationInfo.OriginalLines = ToInputLines(@"<%@Page Language=""C#""%>");

            var step = new ExtractPageDirectiveStep();

            step.Execute(compilationInfo);

            Assert.That(compilationInfo.OriginalLines[0].Processed, Is.True);
            Assert.That(compilationInfo.PageDirective, Is.Not.Null);
            Assert.That(compilationInfo.PageDirective.LineNo, Is.EqualTo(1));
            Assert.That(compilationInfo.PageDirective.BaseClass, Is.Null);
        }
        public void MultipleDirectives_Processed()
        {
            var compilationInfo = new TemplateCompilationInfo("name");
            compilationInfo.OriginalLines = ToInputLines(
                @"<%@ Import Namespace=""Larry.Bird.Is.The.Best.Forward.In.History""%>",
                @"<%@ Import Namespace=""Tom.Chambres.Is.Not""%>");

            var step = new ImportDirectivesStep();

            step.Execute(compilationInfo);

            Assert.That(compilationInfo.UsingDirectives.Count, Is.EqualTo(2));
            Assert.That(compilationInfo.OriginalLines[0].Processed, Is.True);
            Assert.That(compilationInfo.UsingDirectives[0].OriginalLineNo, Is.EqualTo(1));
            Assert.That(compilationInfo.UsingDirectives[0].Using, Is.EqualTo("Larry.Bird.Is.The.Best.Forward.In.History"));
            Assert.That(compilationInfo.OriginalLines[1].Processed, Is.True);
            Assert.That(compilationInfo.UsingDirectives[1].OriginalLineNo, Is.EqualTo(2));
            Assert.That(compilationInfo.UsingDirectives[1].Using, Is.EqualTo("Tom.Chambres.Is.Not"));
        }
        public void NoDirective_NothingHappened()
        {
            var compilationInfo = new TemplateCompilationInfo("name");
            compilationInfo.OriginalLines = ToInputLines(@"bla");

            var step = new ImportDirectivesStep();

            step.Execute(compilationInfo);

            Assert.That(compilationInfo.UsingDirectives.Count, Is.EqualTo(0));
            Assert.That(compilationInfo.OriginalLines[0].Processed, Is.False);
        }
Ejemplo n.º 7
0
        public override Type Compile(string name, string content)
        {
            var templateInfo = new TemplateCompilationInfo(name);
            var contentLines = content.Split(new[] {Environment.NewLine}, StringSplitOptions.None);

            templateInfo.OriginalLines = new TemplateCompilationInfo.InputLine[contentLines.Length];
            for (var lineNumber = 1; lineNumber <= contentLines.Length; ++lineNumber)
            {
                templateInfo.OriginalLines[lineNumber - 1] = new TemplateCompilationInfo.InputLine
                {
                    Content = contentLines[lineNumber - 1],
                    LineNumber = lineNumber
                };
            }

            string structure =
                @"#line hidden
            {4}
            #line hidden
            public class {0} :
            #line {5}
            {2}
            #line hidden
            {{
            protected override string Name {{ get {{ return ""{3}""; }} }}
            public override void Render() {{
            {1}
            }}
            }}
            ";
            new ExtractPageDirectiveStep().Execute(templateInfo);
            new DetermineBaseClassStep().Execute(templateInfo);
            new ImportDirectivesStep().Execute(templateInfo);
            var usingBlock = string.Empty;
            if (templateInfo.UsingDirectives.Count>0)
                usingBlock = templateInfo.UsingDirectives
                    .Select(d => "#line " + d.OriginalLineNo + Environment.NewLine + "using " + d.Using + ";")
                    .Aggregate((u1, u2) => u1 + Environment.NewLine + u2);
            var baseClass = templateInfo.CustomBaseClass ?? DefaultBaseClass;
            var baseClassLine = templateInfo.CustomBaseClass != null ? templateInfo.PageDirective.LineNo.ToString() : "hidden";
            var className = GetClassName(templateInfo.Name);
            new ProcessBlocksStep().Execute(templateInfo);
            var renderBody = templateInfo.Blocks.Select(b => b.GetCode()).Aggregate((b1, b2) => b1 + Environment.NewLine + b2);
            var generatedClass = string.Format(structure, className, renderBody, baseClass, name, usingBlock, baseClassLine);

            var codeProvider = GetCodeProvider();

            var parameters = new CompilerParameters();
            parameters.GenerateInMemory = true;
            parameters.GenerateExecutable = false;
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            foreach (var assembly in _engine.ReferencesAssemblies)
                parameters.ReferencedAssemblies.Add(assembly);
            var result = codeProvider.CompileAssemblyFromSource(parameters, generatedClass);
            if (result.Errors.Count > 0)
            {
                var messages = result.Errors.Cast<CompilerError>().Select(err => err.ToString());
                var message = messages.Aggregate("Could not compile "+name,(a, b) => a + Environment.NewLine + b);
                throw new Exception(message);
            }
            return result.CompiledAssembly.GetType(className);
        }