From 9860cfc34b03b8f63cf9ba9a88aa34506f94b790 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Wed, 1 May 2019 14:29:22 -0700 Subject: [PATCH] do the needful \n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/c5a7e9ecce6d15190c9251344e20a7b4b11b1096 --- .../src/Components/ComponentCodeDirective.cs | 1 - .../Components/ComponentCodeDirectivePass.cs | 27 ------ .../src/Extensions/FunctionsDirectivePass.cs | 23 ++++- .../Extensions/FunctionsDirectivePassTest.cs | 91 +++++++++++++++++++ .../test/RazorProjectEngineTest.cs | 1 - 5 files changed, 112 insertions(+), 31 deletions(-) delete mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirectivePass.cs diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirective.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirective.cs index a7813ee4bf..509e8928d3 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirective.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirective.cs @@ -23,7 +23,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Components } builder.AddDirective(Directive, FileKinds.Component); - builder.Features.Add(new ComponentCodeDirectivePass()); } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirectivePass.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirectivePass.cs deleted file mode 100644 index c45f1205d1..0000000000 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentCodeDirectivePass.cs +++ /dev/null @@ -1,27 +0,0 @@ -// 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 Microsoft.AspNetCore.Razor.Language.Intermediate; - -namespace Microsoft.AspNetCore.Razor.Language.Components -{ - internal class ComponentCodeDirectivePass : IntermediateNodePassBase, IRazorDirectiveClassifierPass - { - protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode) - { - var @class = documentNode.FindPrimaryClass(); - if (@class == null) - { - return; - } - - foreach (var code in documentNode.FindDirectiveReferences(ComponentCodeDirective.Directive)) - { - for (var i = 0; i < code.Node.Children.Count; i++) - { - @class.Children.Add(code.Node.Children[i]); - } - } - } - } -} diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Extensions/FunctionsDirectivePass.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Extensions/FunctionsDirectivePass.cs index 32f79570cb..c8498259b2 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Extensions/FunctionsDirectivePass.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Extensions/FunctionsDirectivePass.cs @@ -1,6 +1,9 @@ // 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.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Razor.Language.Components; using Microsoft.AspNetCore.Razor.Language.Intermediate; namespace Microsoft.AspNetCore.Razor.Language.Extensions @@ -15,11 +18,27 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions return; } + var directiveNodes = new List(); foreach (var functions in documentNode.FindDirectiveReferences(FunctionsDirective.Directive)) { - for (var i = 0; i < functions.Node.Children.Count; i++) + directiveNodes.Add(functions.Node); + } + + if (FileKinds.IsComponent(codeDocument.GetFileKind())) + { + foreach (var code in documentNode.FindDirectiveReferences(ComponentCodeDirective.Directive)) { - @class.Children.Add(functions.Node.Children[i]); + directiveNodes.Add(code.Node); + } + } + + // Now we have all the directive nodes, we want to add them to the end of the class node in document order. + var orderedDirectives = directiveNodes.OrderBy(n => n.Source?.AbsoluteIndex); + foreach (var node in orderedDirectives) + { + for (var i = 0; i < node.Children.Count; i++) + { + @class.Children.Add(node.Children[i]); } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Extensions/FunctionsDirectivePassTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Extensions/FunctionsDirectivePassTest.cs index 712766a5f1..97d80af404 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Extensions/FunctionsDirectivePassTest.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Extensions/FunctionsDirectivePassTest.cs @@ -1,6 +1,7 @@ // 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 Microsoft.AspNetCore.Razor.Language.Components; using Microsoft.AspNetCore.Razor.Language.Intermediate; using Xunit; using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert; @@ -76,6 +77,96 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions node => Assert.IsType(node)); } + [Fact] + public void Execute_ComponentCodeDirective_AddsStatementsToClassLevel() + { + // Arrange + var projectEngine = CreateProjectEngine(b => b.AddDirective(ComponentCodeDirective.Directive)); + var pass = new FunctionsDirectivePass() + { + Engine = projectEngine.Engine, + }; + + var sourceDocument = TestRazorSourceDocument.Create("@code { var value = true; }"); + var codeDocument = RazorCodeDocument.Create(sourceDocument); + codeDocument.SetFileKind(FileKinds.Component); + + var irDocument = Lower(codeDocument, projectEngine); + + // Act + pass.Execute(codeDocument, irDocument); + + // Assert + Children( + irDocument, + node => Assert.IsType(node)); + + var @namespace = irDocument.Children[0]; + Children( + @namespace, + node => Assert.IsType(node)); + + var @class = @namespace.Children[0]; + Children( + @class, + node => Assert.IsType(node), + node => CSharpCode(" var value = true; ", node)); + + var method = @class.Children[0]; + Children( + method, + node => Assert.IsType(node)); + } + + [Fact] + public void Execute_FunctionsAndComponentCodeDirective_AddsStatementsToClassLevel() + { + // Arrange + var projectEngine = CreateProjectEngine(b => b.AddDirective(ComponentCodeDirective.Directive)); + var pass = new FunctionsDirectivePass() + { + Engine = projectEngine.Engine, + }; + + var sourceDocument = TestRazorSourceDocument.Create(@" +@functions { var value1 = true; } +@code { var value2 = true; } +@functions { var value3 = true; }"); + var codeDocument = RazorCodeDocument.Create(sourceDocument); + codeDocument.SetFileKind(FileKinds.Component); + + var irDocument = Lower(codeDocument, projectEngine); + + // Act + pass.Execute(codeDocument, irDocument); + + // Assert + Children( + irDocument, + node => Assert.IsType(node)); + + var @namespace = irDocument.Children[0]; + Children( + @namespace, + node => Assert.IsType(node)); + + var @class = @namespace.Children[0]; + Children( + @class, + node => Assert.IsType(node), + node => CSharpCode(" var value1 = true; ", node), + node => CSharpCode(" var value2 = true; ", node), + node => CSharpCode(" var value3 = true; ", node)); + + var method = @class.Children[0]; + Children( + method, + node => Assert.IsType(node), + node => Assert.IsType(node), + node => Assert.IsType(node), + node => Assert.IsType(node)); + } + private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument, RazorProjectEngine projectEngine) { for (var i = 0; i < projectEngine.Phases.Count; i++) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs index 714eba41a3..96072a8cf1 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/RazorProjectEngineTest.cs @@ -47,7 +47,6 @@ namespace Microsoft.AspNetCore.Razor.Language features, feature => Assert.IsType(feature), feature => Assert.IsType(feature), - feature => Assert.IsType(feature), feature => Assert.IsType(feature), feature => Assert.IsType(feature), feature => Assert.IsType(feature),