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:
parent
7657ea41a3
commit
c6150ba287
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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];
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) => {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue