in src/Compilers/VisualBasic/Portable/Symbols/MethodSignatureComparer.vb [493:657]
) As SymbolComparisonResults
Dim results As SymbolComparisonResults = Nothing
Dim commonParamCount As Integer
Dim longerParameters As ImmutableArray(Of ParameterSymbol)
If params1.Length > params2.Length Then
commonParamCount = params2.Length
longerParameters = params1
ElseIf params1.Length < params2.Length Then
commonParamCount = params1.Length
longerParameters = params2
Else
commonParamCount = params1.Length
longerParameters = Nothing
End If
If Not longerParameters.IsDefault Then
results = results Or SymbolComparisonResults.TotalParameterCountMismatch
If (stopIfAny And SymbolComparisonResults.TotalParameterCountMismatch) <> 0 Then
GoTo Done
End If
For i As Integer = commonParamCount To longerParameters.Length - 1
If longerParameters(i).IsOptional Then
results = results Or SymbolComparisonResults.OptionalParameterMismatch
If (stopIfAny And SymbolComparisonResults.OptionalParameterMismatch) <> 0 Then
GoTo Done
End If
Else
results = results Or SymbolComparisonResults.RequiredExtraParameterMismatch
If (stopIfAny And SymbolComparisonResults.RequiredExtraParameterMismatch) <> 0 Then
GoTo Done
End If
End If
Next
End If
If commonParamCount <> 0 Then
Dim typeSubstitution1 As TypeSubstitution
Dim typeSubstitution2 As TypeSubstitution
Dim checkTypes As Boolean
If (comparisons And
(SymbolComparisonResults.OptionalParameterTypeMismatch Or
SymbolComparisonResults.RequiredParameterTypeMismatch Or
SymbolComparisonResults.CustomModifierMismatch Or
SymbolComparisonResults.TupleNamesMismatch)) <> 0 Then
checkTypes = True
typeSubstitution1 = lazyTypeSubstitution1.Value
typeSubstitution2 = lazyTypeSubstitution2.Value
Else
checkTypes = False
typeSubstitution1 = Nothing
typeSubstitution2 = Nothing
End If
For i As Integer = 0 To commonParamCount - 1
Dim param1 = params1(i)
Dim param2 = params2(i)
Dim bothOptional As Boolean = param1.IsOptional AndAlso param2.IsOptional
If param1.IsOptional <> param2.IsOptional Then
results = results Or SymbolComparisonResults.OptionalParameterMismatch
If (stopIfAny And SymbolComparisonResults.OptionalParameterMismatch) <> 0 Then
GoTo Done
End If
End If
If checkTypes Then
Dim type1 As TypeWithModifiers = GetTypeWithModifiers(typeSubstitution1, param1)
Dim type2 As TypeWithModifiers = GetTypeWithModifiers(typeSubstitution2, param2)
If Not type1.Type.IsSameType(type2.Type, TypeCompareKind.AllIgnoreOptionsForVB) Then
If bothOptional Then
results = results Or SymbolComparisonResults.OptionalParameterTypeMismatch
If (stopIfAny And SymbolComparisonResults.OptionalParameterTypeMismatch) <> 0 Then
GoTo Done
End If
Else
results = results Or SymbolComparisonResults.RequiredParameterTypeMismatch
If (stopIfAny And SymbolComparisonResults.RequiredParameterTypeMismatch) <> 0 Then
GoTo Done
End If
End If
Else
If (comparisons And SymbolComparisonResults.TupleNamesMismatch) <> 0 AndAlso
Not type1.Type.IsSameType(type2.Type, TypeCompareKind.AllIgnoreOptionsForVB And
Not TypeCompareKind.IgnoreTupleNames) Then
results = results Or SymbolComparisonResults.TupleNamesMismatch
If (stopIfAny And SymbolComparisonResults.TupleNamesMismatch) <> 0 Then
GoTo Done
End If
End If
If (comparisons And SymbolComparisonResults.CustomModifierMismatch) <> 0 AndAlso
(Not type1.IsSameType(type2, TypeCompareKind.AllIgnoreOptionsForVB And
Not TypeCompareKind.IgnoreCustomModifiersAndArraySizesAndLowerBounds) OrElse
Not GetRefModifiers(typeSubstitution1, param1).SequenceEqual(GetRefModifiers(typeSubstitution2, param2))) Then
results = results Or SymbolComparisonResults.CustomModifierMismatch
If (stopIfAny And SymbolComparisonResults.CustomModifierMismatch) <> 0 Then
GoTo Done
End If
End If
End If
End If
If param1.IsByRef <> param2.IsByRef Then
results = results Or SymbolComparisonResults.ParameterByrefMismatch
If (stopIfAny And SymbolComparisonResults.ParameterByrefMismatch) <> 0 Then
GoTo Done
End If
End If
If (comparisons And SymbolComparisonResults.ParamArrayMismatch) <> 0 Then
If param1.IsParamArray <> param2.IsParamArray Then
results = results Or SymbolComparisonResults.ParamArrayMismatch
If (stopIfAny And SymbolComparisonResults.ParamArrayMismatch) <> 0 Then
GoTo Done
End If
End If
End If
If bothOptional AndAlso
(comparisons And SymbolComparisonResults.OptionalParameterValueMismatch) <> 0 Then
Dim bothHaveExplicitDefaultValue = param1.HasExplicitDefaultValue AndAlso param2.HasExplicitDefaultValue
Dim optionalParameterMismatch As Boolean
If bothHaveExplicitDefaultValue Then
optionalParameterMismatch = ParameterDefaultValueMismatch(param1, param2)
Else
Dim comp1 = param1.DeclaringCompilation
Dim comp2 = param2.DeclaringCompilation
optionalParameterMismatch = comp1 IsNot Nothing AndAlso comp1 Is comp2
End If
If optionalParameterMismatch Then
results = results Or SymbolComparisonResults.OptionalParameterValueMismatch
If (stopIfAny And SymbolComparisonResults.OptionalParameterValueMismatch) <> 0 Then
GoTo Done
End If
End If
End If
Next
End If
Done:
Return results
End Function