diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f45c71accfb..454d8852ff1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -87,6 +87,11 @@ https://github.com/dotnet/roslyn f6725f6f04ce03574fcf89faa4b20b72ef83e4dd + + https://github.com/dotnet/source-build-externals + 50600f7fcd6e56a496233a859ed7d4d90c173b0d + + diff --git a/src/Compiler/Microsoft.AspNetCore.Razor.Language/src/RazorCodeDocumentExtensions.cs b/src/Compiler/Microsoft.AspNetCore.Razor.Language/src/RazorCodeDocumentExtensions.cs index 556368e1d96..a0a0a006154 100644 --- a/src/Compiler/Microsoft.AspNetCore.Razor.Language/src/RazorCodeDocumentExtensions.cs +++ b/src/Compiler/Microsoft.AspNetCore.Razor.Language/src/RazorCodeDocumentExtensions.cs @@ -20,6 +20,7 @@ public static class RazorCodeDocumentExtensions private static readonly char[] NamespaceSeparators = new char[] { '.' }; private static readonly object CssScopeKey = new object(); private static readonly object NamespaceKey = new object(); + private static readonly object NoNamespaceToken = new object(); public static TagHelperDocumentContext GetTagHelperContext(this RazorCodeDocument document) { @@ -282,6 +283,16 @@ public static void SetCssScope(this RazorCodeDocument document, string cssScope) document.Items[CssScopeKey] = cssScope; } + internal static void SetNamespace(this RazorCodeDocument document, string @namespace) + { + if (document == null) + { + throw new ArgumentNullException(nameof(document)); + } + + document.Items[NamespaceKey] = @namespace; + } + #nullable enable public static bool TryComputeClassName(this RazorCodeDocument codeDocument, [NotNullWhen(true)] out string? className) { @@ -303,12 +314,22 @@ public static bool TryComputeClassName(this RazorCodeDocument codeDocument, [Not // However all kinds of thing are possible in tools. We shouldn't barf here if the document isn't // set up correctly. public static bool TryComputeNamespace(this RazorCodeDocument document, bool fallbackToRootNamespace, out string @namespace) + => TryComputeNamespace(document, fallbackToRootNamespace, check: true, out @namespace); + + internal static bool TryComputeNamespace(this RazorCodeDocument document, bool fallbackToRootNamespace, bool check, out string @namespace) { if (document == null) { throw new ArgumentNullException(nameof(document)); } + var namespaceValue = document.Items[NamespaceKey]; + if (namespaceValue == NoNamespaceToken) + { + @namespace = null; + return false; + } + @namespace = (string)document.Items[NamespaceKey]; if (@namespace is null) { @@ -318,11 +339,14 @@ public static bool TryComputeNamespace(this RazorCodeDocument document, bool fal } #if DEBUG - // In debug mode, even if we're cached, lets take the hit to run this again and make sure the cached value is correct. - // This is to help us find issues with caching logic during development. - var validateResult = TryComputeNamespaceCore(document, fallbackToRootNamespace, out var validateNamespace); - Debug.Assert(validateResult, "We couldn't compute the namespace, but have a cached value, so something has gone wrong"); - Debug.Assert(validateNamespace == @namespace, $"We cached a namespace of {@namespace} but calculated that it should be {validateNamespace}"); + if (check) + { + // In debug mode, even if we're cached, lets take the hit to run this again and make sure the cached value is correct. + // This is to help us find issues with caching logic during development. + var validateResult = TryComputeNamespaceCore(document, fallbackToRootNamespace, out var validateNamespace); + Debug.Assert(validateResult, "We couldn't compute the namespace, but have a cached value, so something has gone wrong"); + Debug.Assert(validateNamespace == @namespace, $"We cached a namespace of {@namespace} but calculated that it should be {validateNamespace}"); + } #endif return true; diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport.csproj b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport.csproj index 00ad96c79b1..bffbb49fb8d 100644 --- a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport.csproj +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport/Microsoft.NET.Sdk.Razor.SourceGenerators.Transport.csproj @@ -14,6 +14,7 @@ + @@ -24,6 +25,7 @@ + diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Microsoft.NET.Sdk.Razor.SourceGenerators.csproj b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Microsoft.NET.Sdk.Razor.SourceGenerators.csproj index c3c9ec50c7d..63dd799384a 100644 --- a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Microsoft.NET.Sdk.Razor.SourceGenerators.csproj +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Microsoft.NET.Sdk.Razor.SourceGenerators.csproj @@ -14,11 +14,18 @@ false + + + + + + + diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/RazorSourceGenerator.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/RazorSourceGenerator.cs index f555839bcf0..22991076afc 100644 --- a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/RazorSourceGenerator.cs +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/RazorSourceGenerator.cs @@ -271,6 +271,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { var (filePath, document) = pair; var hintName = GetIdentifierFromPath(filePath); + context.AddOutput(hintName + ".rsg.json", RazorCodeDocumentSerializer.Instance.Serialize(document)); context.AddOutput(hintName + ".rsg.cs", document.GetCSharpDocument().GeneratedCode); context.AddOutput(hintName + ".rsg.html", document.GetHtmlDocument().GeneratedCode); }); diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DelegateCreationConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DelegateCreationConverter.cs new file mode 100644 index 00000000000..b8ac05391fc --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DelegateCreationConverter.cs @@ -0,0 +1,19 @@ +// 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 Newtonsoft.Json.Converters; +using System; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class DelegateCreationConverter : CustomCreationConverter +{ + private readonly Func _factory; + + public DelegateCreationConverter(Func factory) + { + _factory = factory; + } + + public override T Create(Type objectType) => _factory(objectType); +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DirectiveDescriptorConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DirectiveDescriptorConverter.cs new file mode 100644 index 00000000000..55232e12308 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DirectiveDescriptorConverter.cs @@ -0,0 +1,73 @@ +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis.Razor.Serialization; +using Newtonsoft.Json; +using System; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class DirectiveDescriptorConverter : JsonConverter +{ + private const string ValuePropertyName = "_"; + + public override DirectiveDescriptor? ReadJson(JsonReader reader, Type objectType, DirectiveDescriptor? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + var directive = reader.ReadPropertyName(nameof(DirectiveDescriptor.Directive)).ReadAsString(); + if (!Enum.TryParse(reader.ReadPropertyName(nameof(DirectiveDescriptor.Kind)).ReadAsString(), out var kind)) + { + return null; + } + + reader.ReadPropertyName(ValuePropertyName).Read(); + var result = DirectiveDescriptor.CreateDirective(directive, kind, builder => serializer.Populate(reader, builder)); + reader.AssertTokenAndAdvance(JsonToken.EndObject); + return result; + } + + public override void WriteJson(JsonWriter writer, DirectiveDescriptor? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + writer.WritePropertyName(nameof(DirectiveDescriptor.Directive)); + writer.WriteValue(value.Directive); + writer.WritePropertyName(nameof(DirectiveDescriptor.Kind)); + writer.WriteValue(value.Kind.ToString()); + writer.WritePropertyName(ValuePropertyName); + writer.WriteStartObject(); + writer.WritePropertyName(nameof(DirectiveDescriptor.Description)); + writer.WriteValue(value.Description); + writer.WritePropertyName(nameof(DirectiveDescriptor.DisplayName)); + writer.WriteValue(value.DisplayName); + writer.WritePropertyName(nameof(DirectiveDescriptor.Usage)); + writer.WriteValue(value.Usage.ToString()); + writer.WritePropertyName(nameof(DirectiveDescriptor.Tokens)); + writer.WriteStartArray(); + + foreach (var token in value.Tokens) + { + writer.WriteStartObject(); + writer.WritePropertyName(nameof(DirectiveTokenDescriptor.Kind)); + writer.WriteValue(token.Kind.ToString()); + writer.WritePropertyName(nameof(DirectiveTokenDescriptor.Optional)); + writer.WriteValue(token.Optional); + writer.WritePropertyName(nameof(DirectiveTokenDescriptor.Name)); + writer.WriteValue(token.Name); + writer.WritePropertyName(nameof(DirectiveTokenDescriptor.Description)); + writer.WriteValue(token.Description); + writer.WriteEndObject(); + } + + writer.WriteEndArray(); + writer.WriteEndObject(); + writer.WriteEndObject(); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DirectiveTokenDescriptorConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DirectiveTokenDescriptorConverter.cs new file mode 100644 index 00000000000..bec16f643d8 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/DirectiveTokenDescriptorConverter.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNetCore.Razor.Language; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class DirectiveTokenDescriptorConverter : JsonConverter +{ + public override DirectiveTokenDescriptor? ReadJson(JsonReader reader, Type objectType, DirectiveTokenDescriptor? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var obj = JObject.Load(reader); + + if (obj == null || !Enum.TryParse(obj[nameof(DirectiveTokenDescriptor.Kind)]!.Value(), out var kind)) + { + return null; + } + + return DirectiveTokenDescriptor.CreateToken( + kind: kind, + optional: obj[nameof(DirectiveTokenDescriptor.Optional)]!.Value(), + name: obj[nameof(DirectiveTokenDescriptor.Name)]!.Value(), + description: obj[nameof(DirectiveTokenDescriptor.Description)]!.Value()); + } + + public override void WriteJson(JsonWriter writer, DirectiveTokenDescriptor? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + JObject.FromObject(value).WriteTo(writer); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/EncodingConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/EncodingConverter.cs new file mode 100644 index 00000000000..38f5b3ee5e5 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/EncodingConverter.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; +using System; +using System.Text; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class EncodingConverter : JsonConverter +{ + public override Encoding? ReadJson(JsonReader reader, Type objectType, Encoding? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var name = reader.ReadAsString(); + return name is null ? null : Encoding.GetEncoding(name); + } + + public override void WriteJson(JsonWriter writer, Encoding? value, JsonSerializer serializer) + { + writer.WriteValue(value?.WebName); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/ItemCollectionConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/ItemCollectionConverter.cs new file mode 100644 index 00000000000..3569a9b1aae --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/ItemCollectionConverter.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Razor.Language; +using Newtonsoft.Json; +using System; +using System.Diagnostics; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class ItemCollectionConverter : JsonConverter +{ + public override ItemCollection? ReadJson(JsonReader reader, Type objectType, ItemCollection? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + var result = existingValue ?? new ItemCollection(); + while (reader.Read() && reader.TokenType == JsonToken.PropertyName) + { + var propertyName = (string)reader.Value!; + var value = reader.ReadAsString(); + result.Add(propertyName, value); + } + + Debug.Assert(reader.TokenType == JsonToken.EndObject); + return result; + } + + public override void WriteJson(JsonWriter writer, ItemCollection? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + + foreach (var pair in value) + { + if (pair.Key is string k && pair.Value is string v) + { + writer.WritePropertyName(k); + writer.WriteValue(v); + } + else + { + Debug.Assert(false, $"Cannot serialize non-string annotation {pair}"); + } + } + + writer.WriteEndObject(); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorCodeDocumentSerializer.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorCodeDocumentSerializer.cs new file mode 100644 index 00000000000..644d6d57868 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorCodeDocumentSerializer.cs @@ -0,0 +1,362 @@ +// 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 Microsoft.AspNetCore.Razor.Language.CodeGeneration; +using Microsoft.AspNetCore.Razor.Language.Intermediate; +using Microsoft.CodeAnalysis.Razor.Serialization; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class RazorCodeDocumentSerializer +{ + private const string TagHelperContext = nameof(TagHelperContext); + private const string ParserOptions = nameof(ParserOptions); + private const string SyntaxTree = nameof(SyntaxTree); + private const string DocumentIntermediateNode = nameof(DocumentIntermediateNode); + private const string FileKind = nameof(FileKind); + private const string CssScope = nameof(CssScope); + private const string CSharpDocument = nameof(CSharpDocument); + private const string HtmlDocument = nameof(HtmlDocument); + private const string Namespace = nameof(Namespace); + + private readonly JsonSerializer _serializer; + + public static readonly RazorCodeDocumentSerializer Instance = new(Formatting.None); + + // internal for testing + internal RazorCodeDocumentSerializer(Formatting formatting) + { + _serializer = new JsonSerializer + { + Formatting = formatting, + Converters = + { + RazorDiagnosticJsonConverter.Instance, + TagHelperDescriptorJsonConverter.Instance, + new EncodingConverter(), + new RazorCodeGenerationOptionsConverter(), + new SourceSpanConverter(), + new RazorParserOptionsConverter(), + new DirectiveDescriptorConverter(), + new DirectiveTokenDescriptorConverter(), + new ItemCollectionConverter(), + new RazorSourceDocumentConverter(), + }, + ContractResolver = new RazorContractResolver(), + TypeNameHandling = TypeNameHandling.Auto, + SerializationBinder = new RazorSerializationBinder(), + DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, + }; + } + + public RazorCodeDocument? Deserialize(string json, RazorSourceDocument source) + { + using var textReader = new StringReader(json); + using var jsonReader = new JsonTextReader(textReader); + return Deserialize(jsonReader, source); + } + + public RazorCodeDocument? Deserialize(JsonReader reader, RazorSourceDocument source) + { + if (!reader.Read() || reader.TokenType != JsonToken.StartObject) + { + return null; + } + + var document = RazorCodeDocument.Create(source); + + reader.ReadProperties(propertyName => + { + switch (propertyName) + { + case nameof(FileKind): + document.SetFileKind(reader.ReadAsString()); + break; + case nameof(CssScope): + document.SetCssScope(reader.ReadAsString()); + break; + case nameof(TagHelperContext): + if (reader.Read() && reader.TokenType == JsonToken.StartObject) + { + string? prefix = null; + IReadOnlyList? tagHelpers = null; + reader.ReadProperties(propertyName => + { + switch (propertyName) + { + case nameof(TagHelperDocumentContext.Prefix): + reader.Read(); + prefix = (string?)reader.Value; + break; + case nameof(TagHelperDocumentContext.TagHelpers): + reader.Read(); + tagHelpers = _serializer.Deserialize?>(reader); + break; + } + }); + if (tagHelpers != null) + { + document.SetTagHelperContext(TagHelperDocumentContext.Create(prefix, tagHelpers)); + } + } + break; + case nameof(ParserOptions): + reader.Read(); + document.SetParserOptions(_serializer.Deserialize(reader)); + break; + case nameof(DocumentIntermediateNode): + reader.Read(); + document.SetDocumentIntermediateNode(_serializer.Deserialize(reader)); + break; + case nameof(SyntaxTree): + if (reader.Read() && DeserializeSyntaxTree(reader, document) is { } syntaxTree) + { + document.SetSyntaxTree(syntaxTree); + } + break; + case nameof(CSharpDocument): + if (reader.Read() && DeserializeCSharpDocument(reader, document) is { } cSharpDocument) + { + document.SetCSharpDocument(cSharpDocument); + } + break; + case nameof(HtmlDocument): + if (reader.Read() && DeserializeHtmlDocument(reader, document) is { } htmlDocument) + { + document.Items[typeof(RazorHtmlDocument)] = htmlDocument; + } + break; + case nameof(Namespace): + document.SetNamespace(reader.ReadAsString()); + break; + } + }); + + return document; + } + + public string Serialize(RazorCodeDocument? document) + { + using var textWriter = new StringWriter(); + using var jsonWriter = new JsonTextWriter(textWriter); + Serialize(jsonWriter, document); + return textWriter.ToString(); + } + + public void Serialize(JsonWriter writer, RazorCodeDocument? document) + { + if (document == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + + if (document.GetFileKind() is { } fileKind) + { + writer.WritePropertyName(nameof(FileKind)); + writer.WriteValue(fileKind); + } + + if (document.GetCssScope() is { } cssScope) + { + writer.WritePropertyName(nameof(CssScope)); + writer.WriteValue(cssScope); + } + + if (document.GetDocumentIntermediateNode() is { } intermediateNode) + { + writer.WritePropertyName(DocumentIntermediateNode); + _serializer.Serialize(writer, intermediateNode); + } + + if (document.GetTagHelperContext() is { } tagHelperContext) + { + writer.WritePropertyName(TagHelperContext); + writer.WriteStartObject(); + + if (tagHelperContext.Prefix is { } prefix) + { + writer.WritePropertyName(nameof(TagHelperDocumentContext.Prefix)); + writer.WriteValue(prefix); + } + + if (tagHelperContext.TagHelpers is { Count: > 0 } tagHelpers) + { + writer.WritePropertyName(nameof(TagHelperDocumentContext.TagHelpers)); + _serializer.Serialize(writer, tagHelpers); + } + + writer.WriteEndObject(); + } + + if (document.GetSyntaxTree() is { } syntaxTree) + { + writer.WritePropertyName(SyntaxTree); + SerializeSyntaxTree(writer, document, syntaxTree); + } + + if (document.GetCSharpDocument() is { } cSharpDocument) + { + writer.WritePropertyName(CSharpDocument); + SerializeCSharpDocument(writer, cSharpDocument); + } + + if (document.GetHtmlDocument() is { } htmlDocument) + { + writer.WritePropertyName(HtmlDocument); + SerializeHtmlDocument(writer, htmlDocument); + } + + document.TryComputeNamespace(fallbackToRootNamespace: true, check: false, out var @namespace); + writer.WritePropertyName(Namespace); + writer.WriteValue(@namespace); + + writer.WriteEndObject(); + } + + private void SerializeSyntaxTree(JsonWriter writer, RazorCodeDocument owner, RazorSyntaxTree syntaxTree) + { + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(RazorSyntaxTree.Options)); + _serializer.Serialize(writer, syntaxTree.Options); + + if (syntaxTree.Source != owner.Source) + { + writer.WritePropertyName(nameof(RazorSyntaxTree.Source)); + _serializer.Serialize(writer, syntaxTree.Source); + } + + writer.WriteEndObject(); + } + + private RazorSyntaxTree? DeserializeSyntaxTree(JsonReader reader, RazorCodeDocument owner) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + RazorParserOptions? options = null; + RazorSourceDocument source = owner.Source; + reader.ReadProperties(propertyName => + { + switch (propertyName) + { + case nameof(RazorSyntaxTree.Options): + reader.Read(); + options = _serializer.Deserialize(reader); + break; + case nameof(RazorSyntaxTree.Source): + reader.Read(); + source = _serializer.Deserialize(reader)!; + break; + } + }); + return RazorSyntaxTree.Parse(source, options); + } + + private void SerializeCSharpDocument(JsonWriter writer, RazorCSharpDocument document) + { + writer.WriteStartObject(); + writer.WritePropertyName(nameof(RazorCSharpDocument.GeneratedCode)); + writer.WriteValue(document.GeneratedCode); + writer.WritePropertyName(nameof(RazorCSharpDocument.Options)); + _serializer.Serialize(writer, document.Options); + writer.WritePropertyName(nameof(RazorCSharpDocument.Diagnostics)); + _serializer.Serialize(writer, document.Diagnostics); + writer.WritePropertyName(nameof(RazorCSharpDocument.SourceMappings)); + _serializer.Serialize(writer, document.SourceMappings); + writer.WritePropertyName(nameof(RazorCSharpDocument.LinePragmas)); + _serializer.Serialize(writer, document.LinePragmas); + writer.WriteEndObject(); + } + + private RazorCSharpDocument? DeserializeCSharpDocument(JsonReader reader, RazorCodeDocument owner) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + string? generatedCode = null; + RazorCodeGenerationOptions? options = null; + IReadOnlyList? diagnostics = null; + IReadOnlyList? sourceMappings = null; + IReadOnlyList? linePragmas = null; + reader.ReadProperties((propertyName) => + { + switch (propertyName) + { + case nameof(RazorCSharpDocument.GeneratedCode): + generatedCode = reader.ReadAsString(); + break; + case nameof(RazorCSharpDocument.Options): + reader.Read(); + options = _serializer.Deserialize(reader); + break; + case nameof(RazorCSharpDocument.Diagnostics): + reader.Read(); + diagnostics = _serializer.Deserialize>(reader); + break; + case nameof(RazorCSharpDocument.SourceMappings): + reader.Read(); + sourceMappings = _serializer.Deserialize>(reader); + break; + case nameof(RazorCSharpDocument.LinePragmas): + reader.Read(); + linePragmas = _serializer.Deserialize>(reader); + break; + } + }); + return RazorCSharpDocument.Create(owner, generatedCode, options, diagnostics, sourceMappings, linePragmas); + } + + private void SerializeHtmlDocument(JsonWriter writer, RazorHtmlDocument document) + { + writer.WriteStartObject(); + writer.WritePropertyName(nameof(RazorHtmlDocument.GeneratedCode)); + writer.WriteValue(document.GeneratedCode); + writer.WritePropertyName(nameof(RazorHtmlDocument.Options)); + _serializer.Serialize(writer, document.Options); + writer.WritePropertyName(nameof(RazorHtmlDocument.SourceMappings)); + _serializer.Serialize(writer, document.SourceMappings); + writer.WriteEndObject(); + } + + private RazorHtmlDocument? DeserializeHtmlDocument(JsonReader reader, RazorCodeDocument owner) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + string? generatedCode = null; + RazorCodeGenerationOptions? options = null; + SourceMapping[]? sourceMappings = null; + reader.ReadProperties((propertyName) => + { + switch (propertyName) + { + case nameof(RazorCSharpDocument.GeneratedCode): + generatedCode = reader.ReadAsString(); + break; + case nameof(RazorCSharpDocument.Options): + reader.Read(); + options = _serializer.Deserialize(reader); + break; + case nameof(RazorCSharpDocument.SourceMappings): + reader.Read(); + sourceMappings = _serializer.Deserialize(reader); + break; + } + }); + return RazorHtmlDocument.Create(owner, generatedCode, options, sourceMappings); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorCodeGenerationOptionsConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorCodeGenerationOptionsConverter.cs new file mode 100644 index 00000000000..67db1dfb15d --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorCodeGenerationOptionsConverter.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis.Razor.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class RazorCodeGenerationOptionsConverter : JsonConverter +{ + private const string ValuePropertyName = "_"; + + public override RazorCodeGenerationOptions? ReadJson(JsonReader reader, Type objectType, RazorCodeGenerationOptions? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + var designTime = reader.ReadPropertyName(nameof(RazorCodeGenerationOptions.DesignTime)).ReadAsBoolean().GetValueOrDefault(); + reader.ReadPropertyName(ValuePropertyName).Read(); + var result = designTime ? RazorCodeGenerationOptions.CreateDesignTime(factory) : RazorCodeGenerationOptions.Create(factory); + reader.AssertTokenAndAdvance(JsonToken.EndObject); + return result; + + void factory(RazorCodeGenerationOptionsBuilder builder) + { + serializer.Populate(reader, builder); + } + } + + public override void WriteJson(JsonWriter writer, RazorCodeGenerationOptions? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + writer.WritePropertyName(nameof(RazorCodeGenerationOptions.DesignTime)); + writer.WriteValue(value.DesignTime); + writer.WritePropertyName(ValuePropertyName); + + var jObject = JObject.FromObject(value); + jObject.Remove(nameof(RazorCodeGenerationOptions.DesignTime)); + jObject.WriteTo(writer); + + writer.WriteEndObject(); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorContractResolver.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorContractResolver.cs new file mode 100644 index 00000000000..e28847598e8 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorContractResolver.cs @@ -0,0 +1,59 @@ +using Microsoft.AspNetCore.Razor.Language.Intermediate; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.Reflection; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class RazorContractResolver : DefaultContractResolver +{ + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + var property = base.CreateProperty(member, memberSerialization); + + if (property.DeclaringType == typeof(LazyIntermediateToken)) + { + if (property.PropertyName == nameof(LazyIntermediateToken.Content)) + { + property.Writable = true; + property.ValueProvider = new DelegateValueProvider( + static token => token.Content, + static (token, content) => token.Content = content); + } + else + { + property.Ignored = true; + } + } + + if (property.DeclaringType == typeof(DocumentIntermediateNode) && property.PropertyName == nameof(DocumentIntermediateNode.Target)) + { + property.Ignored = true; + } + + return property; + } + + private class DelegateValueProvider : IValueProvider + { + private readonly Func _getter; + private readonly Action _setter; + + public DelegateValueProvider(Func getter, Action setter) + { + _getter = getter; + _setter = setter; + } + + public object? GetValue(object target) + { + return _getter((TTarget)target); + } + + public void SetValue(object target, object? value) + { + _setter((TTarget)target, (TValue?)value); + } + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorParserOptionsConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorParserOptionsConverter.cs new file mode 100644 index 00000000000..7f216dd6f73 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorParserOptionsConverter.cs @@ -0,0 +1,63 @@ +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis.Razor.Serialization; +using Newtonsoft.Json; +using System; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class RazorParserOptionsConverter : JsonConverter +{ + private const string ValuePropertyName = "_"; + + public override RazorParserOptions? ReadJson(JsonReader reader, Type objectType, RazorParserOptions? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + var designTime = reader.ReadPropertyName(nameof(RazorParserOptions.DesignTime)).ReadAsBoolean().GetValueOrDefault(); + var fileKind = reader.ReadPropertyName(nameof(RazorParserOptions.FileKind)).ReadAsString(); + reader.ReadPropertyName(ValuePropertyName).Read(); + var result = designTime ? RazorParserOptions.CreateDesignTime(factory, fileKind) : RazorParserOptions.Create(factory, fileKind); + reader.AssertTokenAndAdvance(JsonToken.EndObject); + return result; + + void factory(RazorParserOptionsBuilder builder) + { + serializer.Populate(reader, builder); + } + } + + public override void WriteJson(JsonWriter writer, RazorParserOptions? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + writer.WritePropertyName(nameof(RazorParserOptions.DesignTime)); + writer.WriteValue(value.DesignTime); + writer.WritePropertyName(nameof(RazorParserOptions.FileKind)); + writer.WriteValue(value.FileKind); + writer.WritePropertyName(ValuePropertyName); + writer.WriteStartObject(); + writer.WritePropertyName(nameof(RazorParserOptions.ParseLeadingDirectives)); + writer.WriteValue(value.ParseLeadingDirectives); + writer.WritePropertyName(nameof(RazorParserOptions.Version)); + writer.WriteValue(value.Version.ToString()); + writer.WritePropertyName(nameof(RazorParserOptions.Directives)); + writer.WriteStartArray(); + + foreach (var directive in value.Directives) + { + serializer.Serialize(writer, directive); + } + + writer.WriteEndArray(); + writer.WriteEndObject(); + writer.WriteEndObject(); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorSerializationBinder.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorSerializationBinder.cs new file mode 100644 index 00000000000..ddc11e85859 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorSerializationBinder.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Razor.Language.Intermediate; +using Newtonsoft.Json.Serialization; +using System; +using System.Reflection; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class RazorSerializationBinder : DefaultSerializationBinder +{ + private readonly Assembly _assembly = typeof(IntermediateNode).Assembly; + + public override void BindToName(Type serializedType, out string? assemblyName, out string? typeName) + { + assemblyName = null; + typeName = null; + + if (typeof(IntermediateNode).IsAssignableFrom(serializedType)) + { + typeName = serializedType.Name; + } + } + + public override Type BindToType(string? assemblyName, string typeName) + { + return _assembly.GetType("Microsoft.AspNetCore.Razor.Language.Intermediate." + typeName) ?? + _assembly.GetType("Microsoft.AspNetCore.Razor.Language.Extensions." + typeName); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorSourceDocumentConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorSourceDocumentConverter.cs new file mode 100644 index 00000000000..176433d9548 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/RazorSourceDocumentConverter.cs @@ -0,0 +1,78 @@ +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.AspNetCore.Razor.PooledObjects; +using Microsoft.CodeAnalysis.Razor.Serialization; +using Newtonsoft.Json; +using System; +using System.Buffers; +using System.Text; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class RazorSourceDocumentConverter : JsonConverter +{ + private const string ContentPropertyName = "Content"; + + public override RazorSourceDocument? ReadJson(JsonReader reader, Type objectType, RazorSourceDocument? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + Encoding? encoding = null; + string? filePath = null; + string? relativePath = null; + string? content = null; + reader.ReadProperties(propertyName => + { + switch (propertyName) + { + case nameof(RazorSourceDocument.Encoding): + encoding = serializer.Deserialize(reader); + break; + case nameof(RazorSourceDocument.FilePath): + filePath = reader.ReadAsString(); + break; + case nameof(RazorSourceDocument.RelativePath): + relativePath = reader.ReadAsString(); + break; + case nameof(ContentPropertyName): + content = reader.ReadAsString(); + break; + } + }); + return RazorSourceDocument.Create(content, encoding, new RazorSourceDocumentProperties(filePath, relativePath)); + } + + public override void WriteJson(JsonWriter writer, RazorSourceDocument? value, JsonSerializer serializer) + { + if (value is null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + writer.WritePropertyName(nameof(RazorSourceDocument.Encoding)); + serializer.Serialize(writer, value.Encoding); + writer.WritePropertyName(nameof(RazorSourceDocument.FilePath)); + writer.WriteValue(value.FilePath); + writer.WritePropertyName(nameof(RazorSourceDocument.RelativePath)); + writer.WriteValue(value.RelativePath); + writer.WritePropertyName(ContentPropertyName); + + var content = ArrayPool.Shared.Rent(value.Length); + value.CopyTo(0, content, 0, value.Length); + + using (StringBuilderPool.GetPooledObject(out var stringBuilder)) + { + stringBuilder.EnsureCapacity(value.Length); + stringBuilder.Append(content); + writer.WriteValue(stringBuilder.ToString()); + } + + ArrayPool.Shared.Return(content); + + writer.WriteEndObject(); + } +} diff --git a/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/SourceSpanConverter.cs b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/SourceSpanConverter.cs new file mode 100644 index 00000000000..3f7d71d12b8 --- /dev/null +++ b/src/Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators/Serialization/SourceSpanConverter.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Razor.Language; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; + +namespace Microsoft.NET.Sdk.Razor.SourceGenerators; + +internal sealed class SourceSpanConverter : JsonConverter +{ + public override SourceSpan? ReadJson(JsonReader reader, Type objectType, SourceSpan? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var span = JObject.Load(reader); + + if (span == null) + { + return null; + } + + return new SourceSpan( + filePath: span[nameof(SourceSpan.FilePath)]!.Value(), + absoluteIndex: span[nameof(SourceSpan.AbsoluteIndex)]!.Value(), + lineIndex: span[nameof(SourceSpan.LineIndex)]!.Value(), + characterIndex: span[nameof(SourceSpan.CharacterIndex)]!.Value(), + length: span[nameof(SourceSpan.Length)]!.Value(), + lineCount: span[nameof(SourceSpan.LineCount)]!.Value(), + endCharacterIndex: span[nameof(SourceSpan.EndCharacterIndex)]!.Value()); + } + + public override void WriteJson(JsonWriter writer, SourceSpan? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + writer.WriteStartObject(); + writer.WritePropertyName(nameof(SourceSpan.FilePath)); + writer.WriteValue(value.Value.FilePath); + writer.WritePropertyName(nameof(SourceSpan.AbsoluteIndex)); + writer.WriteValue(value.Value.AbsoluteIndex); + writer.WritePropertyName(nameof(SourceSpan.LineIndex)); + writer.WriteValue(value.Value.LineIndex); + writer.WritePropertyName(nameof(SourceSpan.CharacterIndex)); + writer.WriteValue(value.Value.CharacterIndex); + writer.WritePropertyName(nameof(SourceSpan.Length)); + writer.WriteValue(value.Value.Length); + writer.WritePropertyName(nameof(SourceSpan.LineCount)); + writer.WriteValue(value.Value.LineCount); + writer.WritePropertyName(nameof(SourceSpan.EndCharacterIndex)); + writer.WriteValue(value.Value.EndCharacterIndex); + writer.WriteEndObject(); + } +} diff --git a/src/Compiler/Microsoft.Net.Compilers.Razor.Toolset/Microsoft.Net.Compilers.Razor.Toolset.csproj b/src/Compiler/Microsoft.Net.Compilers.Razor.Toolset/Microsoft.Net.Compilers.Razor.Toolset.csproj index 5b692f61c6d..b5529432174 100644 --- a/src/Compiler/Microsoft.Net.Compilers.Razor.Toolset/Microsoft.Net.Compilers.Razor.Toolset.csproj +++ b/src/Compiler/Microsoft.Net.Compilers.Razor.Toolset/Microsoft.Net.Compilers.Razor.Toolset.csproj @@ -24,6 +24,7 @@ + @@ -39,6 +40,7 @@ + diff --git a/src/Compiler/shared/JsonReaderExtensions.cs b/src/Compiler/shared/JsonReaderExtensions.cs index 20fb9f408c5..aae60bf93a2 100644 --- a/src/Compiler/shared/JsonReaderExtensions.cs +++ b/src/Compiler/shared/JsonReaderExtensions.cs @@ -18,6 +18,12 @@ public static bool ReadTokenAndAdvance(this JsonReader reader, JsonToken expecte return reader.TokenType == expectedTokenType && reader.Read(); } + public static bool AssertTokenAndAdvance(this JsonReader reader, JsonToken expectedTokenType) + { + Debug.Assert(reader.TokenType == expectedTokenType); + return reader.Read(); + } + public static void ReadProperties(this JsonReader reader, Action onProperty) { while (reader.Read()) @@ -56,4 +62,26 @@ public static string ReadNextStringProperty(this JsonReader reader, string prope throw new JsonSerializationException($"Could not find string property '{propertyName}'."); } + + public static JsonReader ReadPropertyName(this JsonReader reader, string propertyName) + { + string found; + if (!reader.Read()) + { + found = "EOF"; + } + else if (reader.TokenType != JsonToken.PropertyName) + { + found = reader.TokenType.ToString(); + } + else if ((string)reader.Value != propertyName) + { + found = $"'{reader.Value}'"; + } + else + { + return reader; + } + throw new JsonSerializationException($"Expected property '{propertyName}' at '{reader.Path}', found {found}."); + } } diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs index b98a89d8fde..1efacde93ed 100644 --- a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTests.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #nullable enable @@ -9,10 +9,14 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Test.Common; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.ExternalAccess.RazorCompiler; using Microsoft.CodeAnalysis.Text; +using Newtonsoft.Json; +using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.NET.Sdk.Razor.SourceGenerators @@ -143,7 +147,11 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. "; result.VerifyPageOutput(pageOutput); + const string jsonName = "Pages_Index_razor.rsg.json"; + var json = result.GetHostOutputs()[0].Value; + result.VerifyHostOutput( + (jsonName, json), (@"Pages_Index_razor.rsg.cs", @"// #pragma warning disable 1591 namespace MyApp.Pages @@ -188,6 +196,15 @@ protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components. Assert.Empty(result.Diagnostics); Assert.Single(result.GeneratedSources); + + var document = RazorCodeDocumentSerializer.Instance.Deserialize(json, RazorSourceDocument.Create("", "")); + Assert.NotNull(document); + + var json2 = RazorCodeDocumentSerializer.Instance.Serialize(document); + AssertEx.EqualOrDiff(json, json2); + + var formattedJson = new RazorCodeDocumentSerializer(Formatting.Indented).Serialize(document); + Extensions.VerifyTextMatchesBaseline(formattedJson, jsonName); } [Fact] diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs index 1c4da81ea38..96467cd3077 100644 --- a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/RazorSourceGeneratorTestsBase.cs @@ -223,8 +223,7 @@ protected static async Task VerifyRazorPageMatchesBaselineAsync(Compilation comp var html = await RenderRazorPageAsync(compilation, name); Extensions.VerifyTextMatchesBaseline( actualText: html, - fileName: name, - extension: "html", + fileName: $"{name}.html", testPath: testPath, testName: testName); } @@ -481,14 +480,14 @@ public static GeneratorRunResult VerifyOutputsMatchBaseline(this GeneratorRunRes return result; } - public static void VerifyTextMatchesBaseline(string actualText, string fileName, string extension, + public static void VerifyTextMatchesBaseline(string actualText, string fileName, [CallerFilePath] string testPath = "", [CallerMemberName] string testName = "") { // Create output directory. var baselineDirectory = CreateBaselineDirectory(testPath, testName); // Generate baseline if enabled. - var baselinePath = Path.Join(baselineDirectory, $"{fileName}.{extension}"); + var baselinePath = Path.Join(baselineDirectory, fileName); GenerateOutputBaseline(baselinePath, actualText); // Verify actual against baseline. diff --git a/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTests/SourceGenerator_RazorFiles_DesignTime/Pages_Index_razor.rsg.json b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTests/SourceGenerator_RazorFiles_DesignTime/Pages_Index_razor.rsg.json new file mode 100644 index 00000000000..8ed12b577cd --- /dev/null +++ b/src/Compiler/test/Microsoft.NET.Sdk.Razor.SourceGenerators.Tests/TestFiles/RazorSourceGeneratorTests/SourceGenerator_RazorFiles_DesignTime/Pages_Index_razor.rsg.json @@ -0,0 +1,3382 @@ +{"FileKind":"component","DocumentIntermediateNode": { + "Children": [ + { + "$type": "NamespaceDeclarationIntermediateNode", + "Children": [ + { + "$type": "UsingDirectiveIntermediateNode", + "Children": [], + "Content": "global::System", + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": null, + "AbsoluteIndex": 3, + "LineIndex": 1, + "CharacterIndex": 1, + "Length": 20, + "LineCount": 0, + "EndCharacterIndex": 21 + } + }, + { + "$type": "UsingDirectiveIntermediateNode", + "Children": [], + "Content": "global::System.Collections.Generic", + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": null, + "AbsoluteIndex": 26, + "LineIndex": 2, + "CharacterIndex": 1, + "Length": 40, + "LineCount": 0, + "EndCharacterIndex": 41 + } + }, + { + "$type": "UsingDirectiveIntermediateNode", + "Children": [], + "Content": "global::System.Linq", + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": null, + "AbsoluteIndex": 69, + "LineIndex": 3, + "CharacterIndex": 1, + "Length": 25, + "LineCount": 0, + "EndCharacterIndex": 26 + } + }, + { + "$type": "UsingDirectiveIntermediateNode", + "Children": [], + "Content": "global::System.Threading.Tasks", + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": null, + "AbsoluteIndex": 97, + "LineIndex": 4, + "CharacterIndex": 1, + "Length": 36, + "LineCount": 0, + "EndCharacterIndex": 37 + } + }, + { + "$type": "UsingDirectiveIntermediateNode", + "Children": [], + "Content": "global::Microsoft.AspNetCore.Components", + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": null, + "AbsoluteIndex": 136, + "LineIndex": 5, + "CharacterIndex": 1, + "Length": 45, + "LineCount": 0, + "EndCharacterIndex": 46 + } + }, + { + "$type": "ClassDeclarationIntermediateNode", + "Children": [ + { + "$type": "DesignTimeDirectiveIntermediateNode", + "Children": [], + "Annotations": {}, + "Diagnostics": [] + }, + { + "$type": "CSharpCodeIntermediateNode", + "Children": [ + { + "$type": "IntermediateToken", + "Children": [], + "Content": "#pragma warning disable 0414", + "IsCSharp": true, + "Kind": 1, + "Annotations": {}, + "Diagnostics": [] + } + ], + "Annotations": {}, + "Diagnostics": [] + }, + { + "$type": "CSharpCodeIntermediateNode", + "Children": [ + { + "$type": "IntermediateToken", + "Children": [], + "Content": "private static object __o = null;", + "IsCSharp": true, + "Kind": 1, + "Annotations": {}, + "Diagnostics": [] + } + ], + "Annotations": {}, + "Diagnostics": [] + }, + { + "$type": "CSharpCodeIntermediateNode", + "Children": [ + { + "$type": "IntermediateToken", + "Children": [], + "Content": "#pragma warning restore 0414", + "IsCSharp": true, + "Kind": 1, + "Annotations": {}, + "Diagnostics": [] + } + ], + "Annotations": {}, + "Diagnostics": [] + }, + { + "$type": "MethodDeclarationIntermediateNode", + "Children": [ + { + "$type": "MarkupElementIntermediateNode", + "Attributes": { + "$type": "", + "$values": [] + }, + "Captures": { + "$type": "", + "$values": [] + }, + "SetKeys": { + "$type": "", + "$values": [] + }, + "Body": { + "$type": "", + "$values": [ + { + "$type": "HtmlContentIntermediateNode", + "Children": [ + { + "$type": "LazyIntermediateToken", + "Content": "Hello world", + "Children": [], + "IsHtml": true, + "Kind": 2, + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": "Pages/Index.razor", + "AbsoluteIndex": 4, + "LineIndex": 0, + "CharacterIndex": 4, + "Length": 11, + "LineCount": 0, + "EndCharacterIndex": 15 + } + } + ], + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": "Pages/Index.razor", + "AbsoluteIndex": 4, + "LineIndex": 0, + "CharacterIndex": 4, + "Length": 11, + "LineCount": 0, + "EndCharacterIndex": 15 + } + } + ] + }, + "Children": [ + { + "$type": "HtmlContentIntermediateNode", + "Children": [ + { + "$type": "LazyIntermediateToken", + "Content": "Hello world", + "Children": [], + "IsHtml": true, + "Kind": 2, + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": "Pages/Index.razor", + "AbsoluteIndex": 4, + "LineIndex": 0, + "CharacterIndex": 4, + "Length": 11, + "LineCount": 0, + "EndCharacterIndex": 15 + } + } + ], + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": "Pages/Index.razor", + "AbsoluteIndex": 4, + "LineIndex": 0, + "CharacterIndex": 4, + "Length": 11, + "LineCount": 0, + "EndCharacterIndex": 15 + } + } + ], + "TagName": "h1", + "Annotations": {}, + "Diagnostics": [], + "Source": { + "FilePath": "Pages/Index.razor", + "AbsoluteIndex": 0, + "LineIndex": 0, + "CharacterIndex": 0, + "Length": 20, + "LineCount": 0, + "EndCharacterIndex": 20 + } + } + ], + "Modifiers": [ + "protected", + "override" + ], + "MethodName": "BuildRenderTree", + "Parameters": [ + { + "Modifiers": [], + "TypeName": "global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder", + "ParameterName": "__builder" + } + ], + "ReturnType": "void", + "Annotations": { + "PrimaryMethod": "PrimaryMethod" + }, + "Diagnostics": [] + } + ], + "Modifiers": [ + "public", + "partial" + ], + "ClassName": "Index", + "BaseType": "global::Microsoft.AspNetCore.Components.ComponentBase", + "Interfaces": [], + "TypeParameters": [], + "Annotations": { + "PrimaryClass": "PrimaryClass" + }, + "Diagnostics": [] + } + ], + "Content": "MyApp.Pages", + "Annotations": { + "PrimaryNamespace": "PrimaryNamespace" + }, + "Diagnostics": [] + } + ], + "DocumentKind": "component.1.0", + "Options": { + "DesignTime": true, + "_": { + "IndentWithTabs": false, + "IndentSize": 4, + "RootNamespace": "MyApp", + "SuppressChecksum": true, + "SuppressNullabilityEnforcement": false, + "OmitMinimizedComponentAttributeValues": true, + "UseEnhancedLinePragma": true, + "SuppressMetadataAttributes": true, + "SuppressPrimaryMethodBody": false, + "SupportLocalizedComponentNames": false + } + }, + "Annotations": {}, + "Diagnostics": [] + },"TagHelperContext":{"TagHelpers": [ + { + "Kind": "Components.Component", + "Name": "MyApp.Pages.Index", + "AssemblyName": "TestProject", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Index" + } + ], + "Metadata": { + "Common.TypeName": "MyApp.Pages.Index", + "Common.TypeNameIdentifier": "Index", + "Common.TypeNamespace": "MyApp.Pages", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "MyApp.Pages.Index", + "AssemblyName": "TestProject", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "MyApp.Pages.Index" + } + ], + "Metadata": { + "Common.TypeName": "MyApp.Pages.Index", + "Common.TypeNameIdentifier": "Index", + "Common.TypeNamespace": "MyApp.Pages", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "NotAuthorized", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "NotAuthorized", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Authorizing", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "Authorizing", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Resource", + "TypeName": "System.Object", + "Metadata": { + "Common.PropertyName": "Resource", + "Common.GloballyQualifiedTypeName": "global::System.Object" + } + }, + { + "Kind": "Components.Component", + "Name": "RouteData", + "TypeName": "Microsoft.AspNetCore.Components.RouteData", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "RouteData", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData" + } + }, + { + "Kind": "Components.Component", + "Name": "DefaultLayout", + "TypeName": "System.Type", + "Metadata": { + "Common.PropertyName": "DefaultLayout", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + }, + { + "Kind": "Components.Component", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for all child content expressions.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView", + "Common.TypeNameIdentifier": "AuthorizeRouteView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "NotAuthorized", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized", + "Common.TypeNameIdentifier": "AuthorizeRouteView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Authorizing", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing", + "Common.TypeNameIdentifier": "AuthorizeRouteView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "Policy", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Policy", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "Roles", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Roles", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "NotAuthorized", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "NotAuthorized", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Authorized", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "Authorized", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Authorizing", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "Authorizing", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Resource", + "TypeName": "System.Object", + "Metadata": { + "Common.PropertyName": "Resource", + "Common.GloballyQualifiedTypeName": "global::System.Object" + } + }, + { + "Kind": "Components.Component", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for all child content expressions.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView", + "Common.TypeNameIdentifier": "AuthorizeView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent", + "Common.TypeNameIdentifier": "AuthorizeView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "NotAuthorized", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized", + "Common.TypeNameIdentifier": "AuthorizeView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Authorized", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'Authorized' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized", + "Common.TypeNameIdentifier": "AuthorizeView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Authorizing", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing", + "Common.TypeNameIdentifier": "AuthorizeView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState", + "Common.TypeNameIdentifier": "CascadingAuthenticationState", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Authorization", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent", + "Common.TypeNameIdentifier": "CascadingAuthenticationState", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.CascadingValue", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.CascadingValue" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.CascadingValue component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Name", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Name", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "IsFixed", + "TypeName": "System.Boolean", + "Metadata": { + "Common.PropertyName": "IsFixed", + "Common.GloballyQualifiedTypeName": "global::System.Boolean" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue", + "Common.TypeNameIdentifier": "CascadingValue", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.CascadingValue" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", + "Common.TypeNameIdentifier": "CascadingValue", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.DynamicComponent", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.DynamicComponent" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "Type", + "TypeName": "System.Type", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "Type", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + }, + { + "Kind": "Components.Component", + "Name": "Parameters", + "TypeName": "System.Collections.Generic.IDictionary", + "Metadata": { + "Common.PropertyName": "Parameters", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.DynamicComponent", + "Common.TypeNameIdentifier": "DynamicComponent", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.LayoutView", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.LayoutView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Layout", + "TypeName": "System.Type", + "Metadata": { + "Common.PropertyName": "Layout", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView", + "Common.TypeNameIdentifier": "LayoutView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.LayoutView" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", + "Common.TypeNameIdentifier": "LayoutView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.RouteView", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.RouteView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "RouteData", + "TypeName": "Microsoft.AspNetCore.Components.RouteData", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "RouteData", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData" + } + }, + { + "Kind": "Components.Component", + "Name": "DefaultLayout", + "TypeName": "System.Type", + "Metadata": { + "Common.PropertyName": "DefaultLayout", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.RouteView", + "Common.TypeNameIdentifier": "RouteView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Routing.Router", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Routing.Router" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "AppAssembly", + "TypeName": "System.Reflection.Assembly", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "AppAssembly", + "Common.GloballyQualifiedTypeName": "global::System.Reflection.Assembly" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAssemblies", + "TypeName": "System.Collections.Generic.IEnumerable", + "Metadata": { + "Common.PropertyName": "AdditionalAssemblies", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IEnumerable" + } + }, + { + "Kind": "Components.Component", + "Name": "NotFound", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "NotFound", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Found", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "Found", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Navigating", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "Navigating", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "OnNavigateAsync", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "OnNavigateAsync", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "PreferExactMatches", + "TypeName": "System.Boolean", + "Metadata": { + "Common.PropertyName": "PreferExactMatches", + "Common.GloballyQualifiedTypeName": "global::System.Boolean" + } + }, + { + "Kind": "Components.Component", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for all child content expressions.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router", + "Common.TypeNameIdentifier": "Router", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Routing.Router.NotFound", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "NotFound", + "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.NotFound", + "Common.TypeNameIdentifier": "Router", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Routing.Router.Found", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Found", + "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'Found' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Found", + "Common.TypeNameIdentifier": "Router", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Routing.Router.Navigating", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Navigating", + "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Navigating", + "Common.TypeNameIdentifier": "Router", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Splat", + "Name": "Attributes", + "AssemblyName": "Microsoft.AspNetCore.Components", + "Documentation": "Merges a collection of attributes into the current element or component.", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "*", + "Attributes": [ + { + "Name": "@attributes", + "Metadata": { + "Common.DirectiveAttribute": "True" + } + } + ] + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Splat", + "Name": "@attributes", + "TypeName": "System.Object", + "Documentation": "Merges a collection of attributes into the current element or component.", + "Metadata": { + "Common.PropertyName": "Attributes", + "Common.DirectiveAttribute": "True" + } + } + ], + "Metadata": { + "Common.ClassifyAttributesOnly": "True", + "Common.TypeName": "Microsoft.AspNetCore.Components.Attributes", + "Components.IsSpecialKind": "Components.Splat", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Ref", + "Name": "Ref", + "AssemblyName": "Microsoft.AspNetCore.Components", + "Documentation": "Populates the specified field or property with a reference to the element or component.", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "*", + "Attributes": [ + { + "Name": "@ref", + "Metadata": { + "Common.DirectiveAttribute": "True" + } + } + ] + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Ref", + "Name": "@ref", + "TypeName": "System.Object", + "Documentation": "Populates the specified field or property with a reference to the element or component.", + "Metadata": { + "Common.PropertyName": "Ref", + "Common.DirectiveAttribute": "True" + } + } + ], + "Metadata": { + "Common.ClassifyAttributesOnly": "True", + "Common.TypeName": "Microsoft.AspNetCore.Components.Ref", + "Components.IsSpecialKind": "Components.Ref", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Key", + "Name": "Key", + "AssemblyName": "Microsoft.AspNetCore.Components", + "Documentation": "Ensures that the component or element will be preserved across renders if (and only if) the supplied key value matches.", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "*", + "Attributes": [ + { + "Name": "@key", + "Metadata": { + "Common.DirectiveAttribute": "True" + } + } + ] + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Key", + "Name": "@key", + "TypeName": "System.Object", + "Documentation": "Ensures that the component or element will be preserved across renders if (and only if) the supplied key value matches.", + "Metadata": { + "Common.PropertyName": "Key", + "Common.DirectiveAttribute": "True" + } + } + ], + "Metadata": { + "Common.ClassifyAttributesOnly": "True", + "Common.TypeName": "Microsoft.AspNetCore.Components.Key", + "Components.IsSpecialKind": "Components.Key", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", + "AssemblyName": "Microsoft.AspNetCore.Components.Forms", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator", + "Common.TypeNameIdentifier": "DataAnnotationsValidator", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.EditForm", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.EditForm" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "EditContext", + "TypeName": "Microsoft.AspNetCore.Components.Forms.EditContext", + "Metadata": { + "Common.PropertyName": "EditContext", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Forms.EditContext" + } + }, + { + "Kind": "Components.Component", + "Name": "Model", + "TypeName": "System.Object", + "Metadata": { + "Common.PropertyName": "Model", + "Common.GloballyQualifiedTypeName": "global::System.Object" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "OnSubmit", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "OnSubmit", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "OnValidSubmit", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "OnValidSubmit", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "OnInvalidSubmit", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "OnInvalidSubmit", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for all child content expressions.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm", + "Common.TypeNameIdentifier": "EditForm", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Forms.EditForm" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent", + "Common.TypeNameIdentifier": "EditForm", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "System.Boolean", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "global::System.Boolean" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "ValueChanged", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox", + "Common.TypeNameIdentifier": "InputCheckbox", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputDate", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputDate" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputDate component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "Type", + "TypeName": "Microsoft.AspNetCore.Components.Forms.InputDateType", + "IsEnum": true, + "Metadata": { + "Common.PropertyName": "Type", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Forms.InputDateType" + } + }, + { + "Kind": "Components.Component", + "Name": "ParsingErrorMessage", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "ParsingErrorMessage", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Common.PropertyName": "ValueChanged", + "Components.EventCallback": "True", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate", + "Common.TypeNameIdentifier": "InputDate", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputFile", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputFile" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "OnChange", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "OnChange", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputFile", + "Common.TypeNameIdentifier": "InputFile", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputNumber" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputNumber component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "ParsingErrorMessage", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "ParsingErrorMessage", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Common.PropertyName": "ValueChanged", + "Components.EventCallback": "True", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputNumber", + "Common.TypeNameIdentifier": "InputNumber", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputRadio", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputRadio" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputRadio component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Name", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Name", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadio", + "Common.TypeNameIdentifier": "InputRadio", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputRadioGroup component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Name", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Name", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Common.PropertyName": "ValueChanged", + "Components.EventCallback": "True", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup", + "Common.TypeNameIdentifier": "InputRadioGroup", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputRadioGroup.ChildContent", + "Common.TypeNameIdentifier": "InputRadioGroup", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputSelect" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputSelect component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Common.PropertyName": "ValueChanged", + "Components.EventCallback": "True", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect", + "Common.TypeNameIdentifier": "InputSelect", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Forms.InputSelect.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Forms.InputSelect" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputSelect.ChildContent", + "Common.TypeNameIdentifier": "InputSelect", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputText", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputText" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "ValueChanged", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputText", + "Common.TypeNameIdentifier": "InputText", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.InputTextArea", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.InputTextArea" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueChanged", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "ValueChanged", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ValueExpression", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "ValueExpression", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>" + } + }, + { + "Kind": "Components.Component", + "Name": "DisplayName", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "DisplayName", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputTextArea", + "Common.TypeNameIdentifier": "InputTextArea", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.ValidationMessage" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.ValidationMessage component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "For", + "TypeName": "System.Linq.Expressions.Expression>", + "Metadata": { + "Common.PropertyName": "For", + "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>", + "Components.GenericTyped": "True" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.ValidationMessage", + "Common.TypeNameIdentifier": "ValidationMessage", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Forms.ValidationSummary" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "Model", + "TypeName": "System.Object", + "Metadata": { + "Common.PropertyName": "Model", + "Common.GloballyQualifiedTypeName": "global::System.Object" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.ValidationSummary", + "Common.TypeNameIdentifier": "ValidationSummary", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "RouteData", + "TypeName": "Microsoft.AspNetCore.Components.RouteData", + "Metadata": { + "Common.PropertyName": "RouteData", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData" + } + }, + { + "Kind": "Components.Component", + "Name": "Selector", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Selector", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.FocusOnNavigate", + "Common.TypeNameIdentifier": "FocusOnNavigate", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Routing.NavigationLock", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Routing.NavigationLock" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "OnBeforeInternalNavigation", + "TypeName": "Microsoft.AspNetCore.Components.EventCallback", + "Metadata": { + "Common.PropertyName": "OnBeforeInternalNavigation", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback", + "Components.EventCallback": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ConfirmExternalNavigation", + "TypeName": "System.Boolean", + "Metadata": { + "Common.PropertyName": "ConfirmExternalNavigation", + "Common.GloballyQualifiedTypeName": "global::System.Boolean" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavigationLock", + "Common.TypeNameIdentifier": "NavigationLock", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Routing.NavLink", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Routing.NavLink" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ActiveClass", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "ActiveClass", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "AdditionalAttributes", + "TypeName": "System.Collections.Generic.IReadOnlyDictionary", + "Metadata": { + "Common.PropertyName": "AdditionalAttributes", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Match", + "TypeName": "Microsoft.AspNetCore.Components.Routing.NavLinkMatch", + "IsEnum": true, + "Metadata": { + "Common.PropertyName": "Match", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Routing.NavLinkMatch" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavLink", + "Common.TypeNameIdentifier": "NavLink", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Routing.NavLink.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Routing.NavLink" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.NavLink.ChildContent", + "Common.TypeNameIdentifier": "NavLink", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Web.HeadContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Web.HeadContent" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadContent", + "Common.TypeNameIdentifier": "HeadContent", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.HeadContent.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Web.HeadContent" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadContent.ChildContent", + "Common.TypeNameIdentifier": "HeadContent", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Web.HeadOutlet", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Web.HeadOutlet" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.HeadOutlet", + "Common.TypeNameIdentifier": "HeadOutlet", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Web.PageTitle", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Web.PageTitle" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.PageTitle", + "Common.TypeNameIdentifier": "PageTitle", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.PageTitle.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Web.PageTitle" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.PageTitle.ChildContent", + "Common.TypeNameIdentifier": "PageTitle", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ErrorContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ErrorContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "MaximumErrorCount", + "TypeName": "System.Int32", + "Metadata": { + "Common.PropertyName": "MaximumErrorCount", + "Common.GloballyQualifiedTypeName": "global::System.Int32" + } + }, + { + "Kind": "Components.Component", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for all child content expressions.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary", + "Common.TypeNameIdentifier": "ErrorBoundary", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ChildContent", + "Common.TypeNameIdentifier": "ErrorBoundary", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ErrorContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ErrorContent", + "ParentTag": "Microsoft.AspNetCore.Components.Web.ErrorBoundary" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'ErrorContent' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.ErrorBoundary.ErrorContent", + "Common.TypeNameIdentifier": "ErrorBoundary", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TItem", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TItem for the Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize component.", + "Metadata": { + "Common.PropertyName": "TItem", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Common.PropertyName": "ChildContent", + "Components.ChildContent": "True", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ItemContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Common.PropertyName": "ItemContent", + "Components.ChildContent": "True", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Placeholder", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "Placeholder", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "ItemSize", + "TypeName": "System.Single", + "Metadata": { + "Common.PropertyName": "ItemSize", + "Common.GloballyQualifiedTypeName": "global::System.Single" + } + }, + { + "Kind": "Components.Component", + "Name": "ItemsProvider", + "TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderDelegate", + "Metadata": { + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderDelegate", + "Common.PropertyName": "ItemsProvider", + "Components.DelegateSignature": "True", + "Components.GenericTyped": "True", + "Components.IsDelegateAwaitableResult": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Items", + "TypeName": "System.Collections.Generic.ICollection", + "Metadata": { + "Common.PropertyName": "Items", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.ICollection", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "OverscanCount", + "TypeName": "System.Int32", + "Metadata": { + "Common.PropertyName": "OverscanCount", + "Common.GloballyQualifiedTypeName": "global::System.Int32" + } + }, + { + "Kind": "Components.Component", + "Name": "SpacerElement", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "SpacerElement", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for all child content expressions.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize", + "Common.TypeNameIdentifier": "Virtualize", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web.Virtualization", + "Components.GenericTyped": "True", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ChildContent", + "Common.TypeNameIdentifier": "Virtualize", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web.Virtualization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ItemContent", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ItemContent", + "ParentTag": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'ItemContent' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.ItemContent", + "Common.TypeNameIdentifier": "Virtualize", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web.Virtualization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.Placeholder", + "AssemblyName": "Microsoft.AspNetCore.Components.Web", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "Placeholder", + "ParentTag": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.ChildContent", + "Name": "Context", + "TypeName": "System.String", + "Documentation": "Specifies the parameter name for the 'Placeholder' child content expression.", + "Metadata": { + "Components.ChildContentParameterName": "True", + "Common.PropertyName": "Context" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize.Placeholder", + "Common.TypeNameIdentifier": "Virtualize", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Web.Virtualization", + "Components.IsSpecialKind": "Components.ChildContent", + "Components.NameMatch": "Components.FullyQualifiedNameMatch", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.CascadingValue", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "CascadingValue" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "TValue", + "TypeName": "System.Type", + "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.CascadingValue component.", + "Metadata": { + "Common.PropertyName": "TValue", + "Components.TypeParameter": "True", + "Components.TypeParameterIsCascading": "False" + } + }, + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Value", + "TypeName": "TValue", + "Metadata": { + "Common.PropertyName": "Value", + "Common.GloballyQualifiedTypeName": "TValue", + "Components.GenericTyped": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Name", + "TypeName": "System.String", + "Metadata": { + "Common.PropertyName": "Name", + "Common.GloballyQualifiedTypeName": "global::System.String" + } + }, + { + "Kind": "Components.Component", + "Name": "IsFixed", + "TypeName": "System.Boolean", + "Metadata": { + "Common.PropertyName": "IsFixed", + "Common.GloballyQualifiedTypeName": "global::System.Boolean" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue", + "Common.TypeNameIdentifier": "CascadingValue", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.GenericTyped": "True", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "CascadingValue" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent", + "Common.TypeNameIdentifier": "CascadingValue", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.IsSpecialKind": "Components.ChildContent", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.DynamicComponent", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "DynamicComponent" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "Type", + "TypeName": "System.Type", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "Type", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + }, + { + "Kind": "Components.Component", + "Name": "Parameters", + "TypeName": "System.Collections.Generic.IDictionary", + "Metadata": { + "Common.PropertyName": "Parameters", + "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.DynamicComponent", + "Common.TypeNameIdentifier": "DynamicComponent", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.LayoutView", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "LayoutView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "ChildContent", + "TypeName": "Microsoft.AspNetCore.Components.RenderFragment", + "Metadata": { + "Common.PropertyName": "ChildContent", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment", + "Components.ChildContent": "True" + } + }, + { + "Kind": "Components.Component", + "Name": "Layout", + "TypeName": "System.Type", + "Metadata": { + "Common.PropertyName": "Layout", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView", + "Common.TypeNameIdentifier": "LayoutView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.ChildContent", + "Name": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "ChildContent", + "ParentTag": "LayoutView" + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView.ChildContent", + "Common.TypeNameIdentifier": "LayoutView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.IsSpecialKind": "Components.ChildContent", + "Runtime.Name": "Components.None" + } + }, + { + "Kind": "Components.Component", + "Name": "Microsoft.AspNetCore.Components.RouteView", + "AssemblyName": "Microsoft.AspNetCore.Components", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "RouteView" + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Component", + "Name": "RouteData", + "TypeName": "Microsoft.AspNetCore.Components.RouteData", + "IsEditorRequired": true, + "Metadata": { + "Common.PropertyName": "RouteData", + "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData" + } + }, + { + "Kind": "Components.Component", + "Name": "DefaultLayout", + "TypeName": "System.Type", + "Metadata": { + "Common.PropertyName": "DefaultLayout", + "Common.GloballyQualifiedTypeName": "global::System.Type" + } + } + ], + "Metadata": { + "Common.TypeName": "Microsoft.AspNetCore.Components.RouteView", + "Common.TypeNameIdentifier": "RouteView", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Runtime.Name": "Components.IComponent" + } + }, + { + "Kind": "Components.Bind", + "Name": "Bind", + "AssemblyName": "Microsoft.AspNetCore.Components", + "Documentation": "Binds the provided expression to an attribute and a change event, based on the naming of the bind attribute. For example: @bind-value=\"...\" and @bind-value:event=\"onchange\" will assign the current value of the expression to the 'value' attribute, and assign a delegate that attempts to set the value to the 'onchange' attribute.", + "CaseSensitive": true, + "TagMatchingRules": [ + { + "TagName": "*", + "Attributes": [ + { + "Name": "@bind-", + "NameComparison": 1, + "Metadata": { + "Common.DirectiveAttribute": "True" + } + } + ] + } + ], + "BoundAttributes": [ + { + "Kind": "Components.Bind", + "Name": "@bind-...", + "TypeName": "System.Collections.Generic.Dictionary", + "IndexerNamePrefix": "@bind-", + "IndexerTypeName": "System.Object", + "Documentation": "Binds the provided expression to an attribute and a change event, based on the naming of the bind attribute. For example: @bind-value=\"...\" and @bind-value:event=\"onchange\" will assign the current value of the expression to the 'value' attribute, and assign a delegate that attempts to set the value to the 'onchange' attribute.", + "Metadata": { + "Common.PropertyName": "Bind", + "Common.DirectiveAttribute": "True" + }, + "BoundAttributeParameters": [ + { + "Name": "format", + "TypeName": "System.String", + "Documentation": "Specifies a format to convert the value specified by the corresponding bind attribute. For example: @bind-value:format=\"...\" will apply a format string to the value specified in @bind-value=\"...\". The format string can currently only be used with expressions of type DateTime.", + "Metadata": { + "Common.PropertyName": "Format" + } + }, + { + "Name": "event", + "TypeName": "System.String", + "Documentation": "Specifies the event handler name to attach for change notifications for the value provided by the '@bind-...' attribute.", + "Metadata": { + "Common.PropertyName": "Event" + } + }, + { + "Name": "culture", + "TypeName": "System.Globalization.CultureInfo", + "Documentation": "Specifies the culture to use for conversions.", + "Metadata": { + "Common.PropertyName": "Culture" + } + }, + { + "Name": "get", + "TypeName": "System.Object", + "Documentation": "Specifies the expression to use for binding the value to the attribute.", + "Metadata": { + "Common.PropertyName": "Get", + "Components.Bind.AlternativeNotation": "True" + } + }, + { + "Name": "set", + "TypeName": "System.Delegate", + "Documentation": "Specifies the expression to use for updating the bound value when a new value is available.", + "Metadata": { + "Common.PropertyName": "Set" + } + }, + { + "Name": "after", + "TypeName": "System.Delegate", + "Documentation": "Specifies an action to run after the new value has been set.", + "Metadata": { + "Common.PropertyName": "After" + } + } + ] + } + ], + "Metadata": { + "Common.ClassifyAttributesOnly": "True", + "Common.TypeName": "Microsoft.AspNetCore.Components.Bind", + "Common.TypeNameIdentifier": "Bind", + "Common.TypeNamespace": "Microsoft.AspNetCore.Components", + "Components.Bind.Fallback": "True", + "Components.IsSpecialKind": "Components.Bind", + "Runtime.Name": "Components.None" + } + } + ]},"SyntaxTree":{"Options": { + "DesignTime": true, + "FileKind": "component", + "_": { + "ParseLeadingDirectives": false, + "Version": "8.0", + "Directives": [ + { + "Directive": "functions", + "Kind": "CodeBlock", + "_": { + "Description": "Specify a C# code block.", + "DisplayName": null, + "Usage": "Unrestricted", + "Tokens": [] + } + }, + { + "Directive": "implements", + "Kind": "SingleLine", + "_": { + "Description": "Declares an interface implementation for the current class.", + "DisplayName": null, + "Usage": "FileScopedMultipleOccurring", + "Tokens": [ + { + "Kind": "Type", + "Optional": false, + "Name": "TypeName", + "Description": "The interface type implemented by the current class." + } + ] + } + }, + { + "Directive": "inherits", + "Kind": "SingleLine", + "_": { + "Description": "Specify the base class for the current document.", + "DisplayName": null, + "Usage": "FileScopedSinglyOccurring", + "Tokens": [ + { + "Kind": "Type", + "Optional": false, + "Name": "TypeName", + "Description": "The base type that the current page inherits." + } + ] + } + }, + { + "Directive": "namespace", + "Kind": "SingleLine", + "_": { + "Description": "Specify the base namespace for the document.", + "DisplayName": null, + "Usage": "FileScopedSinglyOccurring", + "Tokens": [ + { + "Kind": "Namespace", + "Optional": false, + "Name": "Namespace", + "Description": "The namespace for the document." + } + ] + } + }, + { + "Directive": "attribute", + "Kind": "SingleLine", + "_": { + "Description": "Specifies the C# attribute that will be applied to the current class.", + "DisplayName": null, + "Usage": "FileScopedMultipleOccurring", + "Tokens": [ + { + "Kind": "Attribute", + "Optional": false, + "Name": "Attribute", + "Description": "The C# attribute that will be applied to the current class." + } + ] + } + }, + { + "Directive": "code", + "Kind": "CodeBlock", + "_": { + "Description": "Specify a C# code block.", + "DisplayName": null, + "Usage": "Unrestricted", + "Tokens": [] + } + }, + { + "Directive": "inject", + "Kind": "SingleLine", + "_": { + "Description": "Inject a service from the application's service container into a property.", + "DisplayName": null, + "Usage": "FileScopedMultipleOccurring", + "Tokens": [ + { + "Kind": "Type", + "Optional": false, + "Name": "TypeName", + "Description": "The type of the service to inject." + }, + { + "Kind": "Member", + "Optional": false, + "Name": "PropertyName", + "Description": "The name of the property." + } + ] + } + }, + { + "Directive": "layout", + "Kind": "SingleLine", + "_": { + "Description": "Declares a layout type for the current document.", + "DisplayName": null, + "Usage": "FileScopedSinglyOccurring", + "Tokens": [ + { + "Kind": "Type", + "Optional": false, + "Name": "TypeName", + "Description": "The interface type implemented by the current document." + } + ] + } + }, + { + "Directive": "page", + "Kind": "SingleLine", + "_": { + "Description": "Mark the page as a routable component.", + "DisplayName": null, + "Usage": "FileScopedMultipleOccurring", + "Tokens": [ + { + "Kind": "String", + "Optional": false, + "Name": "route template", + "Description": "An optional route template for the component." + } + ] + } + }, + { + "Directive": "typeparam", + "Kind": "SingleLine", + "_": { + "Description": "Declares a generic type parameter for the generated component class.", + "DisplayName": null, + "Usage": "FileScopedMultipleOccurring", + "Tokens": [ + { + "Kind": "Member", + "Optional": false, + "Name": "type parameter", + "Description": "The name of the type parameter." + }, + { + "Kind": "GenericTypeConstraint", + "Optional": true, + "Name": "type parameter constraint", + "Description": "The constraints applied to the type parameter." + } + ] + } + }, + { + "Directive": "preservewhitespace", + "Kind": "SingleLine", + "_": { + "Description": "Specifies whether or not whitespace should be preserved exactly. Defaults to false for better performance.", + "DisplayName": null, + "Usage": "FileScopedSinglyOccurring", + "Tokens": [ + { + "Kind": "Boolean", + "Optional": false, + "Name": "Preserve", + "Description": "True if whitespace should be preserved, otherwise false." + } + ] + } + }, + { + "Directive": "section", + "Kind": "RazorBlock", + "_": { + "Description": "Define a section to be rendered in the configured layout page.", + "DisplayName": null, + "Usage": "Unrestricted", + "Tokens": [ + { + "Kind": "Member", + "Optional": false, + "Name": "SectionName", + "Description": "The name of the section." + } + ] + } + } + ] + } + }},"CSharpDocument":{"GeneratedCode":"// \r\n#pragma warning disable 1591\r\nnamespace MyApp.Pages\r\n{\r\n #line hidden\r\n using global::System;\r\n using global::System.Collections.Generic;\r\n using global::System.Linq;\r\n using global::System.Threading.Tasks;\r\n using global::Microsoft.AspNetCore.Components;\r\n public partial class Index : global::Microsoft.AspNetCore.Components.ComponentBase\r\n {\r\n #pragma warning disable 219\r\n private void __RazorDirectiveTokenHelpers__() {\r\n }\r\n #pragma warning restore 219\r\n #pragma warning disable 0414\r\n private static object __o = null;\r\n #pragma warning restore 0414\r\n #pragma warning disable 1998\r\n protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)\r\n {\r\n }\r\n #pragma warning restore 1998\r\n }\r\n}\r\n#pragma warning restore 1591\r\n","Options": { + "DesignTime": true, + "_": { + "IndentWithTabs": false, + "IndentSize": 4, + "RootNamespace": "MyApp", + "SuppressChecksum": true, + "SuppressNullabilityEnforcement": false, + "OmitMinimizedComponentAttributeValues": true, + "UseEnhancedLinePragma": true, + "SuppressMetadataAttributes": true, + "SuppressPrimaryMethodBody": false, + "SupportLocalizedComponentNames": false + } + },"Diagnostics": [],"SourceMappings": [],"LinePragmas": []},"HtmlDocument":{"GeneratedCode":"

Hello world

","Options": { + "DesignTime": true, + "_": { + "IndentWithTabs": false, + "IndentSize": 4, + "RootNamespace": "MyApp", + "SuppressChecksum": true, + "SuppressNullabilityEnforcement": false, + "OmitMinimizedComponentAttributeValues": true, + "UseEnhancedLinePragma": true, + "SuppressMetadataAttributes": true, + "SuppressPrimaryMethodBody": false, + "SupportLocalizedComponentNames": false + } + },"SourceMappings": [ + { + "OriginalSpan": { + "FilePath": "Pages/Index.razor", + "AbsoluteIndex": 0, + "LineIndex": 0, + "CharacterIndex": 0, + "Length": 20, + "LineCount": 0, + "EndCharacterIndex": 20 + }, + "GeneratedSpan": { + "FilePath": null, + "AbsoluteIndex": 0, + "LineIndex": 0, + "CharacterIndex": 0, + "Length": 20, + "LineCount": 1, + "EndCharacterIndex": 20 + } + } + ]},"Namespace":"MyApp.Pages"} \ No newline at end of file