|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Linq;
using ILLink.Shared.DataFlow;
using ILLink.Shared.TrimAnalysis;
using ILLink.Shared.TypeSystemProxy;
using Microsoft.CodeAnalysis;
namespace ILLink.RoslynAnalyzer.TrimAnalysis
{
public static class SingleValueExtensions
{
public static SingleValue? FromTypeSymbol (ITypeSymbol type)
{
if (type.OriginalDefinition.SpecialType == SpecialType.System_Nullable_T) {
var underlyingType = (type as INamedTypeSymbol)?.TypeArguments.FirstOrDefault ();
return underlyingType?.TypeKind switch {
TypeKind.TypeParameter =>
new NullableValueWithDynamicallyAccessedMembers (new TypeProxy (type),
new GenericParameterValue ((ITypeParameterSymbol) underlyingType)),
// typeof(Nullable<>)
TypeKind.Error => new SystemTypeValue (new TypeProxy (type)),
TypeKind.Class or TypeKind.Enum or TypeKind.Interface or TypeKind.Struct =>
new NullableSystemTypeValue (new TypeProxy (type), new SystemTypeValue (new TypeProxy (underlyingType))),
_ => UnknownValue.Instance
};
}
return type.Kind switch {
SymbolKind.TypeParameter => new GenericParameterValue ((ITypeParameterSymbol) type),
SymbolKind.NamedType => new SystemTypeValue (new TypeProxy (type)),
// If the symbol is an Array type, the BaseType is System.Array
SymbolKind.ArrayType => new SystemTypeValue (new TypeProxy (type.BaseType!)),
SymbolKind.ErrorType => UnknownValue.Instance,
_ => null
};
}
}
}
|