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); }
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); }