| File: BoundTree\BoundBinaryOperator.UncommonData.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. using System.Collections.Immutable; using System.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp { internal partial class BoundBinaryOperator { private partial void Validate() { if (Data is { Method: { } method }) { if (OperatorKind.IsDynamic()) { Debug.Assert(OperatorKind.IsLogical()); Debug.Assert(method.Name is WellKnownMemberNames.TrueOperatorName or WellKnownMemberNames.FalseOperatorName); Debug.Assert(method.ParameterCount == 1); } else { Debug.Assert(method is ErrorMethodSymbol or { ParameterCount: 2 }); } } } internal class UncommonData { public static UncommonData UnconvertedInterpolatedStringAddition(ConstantValue? constantValue) => new UncommonData( constantValue, method: null, constrainedToType: null, originalUserDefinedOperatorsOpt: default, isUnconvertedInterpolatedStringAddition: true, interpolatedStringHandlerData: null); public static UncommonData InterpolatedStringHandlerAddition(InterpolatedStringHandlerData data) => new UncommonData( constantValue: null, method: null, constrainedToType: null, originalUserDefinedOperatorsOpt: default, isUnconvertedInterpolatedStringAddition: false, data); public static UncommonData? CreateIfNeeded(ConstantValue? constantValue, MethodSymbol? method, TypeSymbol? constrainedToType, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt) { if (constantValue != null || method is not null || constrainedToType is not null || !originalUserDefinedOperatorsOpt.IsDefault) { return new UncommonData(constantValue, method, constrainedToType, originalUserDefinedOperatorsOpt, isUnconvertedInterpolatedStringAddition: false, interpolatedStringHandlerData: null); } return null; } public readonly ConstantValue? ConstantValue; public readonly MethodSymbol? Method; public readonly TypeSymbol? ConstrainedToType; public readonly bool IsUnconvertedInterpolatedStringAddition; public readonly InterpolatedStringHandlerData? InterpolatedStringHandlerData; // The set of method symbols from which this operator's method was chosen. // Only kept in the tree if the operator was an error and overload resolution // was unable to choose a best method. public readonly ImmutableArray<MethodSymbol> OriginalUserDefinedOperatorsOpt; private UncommonData(ConstantValue? constantValue, MethodSymbol? method, TypeSymbol? constrainedToType, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, bool isUnconvertedInterpolatedStringAddition, InterpolatedStringHandlerData? interpolatedStringHandlerData) { Debug.Assert(interpolatedStringHandlerData is null || !isUnconvertedInterpolatedStringAddition); Debug.Assert(method is null or ErrorMethodSymbol { ParameterCount: 0 } or { MethodKind: MethodKind.UserDefinedOperator } or { ParameterCount: 2 }); ConstantValue = constantValue; Method = method; ConstrainedToType = constrainedToType; OriginalUserDefinedOperatorsOpt = originalUserDefinedOperatorsOpt; IsUnconvertedInterpolatedStringAddition = isUnconvertedInterpolatedStringAddition; InterpolatedStringHandlerData = interpolatedStringHandlerData; } public UncommonData WithUpdatedMethod(MethodSymbol? method) { if ((object?)method == Method) { return this; } return new UncommonData(ConstantValue, method, ConstrainedToType, OriginalUserDefinedOperatorsOpt, IsUnconvertedInterpolatedStringAddition, InterpolatedStringHandlerData); } } } }