示例#1
0
        internal static bool IsOrleansShallowCopyable(WellKnownTypes wellKnownTypes, ITypeSymbol type, HashSet <ITypeSymbol> examining)
        {
            switch (type.SpecialType)
            {
            case SpecialType.System_Boolean:
            case SpecialType.System_Char:
            case SpecialType.System_SByte:
            case SpecialType.System_Byte:
            case SpecialType.System_Int16:
            case SpecialType.System_UInt16:
            case SpecialType.System_Int32:
            case SpecialType.System_UInt32:
            case SpecialType.System_Int64:
            case SpecialType.System_UInt64:
            case SpecialType.System_Decimal:
            case SpecialType.System_Single:
            case SpecialType.System_Double:
            case SpecialType.System_String:
            case SpecialType.System_DateTime:
                return(true);
            }

            if (wellKnownTypes.TimeSpan.Equals(type) ||
                wellKnownTypes.IPAddress.Equals(type) ||
                wellKnownTypes.IPEndPoint.Equals(type) ||
                wellKnownTypes.SiloAddress.Equals(type) ||
                wellKnownTypes.GrainId.Equals(type) ||
                wellKnownTypes.ActivationId.Equals(type) ||
                wellKnownTypes.ActivationAddress.Equals(type) ||
                wellKnownTypes.CorrelationId is WellKnownTypes.Some correlationIdType && correlationIdType.Value.Equals(type) ||
                wellKnownTypes.CancellationToken.Equals(type))
            {
                return(true);
            }

            if (ShallowCopyableTypes.TryGetValue(type, out var result))
            {
                return(result);
            }

            if (type.HasAttribute(wellKnownTypes.ImmutableAttribute))
            {
                return(ShallowCopyableTypes[type] = true);
            }

            if (type.HasBaseType(wellKnownTypes.Exception))
            {
                return(ShallowCopyableTypes[type] = true);
            }

            if (!(type is INamedTypeSymbol namedType))
            {
                return(ShallowCopyableTypes[type] = false);
            }

            if (namedType.IsGenericType && wellKnownTypes.Immutable_1.Equals(namedType.ConstructedFrom))
            {
                return(ShallowCopyableTypes[type] = true);
            }

            if (type.TypeKind == TypeKind.Struct && !namedType.IsGenericType && !namedType.IsUnboundGenericType)
            {
                return(ShallowCopyableTypes[type] = IsValueTypeFieldsShallowCopyable(wellKnownTypes, type, examining));
            }

            return(ShallowCopyableTypes[type] = false);
        }
示例#2
0
        internal bool IsOrleansShallowCopyable(ITypeSymbol type)
        {
            switch (type.SpecialType)
            {
            case SpecialType.System_Boolean:
            case SpecialType.System_Char:
            case SpecialType.System_SByte:
            case SpecialType.System_Byte:
            case SpecialType.System_Int16:
            case SpecialType.System_UInt16:
            case SpecialType.System_Int32:
            case SpecialType.System_UInt32:
            case SpecialType.System_Int64:
            case SpecialType.System_UInt64:
            case SpecialType.System_Decimal:
            case SpecialType.System_Single:
            case SpecialType.System_Double:
            case SpecialType.System_String:
            case SpecialType.System_DateTime:
                return(true);
            }

            if (SymbolEqualityComparer.Default.Equals(wellKnownTypes.TimeSpan, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.IPAddress, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.IPEndPoint, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.SiloAddress, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.GrainId, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.ActivationId, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.ActivationAddress, type) ||
                wellKnownTypes.CorrelationId is WellKnownTypes.Some correlationIdType && SymbolEqualityComparer.Default.Equals(correlationIdType.Value, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.CancellationToken, type) ||
                SymbolEqualityComparer.Default.Equals(wellKnownTypes.Type, type))
            {
                return(true);
            }

            if (ShallowCopyableTypes.TryGetValue(type, out var result))
            {
                return(result);
            }

            if (type.HasAttribute(wellKnownTypes.ImmutableAttribute))
            {
                return(ShallowCopyableTypes[type] = true);
            }

            if (type.HasBaseType(wellKnownTypes.Exception))
            {
                return(ShallowCopyableTypes[type] = true);
            }

            if (!(type is INamedTypeSymbol namedType))
            {
                return(ShallowCopyableTypes[type] = false);
            }

            if (namedType.IsTupleType)
            {
                return(ShallowCopyableTypes[type] = namedType.TupleElements.All(f => IsOrleansShallowCopyable(f.Type)));
            }
            else if (namedType.IsGenericType)
            {
                var def = namedType.ConstructedFrom;
                if (def.SpecialType == SpecialType.System_Nullable_T)
                {
                    return(ShallowCopyableTypes[type] = IsOrleansShallowCopyable(namedType.TypeArguments.Single()));
                }

                if (SymbolEqualityComparer.Default.Equals(wellKnownTypes.Immutable_1, def))
                {
                    return(ShallowCopyableTypes[type] = true);
                }

                if (wellKnownTypes.TupleTypes.Any(t => SymbolEqualityComparer.Default.Equals(t, def)))
                {
                    return(ShallowCopyableTypes[type] = namedType.TypeArguments.All(IsOrleansShallowCopyable));
                }
            }
            else
            {
                if (type.TypeKind == TypeKind.Enum)
                {
                    return(ShallowCopyableTypes[type] = true);
                }

                if (type.TypeKind == TypeKind.Struct && !namedType.IsUnboundGenericType)
                {
                    return(ShallowCopyableTypes[type] = IsValueTypeFieldsShallowCopyable(type));
                }
            }

            return(ShallowCopyableTypes[type] = false);
        }