Move section support into IR.

- Previously we'd special case `@section` at code generation time; now we transform the directive into an IR node.
- Changed the expectations of `DefineSection` to not take in a section writer. It's now expected to modify what `Write`, `WriteLiteral` etc. write to when inside of the lambda. This is done today in TagHelpers via `StartTagHelperWritingScope`.
- Updated baseline files to reflect new `DefineSection` expectations.
- Updated IR tests since we no longer leave around `DirectiveIRNode`s.

#901
This commit is contained in:
N. Taylor Mullen 2016-12-14 17:17:50 -08:00
parent 7657ea41a3
commit c6150ba287
12 changed files with 280 additions and 100 deletions

View File

@ -8,16 +8,25 @@ using Microsoft.AspNetCore.Razor.Evolution.Legacy;
namespace Microsoft.AspNetCore.Razor.Evolution namespace Microsoft.AspNetCore.Razor.Evolution
{ {
internal class DefaultDirectiveIRPass : IRazorIRPass internal class DefaultDirectiveIRPass : RazorIRPassBase
{ {
public RazorEngine Engine { get; set; } RazorParserOptions _parserOptions;
public int Order => 150; public override int Order => 150;
public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument) protected override void OnIntialized(RazorCodeDocument codeDocument)
{ {
var walker = new DirectiveWalker(); var syntaxTree = codeDocument.GetSyntaxTree();
walker.VisitDefault(irDocument); ThrowForMissingDocumentDependency(syntaxTree);
_parserOptions = syntaxTree.Options;
}
public override DocumentIRNode ExecuteCore(DocumentIRNode irDocument)
{
var designTime = _parserOptions.DesignTimeMode;
var walker = new DirectiveWalker(designTime);
walker.VisitDocument(irDocument);
return irDocument; return irDocument;
} }
@ -25,6 +34,12 @@ namespace Microsoft.AspNetCore.Razor.Evolution
private class DirectiveWalker : RazorIRNodeWalker private class DirectiveWalker : RazorIRNodeWalker
{ {
private ClassDeclarationIRNode _classNode; private ClassDeclarationIRNode _classNode;
private readonly bool _designTime;
public DirectiveWalker(bool designTime)
{
_designTime = designTime;
}
public override void VisitClass(ClassDeclarationIRNode node) public override void VisitClass(ClassDeclarationIRNode node)
{ {
@ -40,6 +55,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution
{ {
if (string.Equals(node.Name, CSharpCodeParser.FunctionsDirectiveDescriptor.Name, StringComparison.Ordinal)) if (string.Equals(node.Name, CSharpCodeParser.FunctionsDirectiveDescriptor.Name, StringComparison.Ordinal))
{ {
node.Parent.Children.Remove(node);
foreach (var child in node.Children.Except(node.Tokens)) foreach (var child in node.Children.Except(node.Tokens))
{ {
child.Parent = _classNode; child.Parent = _classNode;
@ -48,6 +65,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution
} }
else if (string.Equals(node.Name, CSharpCodeParser.InheritsDirectiveDescriptor.Name, StringComparison.Ordinal)) else if (string.Equals(node.Name, CSharpCodeParser.InheritsDirectiveDescriptor.Name, StringComparison.Ordinal))
{ {
node.Parent.Children.Remove(node);
var token = node.Tokens.FirstOrDefault(); var token = node.Tokens.FirstOrDefault();
if (token != null) if (token != null)
@ -55,6 +74,31 @@ namespace Microsoft.AspNetCore.Razor.Evolution
_classNode.BaseType = token.Content; _classNode.BaseType = token.Content;
} }
} }
else if (string.Equals(node.Name, CSharpCodeParser.SectionDirectiveDescriptor.Name, StringComparison.Ordinal))
{
var sectionIndex = node.Parent.Children.IndexOf(node);
node.Parent.Children.Remove(node);
var defineSectionEndStatement = new CSharpStatementIRNode()
{
Content = "});",
};
node.Parent.Children.Insert(sectionIndex, defineSectionEndStatement);
foreach (var child in node.Children.Except(node.Tokens).Reverse())
{
node.Parent.Children.Insert(sectionIndex, child);
}
var lambdaContent = _designTime ? "__razor_section_writer" : string.Empty;
var sectionName = node.Tokens.FirstOrDefault()?.Content;
var defineSectionStartStatement = new CSharpStatementIRNode()
{
Content = /* ORIGINAL: DefineSectionMethodName */ $"DefineSection(\"{sectionName}\", async ({lambdaContent}) => {{",
};
node.Parent.Children.Insert(sectionIndex, defineSectionStartStatement);
}
} }
} }
} }

View File

@ -436,30 +436,6 @@ namespace Microsoft.AspNetCore.Razor.Evolution
linePragma?.Dispose(); linePragma?.Dispose();
} }
public override void VisitDirective(DirectiveIRNode node)
{
if (string.Equals(node.Name, CSharpCodeParser.SectionDirectiveDescriptor.Name, StringComparison.Ordinal))
{
const string SectionWriterName = "__razor_section_writer";
Context.Writer
.WriteStartMethodInvocation("DefineSection" /* ORIGINAL: DefineSectionMethodName */)
.WriteStringLiteral(node.Tokens.FirstOrDefault()?.Content)
.WriteParameterSeparator();
var initialRenderingConventions = Context.RenderingConventions;
var redirectConventions = new CSharpRedirectRenderingConventions(SectionWriterName, Context.Writer);
Context.RenderingConventions = redirectConventions;
using (Context.Writer.BuildAsyncLambda(endLine: false, parameterNames: SectionWriterName))
{
VisitDefault(node);
}
Context.RenderingConventions = initialRenderingConventions;
Context.Writer.WriteEndMethodInvocation();
}
}
public override void VisitCSharpStatement(CSharpStatementIRNode node) public override void VisitCSharpStatement(CSharpStatementIRNode node)
{ {
if (string.IsNullOrWhiteSpace(node.Content)) if (string.IsNullOrWhiteSpace(node.Content))

View File

@ -10,6 +10,22 @@ namespace Microsoft.AspNetCore.Razor.Evolution
private static readonly ResourceManager _resourceManager private static readonly ResourceManager _resourceManager
= new ResourceManager("Microsoft.AspNetCore.Razor.Evolution.Resources", typeof(Resources).GetTypeInfo().Assembly); = new ResourceManager("Microsoft.AspNetCore.Razor.Evolution.Resources", typeof(Resources).GetTypeInfo().Assembly);
/// <summary>
/// The '{0}' feature requires a '{1}' provided by the '{2}'.
/// </summary>
internal static string FeatureDependencyMissing
{
get { return GetString("FeatureDependencyMissing"); }
}
/// <summary>
/// The '{0}' feature requires a '{1}' provided by the '{2}'.
/// </summary>
internal static string FormatFeatureDependencyMissing(object p0, object p1, object p2)
{
return string.Format(CultureInfo.CurrentCulture, GetString("FeatureDependencyMissing"), p0, p1, p2);
}
/// <summary> /// <summary>
/// The '{0}' operation is not valid when the builder is empty. /// The '{0}' operation is not valid when the builder is empty.
/// </summary> /// </summary>

View File

@ -0,0 +1,67 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Razor.Evolution.Intermediate;
namespace Microsoft.AspNetCore.Razor.Evolution
{
internal abstract class RazorIRPassBase : IRazorIRPass
{
public RazorEngine Engine { get; set; }
public virtual int Order => 0;
protected void ThrowForMissingDocumentDependency<TDocumentDependency>(TDocumentDependency value)
{
if (value == null)
{
throw new InvalidOperationException(
Resources.FormatFeatureDependencyMissing(
GetType().Name,
typeof(TDocumentDependency).Name,
typeof(RazorEngine).Name));
}
}
protected void ThrowForMissingEngineDependency<TEngineDependency>(TEngineDependency value)
{
if (value == null)
{
throw new InvalidOperationException(
Resources.FormatFeatureDependencyMissing(
GetType().Name,
typeof(TEngineDependency).Name,
typeof(RazorCodeDocument).Name));
}
}
protected virtual void OnIntialized(RazorCodeDocument codeDocument)
{
}
public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument)
{
if (codeDocument == null)
{
throw new ArgumentNullException(nameof(codeDocument));
}
if (irDocument == null)
{
throw new ArgumentNullException(nameof(irDocument));
}
if (Engine == null)
{
throw new InvalidOperationException(Resources.FormatPhaseMustBeInitialized(nameof(Engine)));
}
OnIntialized(codeDocument);
return ExecuteCore(irDocument);
}
public abstract DocumentIRNode ExecuteCore(DocumentIRNode irDocument);
}
}

View File

@ -117,6 +117,9 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="FeatureDependencyMissing" xml:space="preserve">
<value>The '{0}' feature requires a '{1}' provided by the '{2}'.</value>
</data>
<data name="IRBuilder_PopInvalid" xml:space="preserve"> <data name="IRBuilder_PopInvalid" xml:space="preserve">
<value>The '{0}' operation is not valid when the builder is empty.</value> <value>The '{0}' operation is not valid when the builder is empty.</value>
</data> </data>

View File

@ -18,11 +18,17 @@ namespace Microsoft.AspNetCore.Razor.Evolution
@functions { @functions {
var value = true; var value = true;
}"; }";
var originalIRDocument = Lower(content); var sourceDocument = TestRazorSourceDocument.Create(content);
var pass = new DefaultDirectiveIRPass(); var codeDocument = RazorCodeDocument.Create(sourceDocument);
var originalIRDocument = Lower(codeDocument);
var defaultEngine = RazorEngine.Create();
var pass = new DefaultDirectiveIRPass()
{
Engine = defaultEngine,
};
// Act // Act
var irDocument = pass.Execute(codeDocument: null, irDocument: originalIRDocument); var irDocument = pass.Execute(codeDocument, originalIRDocument);
// Assert // Assert
Assert.Same(originalIRDocument, irDocument); Assert.Same(originalIRDocument, irDocument);
@ -33,11 +39,17 @@ namespace Microsoft.AspNetCore.Razor.Evolution
{ {
// Arrange // Arrange
var content = "@inherits Hello<World[]>"; var content = "@inherits Hello<World[]>";
var originalIRDocument = Lower(content); var sourceDocument = TestRazorSourceDocument.Create(content);
var pass = new DefaultDirectiveIRPass(); var codeDocument = RazorCodeDocument.Create(sourceDocument);
var originalIRDocument = Lower(codeDocument);
var defaultEngine = RazorEngine.Create();
var pass = new DefaultDirectiveIRPass()
{
Engine = defaultEngine,
};
// Act // Act
var irDocument = pass.Execute(codeDocument: null, irDocument: originalIRDocument); var irDocument = pass.Execute(codeDocument, originalIRDocument);
// Assert // Assert
Children(irDocument, Children(irDocument,
@ -53,15 +65,21 @@ namespace Microsoft.AspNetCore.Razor.Evolution
} }
[Fact] [Fact]
public void Execute_Functions_ExistsAtClassDeclarationAndMethodLevel() public void Execute_Functions_MovesStatementToClassLevel()
{ {
// Arrange // Arrange
var content = "@functions { var value = true; }"; var content = "@functions { var value = true; }";
var originalIRDocument = Lower(content); var sourceDocument = TestRazorSourceDocument.Create(content);
var pass = new DefaultDirectiveIRPass(); var codeDocument = RazorCodeDocument.Create(sourceDocument);
var originalIRDocument = Lower(codeDocument);
var defaultEngine = RazorEngine.Create();
var pass = new DefaultDirectiveIRPass()
{
Engine = defaultEngine,
};
// Act // Act
var irDocument = pass.Execute(codeDocument: null, irDocument: originalIRDocument); var irDocument = pass.Execute(codeDocument, originalIRDocument);
// Assert // Assert
Children(irDocument, Children(irDocument,
@ -79,17 +97,91 @@ namespace Microsoft.AspNetCore.Razor.Evolution
var method = (RazorMethodDeclarationIRNode)@class.Children[0]; var method = (RazorMethodDeclarationIRNode)@class.Children[0];
Children(method, Children(method,
node => Html(string.Empty, node), node => Html(string.Empty, node),
node => Directive("functions", node,
directiveChild => CSharpStatement(" var value = true; ", directiveChild)),
node => Html(string.Empty, node)); node => Html(string.Empty, node));
} }
private static DocumentIRNode Lower(string content) [Fact]
public void Execute_Section_WrapsStatementInDefineSection()
{ {
// Arrange
var content = "@section Header { <p>Hello World</p> }";
var sourceDocument = TestRazorSourceDocument.Create(content); var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument); var codeDocument = RazorCodeDocument.Create(sourceDocument);
var originalIRDocument = Lower(codeDocument);
var defaultEngine = RazorEngine.Create();
var pass = new DefaultDirectiveIRPass()
{
Engine = defaultEngine,
};
// Act
var irDocument = pass.Execute(codeDocument, originalIRDocument);
// Assert
Children(irDocument,
node => Assert.IsType<ChecksumIRNode>(node),
node => Assert.IsType<NamespaceDeclarationIRNode>(node));
var @namespace = irDocument.Children[1];
Children(@namespace,
node => Assert.IsType<UsingStatementIRNode>(node),
node => Assert.IsType<UsingStatementIRNode>(node),
node => Assert.IsType<ClassDeclarationIRNode>(node));
var @class = @namespace.Children[2];
var method = SingleChild<RazorMethodDeclarationIRNode>(@class);
Children(method,
node => Html(string.Empty, node),
node => CSharpStatement("DefineSection(\"Header\", async () => {", node),
node => Html(" <p>Hello World</p> ", node),
node => CSharpStatement("});", node),
node => Html(string.Empty, node));
}
[Fact]
public void Execute_Section_DesignTime_WrapsStatementInBackwardsCompatibleDefineSection()
{
// Arrange
var content = "@section Header { <p>Hello World</p> }";
var designTimeEngine = RazorEngine.CreateDesignTime();
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var originalIRDocument = Lower(codeDocument, designTimeEngine);
var defaultEngine = RazorEngine.Create();
var pass = new DefaultDirectiveIRPass()
{
Engine = defaultEngine,
};
// Act
var irDocument = pass.Execute(codeDocument, originalIRDocument);
// Assert
Children(irDocument,
node => Assert.IsType<ChecksumIRNode>(node),
node => Assert.IsType<NamespaceDeclarationIRNode>(node));
var @namespace = irDocument.Children[1];
Children(@namespace,
node => Assert.IsType<UsingStatementIRNode>(node),
node => Assert.IsType<UsingStatementIRNode>(node),
node => Assert.IsType<ClassDeclarationIRNode>(node));
var @class = @namespace.Children[2];
var method = SingleChild<RazorMethodDeclarationIRNode>(@class);
Children(method,
node => Html(string.Empty, node),
node => CSharpStatement("DefineSection(\"Header\", async (__razor_section_writer) => {", node),
node => Html(" <p>Hello World</p> ", node),
node => CSharpStatement("});", node),
node => Html(string.Empty, node));
}
private static DocumentIRNode Lower(RazorCodeDocument codeDocument)
{
var engine = RazorEngine.Create(); var engine = RazorEngine.Create();
return Lower(codeDocument, engine);
}
private static DocumentIRNode Lower(RazorCodeDocument codeDocument, RazorEngine engine)
{
for (var i = 0; i < engine.Phases.Count; i++) for (var i = 0; i < engine.Phases.Count; i++)
{ {
var phase = engine.Phases[i]; var phase = engine.Phases[i];

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.Evolution.Intermediate; using Microsoft.AspNetCore.Razor.Evolution.Intermediate;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
@ -556,13 +557,9 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests
AssertCSharpDocumentMatchesBaseline(document.GetCSharpDocument()); AssertCSharpDocumentMatchesBaseline(document.GetCSharpDocument());
} }
private class ApiSetsIRTestAdapter : IRazorIRPass private class ApiSetsIRTestAdapter : RazorIRPassBase
{ {
public RazorEngine Engine { get; set; } public override DocumentIRNode ExecuteCore(DocumentIRNode irDocument)
public int Order { get; set; }
public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument)
{ {
var walker = new ApiSetsIRWalker(); var walker = new ApiSetsIRWalker();
walker.Visit(irDocument); walker.Visit(irDocument);

View File

@ -1,22 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0"> <Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
<Import Project="..\..\build\common.props" /> <Import Project="..\..\build\common.props" />
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netcoreapp1.0;net451</TargetFrameworks> <TargetFrameworks>netcoreapp1.0;net451</TargetFrameworks>
<DefineConstants>$(DefineConstants);__RemoveThisBitTo__GENERATE_BASELINES</DefineConstants> <DefineConstants>$(DefineConstants);__RemoveThisBitTo__GENERATE_BASELINES</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="**\*.cs" Exclude="TestFiles\**\*" /> <Compile Include="**\*.cs" Exclude="TestFiles\**\*" />
<EmbeddedResource Include="**\*.resx" /> <EmbeddedResource Include="**\*.resx" />
<EmbeddedResource Include="TestFiles\**\*" /> <EmbeddedResource Include="TestFiles\**\*" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Razor.Evolution\Microsoft.AspNetCore.Razor.Evolution.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Razor.Evolution\Microsoft.AspNetCore.Razor.Evolution.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161123-03" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20161123-03" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-beta4-build1194" />
@ -24,16 +19,13 @@
<PackageReference Include="Moq" Version="4.6.36-*" /> <PackageReference Include="Moq" Version="4.6.36-*" />
<PackageReference Include="xunit" Version="2.2.0-beta4-build3444" /> <PackageReference Include="xunit" Version="2.2.0-beta4-build3444" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp1.0' "> <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">
<PackageReference Include="Microsoft.NETCore.App" Version="1.2.0-*" /> <PackageReference Include="Microsoft.NETCore.App" Version="1.2.0-*" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' "> <ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
<Reference Include="System.Runtime" /> <Reference Include="System.Runtime" />
<Reference Include="System.Threading.Tasks" /> <Reference Include="System.Threading.Tasks" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
</ItemGroup> </ItemGroup>
</Project>
</Project>

View File

@ -51,16 +51,15 @@ WriteTo(__razor_template_writer, baz);
#line default #line default
#line hidden #line hidden
WriteLiteral("\r\n</p>\r\n\r\n"); WriteLiteral("\r\n</p>\r\n\r\n");
DefineSection("Footer", async(__razor_section_writer) => { DefineSection("Footer", async () => {
WriteLiteralTo(__razor_section_writer, "\r\n <p>Foo</p>\r\n "); WriteLiteral("\r\n <p>Foo</p>\r\n ");
#line 14 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/DesignTime.cshtml" #line 14 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/DesignTime.cshtml"
WriteTo(__razor_section_writer, bar); Write(bar);
#line default #line default
#line hidden #line hidden
WriteLiteralTo(__razor_section_writer, "\r\n"); WriteLiteral("\r\n");
} });
);
} }
#pragma warning restore 1998 #pragma warning restore 1998
} }

View File

@ -9,9 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
#pragma warning disable 1998 #pragma warning disable 1998
public async System.Threading.Tasks.Task ExecuteAsync() public async System.Threading.Tasks.Task ExecuteAsync()
{ {
DefineSection("Link", async(__razor_section_writer) => { DefineSection("Link", async () => {
} });
);
WriteLiteral("(string link) {\r\n <a"); WriteLiteral("(string link) {\r\n <a");
BeginWriteAttribute("href", " href=\"", 36, "\"", 93, 1); BeginWriteAttribute("href", " href=\"", 36, "\"", 93, 1);
WriteAttributeValue("", 43, new HelperResult(async(__razor_attribute_value_writer) => { WriteAttributeValue("", 43, new HelperResult(async(__razor_attribute_value_writer) => {

View File

@ -17,49 +17,46 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
#line default #line default
#line hidden #line hidden
WriteLiteral("\r\n<div>This is in the Body>\r\n\r\n"); WriteLiteral("\r\n<div>This is in the Body>\r\n\r\n");
DefineSection("Section2", async(__razor_section_writer) => { DefineSection("Section2", async () => {
WriteLiteralTo(__razor_section_writer, "\r\n <div"); WriteLiteral("\r\n <div");
BeginWriteAttributeTo(__razor_section_writer, "class", " class=\"", 109, "\"", 128, 2); BeginWriteAttribute("class", " class=\"", 109, "\"", 128, 2);
WriteAttributeValueTo(__razor_section_writer, "", 117, "some", 117, 4, true); WriteAttributeValue("", 117, "some", 117, 4, true);
#line 8 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml" #line 8 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml"
WriteAttributeValueTo(__razor_section_writer, " ", 121, thing, 122, 6, false); WriteAttributeValue(" ", 121, thing, 122, 6, false);
#line default #line default
#line hidden #line hidden
EndWriteAttributeTo(__razor_section_writer); EndWriteAttribute();
WriteLiteralTo(__razor_section_writer, ">This is in Section 2</div>\r\n"); WriteLiteral(">This is in Section 2</div>\r\n");
} });
);
WriteLiteral("\r\n"); WriteLiteral("\r\n");
DefineSection("Section1", async(__razor_section_writer) => { DefineSection("Section1", async () => {
WriteLiteralTo(__razor_section_writer, "\r\n <div>This is in Section 1</div>\r\n"); WriteLiteral("\r\n <div>This is in Section 1</div>\r\n");
} });
); WriteLiteral("\r\n");
DefineSection("NestedDelegates", async () => {
WriteLiteral("\r\n"); WriteLiteral("\r\n");
DefineSection("NestedDelegates", async(__razor_section_writer) => {
WriteLiteralTo(__razor_section_writer, "\r\n");
#line 16 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml" #line 16 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml"
Func<dynamic, object> f = Func<dynamic, object> f =
#line default #line default
#line hidden #line hidden
item => new HelperResult(async(__razor_template_writer) => { item => new HelperResult(async(__razor_template_writer) => {
WriteLiteralTo(__razor_template_writer, "<span>"); WriteLiteralTo(__razor_template_writer, "<span>");
#line 16 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml" #line 16 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml"
WriteTo(__razor_template_writer, item); WriteTo(__razor_template_writer, item);
#line default #line default
#line hidden #line hidden
WriteLiteralTo(__razor_template_writer, "</span>"); WriteLiteralTo(__razor_template_writer, "</span>");
} }
) )
#line 16 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml" #line 16 "TestFiles/IntegrationTests/RuntimeCodeGenerationIntegrationTest/Sections.cshtml"
; ;
#line default #line default
#line hidden #line hidden
} });
);
} }
#pragma warning restore 1998 #pragma warning restore 1998
} }

View File

@ -96,8 +96,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
<p>This is line 84</p><br> <p>This is line 84</p><br>
"); ");
DefineSection("WriteLiteralsToInHere", async(__razor_section_writer) => { DefineSection("WriteLiteralsToInHere", async () => {
WriteLiteralTo(__razor_section_writer, @" WriteLiteral(@"
<p>This is line 1 nested</p> <p>This is line 1 nested</p>
<p>This is line 2 nested</p> <p>This is line 2 nested</p>
<p>This is line 3 nested</p> <p>This is line 3 nested</p>
@ -128,7 +128,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
<p>This is line 28 nested</p> <p>This is line 28 nested</p>
<p>This is line 29 nested</p> <p>This is line 29 nested</p>
<p>This is l"); <p>This is l");
WriteLiteralTo(__razor_section_writer, @"ine 30 nested</p> WriteLiteral(@"ine 30 nested</p>
<p>This is line 31 nested</p> <p>This is line 31 nested</p>
<p>This is line 32 nested</p> <p>This is line 32 nested</p>
<p>This is line 33 nested</p> <p>This is line 33 nested</p>
@ -158,7 +158,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
<p>This is line 57 nested</p> <p>This is line 57 nested</p>
<p>This is line 58 nested</p> <p>This is line 58 nested</p>
<p>This is line 59 ne"); <p>This is line 59 ne");
WriteLiteralTo(__razor_section_writer, @"sted</p> WriteLiteral(@"sted</p>
<p>This is line 60 nested</p> <p>This is line 60 nested</p>
<p>This is line 61 nested</p> <p>This is line 61 nested</p>
<p>This is line 62 nested</p> <p>This is line 62 nested</p>
@ -176,8 +176,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
<p>This is line 74 nested</p> <p>This is line 74 nested</p>
<p>This is line 75 nested</p> <p>This is line 75 nested</p>
"); ");
} });
);
WriteLiteral(@"<p>This is line 1</p> WriteLiteral(@"<p>This is line 1</p>
<p>This is line 2</p> <p>This is line 2</p>
<p>This is line 3</p> <p>This is line 3</p>
@ -222,8 +221,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
<p>This is line 42</p> <p>This is line 42</p>
<p>This is line 43</p>hi!"); <p>This is line 43</p>hi!");
WriteLiteral("\r\n"); WriteLiteral("\r\n");
DefineSection("WriteLiteralsToInHereAlso", async(__razor_section_writer) => { DefineSection("WriteLiteralsToInHereAlso", async () => {
WriteLiteralTo(__razor_section_writer, @" WriteLiteral(@"
<p>This is line 1 nested</p> <p>This is line 1 nested</p>
<p>This is line 2 nested</p> <p>This is line 2 nested</p>
<p>This is line 3 nested</p> <p>This is line 3 nested</p>
@ -255,8 +254,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests.TestFiles
<p>This is line 29 nested</p> <p>This is line 29 nested</p>
<p>30</p> <p>30</p>
"); ");
} });
);
WriteLiteral("!"); WriteLiteral("!");
} }
#pragma warning restore 1998 #pragma warning restore 1998