From 48eeaefc1e0fde1abc023619c929ec0f4f0e7917 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 3 Jun 2019 15:48:46 -0700 Subject: [PATCH] Add Razor component TagHelper detection. - WTE needs a way to detect if a `TagHelperDescriptor` is a component based `TagHelper` in order to turn features like validation, completion etc. on/off. - Updated tests to add verification points for the new `IsRazorComponentTagHelper` method. \n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/6fcd12e60b3d828988cabdebb55d30397c21d0db --- .../TagHelperDescriptorExtensions.cs | 4 +++- .../src/TagHelperDescriptorExtensions.cs | 21 +++++++++++++++++++ .../BindTagHelperDescriptorProviderTest.cs | 4 ++++ ...omponentTagHelperDescriptorProviderTest.cs | 1 + ...tHandlerTagHelperDescriptorProviderTest.cs | 1 + .../KeyTagHelperDescriptorProviderTest.cs | 1 + .../RefTagHelperDescriptorProviderTest.cs | 1 + 7 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/TagHelperDescriptorExtensions.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/TagHelperDescriptorExtensions.cs index 8d16b94f9d..6cb9f26bc6 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/TagHelperDescriptorExtensions.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/TagHelperDescriptorExtensions.cs @@ -124,7 +124,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Components throw new ArgumentNullException(nameof(tagHelper)); } - return !tagHelper.Metadata.ContainsKey(ComponentMetadata.SpecialKindKey); + return + string.Equals(tagHelper.Kind, ComponentMetadata.Component.TagHelperKind) && + !tagHelper.Metadata.ContainsKey(ComponentMetadata.SpecialKindKey); } public static bool IsEventHandlerTagHelper(this TagHelperDescriptor tagHelper) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorExtensions.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorExtensions.cs index f1f812d512..db14262d16 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorExtensions.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorExtensions.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 Microsoft.AspNetCore.Razor.Language.Components; namespace Microsoft.AspNetCore.Razor.Language { @@ -38,5 +39,25 @@ namespace Microsoft.AspNetCore.Razor.Language tagHelper.Metadata.TryGetValue(TagHelperMetadata.Runtime.Name, out var value); return string.Equals(TagHelperConventions.DefaultKind, value, StringComparison.Ordinal); } + + public static bool IsComponentOrChildContentTagHelper(this TagHelperDescriptor tagHelper) + { + if (tagHelper == null) + { + throw new ArgumentNullException(nameof(tagHelper)); + } + + if (tagHelper.IsComponentTagHelper()) + { + return true; + } + + if (tagHelper.IsChildContentTagHelper()) + { + return true; + } + + return false; + } } } \ No newline at end of file diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs index 3d48fb7666..eb868d3e4a 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/BindTagHelperDescriptorProviderTest.cs @@ -71,6 +71,7 @@ namespace Test Assert.Equal(ComponentMetadata.Bind.RuntimeName, bind.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(bind.IsDefaultKind()); Assert.False(bind.KindUsesDefaultTagHelperRuntime()); + Assert.False(bind.IsComponentOrChildContentTagHelper()); Assert.Equal("MyProperty", bind.Metadata[ComponentMetadata.Bind.ValueAttribute]); Assert.Equal("MyPropertyChanged", bind.Metadata[ComponentMetadata.Bind.ChangeAttribute]); @@ -187,6 +188,7 @@ namespace Test Assert.Equal(ComponentMetadata.Bind.RuntimeName, bind.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(bind.IsDefaultKind()); Assert.False(bind.KindUsesDefaultTagHelperRuntime()); + Assert.False(bind.IsComponentOrChildContentTagHelper()); Assert.Equal("MyProperty", bind.Metadata[ComponentMetadata.Bind.ValueAttribute]); Assert.Equal("MyPropertyChanged", bind.Metadata[ComponentMetadata.Bind.ChangeAttribute]); @@ -334,6 +336,7 @@ namespace Test Assert.Equal(ComponentMetadata.Bind.RuntimeName, bind.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(bind.IsDefaultKind()); Assert.False(bind.KindUsesDefaultTagHelperRuntime()); + Assert.False(bind.IsComponentOrChildContentTagHelper()); Assert.Equal("myprop", bind.Metadata[ComponentMetadata.Bind.ValueAttribute]); Assert.Equal("myevent", bind.Metadata[ComponentMetadata.Bind.ChangeAttribute]); @@ -698,6 +701,7 @@ namespace Test Assert.Equal(ComponentMetadata.Bind.RuntimeName, bind.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(bind.IsDefaultKind()); Assert.False(bind.KindUsesDefaultTagHelperRuntime()); + Assert.False(bind.IsComponentOrChildContentTagHelper()); Assert.False(bind.Metadata.ContainsKey(ComponentMetadata.Bind.ValueAttribute)); Assert.False(bind.Metadata.ContainsKey(ComponentMetadata.Bind.ChangeAttribute)); diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs index ecb2ec6939..c4df5ed23f 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/ComponentTagHelperDescriptorProviderTest.cs @@ -60,6 +60,7 @@ namespace Test Assert.Equal(ComponentMetadata.Component.TagHelperKind, component.Kind); Assert.False(component.IsDefaultKind()); Assert.False(component.KindUsesDefaultTagHelperRuntime()); + Assert.True(component.IsComponentOrChildContentTagHelper()); // No documentation in this test Assert.Null(component.Documentation); diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs index 86f26e97f3..e1772d04ac 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/EventHandlerTagHelperDescriptorProviderTest.cs @@ -56,6 +56,7 @@ namespace Test Assert.Equal(ComponentMetadata.EventHandler.RuntimeName, item.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(item.IsDefaultKind()); Assert.False(item.KindUsesDefaultTagHelperRuntime()); + Assert.False(item.IsComponentOrChildContentTagHelper()); Assert.Equal( "Sets the '@onclick' attribute to the provided string or delegate value. " + diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs index 17965726d6..b937b62685 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/KeyTagHelperDescriptorProviderTest.cs @@ -35,6 +35,7 @@ namespace Microsoft.CodeAnalysis.Razor Assert.Equal(ComponentMetadata.Key.RuntimeName, item.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(item.IsDefaultKind()); Assert.False(item.KindUsesDefaultTagHelperRuntime()); + Assert.False(item.IsComponentOrChildContentTagHelper()); Assert.Equal( "Ensures that the component or element will be preserved across renders if (and only if) the supplied key value matches.", diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs index bd39018ab4..0948102d3f 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/RefTagHelperDescriptorProviderTest.cs @@ -35,6 +35,7 @@ namespace Microsoft.CodeAnalysis.Razor Assert.Equal(ComponentMetadata.Ref.RuntimeName, item.Metadata[TagHelperMetadata.Runtime.Name]); Assert.False(item.IsDefaultKind()); Assert.False(item.KindUsesDefaultTagHelperRuntime()); + Assert.False(item.IsComponentOrChildContentTagHelper()); Assert.Equal( "Populates the specified field or property with a reference to the element or component.",