📄 methodresolver.vb
字号:
If candidate Is Nothing Then Continue For
If candidate.IsNarrowingExceptObject Then
Log("NARROWING (EXCEPT OBJECT) : Method call to '{0}{1}' with arguments '{2}'", Helper.ToString(candidate.DefinedParametersTypes), ArgumentsTypesAsString)
m_Candidates(i) = Nothing
Else
Log("NOT NARROWING (EXCEPT OBJECT): Method call to '{0}{1}' with arguments '{2}'", Helper.ToString(candidate.DefinedParametersTypes), ArgumentsTypesAsString)
End If
Next
End Sub
Sub RemoveNarrowing()
For i As Integer = 0 To m_Candidates.Count - 1
Dim candidate As MemberCandidate = m_Candidates(i)
If candidate Is Nothing Then Continue For
If candidate.IsNarrowing Then
Log("NARROWING : Method call to '{0}{1}' with arguments '{2}'", Helper.ToString(candidate.DefinedParametersTypes), ArgumentsTypesAsString)
m_Candidates(i) = Nothing
Else
Log("NOT NARROWING: Method call to '{0}{1}' with arguments '{2}'", Helper.ToString(candidate.DefinedParametersTypes), ArgumentsTypesAsString)
End If
Next
End Sub
Sub SelectMostApplicable()
'Find most applicable methods.
Dim expandedArgumentTypes(m_Candidates.Count - 1)() As Type
For i As Integer = 0 To m_Candidates.Count - 1
If m_Candidates(i) Is Nothing Then Continue For
For j As Integer = i + 1 To m_Candidates.Count - 1
If m_Candidates(j) Is Nothing Then Continue For
Dim candidateI As MemberCandidate = m_Candidates(i)
Dim candidateJ As MemberCandidate = m_Candidates(j)
Helper.Assert(candidateI.ExactArguments IsNot Nothing)
Helper.Assert(candidateJ.ExactArguments IsNot Nothing)
Dim a, b As Boolean
If expandedArgumentTypes(i) Is Nothing Then
expandedArgumentTypes(i) = candidateI.TypesInInvokedOrder() ' Helper.GetExpandedTypes(Compiler, candidateI.InputParameters, Arguments.Count)
End If
If expandedArgumentTypes(j) Is Nothing Then
expandedArgumentTypes(j) = candidateJ.TypesInInvokedOrder() 'Helper.GetExpandedTypes(Compiler, candidateJ.InputParameters, Arguments.Count)
End If
a = Helper.IsFirstMoreApplicable(Compiler, Arguments.Arguments, expandedArgumentTypes(i), expandedArgumentTypes(j))
b = Helper.IsFirstMoreApplicable(Compiler, Arguments.Arguments, expandedArgumentTypes(j), expandedArgumentTypes(i))
If a = b Then ' AndAlso b = False Then
'It is possible for M and N to have the same signature if one or both contains an expanded
'paramarray parameter. In that case, the member with the fewest number of arguments matching
'expanded paramarray parameters is considered more applicable.
Dim iParamArgs, jParamArgs As Integer
If candidateI.IsParamArrayCandidate Then
iParamArgs = candidateI.ParamArrayExpression.ArrayElementInitalizer.Initializers.Count + 1
End If
If candidateJ.IsParamArrayCandidate Then
jParamArgs = candidateJ.ParamArrayExpression.ArrayElementInitalizer.Initializers.Count + 1
End If
If jParamArgs > iParamArgs Then
a = True : b = False
ElseIf iParamArgs > jParamArgs Then
b = True : a = False
End If
Helper.Assert(iParamArgs <> jParamArgs OrElse (iParamArgs = 0 AndAlso jParamArgs = 0), MethodName)
End If
If a Xor b Then
If a = False Then
Log("NOT MOST APPLICABLE: Method call to '{0}{1}' with arguments '{2}'", Helper.ToString(candidateI.DefinedParametersTypes), ArgumentsTypesAsString)
m_Candidates(i) = Nothing
Exit For
Else
Log("NOT MOST APPLICABLE: Method call to '{0}{1}' with arguments '{2}'", Helper.ToString(candidateJ.DefinedParametersTypes), ArgumentsTypesAsString)
m_Candidates(j) = Nothing
End If
Else
Log("EQUALLY APPLICABLE: Method call to '{0}{1}' with arguments '{2}' and with arguments '{3}'", ArgumentsTypesAsString, Helper.ToString(candidateI.DefinedParametersTypes), Helper.ToString(candidateJ.DefinedParametersTypes))
End If
Next
Next
End Sub
ReadOnly Property Resolved() As Boolean
Get
Return m_ResolvedCandidate IsNot Nothing
End Get
End Property
ReadOnly Property ResolvedCandidate() As MemberCandidate
Get
Return m_ResolvedCandidate
End Get
End Property
ReadOnly Property ResolvedMember() As MemberInfo
Get
If m_ResolvedCandidate Is Nothing Then Return Nothing
Return m_ResolvedCandidate.Member
End Get
End Property
ReadOnly Property ResolvedMethod() As MethodInfo
Get
Return TryCast(ResolvedMember, MethodInfo)
End Get
End Property
ReadOnly Property ResolvedConstructor() As ConstructorInfo
Get
Return TryCast(ResolvedMember, ConstructorInfo)
End Get
End Property
ReadOnly Property ResolvedProperty() As PropertyInfo
Get
Return TryCast(ResolvedMember, PropertyInfo)
End Get
End Property
<Diagnostics.Conditional("DEBUG")> _
Sub Log(ByVal Format As String, Optional ByVal P1 As Object = Nothing, Optional ByVal P2 As Object = Nothing, Optional ByVal P3 As Object = Nothing)
If LOGMETHODRESOLUTION Then
Dim msg As String
msg = String.Format(Format, MethodName, P1, P2, P3)
Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, msg)
End If
End Sub
End Class
Public Class MemberCandidate
Private m_Member As MemberInfo
Private m_DefinedParameters As ParameterInfo()
Private m_DefinedParametersTypes As Type()
Private m_Parent As MethodResolver
Private m_ExactArguments As Generic.List(Of Argument)
Private m_TypesInInvokedOrder As Type()
Private m_IsParamArray As Boolean
Public Overrides Function ToString() As String
Return Helper.ToString(m_Parent.Compiler, m_Member)
End Function
Sub New(ByVal Parent As MethodResolver, ByVal Member As MemberInfo)
m_Parent = Parent
m_Member = Member
End Sub
ReadOnly Property TypesInInvokedOrder() As Type()
Get
Return m_TypesInInvokedOrder
End Get
End Property
ReadOnly Property ExactArguments() As Generic.List(Of Argument)
Get
Return m_ExactArguments
End Get
End Property
ReadOnly Property DefinedParameters() As ParameterInfo()
Get
If m_DefinedParameters Is Nothing Then m_DefinedParameters = Helper.GetParameters(Compiler, Member)
Return m_DefinedParameters
End Get
End Property
ReadOnly Property DefinedParametersTypes() As Type()
Get
If m_DefinedParametersTypes Is Nothing Then m_DefinedParametersTypes = Helper.GetTypes(DefinedParameters)
Return m_DefinedParametersTypes
End Get
End Property
ReadOnly Property Compiler() As Compiler
Get
Return m_Parent.Compiler
End Get
End Property
ReadOnly Property Member() As MemberInfo
Get
Return m_Member
End Get
End Property
ReadOnly Property Resolver() As MethodResolver
Get
Return m_Parent
End Get
End Property
ReadOnly Property Parent() As ParsedObject
Get
Return m_Parent.Parent
End Get
End Property
ReadOnly Property IsParamArrayCandidate() As Boolean
Get
Return m_IsParamArray
End Get
End Property
ReadOnly Property ParamArrayExpression() As ArrayCreationExpression
Get
If m_IsParamArray = False Then Return Nothing
Return DirectCast(m_ExactArguments(m_ExactArguments.Count - 1).Expression, ArrayCreationExpression)
End Get
End Property
ReadOnly Property IsAccessible() As Boolean
Get
Return Helper.IsAccessible(Compiler, Resolver.Caller, m_Member)
End Get
End Property
ReadOnly Property IsApplicable() As Boolean
Get
Return DefineApplicability()
End Get
End Property
ReadOnly Property IsNarrowingExceptObject() As Boolean
Get
Return IsNarrowingInternal(True)
End Get
End Property
ReadOnly Property IsNarrowing() As Boolean
Get
Return IsNarrowingInternal(False)
End Get
End Property
Private Function IsNarrowingInternal(ByVal ExceptObject As Boolean) As Boolean
For j As Integer = 0 To InputParameters.Length - 1
Dim arg As Argument
Dim param As ParameterInfo
param = InputParameters(j)
arg = ExactArguments(j)
If ExceptObject AndAlso Helper.CompareType(arg.Expression.ExpressionType, Compiler.TypeCache.System_Object) Then Continue For
Dim IsConvertible As Boolean
'IsConvertible = Helper.IsConvertible(Compiler, arg, param)
IsConvertible = Compiler.TypeResolution.IsImplicitlyConvertible(Compiler, arg.Expression.ExpressionType, param.ParameterType)
If IsConvertible = False Then
Return True
End If
Next
Return False
End Function
ReadOnly Property Arguments() As ArgumentList
Get
Return Resolver.Arguments
End Get
End Property
ReadOnly Property TypeArguments() As TypeArgumentList
Get
Return Resolver.TypeArguments
End Get
End Property
ReadOnly Property InputParameters() As ParameterInfo()
Get
Return DefinedParameters
End Get
End Property
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -