public override TypeWithNode VisitNullableDirectiveTrivia(NullableDirectiveTriviaSyntax node) { if (node.SettingToken.IsKind(SyntaxKind.RestoreKeyword)) { currentMode = NullableMode.Infer; } else if (node.SettingToken.IsKind(SyntaxKind.EnableKeyword)) { currentMode = NullableMode.Enable; } else if (node.SettingToken.IsKind(SyntaxKind.DisableKeyword)) { currentMode = NullableMode.Disable; } return(base.VisitNullableDirectiveTrivia(node)); }
static CodeTypeReference CreateCodeTypeReferenceWithNullabilityMap(TypeReference type, IEnumerator <bool?> nullabilityMap, NullableMode mode, bool disableNested) { var typeName = GetTypeName(type, nullabilityMap, mode, disableNested); if (type.IsValueType && type.Name == "Nullable`1" && type.Namespace == "System") { // unwrap System.Nullable<Type> into Type? for readability var genericArgs = type is IGenericInstance instance ? instance.GenericArguments : type.HasGenericParameters ? type.GenericParameters.Cast <TypeReference>() : null; return(CreateCodeTypeReferenceWithNullabilityMap(genericArgs.Single(), nullabilityMap, NullableMode.Force, disableNested)); } else { return(new CodeTypeReference(typeName, CreateGenericArguments(type, nullabilityMap))); } }
static string GetTypeName(TypeReference type, IEnumerator <bool?> nullabilityMap, NullableMode mode, bool disableNested) { bool nullable = mode != NullableMode.Disable && (mode == NullableMode.Force || HasAnyReferenceType(type) && IsNullable()); var typeName = GetTypeNameCore(type, nullabilityMap, nullable, disableNested); if (nullable && typeName != "System.Void") { typeName = CSharpTypeKeyword.Get(typeName) + "?"; } return(typeName); bool IsNullable() { if (nullabilityMap == null) { return(false); } if (!nullabilityMap.MoveNext()) { throw new InvalidOperationException("Not enough nullability information"); } return(nullabilityMap.Current == true); } }
internal static CodeTypeReference CreateCodeTypeReference(this TypeReference type, ICustomAttributeProvider attributeProvider = null, NullableMode mode = NullableMode.Default) { return(CreateCodeTypeReferenceWithNullabilityMap(type, attributeProvider.GetNullabilityMap().GetEnumerator(), mode, false)); }