Don't add the tag helper provider by default

Since the default tag helper provider is used by MVC then MVC should
include it. Now that Blazor is in the mix we shouldn't include it for
all configurations.
This commit is contained in:
Ryan Nowak 2018-02-28 18:09:13 -08:00
parent 92c511b2b4
commit 989a6c699f
28 changed files with 405 additions and 326 deletions

View File

@ -4,6 +4,7 @@
using System;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.Extensions;
using Microsoft.CodeAnalysis.Razor;
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
{
@ -22,6 +23,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
FunctionsDirective.Register(builder);
InheritsDirective.Register(builder);
builder.Features.Add(new DefaultTagHelperDescriptorProvider());
// Register section directive with the 1.x compatible target extension.
builder.AddDirective(SectionDirective.Directive);
builder.Features.Add(new SectionDirectivePass());
@ -67,6 +70,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
FunctionsDirective.Register(builder);
InheritsDirective.Register(builder);
builder.Features.Add(new DefaultTagHelperDescriptorProvider());
// Register section directive with the 1.x compatible target extension.
builder.AddDirective(SectionDirective.Directive);
builder.Features.Add(new SectionDirectivePass());

View File

@ -11,10 +11,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
{
public sealed class ViewComponentTagHelperDescriptorProvider : RazorEngineFeatureBase, ITagHelperDescriptorProvider
{
// Hack for testability. The visitor will normally just no op if we're not referencing
// an appropriate version of MVC.
internal bool ForceEnabled { get; set; }
public int Order { get; set; }
public void Execute(TagHelperDescriptorProviderContext context)
@ -33,10 +29,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
var types = new List<INamedTypeSymbol>();
var visitor = ViewComponentTypeVisitor.Create(compilation, types);
if (ForceEnabled)
{
visitor.Enabled = true;
}
// We always visit the global namespace.
visitor.Visit(compilation.Assembly.GlobalNamespace);

View File

@ -18,22 +18,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
public static ViewComponentTypeVisitor Create(Compilation compilation, List<INamedTypeSymbol> results)
{
var enabled = false;
foreach (var reference in compilation.References)
{
var symbol = compilation.GetAssemblyOrModuleSymbol(reference) as IAssemblySymbol;
if (symbol != null)
{
if (string.Equals(symbol.Identity.Name, ViewComponentTypes.Assembly, StringComparison.Ordinal))
{
enabled = symbol.Identity.Version >= ViewComponentTypes.AssemblyVersion;
break;
}
}
}
var vcAttribute = enabled ? compilation.GetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute) : null;
var nonVCAttribute = enabled ? compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute) : null;
var vcAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.ViewComponentAttribute);
var nonVCAttribute = compilation.GetTypeByMetadataName(ViewComponentTypes.NonViewComponentAttribute);
return new ViewComponentTypeVisitor(vcAttribute, nonVCAttribute, results);
}

View File

@ -4,6 +4,7 @@
using System;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.Extensions;
using Microsoft.CodeAnalysis.Razor;
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{
@ -24,7 +25,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
FunctionsDirective.Register(builder);
InheritsDirective.Register(builder);
SectionDirective.Register(builder);
builder.Features.Add(new DefaultTagHelperDescriptorProvider());
builder.Features.Add(new ViewComponentTagHelperDescriptorProvider());
builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension());
@ -61,6 +63,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
InheritsDirective.Register(builder);
SectionDirective.Register(builder);
builder.Features.Add(new DefaultTagHelperDescriptorProvider());
builder.Features.Add(new ViewComponentTagHelperDescriptorProvider());
builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension());

View File

@ -11,10 +11,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{
public sealed class ViewComponentTagHelperDescriptorProvider : RazorEngineFeatureBase, ITagHelperDescriptorProvider
{
// Hack for testability. The visitor will normally just no op if we're not referencing
// an appropriate version of MVC.
internal bool ForceEnabled { get; set; }
public int Order { get; set; }
public void Execute(TagHelperDescriptorProviderContext context)
@ -33,10 +29,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
var types = new List<INamedTypeSymbol>();
var visitor = ViewComponentTypeVisitor.Create(compilation, types);
if (ForceEnabled)
{
visitor.Enabled = true;
}
// We always visit the global namespace.
visitor.Visit(compilation.Assembly.GlobalNamespace);

View File

@ -1,7 +1,6 @@
// 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;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
@ -29,12 +28,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
_viewComponentAttribute = viewComponentAttribute;
_nonViewComponentAttribute = nonViewComponentAttribute;
_results = results;
Enabled = _viewComponentAttribute != null;
}
public bool Enabled { get; set; }
public override void VisitNamedType(INamedTypeSymbol symbol)
{
if (IsViewComponent(symbol))
@ -63,7 +58,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
internal bool IsViewComponent(INamedTypeSymbol symbol)
{
if (!Enabled)
if (_viewComponentAttribute == null)
{
return false;
}

View File

@ -8,6 +8,10 @@ namespace Microsoft.AspNetCore.Razor.Language
{
public abstract class TagHelperDescriptorProviderContext
{
public virtual bool ExcludeHidden { get; set; }
public virtual bool IncludeDocumentation { get; set; }
public abstract ItemCollection Items { get; }
public abstract ICollection<TagHelperDescriptor> Results { get; }

View File

@ -41,6 +41,8 @@ namespace Microsoft.CodeAnalysis.Razor
var results = new List<TagHelperDescriptor>();
var context = TagHelperDescriptorProviderContext.Create(results);
context.ExcludeHidden = true;
context.IncludeDocumentation = true;
var compilation = await project.WorkspaceProject.GetCompilationAsync().ConfigureAwait(false);
context.SetCompilation(compilation);

View File

@ -28,9 +28,11 @@ namespace Microsoft.CodeAnalysis.Razor
.WithGlobalNamespaceStyle(SymbolDisplayGlobalNamespaceStyle.Omitted)
.WithMiscellaneousOptions(SymbolDisplayFormat.FullyQualifiedFormat.MiscellaneousOptions & (~SymbolDisplayMiscellaneousOptions.UseSpecialTypes));
public DefaultTagHelperDescriptorFactory(Compilation compilation, bool designTime)
public DefaultTagHelperDescriptorFactory(Compilation compilation, bool includeDocumentation, bool excludeHidden)
{
DesignTime = designTime;
IncludeDocumentation = includeDocumentation;
ExcludeHidden = excludeHidden;
_htmlAttributeNameAttributeSymbol = compilation.GetTypeByMetadataName(TagHelperTypes.HtmlAttributeNameAttribute);
_htmlAttributeNotBoundAttributeSymbol = compilation.GetTypeByMetadataName(TagHelperTypes.HtmlAttributeNotBoundAttribute);
_htmlTargetElementAttributeSymbol = compilation.GetTypeByMetadataName(TagHelperTypes.HtmlTargetElementAttribute);
@ -40,7 +42,9 @@ namespace Microsoft.CodeAnalysis.Razor
_iDictionarySymbol = compilation.GetTypeByMetadataName(TagHelperTypes.IDictionary);
}
protected bool DesignTime { get; }
protected bool ExcludeHidden { get; }
protected bool IncludeDocumentation { get; }
/// <inheritdoc />
public virtual TagHelperDescriptor CreateDescriptor(INamedTypeSymbol type)
@ -154,7 +158,7 @@ namespace Microsoft.CodeAnalysis.Razor
private void AddDocumentation(INamedTypeSymbol type, TagHelperDescriptorBuilder builder)
{
if (!DesignTime)
if (!IncludeDocumentation)
{
return;
}
@ -169,10 +173,6 @@ namespace Microsoft.CodeAnalysis.Razor
private void AddTagOutputHint(INamedTypeSymbol type, TagHelperDescriptorBuilder builder)
{
if (!DesignTime)
{
return;
}
string outputElementHint = null;
var outputElementHintAttribute = type.GetAttributes().Where(a => a.AttributeClass == _outputElementHintAttributeSymbol).FirstOrDefault();
if (outputElementHintAttribute != null)
@ -221,7 +221,7 @@ namespace Microsoft.CodeAnalysis.Razor
builder.IsEnum = true;
}
if (DesignTime)
if (IncludeDocumentation)
{
var xml = property.GetDocumentationCommentXml();
@ -416,7 +416,7 @@ namespace Microsoft.CodeAnalysis.Razor
private bool ShouldSkipDescriptorCreation(ISymbol symbol)
{
if (DesignTime)
if (ExcludeHidden)
{
var editorBrowsableAttribute = symbol.GetAttributes().Where(a => a.AttributeClass == _editorBrowsableAttributeSymbol).FirstOrDefault();

View File

@ -9,6 +9,10 @@ namespace Microsoft.CodeAnalysis.Razor
{
public sealed class DefaultTagHelperDescriptorProvider : RazorEngineFeatureBase, ITagHelperDescriptorProvider
{
[Obsolete(
"This property is obsolete will not be honored. Documentation will be included if " +
"TagHelperDescriptorProviderContext.IncludeDocumentation is set to true. Hidden tag helpers will" +
"be excluded from the results if TagHelperDescriptorProviderContext.ExcludeHidden is set to true.")]
public bool DesignTime { get; set; }
public int Order { get; set; }
@ -44,7 +48,7 @@ namespace Microsoft.CodeAnalysis.Razor
}
}
var factory = new DefaultTagHelperDescriptorFactory(compilation, DesignTime);
var factory = new DefaultTagHelperDescriptorFactory(compilation, context.IncludeDocumentation, context.ExcludeHidden);
for (var i = 0; i < types.Count; i++)
{
var descriptor = factory.CreateDescriptor(types[i]);

View File

@ -53,11 +53,7 @@ namespace Microsoft.CodeAnalysis.Razor
//
// Most notably, we are going to find the Tag Helpers using a compilation, and we have
// no editor settings.
Action<RazorProjectEngineBuilder> configure = (b) =>
{
b.Features.Add(new DefaultTagHelperDescriptorProvider() { DesignTime = true });
};
//
// The default configuration currently matches MVC-2.0. Beyond MVC-2.0 we added SDK support for
// properly detecting project versions, so that's a good version to assume when we can't find a
// configuration.
@ -68,7 +64,7 @@ namespace Microsoft.CodeAnalysis.Razor
// This will stop a crash from happening in this case (misconfigured project), but will still make
// it obvious to the user that something is wrong.
var factory = CreateFactory(configuration, factoryTypeName) ?? _fallbackFactory;
return factory.Create(configuration, RazorProjectFileSystem.Empty, configure);
return factory.Create(configuration, RazorProjectFileSystem.Empty, b => { });
}
private IProjectEngineFactory CreateFactory(RazorConfiguration configuration, string factoryTypeName)

View File

@ -36,10 +36,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
return Task.FromResult(TagHelperResolutionResult.Empty);
}
var engine = _engineFactory.Create(project, RazorProjectFileSystem.Empty, b =>
{
b.Features.Add(new DefaultTagHelperDescriptorProvider() { DesignTime = true, });
});
var engine = _engineFactory.Create(project, RazorProjectFileSystem.Empty, b => { });
return GetTagHelpersAsync(project, engine);
}
}

View File

@ -177,7 +177,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem.Rules {
Microsoft.Build.Framework.XamlTypes.Rule t = ((Microsoft.Build.Framework.XamlTypes.Rule)(ruleEnumerator.Current));
if (System.StringComparer.OrdinalIgnoreCase.Equals(t.Name, SchemaName)) {
unboundRule = t;
unboundRule.Name = "6ffb2641-19cd-4943-bc6d-446919acb77e";
unboundRule.Name = "a424c63f-67e5-4a8c-a436-92f3b3edfc9a";
RazorConfiguration.deserializedFallbackRule = unboundRule;
}
}

View File

@ -200,7 +200,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem.Rules {
Microsoft.Build.Framework.XamlTypes.Rule t = ((Microsoft.Build.Framework.XamlTypes.Rule)(ruleEnumerator.Current));
if (System.StringComparer.OrdinalIgnoreCase.Equals(t.Name, SchemaName)) {
unboundRule = t;
unboundRule.Name = "15acc140-184e-44be-a4d3-62505276a0bb";
unboundRule.Name = "5a884e7d-b817-44fa-af10-8ad97fe2e643";
RazorGeneral.deserializedFallbackRule = unboundRule;
}
}

View File

@ -4,7 +4,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.IntegrationTests;
@ -13,22 +12,22 @@ using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
using Microsoft.CodeAnalysis.Razor;
using Microsoft.Extensions.DependencyModel;
using Xunit;
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.IntegrationTests
{
public class CodeGenerationIntegrationTest : IntegrationTestBase
{
private const string CurrentMvcShim = "Microsoft.AspNetCore.Razor.Test.MvcShim.dll";
private static readonly RazorSourceDocument DefaultImports = MvcRazorTemplateEngine.GetDefaultImports();
private CSharpCompilation BaseCompilation => MvcShim.BaseCompilation.WithAssemblyName("AppCode");
#region Runtime
[Fact]
public void InvalidNamespaceAtEOF_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunRuntimeTest(references);
var compilation = BaseCompilation;
RunRuntimeTest(compilation);
}
[Fact]
@ -39,9 +38,9 @@ public class MyService<TModel>
{
public string Html { get; set; }
}";
var compilationReferences = CreateCompilationReferences(CurrentMvcShim, appCode);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(compilationReferences);
RunRuntimeTest(compilation);
}
[Fact]
@ -63,9 +62,9 @@ public class MyModel
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(references);
RunRuntimeTest(compilation);
}
[Fact]
@ -87,44 +86,50 @@ public class MyModel
{
}";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(references);
RunRuntimeTest(compilation);
}
[Fact]
public void MalformedPageDirective_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunRuntimeTest(references);
var compilation = BaseCompilation;
RunRuntimeTest(compilation);
}
[Fact]
public void Basic_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunRuntimeTest(references);
var compilation = BaseCompilation;
RunRuntimeTest(compilation);
}
[Fact]
public void Sections_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
using Microsoft.AspNetCore.Mvc.ViewFeatures;
public class InputTestTagHelper : {typeof(TagHelper).FullName}
{{
public ModelExpression For {{ get; set; }}
}}
");
RunRuntimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(compilation);
}
[Fact]
public void _ViewImports_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunRuntimeTest(references);
var compilation = BaseCompilation;
RunRuntimeTest(compilation);
}
[Fact]
@ -136,9 +141,9 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(references);
RunRuntimeTest(compilation);
}
[Fact]
@ -159,9 +164,9 @@ public class MyApp
{
public string MyProperty { get; set; }
}";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(references);
RunRuntimeTest(compilation);
}
[Fact]
@ -183,75 +188,81 @@ public class MyService<TModel>
public string Html { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(references);
RunRuntimeTest(compilation);
}
[Fact]
public void Model_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
var compilation = BaseCompilation;
RunRuntimeTest(references);
RunRuntimeTest(compilation);
}
[Fact]
public void ModelExpressionTagHelper_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
using Microsoft.AspNetCore.Mvc.ViewFeatures;
public class InputTestTagHelper : {typeof(TagHelper).FullName}
{{
public ModelExpression For {{ get; set; }}
}}
");
RunRuntimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(compilation);
}
[Fact]
public void RazorPages_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class DivTagHelper : {typeof(TagHelper).FullName}
{{
}}
");
RunRuntimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(compilation);
}
[Fact]
public void RazorPagesWithoutModel_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class DivTagHelper : {typeof(TagHelper).FullName}
{{
}}
");
RunRuntimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(compilation);
}
[Fact]
public void PageWithNamespace_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunRuntimeTest(references);
var compilation = BaseCompilation;
RunRuntimeTest(compilation);
}
[Fact]
public void ViewWithNamespace_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunRuntimeTest(references);
var compilation = BaseCompilation;
RunRuntimeTest(compilation);
}
[Fact]
public void ViewComponentTagHelper_Runtime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class TestViewComponent
{{
public string Invoke(string firstName)
@ -265,8 +276,11 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
{{
public string Bar {{ get; set; }}
}}
");
RunRuntimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunRuntimeTest(compilation);
}
#endregion
@ -274,8 +288,8 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
[Fact]
public void InvalidNamespaceAtEOF_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
@ -288,8 +302,9 @@ public class MyService<TModel>
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -312,8 +327,9 @@ public class MyModel
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -337,43 +353,47 @@ public abstract class MyPageModel<T> : Page
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void MalformedPageDirective_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
public void Basic_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
public void Sections_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
using Microsoft.AspNetCore.Mvc.ViewFeatures;
public class InputTestTagHelper : {typeof(TagHelper).FullName}
{{
public ModelExpression For {{ get; set; }}
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void _ViewImports_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
@ -385,8 +405,9 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -408,8 +429,9 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -431,15 +453,16 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void Model_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
@ -451,66 +474,74 @@ public class ThisShouldBeGenerated
}";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void ModelExpressionTagHelper_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
using Microsoft.AspNetCore.Mvc.ViewFeatures;
public class InputTestTagHelper : {typeof(TagHelper).FullName}
{{
public ModelExpression For {{ get; set; }}
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void RazorPages_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class DivTagHelper : {typeof(TagHelper).FullName}
{{
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void RazorPagesWithoutModel_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class DivTagHelper : {typeof(TagHelper).FullName}
{{
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void PageWithNamespace_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
public void ViewWithNamespace_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
public void ViewComponentTagHelper_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class TestViewComponent
{{
public string Invoke(string firstName)
@ -524,17 +555,22 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
{{
public string Bar {{ get; set; }}
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
#endregion
private void RunRuntimeTest(
IEnumerable<MetadataReference> compilationReferences,
CSharpCompilation baseCompilation,
IEnumerable<string> expectedErrors = null)
{
Assert.Empty(baseCompilation.GetDiagnostics());
// Arrange
var engine = CreateRuntimeEngine(compilationReferences);
var engine = CreateRuntimeEngine(baseCompilation);
var document = CreateCodeDocument();
// Act
@ -543,15 +579,17 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
// Assert
AssertDocumentNodeMatchesBaseline(document.GetDocumentIntermediateNode());
AssertCSharpDocumentMatchesBaseline(document.GetCSharpDocument());
AssertDocumentCompiles(document, compilationReferences, expectedErrors);
AssertDocumentCompiles(document, baseCompilation, expectedErrors);
}
private void RunDesignTimeTest(
IEnumerable<MetadataReference> compilationReferences,
CSharpCompilation baseCompilation,
IEnumerable<string> expectedErrors = null)
{
Assert.Empty(baseCompilation.GetDiagnostics());
// Arrange
var engine = CreateDesignTimeEngine(compilationReferences);
var engine = CreateDesignTimeEngine(baseCompilation);
var document = CreateCodeDocument();
// Act
@ -561,25 +599,21 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
AssertDocumentNodeMatchesBaseline(document.GetDocumentIntermediateNode());
AssertCSharpDocumentMatchesBaseline(document.GetCSharpDocument());
AssertSourceMappingsMatchBaseline(document);
AssertDocumentCompiles(document, compilationReferences, expectedErrors);
}
private static IEnumerable<MetadataReference> CreateCompilationReferences(string mvcShimName, string appCode = null)
{
var shimReferences = CreateMvcShimReferences(mvcShimName);
return CreateAppCodeReferences(appCode, shimReferences);
AssertDocumentCompiles(document, baseCompilation, expectedErrors);
}
private void AssertDocumentCompiles(
RazorCodeDocument document,
IEnumerable<MetadataReference> compilationReferences,
CSharpCompilation baseCompilation,
IEnumerable<string> expectedErrors = null)
{
var cSharp = document.GetCSharpDocument().GeneratedCode;
var syntaxTree = CSharpSyntaxTree.ParseText(cSharp);
var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = CSharpCompilation.Create("CodeGenerationTestAssembly", new[] { syntaxTree }, compilationReferences, options);
var references = baseCompilation.References.Concat(new[] { baseCompilation.ToMetadataReference() });
var compilation = CSharpCompilation.Create("CodeGenerationTestAssembly", new[] { syntaxTree }, references, options);
var diagnostics = compilation.GetDiagnostics();
@ -595,29 +629,29 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
}
}
protected RazorEngine CreateDesignTimeEngine(IEnumerable<MetadataReference> references)
protected RazorEngine CreateDesignTimeEngine(CSharpCompilation compilation)
{
var references = compilation.References.Concat(new[] { compilation.ToMetadataReference() });
return RazorEngine.CreateDesignTime(b =>
{
RazorExtensions.Register(b);
b.Features.Add(GetMetadataReferenceFeature(references));
b.Features.Add(new CompilationTagHelperFeature());
b.Features.Add(new DefaultTagHelperDescriptorProvider() { DesignTime = true });
b.Features.Add(new ViewComponentTagHelperDescriptorProvider() { ForceEnabled = true });
});
}
protected RazorEngine CreateRuntimeEngine(IEnumerable<MetadataReference> references)
protected RazorEngine CreateRuntimeEngine(CSharpCompilation compilation)
{
var references = compilation.References.Concat(new[] { compilation.ToMetadataReference() });
return RazorEngine.Create(b =>
{
RazorExtensions.Register(b);
b.Features.Add(GetMetadataReferenceFeature(references));
b.Features.Add(new CompilationTagHelperFeature());
b.Features.Add(new DefaultTagHelperDescriptorProvider() { DesignTime = true });
b.Features.Add(new ViewComponentTagHelperDescriptorProvider() { ForceEnabled = true });
});
}
@ -664,48 +698,5 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
References = references.ToList()
};
}
private static IEnumerable<MetadataReference> CreateAppCodeReferences(string appCode, IEnumerable<MetadataReference> shimReferences)
{
var references = new List<MetadataReference>(shimReferences);
if (appCode != null)
{
var appCodeSyntaxTrees = new List<SyntaxTree> { CSharpSyntaxTree.ParseText(appCode) };
var compilation = CSharpCompilation.Create(
"AppCode",
appCodeSyntaxTrees,
shimReferences,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
var stream = new MemoryStream();
var compilationResult = compilation.Emit(stream, options: new EmitOptions());
stream.Position = 0;
var diagString = string.Join(";", compilationResult.Diagnostics.Where(s => s.Severity == DiagnosticSeverity.Error).Select(s => s.ToString()));
Assert.True(compilationResult.Success, string.Format("Application code needed for tests didn't compile!: {0}", diagString));
references.Add(MetadataReference.CreateFromStream(stream));
}
return references;
}
private static IEnumerable<MetadataReference> CreateMvcShimReferences(string mvcShimName)
{
var dllPath = Path.Combine(Directory.GetCurrentDirectory(), mvcShimName);
var assembly = Assembly.LoadFile(dllPath);
var assemblyDependencyContext = DependencyContext.Load(assembly);
var assemblyReferencePaths = assemblyDependencyContext.CompileLibraries.SelectMany(l => l.ResolveReferencePaths());
var references = assemblyReferencePaths
.Select(assemblyPath => MetadataReference.CreateFromFile(assemblyPath))
.ToList<MetadataReference>();
Assert.NotEmpty(references);
return references;
}
}
}

View File

@ -0,0 +1,45 @@
// 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.IO;
using System.Reflection;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{
internal static class MvcShim
{
public static readonly string AssemblyName = "Microsoft.AspNetCore.Razor.Test.MvcShim";
private static Assembly _assembly;
private static CSharpCompilation _baseCompilation;
public static Assembly Assembly
{
get
{
if (_assembly == null)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), AssemblyName + ".dll");
_assembly = Assembly.LoadFrom(filePath);
}
return _assembly;
}
}
public static CSharpCompilation BaseCompilation
{
get
{
if (_baseCompilation == null)
{
_baseCompilation = TestCompilation.Create(Assembly);
}
return _baseCompilation;
}
}
}
}

View File

@ -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.IO;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Razor.Language;
@ -14,8 +15,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
// This is just a basic integration test. There are detailed tests for the VCTH visitor and descriptor factory.
public class ViewComponentTagHelperDescriptorProviderTest
{
private static readonly Assembly _assembly = typeof(ViewComponentTagHelperDescriptorProviderTest).GetTypeInfo().Assembly;
[Fact]
public void DescriptorProvider_FindsVCTH()
{
@ -27,15 +26,14 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
}
";
var testCompilation = TestCompilation.Create(_assembly, CSharpSyntaxTree.ParseText(code));
var compilation = MvcShim.BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(code));
var context = TagHelperDescriptorProviderContext.Create();
context.SetCompilation(testCompilation);
context.SetCompilation(compilation);
var provider = new ViewComponentTagHelperDescriptorProvider()
{
Engine = RazorEngine.CreateEmpty(b => { }),
ForceEnabled = true,
};
var expectedDescriptor = TagHelperDescriptorBuilder.Create(
@ -68,8 +66,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
provider.Execute(context);
// Assert
var descriptor = context.Results.FirstOrDefault(d => TagHelperDescriptorComparer.CaseSensitive.Equals(d, expectedDescriptor));
Assert.NotNull(descriptor);
Assert.Single(context.Results, d => TagHelperDescriptorComparer.CaseSensitive.Equals(d, expectedDescriptor));
}
}
}

View File

@ -20,14 +20,15 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.IntegrationTests
{
public class CodeGenerationIntegrationTest : IntegrationTestBase
{
private const string CurrentMvcShim = "Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.dll";
private static readonly RazorSourceDocument DefaultImports = MvcRazorTemplateEngine.GetDefaultImports();
private CSharpCompilation BaseCompilation => MvcShim.BaseCompilation.WithAssemblyName("AppCode");
[Fact]
public void InvalidNamespaceAtEOF_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
@ -40,8 +41,8 @@ public class MyService<TModel>
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -64,8 +65,8 @@ public class MyModel
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -89,36 +90,39 @@ public class MyModel
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void Basic_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
public void Sections_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
using Microsoft.AspNetCore.Mvc.ViewFeatures;
public class InputTestTagHelper : {typeof(TagHelper).FullName}
{{
public ModelExpression For {{ get; set; }}
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void _ViewImports_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
@ -130,8 +134,8 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -153,8 +157,8 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
@ -176,15 +180,15 @@ public class MyApp
public string MyProperty { get; set; }
}
";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void Model_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim);
RunDesignTimeTest(references);
var compilation = BaseCompilation;
RunDesignTimeTest(compilation);
}
[Fact]
@ -196,28 +200,30 @@ public class ThisShouldBeGenerated
}";
var references = CreateCompilationReferences(CurrentMvcShim, appCode);
RunDesignTimeTest(references);
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void ModelExpressionTagHelper_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
using Microsoft.AspNetCore.Mvc.ViewFeatures;
public class InputTestTagHelper : {typeof(TagHelper).FullName}
{{
public ModelExpression For {{ get; set; }}
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
[Fact]
public void ViewComponentTagHelper_DesignTime()
{
var references = CreateCompilationReferences(CurrentMvcShim, appCode: $@"
var appCode = $@"
public class TestViewComponent
{{
public string Invoke(string firstName)
@ -231,16 +237,21 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
{{
public string Bar {{ get; set; }}
}}
");
RunDesignTimeTest(references);
";
var compilation = BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(appCode));
RunDesignTimeTest(compilation);
}
private void RunDesignTimeTest(
IEnumerable<MetadataReference> compilationReferences,
CSharpCompilation baseCompilation,
IEnumerable<string> expectedErrors = null)
{
Assert.Empty(baseCompilation.GetDiagnostics());
// Arrange
var engine = CreateDesignTimeEngine(compilationReferences);
var engine = CreateDesignTimeEngine(baseCompilation);
var document = CreateCodeDocument();
// Act
@ -250,25 +261,21 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
AssertDocumentNodeMatchesBaseline(document.GetDocumentIntermediateNode());
AssertCSharpDocumentMatchesBaseline(document.GetCSharpDocument());
AssertSourceMappingsMatchBaseline(document);
AssertDocumentCompiles(document, compilationReferences, expectedErrors);
}
private static IEnumerable<MetadataReference> CreateCompilationReferences(string mvcShimName, string appCode = null)
{
var shimReferences = CreateMvcShimReferences(mvcShimName);
return CreateAppCodeReferences(appCode, shimReferences);
AssertDocumentCompiles(document, baseCompilation, expectedErrors);
}
private void AssertDocumentCompiles(
RazorCodeDocument document,
IEnumerable<MetadataReference> compilationReferences,
CSharpCompilation baseCompilation,
IEnumerable<string> expectedErrors = null)
{
var cSharp = document.GetCSharpDocument().GeneratedCode;
var syntaxTree = CSharpSyntaxTree.ParseText(cSharp);
var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = CSharpCompilation.Create("CodeGenerationTestAssembly", new[] { syntaxTree }, compilationReferences, options);
var references = baseCompilation.References.Concat(new[] { baseCompilation.ToMetadataReference() });
var compilation = CSharpCompilation.Create("CodeGenerationTestAssembly", new[] { syntaxTree }, references, options);
var diagnostics = compilation.GetDiagnostics();
@ -284,8 +291,10 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
}
}
protected RazorEngine CreateDesignTimeEngine(IEnumerable<MetadataReference> references)
protected RazorEngine CreateDesignTimeEngine(CSharpCompilation compilation)
{
var references = compilation.References.Concat(new[] { compilation.ToMetadataReference() });
return RazorEngine.CreateDesignTime(b =>
{
RazorExtensions.Register(b);
@ -293,8 +302,6 @@ public class AllTagHelper : {typeof(TagHelper).FullName}
b.Features.Add(GetMetadataReferenceFeature(references));
b.Features.Add(new CompilationTagHelperFeature());
b.Features.Add(new DefaultTagHelperDescriptorProvider() { DesignTime = true });
b.Features.Add(new ViewComponentTagHelperDescriptorProvider() { ForceEnabled = true });
});
}

View File

@ -0,0 +1,45 @@
// 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.IO;
using System.Reflection;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{
internal static class MvcShim
{
public static readonly string AssemblyName = "Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X";
private static Assembly _assembly;
private static CSharpCompilation _baseCompilation;
public static Assembly Assembly
{
get
{
if (_assembly == null)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), AssemblyName + ".dll");
_assembly = Assembly.LoadFrom(filePath);
}
return _assembly;
}
}
public static CSharpCompilation BaseCompilation
{
get
{
if (_baseCompilation == null)
{
_baseCompilation = TestCompilation.Create(Assembly);
}
return _baseCompilation;
}
}
}
}

View File

@ -14,8 +14,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
// This is just a basic integration test. There are detailed tests for the VCTH visitor and descriptor factory.
public class ViewComponentTagHelperDescriptorProviderTest
{
private static readonly Assembly _assembly = typeof(ViewComponentTagHelperDescriptorProviderTest).GetTypeInfo().Assembly;
[Fact]
public void DescriptorProvider_FindsVCTH()
{
@ -27,15 +25,14 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
}
";
var testCompilation = TestCompilation.Create(_assembly, CSharpSyntaxTree.ParseText(code));
var compilation = MvcShim.BaseCompilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(code));
var context = TagHelperDescriptorProviderContext.Create();
context.SetCompilation(testCompilation);
context.SetCompilation(compilation);
var provider = new ViewComponentTagHelperDescriptorProvider()
{
Engine = RazorEngine.CreateEmpty(b => { }),
ForceEnabled = true,
};
var expectedDescriptor = TagHelperDescriptorBuilder.Create(
@ -68,8 +65,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X
provider.Execute(context);
// Assert
var descriptor = context.Results.FirstOrDefault(d => TagHelperDescriptorComparer.CaseSensitive.Equals(d, expectedDescriptor));
Assert.NotNull(descriptor);
Assert.Single(context.Results, d => TagHelperDescriptorComparer.CaseSensitive.Equals(d, expectedDescriptor));
}
}
}

View File

@ -32,7 +32,7 @@ namespace Microsoft.CodeAnalysis
public static string AssemblyName => "TestAssembly";
public static Compilation Create(Assembly assembly, SyntaxTree syntaxTree = null)
public static CSharpCompilation Create(Assembly assembly, SyntaxTree syntaxTree = null)
{
IEnumerable<SyntaxTree> syntaxTrees = null;
@ -47,7 +47,7 @@ namespace Microsoft.CodeAnalysis
_referenceCache.TryAdd(assembly, metadataReferences);
}
var compilation = CSharpCompilation.Create(AssemblyName, syntaxTrees, metadataReferences);
var compilation = CSharpCompilation.Create(AssemblyName, syntaxTrees, metadataReferences, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
EnsureValidCompilation(compilation);

View File

@ -0,0 +1,11 @@
// 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;
namespace Microsoft.AspNetCore.Mvc
{
public sealed class ViewComponentAttribute : Attribute
{
}
}

View File

@ -0,0 +1,11 @@
// 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;
namespace Microsoft.AspNetCore.Mvc
{
public sealed class ViewComponentAttribute : Attribute
{
}
}

View File

@ -392,7 +392,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -443,7 +443,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -499,7 +499,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -559,7 +559,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -734,7 +734,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime, designTime);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -931,7 +931,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -968,7 +968,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
string expectedAttributeName)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -1005,7 +1005,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(validProperty2.Name)
.TypeName(validProperty2.PropertyType.FullName),
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(OverriddenAttributeTagHelper).FullName);
// Act
@ -1039,7 +1039,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(validProperty2.Name)
.TypeName(validProperty2.PropertyType.FullName),
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(InheritedOverriddenAttributeTagHelper).FullName);
// Act
@ -1073,7 +1073,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(validProperty2.Name)
.TypeName(validProperty2.PropertyType.FullName),
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(InheritedNotOverriddenAttributeTagHelper).FullName);
// Act
@ -1098,7 +1098,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(nameof(InheritedSingleAttributeTagHelper.IntAttribute))
.TypeName(typeof(int).FullName)
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(InheritedSingleAttributeTagHelper).FullName);
// Act
@ -1124,7 +1124,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(intProperty.Name)
.TypeName(intProperty.PropertyType.FullName)
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(SingleAttributeTagHelper).FullName);
// Act
@ -1151,7 +1151,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(validProperty.Name)
.TypeName(validProperty.PropertyType.FullName)
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(MissingAccessorTagHelper).FullName);
// Act
@ -1178,7 +1178,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(validProperty.Name)
.TypeName(validProperty.PropertyType.FullName)
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(NonPublicAccessorTagHelper).FullName);
// Act
@ -1203,7 +1203,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(nameof(NotBoundAttributeTagHelper.BoundProperty))
.TypeName(typeof(object).FullName)
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(NotBoundAttributeTagHelper).FullName);
// Act
@ -1234,7 +1234,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
builder => builder.RequireTagName("p"),
builder => builder.RequireTagName("div"),
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(MultiTagTagHelper).FullName);
// Act
@ -1260,7 +1260,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
.PropertyName(validProp.Name)
.TypeName(validProp.PropertyType.FullName),
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(InheritedMultiTagTagHelper).FullName);
// Act
@ -1284,7 +1284,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
builder => builder.RequireTagName("div"),
});
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(DuplicateTagNameTagHelper).FullName);
// Act
@ -1303,7 +1303,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
"data-condition",
typeof(OverrideNameTagHelper).FullName,
AssemblyName);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(OverrideNameTagHelper).FullName);
// Act
@ -1345,7 +1345,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var attribute = tagHelperType.GetAttributes().Single();
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1366,21 +1366,21 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
{
// name, expectedNames
return new TheoryData<string, IEnumerable<string>>
{
{ "p", new[] { "p" } },
{ " p", new[] { "p" } },
{ "p ", new[] { "p" } },
{ " p ", new[] { "p" } },
{ "p,div", new[] { "p", "div" } },
{ " p,div", new[] { "p", "div" } },
{ "p ,div", new[] { "p", "div" } },
{ " p ,div", new[] { "p", "div" } },
{ "p, div", new[] { "p", "div" } },
{ "p,div ", new[] { "p", "div" } },
{ "p, div ", new[] { "p", "div" } },
{ " p, div ", new[] { "p", "div" } },
{ " p , div ", new[] { "p", "div" } },
};
{
{ "p", new[] { "p" } },
{ " p", new[] { "p" } },
{ "p ", new[] { "p" } },
{ " p ", new[] { "p" } },
{ "p,div", new[] { "p", "div" } },
{ " p,div", new[] { "p", "div" } },
{ "p ,div", new[] { "p", "div" } },
{ " p ,div", new[] { "p", "div" } },
{ "p, div", new[] { "p", "div" } },
{ "p,div ", new[] { "p", "div" } },
{ "p, div ", new[] { "p", "div" } },
{ " p, div ", new[] { "p", "div" } },
{ " p , div ", new[] { "p", "div" } },
};
}
}
@ -1477,7 +1477,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
IEnumerable<BoundAttributeDescriptor> expectedAttributeDescriptors)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(type.FullName);
// Act
@ -1527,7 +1527,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1567,7 +1567,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1610,7 +1610,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1656,7 +1656,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1698,7 +1698,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1739,7 +1739,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var tagHelperType = compilation.GetTypeByMetadataName("DynamicTestTagHelper");
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: false, excludeHidden: false);
// Act
var descriptor = factory.CreateDescriptor(tagHelperType);
@ -1754,7 +1754,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
{
// Arrange
var objectAssemblyName = typeof(Enumerable).GetTypeInfo().Assembly.GetName().Name;
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(typeof(Enumerable).FullName);
var expectedDescriptor =
CreateTagHelperDescriptor("enumerable", "System.Linq.Enumerable", typeSymbol.ContainingAssembly.Identity.Name);
@ -2010,7 +2010,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
IEnumerable<RazorDiagnostic> expectedDiagnostics)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: false);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -2069,12 +2069,12 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
[Theory]
[MemberData(nameof(TagOutputHintData))]
public void CreateDescriptor_CreatesDesignTimeDescriptorsWithOutputElementHint(
public void CreateDescriptor_CreatesDescriptorsWithOutputElementHint(
Type tagHelperType,
TagHelperDescriptor expectedDescriptor)
{
// Arrange
var factory = new DefaultTagHelperDescriptorFactory(Compilation, designTime: true);
var factory = new DefaultTagHelperDescriptorFactory(Compilation, includeDocumentation: false, excludeHidden: false);
var typeSymbol = Compilation.GetTypeByMetadataName(tagHelperType.FullName);
// Act
@ -2102,7 +2102,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
{
}");
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: true);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: true, excludeHidden: false);
var typeSymbol = compilation.GetTypeByMetadataName("DocumentedTagHelper");
var expectedDocumentation =
@"<member name=""T:DocumentedTagHelper"">
@ -2151,7 +2151,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces
public List<bool> RemarksAndSummaryProperty { get; set; }
}");
var compilation = TestCompilation.Create(_assembly, syntaxTree);
var factory = new DefaultTagHelperDescriptorFactory(compilation, designTime: true);
var factory = new DefaultTagHelperDescriptorFactory(compilation, includeDocumentation: true, excludeHidden: false);
var typeSymbol = compilation.GetTypeByMetadataName("DocumentedTagHelper");
var expectedDocumentations = new[]
{

View File

@ -18,11 +18,10 @@ namespace Microsoft.CodeAnalysis.Razor
// Arrange
var editorBrowsableTypeName = "Microsoft.CodeAnalysis.Razor.Workspaces.Test.EditorBrowsableTagHelper";
var compilation = TestCompilation.Create(_assembly);
var descriptorProvider = new DefaultTagHelperDescriptorProvider()
{
DesignTime = true,
};
var descriptorProvider = new DefaultTagHelperDescriptorProvider();
var context = TagHelperDescriptorProviderContext.Create();
context.ExcludeHidden = true;
// Act
descriptorProvider.Execute(context);

View File

@ -187,6 +187,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
// Assert
Assert.Single(engine.Engine.Features.OfType<MyCoolNewFeature>());
Assert.Single(engine.Engine.Features.OfType<DefaultTagHelperDescriptorProvider>());
Assert.Single(engine.Engine.Features.OfType<MvcLatest.ViewComponentTagHelperDescriptorProvider>());
Assert.Single(engine.Engine.Features.OfType<MvcLatest.MvcViewDocumentClassifierPass>());
Assert.Single(engine.Engine.Features.OfType<MvcLatest.ViewComponentTagHelperPass>());