| File: MetricsGenerator.cs | Web Access |
| Project: src\src\Generators\Microsoft.Gen.Metrics\Microsoft.Gen.Metrics.csproj (Microsoft.Gen.Metrics) |
// 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 System.Linq; using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; using Microsoft.Gen.Shared; namespace Microsoft.Gen.Metrics; [Generator] public class MetricsGenerator : IIncrementalGenerator { private static readonly HashSet<string> _attributeNames = [ SymbolLoader.CounterAttribute, SymbolLoader.CounterTAttribute.Replace("`1", "<T>"), SymbolLoader.HistogramAttribute, SymbolLoader.HistogramTAttribute.Replace("`1", "<T>"), SymbolLoader.GaugeAttribute, SymbolLoader.GaugeTAttribute.Replace("`1", "<T>"), ]; public void Initialize(IncrementalGeneratorInitializationContext context) { GeneratorUtilities.Initialize(context, _attributeNames, m => m.Parent as TypeDeclarationSyntax, HandleAnnotatedTypes); } private static void HandleAnnotatedTypes(Compilation compilation, IEnumerable<SyntaxNode> nodes, SourceProductionContext context) { var p = new Parser(compilation, context.ReportDiagnostic, context.CancellationToken); var metricClasses = p.GetMetricClasses(nodes.OfType<TypeDeclarationSyntax>()); if (metricClasses.Count > 0) { var factoryEmitter = new MetricFactoryEmitter(); var factory = factoryEmitter.Emit(metricClasses, context.CancellationToken); context.AddSource("Factory.g.cs", SourceText.From(factory, Encoding.UTF8)); var emitter = new Emitter(); var metrics = emitter.EmitMetrics(metricClasses, context.CancellationToken); context.AddSource("Metrics.g.cs", SourceText.From(metrics, Encoding.UTF8)); } } }