From 564e837de728f496507a3250d4cca4d763bdabdd Mon Sep 17 00:00:00 2001 From: Shane Krueger Date: Tue, 18 Jan 2022 14:00:46 -0500 Subject: [PATCH] Update NullabilityInfoContext.cs.pp with bug fix from MS repo See: - https://github.com/dotnet/runtime/pull/63556 --- .../NullabilityInfoContext.cs.pp | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/NullabilityInfo/NullabilityInfoContext.cs.pp b/src/NullabilityInfo/NullabilityInfoContext.cs.pp index 5606ca3..6cf17c1 100644 --- a/src/NullabilityInfo/NullabilityInfoContext.cs.pp +++ b/src/NullabilityInfo/NullabilityInfoContext.cs.pp @@ -342,10 +342,13 @@ return NotAnnotatedStatus.None; } - private NullabilityInfo GetNullabilityInfo(MemberInfo memberInfo, Type type, IList customAttributes) => - GetNullabilityInfo(memberInfo, type, customAttributes, 0); + private NullabilityInfo GetNullabilityInfo(MemberInfo memberInfo, Type type, IList customAttributes) + { + int index = 0; + return GetNullabilityInfo(memberInfo, type, customAttributes, ref index); + } - private NullabilityInfo GetNullabilityInfo(MemberInfo memberInfo, Type type, IList customAttributes, int index) + private NullabilityInfo GetNullabilityInfo(MemberInfo memberInfo, Type type, IList customAttributes, ref int index) { NullabilityState state = NullabilityState.Unknown; NullabilityInfo? elementState = null; @@ -365,17 +368,22 @@ underlyingType = type; state = NullabilityState.NotNull; } + + if (underlyingType.IsGenericType) + { + index++; + } } else { - if (!ParseNullableState(customAttributes, index, ref state)) + if (!ParseNullableState(customAttributes, index++, ref state)) { state = GetNullableContext(memberInfo); } if (type.IsArray) { - elementState = GetNullabilityInfo(memberInfo, type.GetElementType()!, customAttributes, index + 1); + elementState = GetNullabilityInfo(memberInfo, type.GetElementType()!, customAttributes, ref index); } } @@ -384,16 +392,9 @@ Type[] genericArguments = underlyingType.GetGenericArguments(); genericArgumentsState = new NullabilityInfo[genericArguments.Length]; - for (int i = 0, offset = 0; i < genericArguments.Length; i++) + for (int i = 0; i < genericArguments.Length; i++) { - Type t = Nullable.GetUnderlyingType(genericArguments[i]) ?? genericArguments[i]; - - if (!t.IsValueType || t.IsGenericType) - { - offset++; - } - - genericArgumentsState[i] = GetNullabilityInfo(memberInfo, genericArguments[i], customAttributes, index + offset); + genericArgumentsState[i] = GetNullabilityInfo(memberInfo, genericArguments[i], customAttributes, ref index); } } @@ -501,7 +502,8 @@ { if (genericArguments[i].IsGenericParameter) { - NullabilityInfo n = GetNullabilityInfo(metaMember, genericArguments[i], genericArguments[i].GetCustomAttributesData(), i + 1); + int index = i + 1; + NullabilityInfo n = GetNullabilityInfo(metaMember, genericArguments[i], genericArguments[i].GetCustomAttributesData(), ref index); nullability.GenericTypeArguments[i].ReadState = n.ReadState; nullability.GenericTypeArguments[i].WriteState = n.WriteState; } @@ -524,7 +526,8 @@ && metaType.GetElementType()!.IsGenericParameter) { Type elementType = metaType.GetElementType()!; - NullabilityInfo n = GetNullabilityInfo(metaMember, elementType, elementType.GetCustomAttributesData(), 0); + int index = 0; + NullabilityInfo n = GetNullabilityInfo(metaMember, elementType, elementType.GetCustomAttributesData(), ref index); elementState.ReadState = n.ReadState; elementState.WriteState = n.WriteState; }