From 03f39753603234a3dd59620ad4e4b6a8c78a854f Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 17 May 2017 16:44:45 -0700 Subject: [PATCH 1/2] Allow directive string tokens to be colorized. - Without a directive string token having a `SpanKind.Code` it cannot have any sort of C# coloring associated with it. - Updated tests to reflect new `SpanKind` expectations. #1269 --- .../Legacy/CSharpCodeParser.cs | 9 +------ .../Legacy/CSharpDirectivesTest.cs | 24 +++++++++---------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs index e48004e4e6..7d46c3f7f6 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs @@ -1559,7 +1559,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy return; } - var outputKind = SpanKind.Markup; switch (tokenDescriptor.Kind) { case DirectiveTokenKind.Type: @@ -1572,8 +1571,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy return; } - - outputKind = SpanKind.Code; break; case DirectiveTokenKind.Namespace: @@ -1586,8 +1583,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy return; } - - outputKind = SpanKind.Code; break; case DirectiveTokenKind.Member: @@ -1603,8 +1598,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy CurrentSymbol.Content.Length); return; } - - outputKind = SpanKind.Code; break; case DirectiveTokenKind.String: @@ -1624,7 +1617,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy } Span.ChunkGenerator = new DirectiveTokenChunkGenerator(tokenDescriptor); - Output(outputKind, AcceptedCharacters.NonWhiteSpace); + Output(SpanKind.Code, AcceptedCharacters.NonWhiteSpace); } AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true)); diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs index ee598cf1a3..a11b339e4f 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs @@ -120,7 +120,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"AString\"", markup: false) + Factory.Span(SpanKind.Code, "\"AString\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace))); } @@ -255,7 +255,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy .Accepts(AcceptedCharacters.NonWhiteSpace), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"AString\"", markup: false) + Factory.Span(SpanKind.Code, "\"AString\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[2])) .Accepts(AcceptedCharacters.NonWhiteSpace))); } @@ -278,7 +278,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"Header\"", markup: false) + Factory.Span(SpanKind.Code, "\"Header\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), @@ -314,7 +314,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"Name\"", markup: false) + Factory.Span(SpanKind.Code, "\"Name\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), @@ -401,7 +401,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"hello\"", markup: false) + Factory.Span(SpanKind.Code, "\"hello\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace), Factory.Span(SpanKind.Markup, " ; ", markup: false).Accepts(AcceptedCharacters.WhiteSpace))); @@ -430,7 +430,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"hello\"", markup: false) + Factory.Span(SpanKind.Code, "\"hello\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace), @@ -461,7 +461,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"Hello\"", markup: false) + Factory.Span(SpanKind.Code, "\"Hello\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace), @@ -492,7 +492,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"Hello\"", markup: false) + Factory.Span(SpanKind.Code, "\"Hello\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace)), expectedErorr); @@ -521,7 +521,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"Hello\"", markup: false) + Factory.Span(SpanKind.Code, "\"Hello\"", markup: false) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) .Accepts(AcceptedCharacters.NonWhiteSpace), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), @@ -979,7 +979,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"simple-value\"", markup: false) + Factory.Span(SpanKind.Code, "\"simple-value\"", markup: false) .Accepts(AcceptedCharacters.NonWhiteSpace) .With(chunkGenerator))); } @@ -1004,7 +1004,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"{formaction}?/{id}?\"", markup: false) + Factory.Span(SpanKind.Code, "\"{formaction}?/{id}?\"", markup: false) .Accepts(AcceptedCharacters.NonWhiteSpace) .With(chunkGenerator))); } @@ -1027,7 +1027,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Markup, "\"{formaction}?/{id}?\"", markup: false) + Factory.Span(SpanKind.Code, "\"{formaction}?/{id}?\"", markup: false) .Accepts(AcceptedCharacters.NonWhiteSpace) .With(new DirectiveTokenChunkGenerator(descriptor.Tokens.First())), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), From 4c98b7f8f3a55648267aca5c727a1c017c7467f8 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 18 May 2017 11:49:56 -0700 Subject: [PATCH 2/2] Make ViewComponentTagHelper's display name nicer. - Went from `__Generated__SomeViewComponentTagHelper` to `SomeViewComponentTagHelper`. - Updated `TagHelperDescriptorBuilder` to allow setting of `DisplayName`. - Added `TagHelperDescriptorBuilderTest` class to verify new `DisplayName` additions. - Updated `ViewComponentTagHelperDescriptorFactoryTest` expectations. #1251 --- .../TagHelperDescriptorBuilder.cs | 16 +++++++- ...ViewComponentTagHelperDescriptorFactory.cs | 6 ++- .../TagHelperDescriptorBuilderTest.cs | 38 +++++++++++++++++++ ...ComponentTagHelperDescriptorFactoryTest.cs | 6 ++- 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperDescriptorBuilderTest.cs diff --git a/src/Microsoft.AspNetCore.Razor.Language/TagHelperDescriptorBuilder.cs b/src/Microsoft.AspNetCore.Razor.Language/TagHelperDescriptorBuilder.cs index 8da0776897..ed341a9e36 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/TagHelperDescriptorBuilder.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/TagHelperDescriptorBuilder.cs @@ -16,6 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language private static ICollection InvalidNonWhitespaceAllowedChildCharacters { get; } = new HashSet( new[] { '@', '!', '<', '/', '?', '[', '>', ']', '=', '"', '\'', '*' }); + private string _displayName; private string _documentation; private string _tagOutputHint; private HashSet _allowedChildTags; @@ -29,6 +30,7 @@ namespace Microsoft.AspNetCore.Razor.Language private TagHelperDescriptorBuilder(string typeName, string assemblyName) { _typeName = typeName; + _displayName = _typeName; _assemblyName = assemblyName; _metadata = new Dictionary(StringComparer.Ordinal); } @@ -133,6 +135,18 @@ namespace Microsoft.AspNetCore.Razor.Language return this; } + public TagHelperDescriptorBuilder DisplayName(string displayName) + { + if (displayName == null) + { + throw new ArgumentNullException(nameof(displayName)); + } + + _displayName = displayName; + + return this; + } + public TagHelperDescriptor Build() { var validationDiagnostics = Validate(); @@ -146,7 +160,7 @@ namespace Microsoft.AspNetCore.Razor.Language _typeName, _assemblyName, _typeName /* Name */, - _typeName /* DisplayName */, + _displayName, _documentation, _tagOutputHint, _tagMatchingRules ?? Enumerable.Empty(), diff --git a/src/Microsoft.CodeAnalysis.Razor/ViewComponentTagHelperDescriptorFactory.cs b/src/Microsoft.CodeAnalysis.Razor/ViewComponentTagHelperDescriptorFactory.cs index 52c6902afa..09712d46a9 100644 --- a/src/Microsoft.CodeAnalysis.Razor/ViewComponentTagHelperDescriptorFactory.cs +++ b/src/Microsoft.CodeAnalysis.Razor/ViewComponentTagHelperDescriptorFactory.cs @@ -35,9 +35,11 @@ namespace Microsoft.CodeAnalysis.Razor var shortName = GetShortName(type); var tagName = $"vc:{DefaultTagHelperDescriptorFactory.ToHtmlCase(shortName)}"; var typeName = $"__Generated__{shortName}ViewComponentTagHelper"; - var descriptorBuilder = TagHelperDescriptorBuilder.Create(typeName, assemblyName); + var displayName = shortName + "ViewComponentTagHelper"; var methodParameters = GetInvokeMethodParameters(type); - descriptorBuilder.TagMatchingRule(ruleBuilder => + var descriptorBuilder = TagHelperDescriptorBuilder.Create(typeName, assemblyName) + .DisplayName(displayName) + .TagMatchingRule(ruleBuilder => { ruleBuilder.RequireTagName(tagName); AddRequiredAttributes(methodParameters, ruleBuilder); diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperDescriptorBuilderTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperDescriptorBuilderTest.cs new file mode 100644 index 0000000000..37eef5fbfa --- /dev/null +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperDescriptorBuilderTest.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 Xunit; + +namespace Microsoft.AspNetCore.Razor.Language +{ + public class TagHelperDescriptorBuilderTest + { + [Fact] + public void DisplayName_SetsDescriptorsDisplayName() + { + // Arrange + var expectedDisplayName = "ExpectedDisplayName"; + var builder = TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly"); + + // Act + var descriptor = builder.DisplayName(expectedDisplayName).Build(); + + // Assert + Assert.Equal(expectedDisplayName, descriptor.DisplayName); + } + + [Fact] + public void DisplayName_DefaultsToTypeName() + { + // Arrange + var expectedDisplayName = "TestTagHelper"; + var builder = TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly"); + + // Act + var descriptor = builder.Build(); + + // Assert + Assert.Equal(expectedDisplayName, descriptor.DisplayName); + } + } +} diff --git a/test/Microsoft.CodeAnalysis.Razor.Test/ViewComponentTagHelperDescriptorFactoryTest.cs b/test/Microsoft.CodeAnalysis.Razor.Test/ViewComponentTagHelperDescriptorFactoryTest.cs index 35a39901a2..0c50aa9661 100644 --- a/test/Microsoft.CodeAnalysis.Razor.Test/ViewComponentTagHelperDescriptorFactoryTest.cs +++ b/test/Microsoft.CodeAnalysis.Razor.Test/ViewComponentTagHelperDescriptorFactoryTest.cs @@ -1,11 +1,10 @@ // 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 Microsoft.AspNetCore.Razor.Language; using System.Collections.Generic; using System.Reflection; +using Microsoft.AspNetCore.Razor.Language; using Xunit; -using Microsoft.AspNetCore.Razor.Language.Legacy; namespace Microsoft.CodeAnalysis.Razor.Workspaces { @@ -21,6 +20,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces var expectedDescriptor = TagHelperDescriptorBuilder.Create( "__Generated__StringParameterViewComponentTagHelper", typeof(StringParameterViewComponent).GetTypeInfo().Assembly.GetName().Name) + .DisplayName("StringParameterViewComponentTagHelper") .TagMatchingRule(rule => rule .RequireTagName("vc:string-parameter") @@ -56,6 +56,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces var expectedDescriptor = TagHelperDescriptorBuilder.Create( "__Generated__VariousParameterViewComponentTagHelper", typeof(VariousParameterViewComponent).GetTypeInfo().Assembly.GetName().Name) + .DisplayName("VariousParameterViewComponentTagHelper") .TagMatchingRule(rule => rule .RequireTagName("vc:various-parameter") @@ -98,6 +99,7 @@ namespace Microsoft.CodeAnalysis.Razor.Workspaces var expectedDescriptor = TagHelperDescriptorBuilder.Create( "__Generated__GenericParameterViewComponentTagHelper", typeof(GenericParameterViewComponent).GetTypeInfo().Assembly.GetName().Name) + .DisplayName("GenericParameterViewComponentTagHelper") .TagMatchingRule(rule => rule .RequireTagName("vc:generic-parameter")