Surface TagHelper resolution errors.
- Decided to not expose the resolutions errors in the Razor extension. If we feel that it's good debug information we can add it later. - Added a `TagHelperResolutionResult` type to Razor.Workspaces so it can be used in the language and remote service. #1014
This commit is contained in:
parent
bbeb485405
commit
8c17375be0
|
|
@ -17,15 +17,23 @@ namespace Microsoft.CodeAnalysis.Razor
|
||||||
|
|
||||||
public bool DesignTime { get; }
|
public bool DesignTime { get; }
|
||||||
|
|
||||||
public override IReadOnlyList<TagHelperDescriptor> GetTagHelpers(Compilation compilation)
|
public override TagHelperResolutionResult GetTagHelpers(Compilation compilation)
|
||||||
{
|
{
|
||||||
var results = new List<TagHelperDescriptor>();
|
var descriptors = new List<TagHelperDescriptor>();
|
||||||
var errors = new ErrorSink();
|
var errors = new ErrorSink();
|
||||||
|
|
||||||
VisitTagHelpers(compilation, results, errors);
|
VisitTagHelpers(compilation, descriptors, errors);
|
||||||
VisitViewComponents(compilation, results, errors);
|
VisitViewComponents(compilation, descriptors, errors);
|
||||||
|
|
||||||
return results;
|
var diagnostics = new List<RazorDiagnostic>();
|
||||||
|
for (var i = 0; i < errors.Errors.Count; i++)
|
||||||
|
{
|
||||||
|
var diagnostic = RazorDiagnostic.Create(errors.Errors[i]);
|
||||||
|
diagnostics.Add(diagnostic);
|
||||||
|
}
|
||||||
|
var resolutionResult = new TagHelperResolutionResult(descriptors, diagnostics);
|
||||||
|
|
||||||
|
return resolutionResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void VisitTagHelpers(Compilation compilation, List<TagHelperDescriptor> results, ErrorSink errors)
|
private void VisitTagHelpers(Compilation compilation, List<TagHelperDescriptor> results, ErrorSink errors)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// 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 Microsoft.AspNetCore.Razor.Evolution;
|
||||||
|
|
||||||
|
namespace Microsoft.CodeAnalysis.Razor
|
||||||
|
{
|
||||||
|
public sealed class TagHelperResolutionResult
|
||||||
|
{
|
||||||
|
public TagHelperResolutionResult(IReadOnlyList<TagHelperDescriptor> descriptors, IReadOnlyList<RazorDiagnostic> diagnostics)
|
||||||
|
{
|
||||||
|
Descriptors = descriptors;
|
||||||
|
Diagnostics = diagnostics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<TagHelperDescriptor> Descriptors { get; }
|
||||||
|
|
||||||
|
public IReadOnlyList<RazorDiagnostic> Diagnostics { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,19 +1,17 @@
|
||||||
// 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.
|
// 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;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Razor.Evolution;
|
|
||||||
using Microsoft.CodeAnalysis.Host;
|
using Microsoft.CodeAnalysis.Host;
|
||||||
|
|
||||||
namespace Microsoft.CodeAnalysis.Razor
|
namespace Microsoft.CodeAnalysis.Razor
|
||||||
{
|
{
|
||||||
internal abstract class TagHelperResolver : ILanguageService
|
internal abstract class TagHelperResolver : ILanguageService
|
||||||
{
|
{
|
||||||
public abstract IReadOnlyList<TagHelperDescriptor> GetTagHelpers(Compilation compilation);
|
public abstract TagHelperResolutionResult GetTagHelpers(Compilation compilation);
|
||||||
|
|
||||||
public virtual async Task<IReadOnlyList<TagHelperDescriptor>> GetTagHelpersAsync(
|
public virtual async Task<TagHelperResolutionResult> GetTagHelpersAsync(
|
||||||
Project project,
|
Project project,
|
||||||
CancellationToken cancellationToken = default(CancellationToken))
|
CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ namespace Microsoft.CodeAnalysis.Remote.Razor
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TagHelperDescriptor>> GetTagHelpersAsync(Guid projectIdBytes, string projectDebugName, CancellationToken cancellationToken = default(CancellationToken))
|
public async Task<TagHelperResolutionResult> GetTagHelpersAsync(Guid projectIdBytes, string projectDebugName, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
var projectId = ProjectId.CreateFromSerialized(projectIdBytes, projectDebugName);
|
var projectId = ProjectId.CreateFromSerialized(projectIdBytes, projectDebugName);
|
||||||
|
|
||||||
|
|
@ -28,9 +28,9 @@ namespace Microsoft.CodeAnalysis.Remote.Razor
|
||||||
var project = solution.GetProject(projectId);
|
var project = solution.GetProject(projectId);
|
||||||
|
|
||||||
var resolver = new DefaultTagHelperResolver(designTime: true);
|
var resolver = new DefaultTagHelperResolver(designTime: true);
|
||||||
var results = await resolver.GetTagHelpersAsync(project, cancellationToken).ConfigureAwait(false);
|
var result = await resolver.GetTagHelpersAsync(project, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
return results;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IEnumerable<DirectiveDescriptor>> GetDirectivesAsync(Guid projectIdBytes, string projectDebugName, CancellationToken cancellationToken = default(CancellationToken))
|
public Task<IEnumerable<DirectiveDescriptor>> GetDirectivesAsync(Guid projectIdBytes, string projectDebugName, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Razor.Evolution;
|
using Microsoft.AspNetCore.Razor.Evolution;
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.CodeAnalysis.Razor;
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.LanguageServices.Razor
|
namespace Microsoft.VisualStudio.LanguageServices.Razor
|
||||||
{
|
{
|
||||||
|
|
@ -17,7 +18,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor
|
||||||
[Import]
|
[Import]
|
||||||
public VisualStudioWorkspace Workspace { get; set; }
|
public VisualStudioWorkspace Workspace { get; set; }
|
||||||
|
|
||||||
public async Task<IEnumerable<TagHelperDescriptor>> GetTagHelpersAsync(Project project)
|
public async Task<TagHelperResolutionResult> GetTagHelpersAsync(Project project)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -26,13 +27,14 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor
|
||||||
{
|
{
|
||||||
// The OOP host is turned off, so let's do this in process.
|
// The OOP host is turned off, so let's do this in process.
|
||||||
var resolver = new CodeAnalysis.Razor.DefaultTagHelperResolver(designTime: true);
|
var resolver = new CodeAnalysis.Razor.DefaultTagHelperResolver(designTime: true);
|
||||||
return await resolver.GetTagHelpersAsync(project, CancellationToken.None).ConfigureAwait(false);
|
var result = await resolver.GetTagHelpersAsync(project, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var session = await client.CreateSessionAsync(project.Solution))
|
using (var session = await client.CreateSessionAsync(project.Solution))
|
||||||
{
|
{
|
||||||
var results = await session.InvokeAsync<IEnumerable<TagHelperDescriptor>>("GetTagHelpersAsync", new object[] { project.Id.Id, "Foo", }).ConfigureAwait(false);
|
var result = await session.InvokeAsync<TagHelperResolutionResult>("GetTagHelpersAsync", new object[] { project.Id.Id, "Foo", }).ConfigureAwait(false);
|
||||||
return results;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,14 @@
|
||||||
// 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.
|
// 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 System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Razor.Evolution;
|
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.CodeAnalysis.Razor;
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.LanguageServices.Razor
|
namespace Microsoft.VisualStudio.LanguageServices.Razor
|
||||||
{
|
{
|
||||||
public interface ITagHelperResolver
|
public interface ITagHelperResolver
|
||||||
{
|
{
|
||||||
Task<IEnumerable<TagHelperDescriptor>> GetTagHelpersAsync(Project project);
|
Task<TagHelperResolutionResult> GetTagHelpersAsync(Project project);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,7 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo
|
||||||
var assemblies = await _assemblyResolver.GetRazorEngineAssembliesAsync(project);
|
var assemblies = await _assemblyResolver.GetRazorEngineAssembliesAsync(project);
|
||||||
|
|
||||||
var directives = await _directiveResolver.GetRazorEngineDirectivesAsync(_workspace, project);
|
var directives = await _directiveResolver.GetRazorEngineDirectivesAsync(_workspace, project);
|
||||||
var tagHelpers = await _tagHelperResolver.GetTagHelpersAsync(project);
|
var resolutionResult = await _tagHelperResolver.GetTagHelpersAsync(project);
|
||||||
|
|
||||||
var files = GetCshtmlDocuments(project);
|
var files = GetCshtmlDocuments(project);
|
||||||
|
|
||||||
|
|
@ -178,7 +178,7 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo
|
||||||
Assemblies = new ObservableCollection<AssemblyViewModel>(assemblies.Select(a => new AssemblyViewModel(a))),
|
Assemblies = new ObservableCollection<AssemblyViewModel>(assemblies.Select(a => new AssemblyViewModel(a))),
|
||||||
Directives = new ObservableCollection<DirectiveViewModel>(directives.Select(d => new DirectiveViewModel(d))),
|
Directives = new ObservableCollection<DirectiveViewModel>(directives.Select(d => new DirectiveViewModel(d))),
|
||||||
Documents = new ObservableCollection<DocumentViewModel>(documents.Select(d => new DocumentViewModel(d))),
|
Documents = new ObservableCollection<DocumentViewModel>(documents.Select(d => new DocumentViewModel(d))),
|
||||||
TagHelpers = new ObservableCollection<TagHelperViewModel>(tagHelpers.Select(t => new TagHelperViewModel(t))),
|
TagHelpers = new ObservableCollection<TagHelperViewModel>(resolutionResult.Descriptors.Select(t => new TagHelperViewModel(t))),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue