diff --git a/src/Generators/Microsoft.Gen.ComplianceReports/Common/Generator.cs b/src/Generators/Microsoft.Gen.ComplianceReports/Common/ComplianceReportsGenerator.cs similarity index 74% rename from src/Generators/Microsoft.Gen.ComplianceReports/Common/Generator.cs rename to src/Generators/Microsoft.Gen.ComplianceReports/Common/ComplianceReportsGenerator.cs index 19bc8b1a3cc..f2823832f6a 100644 --- a/src/Generators/Microsoft.Gen.ComplianceReports/Common/Generator.cs +++ b/src/Generators/Microsoft.Gen.ComplianceReports/Common/ComplianceReportsGenerator.cs @@ -14,21 +14,32 @@ namespace Microsoft.Gen.ComplianceReports; /// [Generator] [ExcludeFromCodeCoverage] -public sealed class Generator : ISourceGenerator +public sealed class ComplianceReportsGenerator : ISourceGenerator { private const string GenerateComplianceReportsMSBuildProperty = "build_property.GenerateComplianceReport"; private const string ComplianceReportOutputPathMSBuildProperty = "build_property.ComplianceReportOutputPath"; - private string? _reportOutputPath; + private const string FallbackFileName = "ComplianceReport.json"; - public Generator() + private string? _directory; + private string _fileName; + + public ComplianceReportsGenerator() : this(null) { } - public Generator(string? reportOutputPath) + public ComplianceReportsGenerator(string? filePath) { - _reportOutputPath = reportOutputPath; + if (filePath is not null) + { + _directory = Path.GetDirectoryName(filePath); + _fileName = Path.GetFileName(filePath); + } + else + { + _fileName = FallbackFileName; + } } public void Initialize(GeneratorInitializationContext context) @@ -70,10 +81,10 @@ public void Execute(GeneratorExecutionContext context) context.CancellationToken.ThrowIfCancellationRequested(); - if (_reportOutputPath == null) + if (_directory == null) { - _ = context.AnalyzerConfigOptions.GlobalOptions.TryGetValue(ComplianceReportOutputPathMSBuildProperty, out _reportOutputPath); - if (string.IsNullOrWhiteSpace(_reportOutputPath)) + _ = context.AnalyzerConfigOptions.GlobalOptions.TryGetValue(ComplianceReportOutputPathMSBuildProperty, out _directory); + if (string.IsNullOrWhiteSpace(_directory)) { // no valid output path return; @@ -81,10 +92,10 @@ public void Execute(GeneratorExecutionContext context) } #pragma warning disable R9A017 // Switch to an asynchronous method for increased performance. - _ = Directory.CreateDirectory(Path.GetDirectoryName(_reportOutputPath)); + _ = Directory.CreateDirectory(_directory); - // Write properties to CSV file. - File.WriteAllText(_reportOutputPath, report); + // Write report as JSON file. + File.WriteAllText(Path.Combine(_directory, _fileName), report); #pragma warning restore R9A017 // Switch to an asynchronous method for increased performance. } } diff --git a/src/Generators/Microsoft.Gen.ComplianceReports/Common/Parser.cs b/src/Generators/Microsoft.Gen.ComplianceReports/Common/Parser.cs index 0e40c72664c..6d2d6b63f5d 100644 --- a/src/Generators/Microsoft.Gen.ComplianceReports/Common/Parser.cs +++ b/src/Generators/Microsoft.Gen.ComplianceReports/Common/Parser.cs @@ -47,6 +47,12 @@ public IReadOnlyList GetClassifiedTypes(IEnumerable? classifiedMembers = null; + // include the annotations provided in record constructor parameters + if (typeSyntax is RecordDeclarationSyntax recordSyntax) + { + classifiedMembers = GetClassifiedMembers(recordSyntax, classifiedMembers, sm); + } + // grab the annotated members classifiedMembers = GetClassifiedMembers(typeSymbol, classifiedMembers); @@ -94,6 +100,43 @@ private static string FormatType(ITypeSymbol typeSymbol) return result; } + private Dictionary? GetClassifiedMembers(RecordDeclarationSyntax recordSyntax, + Dictionary? classifiedMembers, + SemanticModel sm) + { + var parameters = recordSyntax.ParameterList?.Parameters; + if (parameters != null) + { + foreach (var parameter in parameters) + { + var ps = sm.GetDeclaredSymbol(parameter); + if (ps == null) + { + continue; + } + + foreach (var attribute in ps!.GetAttributes()) + { + ClassifiedItem? ci = null; + ci = AppendAttributeClassifications(ci, attribute); + if (ci != null) + { + FileLinePositionSpan fileLine = ps.Locations[0].GetLineSpan(); + ci.SourceFilePath = fileLine.Path; + ci.SourceLine = fileLine.StartLinePosition.Line + 1; + ci.Name = ps.Name; + ci.TypeName = FormatType(ps.Type); + + classifiedMembers ??= new(); + classifiedMembers[ci.Name] = ci; + } + } + } + } + + return classifiedMembers; + } + private Dictionary? GetClassifiedMembers(ITypeSymbol typeSymbol, Dictionary? classifiedMembers) { foreach (var property in typeSymbol.GetMembers().OfType()) @@ -131,7 +174,7 @@ private static string FormatType(ITypeSymbol typeSymbol) ci = AppendAttributeClassifications(ci, attribute); } - // classificaiton coming from the member's attributes + // classification coming from the member's attributes foreach (AttributeData attribute in member.GetAttributes()) { ci = AppendAttributeClassifications(ci, attribute); @@ -188,7 +231,7 @@ private static string FormatType(ITypeSymbol typeSymbol) ci = AppendAttributeClassifications(ci, attribute); } - // classificaiton coming from the parameter's attributes + // classification coming from the parameter's attributes foreach (AttributeData attribute in p.GetAttributes()) { ci = AppendAttributeClassifications(ci, attribute); diff --git a/src/Generators/Microsoft.Gen.ComplianceReports/Common/SymbolHolder.cs b/src/Generators/Microsoft.Gen.ComplianceReports/Common/SymbolHolder.cs index dd8f5c27817..ac3cae4c536 100644 --- a/src/Generators/Microsoft.Gen.ComplianceReports/Common/SymbolHolder.cs +++ b/src/Generators/Microsoft.Gen.ComplianceReports/Common/SymbolHolder.cs @@ -6,7 +6,7 @@ namespace Microsoft.Gen.ComplianceReports; /// -/// Holds required symbols for the . +/// Holds required symbols for the . /// internal sealed record class SymbolHolder( INamedTypeSymbol DataClassificationAttributeSymbol, diff --git a/src/Generators/Microsoft.Gen.ContextualOptions/Common/Generator.cs b/src/Generators/Microsoft.Gen.ContextualOptions/Common/ContextualOptionsGenerator.cs similarity index 97% rename from src/Generators/Microsoft.Gen.ContextualOptions/Common/Generator.cs rename to src/Generators/Microsoft.Gen.ContextualOptions/Common/ContextualOptionsGenerator.cs index 7d731c67f81..c05b4719443 100644 --- a/src/Generators/Microsoft.Gen.ContextualOptions/Common/Generator.cs +++ b/src/Generators/Microsoft.Gen.ContextualOptions/Common/ContextualOptionsGenerator.cs @@ -15,7 +15,7 @@ namespace Microsoft.Gen.ContextualOptions; [Generator] [ExcludeFromCodeCoverage] -public class Generator : IIncrementalGenerator +public class ContextualOptionsGenerator : IIncrementalGenerator { private static readonly HashSet _attributeNames = new() { @@ -78,7 +78,7 @@ namespace Microsoft.Gen.ContextualOptions; /// [Generator] [ExcludeFromCodeCoverage] -public class Generator : ISourceGenerator +public class ContextualOptionsGenerator : ISourceGenerator { public void Initialize(GeneratorInitializationContext context) => context.RegisterForSyntaxNotifications(() => new ContextReceiver(context.CancellationToken)); diff --git a/src/Generators/Microsoft.Gen.Metering/Common/DiagDescriptors.cs b/src/Generators/Microsoft.Gen.Metering/Common/DiagDescriptors.cs index b44b2eb3d1d..2a968844173 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/DiagDescriptors.cs +++ b/src/Generators/Microsoft.Gen.Metering/Common/DiagDescriptors.cs @@ -113,4 +113,16 @@ internal sealed class DiagDescriptors : DiagDescriptorsBase title: Resources.ErrorInvalidMethodReturnTypeArityTitle, messageFormat: Resources.ErrorInvalidMethodReturnTypeArityMessage, category: Category); + + public static DiagnosticDescriptor ErrorGaugeNotSupported { get; } = Make( + id: "R9G069", + title: Resources.ErrorGaugeNotSupportedTitle, + messageFormat: Resources.ErrorGaugeNotSupportedMessage, + category: Category); + + public static DiagnosticDescriptor ErrorXmlNotLoadedCorrectly { get; } = Make( + id: "R9G070", + title: Resources.ErrorXmlNotLoadedCorrectlyTitle, + messageFormat: Resources.ErrorXmlNotLoadedCorrectlyMessage, + category: Category); } diff --git a/src/Generators/Microsoft.Gen.Metering/Common/Generator.cs b/src/Generators/Microsoft.Gen.Metering/Common/MeteringGenerator.cs similarity index 93% rename from src/Generators/Microsoft.Gen.Metering/Common/Generator.cs rename to src/Generators/Microsoft.Gen.Metering/Common/MeteringGenerator.cs index e26af738b21..52e57de3ba6 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/Generator.cs +++ b/src/Generators/Microsoft.Gen.Metering/Common/MeteringGenerator.cs @@ -16,14 +16,15 @@ namespace Microsoft.Gen.Metering; [Generator] [ExcludeFromCodeCoverage] -public class Generator : IIncrementalGenerator +public class MeteringGenerator : IIncrementalGenerator { private static readonly HashSet _attributeNames = new() { SymbolLoader.CounterAttribute, SymbolLoader.CounterTAttribute.Replace("`1", ""), SymbolLoader.HistogramAttribute, - SymbolLoader.HistogramTAttribute.Replace("`1", "") + SymbolLoader.HistogramTAttribute.Replace("`1", ""), + SymbolLoader.GaugeAttribute }; public void Initialize(IncrementalGeneratorInitializationContext context) @@ -55,13 +56,14 @@ private static void HandleAnnotatedTypes(Compilation compilation, IEnumerable AllParameters = new(); public HashSet DimensionsKeys = new(); + public Dictionary DimensionDescriptionDictionary = new(); public string? Name; public string? MetricName; + public string? XmlDefinition; public bool IsExtensionMethod; public string Modifiers = string.Empty; public string MetricTypeModifiers = string.Empty; diff --git a/src/Generators/Microsoft.Gen.Metering/Common/Parser.cs b/src/Generators/Microsoft.Gen.Metering/Common/Parser.cs index 61237c5005e..575d995ac52 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/Parser.cs +++ b/src/Generators/Microsoft.Gen.Metering/Common/Parser.cs @@ -7,6 +7,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading; +using System.Xml; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -94,7 +95,7 @@ public IReadOnlyList GetMetricClasses(IEnumerable dimensions) ExtractAttributeParameters(AttributeData attribute) + private (string metricName, HashSet dimensions, Dictionary dimensionDescriptions) ExtractAttributeParameters( + AttributeData attribute, + SemanticModel semanticModel) { var dimensionHashSet = new HashSet(); + var dimensionDescriptionMap = new Dictionary(); string metricNameFromAttribute = string.Empty; if (!attribute.NamedArguments.IsDefaultOrEmpty) { @@ -323,7 +331,72 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP } } - return (metricNameFromAttribute, dimensionHashSet); + if (attribute.ApplicationSyntaxReference != null && + attribute.ApplicationSyntaxReference.GetSyntax(_cancellationToken) is AttributeSyntax syntax && + syntax.ArgumentList != null) + { + foreach (var arg in syntax.ArgumentList.Arguments) + { + GetDimensionDescription(arg, semanticModel, dimensionDescriptionMap); + } + } + + return (metricNameFromAttribute, dimensionHashSet, dimensionDescriptionMap); + } + + private string GetSymbolXmlCommentSummary(ISymbol symbol) + { + var xmlComment = symbol.GetDocumentationCommentXml(); + if (string.IsNullOrEmpty(xmlComment)) + { + return string.Empty; + } + + try + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmlComment); + var summaryNode = xmlDoc.SelectSingleNode("//summary"); + if (summaryNode != null) + { + var summaryString = summaryNode.InnerXml.Trim(); + return summaryString; + } + else + { + return string.Empty; + } + } + catch (XmlException ex) + { + Diag(DiagDescriptors.ErrorXmlNotLoadedCorrectly, symbol.GetLocation(), ex.Message); + return string.Empty; + } + } + + private void GetDimensionDescription( + AttributeArgumentSyntax arg, + SemanticModel semanticModel, + Dictionary dimensionDescriptionDictionary) + { + if (arg.NameEquals != null) + { + return; + } + + var symbol = semanticModel.GetSymbolInfo(arg.Expression, _cancellationToken).Symbol; + if (symbol is not IFieldSymbol fieldSymbol || + !fieldSymbol.HasConstantValue || + fieldSymbol.ConstantValue == null) + { + return; + } + + var xmlDefinition = GetSymbolXmlCommentSummary(symbol); + if (!string.IsNullOrEmpty(xmlDefinition)) + { + dimensionDescriptionDictionary.Add(fieldSymbol.ConstantValue.ToString(), xmlDefinition); + } } private (MetricMethod? metricMethod, bool keepMethod) ProcessMethodAttribute( @@ -332,7 +405,8 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP IMethodSymbol methodSymbol, AttributeData methodAttribute, SymbolHolder symbols, - HashSet metricNames) + HashSet metricNames, + SemanticModel semanticModel) { var (instrumentKind, genericType) = GetInstrumentType(methodAttribute.AttributeClass, symbols); if (instrumentKind == InstrumentKind.None || @@ -341,6 +415,20 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP return (null, false); } + // check if any of methodSymbol parameters is of IMeter type + if (symbols.IMeterInterface != null && + methodSymbol.Parameters.Any(p => ParserUtilities.IsBaseOrIdentity(p.Type, symbols.IMeterInterface, _compilation))) + { + // The method uses old IMeter, no need to parse it + return (null, false); + } + + if (instrumentKind == InstrumentKind.Gauge) + { + Diag(DiagDescriptors.ErrorGaugeNotSupported, methodSymbol.GetLocation()); + return (null, false); + } + bool keepMethod = CheckMethodReturnType(methodSymbol); if (!_allowedGenericAttributeTypeArgs.Contains(genericType.SpecialType)) { @@ -348,11 +436,7 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP keepMethod = false; } - string metricNameFromAttribute; - HashSet dimensions; - var strongTypeDimensionConfigs = new List(); - var strongTypeObjectName = string.Empty; - var isClass = false; + var strongTypeAttrParams = new StrongTypeAttributeParameters(); if (!methodAttribute.ConstructorArguments.IsDefaultOrEmpty && methodAttribute.ConstructorArguments[0].Kind == TypedConstantKind.Type) @@ -365,14 +449,12 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP namedArg = methodAttribute.NamedArguments[0]; } - (metricNameFromAttribute, dimensions, strongTypeDimensionConfigs, strongTypeObjectName, isClass) = ExtractStrongTypeAttributeParameters( - ctorArg, - namedArg, - symbols); + strongTypeAttrParams = ExtractStrongTypeAttributeParameters(ctorArg, namedArg, symbols); } else { - (metricNameFromAttribute, dimensions) = ExtractAttributeParameters(methodAttribute); + var parameters = ExtractAttributeParameters(methodAttribute, semanticModel); + (strongTypeAttrParams.MetricNameFromAttribute, strongTypeAttrParams.DimensionHashSet, strongTypeAttrParams.DimensionDescriptionDictionary) = parameters; } string metricNameFromMethod = methodSymbol.ReturnType.Name; @@ -380,19 +462,26 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP var metricMethod = new MetricMethod { Name = methodSymbol.Name, - MetricName = string.IsNullOrWhiteSpace(metricNameFromAttribute) ? metricNameFromMethod : metricNameFromAttribute, + MetricName = string.IsNullOrWhiteSpace(strongTypeAttrParams.MetricNameFromAttribute) ? metricNameFromMethod : strongTypeAttrParams.MetricNameFromAttribute, InstrumentKind = instrumentKind, GenericType = genericType.ToDisplayString(_genericTypeSymbolFormat), - DimensionsKeys = dimensions, + DimensionsKeys = strongTypeAttrParams.DimensionHashSet, IsExtensionMethod = methodSymbol.IsExtensionMethod, Modifiers = methodSyntax.Modifiers.ToString(), MetricTypeName = methodSymbol.ReturnType.ToDisplayString(), // Roslyn doesn't know this type yet, no need to use a format here - StrongTypeConfigs = strongTypeDimensionConfigs, - StrongTypeObjectName = strongTypeObjectName, - IsDimensionTypeClass = isClass, - MetricTypeModifiers = typeDeclaration.Modifiers.ToString() + StrongTypeConfigs = strongTypeAttrParams.StrongTypeConfigs, + StrongTypeObjectName = strongTypeAttrParams.StrongTypeObjectName, + IsDimensionTypeClass = strongTypeAttrParams.IsClass, + MetricTypeModifiers = typeDeclaration.Modifiers.ToString(), + DimensionDescriptionDictionary = strongTypeAttrParams.DimensionDescriptionDictionary }; + var xmlDefinition = GetSymbolXmlCommentSummary(methodSymbol); + if (!string.IsNullOrEmpty(xmlDefinition)) + { + metricMethod.XmlDefinition = xmlDefinition; + } + if (metricMethod.Name[0] == '_') { // can't have logging method names that start with _ since that can lead to conflicting symbol names @@ -472,14 +561,6 @@ private static (string metricName, HashSet dimensions) ExtractAttributeP break; } - if (isFirstParam && - symbols.IMeterInterface != null && - ParserUtilities.IsBaseOrIdentity(paramTypeSymbol, symbols.IMeterInterface, _compilation)) - { - // The method uses old IMeter, no need to parse it - return (null, false); - } - var meterParameter = new MetricParameter { Name = paramName, @@ -547,49 +628,50 @@ private void Diag(DiagnosticDescriptor desc, Location? location, params object?[ _reportDiagnostic(Diagnostic.Create(desc, location, messageArgs)); } - private (string metricName, HashSet dimensions, List strongTypeConfigs, string strongTypeObjectName, bool isClass) - ExtractStrongTypeAttributeParameters( - TypedConstant constructorArg, - KeyValuePair namedArgument, - SymbolHolder symbols) + private StrongTypeAttributeParameters ExtractStrongTypeAttributeParameters( + TypedConstant constructorArg, + KeyValuePair namedArgument, + SymbolHolder symbols) { - var dimensionHashSet = new HashSet(); - string metricNameFromAttribute = string.Empty; - var strongTypeConfigs = new List(); - bool isClass = false; + var strongTypeAttributeParameters = new StrongTypeAttributeParameters(); if (namedArgument is { Key: "Name", Value.Value: { } }) { - metricNameFromAttribute = namedArgument.Value.Value.ToString(); + strongTypeAttributeParameters.MetricNameFromAttribute = namedArgument.Value.Value.ToString(); } if (constructorArg.IsNull || constructorArg.Value is not INamedTypeSymbol strongTypeSymbol) { - return (metricNameFromAttribute, dimensionHashSet, strongTypeConfigs, string.Empty, isClass); + return strongTypeAttributeParameters; } // Need to check if the strongType is a class or struct, classes need a null check whereas structs do not. if (strongTypeSymbol.TypeKind == TypeKind.Class) { - isClass = true; + strongTypeAttributeParameters.IsClass = true; } // Loop through all of the members of the object level and below foreach (var member in strongTypeSymbol.GetMembers()) { - strongTypeConfigs.AddRange(BuildDimensionConfigs(member, dimensionHashSet, symbols, _builders.GetStringBuilder())); + var dimConfigs = BuildDimensionConfigs(member, strongTypeAttributeParameters.DimensionHashSet, + strongTypeAttributeParameters.DimensionDescriptionDictionary, symbols, _builders.GetStringBuilder()); + + strongTypeAttributeParameters.StrongTypeConfigs.AddRange(dimConfigs); } // Now that all of the current level and below dimensions are extracted, let's get any parent ones - strongTypeConfigs.AddRange(GetParentDimensionConfigs(strongTypeSymbol, dimensionHashSet, symbols)); + strongTypeAttributeParameters.StrongTypeConfigs.AddRange(GetParentDimensionConfigs(strongTypeSymbol, + strongTypeAttributeParameters.DimensionHashSet, strongTypeAttributeParameters.DimensionDescriptionDictionary, symbols)); - if (strongTypeConfigs.Count > MaxDimensions) + if (strongTypeAttributeParameters.StrongTypeConfigs.Count > MaxDimensions) { Diag(DiagDescriptors.ErrorTooManyDimensions, strongTypeSymbol.Locations[0]); } - return (metricNameFromAttribute, dimensionHashSet, strongTypeConfigs, constructorArg.Value.ToString(), isClass); + strongTypeAttributeParameters.StrongTypeObjectName = constructorArg.Value.ToString(); + return strongTypeAttributeParameters; } /// @@ -603,6 +685,7 @@ private void Diag(DiagnosticDescriptor desc, Location? location, params object?[ private List BuildDimensionConfigs( ISymbol symbol, HashSet dimensionHashSet, + Dictionary dimensionDescriptionDictionary, SymbolHolder symbols, StringBuilder stringBuilder) { @@ -667,6 +750,12 @@ private List BuildDimensionConfigs( DimensionName = name, StrongTypeMetricObjectType = StrongTypeMetricObjectType.Enum }); + + var xmlDefinition = GetSymbolXmlCommentSummary(symbol); + if (!string.IsNullOrEmpty(xmlDefinition)) + { + dimensionDescriptionDictionary.Add(string.IsNullOrEmpty(dimensionName) ? symbol.Name : dimensionName, xmlDefinition); + } } return dimensionConfigs; @@ -693,6 +782,12 @@ private List BuildDimensionConfigs( DimensionName = name, StrongTypeMetricObjectType = StrongTypeMetricObjectType.String }); + + var xmlDefinition = GetSymbolXmlCommentSummary(symbol); + if (!string.IsNullOrEmpty(xmlDefinition)) + { + dimensionDescriptionDictionary.Add(string.IsNullOrEmpty(dimensionName) ? symbol.Name : dimensionName, xmlDefinition); + } } return dimensionConfigs; @@ -716,6 +811,7 @@ private List BuildDimensionConfigs( namedTypeSymbol, stringBuilder, dimensionHashSet, + dimensionDescriptionDictionary, symbols, true)); @@ -751,6 +847,7 @@ private List BuildDimensionConfigs( namedTypeSymbol, stringBuilder, dimensionHashSet, + dimensionDescriptionDictionary, symbols, false)); } @@ -774,6 +871,7 @@ private List WalkObjectModel( INamedTypeSymbol namedTypeSymbol, StringBuilder stringBuilder, HashSet dimensionHashSet, + Dictionary dimensionDescriptionDictionary, SymbolHolder symbols, bool isClass) { @@ -793,7 +891,7 @@ private List WalkObjectModel( foreach (var member in namedTypeSymbol.GetMembers()) { - dimensionConfigs.AddRange(BuildDimensionConfigs(member, dimensionHashSet, symbols, stringBuilder)); + dimensionConfigs.AddRange(BuildDimensionConfigs(member, dimensionHashSet, dimensionDescriptionDictionary, symbols, stringBuilder)); } return dimensionConfigs; @@ -802,6 +900,7 @@ private List WalkObjectModel( private List GetParentDimensionConfigs( ITypeSymbol symbol, HashSet dimensionHashSet, + Dictionary dimensionDescriptionDictionary, SymbolHolder symbols) { var dimensionConfigs = new List(); @@ -816,7 +915,7 @@ private List GetParentDimensionConfigs( foreach (var member in parentObjectBase.GetMembers()) { - dimensionConfigs.AddRange(BuildDimensionConfigs(member, dimensionHashSet, symbols, _builders.GetStringBuilder())); + dimensionConfigs.AddRange(BuildDimensionConfigs(member, dimensionHashSet, dimensionDescriptionDictionary, symbols, _builders.GetStringBuilder())); } parentObjectBase = parentObjectBase.BaseType; diff --git a/src/Generators/Microsoft.Gen.Metering/Common/Resources.Designer.cs b/src/Generators/Microsoft.Gen.Metering/Common/Resources.Designer.cs index d6a82342ef3..1f88d59f6b9 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/Resources.Designer.cs +++ b/src/Generators/Microsoft.Gen.Metering/Common/Resources.Designer.cs @@ -78,6 +78,24 @@ internal static string ErrorDuplicateDimensionNameTitle { } } + /// + /// Looks up a localized string similar to Gauge is not supported yet by metering generator. + /// + internal static string ErrorGaugeNotSupportedMessage { + get { + return ResourceManager.GetString("ErrorGaugeNotSupportedMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gauge is not supported yet. + /// + internal static string ErrorGaugeNotSupportedTitle { + get { + return ResourceManager.GetString("ErrorGaugeNotSupportedTitle", resourceCulture); + } + } + /// /// Looks up a localized string similar to A type '{0}' cannot be used as a metering attribute type argument. /// @@ -365,5 +383,23 @@ internal static string ErrorTooManyDimensionsTitle { return ResourceManager.GetString("ErrorTooManyDimensionsTitle", resourceCulture); } } + + /// + /// Looks up a localized string similar to Xml comment was not parsed correctly, exception {0} was thrown. + /// + internal static string ErrorXmlNotLoadedCorrectlyMessage { + get { + return ResourceManager.GetString("ErrorXmlNotLoadedCorrectlyMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Xml comment was not parsed correctly. + /// + internal static string ErrorXmlNotLoadedCorrectlyTitle { + get { + return ResourceManager.GetString("ErrorXmlNotLoadedCorrectlyTitle", resourceCulture); + } + } } } diff --git a/src/Generators/Microsoft.Gen.Metering/Common/Resources.resx b/src/Generators/Microsoft.Gen.Metering/Common/Resources.resx index b36410945bf..9a1ec5b6ac1 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/Resources.resx +++ b/src/Generators/Microsoft.Gen.Metering/Common/Resources.resx @@ -123,6 +123,12 @@ A strong type object contains duplicate dimension names + + Gauge is not supported yet by metering generator + + + Gauge is not supported yet + A type '{0}' cannot be used as a metering attribute type argument @@ -219,4 +225,10 @@ A metric class contains too many dimensions - + + Xml comment was not parsed correctly + + + Xml comment was not parsed correctly, exception {0} was thrown + + \ No newline at end of file diff --git a/src/Generators/Microsoft.Gen.Metering/Common/StrongTypeAttributeParameters.cs b/src/Generators/Microsoft.Gen.Metering/Common/StrongTypeAttributeParameters.cs new file mode 100644 index 00000000000..7ba9cf38170 --- /dev/null +++ b/src/Generators/Microsoft.Gen.Metering/Common/StrongTypeAttributeParameters.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using Microsoft.Gen.Metering.Model; + +namespace Microsoft.Gen.Metering; + +internal sealed class StrongTypeAttributeParameters +{ + public string MetricNameFromAttribute = string.Empty; + public HashSet DimensionHashSet = new(); + public Dictionary DimensionDescriptionDictionary = new(); + public List StrongTypeConfigs = new(); + public string StrongTypeObjectName = string.Empty; + public bool IsClass; +} diff --git a/src/Generators/Microsoft.Gen.Metering/Common/SymbolHolder.cs b/src/Generators/Microsoft.Gen.Metering/Common/SymbolHolder.cs index 49c1d73c2da..207b934828b 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/SymbolHolder.cs +++ b/src/Generators/Microsoft.Gen.Metering/Common/SymbolHolder.cs @@ -11,6 +11,7 @@ internal sealed record class SymbolHolder( INamedTypeSymbol? CounterOfTAttribute, INamedTypeSymbol HistogramAttribute, INamedTypeSymbol? HistogramOfTAttribute, + INamedTypeSymbol? GaugeAttribute, INamedTypeSymbol LongTypeSymbol, INamedTypeSymbol? DimensionAttribute, INamedTypeSymbol? IMeterInterface); diff --git a/src/Generators/Microsoft.Gen.Metering/Common/SymbolLoader.cs b/src/Generators/Microsoft.Gen.Metering/Common/SymbolLoader.cs index b131b3a5aae..05e3572e447 100644 --- a/src/Generators/Microsoft.Gen.Metering/Common/SymbolLoader.cs +++ b/src/Generators/Microsoft.Gen.Metering/Common/SymbolLoader.cs @@ -9,6 +9,7 @@ internal static class SymbolLoader { internal const string CounterTAttribute = "Microsoft.Extensions.Telemetry.Metering.CounterAttribute`1"; internal const string HistogramTAttribute = "Microsoft.Extensions.Telemetry.Metering.HistogramAttribute`1"; + internal const string GaugeAttribute = "Microsoft.Extensions.Telemetry.Metering.GaugeAttribute"; internal const string CounterAttribute = "Microsoft.Extensions.Telemetry.Metering.CounterAttribute"; internal const string HistogramAttribute = "Microsoft.Extensions.Telemetry.Metering.HistogramAttribute"; internal const string DimensionAttribute = "Microsoft.Extensions.Telemetry.Metering.DimensionAttribute"; @@ -20,6 +21,7 @@ internal static class SymbolLoader var meterClassSymbol = compilation.GetTypeByMetadataName(MeterClass); var counterAttribute = compilation.GetTypeByMetadataName(CounterAttribute); var histogramAttribute = compilation.GetTypeByMetadataName(HistogramAttribute); + if (meterClassSymbol == null || counterAttribute == null || histogramAttribute == null) @@ -30,6 +32,7 @@ internal static class SymbolLoader var counterTAttribute = compilation.GetTypeByMetadataName(CounterTAttribute); var histogramTAttribute = compilation.GetTypeByMetadataName(HistogramTAttribute); + var gaugeAttribute = compilation.GetTypeByMetadataName(GaugeAttribute); var dimensionAttribute = compilation.GetTypeByMetadataName(DimensionAttribute); var longType = compilation.GetSpecialType(SpecialType.System_Int64); var meterInterface = compilation.GetTypeByMetadataName(MeterInterface); @@ -40,6 +43,7 @@ internal static class SymbolLoader counterTAttribute, histogramAttribute, histogramTAttribute, + gaugeAttribute, longType, dimensionAttribute, meterInterface); diff --git a/src/Generators/Microsoft.Gen.Metering/Roslyn3.8/Microsoft.Gen.Metering.Roslyn3.8.csproj b/src/Generators/Microsoft.Gen.Metering/Roslyn3.8/Microsoft.Gen.Metering.Roslyn3.8.csproj index 260d679769a..a61f6d3d0c8 100644 --- a/src/Generators/Microsoft.Gen.Metering/Roslyn3.8/Microsoft.Gen.Metering.Roslyn3.8.csproj +++ b/src/Generators/Microsoft.Gen.Metering/Roslyn3.8/Microsoft.Gen.Metering.Roslyn3.8.csproj @@ -11,6 +11,10 @@ 85 + + + + True diff --git a/src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionGenerator.cs b/src/Generators/Microsoft.Gen.MeteringReports/Common/MeteringReportsGenerator.cs similarity index 91% rename from src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionGenerator.cs rename to src/Generators/Microsoft.Gen.MeteringReports/Common/MeteringReportsGenerator.cs index 408948655e1..bfd5d69b68d 100644 --- a/src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionGenerator.cs +++ b/src/Generators/Microsoft.Gen.MeteringReports/Common/MeteringReportsGenerator.cs @@ -17,7 +17,7 @@ namespace Microsoft.Gen.MeteringReports; [Generator] [ExcludeFromCodeCoverage] -public class MetricDefinitionGenerator : ISourceGenerator +public class MeteringReportsGenerator : ISourceGenerator { private const string GenerateMetricDefinitionReport = "build_property.GenerateMeteringReport"; private const string RootNamespace = "build_property.rootnamespace"; @@ -26,8 +26,6 @@ public class MetricDefinitionGenerator : ISourceGenerator private const string CurrentProjectPath = "build_property.projectdir"; private const string FileName = "MeteringReport.json"; - private static readonly Dictionary _empty = new(); - private string? _compilationOutputPath; private string? _currentProjectPath; private string? _reportOutputPath; @@ -70,8 +68,9 @@ public void Execute(GeneratorExecutionContext context) _ = options.TryGetValue(RootNamespace, out var rootNamespace); + var emitter = new MetricDefinitionEmitter(); var reportedMetrics = MapToCommonModel(meteringClasses, rootNamespace); - var report = MetricDefinitionEmitter.GenerateReport(reportedMetrics, context.CancellationToken); + var report = emitter.GenerateReport(reportedMetrics, context.CancellationToken); #pragma warning disable R9A017 // Switch to an asynchronous metricMethod for increased performance; Cannot because it is void metricMethod, and generators dont support tasks. File.WriteAllText(Path.Combine(path, FileName), report, Encoding.UTF8); @@ -88,10 +87,10 @@ private static ReportedMetricClass[] MapToCommonModel(IReadOnlyList Modifiers: meteringClass.Modifiers, Methods: meteringClass.Methods.Select(meteringMethod => new ReportedMetricMethod( MetricName: meteringMethod.MetricName ?? "(Missing Name)", - Summary: "(Missing Summary)" /* Missing feature in .NET metering generator. */, + Summary: meteringMethod.XmlDefinition ?? "(Missing Summary)", Kind: meteringMethod.InstrumentKind, Dimensions: meteringMethod.DimensionsKeys, - DimensionsDescriptions: _empty /* Missing feature in .NET metering generator. */)) + DimensionsDescriptions: meteringMethod.DimensionDescriptionDictionary)) .ToArray())); return reportedMetrics.ToArray(); diff --git a/src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionEmitter.cs b/src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionEmitter.cs index 44366171327..b5750557342 100644 --- a/src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionEmitter.cs +++ b/src/Generators/Microsoft.Gen.MeteringReports/Common/MetricDefinitionEmitter.cs @@ -11,169 +11,139 @@ namespace Microsoft.Gen.MeteringReports; // Stryker disable all -internal static class MetricDefinitionEmitter +internal sealed class MetricDefinitionEmitter : EmitterBase { - private static readonly StringBuilderPool _builders = new(); + internal MetricDefinitionEmitter() + : base(false) + { + } - public static string GenerateReport(IReadOnlyList metricClasses, CancellationToken cancellationToken) + public string GenerateReport(IReadOnlyList metricClasses, CancellationToken cancellationToken) { if (metricClasses == null || metricClasses.Count == 0) { return string.Empty; } - var sb = _builders.GetStringBuilder(); - try + OutLn("["); + + for (int i = 0; i < metricClasses.Count; i++) { - _ = sb.Append('[') - .Append('\n'); + cancellationToken.ThrowIfCancellationRequested(); + var metricClass = metricClasses[i]; + GenMetricClassDefinition(metricClass, cancellationToken); - for (int i = 0; i < metricClasses.Count; i++) + if (i < metricClasses.Count - 1) { - cancellationToken.ThrowIfCancellationRequested(); - var metricClass = metricClasses[i]; - _ = sb.Append(GenMetricClassDefinition(metricClass, cancellationToken)); - - if (i < metricClasses.Count - 1) - { - _ = sb.Append(','); - } - - _ = sb.Append('\n'); + Out(","); } - _ = sb.Append(']'); - - return sb.ToString(); - } - finally - { - _builders.ReturnStringBuilder(sb); + OutLn(); } + + Out("]"); + return Capture(); } - private static string GenMetricClassDefinition(ReportedMetricClass metricClass, CancellationToken cancellationToken) + private void GenMetricClassDefinition(ReportedMetricClass metricClass, CancellationToken cancellationToken) { - var sb = _builders.GetStringBuilder(); - try - { - cancellationToken.ThrowIfCancellationRequested(); - _ = sb.Append(" {") - .Append('\n'); - - _ = sb.Append($" \"{metricClass.RootNamespace}\":"); - _ = sb.Append('\n'); + cancellationToken.ThrowIfCancellationRequested(); + OutLn(" {"); - if (metricClass.Methods.Length > 0) - { - _ = sb.Append(" [") - .Append('\n'); + OutLn($" \"{metricClass.RootNamespace}\":"); - for (int j = 0; j < metricClass.Methods.Length; j++) - { - var metricMethod = metricClass.Methods[j]; + if (metricClass.Methods.Length > 0) + { + OutLn(" ["); - _ = sb.Append(GenMetricMethodDefinition(metricMethod, cancellationToken)); + for (int j = 0; j < metricClass.Methods.Length; j++) + { + var metricMethod = metricClass.Methods[j]; - if (j < metricClass.Methods.Length - 1) - { - _ = sb.Append(','); - } + GenMetricMethodDefinition(metricMethod, cancellationToken); - _ = sb.Append('\n'); + if (j < metricClass.Methods.Length - 1) + { + Out(","); } - _ = sb.Append(" ]") - .Append('\n'); + OutLn(); } - _ = sb.Append(" }"); - - return sb.ToString(); - } - finally - { - _builders.ReturnStringBuilder(sb); + OutLn(" ]"); } + + Out(" }"); } - private static string GenMetricMethodDefinition(ReportedMetricMethod metricMethod, CancellationToken cancellationToken) + private void GenMetricMethodDefinition(ReportedMetricMethod metricMethod, CancellationToken cancellationToken) { switch (metricMethod.Kind) { case InstrumentKind.Counter: case InstrumentKind.Histogram: case InstrumentKind.Gauge: - var sb = _builders.GetStringBuilder(); try { cancellationToken.ThrowIfCancellationRequested(); - _ = sb.Append(" {") - .Append('\n'); + OutLn(" {"); - _ = sb.Append($" \"MetricName\": \"{metricMethod.MetricName.Replace("\\", "\\\\").Replace("\"", "\\\"")}\",") - .Append('\n'); + OutLn($" \"MetricName\": \"{metricMethod.MetricName.Replace("\\", "\\\\").Replace("\"", "\\\"")}\","); if (!string.IsNullOrEmpty(metricMethod.Summary)) { - _ = sb.Append($" \"MetricDescription\": \"{metricMethod.Summary.Replace("\\", "\\\\").Replace("\"", "\\\"")}\","); - _ = sb.Append('\n'); + OutLn($" \"MetricDescription\": \"{metricMethod.Summary.Replace("\\", "\\\\").Replace("\"", "\\\"")}\","); } - _ = sb.Append($" \"InstrumentName\": \"{metricMethod.Kind}\""); + Out($" \"InstrumentName\": \"{metricMethod.Kind}\""); if (metricMethod.Dimensions.Count > 0) { - _ = sb.Append(','); - _ = sb.Append('\n'); - _ = sb.Append(" \"Dimensions\": {"); + OutLn(","); + + Out(" \"Dimensions\": {"); int k = 0; foreach (var dimension in metricMethod.Dimensions) { - _ = sb.Append('\n'); + OutLn(); if (metricMethod.DimensionsDescriptions.TryGetValue(dimension, out var description)) { - _ = sb.Append($" \"{dimension}\": \"{description.Replace("\\", "\\\\").Replace("\"", "\\\"")}\""); + Out($" \"{dimension}\": \"{description.Replace("\\", "\\\\").Replace("\"", "\\\"")}\""); } else { - _ = sb.Append($" \"{dimension}\": \"\""); + Out($" \"{dimension}\": \"\""); } if (k < metricMethod.Dimensions.Count - 1) { - _ = sb.Append(','); + Out(","); } k++; } - _ = sb.Append('\n'); - _ = sb.Append(" }"); - _ = sb.Append('\n'); + OutLn(); + Out(" }"); + OutLn(); } else { - _ = sb.Append('\n'); + OutLn(); } - _ = sb.Append(" }"); - - return sb.ToString(); + Out(" }"); } catch (Exception e) { // This should report diagnostic. throw new InvalidOperationException($"An exception occurred during metric report generation {e.GetType()}:{e.Message}."); } - finally - { - _builders.ReturnStringBuilder(sb); - } + break; case InstrumentKind.None: case InstrumentKind.CounterT: case InstrumentKind.HistogramT: diff --git a/src/Generators/Microsoft.Gen.MeteringReports/Directory.Build.props b/src/Generators/Microsoft.Gen.MeteringReports/Directory.Build.props index 42e800fc305..2ec17901bed 100644 --- a/src/Generators/Microsoft.Gen.MeteringReports/Directory.Build.props +++ b/src/Generators/Microsoft.Gen.MeteringReports/Directory.Build.props @@ -17,10 +17,12 @@ + + @@ -28,7 +30,7 @@ - + diff --git a/src/Generators/Shared/GeneratorUtilities.cs b/src/Generators/Shared/GeneratorUtilities.cs index 56c865d055b..17b9e2d92d2 100644 --- a/src/Generators/Shared/GeneratorUtilities.cs +++ b/src/Generators/Shared/GeneratorUtilities.cs @@ -125,7 +125,7 @@ static string GetAttributeDisplayName(INamedTypeSymbol attributeType) /// /// Reports will not be generated during design time to prevent file being written on every keystroke in VS. - /// Refererences: + /// References: /// 1. /// Design-time build. diff --git a/test/Generators/Microsoft.Gen.ComplianceReports/GoldenReports/RecordProperty.json b/test/Generators/Microsoft.Gen.ComplianceReports/GoldenReports/RecordProperty.json new file mode 100644 index 00000000000..fdeec987f18 --- /dev/null +++ b/test/Generators/Microsoft.Gen.ComplianceReports/GoldenReports/RecordProperty.json @@ -0,0 +1,201 @@ + +{ + "Name": "test.dll", + "Types": [ + { + "Name": "Test.DerivedRecordProperty", + "Members": [ + { + "Name": "EqualityContract", + "Type": "System.Type", + "File": "src-0.cs", + "Line": "14", + "Classifications": [ + { + "Name": "C1" + } + ] + }, + { + "Name": "F3", + "Type": "int", + "File": "src-0.cs", + "Line": "17", + "Classifications": [ + { + "Name": "C2", + "Notes": "Note 1" + } + ] + }, + { + "Name": "F4", + "Type": "int", + "File": "src-0.cs", + "Line": "20", + "Classifications": [ + { + "Name": "C2" + } + ] + }, + { + "Name": "P0", + "Type": "int", + "File": "src-0.cs", + "Line": "23", + "Classifications": [ + { + "Name": "C1" + }, + { + "Name": "C2", + "Notes": "Note 2" + }, + { + "Name": "C3", + "Notes": "Note 3" + }, + { + "Name": "C4" + } + ] + }, + { + "Name": "P1", + "Type": "int", + "File": "src-0.cs", + "Line": "26", + "Classifications": [ + { + "Name": "C3" + } + ] + } + ] + }, + { + "Name": "Test.RecordProperty", + "Members": [ + { + "Name": "F0", + "Type": "string", + "File": "src-0.cs", + "Line": "14", + "Classifications": [ + { + "Name": "C2" + } + ] + }, + { + "Name": "F2", + "Type": "int", + "File": "src-0.cs", + "Line": "14", + "Classifications": [ + { + "Name": "C3" + } + ] + }, + { + "Name": "F3", + "Type": "int", + "File": "src-0.cs", + "Line": "17", + "Classifications": [ + { + "Name": "C2", + "Notes": "Note 1" + } + ] + }, + { + "Name": "F4", + "Type": "int", + "File": "src-0.cs", + "Line": "20", + "Classifications": [ + { + "Name": "C2" + } + ] + }, + { + "Name": "P0", + "Type": "int", + "File": "src-0.cs", + "Line": "11", + "Classifications": [ + { + "Name": "C3", + "Notes": "Note 3" + }, + { + "Name": "C4" + } + ] + }, + { + "Name": "P1", + "Type": "int", + "File": "src-0.cs", + "Line": "26", + "Classifications": [ + { + "Name": "C3" + } + ] + } + ], + "Logging Methods": [ + { + "Name": "LogHello", + "Parameters": [ + { + "Name": "user", + "Type": "string", + "File": "src-0.cs", + "Line": "29", + "Classifications": [ + { + "Name": "C3", + "Notes": "Note 3" + } + ] + }, + { + "Name": "port", + "Type": "int", + "File": "src-0.cs", + "Line": "29" + } + ] + }, + { + "Name": "LogWorld", + "Parameters": [ + { + "Name": "user", + "Type": "string", + "File": "src-0.cs", + "Line": "32", + "Classifications": [ + { + "Name": "C2" + } + ] + }, + { + "Name": "port", + "Type": "int", + "File": "src-0.cs", + "Line": "32" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/test/Generators/Microsoft.Gen.ComplianceReports/TestClasses/RecordProperty.cs b/test/Generators/Microsoft.Gen.ComplianceReports/TestClasses/RecordProperty.cs new file mode 100644 index 00000000000..bd205caedec --- /dev/null +++ b/test/Generators/Microsoft.Gen.ComplianceReports/TestClasses/RecordProperty.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Extensions.Telemetry.Logging; + +namespace Test; + +interface IBar +{ + [C4] + public int P0 { get; } +} + +public record RecordProperty([C2] string F0, string F1, [C3] int F2) : IBar +{ + [C2(Notes = "Note 1")] + public int F3; + + [C2(Notes = null!)] + public int F4; + + [C3(Notes = "Note 3")] + public int P0 { get; }; + + [C3] + public int P1 { get; }; + + [LogMethod("Hello {user}")] + public void LogHello([C3(Notes = "Note 3")] string user, int port); + + [LogMethod("World {user}")] + public void LogWorld([C2] string user, int port); +} + +[C1] +public record DerivedRecordProperty : RecordProperty +{ + [C2(Notes = "Note 2")] + public override int P0 { get; }; +} diff --git a/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Common/GeneratorTests.cs b/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Common/GeneratorTests.cs index 443c0a87809..e0c0c3cab62 100644 --- a/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Common/GeneratorTests.cs +++ b/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Common/GeneratorTests.cs @@ -91,7 +91,7 @@ public async Task TestAll() static async Task> RunGenerator(string code, string outputFile) { var (d, _) = await RoslynTestUtils.RunGenerator( - new Generator(outputFile), + new ComplianceReportsGenerator(outputFile), new[] { Assembly.GetAssembly(typeof(ILogger))!, @@ -115,7 +115,7 @@ public async Task MissingDataClassificationSymbol() const string Source = "class Nothing {}"; var (d, _) = await RoslynTestUtils.RunGenerator( - new Generator("Foo"), + new ComplianceReportsGenerator("Foo"), null, new[] { diff --git a/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Directory.Build.props b/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Directory.Build.props index d04ec369659..6ea23785569 100644 --- a/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Directory.Build.props +++ b/test/Generators/Microsoft.Gen.ComplianceReports/Unit/Directory.Build.props @@ -13,7 +13,7 @@ - + TestClasses\%(RecursiveDir)%(Filename)%(Extension) diff --git a/test/Generators/Microsoft.Gen.ContextualOptions/Unit/Common/EmitterTests.cs b/test/Generators/Microsoft.Gen.ContextualOptions/Unit/Common/EmitterTests.cs index eec0b22fd35..f5fc3d8b87f 100644 --- a/test/Generators/Microsoft.Gen.ContextualOptions/Unit/Common/EmitterTests.cs +++ b/test/Generators/Microsoft.Gen.ContextualOptions/Unit/Common/EmitterTests.cs @@ -134,7 +134,7 @@ public async Task TestEmitter() } var (d, r) = await RoslynTestUtils.RunGenerator( - new Generator(), + new ContextualOptionsGenerator(), new[] { typeof(OptionsContextAttribute).Assembly, @@ -146,7 +146,7 @@ public async Task TestEmitter() Assert.Empty(d); _ = Assert.Single(r); - var golden = File.ReadAllText($"GoldenFiles/Microsoft.Gen.ContextualOptions/Microsoft.Gen.ContextualOptions.Generator/ContextualOptions.g.cs"); + var golden = File.ReadAllText($"GoldenFiles/Microsoft.Gen.ContextualOptions/Microsoft.Gen.ContextualOptions.ContextualOptionsGenerator/ContextualOptions.g.cs"); var result = r[0].SourceText.ToString(); Assert.Equal(golden, result); } diff --git a/test/Generators/Microsoft.Gen.Metering/TestClasses/MetricConstants.cs b/test/Generators/Microsoft.Gen.Metering/TestClasses/MetricConstants.cs index 500aafac9c8..845c7216901 100644 --- a/test/Generators/Microsoft.Gen.Metering/TestClasses/MetricConstants.cs +++ b/test/Generators/Microsoft.Gen.Metering/TestClasses/MetricConstants.cs @@ -10,5 +10,10 @@ internal static class MetricConstants public const string D2 = "Dim_2"; // dots are not supported in dimension names public const string D3 = "Dim_3"; // dashes are not supported in dimension names + + /// + /// Dim4 description. + /// + public const string DimWithXmlComment = "Dim4"; } } diff --git a/test/Generators/Microsoft.Gen.Metering/Unit/Common/EmitterTests.cs b/test/Generators/Microsoft.Gen.Metering/Unit/Common/EmitterTests.cs index 7dfc6664b83..62de5db40a3 100644 --- a/test/Generators/Microsoft.Gen.Metering/Unit/Common/EmitterTests.cs +++ b/test/Generators/Microsoft.Gen.Metering/Unit/Common/EmitterTests.cs @@ -33,7 +33,7 @@ public async Task TestEmitter() } var (d, r) = await RoslynTestUtils.RunGenerator( - new Generator(), + new MeteringGenerator(), new[] { Assembly.GetAssembly(typeof(Meter))!, @@ -48,7 +48,7 @@ public async Task TestEmitter() Assert.Empty(d); Assert.Equal(2, r.Length); - string generatedContentPath = "GoldenFiles/Microsoft.Gen.Metering/Microsoft.Gen.Metering.Generator"; + string generatedContentPath = "GoldenFiles/Microsoft.Gen.Metering/Microsoft.Gen.Metering.MeteringGenerator"; var goldenCache = File.ReadAllText($"{generatedContentPath}/Factory.g.cs"); var goldenMetrics = File.ReadAllText($"{generatedContentPath}/Metering.g.cs"); diff --git a/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.StrongTypes.cs b/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.StrongTypes.cs index 903f3333dd5..31af715af15 100644 --- a/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.StrongTypes.cs +++ b/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.StrongTypes.cs @@ -196,7 +196,8 @@ public static partial class MetricClass { [Counter(typeof(CounterStruct), Name=""TotalCountTest"")] public static partial TotalCount CreateTotalCountCounter(Meter meter); - }"); + } + "); Assert.Empty(d); } @@ -291,7 +292,8 @@ public static partial class MetricClass public static partial TotalCount CreateTotalCountCounter(Meter meter); }"); - Assert.Empty(d); + Assert.Single(d); + Assert.Equal(DiagDescriptors.ErrorGaugeNotSupported.Id, d[0].Id); } [Fact] @@ -356,6 +358,332 @@ public static partial class MetricClass public static partial TotalCount CreateTotalCountCounter(Meter meter); }"); + Assert.Single(d); + Assert.Equal(DiagDescriptors.ErrorGaugeNotSupported.Id, d[0].Id); + } + + [Fact] + public async Task StrongTypeCounterWithDescription() + { + var d = await RunGenerator(@" + internal static partial class Metric + { + /// + /// Dimension1 description. + /// + public const string Dim1 = ""Dim1""; + + /// + /// DescribedDimensionCounter description. + /// + /// + /// + [Counter(DescripedDimensions.Dimension1, Dim1)] + public static partial DescribedDimensionCounter CreatePublicCounter(Meter meter); + + /// + /// DimenisonDefinedInMetricClass description. + /// + public const string DimenisonDefinedInMetricClass = ""DimenisonDefinedInMetricClass""; + + /// + /// DescribedDimensionHistogram description. + /// + /// + /// + [Histogram(DescripedDimensions.Dimension2, DimenisonDefinedInMetricClass)] + public static partial DescribedDimensionHistogram CreatePublicHistogram(Meter meter); + + /// + /// StrongTypeCounterWithDescripedDimension description. + /// + /// + /// + [Counter(typeof(DimensionForStrongTypes), Name = ""MyStrongTypeMetricWithDescription"")] + public static partial StrongTypeCounterWithDescripedDimension CreateStrongTypeCounterWithDescibedDimensions(Meter meter); + } + + /// + /// DescripedDimensions class description. + /// + internal static class DescripedDimensions + { + /// + /// Dimension1 in class description. + /// + public const string Dimension1 = ""Dimension1""; + + /// + /// Dimension2 description. + /// + public const string Dimension2 = ""Dimension2""; + + /// + /// Dimension3 description. + /// + public const string Dimension3 = ""Dimension3""; + } + + public class DimensionForStrongTypes + { + /// + /// Gets or sets anotherDimension. + /// + public string? AnotherDimension { get; set; } + + /// + /// Gets or sets MetricEnum. + /// + public MetricOperations MetricEnum { get; set; } + + /// + /// Gets or sets MetricEnum2. + /// + [Dimension(""Enum2"")] + public MetricOperations MetricEnum2 { get; set; } + + /// + /// Gets or sets ChildDimensionsClass. + /// + public ChildClassDimensionForStrongTypes? ChildDimensionsClass { get; set; } + + /// + /// Gets or sets ChildDimensionsStruct. + /// + public DimensionForStrongTypesDimensionsStruct ChildDimensionsStruct { get; set; } + } + + public enum MetricOperations + { + Unknown = 0, + Operation1 = 1, + } + + public class ChildClassDimensionForStrongTypes + { + /// + /// Gets or sets Dim2. + /// + public string? Dim2 { get; set; } + + /// + /// Gets or sets SomeDim. + /// + [Dimension(""dim2FromAttribute"")] + public string? SomeDim; + } + + public struct DimensionForStrongTypesDimensionsStruct + { + /// + /// Gets or sets Dim4Struct. + /// + public string Dim4Struct { get; set; } + + /// + /// Gets or sets Dim5Struct. + /// + [Dimension(""Dim5FromAttribute"")] + public string Dim5Struct { get; set; } + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task StrongTypeHistogramWithDescription() + { + // This test should return no errors. + var d = await RunGenerator(@" + public class DimensionsTest : ParentDimensions + { + /// + /// test1 description. + /// + public string? test1 { get; set; } + + /// + /// test1_FromAttribute description. + /// + [Dimension(""test1_FromAttribute"")] + public string? test1_WithAttribute { get; set; } + + /// + /// operations_FromAttribute description. + /// + [Dimension(""operations_FromAttribute"")] + public Operations operations {get;set;} + + /// + /// ChildDimensions1 description. + /// + public ChildDimensions? ChildDimensions1 { get; set; } + + public void Method() + { + System.Console.WriteLine(""I am a method.""); + } + } + + public enum Operations + { + Unknown = 0, + Operation1 = 1, + } + + public class ParentDimensions + { + /// + /// parentDimension_FromAttribute description. + /// + [Dimension(""parentDimension_FromAttribute"")] + public string? ParentOperationNameWithAttribute { get;set; } + + /// + /// ParentOperationName description. + /// + public string? ParentOperationName { get;set; } + + public DimensionsStruct ChildDimensionsStruct { get; set; } + } + + public class ChildDimensions + { + /// + /// test2_WithAttribute description. + /// + [Dimension(""test2_FromAttribute"")] + public string test2_WithAttribute { get; set; } + + /// + /// test2 description. + /// + public string test2 { get; set; } + + /// + /// test1_FromAttribute_In_Child1 description. + /// + [Dimension(""test1_FromAttribute_In_Child1"")] + public string? test1 { get; set; } + + public ChildDimensions2? ChildDimensions2 { get; set;} + } + + public class ChildDimensions2 + { + /// + /// test3_FromAttribute description. + /// + [Dimension(""test3_FromAttribute"")] + public string test3_WithAttribute { get; set; } + + /// + /// test3 description. + /// + public string test3 { get; set; } + + /// + /// test1_FromAttribute_In_Child2 description. + /// + [Dimension(""test1_FromAttribute_In_Child2"")] + public string? test1 { get; set; } + } + + public struct DimensionsStruct + { + /// + /// testStruct_WithAttribute description. + /// + [Dimension(""testStruct_FromAttribute"")] + public string testStruct_WithAttribute { get; set; } + + /// + /// testStruct description. + /// + public string testStruct { get; set; } + } + + public static partial class MetricClass + { + [Histogram(typeof(DimensionsTest), Name=""TotalCountTest"")] + public static partial TestHistogram CreateTestHistogram(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task StructTypeCounterWithDescription() + { + var d = await RunGenerator(@" + public enum Operations + { + Unknown = 0, + Operation1 = 1, + } + + public struct CounterStruct + { + /// + /// Dim1_FromAttribute description. + /// + [Dimension(""Dim1_FromAttribute"")] + public string? Dim1 { get; set; } + + /// + /// Dim2_FromAttribute description. + /// + [Dimension(""Dim2_FromAttribute"")] + public string? Dim2; + + /// + /// Operations_FromAttribute description. + /// + [Dimension(""Operations_FromAttribute"")] + public Operations Operations { get; set; } + } + + public static partial class MetricClass + { + [Counter(typeof(CounterStruct), Name=""TotalCountTest"")] + public static partial TotalCount CreateTotalCountCounter(Meter meter); + } + "); + + Assert.Empty(d); + } + + [Fact] + public async Task StructTypeHistogramWithDescription() + { + var d = await RunGenerator(@" + public enum Operations + { + Unknown = 0, + Operation1 = 1, + } + + public struct HistogramStruct + { + /// + /// Dim1_FromAttribute description. + /// + [Dimension(""Dim1_FromAttribute"")] + public string? Dim1 { get; set; } + + /// + /// Operations_FromAttribute description. + /// + [Dimension(""Operations_FromAttribute"")] + public Operations Operations { get; set; } + } + + public static partial class MetricClass + { + [Histogram(typeof(HistogramStruct), Name=""TotalCountTest"")] + public static partial TotalHistogram CreateTotalHistogram(Meter meter); + }"); + Assert.Empty(d); } diff --git a/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.cs b/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.cs index 16705ad5ad0..3cf906c2a3a 100644 --- a/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.cs +++ b/test/Generators/Microsoft.Gen.Metering/Unit/Common/ParserTests.cs @@ -606,6 +606,146 @@ partial class C Assert.Empty(d); } + [Fact] + public async Task GaugeNotSupported() + { + var d = await RunGenerator(@" + partial class C + { + [Gauge(""d1"")] + static partial NotSupportedGauge CreateGauge(Meter meter); + }"); + + _ = Assert.Single(d); + Assert.Equal(DiagDescriptors.ErrorGaugeNotSupported.Id, d[0].Id); + } + + [Fact] + public async Task DimensionIsDocumentedCounter() + { + var d = await RunGenerator(@" + partial class C + { + /// + /// InClassDim description. + /// + private const string InClassDimensionName = ""InClassDim""; + [Counter(InClassDimensionName)] + static partial TestCounter CreateTestCounter(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task DimensionIsDocumentedHistogram() + { + var d = await RunGenerator(@" + partial class C + { + /// + /// InClassDim description. + /// + private const string InClassDimensionName = ""InClassDim""; + [Histogram(InClassDimensionName)] + static partial TestHistogram CreateTestHistogram(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task CounterIsDocumented() + { + var d = await RunGenerator(@" + partial class C + { + /// + /// TestCounter description. + /// + [Counter] + static partial TestCounter CreateTestCounter(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task HistogramIsDocumented() + { + var d = await RunGenerator(@" + partial class C + { + /// + /// TestHistogram description. + /// + [Histogram] + static partial TestHistogram CreateTestHistogram(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task CounterIsNotProperlyDocumented() + { + var d = await RunGenerator(@" + partial class C + { + /// + /// TestCounter description. + /// < /summary> + [Counter] + static partial TestCounter CreateTestCounter(Meter meter); + }"); + + Assert.Single(d); + Assert.Equal(DiagDescriptors.ErrorXmlNotLoadedCorrectly.Id, d[0].Id); + } + + [Fact] + public async Task HistogramIsNotXmlDocumented() + { + var d = await RunGenerator(@" + partial class C + { + /// no xml tags. + [Histogram] + static partial TestHistogram CreateTestHistogram(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task HistogramHasNoSummaryInXmlComment() + { + var d = await RunGenerator(@" + partial class C + { + /// + /// TestHistogram remarks. + /// + [Histogram] + static partial TestHistogram CreateTestHistogram(Meter meter); + }"); + + Assert.Empty(d); + } + + [Fact] + public async Task IMeterTypeParameter() + { + var d = await RunGenerator(@" + partial class C + { + [Histogram] + static partial TestHistogram CreateTestHistogram(IMeter meter); + }"); + + Assert.Empty(d); + } + private static async Task> RunGenerator( string code, bool wrap = true, @@ -647,7 +787,7 @@ private static async Task> RunGenerator( } var (d, _) = await RoslynTestUtils.RunGenerator( - new Generator(), + new MeteringGenerator(), refs, new[] { text }, includeBaseReferences: includeBaseReferences, diff --git a/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/MeteringReport.json b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/MeteringReport.json new file mode 100644 index 00000000000..540dd9cabcc --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/MeteringReport.json @@ -0,0 +1,39 @@ +[ + { + "TestClasses": + [ + { + "MetricName": "DescribedDimensionCounter", + "MetricDescription": "(Missing Summary)", + "InstrumentName": "Counter", + "Dimensions": { + "Dimension1": "Dimension1 description.", + "Dim1": "" + } + }, + { + "MetricName": "DescribedDimensionHistogram", + "MetricDescription": "(Missing Summary)", + "InstrumentName": "Histogram", + "Dimensions": { + "Dimension2": "Dimension2 description.", + "DimenisonDefinedInMetricClass": "DimenisonDefinedInMetricClass description." + } + }, + { + "MetricName": "MyStrongTypeMetricWithDescription", + "MetricDescription": "(Missing Summary)", + "InstrumentName": "Counter", + "Dimensions": { + "AnotherDimension": "Gets or sets anotherDimension.", + "MetricEnum": "Gets or sets MetricEnum.", + "Enum2": "Gets or sets MetricEnum2.", + "Dim2": "Gets or sets Dim2.", + "dim2FromAttribute": "Gets or sets SomeDim.", + "Dim4Struct": "Gets or sets Dim4Struct.", + "Dim5FromAttribute": "Gets or sets Dim5Struct." + } + } + ] + } +] \ No newline at end of file diff --git a/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Extensions.Telemetry.Abstractions.json b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Extensions.Telemetry.Abstractions.json new file mode 100644 index 00000000000..5cbff063cbe --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Extensions.Telemetry.Abstractions.json @@ -0,0 +1,885 @@ +{ + "Name": "Microsoft.Extensions.Telemetry.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", + "Types": [ + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.Checkpoint : System.IEquatable", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.Checkpoint.Checkpoint(string name, long elapsed, long frequency);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.Checkpoint.Checkpoint();", + "Stage": "Stable" + }, + { + "Member": "override bool Microsoft.Extensions.Telemetry.Latency.Checkpoint.Equals(object? obj);", + "Stage": "Stable" + }, + { + "Member": "bool Microsoft.Extensions.Telemetry.Latency.Checkpoint.Equals(Microsoft.Extensions.Telemetry.Latency.Checkpoint other);", + "Stage": "Stable" + }, + { + "Member": "override int Microsoft.Extensions.Telemetry.Latency.Checkpoint.GetHashCode();", + "Stage": "Stable" + }, + { + "Member": "static bool Microsoft.Extensions.Telemetry.Latency.Checkpoint.operator ==(Microsoft.Extensions.Telemetry.Latency.Checkpoint left, Microsoft.Extensions.Telemetry.Latency.Checkpoint right);", + "Stage": "Stable" + }, + { + "Member": "static bool Microsoft.Extensions.Telemetry.Latency.Checkpoint.operator !=(Microsoft.Extensions.Telemetry.Latency.Checkpoint left, Microsoft.Extensions.Telemetry.Latency.Checkpoint right);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "long Microsoft.Extensions.Telemetry.Latency.Checkpoint.Elapsed { get; }", + "Stage": "Stable" + }, + { + "Member": "long Microsoft.Extensions.Telemetry.Latency.Checkpoint.Frequency { get; }", + "Stage": "Stable" + }, + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.Checkpoint.Name { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.CheckpointToken", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.CheckpointToken.CheckpointToken(string name, int position);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.CheckpointToken.CheckpointToken();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.CheckpointToken.Name { get; }", + "Stage": "Stable" + }, + { + "Member": "int Microsoft.Extensions.Telemetry.Latency.CheckpointToken.Position { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Metering.CounterAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.CounterAttribute.CounterAttribute(params string[] dimensions);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Metering.CounterAttribute.CounterAttribute(System.Type type);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string[]? Microsoft.Extensions.Telemetry.Metering.CounterAttribute.Dimensions { get; }", + "Stage": "Stable" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Metering.CounterAttribute.Name { get; set; }", + "Stage": "Stable" + }, + { + "Member": "System.Type? Microsoft.Extensions.Telemetry.Metering.CounterAttribute.Type { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Metering.CounterAttribute : System.Attribute where T : struct", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.CounterAttribute.CounterAttribute(params string[] dimensions);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Metering.CounterAttribute.CounterAttribute(System.Type type);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string[]? Microsoft.Extensions.Telemetry.Metering.CounterAttribute.Dimensions { get; }", + "Stage": "Stable" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Metering.CounterAttribute.Name { get; set; }", + "Stage": "Stable" + }, + { + "Member": "System.Type? Microsoft.Extensions.Telemetry.Metering.CounterAttribute.Type { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Metering.DimensionAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.DimensionAttribute.DimensionAttribute(string name);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Metering.DimensionAttribute.Name { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "static class Microsoft.Extensions.Telemetry.Enrichment.EnricherExtensions", + "Stage": "Stable", + "Methods": [ + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Enrichment.EnricherExtensions.AddLogEnricher(this Microsoft.Extensions.DependencyInjection.IServiceCollection services);", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Enrichment.EnricherExtensions.AddLogEnricher(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, Microsoft.Extensions.Telemetry.Enrichment.ILogEnricher enricher);", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Enrichment.EnricherExtensions.AddMetricEnricher(this Microsoft.Extensions.DependencyInjection.IServiceCollection services);", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Enrichment.EnricherExtensions.AddMetricEnricher(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, Microsoft.Extensions.Telemetry.Enrichment.IMetricEnricher enricher);", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Metering.GaugeAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.GaugeAttribute.GaugeAttribute(params string[] dimensions);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Metering.GaugeAttribute.GaugeAttribute(System.Type type);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string[]? Microsoft.Extensions.Telemetry.Metering.GaugeAttribute.Dimensions { get; }", + "Stage": "Stable" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Metering.GaugeAttribute.Name { get; set; }", + "Stage": "Stable" + }, + { + "Member": "System.Type? Microsoft.Extensions.Telemetry.Metering.GaugeAttribute.Type { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Metering.HistogramAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.HistogramAttribute(params string[] dimensions);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.HistogramAttribute(System.Type type);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string[]? Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.Dimensions { get; }", + "Stage": "Stable" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.Name { get; set; }", + "Stage": "Stable" + }, + { + "Member": "System.Type? Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.Type { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Metering.HistogramAttribute : System.Attribute where T : struct", + "Stage": "Experimental", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.HistogramAttribute(params string[] dimensions);", + "Stage": "Experimental" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.HistogramAttribute(System.Type type);", + "Stage": "Experimental" + } + ], + "Properties": [ + { + "Member": "string[]? Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.Dimensions { get; }", + "Stage": "Experimental" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.Name { get; set; }", + "Stage": "Experimental" + }, + { + "Member": "System.Type? Microsoft.Extensions.Telemetry.Metering.HistogramAttribute.Type { get; }", + "Stage": "Experimental" + } + ] + }, + { + "Type": "enum Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode.HttpRouteParameterRedactionMode();", + "Stage": "Stable" + } + ], + "Fields": [ + { + "Member": "const Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode.Loose", + "Stage": "Stable", + "Value": "1" + }, + { + "Member": "const Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode.None", + "Stage": "Stable", + "Value": "2" + }, + { + "Member": "const Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode Microsoft.Extensions.Http.Telemetry.HttpRouteParameterRedactionMode.Strict", + "Stage": "Stable", + "Value": "0" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Http.Telemetry.IDownstreamDependencyMetadata", + "Stage": "Stable", + "Properties": [ + { + "Member": "string Microsoft.Extensions.Http.Telemetry.IDownstreamDependencyMetadata.DependencyName { get; }", + "Stage": "Stable" + }, + { + "Member": "System.Collections.Generic.ISet Microsoft.Extensions.Http.Telemetry.IDownstreamDependencyMetadata.RequestMetadata { get; }", + "Stage": "Stable" + }, + { + "Member": "System.Collections.Generic.ISet Microsoft.Extensions.Http.Telemetry.IDownstreamDependencyMetadata.UniqueHostNameSuffixes { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag.Add(string key, object value);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag.Add(string key, string value);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag.Add(System.ReadOnlySpan> properties);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag.Add(System.ReadOnlySpan> properties);", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Latency.ILatencyContext : System.IDisposable", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Telemetry.Latency.ILatencyContext.AddCheckpoint(Microsoft.Extensions.Telemetry.Latency.CheckpointToken token);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Latency.ILatencyContext.AddMeasure(Microsoft.Extensions.Telemetry.Latency.MeasureToken token, long value);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Latency.ILatencyContext.Freeze();", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Latency.ILatencyContext.RecordMeasure(Microsoft.Extensions.Telemetry.Latency.MeasureToken token, long value);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Latency.ILatencyContext.SetTag(Microsoft.Extensions.Telemetry.Latency.TagToken token, string value);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.LatencyData Microsoft.Extensions.Telemetry.Latency.ILatencyContext.LatencyData { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Latency.ILatencyContextProvider", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.ILatencyContext Microsoft.Extensions.Telemetry.Latency.ILatencyContextProvider.CreateContext();", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Latency.ILatencyContextTokenIssuer", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.CheckpointToken Microsoft.Extensions.Telemetry.Latency.ILatencyContextTokenIssuer.GetCheckpointToken(string name);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.MeasureToken Microsoft.Extensions.Telemetry.Latency.ILatencyContextTokenIssuer.GetMeasureToken(string name);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.TagToken Microsoft.Extensions.Telemetry.Latency.ILatencyContextTokenIssuer.GetTagToken(string name);", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Latency.ILatencyDataExporter", + "Stage": "Stable", + "Methods": [ + { + "Member": "System.Threading.Tasks.Task Microsoft.Extensions.Telemetry.Latency.ILatencyDataExporter.ExportAsync(Microsoft.Extensions.Telemetry.Latency.LatencyData data, System.Threading.CancellationToken cancellationToken);", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Enrichment.ILogEnricher", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.ILogEnricher.Enrich(Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag bag);", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Logging.ILogPropertyCollector", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Telemetry.Logging.ILogPropertyCollector.Add(string propertyName, object? propertyValue);", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Enrichment.IMetricEnricher", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.IMetricEnricher.Enrich(Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag bag);", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Http.Telemetry.IOutgoingRequestContext", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Http.Telemetry.IOutgoingRequestContext.SetRequestMetadata(Microsoft.Extensions.Http.Telemetry.RequestMetadata metadata);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "Microsoft.Extensions.Http.Telemetry.RequestMetadata? Microsoft.Extensions.Http.Telemetry.IOutgoingRequestContext.RequestMetadata { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "interface Microsoft.Extensions.Telemetry.Enrichment.ITraceEnricher", + "Stage": "Stable", + "Methods": [ + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.ITraceEnricher.Enrich(System.Diagnostics.Activity activity);", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Enrichment.ITraceEnricher.EnrichOnActivityStart(System.Diagnostics.Activity activity);", + "Stage": "Stable" + } + ] + }, + { + "Type": "class Microsoft.Extensions.Telemetry.Latency.LatencyContextRegistrationOptions", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.LatencyContextRegistrationOptions.LatencyContextRegistrationOptions();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "System.Collections.Generic.IReadOnlyList Microsoft.Extensions.Telemetry.Latency.LatencyContextRegistrationOptions.CheckpointNames { get; set; }", + "Stage": "Stable" + }, + { + "Member": "System.Collections.Generic.IReadOnlyList Microsoft.Extensions.Telemetry.Latency.LatencyContextRegistrationOptions.MeasureNames { get; set; }", + "Stage": "Stable" + }, + { + "Member": "System.Collections.Generic.IReadOnlyList Microsoft.Extensions.Telemetry.Latency.LatencyContextRegistrationOptions.TagNames { get; set; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.LatencyData", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.LatencyData.LatencyData(System.ArraySegment tags, System.ArraySegment checkpoints, System.ArraySegment measures, long durationTimestamp, long durationTimestampFrequency);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.LatencyData.LatencyData();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "System.ReadOnlySpan Microsoft.Extensions.Telemetry.Latency.LatencyData.Checkpoints { get; }", + "Stage": "Stable" + }, + { + "Member": "long Microsoft.Extensions.Telemetry.Latency.LatencyData.DurationTimestamp { get; }", + "Stage": "Stable" + }, + { + "Member": "long Microsoft.Extensions.Telemetry.Latency.LatencyData.DurationTimestampFrequency { get; }", + "Stage": "Stable" + }, + { + "Member": "System.ReadOnlySpan Microsoft.Extensions.Telemetry.Latency.LatencyData.Measures { get; }", + "Stage": "Stable" + }, + { + "Member": "System.ReadOnlySpan Microsoft.Extensions.Telemetry.Latency.LatencyData.Tags { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "static class Microsoft.Extensions.Telemetry.Latency.LatencyRegistryExtensions", + "Stage": "Stable", + "Methods": [ + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Latency.LatencyRegistryExtensions.RegisterCheckpointNames(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, params string[] names);", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Latency.LatencyRegistryExtensions.RegisterMeasureNames(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, params string[] names);", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Latency.LatencyRegistryExtensions.RegisterTagNames(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, params string[] names);", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(int eventId, Microsoft.Extensions.Logging.LogLevel level, string message);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(int eventId, Microsoft.Extensions.Logging.LogLevel level);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(Microsoft.Extensions.Logging.LogLevel level, string message);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(Microsoft.Extensions.Logging.LogLevel level);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(string message);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(int eventId, string message);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute(int eventId);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.LogMethodAttribute();", + "Stage": "Experimental" + } + ], + "Properties": [ + { + "Member": "int Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.EventId { get; }", + "Stage": "Stable" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.EventName { get; set; }", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Logging.LogLevel? Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.Level { get; }", + "Stage": "Stable" + }, + { + "Member": "string Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.Message { get; }", + "Stage": "Stable" + }, + { + "Member": "bool Microsoft.Extensions.Telemetry.Logging.LogMethodAttribute.SkipEnabledCheck { get; set; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Logging.LogMethodHelper : System.Collections.Generic.List>, Microsoft.Extensions.Telemetry.Logging.ILogPropertyCollector, Microsoft.Extensions.Telemetry.Enrichment.IEnrichmentPropertyBag, Microsoft.Extensions.ObjectPool.IResettable", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.LogMethodHelper();", + "Stage": "Stable" + }, + { + "Member": "void Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.Add(string propertyName, object? propertyValue);", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.Telemetry.Logging.LogMethodHelper Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.GetHelper();", + "Stage": "Stable" + }, + { + "Member": "static void Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.ReturnHelper(Microsoft.Extensions.Telemetry.Logging.LogMethodHelper helper);", + "Stage": "Stable" + }, + { + "Member": "static string Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.Stringify(System.Collections.IEnumerable? enumerable);", + "Stage": "Stable" + }, + { + "Member": "static string Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.Stringify(System.Collections.Generic.IEnumerable>? enumerable);", + "Stage": "Stable" + }, + { + "Member": "bool Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.TryReset();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.ParameterName { get; set; }", + "Stage": "Stable" + }, + { + "Member": "static Microsoft.Extensions.Logging.LogDefineOptions Microsoft.Extensions.Telemetry.Logging.LogMethodHelper.SkipEnabledCheckOptions { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute.LogPropertiesAttribute();", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute.LogPropertiesAttribute(System.Type providerType, string providerMethod);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "bool Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute.OmitParameterName { get; set; }", + "Stage": "Stable" + }, + { + "Member": "string? Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute.ProviderMethod { get; }", + "Stage": "Stable" + }, + { + "Member": "System.Type? Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute.ProviderType { get; }", + "Stage": "Stable" + }, + { + "Member": "bool Microsoft.Extensions.Telemetry.Logging.LogPropertiesAttribute.SkipNullProperties { get; set; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "sealed class Microsoft.Extensions.Telemetry.Logging.LogPropertyIgnoreAttribute : System.Attribute", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Logging.LogPropertyIgnoreAttribute.LogPropertyIgnoreAttribute();", + "Stage": "Stable" + } + ] + }, + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.Measure : System.IEquatable", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.Measure.Measure(string name, long value);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.Measure.Measure();", + "Stage": "Stable" + }, + { + "Member": "override bool Microsoft.Extensions.Telemetry.Latency.Measure.Equals(object? obj);", + "Stage": "Stable" + }, + { + "Member": "bool Microsoft.Extensions.Telemetry.Latency.Measure.Equals(Microsoft.Extensions.Telemetry.Latency.Measure other);", + "Stage": "Stable" + }, + { + "Member": "override int Microsoft.Extensions.Telemetry.Latency.Measure.GetHashCode();", + "Stage": "Stable" + }, + { + "Member": "static bool Microsoft.Extensions.Telemetry.Latency.Measure.operator ==(Microsoft.Extensions.Telemetry.Latency.Measure left, Microsoft.Extensions.Telemetry.Latency.Measure right);", + "Stage": "Stable" + }, + { + "Member": "static bool Microsoft.Extensions.Telemetry.Latency.Measure.operator !=(Microsoft.Extensions.Telemetry.Latency.Measure left, Microsoft.Extensions.Telemetry.Latency.Measure right);", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.Measure.Name { get; }", + "Stage": "Stable" + }, + { + "Member": "long Microsoft.Extensions.Telemetry.Latency.Measure.Value { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.MeasureToken", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.MeasureToken.MeasureToken(string name, int position);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.MeasureToken.MeasureToken();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.MeasureToken.Name { get; }", + "Stage": "Stable" + }, + { + "Member": "int Microsoft.Extensions.Telemetry.Latency.MeasureToken.Position { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "class Microsoft.Extensions.Telemetry.Metering.Meter : System.Diagnostics.Metrics.Meter", + "Stage": "Experimental", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Metering.Meter.Meter();", + "Stage": "Experimental" + } + ] + }, + { + "Type": "static class Microsoft.Extensions.Telemetry.Metering.MeteringExtensions", + "Stage": "Stable", + "Methods": [ + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Metering.MeteringExtensions.RegisterMetering(this Microsoft.Extensions.DependencyInjection.IServiceCollection services);", + "Stage": "Experimental" + } + ] + }, + { + "Type": "static class Microsoft.Extensions.Telemetry.Latency.NullLatencyContextExtensions", + "Stage": "Stable", + "Methods": [ + { + "Member": "static Microsoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.Telemetry.Latency.NullLatencyContextExtensions.AddNullLatencyContext(this Microsoft.Extensions.DependencyInjection.IServiceCollection services);", + "Stage": "Stable" + } + ] + }, + { + "Type": "class Microsoft.Extensions.Http.Telemetry.RequestMetadata", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Http.Telemetry.RequestMetadata.RequestMetadata();", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Http.Telemetry.RequestMetadata.RequestMetadata(string methodType, string requestRoute, string requestName = \"unknown\");", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Http.Telemetry.RequestMetadata.DependencyName { get; set; }", + "Stage": "Stable" + }, + { + "Member": "string Microsoft.Extensions.Http.Telemetry.RequestMetadata.MethodType { get; set; }", + "Stage": "Stable" + }, + { + "Member": "string Microsoft.Extensions.Http.Telemetry.RequestMetadata.RequestName { get; set; }", + "Stage": "Stable" + }, + { + "Member": "string Microsoft.Extensions.Http.Telemetry.RequestMetadata.RequestRoute { get; set; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.Tag", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.Tag.Tag(string name, string value);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.Tag.Tag();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.Tag.Name { get; }", + "Stage": "Stable" + }, + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.Tag.Value { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "readonly struct Microsoft.Extensions.Telemetry.Latency.TagToken", + "Stage": "Stable", + "Methods": [ + { + "Member": "Microsoft.Extensions.Telemetry.Latency.TagToken.TagToken(string name, int position);", + "Stage": "Stable" + }, + { + "Member": "Microsoft.Extensions.Telemetry.Latency.TagToken.TagToken();", + "Stage": "Stable" + } + ], + "Properties": [ + { + "Member": "string Microsoft.Extensions.Telemetry.Latency.TagToken.Name { get; }", + "Stage": "Stable" + }, + { + "Member": "int Microsoft.Extensions.Telemetry.Latency.TagToken.Position { get; }", + "Stage": "Stable" + } + ] + }, + { + "Type": "static class Microsoft.Extensions.Http.Telemetry.TelemetryConstants", + "Stage": "Stable", + "Fields": [ + { + "Member": "const string Microsoft.Extensions.Http.Telemetry.TelemetryConstants.ClientApplicationNameHeader", + "Stage": "Experimental", + "Value": "X-ClientApplication" + }, + { + "Member": "const string Microsoft.Extensions.Http.Telemetry.TelemetryConstants.Redacted", + "Stage": "Stable", + "Value": "REDACTED" + }, + { + "Member": "const string Microsoft.Extensions.Http.Telemetry.TelemetryConstants.RequestMetadataKey", + "Stage": "Stable", + "Value": "R9-RequestMetadata" + }, + { + "Member": "const string Microsoft.Extensions.Http.Telemetry.TelemetryConstants.ServerApplicationNameHeader", + "Stage": "Experimental", + "Value": "X-ServerApplication" + }, + { + "Member": "const string Microsoft.Extensions.Http.Telemetry.TelemetryConstants.Unknown", + "Stage": "Stable", + "Value": "unknown" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.deps.json b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.deps.json new file mode 100644 index 00000000000..3a0ebf498ab --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.deps.json @@ -0,0 +1,2870 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests/8.0.0-dev": { + "dependencies": { + "AutoFixture.AutoMoq": "4.17.0", + "FluentAssertions": "6.2.0", + "Microsoft.CodeAnalysis": "4.0.1", + "Microsoft.Extensions.Telemetry.Abstractions": "8.0.0-dev", + "Microsoft.Gen.MeteringReports": "8.0.0-dev", + "Microsoft.NET.Test.Sdk": "17.5.0", + "Microsoft.SourceLink.AzureRepos.Git": "8.0.0-beta.23252.2", + "Microsoft.SourceLink.GitHub": "8.0.0-beta.23252.2", + "Microsoft.TestUtilities": "8.0.0-dev", + "Microsoft.VisualStudio.Threading.Analyzers": "17.5.22", + "Moq": "4.16.1", + "Moq.AutoMock": "3.1.0", + "SonarAnalyzer.CSharp": "8.52.0.60960", + "StrongNamer": "0.2.5", + "StyleCop.Analyzers.Unstable": "1.2.0.435", + "Xunit.Combinatorial": "1.5.25", + "AutoFixture": "4.17.0", + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "2.4.2", + "xunit.runner.visualstudio": "2.4.3", + "Microsoft.Gen.MeteringReports.Reference": "8.0.0.0", + "Microsoft.TestUtilities.Reference": "8.0.0.0" + }, + "runtime": { + "Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.dll": {} + } + }, + "AutoFixture/4.17.0": { + "dependencies": { + "Fare": "2.1.1", + "System.ComponentModel.Annotations": "4.3.0" + }, + "runtime": { + "lib/netstandard2.0/AutoFixture.dll": { + "assemblyVersion": "4.17.0.0", + "fileVersion": "4.17.0.636" + } + } + }, + "AutoFixture.AutoMoq/4.17.0": { + "dependencies": { + "AutoFixture": "4.17.0", + "Moq": "4.16.1" + }, + "runtime": { + "lib/netstandard2.0/AutoFixture.AutoMoq.dll": { + "assemblyVersion": "4.17.0.0", + "fileVersion": "4.17.0.636" + } + } + }, + "Castle.Core/4.4.0": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.TraceSource": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + }, + "runtime": { + "lib/netstandard1.5/Castle.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.4.0.0" + } + } + }, + "Fare/2.1.1": { + "dependencies": { + "NETStandard.Library": "1.6.1" + }, + "runtime": { + "lib/netstandard1.1/Fare.dll": { + "assemblyVersion": "2.1.0.0", + "fileVersion": "2.1.1.0" + } + } + }, + "FluentAssertions/6.2.0": { + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + }, + "runtime": { + "lib/netcoreapp3.0/FluentAssertions.dll": { + "assemblyVersion": "6.2.0.0", + "fileVersion": "6.2.0.0" + } + } + }, + "Humanizer.Core/2.2.0": { + "dependencies": { + "NETStandard.Library": "1.6.1" + }, + "runtime": { + "lib/netstandard1.0/Humanizer.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.0" + } + } + }, + "Microsoft.Bcl.AsyncInterfaces/5.0.0": { + "runtime": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Microsoft.Build.Tasks.Git/8.0.0-beta.23252.2": {}, + "Microsoft.CodeAnalysis/4.0.1": { + "dependencies": { + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.0.1", + "Microsoft.CodeAnalysis.VisualBasic.Workspaces": "4.0.1" + } + }, + "Microsoft.CodeAnalysis.Analyzers/3.3.2": {}, + "Microsoft.CodeAnalysis.Common/4.0.1": { + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.2", + "System.Collections.Immutable": "5.0.0", + "System.Memory": "4.5.4", + "System.Reflection.Metadata": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "5.0.0", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.121.55815" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/4.0.1": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.121.55815" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/4.0.1": { + "dependencies": { + "Humanizer.Core": "2.2.0", + "Microsoft.CodeAnalysis.CSharp": "4.0.1", + "Microsoft.CodeAnalysis.Common": "4.0.1", + "Microsoft.CodeAnalysis.Workspaces.Common": "4.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.121.55815" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.VisualBasic/4.0.1": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.VisualBasic.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.121.55815" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.VisualBasic.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.VisualBasic.Workspaces/4.0.1": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "4.0.1", + "Microsoft.CodeAnalysis.VisualBasic": "4.0.1", + "Microsoft.CodeAnalysis.Workspaces.Common": "4.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.121.55815" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.VisualBasic.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common/4.0.1": { + "dependencies": { + "Humanizer.Core": "2.2.0", + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.CodeAnalysis.Common": "4.0.1", + "System.Composition": "1.0.31", + "System.IO.Pipelines": "5.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.CodeAnalysis.Workspaces.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.121.55815" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeCoverage/17.5.0": { + "runtime": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "17.500.222.62001" + } + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0-preview.5.23272.1": { + "runtime": { + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.27201" + } + } + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.0-preview.5.23272.1": { + "runtime": { + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.27201" + } + } + }, + "Microsoft.Extensions.ObjectPool/8.0.0-preview.5.23273.2": { + "runtime": { + "lib/net8.0/Microsoft.Extensions.ObjectPool.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.27302" + } + } + }, + "Microsoft.Extensions.Options/8.0.0-preview.5.23272.1": { + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0-preview.5.23272.1", + "Microsoft.Extensions.Primitives": "8.0.0-preview.5.23272.1" + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.Options.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.27201" + } + } + }, + "Microsoft.Extensions.Primitives/8.0.0-preview.5.23272.1": { + "runtime": { + "lib/net8.0/Microsoft.Extensions.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.27201" + } + } + }, + "Microsoft.NET.Test.Sdk/17.5.0": { + "dependencies": { + "Microsoft.CodeCoverage": "17.5.0", + "Microsoft.TestPlatform.TestHost": "17.5.0" + } + }, + "Microsoft.NETCore.Platforms/2.1.2": {}, + "Microsoft.NETCore.Targets/1.1.0": {}, + "Microsoft.SourceLink.AzureRepos.Git/8.0.0-beta.23252.2": { + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0-beta.23252.2", + "Microsoft.SourceLink.Common": "8.0.0-beta.23252.2" + } + }, + "Microsoft.SourceLink.Common/8.0.0-beta.23252.2": {}, + "Microsoft.SourceLink.GitHub/8.0.0-beta.23252.2": { + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0-beta.23252.2", + "Microsoft.SourceLink.Common": "8.0.0-beta.23252.2" + } + }, + "Microsoft.TestPlatform.ObjectModel/17.5.0": { + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "5.0.0" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + }, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + }, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.TestPlatform.TestHost/17.5.0": { + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.5.0", + "Newtonsoft.Json": "13.0.1" + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + }, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + }, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + }, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + }, + "lib/netcoreapp3.1/testhost.dll": { + "assemblyVersion": "15.0.0.0", + "fileVersion": "15.0.0.0" + } + }, + "resources": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.VisualStudio.Threading.Analyzers/17.5.22": {}, + "Microsoft.Win32.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Moq/4.16.1": { + "dependencies": { + "Castle.Core": "4.4.0", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netstandard2.1/Moq.dll": { + "assemblyVersion": "4.16.0.0", + "fileVersion": "4.16.1.0" + } + } + }, + "Moq.AutoMock/3.1.0": { + "dependencies": { + "Moq": "4.16.1" + }, + "runtime": { + "lib/netstandard2.0/Moq.AutoMock.dll": { + "assemblyVersion": "3.1.0.0", + "fileVersion": "3.1.0.0" + } + } + }, + "NETStandard.Library/1.6.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json/13.0.1": { + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.1.25517" + } + } + }, + "NuGet.Frameworks/5.11.0": { + "runtime": { + "lib/netstandard2.0/NuGet.Frameworks.dll": { + "assemblyVersion": "5.11.0.10", + "fileVersion": "5.11.0.10" + } + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.native.System/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "SonarAnalyzer.CSharp/8.52.0.60960": {}, + "StrongNamer/0.2.5": {}, + "StyleCop.Analyzers.Unstable/1.2.0.435": {}, + "System.AppContext/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable/5.0.0": {}, + "System.Collections.NonGeneric/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized/4.3.0": { + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel.Primitives/4.3.0": { + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Composition/1.0.31": { + "dependencies": { + "System.Composition.AttributedModel": "1.0.31", + "System.Composition.Convention": "1.0.31", + "System.Composition.Hosting": "1.0.31", + "System.Composition.Runtime": "1.0.31", + "System.Composition.TypedParts": "1.0.31" + } + }, + "System.Composition.AttributedModel/1.0.31": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Composition.AttributedModel.dll": { + "assemblyVersion": "1.0.31.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Composition.Convention/1.0.31": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Composition.AttributedModel": "1.0.31", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Composition.Convention.dll": { + "assemblyVersion": "1.0.31.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Composition.Hosting/1.0.31": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Composition.Runtime": "1.0.31", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Composition.Hosting.dll": { + "assemblyVersion": "1.0.31.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Composition.Runtime/1.0.31": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Composition.Runtime.dll": { + "assemblyVersion": "1.0.31.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Composition.TypedParts/1.0.31": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Composition.AttributedModel": "1.0.31", + "System.Composition.Hosting": "1.0.31", + "System.Composition.Runtime": "1.0.31", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.Composition.TypedParts.dll": { + "assemblyVersion": "1.0.31.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Configuration.ConfigurationManager/4.4.0": { + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + }, + "runtime": { + "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Console/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource/8.0.0-preview.5.23272.1": { + "runtime": { + "lib/net8.0/System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.27201" + } + } + }, + "System.Diagnostics.Tools/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile/4.3.0": { + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.Pipelines/5.0.1": { + "runtime": { + "lib/netcoreapp3.0/System.IO.Pipelines.dll": { + "assemblyVersion": "5.0.0.1", + "fileVersion": "5.0.120.57516" + } + } + }, + "System.Linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory/4.5.4": {}, + "System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "8.0.0-preview.5.23272.1", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit/4.3.0": { + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata/5.0.0": {}, + "System.Reflection.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe/5.0.0": {}, + "System.Runtime.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics/4.3.0": { + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData/4.4.0": { + "runtime": { + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll": { + "rid": "win", + "assetType": "runtime", + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages/4.5.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "5.0.0" + } + }, + "System.Text.Encoding.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions/4.5.4": {}, + "System.Threading.Timer/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "System.Xml.XDocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions/2.0.3": { + "runtime": { + "lib/netstandard2.0/xunit.abstractions.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.0.0.0" + } + } + }, + "xunit.analyzers/1.0.0": {}, + "xunit.assert/2.4.2": { + "dependencies": { + "NETStandard.Library": "1.6.1" + }, + "runtime": { + "lib/netstandard1.1/xunit.assert.dll": { + "assemblyVersion": "2.4.2.0", + "fileVersion": "2.4.2.0" + } + } + }, + "Xunit.Combinatorial/1.5.25": { + "dependencies": { + "xunit.extensibility.core": "2.4.2" + }, + "runtime": { + "lib/netstandard2.0/Xunit.Combinatorial.dll": { + "assemblyVersion": "1.5.0.0", + "fileVersion": "1.5.25.38407" + } + } + }, + "xunit.core/2.4.2": { + "dependencies": { + "xunit.extensibility.core": "2.4.2", + "xunit.extensibility.execution": "2.4.2" + } + }, + "xunit.extensibility.core/2.4.2": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + }, + "runtime": { + "lib/netstandard1.1/xunit.core.dll": { + "assemblyVersion": "2.4.2.0", + "fileVersion": "2.4.2.0" + } + } + }, + "xunit.extensibility.execution/2.4.2": { + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "2.4.2" + }, + "runtime": { + "lib/netstandard1.1/xunit.execution.dotnet.dll": { + "assemblyVersion": "2.4.2.0", + "fileVersion": "2.4.2.0" + } + } + }, + "xunit.runner.visualstudio/2.4.3": {}, + "Microsoft.Extensions.Telemetry.Abstractions/8.0.0-dev": { + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.0-preview.5.23272.1", + "Microsoft.Extensions.ObjectPool": "8.0.0-preview.5.23273.2", + "Microsoft.Extensions.Options": "8.0.0-preview.5.23272.1", + "System.Diagnostics.DiagnosticSource": "8.0.0-preview.5.23272.1" + }, + "runtime": { + "Microsoft.Extensions.Telemetry.Abstractions.dll": {} + } + }, + "Microsoft.Gen.MeteringReports/8.0.0-dev": { + "dependencies": { + "Microsoft.CodeAnalysis": "4.0.1" + }, + "runtime": { + "Microsoft.Gen.MeteringReports.dll": {} + } + }, + "Microsoft.TestUtilities/8.0.0-dev": { + "dependencies": { + "AutoFixture.AutoMoq": "4.17.0", + "FluentAssertions": "6.2.0", + "Moq": "4.16.1", + "Moq.AutoMock": "3.1.0", + "StrongNamer": "0.2.5", + "Xunit.Combinatorial": "1.5.25", + "AutoFixture": "4.17.0", + "xunit.extensibility.execution": "2.4.2" + }, + "runtime": { + "Microsoft.TestUtilities.dll": {} + } + }, + "Microsoft.Gen.MeteringReports.Reference/8.0.0.0": { + "runtime": { + "Microsoft.Gen.MeteringReports.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "42.42.42.42424" + } + } + }, + "Microsoft.TestUtilities.Reference/8.0.0.0": { + "runtime": { + "Microsoft.TestUtilities.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "42.42.42.42424" + } + } + } + } + }, + "libraries": { + "Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests/8.0.0-dev": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "AutoFixture/4.17.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-efMRCG3Epc4QDELwdmQGf6/caQUleRXPRCnLAq5gLMpTuOTcOQWV12vEJ8qo678Rj97/TjjxHYu/34rGkXdVAA==", + "path": "autofixture/4.17.0", + "hashPath": "autofixture.4.17.0.nupkg.sha512" + }, + "AutoFixture.AutoMoq/4.17.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-i6xReNJM8+jjXk1LJ5UBPJMZjoOAr7mkgM1pkI40aZJ9Y2KZxRW528XmLoYzDmvIayDtvzkYd1Zns0dn7Kkr0g==", + "path": "autofixture.automoq/4.17.0", + "hashPath": "autofixture.automoq.4.17.0.nupkg.sha512" + }, + "Castle.Core/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-b5rRL5zeaau1y/5hIbI+6mGw3cwun16YjkHZnV9RRT5UyUIFsgLmNXJ0YnIN9p8Hw7K7AbG1q1UclQVU3DinAQ==", + "path": "castle.core/4.4.0", + "hashPath": "castle.core.4.4.0.nupkg.sha512" + }, + "Fare/2.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HaI8puqA66YU7/9cK4Sgbs1taUTP1Ssa4QT2PIzqJ7GvAbN1QgkjbRsjH+FSbMh1MJdvS0CIwQNLtFT+KF6KpA==", + "path": "fare/2.1.1", + "hashPath": "fare.2.1.1.nupkg.sha512" + }, + "FluentAssertions/6.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5YOZLB0Tay1bw+wEYZTAZlPThQ/Yntk1HSPJYluMd5PW/Xg9E8I1mRC03AKRsnuANBR0kYaHq0NX1fg7RgrGNA==", + "path": "fluentassertions/6.2.0", + "hashPath": "fluentassertions.6.2.0.nupkg.sha512" + }, + "Humanizer.Core/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==", + "path": "humanizer.core/2.2.0", + "hashPath": "humanizer.core.2.2.0.nupkg.sha512" + }, + "Microsoft.Bcl.AsyncInterfaces/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==", + "path": "microsoft.bcl.asyncinterfaces/5.0.0", + "hashPath": "microsoft.bcl.asyncinterfaces.5.0.0.nupkg.sha512" + }, + "Microsoft.Build.Tasks.Git/8.0.0-beta.23252.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AmkuzGoK7EHF44CmZQ2ScZSKWsMd0c2FQBeThwedLOtYb6rbLJbuFPXwHaPw68BiaO7zHOKkMGDkiXxd9O0Rpg==", + "path": "microsoft.build.tasks.git/8.0.0-beta.23252.2", + "hashPath": "microsoft.build.tasks.git.8.0.0-beta.23252.2.nupkg.sha512" + }, + "Microsoft.CodeAnalysis/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PIuWPA8RyLNJhsgPNsOsJPYmfKTrJOqe7+lp7KNvs4m2kFGHVvq2f8yfQ60uCbyRmLxWU4w49gNcKytjcIuBZw==", + "path": "microsoft.codeanalysis/4.0.1", + "hashPath": "microsoft.codeanalysis.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Analyzers/3.3.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA==", + "path": "microsoft.codeanalysis.analyzers/3.3.2", + "hashPath": "microsoft.codeanalysis.analyzers.3.3.2.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Common/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SMREwaVD5SzatlWhh9aahQAtSWdb63NcE//f+bQzgHSECU6xtDtaxk0kwV+asdFfr6HtW38UeO6jvqdfzudg3w==", + "path": "microsoft.codeanalysis.common/4.0.1", + "hashPath": "microsoft.codeanalysis.common.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Q9RxxydPpUElj/x1/qykDTUGsRoKbJG8H5XUSeMGmMu54fBiuX1xyanom9caa1oQfh5JIW1BgLxobSaWs4WyHQ==", + "path": "microsoft.codeanalysis.csharp/4.0.1", + "hashPath": "microsoft.codeanalysis.csharp.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-gcixGtpEjtoZV9SQcmSzf3OjHBACWUBKEEEjdIyn9E2gpd7dm+TiFFMrvJK6mW0VJp63z2MW6wBDiuaXDcFZdQ==", + "path": "microsoft.codeanalysis.csharp.workspaces/4.0.1", + "hashPath": "microsoft.codeanalysis.csharp.workspaces.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.VisualBasic/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-o67w8S4zO7tQvB0EQeeo7i5uJCT/CrLwnLUWkkbxU2aUsZPGuRd35diuqk7e+vwnfhu27AvNJsr+1Z6EUT+fDA==", + "path": "microsoft.codeanalysis.visualbasic/4.0.1", + "hashPath": "microsoft.codeanalysis.visualbasic.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.VisualBasic.Workspaces/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-h8Alrq7yPFHU8DLmCMbAcaKnFVsdu2bDy6IFTiw9UXDdWjGGre1/Uae+VcY/VIi/GkjmrLtRcTTHZZIyagMOWg==", + "path": "microsoft.codeanalysis.visualbasic.workspaces/4.0.1", + "hashPath": "microsoft.codeanalysis.visualbasic.workspaces.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Workspaces.Common/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UfH5ZiUeXE3YIJAiJV1KTrs7uyJ4U3kqjLerYxwuugfaxedpI4lTevbXKSvns+FPL+hLTxKvldhANj8/uEYiRA==", + "path": "microsoft.codeanalysis.workspaces.common/4.0.1", + "hashPath": "microsoft.codeanalysis.workspaces.common.4.0.1.nupkg.sha512" + }, + "Microsoft.CodeCoverage/17.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6FQo0O6LKDqbCiIgVQhJAf810HSjFlOj7FunWaeOGDKxy8DAbpHzPk4SfBTXz9ytaaceuIIeR6hZgplt09m+ig==", + "path": "microsoft.codecoverage/17.5.0", + "hashPath": "microsoft.codecoverage.17.5.0.nupkg.sha512" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0-preview.5.23272.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-N3IghJGtLftmXLkEZE/pQGT+/roy3SD52vUvfPOJxlVqROlsZ7LsHjjWzAVEBCZPh32Njb8Cx3YtrZ9jQd0Row==", + "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0-preview.5.23272.1", + "hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.0-preview.5.23272.1.nupkg.sha512" + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.0-preview.5.23272.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hTSwio6sUotYVDsoeoGu+8wpqk+oBYT98Tw8Nx3q/TUjQGNk4jtugVNmk0uGqI86T18mJG0+2+KP7Wehl/DP9g==", + "path": "microsoft.extensions.logging.abstractions/8.0.0-preview.5.23272.1", + "hashPath": "microsoft.extensions.logging.abstractions.8.0.0-preview.5.23272.1.nupkg.sha512" + }, + "Microsoft.Extensions.ObjectPool/8.0.0-preview.5.23273.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FUK7flkPH4VZAbuJiZh+TzchyJ3eBepZCiih+mSZE5jKlQUbe3nBkARpciKPsOh7WdkiqQi8gT5vEe40R3NQbQ==", + "path": "microsoft.extensions.objectpool/8.0.0-preview.5.23273.2", + "hashPath": "microsoft.extensions.objectpool.8.0.0-preview.5.23273.2.nupkg.sha512" + }, + "Microsoft.Extensions.Options/8.0.0-preview.5.23272.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ffM5AMRw1xl+QYjAdSSv2xF2t2bl9DpAD+GTAb8ejfsu1iHR3O2LLl8XXdz+v2F5QRqBde8E1N+xmMl88w/Beg==", + "path": "microsoft.extensions.options/8.0.0-preview.5.23272.1", + "hashPath": "microsoft.extensions.options.8.0.0-preview.5.23272.1.nupkg.sha512" + }, + "Microsoft.Extensions.Primitives/8.0.0-preview.5.23272.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-MyhXgKLRd65RiREqK0W/DIO/AJYPrTccL/cBfB455O4DV9ehy6FbBMzrzhJV2RszDcDP+JYA1K3cHfmQHLEpoA==", + "path": "microsoft.extensions.primitives/8.0.0-preview.5.23272.1", + "hashPath": "microsoft.extensions.primitives.8.0.0-preview.5.23272.1.nupkg.sha512" + }, + "Microsoft.NET.Test.Sdk/17.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IJ4eSPcsRbwbAZehh1M9KgejSy0u3d0wAdkJytfCh67zOaCl5U3ltruUEe15MqirdRqGmm/ngbjeaVeGapSZxg==", + "path": "microsoft.net.test.sdk/17.5.0", + "hashPath": "microsoft.net.test.sdk.17.5.0.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/2.1.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==", + "path": "microsoft.netcore.platforms/2.1.2", + "hashPath": "microsoft.netcore.platforms.2.1.2.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", + "path": "microsoft.netcore.targets/1.1.0", + "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" + }, + "Microsoft.SourceLink.AzureRepos.Git/8.0.0-beta.23252.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+MyyxoSorb2TD5XzQ5ZW6o6XWjvedBSZgc+7AJNxWwIwAejy9ObGhcv22G9+n+nUjUHlVIkt3HXouQPHbm8kjQ==", + "path": "microsoft.sourcelink.azurerepos.git/8.0.0-beta.23252.2", + "hashPath": "microsoft.sourcelink.azurerepos.git.8.0.0-beta.23252.2.nupkg.sha512" + }, + "Microsoft.SourceLink.Common/8.0.0-beta.23252.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-E9nnMi6RRrMGzrcJDZ3U1PnunYwysTIH4AsEPJIFPLt0cHvVSMJLw6B3JeYZ1KjvLkCUmLiL5TiUfjC6F//I4A==", + "path": "microsoft.sourcelink.common/8.0.0-beta.23252.2", + "hashPath": "microsoft.sourcelink.common.8.0.0-beta.23252.2.nupkg.sha512" + }, + "Microsoft.SourceLink.GitHub/8.0.0-beta.23252.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rjx+CRlfZeGl/2hbP+Ty1OQuEjWBll4TCUgVRY9pw4n/FMwNj0B+LYVobeH9vnvmmiPfAnHePVcZiCm/cIaRVw==", + "path": "microsoft.sourcelink.github/8.0.0-beta.23252.2", + "hashPath": "microsoft.sourcelink.github.8.0.0-beta.23252.2.nupkg.sha512" + }, + "Microsoft.TestPlatform.ObjectModel/17.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QwiBJcC/oEA1kojOaB0uPWOIo4i6BYuTBBYJVhUvmXkyYqZ2Ut/VZfgi+enf8LF8J4sjO98oRRFt39MiRorcIw==", + "path": "microsoft.testplatform.objectmodel/17.5.0", + "hashPath": "microsoft.testplatform.objectmodel.17.5.0.nupkg.sha512" + }, + "Microsoft.TestPlatform.TestHost/17.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X86aikwp9d4SDcBChwzQYZihTPGEtMdDk+9t64emAl7N0Tq+OmlLAoW+Rs+2FB2k6QdUicSlT4QLO2xABRokaw==", + "path": "microsoft.testplatform.testhost/17.5.0", + "hashPath": "microsoft.testplatform.testhost.17.5.0.nupkg.sha512" + }, + "Microsoft.VisualStudio.Threading.Analyzers/17.5.22": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WzCsniKpC6S9yAerB+Od8pK8RytxW+fFSZ+GjL0y0XdIb7H/os71bWFbKMXxB1omDLZHNm1IdBlcLQm4KmS/AQ==", + "path": "microsoft.visualstudio.threading.analyzers/17.5.22", + "hashPath": "microsoft.visualstudio.threading.analyzers.17.5.22.nupkg.sha512" + }, + "Microsoft.Win32.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "path": "microsoft.win32.primitives/4.3.0", + "hashPath": "microsoft.win32.primitives.4.3.0.nupkg.sha512" + }, + "Moq/4.16.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bw3R9q8cVNhWXNpnvWb0OGP4HadS4zvClq+T1zf7AF+tLY1haZ2AvbHidQekf4PDv1T40c6brZeT/V0IBq7cEQ==", + "path": "moq/4.16.1", + "hashPath": "moq.4.16.1.nupkg.sha512" + }, + "Moq.AutoMock/3.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-4FOnn9vEsMxGCqk9saSPur5LUYlrVri+hwTIMJ8vp1yHFaD4621ogcsvD+KnOuJVF4N/gQSofGMg2mrWlvEg/w==", + "path": "moq.automock/3.1.0", + "hashPath": "moq.automock.3.1.0.nupkg.sha512" + }, + "NETStandard.Library/1.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "path": "netstandard.library/1.6.1", + "hashPath": "netstandard.library.1.6.1.nupkg.sha512" + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "path": "newtonsoft.json/13.0.1", + "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" + }, + "NuGet.Frameworks/5.11.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==", + "path": "nuget.frameworks/5.11.0", + "hashPath": "nuget.frameworks.5.11.0.nupkg.sha512" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", + "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", + "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", + "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.native.System/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "path": "runtime.native.system/4.3.0", + "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" + }, + "runtime.native.System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "path": "runtime.native.system.io.compression/4.3.0", + "hashPath": "runtime.native.system.io.compression.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "path": "runtime.native.system.net.http/4.3.0", + "hashPath": "runtime.native.system.net.http.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "path": "runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "path": "runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==", + "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", + "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==", + "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==", + "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==", + "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==", + "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "SonarAnalyzer.CSharp/8.52.0.60960": { + "type": "package", + "serviceable": true, + "sha512": "sha512-XZX2dwJaM0EmXUrbz1AET6GnXEMDorPlp9e7B3cQvyZG3eGs6Xmk//ZDybqbPuvPukbr9eOmFrsUxyrtiHm2LQ==", + "path": "sonaranalyzer.csharp/8.52.0.60960", + "hashPath": "sonaranalyzer.csharp.8.52.0.60960.nupkg.sha512" + }, + "StrongNamer/0.2.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1IWl8gYnsTC6NXHz63iDpXL8r0y5x0M/Cnq/Ju5uM17gTOQYSeclMkgQsvmGglJEqAwVxayY1sIUR3bb2MAy5Q==", + "path": "strongnamer/0.2.5", + "hashPath": "strongnamer.0.2.5.nupkg.sha512" + }, + "StyleCop.Analyzers.Unstable/1.2.0.435": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg==", + "path": "stylecop.analyzers.unstable/1.2.0.435", + "hashPath": "stylecop.analyzers.unstable.1.2.0.435.nupkg.sha512" + }, + "System.AppContext/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "path": "system.appcontext/4.3.0", + "hashPath": "system.appcontext.4.3.0.nupkg.sha512" + }, + "System.Buffers/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "path": "system.buffers/4.3.0", + "hashPath": "system.buffers.4.3.0.nupkg.sha512" + }, + "System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "System.Collections.Concurrent/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "path": "system.collections.concurrent/4.3.0", + "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" + }, + "System.Collections.Immutable/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", + "path": "system.collections.immutable/5.0.0", + "hashPath": "system.collections.immutable.5.0.0.nupkg.sha512" + }, + "System.Collections.NonGeneric/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "path": "system.collections.nongeneric/4.3.0", + "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" + }, + "System.Collections.Specialized/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "path": "system.collections.specialized/4.3.0", + "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" + }, + "System.ComponentModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "path": "system.componentmodel/4.3.0", + "hashPath": "system.componentmodel.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.Annotations/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SY2RLItHt43rd8J9D8M8e8NM4m+9WLN2uUd9G0n1I4hj/7w+v3pzK6ZBjexlG1/2xvLKQsqir3UGVSyBTXMLWA==", + "path": "system.componentmodel.annotations/4.3.0", + "hashPath": "system.componentmodel.annotations.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "path": "system.componentmodel.primitives/4.3.0", + "hashPath": "system.componentmodel.primitives.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "path": "system.componentmodel.typeconverter/4.3.0", + "hashPath": "system.componentmodel.typeconverter.4.3.0.nupkg.sha512" + }, + "System.Composition/1.0.31": { + "type": "package", + "serviceable": true, + "sha512": "sha512-I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==", + "path": "system.composition/1.0.31", + "hashPath": "system.composition.1.0.31.nupkg.sha512" + }, + "System.Composition.AttributedModel/1.0.31": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==", + "path": "system.composition.attributedmodel/1.0.31", + "hashPath": "system.composition.attributedmodel.1.0.31.nupkg.sha512" + }, + "System.Composition.Convention/1.0.31": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==", + "path": "system.composition.convention/1.0.31", + "hashPath": "system.composition.convention.1.0.31.nupkg.sha512" + }, + "System.Composition.Hosting/1.0.31": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==", + "path": "system.composition.hosting/1.0.31", + "hashPath": "system.composition.hosting.1.0.31.nupkg.sha512" + }, + "System.Composition.Runtime/1.0.31": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==", + "path": "system.composition.runtime/1.0.31", + "hashPath": "system.composition.runtime.1.0.31.nupkg.sha512" + }, + "System.Composition.TypedParts/1.0.31": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==", + "path": "system.composition.typedparts/1.0.31", + "hashPath": "system.composition.typedparts.1.0.31.nupkg.sha512" + }, + "System.Configuration.ConfigurationManager/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "path": "system.configuration.configurationmanager/4.4.0", + "hashPath": "system.configuration.configurationmanager.4.4.0.nupkg.sha512" + }, + "System.Console/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "path": "system.console/4.3.0", + "hashPath": "system.console.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.DiagnosticSource/8.0.0-preview.5.23272.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-z8aWPWEARVzr7lFRzlS/C05DUbzO8A/CSC3RRao8ik8CedaDXmbbUeOAH3WGS3XDbF/sY6K6uhwZacwWxzmXgA==", + "path": "system.diagnostics.diagnosticsource/8.0.0-preview.5.23272.1", + "hashPath": "system.diagnostics.diagnosticsource.8.0.0-preview.5.23272.1.nupkg.sha512" + }, + "System.Diagnostics.Tools/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "path": "system.diagnostics.tools/4.3.0", + "hashPath": "system.diagnostics.tools.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.TraceSource/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==", + "path": "system.diagnostics.tracesource/4.3.0", + "hashPath": "system.diagnostics.tracesource.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tracing/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "path": "system.diagnostics.tracing/4.3.0", + "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" + }, + "System.Dynamic.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "path": "system.dynamic.runtime/4.3.0", + "hashPath": "system.dynamic.runtime.4.3.0.nupkg.sha512" + }, + "System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "System.Globalization.Calendars/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "path": "system.globalization.calendars/4.3.0", + "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" + }, + "System.Globalization.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "path": "system.globalization.extensions/4.3.0", + "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" + }, + "System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "path": "system.io.compression/4.3.0", + "hashPath": "system.io.compression.4.3.0.nupkg.sha512" + }, + "System.IO.Compression.ZipFile/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "path": "system.io.compression.zipfile/4.3.0", + "hashPath": "system.io.compression.zipfile.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "path": "system.io.filesystem/4.3.0", + "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "path": "system.io.filesystem.primitives/4.3.0", + "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" + }, + "System.IO.Pipelines/5.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qEePWsaq9LoEEIqhbGe6D5J8c9IqQOUuTzzV6wn1POlfdLkJliZY3OlB0j0f17uMWlqZYjH7txj+2YbyrIA8Yg==", + "path": "system.io.pipelines/5.0.1", + "hashPath": "system.io.pipelines.5.0.1.nupkg.sha512" + }, + "System.Linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "System.Linq.Expressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "path": "system.linq.expressions/4.3.0", + "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" + }, + "System.Memory/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", + "path": "system.memory/4.5.4", + "hashPath": "system.memory.4.5.4.nupkg.sha512" + }, + "System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "path": "system.net.http/4.3.0", + "hashPath": "system.net.http.4.3.0.nupkg.sha512" + }, + "System.Net.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "path": "system.net.primitives/4.3.0", + "hashPath": "system.net.primitives.4.3.0.nupkg.sha512" + }, + "System.Net.Sockets/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "path": "system.net.sockets/4.3.0", + "hashPath": "system.net.sockets.4.3.0.nupkg.sha512" + }, + "System.ObjectModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "path": "system.objectmodel/4.3.0", + "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" + }, + "System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "path": "system.reflection.emit/4.3.0", + "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "path": "system.reflection.emit.ilgeneration/4.3.0", + "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "path": "system.reflection.emit.lightweight/4.3.0", + "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512" + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "System.Reflection.Metadata/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==", + "path": "system.reflection.metadata/5.0.0", + "hashPath": "system.reflection.metadata.5.0.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "System.Reflection.TypeExtensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "path": "system.reflection.typeextensions/4.3.0", + "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==", + "path": "system.runtime.compilerservices.unsafe/5.0.0", + "hashPath": "system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512" + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices.RuntimeInformation/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "path": "system.runtime.interopservices.runtimeinformation/4.3.0", + "hashPath": "system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512" + }, + "System.Runtime.Numerics/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "path": "system.runtime.numerics/4.3.0", + "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "path": "system.security.cryptography.algorithms/4.3.0", + "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Cng/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "path": "system.security.cryptography.cng/4.3.0", + "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Csp/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "path": "system.security.cryptography.csp/4.3.0", + "hashPath": "system.security.cryptography.csp.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "path": "system.security.cryptography.encoding/4.3.0", + "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "path": "system.security.cryptography.openssl/4.3.0", + "hashPath": "system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "path": "system.security.cryptography.primitives/4.3.0", + "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.ProtectedData/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog==", + "path": "system.security.cryptography.protecteddata/4.4.0", + "hashPath": "system.security.cryptography.protecteddata.4.4.0.nupkg.sha512" + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "path": "system.security.cryptography.x509certificates/4.3.0", + "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding.CodePages/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "path": "system.text.encoding.codepages/4.5.1", + "hashPath": "system.text.encoding.codepages.4.5.1.nupkg.sha512" + }, + "System.Text.Encoding.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "path": "system.text.encoding.extensions/4.3.0", + "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" + }, + "System.Text.RegularExpressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "path": "system.text.regularexpressions/4.3.0", + "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" + }, + "System.Threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "path": "system.threading.tasks.extensions/4.5.4", + "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" + }, + "System.Threading.Timer/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "path": "system.threading.timer/4.3.0", + "hashPath": "system.threading.timer.4.3.0.nupkg.sha512" + }, + "System.Xml.ReaderWriter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "path": "system.xml.readerwriter/4.3.0", + "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" + }, + "System.Xml.XDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "path": "system.xml.xdocument/4.3.0", + "hashPath": "system.xml.xdocument.4.3.0.nupkg.sha512" + }, + "System.Xml.XmlDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "path": "system.xml.xmldocument/4.3.0", + "hashPath": "system.xml.xmldocument.4.3.0.nupkg.sha512" + }, + "xunit.abstractions/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==", + "path": "xunit.abstractions/2.0.3", + "hashPath": "xunit.abstractions.2.0.3.nupkg.sha512" + }, + "xunit.analyzers/1.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==", + "path": "xunit.analyzers/1.0.0", + "hashPath": "xunit.analyzers.1.0.0.nupkg.sha512" + }, + "xunit.assert/2.4.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "path": "xunit.assert/2.4.2", + "hashPath": "xunit.assert.2.4.2.nupkg.sha512" + }, + "Xunit.Combinatorial/1.5.25": { + "type": "package", + "serviceable": true, + "sha512": "sha512-wB5Knl4YznMl/vtfk3fv5OiTO5lKG2xjsk4kKjsvYPxNxYA4gR8rL0SKSJqhGOxUQGqAmkRragIK+sgMO5I61g==", + "path": "xunit.combinatorial/1.5.25", + "hashPath": "xunit.combinatorial.1.5.25.nupkg.sha512" + }, + "xunit.core/2.4.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "path": "xunit.core/2.4.2", + "hashPath": "xunit.core.2.4.2.nupkg.sha512" + }, + "xunit.extensibility.core/2.4.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "path": "xunit.extensibility.core/2.4.2", + "hashPath": "xunit.extensibility.core.2.4.2.nupkg.sha512" + }, + "xunit.extensibility.execution/2.4.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "path": "xunit.extensibility.execution/2.4.2", + "hashPath": "xunit.extensibility.execution.2.4.2.nupkg.sha512" + }, + "xunit.runner.visualstudio/2.4.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kZZSmOmKA8OBlAJaquPXnJJLM9RwQ27H7BMVqfMLUcTi9xHinWGJiWksa3D4NEtz0wZ/nxd2mogObvBgJKCRhQ==", + "path": "xunit.runner.visualstudio/2.4.3", + "hashPath": "xunit.runner.visualstudio.2.4.3.nupkg.sha512" + }, + "Microsoft.Extensions.Telemetry.Abstractions/8.0.0-dev": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.Gen.MeteringReports/8.0.0-dev": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.TestUtilities/8.0.0-dev": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.Gen.MeteringReports.Reference/8.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Microsoft.TestUtilities.Reference/8.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.runtimeconfig.json b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.runtimeconfig.json new file mode 100644 index 00000000000..716c590e70f --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/Microsoft.Gen.MeteringReports.Roslyn3.8.Unit.Tests.runtimeconfig.json @@ -0,0 +1,12 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "8.0.0-preview.5.23260.3" + }, + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/xunit.runner.json b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/xunit.runner.json new file mode 100644 index 00000000000..6e96fab28c8 --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/GoldenReports/xunit.runner.json @@ -0,0 +1,4 @@ +{ + "diagnosticMessages": true, + "longRunningTestSeconds": 300 +} diff --git a/test/Generators/Microsoft.Gen.MeteringReports/TestClasses/MeterAttributedWithXmlDescriptions.cs b/test/Generators/Microsoft.Gen.MeteringReports/TestClasses/MeterAttributedWithXmlDescriptions.cs new file mode 100644 index 00000000000..59e54b22359 --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/TestClasses/MeterAttributedWithXmlDescriptions.cs @@ -0,0 +1,55 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Metrics; +using Microsoft.Extensions.Telemetry.Metering; + +namespace TestClasses +{ + [SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "For testing emitter for classes with description for metrics.")] + [SuppressMessage("Readability", "R9A046:Source generated metrics (fast metrics) should be located in 'Metric' class", Justification = "Metering generator tests")] + internal static partial class MeterAttributedWithXmlDescriptions + { + /// + /// InClassDim description. + /// + private const string InClassDimensionName = "InClassDim"; + + /// + /// CounterWithDescription description. + /// + /// + /// + [Counter] + public static partial CounterWithDescription CreateDescribedCounter(Meter meter); + + /// + /// HistogramWithDescription description. + /// + /// + /// + [Histogram] + public static partial HistogramWithDescription CreateDescribedHistogram(Meter meter); + + /// no xml tags + [Histogram] + public static partial HistogramWithWrongDescription CreateWrongDescribedHistogram(Meter meter); + + /// + /// CreateConstDescribedCounter description. + /// + /// + /// + [Counter(MetricConstants.DimWithXmlComment, InClassDimensionName)] + public static partial ConstDescribedCounter CreateConstDescribedCounter(Meter meter); + } + + internal static class MetricConstants + { + /// + /// Dim4 description. + /// + public const string DimWithXmlComment = "Dim4"; + } +} diff --git a/test/Generators/Microsoft.Gen.MeteringReports/TestClasses/MeterDimensionsAttributedWithXmlDescriptions.cs b/test/Generators/Microsoft.Gen.MeteringReports/TestClasses/MeterDimensionsAttributedWithXmlDescriptions.cs new file mode 100644 index 00000000000..f9029ee3b62 --- /dev/null +++ b/test/Generators/Microsoft.Gen.MeteringReports/TestClasses/MeterDimensionsAttributedWithXmlDescriptions.cs @@ -0,0 +1,119 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Metrics; +using Microsoft.Extensions.Telemetry.Metering; + +namespace TestClasses +{ + [SuppressMessage("Usage", "CA1801:Review unused parameters", + Justification = "For testing emitter for classes with description for metrics.")] + [SuppressMessage("Readability", "R9A046:Source generated metrics (fast metrics) should be located in 'Metric' class", + Justification = "Metering generator tests")] + internal static partial class MeterDimensionsAttributedWithXmlDescriptions + { + public const string Dim1 = "Dim1"; + + [Counter(DescripedDimensions.Dimension1, Dim1)] + public static partial DescribedDimensionCounter CreatePublicCounter(Meter meter); + + /// + /// DimenisonDefinedInMetricClass description. + /// + public const string DimenisonDefinedInMetricClass = "DimenisonDefinedInMetricClass"; + + [Histogram(DescripedDimensions.Dimension2, DimenisonDefinedInMetricClass)] + public static partial DescribedDimensionHistogram CreatePublicHistogram(Meter meter); + + [Counter(typeof(DimensionForStrongTypes), Name = "MyStrongTypeMetricWithDescription")] + public static partial StrongTypeCounterWithDescripedDimension CreateStrongTypeCounterWithDescibedDimensions(Meter meter); + } + +#pragma warning disable SA1402 // File may only contain a single type + + /// + /// DescripedDimensions class description. + /// + internal static class DescripedDimensions + { + /// + /// Dimension1 description. + /// + public const string Dimension1 = "Dimension1"; + + /// + /// Dimension2 description. + /// + public const string Dimension2 = "Dimension2"; + + /// + /// Dimension3 description. + /// + public const string Dimension3 = "Dimension3"; + } + + public class DimensionForStrongTypes + { + /// + /// Gets or sets anotherDimension. + /// + public string? AnotherDimension { get; set; } + + /// + /// Gets or sets MetricEnum. + /// + public MetricOperations MetricEnum { get; set; } + + /// + /// Gets or sets MetricEnum2. + /// + [Dimension("Enum2")] + public MetricOperations MetricEnum2 { get; set; } + + /// + /// Gets or sets ChildDimensionsClass. + /// + public ChildClassDimensionForStrongTypes? ChildDimensionsClass { get; set; } + + /// + /// Gets or sets ChildDimensionsStruct. + /// + public DimensionForStrongTypesDimensionsStruct ChildDimensionsStruct { get; set; } + } + + public enum MetricOperations + { + Unknown = 0, + Operation1 = 1, + } + + public class ChildClassDimensionForStrongTypes + { + /// + /// Gets or sets Dim2. + /// + public string? Dim2 { get; set; } + + /// + /// Gets or sets SomeDim. + /// + [Dimension("dim2FromAttribute")] + public string? SomeDim; + } + + public struct DimensionForStrongTypesDimensionsStruct + { + /// + /// Gets or sets Dim4Struct. + /// + public string Dim4Struct { get; set; } + + /// + /// Gets or sets Dim5Struct. + /// + [Dimension("Dim5FromAttribute")] + public string Dim5Struct { get; set; } + } +#pragma warning restore SA1402 // File may only contain a single type +} diff --git a/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/EmitterTests.cs b/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/EmitterTests.cs index 1b75cdeeedf..9cd5038deee 100644 --- a/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/EmitterTests.cs +++ b/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/EmitterTests.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Threading; using Microsoft.Gen.Metering.Model; +using Microsoft.Gen.MeteringReports; using Xunit; namespace Microsoft.Gen.MeteringReports.Test; @@ -80,26 +81,32 @@ public class EmitterTests [Fact] public void EmitterShouldThrowExceptionUponCancellation() { - Assert.Throws(() => MetricDefinitionEmitter.GenerateReport(_metricClasses, new CancellationToken(true))); + Assert.Throws(() => + { + var emitter = new MetricDefinitionEmitter(); + emitter.GenerateReport(_metricClasses, new CancellationToken(true)); + }); } [Fact] public void EmitterShouldOutputEmptyForNullInput() { - Assert.Equal(string.Empty, MetricDefinitionEmitter.GenerateReport(null!, CancellationToken.None)); + var emitter = new MetricDefinitionEmitter(); + Assert.Equal(string.Empty, emitter.GenerateReport(null!, CancellationToken.None)); } [Fact] public void EmitterShouldOutputEmptyForEmptyInputForMetricClass() { - Assert.Equal(string.Empty, MetricDefinitionEmitter.GenerateReport(Array.Empty(), CancellationToken.None)); + var emitter = new MetricDefinitionEmitter(); + Assert.Equal(string.Empty, emitter.GenerateReport(Array.Empty(), CancellationToken.None)); } [Fact] public void GetMetricClassDefinition_GivenMetricTypeIsUnknown_ThrowsNotSupportedException() { const int UnknownMetricType = 10; - + var emitter = new MetricDefinitionEmitter(); var metricClass = new ReportedMetricClass { Name = "Test", @@ -115,62 +122,64 @@ public void GetMetricClassDefinition_GivenMetricTypeIsUnknown_ThrowsNotSupported } }; - Assert.Throws(() => MetricDefinitionEmitter.GenerateReport(new[] { metricClass }, CancellationToken.None)); + Assert.Throws(() => emitter.GenerateReport(new[] { metricClass }, CancellationToken.None)); } [Fact] public void EmitterShouldOutputInJSONFormat() { - const string Expected = + string newLine = Environment.NewLine; + string expected = "[" + - "\n {" + - "\n \"MetricContainingAssembly1\":" + - "\n [" + - "\n {" + - "\n \"MetricName\": \"Requests\"," + - "\n \"MetricDescription\": \"Requests summary.\"," + - "\n \"InstrumentName\": \"Counter\"," + - "\n \"Dimensions\": {" + - "\n \"StatusCode\": \"Status code for request.\"," + - "\n \"ErrorCode\": \"Error code for request.\"" + - "\n }" + - "\n }," + - "\n {" + - "\n \"MetricName\": \"Latency\"," + - "\n \"MetricDescription\": \"Latency summary.\"," + - "\n \"InstrumentName\": \"Histogram\"," + - "\n \"Dimensions\": {" + - "\n \"Dim1\": \"\"" + - "\n }" + - "\n }," + - "\n {" + - "\n \"MetricName\": \"MemoryUsage\"," + - "\n \"InstrumentName\": \"Gauge\"" + - "\n }" + - "\n ]" + - "\n }," + - "\n {" + - "\n \"MetricContainingAssembly2\":" + - "\n [" + - "\n {" + - "\n \"MetricName\": \"Counter\"," + - "\n \"MetricDescription\": \"Counter summary.\"," + - "\n \"InstrumentName\": \"Counter\"" + - "\n }," + - "\n {" + - "\n \"MetricName\": \"R9\\\\Test\\\\MemoryUsage\"," + - "\n \"MetricDescription\": \"MemoryUsage summary.\"," + - "\n \"InstrumentName\": \"Gauge\"," + - "\n \"Dimensions\": {" + - "\n \"Path\": \"R9\\\\Test\\\\Description\\\\Path\"" + - "\n }" + - "\n }" + - "\n ]" + - "\n }" + - "\n]"; + newLine + " {" + + newLine + " \"MetricContainingAssembly1\":" + + newLine + " [" + + newLine + " {" + + newLine + " \"MetricName\": \"Requests\"," + + newLine + " \"MetricDescription\": \"Requests summary.\"," + + newLine + " \"InstrumentName\": \"Counter\"," + + newLine + " \"Dimensions\": {" + + newLine + " \"StatusCode\": \"Status code for request.\"," + + newLine + " \"ErrorCode\": \"Error code for request.\"" + + newLine + " }" + + newLine + " }," + + newLine + " {" + + newLine + " \"MetricName\": \"Latency\"," + + newLine + " \"MetricDescription\": \"Latency summary.\"," + + newLine + " \"InstrumentName\": \"Histogram\"," + + newLine + " \"Dimensions\": {" + + newLine + " \"Dim1\": \"\"" + + newLine + " }" + + newLine + " }," + + newLine + " {" + + newLine + " \"MetricName\": \"MemoryUsage\"," + + newLine + " \"InstrumentName\": \"Gauge\"" + + newLine + " }" + + newLine + " ]" + + newLine + " }," + + newLine + " {" + + newLine + " \"MetricContainingAssembly2\":" + + newLine + " [" + + newLine + " {" + + newLine + " \"MetricName\": \"Counter\"," + + newLine + " \"MetricDescription\": \"Counter summary.\"," + + newLine + " \"InstrumentName\": \"Counter\"" + + newLine + " }," + + newLine + " {" + + newLine + " \"MetricName\": \"R9\\\\Test\\\\MemoryUsage\"," + + newLine + " \"MetricDescription\": \"MemoryUsage summary.\"," + + newLine + " \"InstrumentName\": \"Gauge\"," + + newLine + " \"Dimensions\": {" + + newLine + " \"Path\": \"R9\\\\Test\\\\Description\\\\Path\"" + + newLine + " }" + + newLine + " }" + + newLine + " ]" + + newLine + " }" + + newLine + "]"; - string json = MetricDefinitionEmitter.GenerateReport(_metricClasses, CancellationToken.None); + var emitter = new MetricDefinitionEmitter(); + string json = emitter.GenerateReport(_metricClasses, CancellationToken.None); - Assert.Equal(Expected, json); + Assert.Equal(expected, json); } } diff --git a/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/GeneratorTests.cs b/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/GeneratorTests.cs index b2320877515..50ba70d35f2 100644 --- a/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/GeneratorTests.cs +++ b/test/Generators/Microsoft.Gen.MeteringReports/Unit/Common/GeneratorTests.cs @@ -1,22 +1,138 @@ -// 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. +using System; +using System.Collections.Generic; +using System.Diagnostics.Metrics; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.Extensions.Telemetry.Metering; +using Microsoft.Gen.Shared; using Xunit; +using Xunit.Abstractions; namespace Microsoft.Gen.MeteringReports.Test; -/// -/// Test for . -/// public class GeneratorTests { + private readonly ITestOutputHelper _output; + + public GeneratorTests(ITestOutputHelper output) + { + _output = output; + } + [Fact] public void GeneratorShouldNotDoAnythingIfGeneralExecutionContextDoesNotHaveClassDeclarationSyntaxReceiver() { var defaultGeneralExecutionContext = default(GeneratorExecutionContext); - new MetricDefinitionGenerator().Execute(defaultGeneralExecutionContext); + new MeteringReportsGenerator().Execute(defaultGeneralExecutionContext); Assert.Null(defaultGeneralExecutionContext.SyntaxReceiver); } + + [Fact] + public async Task TestAll() + { + foreach (var inputFile in Directory.GetFiles("TestClasses")) + { + var stem = Path.GetFileNameWithoutExtension(inputFile); + var goldenReportFile = $"GoldenReports/{stem}.json"; + + var tmp = Path.Combine(Directory.GetCurrentDirectory(), "MeteringReport.json"); + + if (File.Exists(goldenReportFile)) + { + var d = await RunGenerator(File.ReadAllText(inputFile)); + Assert.Empty(d); + + var golden = File.ReadAllText(goldenReportFile); + var generated = File.ReadAllText(tmp); + + if (golden != generated) + { + _output.WriteLine($"MISMATCH: goldenReportFile {goldenReportFile}, tmp {tmp}"); + _output.WriteLine("----"); + _output.WriteLine("golden:"); + _output.WriteLine(golden); + _output.WriteLine("----"); + _output.WriteLine("generated:"); + _output.WriteLine(generated); + _output.WriteLine("----"); + } + + Assert.Equal(golden, generated); + File.Delete(tmp); + } + else + { + // generate the golden file if it doesn't already exist + _output.WriteLine($"Generating golden report: {goldenReportFile}"); + _ = await RunGenerator(File.ReadAllText(inputFile)); + File.Copy(tmp, goldenReportFile); + } + } + } + + private static async Task> RunGenerator( + string code, + bool includeBaseReferences = true, + bool includeMeterReferences = true, + CancellationToken cancellationToken = default) + { + Assembly[]? refs = null; + if (includeMeterReferences) + { + refs = new[] + { + Assembly.GetAssembly(typeof(Meter))!, + Assembly.GetAssembly(typeof(CounterAttribute))!, + Assembly.GetAssembly(typeof(HistogramAttribute))!, + Assembly.GetAssembly(typeof(GaugeAttribute))!, + }; + } + + var (d, _) = await RoslynTestUtils.RunGenerator( + new MeteringReportsGenerator(), + refs, + new[] { code }, + new OptionsProvider(), + includeBaseReferences: includeBaseReferences, + cancellationToken: cancellationToken).ConfigureAwait(false); + + return d; + } + + private sealed class Options : AnalyzerConfigOptions + { + public override bool TryGetValue(string key, out string value) + { + if (key == "build_property.GenerateMeteringReport") + { + value = bool.TrueString; + return true; + } + + if (key == "build_property.MeteringReportOutputPath") + { + value = Directory.GetCurrentDirectory(); + return true; + } + + value = null!; + return false; + } + } + + private sealed class OptionsProvider : AnalyzerConfigOptionsProvider + { + public override AnalyzerConfigOptions GlobalOptions => new Options(); + + public override AnalyzerConfigOptions GetOptions(SyntaxTree tree) => throw new NotSupportedException(); + public override AnalyzerConfigOptions GetOptions(AdditionalText textFile) => throw new NotSupportedException(); + } } diff --git a/test/Generators/Microsoft.Gen.MeteringReports/Unit/Directory.Build.props b/test/Generators/Microsoft.Gen.MeteringReports/Unit/Directory.Build.props index 1309376fe5d..3f9c4163761 100644 --- a/test/Generators/Microsoft.Gen.MeteringReports/Unit/Directory.Build.props +++ b/test/Generators/Microsoft.Gen.MeteringReports/Unit/Directory.Build.props @@ -14,10 +14,21 @@ + + + TestClasses\%(RecursiveDir)%(Filename)%(Extension) + PreserveNewest + + + + GoldenReports\%(RecursiveDir)%(Filename)%(Extension) + PreserveNewest + +