コード例 #1
0
 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));
 }
コード例 #2
0
        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)));
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
 internal static CodeTypeReference CreateCodeTypeReference(this TypeReference type, ICustomAttributeProvider attributeProvider = null, NullableMode mode = NullableMode.Default)
 {
     return(CreateCodeTypeReferenceWithNullabilityMap(type, attributeProvider.GetNullabilityMap().GetEnumerator(), mode, false));
 }