From 05df6f6f2814b1da5686221e5919395eae2006a0 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 20 Jul 2021 13:29:02 -0700 Subject: [PATCH] Remove dependency on Type.IsSerializable from OptionSet serialization --- .../Portable/Options/SerializableOptionSet.cs | 85 +++++-------------- 1 file changed, 21 insertions(+), 64 deletions(-) diff --git a/src/Workspaces/Core/Portable/Options/SerializableOptionSet.cs b/src/Workspaces/Core/Portable/Options/SerializableOptionSet.cs index ebb4309c401ba..97d237f3d015e 100644 --- a/src/Workspaces/Core/Portable/Options/SerializableOptionSet.cs +++ b/src/Workspaces/Core/Portable/Options/SerializableOptionSet.cs @@ -215,57 +215,28 @@ public void Serialize(ObjectWriter writer, CancellationToken cancellationToken) Debug.Assert(ShouldSerialize(optionKey)); if (!_serializableOptions.Contains(optionKey.Option)) - { continue; - } - var kind = OptionValueKind.Null; - object? valueToWrite = null; - if (value != null) + OptionValueKind kind; + switch (value) { - switch (value) - { - case ICodeStyleOption codeStyleOption: - if (optionKey.Option.Type.GenericTypeArguments.Length != 1) - { - continue; - } - - kind = OptionValueKind.CodeStyleOption; - valueToWrite = codeStyleOption; - break; - - case NamingStylePreferences stylePreferences: - kind = OptionValueKind.NamingStylePreferences; - valueToWrite = stylePreferences; - break; - - case string str: - kind = OptionValueKind.String; - valueToWrite = str; - break; - - default: - var type = value.GetType(); - if (type.IsEnum) - { - kind = OptionValueKind.Enum; - valueToWrite = (int)value; - break; - } - - if (optionKey.Option.Type.IsSerializable) - { - kind = OptionValueKind.Serializable; - valueToWrite = value; - break; - } - + case ICodeStyleOption: + if (optionKey.Option.Type.GenericTypeArguments.Length != 1) continue; - } + + kind = OptionValueKind.CodeStyleOption; + break; + + case NamingStylePreferences: + kind = OptionValueKind.NamingStylePreferences; + break; + + default: + kind = value != null && value.GetType().IsEnum ? OptionValueKind.Enum : OptionValueKind.Object; + break; } - valuesBuilder.Add(optionKey, (kind, valueToWrite)); + valuesBuilder.Add(optionKey, (kind, value)); } writer.WriteInt32(valuesBuilder.Count); @@ -279,7 +250,7 @@ public void Serialize(ObjectWriter writer, CancellationToken cancellationToken) RoslynDebug.Assert(value != null); writer.WriteInt32((int)value); } - else if (kind == OptionValueKind.CodeStyleOption || kind == OptionValueKind.NamingStylePreferences) + else if (kind is OptionValueKind.CodeStyleOption or OptionValueKind.NamingStylePreferences) { RoslynDebug.Assert(value != null); ((IObjectWritable)value).WriteTo(writer); @@ -292,9 +263,7 @@ public void Serialize(ObjectWriter writer, CancellationToken cancellationToken) writer.WriteInt32(_changedOptionKeysSerializable.Count); foreach (var changedKey in _changedOptionKeysSerializable.OrderBy(OptionKeyComparer.Instance)) - { SerializeOptionKey(changedKey); - } return; @@ -342,9 +311,7 @@ public static SerializableOptionSet Deserialize(ObjectReader reader, IOptionServ for (var i = 0; i < count; i++) { if (!TryDeserializeOptionKey(reader, lookup, out var optionKey)) - { continue; - } var kind = (OptionValueKind)reader.ReadInt32(); var readValue = kind switch @@ -356,16 +323,13 @@ public static SerializableOptionSet Deserialize(ObjectReader reader, IOptionServ }; if (!serializableOptions.Contains(optionKey.Option)) - { continue; - } object? optionValue; switch (kind) { case OptionValueKind.CodeStyleOption: - var defaultValue = optionKey.Option.DefaultValue as ICodeStyleOption; - if (defaultValue == null || + if (optionKey.Option.DefaultValue is not ICodeStyleOption defaultValue || optionKey.Option.Type.GenericTypeArguments.Length != 1) { continue; @@ -386,10 +350,6 @@ public static SerializableOptionSet Deserialize(ObjectReader reader, IOptionServ optionValue = Enum.ToObject(optionKey.Option.Type, readValue); break; - case OptionValueKind.Null: - optionValue = null; - break; - default: optionValue = readValue; break; @@ -403,16 +363,15 @@ public static SerializableOptionSet Deserialize(ObjectReader reader, IOptionServ for (var i = 0; i < count; i++) { if (TryDeserializeOptionKey(reader, lookup, out var optionKey)) - { changedKeysBuilder.Add(optionKey); - } } var serializableOptionValues = builder.ToImmutable(); var changedOptionKeysSerializable = changedKeysBuilder.ToImmutable(); var workspaceOptionSet = new WorkspaceOptionSet(optionService); - return new SerializableOptionSet(languages, workspaceOptionSet, serializableOptions, serializableOptionValues, + return new SerializableOptionSet( + languages, workspaceOptionSet, serializableOptions, serializableOptionValues, changedOptionKeysSerializable, changedOptionKeysNonSerializable: ImmutableHashSet.Empty); static bool TryDeserializeOptionKey(ObjectReader reader, ILookup lookup, out OptionKey deserializedOptionKey) @@ -439,11 +398,9 @@ static bool TryDeserializeOptionKey(ObjectReader reader, ILookup