diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultTagHelperResolver.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultTagHelperResolver.cs index 3b47b09c6c..8f65419e0d 100644 --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultTagHelperResolver.cs +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/DefaultTagHelperResolver.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Razor.Evolution; using Microsoft.AspNetCore.Razor.Evolution.Legacy; +using System.Linq; namespace Microsoft.CodeAnalysis.Razor { @@ -17,12 +18,12 @@ namespace Microsoft.CodeAnalysis.Razor public bool DesignTime { get; } - public override TagHelperResolutionResult GetTagHelpers(Compilation compilation) + public override TagHelperResolutionResult GetTagHelpers(Compilation compilation, IEnumerable assemblyNameFilters) { var descriptors = new List(); var errors = new ErrorSink(); - VisitTagHelpers(compilation, descriptors, errors); + VisitTagHelpers(compilation, assemblyNameFilters, descriptors, errors); VisitViewComponents(compilation, descriptors, errors); var diagnostics = new List(); @@ -36,7 +37,7 @@ namespace Microsoft.CodeAnalysis.Razor return resolutionResult; } - private void VisitTagHelpers(Compilation compilation, List results, ErrorSink errors) + private void VisitTagHelpers(Compilation compilation, IEnumerable assemblyNameFilters, List results, ErrorSink errors) { var types = new List(); var visitor = TagHelperTypeVisitor.Create(compilation, types); @@ -47,12 +48,15 @@ namespace Microsoft.CodeAnalysis.Razor foreach (var type in types) { - var descriptors = factory.CreateDescriptors(type, errors); - results.AddRange(descriptors); + if (assemblyNameFilters.Contains(type.ContainingAssembly.Identity.Name)) + { + var descriptors = factory.CreateDescriptors(type, errors); + results.AddRange(descriptors); + } } } - private void VisitViewComponents(Compilation compilation, List results, ErrorSink errors) + private void VisitViewComponents(Compilation compilation, IEnumerable assemblyNameFilters, List results, ErrorSink errors) { var types = new List(); var visitor = ViewComponentTypeVisitor.Create(compilation, types); @@ -65,9 +69,12 @@ namespace Microsoft.CodeAnalysis.Razor { try { - var descriptor = factory.CreateDescriptor(type); + if (assemblyNameFilters.Contains(type.ContainingAssembly.Identity.Name)) + { + var descriptor = factory.CreateDescriptor(type); - results.Add(descriptor); + results.Add(descriptor); + } } catch (Exception ex) { diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperResolver.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperResolver.cs index a16f46400b..d6f67ff082 100644 --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperResolver.cs +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/TagHelperResolver.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 System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Host; @@ -9,14 +10,15 @@ namespace Microsoft.CodeAnalysis.Razor { internal abstract class TagHelperResolver : ILanguageService { - public abstract TagHelperResolutionResult GetTagHelpers(Compilation compilation); + public abstract TagHelperResolutionResult GetTagHelpers(Compilation compilation, IEnumerable assemblyNameFilters); public virtual async Task GetTagHelpersAsync( Project project, + IEnumerable assemblyNameFilters, CancellationToken cancellationToken = default(CancellationToken)) { var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); - return GetTagHelpers(compilation); + return GetTagHelpers(compilation, assemblyNameFilters); } } } diff --git a/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs b/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs index f7a5eb1c37..587277501e 100644 --- a/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs +++ b/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs @@ -20,7 +20,7 @@ namespace Microsoft.CodeAnalysis.Remote.Razor { } - public async Task GetTagHelpersAsync(Guid projectIdBytes, string projectDebugName, CancellationToken cancellationToken = default(CancellationToken)) + public async Task GetTagHelpersAsync(Guid projectIdBytes, string projectDebugName, IEnumerable assemblyNameFilters, CancellationToken cancellationToken = default(CancellationToken)) { var projectId = ProjectId.CreateFromSerialized(projectIdBytes, projectDebugName); @@ -28,7 +28,7 @@ namespace Microsoft.CodeAnalysis.Remote.Razor var project = solution.GetProject(projectId); var resolver = new DefaultTagHelperResolver(designTime: true); - var result = await resolver.GetTagHelpersAsync(project, cancellationToken).ConfigureAwait(false); + var result = await resolver.GetTagHelpersAsync(project, assemblyNameFilters, cancellationToken).ConfigureAwait(false); return result; } diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs index 793d100cb6..5b6b44a57a 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Composition; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.Evolution; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Razor; @@ -18,7 +17,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor [Import] public VisualStudioWorkspace Workspace { get; set; } - public async Task GetTagHelpersAsync(Project project) + public async Task GetTagHelpersAsync(Project project, IEnumerable assemblyNameFilters) { try { @@ -27,13 +26,13 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor { // The OOP host is turned off, so let's do this in process. var resolver = new CodeAnalysis.Razor.DefaultTagHelperResolver(designTime: true); - var result = await resolver.GetTagHelpersAsync(project, CancellationToken.None).ConfigureAwait(false); + var result = await resolver.GetTagHelpersAsync(project, assemblyNameFilters, CancellationToken.None).ConfigureAwait(false); return result; } using (var session = await client.CreateSessionAsync(project.Solution)) { - var result = await session.InvokeAsync("GetTagHelpersAsync", new object[] { project.Id.Id, "Foo", }).ConfigureAwait(false); + var result = await session.InvokeAsync("GetTagHelpersAsync", new object[] { project.Id.Id, "Foo", assemblyNameFilters, }).ConfigureAwait(false); return result; } } diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/ITagHelperResolver.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/ITagHelperResolver.cs index 3ea134b9c2..c994000795 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/ITagHelperResolver.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/ITagHelperResolver.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 System.Collections.Generic; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Razor; @@ -9,6 +10,6 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor { public interface ITagHelperResolver { - Task GetTagHelpersAsync(Project project); + Task GetTagHelpersAsync(Project project, IEnumerable assemblyNameFilters); } } diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs index de21bd9fef..bec3961149 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs +++ b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs @@ -14,6 +14,7 @@ using Microsoft.VisualStudio.LanguageServices.Razor; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio.TextManager.Interop; +using System.IO; namespace Microsoft.VisualStudio.RazorExtension.RazorInfo { @@ -169,7 +170,14 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo var assemblies = await _assemblyResolver.GetRazorEngineAssembliesAsync(project); var directives = await _directiveResolver.GetRazorEngineDirectivesAsync(_workspace, project); - var resolutionResult = await _tagHelperResolver.GetTagHelpersAsync(project); + var assemblyFilters = project.MetadataReferences + .Select(reference => reference.Display) + .Select(filter => Path.GetFileNameWithoutExtension(filter)); + var projectFilters = project.AllProjectReferences.Select(filter => solution.GetProject(filter.ProjectId).AssemblyName); + var tagHelperAssemblyFilters = assemblyFilters + .Concat(projectFilters) + .Concat(new[] { project.AssemblyName }); + var resolutionResult = await _tagHelperResolver.GetTagHelpersAsync(project, tagHelperAssemblyFilters); var files = GetCshtmlDocuments(project);