Add DisplayName and Description for directives

Renamed Name -> Directive so that it doesn't overlap with DisplayName.
This commit is contained in:
Ryan Nowak 2017-06-06 13:25:26 -07:00
parent 1dfe37b55a
commit 95c5049dd0
17 changed files with 221 additions and 106 deletions

View File

@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{ {
ModelDirectives.Add(node); ModelDirectives.Add(node);
} }
else if (node.Descriptor.Name == "inherits") else if (node.Descriptor.Directive == "inherits")
{ {
InheritsDirectives.Add(node); InheritsDirectives.Add(node);
} }

View File

@ -99,15 +99,15 @@ namespace Microsoft.AspNetCore.Razor.Language
public override void VisitDirective(DirectiveIRNode node) public override void VisitDirective(DirectiveIRNode node)
{ {
if (string.Equals(node.Name, CSharpCodeParser.FunctionsDirectiveDescriptor.Name, StringComparison.Ordinal)) if (string.Equals(node.Name, CSharpCodeParser.FunctionsDirectiveDescriptor.Directive, StringComparison.Ordinal))
{ {
FunctionsDirectiveNodes.Add(node); FunctionsDirectiveNodes.Add(node);
} }
else if (string.Equals(node.Name, CSharpCodeParser.InheritsDirectiveDescriptor.Name, StringComparison.Ordinal)) else if (string.Equals(node.Name, CSharpCodeParser.InheritsDirectiveDescriptor.Directive, StringComparison.Ordinal))
{ {
InheritsDirectiveNodes.Add(node); InheritsDirectiveNodes.Add(node);
} }
else if (string.Equals(node.Name, CSharpCodeParser.SectionDirectiveDescriptor.Name, StringComparison.Ordinal)) else if (string.Equals(node.Name, CSharpCodeParser.SectionDirectiveDescriptor.Directive, StringComparison.Ordinal))
{ {
SectionDirectiveNodes.Add(node); SectionDirectiveNodes.Add(node);
} }

View File

@ -55,7 +55,7 @@ namespace Microsoft.AspNetCore.Razor.Language
if (_nestedLevel > 0) if (_nestedLevel > 0)
{ {
var directiveStart = block.Children.First(child => !child.IsBlock && ((Span)child).Kind == SpanKindInternal.Transition).Start; var directiveStart = block.Children.First(child => !child.IsBlock && ((Span)child).Kind == SpanKindInternal.Transition).Start;
var errorLength = /* @ */ 1 + CSharpCodeParser.SectionDirectiveDescriptor.Name.Length; var errorLength = /* @ */ 1 + CSharpCodeParser.SectionDirectiveDescriptor.Directive.Length;
_errorSink.OnError( _errorSink.OnError(
directiveStart, directiveStart,
LegacyResources.FormatParseError_Sections_Cannot_Be_Nested(LegacyResources.SectionExample_CS), LegacyResources.FormatParseError_Sections_Cannot_Be_Nested(LegacyResources.SectionExample_CS),

View File

@ -116,7 +116,7 @@ namespace Microsoft.AspNetCore.Razor.Language
{ {
_builder.Push(new DirectiveIRNode() _builder.Push(new DirectiveIRNode()
{ {
Name = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Name, Name = CSharpCodeParser.AddTagHelperDirectiveDescriptor.Directive,
Descriptor = CSharpCodeParser.AddTagHelperDirectiveDescriptor, Descriptor = CSharpCodeParser.AddTagHelperDirectiveDescriptor,
Source = BuildSourceSpanFromNode(span), Source = BuildSourceSpanFromNode(span),
}); });
@ -135,7 +135,7 @@ namespace Microsoft.AspNetCore.Razor.Language
{ {
_builder.Push(new DirectiveIRNode() _builder.Push(new DirectiveIRNode()
{ {
Name = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Name, Name = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor.Directive,
Descriptor = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor, Descriptor = CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
Source = BuildSourceSpanFromNode(span), Source = BuildSourceSpanFromNode(span),
}); });
@ -154,7 +154,7 @@ namespace Microsoft.AspNetCore.Razor.Language
{ {
_builder.Push(new DirectiveIRNode() _builder.Push(new DirectiveIRNode()
{ {
Name = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Name, Name = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor.Directive,
Descriptor = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor, Descriptor = CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
Source = BuildSourceSpanFromNode(span), Source = BuildSourceSpanFromNode(span),
}); });
@ -220,7 +220,7 @@ namespace Microsoft.AspNetCore.Razor.Language
_builder.Push(new DirectiveIRNode() _builder.Push(new DirectiveIRNode()
{ {
Name = chunkGenerator.Descriptor.Name, Name = chunkGenerator.Descriptor.Directive,
Descriptor = chunkGenerator.Descriptor, Descriptor = chunkGenerator.Descriptor,
Source = BuildSourceSpanFromNode(block), Source = BuildSourceSpanFromNode(block),
}); });
@ -259,7 +259,7 @@ namespace Microsoft.AspNetCore.Razor.Language
{ {
_builder.Push(new DirectiveIRNode() _builder.Push(new DirectiveIRNode()
{ {
Name = chunkGenerator.Descriptor.Name, Name = chunkGenerator.Descriptor.Directive,
Descriptor = chunkGenerator.Descriptor, Descriptor = chunkGenerator.Descriptor,
Source = BuildSourceSpanFromNode(block), Source = BuildSourceSpanFromNode(block),
}); });

View File

@ -7,107 +7,185 @@ using System.Linq;
namespace Microsoft.AspNetCore.Razor.Language namespace Microsoft.AspNetCore.Razor.Language
{ {
/// <summary>
/// A descriptor type for a directive that can be parsed by the Razor parser.
/// </summary>
public abstract class DirectiveDescriptor public abstract class DirectiveDescriptor
{ {
public abstract string Name { get; } /// <summary>
/// Gets the description of the directive.
/// </summary>
/// <remarks>
/// The description is used for information purposes, and has no effect on parsing.
/// </remarks>
public abstract string Description { get; }
/// <summary>
/// Gets the directive keyword without the leading <c>@</c> token.
/// </summary>
public abstract string Directive { get; }
/// <summary>
/// Gets the display name of the directive.
/// </summary>
/// <remarks>
/// The display name is used for information purposes, and has no effect on parsing.
/// </remarks>
public abstract string DisplayName { get; }
/// <summary>
/// Gets the kind of the directive. The kind determines whether or not a directive has an associated block.
/// </summary>
public abstract DirectiveKind Kind { get; } public abstract DirectiveKind Kind { get; }
/// <summary>
/// Gets the list of directive tokens that can follow the directive keyword.
/// </summary>
public abstract IReadOnlyList<DirectiveTokenDescriptor> Tokens { get; } public abstract IReadOnlyList<DirectiveTokenDescriptor> Tokens { get; }
public static DirectiveDescriptor CreateDirective(string name, DirectiveKind kind) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/>.
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <param name="kind">The directive kind.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateDirective(string directive, DirectiveKind kind)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, kind, configure: null); return CreateDirective(directive, kind, configure: null);
} }
public static DirectiveDescriptor CreateDirective(string name, DirectiveKind kind, Action<IDirectiveDescriptorBuilder> configure) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/>.
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <param name="kind">The directive kind.</param>
/// <param name="configure">A configuration delegate for the directive.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateDirective(string directive, DirectiveKind kind, Action<IDirectiveDescriptorBuilder> configure)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
var builder = new DefaultDirectiveDescriptorBuilder(name, kind); var builder = new DefaultDirectiveDescriptorBuilder(directive, kind);
configure?.Invoke(builder); configure?.Invoke(builder);
return builder.Build(); return builder.Build();
} }
public static DirectiveDescriptor CreateSingleLineDirective(string name) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/> with <see cref="Kind"/> set to <see cref="DirectiveKind.SingleLine"/>
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateSingleLineDirective(string directive)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, DirectiveKind.SingleLine, configure: null); return CreateDirective(directive, DirectiveKind.SingleLine, configure: null);
} }
public static DirectiveDescriptor CreateSingleLineDirective(string name, Action<IDirectiveDescriptorBuilder> configure) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/> with <see cref="Kind"/> set to <see cref="DirectiveKind.SingleLine"/>
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <param name="configure">A configuration delegate for the directive.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateSingleLineDirective(string directive, Action<IDirectiveDescriptorBuilder> configure)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, DirectiveKind.SingleLine, configure); return CreateDirective(directive, DirectiveKind.SingleLine, configure);
} }
public static DirectiveDescriptor CreateRazorBlockDirective(string name) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/> with <see cref="Kind"/> set to <see cref="DirectiveKind.RazorBlock"/>
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateRazorBlockDirective(string directive)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, DirectiveKind.RazorBlock, configure: null); return CreateDirective(directive, DirectiveKind.RazorBlock, configure: null);
} }
public static DirectiveDescriptor CreateRazorBlockDirective(string name, Action<IDirectiveDescriptorBuilder> configure) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/> with <see cref="Kind"/> set to <see cref="DirectiveKind.RazorBlock"/>
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <param name="configure">A configuration delegate for the directive.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateRazorBlockDirective(string directive, Action<IDirectiveDescriptorBuilder> configure)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, DirectiveKind.RazorBlock, configure); return CreateDirective(directive, DirectiveKind.RazorBlock, configure);
} }
public static DirectiveDescriptor CreateCodeBlockDirective(string name) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/> with <see cref="Kind"/> set to <see cref="DirectiveKind.CodeBlock"/>
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateCodeBlockDirective(string directive)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, DirectiveKind.CodeBlock, configure: null); return CreateDirective(directive, DirectiveKind.CodeBlock, configure: null);
} }
public static DirectiveDescriptor CreateCodeBlockDirective(string name, Action<IDirectiveDescriptorBuilder> configure) /// <summary>
/// Creates a new <see cref="DirectiveDescriptor"/> with <see cref="Kind"/> set to <see cref="DirectiveKind.CodeBlock"/>
/// </summary>
/// <param name="directive">The directive keyword.</param>
/// <param name="configure">A configuration delegate for the directive.</param>
/// <returns>A <see cref="DirectiveDescriptor"/> for the created directive.</returns>
public static DirectiveDescriptor CreateCodeBlockDirective(string directive, Action<IDirectiveDescriptorBuilder> configure)
{ {
if (name == null) if (directive == null)
{ {
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(directive));
} }
return CreateDirective(name, DirectiveKind.CodeBlock, configure); return CreateDirective(directive, DirectiveKind.CodeBlock, configure);
} }
private class DefaultDirectiveDescriptorBuilder : IDirectiveDescriptorBuilder private class DefaultDirectiveDescriptorBuilder : IDirectiveDescriptorBuilder
{ {
public DefaultDirectiveDescriptorBuilder(string name, DirectiveKind kind) public DefaultDirectiveDescriptorBuilder(string name, DirectiveKind kind)
{ {
Name = name; Directive = name;
Kind = kind; Kind = kind;
Tokens = new List<DirectiveTokenDescriptor>(); Tokens = new List<DirectiveTokenDescriptor>();
} }
public string Name { get; } public string Description { get; set; }
public string Directive { get; }
public string DisplayName { get; set; }
public DirectiveKind Kind { get; } public DirectiveKind Kind { get; }
@ -115,16 +193,16 @@ namespace Microsoft.AspNetCore.Razor.Language
public DirectiveDescriptor Build() public DirectiveDescriptor Build()
{ {
if (Name.Length == 0) if (Directive.Length == 0)
{ {
throw new InvalidOperationException(Resources.FormatDirectiveDescriptor_InvalidDirectiveName(Name)); throw new InvalidOperationException(Resources.FormatDirectiveDescriptor_InvalidDirectiveKeyword(Directive));
} }
for (var i = 0; i < Name.Length; i++) for (var i = 0; i < Directive.Length; i++)
{ {
if (!char.IsLetter(Name[i])) if (!char.IsLetter(Directive[i]))
{ {
throw new InvalidOperationException(Resources.FormatDirectiveDescriptor_InvalidDirectiveName(Name)); throw new InvalidOperationException(Resources.FormatDirectiveDescriptor_InvalidDirectiveKeyword(Directive));
} }
} }
@ -140,20 +218,31 @@ namespace Microsoft.AspNetCore.Razor.Language
} }
} }
return new DefaultDirectiveDescriptor(Name, Kind, Tokens.ToArray()); return new DefaultDirectiveDescriptor(Directive, Kind, Tokens.ToArray(), DisplayName, Description);
} }
} }
private class DefaultDirectiveDescriptor : DirectiveDescriptor private class DefaultDirectiveDescriptor : DirectiveDescriptor
{ {
public DefaultDirectiveDescriptor(string name, DirectiveKind kind, DirectiveTokenDescriptor[] tokens) public DefaultDirectiveDescriptor(
string directive,
DirectiveKind kind,
DirectiveTokenDescriptor[] tokens,
string displayName,
string description)
{ {
Name = name; Directive = directive;
Kind = kind; Kind = kind;
Tokens = tokens; Tokens = tokens;
DisplayName = displayName;
Description = description;
} }
public override string Name { get; } public override string Description { get; }
public override string Directive { get; }
public override string DisplayName { get; }
public override DirectiveKind Kind { get; } public override DirectiveKind Kind { get; }

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Razor.Language
} }
return descriptorX != null && return descriptorX != null &&
string.Equals(descriptorX.Name, descriptorY.Name, StringComparison.Ordinal) && string.Equals(descriptorX.Directive, descriptorY.Directive, StringComparison.Ordinal) &&
descriptorX.Kind == descriptorY.Kind && descriptorX.Kind == descriptorY.Kind &&
Enumerable.SequenceEqual( Enumerable.SequenceEqual(
descriptorX.Tokens, descriptorX.Tokens,
@ -40,7 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language
} }
var hashCodeCombiner = HashCodeCombiner.Start(); var hashCodeCombiner = HashCodeCombiner.Start();
hashCodeCombiner.Add(descriptor.Name, StringComparer.Ordinal); hashCodeCombiner.Add(descriptor.Directive, StringComparer.Ordinal);
hashCodeCombiner.Add(descriptor.Kind); hashCodeCombiner.Add(descriptor.Kind);
return hashCodeCombiner.CombinedHash; return hashCodeCombiner.CombinedHash;

View File

@ -5,14 +5,40 @@ using System.Collections.Generic;
namespace Microsoft.AspNetCore.Razor.Language namespace Microsoft.AspNetCore.Razor.Language
{ {
/// <summary>
/// A builder interface for configuring a <see cref="DirectiveDescriptor"/>.
/// </summary>
public interface IDirectiveDescriptorBuilder public interface IDirectiveDescriptorBuilder
{ {
string Name { get; } /// <summary>
/// Gets or sets the description of the directive.
/// </summary>
string Description { get; set; }
/// <summary>
/// Gets the directive keyword.
/// </summary>
string Directive { get; }
/// <summary>
/// Gets or sets the display name of the directive.
/// </summary>
string DisplayName { get; set; }
/// <summary>
/// Gets the directive kind.
/// </summary>
DirectiveKind Kind { get; } DirectiveKind Kind { get; }
/// <summary>
/// Gets a list of the directive tokens.
/// </summary>
IList<DirectiveTokenDescriptor> Tokens { get; } IList<DirectiveTokenDescriptor> Tokens { get; }
/// <summary>
/// Creates a <see cref="DirectiveDescriptor"/> based on the current property values of the builder.
/// </summary>
/// <returns>The created <see cref="DirectiveDescriptor" />.</returns>
DirectiveDescriptor Build(); DirectiveDescriptor Build();
} }
} }

View File

@ -1546,8 +1546,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
for (var i = 0; i < allDirectives.Count; i++) for (var i = 0; i < allDirectives.Count; i++)
{ {
var directiveDescriptor = allDirectives[i]; var directiveDescriptor = allDirectives[i];
CurrentKeywords.Add(directiveDescriptor.Name); CurrentKeywords.Add(directiveDescriptor.Directive);
MapDirectives(() => HandleDirective(directiveDescriptor), directiveDescriptor.Name); MapDirectives(() => HandleDirective(directiveDescriptor), directiveDescriptor.Directive);
} }
MapDirectives(TagHelperPrefixDirective, SyntaxConstants.CSharp.TagHelperPrefixKeyword); MapDirectives(TagHelperPrefixDirective, SyntaxConstants.CSharp.TagHelperPrefixKeyword);
@ -1583,7 +1583,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.Builder.CurrentBlock.Type = BlockKindInternal.Directive; Context.Builder.CurrentBlock.Type = BlockKindInternal.Directive;
Context.Builder.CurrentBlock.ChunkGenerator = new DirectiveChunkGenerator(descriptor); Context.Builder.CurrentBlock.ChunkGenerator = new DirectiveChunkGenerator(descriptor);
AssertDirective(descriptor.Name); AssertDirective(descriptor.Directive);
AcceptAndMoveNext(); AcceptAndMoveNext();
Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None); Output(SpanKindInternal.MetaCode, AcceptedCharactersInternal.None);
@ -1614,7 +1614,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatUnexpectedEOFAfterDirective(descriptor.Name, tokenDescriptor.Kind.ToString().ToLowerInvariant()), LegacyResources.FormatUnexpectedEOFAfterDirective(descriptor.Directive, tokenDescriptor.Kind.ToString().ToLowerInvariant()),
length: 1); length: 1);
return; return;
} }
@ -1626,7 +1626,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatDirectiveExpectsTypeName(descriptor.Name), LegacyResources.FormatDirectiveExpectsTypeName(descriptor.Directive),
CurrentSymbol.Content.Length); CurrentSymbol.Content.Length);
return; return;
@ -1638,7 +1638,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatDirectiveExpectsNamespace(descriptor.Name), LegacyResources.FormatDirectiveExpectsNamespace(descriptor.Directive),
identifierLength); identifierLength);
return; return;
@ -1654,7 +1654,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatDirectiveExpectsIdentifier(descriptor.Name), LegacyResources.FormatDirectiveExpectsIdentifier(descriptor.Directive),
CurrentSymbol.Content.Length); CurrentSymbol.Content.Length);
return; return;
} }
@ -1669,7 +1669,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatDirectiveExpectsQuotedStringLiteral(descriptor.Name), LegacyResources.FormatDirectiveExpectsQuotedStringLiteral(descriptor.Directive),
CurrentSymbol.Content.Length); CurrentSymbol.Content.Length);
return; return;
} }
@ -1698,7 +1698,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatUnexpectedDirectiveLiteral(descriptor.Name, LegacyResources.ErrorComponent_Newline), LegacyResources.FormatUnexpectedDirectiveLiteral(descriptor.Directive, LegacyResources.ErrorComponent_Newline),
CurrentSymbol.Content.Length); CurrentSymbol.Content.Length);
} }
@ -1750,14 +1750,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatUnexpectedEOFAfterDirective(descriptor.Name, "{"), LegacyResources.FormatUnexpectedEOFAfterDirective(descriptor.Directive, "{"),
length: 1 /* { */); length: 1 /* { */);
} }
else if (!At(CSharpSymbolType.LeftBrace)) else if (!At(CSharpSymbolType.LeftBrace))
{ {
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
CurrentStart, CurrentStart,
LegacyResources.FormatUnexpectedDirectiveLiteral(descriptor.Name, "{"), LegacyResources.FormatUnexpectedDirectiveLiteral(descriptor.Directive, "{"),
CurrentSymbol.Content.Length); CurrentSymbol.Content.Length);
} }
else else
@ -1777,7 +1777,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
editHandler.AutoCompleteString = "}"; editHandler.AutoCompleteString = "}";
Context.ErrorSink.OnError( Context.ErrorSink.OnError(
startingBraceLocation, startingBraceLocation,
LegacyResources.FormatParseError_Expected_EndOfBlock_Before_EOF(descriptor.Name, "}", "{"), LegacyResources.FormatParseError_Expected_EndOfBlock_Before_EOF(descriptor.Directive, "}", "{"),
length: 1 /* } */); length: 1 /* } */);
} }
else else

View File

@ -389,18 +389,18 @@ namespace Microsoft.AspNetCore.Razor.Language
=> string.Format(CultureInfo.CurrentCulture, GetString("InvalidOperation_SpanIsNotChangeOwner"), p0, p1); => string.Format(CultureInfo.CurrentCulture, GetString("InvalidOperation_SpanIsNotChangeOwner"), p0, p1);
/// <summary> /// <summary>
/// Invalid directive name '{0}'. Directives must have a non-empty name that consists only of letters. /// Invalid directive keyword '{0}'. Directives must have a non-empty keyword that consists only of letters.
/// </summary> /// </summary>
internal static string DirectiveDescriptor_InvalidDirectiveName internal static string DirectiveDescriptor_InvalidDirectiveKeyword
{ {
get => GetString("DirectiveDescriptor_InvalidDirectiveName"); get => GetString("DirectiveDescriptor_InvalidDirectiveKeyword");
} }
/// <summary> /// <summary>
/// Invalid directive name '{0}'. Directives must have a non-empty name that consists only of letters. /// Invalid directive keyword '{0}'. Directives must have a non-empty keyword that consists only of letters.
/// </summary> /// </summary>
internal static string FormatDirectiveDescriptor_InvalidDirectiveName(object p0) internal static string FormatDirectiveDescriptor_InvalidDirectiveKeyword(object p0)
=> string.Format(CultureInfo.CurrentCulture, GetString("DirectiveDescriptor_InvalidDirectiveName"), p0); => string.Format(CultureInfo.CurrentCulture, GetString("DirectiveDescriptor_InvalidDirectiveKeyword"), p0);
/// <summary> /// <summary>
/// The feature must be initialized by setting the '{0}' property. /// The feature must be initialized by setting the '{0}' property.

View File

@ -198,8 +198,8 @@
<data name="InvalidOperation_SpanIsNotChangeOwner" xml:space="preserve"> <data name="InvalidOperation_SpanIsNotChangeOwner" xml:space="preserve">
<value>The node '{0}' is not the owner of change '{1}'.</value> <value>The node '{0}' is not the owner of change '{1}'.</value>
</data> </data>
<data name="DirectiveDescriptor_InvalidDirectiveName" xml:space="preserve"> <data name="DirectiveDescriptor_InvalidDirectiveKeyword" xml:space="preserve">
<value>Invalid directive name '{0}'. Directives must have a non-empty name that consists only of letters.</value> <value>Invalid directive keyword '{0}'. Directives must have a non-empty keyword that consists only of letters.</value>
</data> </data>
<data name="FeatureMustBeInitialized" xml:space="preserve"> <data name="FeatureMustBeInitialized" xml:space="preserve">
<value>The feature must be initialized by setting the '{0}' property.</value> <value>The feature must be initialized by setting the '{0}' property.</value>

View File

@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Razor.Language
// Assert // Assert
var syntaxTree = codeDocument.GetSyntaxTree(); var syntaxTree = codeDocument.GetSyntaxTree();
var directive = Assert.Single(syntaxTree.Options.Directives); var directive = Assert.Single(syntaxTree.Options.Directives);
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
} }
[Fact] [Fact]
@ -70,8 +70,8 @@ namespace Microsoft.AspNetCore.Razor.Language
// Assert // Assert
Assert.Collection( Assert.Collection(
codeDocument.GetImportSyntaxTrees(), codeDocument.GetImportSyntaxTrees(),
t => { Assert.Same(t.Source, imports[0]); Assert.Equal("test", Assert.Single(t.Options.Directives).Name); }, t => { Assert.Same(t.Source, imports[0]); Assert.Equal("test", Assert.Single(t.Options.Directives).Directive); },
t => { Assert.Same(t.Source, imports[1]); Assert.Equal("test", Assert.Single(t.Options.Directives).Name); }); t => { Assert.Same(t.Source, imports[1]); Assert.Equal("test", Assert.Single(t.Options.Directives).Directive); });
} }
private class MyParserOptionsFeature : RazorEngineFeatureBase, IRazorParserOptionsFeature private class MyParserOptionsFeature : RazorEngineFeatureBase, IRazorParserOptionsFeature

View File

@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateDirective("test", DirectiveKind.SingleLine); var directive = DirectiveDescriptor.CreateDirective("test", DirectiveKind.SingleLine);
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.SingleLine, directive.Kind); Assert.Equal(DirectiveKind.SingleLine, directive.Kind);
} }
@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateDirective("test", DirectiveKind.SingleLine, configure); var directive = DirectiveDescriptor.CreateDirective("test", DirectiveKind.SingleLine, configure);
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.SingleLine, directive.Kind); Assert.Equal(DirectiveKind.SingleLine, directive.Kind);
Assert.True(called); Assert.True(called);
} }
@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateSingleLineDirective("test"); var directive = DirectiveDescriptor.CreateSingleLineDirective("test");
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.SingleLine, directive.Kind); Assert.Equal(DirectiveKind.SingleLine, directive.Kind);
} }
@ -57,7 +57,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateSingleLineDirective("test", configure); var directive = DirectiveDescriptor.CreateSingleLineDirective("test", configure);
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.SingleLine, directive.Kind); Assert.Equal(DirectiveKind.SingleLine, directive.Kind);
Assert.True(called); Assert.True(called);
} }
@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateRazorBlockDirective("test"); var directive = DirectiveDescriptor.CreateRazorBlockDirective("test");
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.RazorBlock, directive.Kind); Assert.Equal(DirectiveKind.RazorBlock, directive.Kind);
} }
@ -84,7 +84,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateRazorBlockDirective("test", configure); var directive = DirectiveDescriptor.CreateRazorBlockDirective("test", configure);
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.RazorBlock, directive.Kind); Assert.Equal(DirectiveKind.RazorBlock, directive.Kind);
Assert.True(called); Assert.True(called);
} }
@ -96,7 +96,7 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateCodeBlockDirective("test"); var directive = DirectiveDescriptor.CreateCodeBlockDirective("test");
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.CodeBlock, directive.Kind); Assert.Equal(DirectiveKind.CodeBlock, directive.Kind);
} }
@ -111,29 +111,29 @@ namespace Microsoft.AspNetCore.Razor.Language
var directive = DirectiveDescriptor.CreateCodeBlockDirective("test", configure); var directive = DirectiveDescriptor.CreateCodeBlockDirective("test", configure);
// Assert // Assert
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
Assert.Equal(DirectiveKind.CodeBlock, directive.Kind); Assert.Equal(DirectiveKind.CodeBlock, directive.Kind);
Assert.True(called); Assert.True(called);
} }
[Fact] [Fact]
public void Build_ValidatesDirectiveName_EmptyIsInvalid() public void Build_ValidatesDirectiveKeyword_EmptyIsInvalid()
{ {
// Arrange & Act // Arrange & Act
var ex = Assert.Throws<InvalidOperationException>(() => DirectiveDescriptor.CreateSingleLineDirective("")); var ex = Assert.Throws<InvalidOperationException>(() => DirectiveDescriptor.CreateSingleLineDirective(""));
// Assert // Assert
Assert.Equal("Invalid directive name ''. Directives must have a non-empty name that consists only of letters.", ex.Message); Assert.Equal("Invalid directive keyword ''. Directives must have a non-empty keyword that consists only of letters.", ex.Message);
} }
[Fact] [Fact]
public void Build_ValidatesDirectiveName_InvalidCharacter() public void Build_ValidatesDirectiveKeyword_InvalidCharacter()
{ {
// Arrange & Act // Arrange & Act
var ex = Assert.Throws<InvalidOperationException>(() => DirectiveDescriptor.CreateSingleLineDirective("test_directive")); var ex = Assert.Throws<InvalidOperationException>(() => DirectiveDescriptor.CreateSingleLineDirective("test_directive"));
// Assert // Assert
Assert.Equal("Invalid directive name 'test_directive'. Directives must have a non-empty name that consists only of letters.", ex.Message); Assert.Equal("Invalid directive keyword 'test_directive'. Directives must have a non-empty keyword that consists only of letters.", ex.Message);
} }
[Fact] [Fact]

View File

@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.MetaCode("functions").Accepts(AcceptedCharactersInternal.None), Factory.MetaCode("functions").Accepts(AcceptedCharactersInternal.None),
Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharactersInternal.None)), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharactersInternal.None)),
new RazorError( new RazorError(
LegacyResources.FormatParseError_Expected_EndOfBlock_Before_EOF(CSharpCodeParser.FunctionsDirectiveDescriptor.Name, "}", "{"), LegacyResources.FormatParseError_Expected_EndOfBlock_Before_EOF(CSharpCodeParser.FunctionsDirectiveDescriptor.Directive, "}", "{"),
new SourceLocation(10, 0, 10), new SourceLocation(10, 0, 10),
length: 1)); length: 1));
} }

View File

@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.MetaCode("section").Accepts(AcceptedCharactersInternal.None)), Factory.MetaCode("section").Accepts(AcceptedCharactersInternal.None)),
Factory.Markup(Environment.NewLine)), Factory.Markup(Environment.NewLine)),
new RazorError( new RazorError(
LegacyResources.FormatDirectiveExpectsIdentifier(CSharpCodeParser.SectionDirectiveDescriptor.Name), LegacyResources.FormatDirectiveExpectsIdentifier(CSharpCodeParser.SectionDirectiveDescriptor.Directive),
new SourceLocation(8, 0, 8), new SourceLocation(8, 0, 8),
length: Environment.NewLine.Length)); length: Environment.NewLine.Length));
} }
@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.Span(SpanKindInternal.Markup, " " + Environment.NewLine + " ", markup: false).Accepts(AcceptedCharactersInternal.AllWhiteSpace)), Factory.Span(SpanKindInternal.Markup, " " + Environment.NewLine + " ", markup: false).Accepts(AcceptedCharactersInternal.AllWhiteSpace)),
Factory.EmptyHtml()), Factory.EmptyHtml()),
new RazorError( new RazorError(
LegacyResources.FormatUnexpectedEOFAfterDirective(CSharpCodeParser.SectionDirectiveDescriptor.Name, "{"), LegacyResources.FormatUnexpectedEOFAfterDirective(CSharpCodeParser.SectionDirectiveDescriptor.Directive, "{"),
new SourceLocation(25 + Environment.NewLine.Length, 0, 25 + Environment.NewLine.Length), new SourceLocation(25 + Environment.NewLine.Length, 0, 25 + Environment.NewLine.Length),
length: 1)); length: 1));
} }
@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.Span(SpanKindInternal.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.WhiteSpace)), Factory.Span(SpanKindInternal.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.WhiteSpace)),
Factory.Markup(Environment.NewLine + " ")), Factory.Markup(Environment.NewLine + " ")),
new RazorError( new RazorError(
LegacyResources.FormatDirectiveExpectsIdentifier(CSharpCodeParser.SectionDirectiveDescriptor.Name), LegacyResources.FormatDirectiveExpectsIdentifier(CSharpCodeParser.SectionDirectiveDescriptor.Directive),
new SourceLocation(17, 0, 17), new SourceLocation(17, 0, 17),
length: Environment.NewLine.Length)); length: Environment.NewLine.Length));
} }
@ -93,7 +93,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.Markup("</p>")), Factory.Markup("</p>")),
Factory.Markup(" }")), Factory.Markup(" }")),
new RazorError( new RazorError(
LegacyResources.FormatDirectiveExpectsIdentifier(CSharpCodeParser.SectionDirectiveDescriptor.Name), LegacyResources.FormatDirectiveExpectsIdentifier(CSharpCodeParser.SectionDirectiveDescriptor.Directive),
new SourceLocation(9, 0, 9), new SourceLocation(9, 0, 9),
length: 1)); length: 1));
} }
@ -117,7 +117,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.Markup("</p>")), Factory.Markup("</p>")),
Factory.Markup(" }")), Factory.Markup(" }")),
new RazorError( new RazorError(
LegacyResources.FormatUnexpectedDirectiveLiteral(CSharpCodeParser.SectionDirectiveDescriptor.Name, "{"), LegacyResources.FormatUnexpectedDirectiveLiteral(CSharpCodeParser.SectionDirectiveDescriptor.Directive, "{"),
new SourceLocation(12, 0, 12), new SourceLocation(12, 0, 12),
length: 1)); length: 1));
} }
@ -182,7 +182,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new MarkupBlock( new MarkupBlock(
Factory.EmptyHtml()))), Factory.EmptyHtml()))),
new RazorError( new RazorError(
LegacyResources.FormatParseError_Expected_EndOfBlock_Before_EOF(CSharpCodeParser.SectionDirectiveDescriptor.Name, "}", "{"), LegacyResources.FormatParseError_Expected_EndOfBlock_Before_EOF(CSharpCodeParser.SectionDirectiveDescriptor.Directive, "}", "{"),
new SourceLocation(13, 0, 13), new SourceLocation(13, 0, 13),
length: 1)); length: 1));
} }
@ -291,7 +291,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
Factory.Span(SpanKindInternal.Markup, " " + Environment.NewLine, markup: false).Accepts(AcceptedCharactersInternal.AllWhiteSpace)), Factory.Span(SpanKindInternal.Markup, " " + Environment.NewLine, markup: false).Accepts(AcceptedCharactersInternal.AllWhiteSpace)),
Factory.EmptyHtml()), Factory.EmptyHtml()),
new RazorError( new RazorError(
LegacyResources.FormatUnexpectedEOFAfterDirective(CSharpCodeParser.SectionDirectiveDescriptor.Name, "{"), LegacyResources.FormatUnexpectedEOFAfterDirective(CSharpCodeParser.SectionDirectiveDescriptor.Directive, "{"),
new SourceLocation(18 + Environment.NewLine.Length, 0, 18 + Environment.NewLine.Length), new SourceLocation(18 + Environment.NewLine.Length, 0, 18 + Environment.NewLine.Length),
length: 1)); length: 1));
} }

View File

@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock(new DirectiveChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor), new DirectiveBlock(new DirectiveChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor),
Factory.MetaCode("inherits").Accepts(AcceptedCharactersInternal.None)), Factory.MetaCode("inherits").Accepts(AcceptedCharactersInternal.None)),
new RazorError( new RazorError(
LegacyResources.FormatUnexpectedEOFAfterDirective(CSharpCodeParser.InheritsDirectiveDescriptor.Name, "type"), LegacyResources.FormatUnexpectedEOFAfterDirective(CSharpCodeParser.InheritsDirectiveDescriptor.Directive, "type"),
new SourceLocation(8, 0, 8), 1)); new SourceLocation(8, 0, 8), 1));
} }
@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock(new DirectiveChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor), new DirectiveBlock(new DirectiveChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor),
Factory.MetaCode("inherits").Accepts(AcceptedCharactersInternal.None), Factory.MetaCode("inherits").Accepts(AcceptedCharactersInternal.None),
Factory.Span(SpanKindInternal.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.WhiteSpace)), Factory.Span(SpanKindInternal.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharactersInternal.WhiteSpace)),
new RazorError(LegacyResources.FormatDirectiveExpectsTypeName(CSharpCodeParser.InheritsDirectiveDescriptor.Name), 24, 0, 24, Environment.NewLine.Length)); new RazorError(LegacyResources.FormatDirectiveExpectsTypeName(CSharpCodeParser.InheritsDirectiveDescriptor.Directive), 24, 0, 24, Environment.NewLine.Length));
} }
[Fact] [Fact]

View File

@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Razor.Language
Assert.Same(expected, actual); Assert.Same(expected, actual);
var directive = Assert.Single(actual.Directives); var directive = Assert.Single(actual.Directives);
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
} }
[Fact] [Fact]
@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Razor.Language
Assert.IsType<DefaultRazorDirectiveFeature>(actual); Assert.IsType<DefaultRazorDirectiveFeature>(actual);
var directive = Assert.Single(actual.Directives); var directive = Assert.Single(actual.Directives);
Assert.Equal("test", directive.Name); Assert.Equal("test", directive.Directive);
} }
[Fact] [Fact]

View File

@ -17,7 +17,7 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo
var builder = new StringBuilder(); var builder = new StringBuilder();
builder.Append("@"); builder.Append("@");
builder.Append(_directive.Name); builder.Append(_directive.Directive);
foreach (var token in _directive.Tokens) foreach (var token in _directive.Tokens)
{ {
@ -36,7 +36,7 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo
public string DisplayText { get; } public string DisplayText { get; }
public string Name => _directive.Name; public string Name => _directive.Directive;
} }
} }
#endif #endif