/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Portable/BoundTree/BoundCall.vb
149 строк
6 KB
AlekseyTs
Follow up on addition of `InternalSpecialType` (#72704)
26 мар 2024, 01:29
Не верифицирован
26 мар 2024, 01:29
48812dd
Код
Авторство
О чём код?
' 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. Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Namespace Microsoft.CodeAnalysis.VisualBasic Partial Friend Class BoundCall Public Sub New( syntax As SyntaxNode, method As MethodSymbol, methodGroupOpt As BoundMethodGroup, receiverOpt As BoundExpression, arguments As ImmutableArray(Of BoundExpression), constantValueOpt As ConstantValue, type As TypeSymbol, Optional suppressObjectClone As Boolean = False, Optional hasErrors As Boolean = False, Optional defaultArguments As BitVector = Nothing ) Me.New(syntax, method, methodGroupOpt, receiverOpt, arguments, defaultArguments, constantValueOpt, isLValue:=method.ReturnsByRef, suppressObjectClone:=suppressObjectClone, type:=type, hasErrors:=hasErrors) End Sub Public Sub New(syntax As SyntaxNode, method As MethodSymbol, methodGroupOpt As BoundMethodGroup, receiverOpt As BoundExpression, arguments As ImmutableArray(Of BoundExpression), constantValueOpt As ConstantValue, isLValue As Boolean, suppressObjectClone As Boolean, type As TypeSymbol, Optional hasErrors As Boolean = False) Me.New(syntax, method, methodGroupOpt, receiverOpt, arguments, defaultArguments:=BitVector.Null, constantValueOpt, isLValue, suppressObjectClone, type, hasErrors) End Sub Protected Overrides Function MakeRValueImpl() As BoundExpression Return MakeRValue() End Function Public Shadows Function MakeRValue() As BoundCall If _IsLValue Then Return Update( Method, MethodGroupOpt, ReceiverOpt, Arguments, DefaultArguments, ConstantValueOpt, isLValue:=False, suppressObjectClone:=SuppressObjectClone, type:=Type) End If Return Me End Function Public Overrides ReadOnly Property ExpressionSymbol As Symbol Get Return Me.Method End Get End Property #If DEBUG Then Private Sub Validate() ' if method group is specified it should not have receiver if it was moved to a bound call Debug.Assert(Me.ReceiverOpt Is Nothing OrElse Me.MethodGroupOpt Is Nothing OrElse Me.MethodGroupOpt.ReceiverOpt Is Nothing) ValidateConstantValue() Debug.Assert(Arguments.Length = Method.ParameterCount) Dim isOperator As Boolean = (Method.MethodKind = MethodKind.UserDefinedOperator) Dim isLifted? As Boolean = Nothing For i As Integer = 0 To Arguments.Length - 1 Dim argument As BoundExpression = Arguments(i) Dim parameter As ParameterSymbol = Method.Parameters(i) AssertArgument(isOperator, argument.IsLateBound, isLifted, argument.Type, parameter.Type) If Not (parameter.IsByRef AndAlso argument.IsLValue) Then argument.AssertRValue() End If Next ' Null DefaultArguments doesn't indicate that Arguments is non-null, but if DefaultArguments is non-null we must have some arguments. Debug.Assert(DefaultArguments.IsNull OrElse Not Arguments.IsEmpty) If isLifted.GetValueOrDefault() AndAlso Not Method.ReturnType.IsNullableType() Then Debug.Assert(OverloadResolution.CanLiftType(Method.ReturnType) AndAlso Type.IsNullableType() AndAlso Type.GetNullableUnderlyingType().IsSameTypeIgnoringAll(Method.ReturnType)) Else Debug.Assert(Type.IsSameTypeIgnoringAll(Method.ReturnType)) End If End Sub Private Shared Sub AssertArgument( isOperator As Boolean, isLateBound As Boolean, ByRef isLifted? As Boolean, type As TypeSymbol, signatureType As TypeSymbol ) If isLateBound Then Debug.Assert(type.IsObjectType) ElseIf Not isOperator Then Debug.Assert(type.IsErrorType() OrElse type.IsSameTypeIgnoringAll(signatureType)) ElseIf Not isLifted.HasValue Then If type.IsSameTypeIgnoringAll(signatureType) Then isLifted = False ElseIf OverloadResolution.CanLiftType(signatureType) AndAlso type.IsNullableType() AndAlso type.GetNullableUnderlyingType().IsSameTypeIgnoringAll(signatureType) Then isLifted = True Else isLifted = False Debug.Assert(type.IsSameTypeIgnoringAll(signatureType)) End If ElseIf isLifted.GetValueOrDefault Then Debug.Assert(OverloadResolution.CanLiftType(signatureType) AndAlso type.IsNullableType() AndAlso type.GetNullableUnderlyingType().IsSameTypeIgnoringAll(signatureType)) Else Debug.Assert(type.IsSameTypeIgnoringAll(signatureType)) End If End Sub #End If Public Overrides ReadOnly Property ResultKind As LookupResultKind Get If MethodGroupOpt IsNot Nothing Then Return MethodGroupOpt.ResultKind End If Return MyBase.ResultKind End Get End Property End Class End Namespace