public void WriteRazorCompiledItemAttributeMetadata_EscapesKeysAndValuesCorrectly() { // Arrange var extension = new MetadataAttributeTargetExtension() { CompiledItemMetadataAttributeName = "global::TestItemMetadata", }; var context = TestCodeRenderingContext.CreateRuntime(); var node = new RazorCompiledItemMetadataAttributeIntermediateNode { Key = "\"test\" key", Value = @"""test"" value", }; // Act extension.WriteRazorCompiledItemMetadataAttribute(context, node); // Assert var csharp = context.CodeWriter.GenerateCode().Trim(); Assert.Equal( "[global::TestItemMetadata(\"\\\"test\\\" key\", \"\\\"test\\\" value\")]", csharp, ignoreLineEndingDifferences: true); }
private static void AddRouteTemplateMetadataAttribute(NamespaceDeclarationIntermediateNode @namespace, ClassDeclarationIntermediateNode @class, PageDirective pageDirective) { if (string.IsNullOrEmpty(pageDirective.RouteTemplate)) { return; } var classIndex = @namespace.Children.IndexOf(@class); if (classIndex == -1) { return; } var metadataAttributeNode = new RazorCompiledItemMetadataAttributeIntermediateNode { Key = RouteTemplateKey, Value = pageDirective.RouteTemplate, }; // Metadata attributes need to be inserted right before the class declaration. @namespace.Children.Insert(classIndex, metadataAttributeNode); }
public void WriteRazorCompiledItemMetadataAttribute(CodeRenderingContext context, RazorCompiledItemMetadataAttributeIntermediateNode node) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (node == null) { throw new ArgumentNullException(nameof(node)); } // [assembly: global::...RazorCompiledItemAttribute(@"{node.Key}", @"{node.Value}")] context.CodeWriter.Write("["); context.CodeWriter.Write(CompiledItemMetadataAttributeName); context.CodeWriter.Write("("); context.CodeWriter.WriteStringLiteral(node.Key); context.CodeWriter.Write(", "); context.CodeWriter.WriteStringLiteral(node.Value); context.CodeWriter.WriteLine(")]"); }