From 6a52cae98c289b9850fe78431ac948b7db13bb9e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 11 Jun 2021 07:45:47 -0700 Subject: [PATCH] Provide a tooling gesture that suggests values for required component parameters are not specified. (dotnet/aspnetcore#33384) * Provide a tooling gesture that suggests values for required component parameters are not specified. Fixes dotnet/aspnetcore#11815 Commit migrated from dotnet/aspnetcore@e02723975a97 --- .../src/BoundAttributeDescriptor.cs | 4 +- .../src/BoundAttributeDescriptorBuilder.cs | 4 +- .../src/Components/ComponentLoweringPass.cs | 47 +++- .../DefaultBoundAttributeDescriptorBuilder.cs | 5 +- .../src/RazorDiagnosticFactory.cs | 12 + .../src/Resources.resx | 7 +- .../src/TagHelperDescriptor.cs | 26 ++ .../ComponentCodeGenerationTestBase.cs | 259 ++++++++++++++++++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 19 ++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.ir.txt | 27 ++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.ir.txt | 22 ++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.ir.txt | 27 ++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 19 ++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.ir.txt | 23 ++ .../TestComponent.codegen.cs | 37 +++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 19 ++ .../TestComponent.codegen.cs | 38 +++ .../TestComponent.ir.txt | 22 ++ .../TestComponent.codegen.cs | 46 ++++ .../TestComponent.ir.txt | 21 ++ .../TestComponent.mappings.txt | 5 + .../TestComponent.codegen.cs | 22 ++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 10 + .../TestComponent.codegen.cs | 26 ++ .../TestComponent.ir.txt | 12 + .../TestComponent.codegen.cs | 26 ++ .../TestComponent.ir.txt | 13 + .../TestComponent.codegen.cs | 26 ++ .../TestComponent.ir.txt | 12 + .../TestComponent.codegen.cs | 24 ++ .../TestComponent.ir.txt | 16 ++ .../TestComponent.codegen.cs | 22 ++ .../TestComponent.ir.txt | 10 + .../TestComponent.codegen.cs | 23 ++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 13 + .../TestComponent.codegen.cs | 23 ++ .../TestComponent.diagnostics.txt | 2 + .../TestComponent.ir.txt | 13 + .../TestComponent.codegen.cs | 22 ++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 10 + .../TestComponent.codegen.cs | 26 ++ .../TestComponent.ir.txt | 12 + .../TestComponent.codegen.cs | 22 ++ .../TestComponent.diagnostics.txt | 1 + .../TestComponent.ir.txt | 10 + .../TestComponent.codegen.cs | 23 ++ .../TestComponent.ir.txt | 13 + .../TestComponent.codegen.cs | 31 +++ .../TestComponent.ir.txt | 12 + .../ComponentTagHelperDescriptorProvider.cs | 1 + ...omponentTagHelperDescriptorProviderTest.cs | 49 ++++ ...ft.AspNetCore.Components.netstandard2.0.cs | 7 + 64 files changed, 1441 insertions(+), 8 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.mappings.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecifiedAsText_WithoutName/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredChildContent_ValueSpecified_WithoutName/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_AllValuesSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_AllValuesSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_SomeValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_SomeValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_SomeValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_SomeValueSpecified_MultipleGroups/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_SomeValueSpecified_MultipleGroups/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredGroup_SomeValueSpecified_MultipleGroups/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredNamedChildContent_ValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.diagnostics.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_NoValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValueSpecified/TestComponent.ir.txt create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.codegen.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/Component_WithEditorRequiredParameter_ValuesSpecifiedUsingSplatting/TestComponent.ir.txt diff --git a/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptor.cs b/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptor.cs index ecfd96105..6a11b3aba 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptor.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptor.cs @@ -29,6 +29,8 @@ protected BoundAttributeDescriptor(string kind) public bool IsBooleanProperty { get; protected set; } + internal bool IsEditorRequired { get; set; } + public string Name { get; protected set; } public string IndexerNamePrefix { get; protected set; } @@ -81,4 +83,4 @@ public override int GetHashCode() return BoundAttributeDescriptorComparer.Default.GetHashCode(this); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorBuilder.cs index b6fb01d7a..051f2655d 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorBuilder.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorBuilder.cs @@ -1,4 +1,4 @@ -// 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. using System; @@ -28,6 +28,8 @@ public abstract class BoundAttributeDescriptorBuilder public abstract RazorDiagnosticCollection Diagnostics { get; } + internal bool IsEditorRequired { get; set; } + public virtual IReadOnlyList BoundAttributeParameters { get; } public virtual void BindAttributeParameter(Action configure) diff --git a/src/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentLoweringPass.cs b/src/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentLoweringPass.cs index 3a7e3c748..fa0c73783 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentLoweringPass.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentLoweringPass.cs @@ -67,7 +67,7 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentInte } } - private ComponentIntermediateNode RewriteAsComponent(TagHelperIntermediateNode node, TagHelperDescriptor tagHelper) + private static ComponentIntermediateNode RewriteAsComponent(TagHelperIntermediateNode node, TagHelperDescriptor tagHelper) { var component = new ComponentIntermediateNode() { @@ -89,13 +89,54 @@ private ComponentIntermediateNode RewriteAsComponent(TagHelperIntermediateNode n // because we see the nodes in the wrong order. foreach (var childContent in component.ChildContents) { - childContent.ParameterName = childContent.ParameterName ?? component.ChildContentParameterName ?? ComponentMetadata.ChildContent.DefaultParameterName; + childContent.ParameterName ??= component.ChildContentParameterName ?? ComponentMetadata.ChildContent.DefaultParameterName; } + ValidateRequiredAttributes(node, tagHelper, component); + return component; } - private MarkupElementIntermediateNode RewriteAsElement(TagHelperIntermediateNode node) + private static void ValidateRequiredAttributes(TagHelperIntermediateNode node, TagHelperDescriptor tagHelper, ComponentIntermediateNode intermediateNode) + { + if (intermediateNode.Children.Any(c => c is TagHelperDirectiveAttributeIntermediateNode node && (node.TagHelper?.IsSplatTagHelper() ?? false))) + { + // If there are any splat attributes, assume the user may have provided all values. + // This pass runs earlier than ComponentSplatLoweringPass, so we cannot rely on the presence of SplatIntermediateNode to make this check. + return; + } + + foreach (var requiredAttribute in tagHelper.EditorRequiredAttributes) + { + if (!IsPresentAsAttribute(requiredAttribute.Name, intermediateNode)) + { + intermediateNode.Diagnostics.Add( + RazorDiagnosticFactory.CreateComponent_EditorRequiredParameterNotSpecified( + node.Source ?? SourceSpan.Undefined, + intermediateNode.TagName, + requiredAttribute.Name)); + } + } + + static bool IsPresentAsAttribute(string attributeName, ComponentIntermediateNode intermediateNode) + { + foreach (var child in intermediateNode.Children) + { + if (child is ComponentAttributeIntermediateNode attributeNode && attributeName == attributeNode.AttributeName) + { + return true; + } + else if (child is ComponentChildContentIntermediateNode childContent && attributeName == childContent.AttributeName) + { + return true; + } + } + + return false; + } + } + + private static MarkupElementIntermediateNode RewriteAsElement(TagHelperIntermediateNode node) { var result = new MarkupElementIntermediateNode() { diff --git a/src/Microsoft.AspNetCore.Razor.Language/src/DefaultBoundAttributeDescriptorBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/src/DefaultBoundAttributeDescriptorBuilder.cs index 52f152b33..446bd56b7 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/src/DefaultBoundAttributeDescriptorBuilder.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/src/DefaultBoundAttributeDescriptorBuilder.cs @@ -125,7 +125,10 @@ public BoundAttributeDescriptor Build() CaseSensitive, parameters, new Dictionary(Metadata), - diagnostics.ToArray()); + diagnostics.ToArray()) + { + IsEditorRequired = IsEditorRequired, + }; return descriptor; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/src/RazorDiagnosticFactory.cs b/src/Microsoft.AspNetCore.Razor.Language/src/RazorDiagnosticFactory.cs index d88879c15..2e3c31b4e 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/src/RazorDiagnosticFactory.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/src/RazorDiagnosticFactory.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using Microsoft.AspNetCore.Razor.Language.Legacy; namespace Microsoft.AspNetCore.Razor.Language @@ -588,6 +589,17 @@ public static RazorDiagnostic CreateTagHelper_InconsistentTagStructure(SourceSpa return RazorDiagnostic.Create(TagHelper_InconsistentTagStructure, location, firstDescriptor, secondDescriptor, tagName, nameof(TagMatchingRuleDescriptor.TagStructure)); } + internal static readonly RazorDiagnosticDescriptor Component_EditorRequiredParameterNotSpecified = + new RazorDiagnosticDescriptor( + $"{DiagnosticPrefix}2012", + () => Resources.Component_EditorRequiredParameterNotSpecified, + RazorDiagnosticSeverity.Warning); + + public static RazorDiagnostic CreateComponent_EditorRequiredParameterNotSpecified(SourceSpan location, string tagName, string parameterName) + { + return RazorDiagnostic.Create(Component_EditorRequiredParameterNotSpecified, location, tagName, parameterName); + } + #endregion #region TagHelper Errors diff --git a/src/Microsoft.AspNetCore.Razor.Language/src/Resources.resx b/src/Microsoft.AspNetCore.Razor.Language/src/Resources.resx index 8fa60e30c..6d541a509 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/src/Resources.resx +++ b/src/Microsoft.AspNetCore.Razor.Language/src/Resources.resx @@ -1,4 +1,4 @@ - +