| File: Binder\Semantics\Operators\BinaryOperatorAnalysisResult.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp { [SuppressMessage("Performance", "CA1067", Justification = "Equality not actually implemented")] [DebuggerDisplay("{GetDebuggerDisplay(), nq}")] internal readonly struct BinaryOperatorAnalysisResult : IMemberResolutionResultWithPriority<MethodSymbol> { public readonly Conversion LeftConversion; public readonly Conversion RightConversion; public readonly BinaryOperatorSignature Signature; public readonly OperatorAnalysisResultKind Kind; private BinaryOperatorAnalysisResult(OperatorAnalysisResultKind kind, BinaryOperatorSignature signature, Conversion leftConversion, Conversion rightConversion) { this.Kind = kind; this.Signature = signature; this.LeftConversion = leftConversion; this.RightConversion = rightConversion; } public bool IsValid { get { return this.Kind == OperatorAnalysisResultKind.Applicable; } } public bool HasValue { get { return this.Kind != OperatorAnalysisResultKind.Undefined; } } bool IMemberResolutionResultWithPriority<MethodSymbol>.IsApplicable => IsValid; MethodSymbol IMemberResolutionResultWithPriority<MethodSymbol>.MemberWithPriority => Signature.Method; public override bool Equals(object obj) { // implement if needed throw ExceptionUtilities.Unreachable(); } public override int GetHashCode() { // implement if needed throw ExceptionUtilities.Unreachable(); } public static BinaryOperatorAnalysisResult Applicable(BinaryOperatorSignature signature, Conversion leftConversion, Conversion rightConversion) { return new BinaryOperatorAnalysisResult(OperatorAnalysisResultKind.Applicable, signature, leftConversion, rightConversion); } public static BinaryOperatorAnalysisResult Inapplicable(BinaryOperatorSignature signature, Conversion leftConversion, Conversion rightConversion) { return new BinaryOperatorAnalysisResult(OperatorAnalysisResultKind.Inapplicable, signature, leftConversion, rightConversion); } public BinaryOperatorAnalysisResult Worse() { return new BinaryOperatorAnalysisResult(OperatorAnalysisResultKind.Worse, this.Signature, this.LeftConversion, this.RightConversion); } private string GetDebuggerDisplay() { return $"{Signature.Kind} {Kind} {Signature.Method?.ToDisplayString()}"; } } }