| File: SourceGenerators\IncrementalValueProviderExtensions.cs | Web Access |
| Project: src\roslyn\src\Razor\src\Compiler\Microsoft.CodeAnalysis.Razor.Compiler\src\Microsoft.CodeAnalysis.Razor.Compiler.csproj (Microsoft.CodeAnalysis.Razor.Compiler) |
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Microsoft.AspNetCore.Razor; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; namespace Microsoft.NET.Sdk.Razor.SourceGenerators { internal static class IncrementalValuesProviderExtensions { internal static IncrementalValueProvider<T> WithLambdaComparer<T>(this IncrementalValueProvider<T> source, Func<T?, T?, bool> equal) { var comparer = new LambdaComparer<T>(equal); return source.WithComparer(comparer); } internal static IncrementalValuesProvider<T> WithLambdaComparer<T>(this IncrementalValuesProvider<T> source, Func<T?, T?, bool> equal) { var comparer = new LambdaComparer<T>(equal); return source.WithComparer(comparer); } internal static IncrementalValuesProvider<TSource> ReportDiagnostics<TSource>(this IncrementalValuesProvider<(TSource?, Diagnostic?)> source, IncrementalGeneratorInitializationContext context) { context.RegisterSourceOutput(source, (spc, source) => { var (_, diagnostic) = source; if (diagnostic != null) { spc.ReportDiagnostic(diagnostic); } }); return source.Where((pair) => pair.Item1 != null).Select((pair, ct) => pair.Item1!); } internal static IncrementalValueProvider<TSource> ReportDiagnostics<TSource>(this IncrementalValueProvider<(TSource?, Diagnostic?)> source, IncrementalGeneratorInitializationContext context) { context.RegisterSourceOutput(source, (spc, source) => { var (_, diagnostic) = source; if (diagnostic != null) { spc.ReportDiagnostic(diagnostic); } }); return source.Select((pair, ct) => pair.Item1!); } internal static IncrementalValueProvider<TSource> ReportDiagnostics<TSource>(this IncrementalValueProvider<(TSource?, ImmutableArray<Diagnostic>)> source, IncrementalGeneratorInitializationContext context) { context.RegisterSourceOutput(source, static (spc, source) => { var (_, diagnostics) = source; foreach (var diagnostic in diagnostics) { spc.ReportDiagnostic(diagnostic); } }); return source.Select(static (pair, ct) => pair.Item1!); } } internal sealed class LambdaComparer<T> : IEqualityComparer<T> { private readonly Func<T?, T?, bool> _equal; public LambdaComparer(Func<T?, T?, bool> equal) { _equal = equal; } public bool Equals(T? x, T? y) => _equal(x, y); public int GetHashCode(T obj) => Assumed.Unreachable<int>(); } }