diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/ViewComponentTagHelperDescriptorProvider.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/ViewComponentTagHelperDescriptorProvider.cs index 10150c3e80..0abefc5fe5 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/ViewComponentTagHelperDescriptorProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/ViewComponentTagHelperDescriptorProvider.cs @@ -55,7 +55,12 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions var factory = new ViewComponentTagHelperDescriptorFactory(compilation); for (var i = 0; i < types.Count; i++) { - context.Results.Add(factory.CreateDescriptor(types[i])); + var descriptor = factory.CreateDescriptor(types[i]); + + if (descriptor != null) + { + context.Results.Add(descriptor); + } } } diff --git a/src/Microsoft.CodeAnalysis.Razor/DefaultTagHelperDescriptorProvider.cs b/src/Microsoft.CodeAnalysis.Razor/DefaultTagHelperDescriptorProvider.cs index b9bf8f4822..c9effc07a1 100644 --- a/src/Microsoft.CodeAnalysis.Razor/DefaultTagHelperDescriptorProvider.cs +++ b/src/Microsoft.CodeAnalysis.Razor/DefaultTagHelperDescriptorProvider.cs @@ -48,7 +48,11 @@ namespace Microsoft.CodeAnalysis.Razor for (var i = 0; i < types.Count; i++) { var descriptor = factory.CreateDescriptor(types[i]); - context.Results.Add(descriptor); + + if (descriptor != null) + { + context.Results.Add(descriptor); + } } } diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorEditorParser.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorEditorParser.cs index 7de8648a74..4b4a4efe06 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorEditorParser.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorEditorParser.cs @@ -30,6 +30,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor } TemplateEngine = templateEngine; + FilePath = filePath; _parser = new BackgroundParser(templateEngine, filePath); _parser.ResultsReady += (sender, args) => OnDocumentParseComplete(args); _parser.Start(); @@ -42,6 +43,8 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor public RazorTemplateEngine TemplateEngine { get; } + public string FilePath { get; } + // Internal for testing. internal RazorSyntaxTree CurrentSyntaxTree { get; private set; } diff --git a/test/Microsoft.CodeAnalysis.Razor.Test/DefaultTagHelperDescriptorProviderTest.cs b/test/Microsoft.CodeAnalysis.Razor.Test/DefaultTagHelperDescriptorProviderTest.cs new file mode 100644 index 0000000000..58e850876d --- /dev/null +++ b/test/Microsoft.CodeAnalysis.Razor.Test/DefaultTagHelperDescriptorProviderTest.cs @@ -0,0 +1,38 @@ +// 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.Linq; +using System.Reflection; +using Microsoft.AspNetCore.Razor.Language; +using Xunit; + +namespace Microsoft.CodeAnalysis.Razor +{ + public class DefaultTagHelperDescriptorProviderTest + { + private static readonly Assembly _assembly = typeof(DefaultTagHelperDescriptorProviderTest).GetTypeInfo().Assembly; + + [Fact] + public void Execute_DoesNotAddEditorBrowsableNeverDescriptorsAtDesignTime() + { + // Arrange + var editorBrowsableTypeName = "Microsoft.CodeAnalysis.Razor.Workspaces.Test.EditorBrowsableTagHelper"; + var compilation = TestCompilation.Create(_assembly); + var descriptorProvider = new DefaultTagHelperDescriptorProvider() + { + DesignTime = true, + }; + var context = TagHelperDescriptorProviderContext.Create(); + + // Act + descriptorProvider.Execute(context); + + // Assert + Assert.NotNull(compilation.GetTypeByMetadataName(editorBrowsableTypeName)); + var nullDescriptors = context.Results.Where(descriptor => descriptor == null); + Assert.Empty(nullDescriptors); + var editorBrowsableDescriptor = context.Results.Where(descriptor => descriptor.GetTypeName() == editorBrowsableTypeName); + Assert.Empty(editorBrowsableDescriptor); + } + } +}