Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable nullability in TypeCodeDomSerializer #9529

Merged
merged 4 commits into from
Oct 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/System.Windows.Forms.Design/src/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -343,10 +343,10 @@ virtual System.ComponentModel.Design.Serialization.BasicDesignerLoader.OnEndLoad
virtual System.ComponentModel.Design.Serialization.BasicDesignerLoader.ReportFlushErrors(System.Collections.ICollection! errors) -> void
virtual System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.OnComponentRename(object! component, string? oldName, string? newName) -> void
virtual System.ComponentModel.Design.Serialization.CollectionCodeDomSerializer.SerializeCollection(System.ComponentModel.Design.Serialization.IDesignerSerializationManager! manager, System.CodeDom.CodeExpression? targetExpression, System.Type! targetType, System.Collections.ICollection! originalCollection, System.Collections.ICollection! valuesToSerialize) -> object?
~virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager, System.CodeDom.CodeTypeDeclaration declaration) -> object
~virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.GetInitializeMethod(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager, System.CodeDom.CodeTypeDeclaration declaration, object value) -> System.CodeDom.CodeMemberMethod
~virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.GetInitializeMethods(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager, System.CodeDom.CodeTypeDeclaration declaration) -> System.CodeDom.CodeMemberMethod[]
~virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager, object root, System.Collections.ICollection members) -> System.CodeDom.CodeTypeDeclaration
virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager! manager, System.CodeDom.CodeTypeDeclaration! declaration) -> object!
virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.GetInitializeMethod(System.ComponentModel.Design.Serialization.IDesignerSerializationManager! manager, System.CodeDom.CodeTypeDeclaration! declaration, object! value) -> System.CodeDom.CodeMemberMethod!
virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.GetInitializeMethods(System.ComponentModel.Design.Serialization.IDesignerSerializationManager! manager, System.CodeDom.CodeTypeDeclaration! declaration) -> System.CodeDom.CodeMemberMethod![]!
virtual System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager! manager, object! root, System.Collections.ICollection? members) -> System.CodeDom.CodeTypeDeclaration!
virtual System.Drawing.Design.ToolboxItem.ComponentType.get -> string!
virtual System.Drawing.Design.ToolboxItem.CreateComponentsCore(System.ComponentModel.Design.IDesignerHost? host) -> System.ComponentModel.IComponent![]?
virtual System.Drawing.Design.ToolboxItem.CreateComponentsCore(System.ComponentModel.Design.IDesignerHost? host, System.Collections.IDictionary? defaultValues) -> System.ComponentModel.IComponent![]?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Collections;
using System.Resources;

Expand All @@ -20,19 +18,25 @@ internal sealed class CodeDomSerializationProvider : IDesignerSerializationProvi
/// that is of the correct type, it should return it.
/// Otherwise, it should return null.
/// </summary>
object IDesignerSerializationProvider.GetSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType)
object? IDesignerSerializationProvider.GetSerializer(IDesignerSerializationManager manager, object? currentSerializer, Type? objectType, Type serializerType)
{
// Don't provide our serializer if someone else already had one
if (currentSerializer is not null)
{
return null;
}

if (serializerType == typeof(CodeDomSerializer))
{
return GetCodeDomSerializer(manager, currentSerializer, objectType, serializerType);
return GetCodeDomSerializer(objectType);
}
else if (serializerType == typeof(MemberCodeDomSerializer))
{
return GetMemberCodeDomSerializer(manager, currentSerializer, objectType, serializerType);
return GetMemberCodeDomSerializer(objectType);
}
else if (serializerType == typeof(TypeCodeDomSerializer))
{
return GetTypeCodeDomSerializer(manager, currentSerializer, objectType, serializerType);
return GetTypeCodeDomSerializer(objectType);
}

return null; // don't understand this type of serializer.
Expand All @@ -41,15 +45,8 @@ object IDesignerSerializationProvider.GetSerializer(IDesignerSerializationManage
/// <summary>
/// Returns a code dom serializer
/// </summary>
private static object GetCodeDomSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType)
private static object? GetCodeDomSerializer(Type? objectType)
{
// If this isn't a serializer type we recognize, do nothing. Also, if metadata specified
// a custom serializer, then use it.
if (currentSerializer is not null)
{
return null;
}

// Null is a valid value that can be passed into GetSerializer. It indicates
// that the value we need to serialize is null, in which case we handle it
// through the PrimitiveCodeDomSerializer.
Expand Down Expand Up @@ -104,14 +101,8 @@ private static object GetCodeDomSerializer(IDesignerSerializationManager manager
/// <summary>
/// Returns a code dom serializer for members
/// </summary>
private static object GetMemberCodeDomSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType)
private static object? GetMemberCodeDomSerializer(Type? objectType)
{
// Don't provide our serializer if someone else already had one
if (currentSerializer is not null)
{
return null;
}

if (typeof(PropertyDescriptor).IsAssignableFrom(objectType))
{
return PropertyMemberCodeDomSerializer.Default;
Expand All @@ -128,14 +119,8 @@ private static object GetMemberCodeDomSerializer(IDesignerSerializationManager m
/// <summary>
/// Returns a code dom serializer for types
/// </summary>
private static object GetTypeCodeDomSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType)
private static object? GetTypeCodeDomSerializer(Type? objectType)
{
// Don't provide our serializer if someone else already had one
if (currentSerializer is not null)
{
return null;
}

if (typeof(IComponent).IsAssignableFrom(objectType))
{
return ComponentTypeCodeDomSerializer.Default;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.CodeDom;

namespace System.ComponentModel.Design.Serialization;
Expand All @@ -14,17 +12,9 @@ internal class ComponentTypeCodeDomSerializer : TypeCodeDomSerializer
{
private static readonly object _initMethodKey = new();
private const string _initMethodName = "InitializeComponent";
private static ComponentTypeCodeDomSerializer s_default;

internal static new ComponentTypeCodeDomSerializer Default
{
get
{
s_default ??= new ComponentTypeCodeDomSerializer();
private static ComponentTypeCodeDomSerializer? s_default;

return s_default;
}
}
internal static new ComponentTypeCodeDomSerializer Default => s_default ??= new ComponentTypeCodeDomSerializer();

/// <summary>
/// This method returns the method to emit all of the initialization code to for the given member.
Expand All @@ -36,7 +26,7 @@ protected override CodeMemberMethod GetInitializeMethod(IDesignerSerializationMa
ArgumentNullException.ThrowIfNull(typeDecl);
ArgumentNullException.ThrowIfNull(value);

if (!(typeDecl.UserData[_initMethodKey] is CodeMemberMethod method))
if (typeDecl.UserData[_initMethodKey] is not CodeMemberMethod method)
{
method = new CodeMemberMethod
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System.ComponentModel.Design.Serialization;

public partial class TypeCodeDomSerializer
{
private class StatementOrderComparer : IComparer<OrderedCodeStatementCollection>
{
public static readonly StatementOrderComparer s_default = new();

private StatementOrderComparer()
{
}

public int Compare(OrderedCodeStatementCollection? left, OrderedCodeStatementCollection? right)
{
if (left is null)
{
return 1;
}
else if (right is null)
{
return -1;
}
else if (right == left)
{
return 0;
}

return left.Order - right.Order;
}
}
}
Loading