From 803b4a33cb59f2223de746b47920869310242d23 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Tue, 1 Jun 2021 22:53:51 -0700 Subject: [PATCH] fix(codegen): Adds access modifiers to serializable fields (#633) - [X] Adds options for SerializableField. Example: ```cs [SerializableField(0, getter: "protected", setter: "protected", isVritual: true)] private int _someField; ``` Defaults: `getter: "public", setter: "public", isVirtual: false` --- .../Tests/GenerateClassTests.cs | 2 +- .../SerializableEntityGeneration.Class.cs | 32 ++++++--- ...zableEntityGeneration.DeserializeMethod.cs | 3 +- .../SerializableEntityGeneration.Property.cs | 49 ++++++++----- ...SerializableEntityGeneration.SerialCtor.cs | 3 +- ...lizableEntityGeneration.SerializeMethod.cs | 3 +- .../Rules/EnumMigrationRule.cs | 2 +- .../Rules/HashSetMigrationRule.cs | 2 +- .../Rules/KeyValuePairMigrationRule.cs | 2 +- .../Rules/ListMigrationRule.cs | 2 +- .../Rules/PrimitiveTypeMigrationRule.cs | 2 +- .../Rules/PrimitiveUOTypeMigrationRule.cs | 2 +- .../SerializableInterfaceMigrationRule.cs | 2 +- ...rializationMethodSignatureMigrationRule.cs | 2 +- .../SerializableMigrationRulesEngine.cs | 2 +- .../SerializableMigrationSchema.cs | 3 +- .../SerializerSyntaxReceiver.cs | 2 - .../SourceGeneration/Helpers.cs | 17 ++++- .../SourceGeneration.AccessModifier.cs | 43 ----------- .../SourceGeneration.Arguments.cs | 2 +- .../SourceGeneration.Attribute.cs | 2 +- .../SourceGeneration.Class.cs | 6 +- .../SourceGeneration.InstanceModifier.cs | 2 +- .../SourceGeneration.Method.cs | 6 +- .../SourceGeneration.Namespace.cs | 2 +- .../SourceGeneration.Property.cs | 72 +++++++++++++------ .../SymbolMetadata/SymbolMetadata.Builtin.cs | 2 +- .../SymbolMetadata/SymbolMetadata.UO.cs | 3 +- .../SchemaGenerator.cs | 2 +- .../SerializableFieldAttribute.cs | 16 ++++- Projects/Server/Server.csproj | 3 - .../Halloween/2012/Engines/PlayerZombies.cs | 42 +++-------- ...rver.Engines.Events.ZombieSkeleton.v0.json | 12 ++++ 33 files changed, 183 insertions(+), 164 deletions(-) delete mode 100644 Projects/SerializationGenerator/SourceGeneration/SourceGeneration.AccessModifier.cs create mode 100644 Projects/UOContent/Migrations/Server.Engines.Events.ZombieSkeleton.v0.json diff --git a/Projects/SerializationGenerator.Tests/Tests/GenerateClassTests.cs b/Projects/SerializationGenerator.Tests/Tests/GenerateClassTests.cs index f90df7315..03f8db598 100644 --- a/Projects/SerializationGenerator.Tests/Tests/GenerateClassTests.cs +++ b/Projects/SerializationGenerator.Tests/Tests/GenerateClassTests.cs @@ -1,7 +1,7 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; using Xunit; namespace SerializationGeneratorTests diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs index 8e088e5a8..f167d86b8 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs @@ -21,7 +21,6 @@ using System.Text; using System.Text.Json; using Microsoft.CodeAnalysis; using SerializableMigration; -using SourceGeneration; namespace SerializationGenerator { @@ -128,7 +127,7 @@ namespace SerializationGenerator const string indent = " "; source.GenerateClassField( - AccessModifier.Private, + Accessibility.Private, InstanceModifier.Const, "int", "_version", @@ -154,8 +153,6 @@ namespace SerializationGenerator continue; } - var order = (int)serializableFieldAttr.ConstructorArguments[0].Value!; - foreach (var attr in allAttributes) { if (!SymbolEqualityComparer.Default.Equals(attr.AttributeClass, serializableFieldAttrAttribute)) @@ -182,9 +179,22 @@ namespace SerializationGenerator } } + var attrCtorArgs = serializableFieldAttr.ConstructorArguments; + + var order = (int)attrCtorArgs[0].Value!; + var getterAccessor = Helpers.GetAccessibility(attrCtorArgs[1].Value!.ToString()); + var setterAccessor = Helpers.GetAccessibility(attrCtorArgs[2].Value!.ToString()); + var virtualProperty = (bool)attrCtorArgs[3].Value!; + if (fieldOrPropertySymbol is IFieldSymbol fieldSymbol) { - source.GenerateSerializableProperty(fieldSymbol, compilation); + source.GenerateSerializableProperty( + compilation, + fieldSymbol, + getterAccessor, + setterAccessor, + virtualProperty + ); source.AppendLine(); } @@ -206,22 +216,22 @@ namespace SerializationGenerator { // long ISerializable.SavePosition { get; set; } = -1; source.GenerateAutoProperty( - AccessModifier.None, + Accessibility.NotApplicable, "long", "ISerializable.SavePosition", - AccessModifier.None, - AccessModifier.None, + Accessibility.NotApplicable, + Accessibility.NotApplicable, indent, defaultValue: "-1" ); // BufferWriter ISerializable.SaveBuffer { get; set; } source.GenerateAutoProperty( - AccessModifier.None, + Accessibility.NotApplicable, "BufferWriter", "ISerializable.SaveBuffer", - AccessModifier.None, - AccessModifier.None, + Accessibility.NotApplicable, + Accessibility.NotApplicable, indent ); } diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.DeserializeMethod.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.DeserializeMethod.cs index 497833442..1dac574fb 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.DeserializeMethod.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.DeserializeMethod.cs @@ -18,7 +18,6 @@ using System.Linq; using System.Text; using Microsoft.CodeAnalysis; using SerializableMigration; -using SourceGeneration; namespace SerializationGenerator { @@ -39,7 +38,7 @@ namespace SerializationGenerator source.GenerateMethodStart( "Deserialize", - AccessModifier.Public, + Accessibility.Public, isOverride, "void", ImmutableArray.Create<(ITypeSymbol, string)>((genericReaderInterface, "reader")) diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs index 79cad68e2..edd938baf 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs @@ -16,7 +16,6 @@ using System.Linq; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; namespace SerializationGenerator { @@ -24,8 +23,11 @@ namespace SerializationGenerator { public static void GenerateSerializableProperty( this StringBuilder source, + Compilation compilation, IFieldSymbol fieldSymbol, - Compilation compilation + Accessibility getter, + Accessibility? setter, + bool isVirtual ) { var fieldName = fieldSymbol.Name; @@ -40,27 +42,38 @@ namespace SerializationGenerator ) ?? false ); - source.GeneratePropertyStart(AccessModifier.Public, fieldSymbol); + const string indent = " "; + const string propertyIndent = " "; + + var propertyAccessor = setter > getter ? setter : getter; + var getterAccessor = getter == propertyAccessor ? Accessibility.NotApplicable : getter; + + source.GeneratePropertyStart(indent, propertyAccessor.Value, isVirtual, fieldSymbol); // Getter - source.GeneratePropertyGetterReturnsField(fieldSymbol); + source.GeneratePropertyGetterReturnsField(propertyIndent, fieldSymbol, getterAccessor); - // Setter - source.GeneratePropertySetterStart(false); - const string indent = " "; - source.AppendLine($"{indent}if (value != {fieldName})"); - source.AppendLine($"{indent}{{"); - source.AppendLine($"{indent} {fieldName} = value;"); - source.AppendLine($"{indent} ((ISerializable)this).MarkDirty();"); - - if (invalidatePropertiesAttribute != null) + if (setter != null) { - source.AppendLine($"{indent} InvalidateProperties();"); - } - source.AppendLine($"{indent}}}"); - source.GeneratePropertyGetSetEnd(false); + var setterAccessor = setter == propertyAccessor ? Accessibility.NotApplicable : setter; - source.GeneratePropertyEnd(); + // Setter + source.GeneratePropertySetterStart(propertyIndent, false, setterAccessor.Value); + const string innerIndent = " "; + source.AppendLine($"{innerIndent}if (value != {fieldName})"); + source.AppendLine($"{innerIndent}{{"); + source.AppendLine($"{innerIndent} {fieldName} = value;"); + source.AppendLine($"{innerIndent} ((ISerializable)this).MarkDirty();"); + + if (invalidatePropertiesAttribute != null) + { + source.AppendLine($"{innerIndent} InvalidateProperties();"); + } + source.AppendLine($"{innerIndent}}}"); + source.GeneratePropertyGetSetEnd(propertyIndent, false); + } + + source.GeneratePropertyEnd(indent); } } } diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerialCtor.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerialCtor.cs index 171882283..8f961f724 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerialCtor.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerialCtor.cs @@ -16,7 +16,6 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; namespace SerializationGenerator { @@ -34,7 +33,7 @@ namespace SerializationGenerator source.GenerateConstructorStart( className, - AccessModifier.Public, + Accessibility.Public, new []{ (serialType, "serial") }.ToImmutableArray(), isOverride ? _baseParameters : ImmutableArray.Empty ); diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerializeMethod.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerializeMethod.cs index 2b7d9a4a0..4a22fb723 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerializeMethod.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.SerializeMethod.cs @@ -17,7 +17,6 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; using SerializableMigration; -using SourceGeneration; namespace SerializationGenerator { @@ -35,7 +34,7 @@ namespace SerializationGenerator source.GenerateMethodStart( "Serialize", - AccessModifier.Public, + Accessibility.Public, isOverride, "void", ImmutableArray.Create<(ITypeSymbol, string)>((genericWriterInterface, "writer")) diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/EnumMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/EnumMigrationRule.cs index 42b396f7c..7864fbd30 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/EnumMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/EnumMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/HashSetMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/HashSetMigrationRule.cs index fd7cdd5bb..bf7fe8f99 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/HashSetMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/HashSetMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/KeyValuePairMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/KeyValuePairMigrationRule.cs index 017536db2..dfe224ae6 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/KeyValuePairMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/KeyValuePairMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/ListMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/ListMigrationRule.cs index f5af6001b..57b89add3 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/ListMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/ListMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs index 1872fb957..567cf1ffb 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveTypeMigrationRule.cs @@ -18,7 +18,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs index 5699b03e5..76dc68b05 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/PrimitiveUOTypeMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/SerializableInterfaceMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/SerializableInterfaceMigrationRule.cs index 4412a2ca4..2ef769fd5 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/SerializableInterfaceMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/SerializableInterfaceMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/Rules/SerializationMethodSignatureMigrationRule.cs b/Projects/SerializationGenerator/SerializableMigration/Rules/SerializationMethodSignatureMigrationRule.cs index 656b30182..211d9d1eb 100644 --- a/Projects/SerializationGenerator/SerializableMigration/Rules/SerializationMethodSignatureMigrationRule.cs +++ b/Projects/SerializationGenerator/SerializableMigration/Rules/SerializationMethodSignatureMigrationRule.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationRulesEngine.cs b/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationRulesEngine.cs index 46a2cc8f1..2d85c8241 100644 --- a/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationRulesEngine.cs +++ b/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationRulesEngine.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.CodeAnalysis; -using SourceGeneration; +using SerializationGenerator; namespace SerializableMigration { diff --git a/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationSchema.cs b/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationSchema.cs index 4465303a8..52b94d505 100644 --- a/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationSchema.cs +++ b/Projects/SerializationGenerator/SerializableMigration/SerializableMigrationSchema.cs @@ -13,7 +13,6 @@ * along with this program. If not, see . * *************************************************************************/ -using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -58,6 +57,7 @@ namespace SerializableMigration { var text = File.ReadAllText(file, Encoding.UTF8); migration = JsonSerializer.Deserialize(text, options); + _cache[fi.Name] = migration; } if (typeName == migration!.Type && version > migration.Version) @@ -96,6 +96,7 @@ namespace SerializableMigration } migration = JsonSerializer.Deserialize(text, options); + _cache[fi.Name] = migration; } if (typeName == migration!.Type && version > migration.Version) diff --git a/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs b/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs index c38e7e0a7..32122c8f2 100755 --- a/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs +++ b/Projects/SerializationGenerator/SerializerSyntaxReceiver.cs @@ -13,12 +13,10 @@ * along with this program. If not, see . * *************************************************************************/ -using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; -using SourceGeneration; namespace SerializationGenerator { diff --git a/Projects/SerializationGenerator/SourceGeneration/Helpers.cs b/Projects/SerializationGenerator/SourceGeneration/Helpers.cs index 474599f85..a180ca750 100644 --- a/Projects/SerializationGenerator/SourceGeneration/Helpers.cs +++ b/Projects/SerializationGenerator/SourceGeneration/Helpers.cs @@ -17,8 +17,9 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; -namespace SourceGeneration +namespace SerializationGenerator { public static class Helpers { @@ -40,5 +41,19 @@ namespace SourceGeneration return list.ToImmutableArray(); } + + public static string ToFriendlyString(this Accessibility accessibility) => SyntaxFacts.GetText(accessibility); + + public static Accessibility GetAccessibility(string value) => + value switch + { + "private" => Accessibility.Private, + "protected" => Accessibility.Protected, + "internal" => Accessibility.Internal, + "public" => Accessibility.Public, + "protected internal" => Accessibility.ProtectedOrInternal, + "private protected" => Accessibility.ProtectedAndInternal, + _ => Accessibility.NotApplicable + }; } } diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.AccessModifier.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.AccessModifier.cs deleted file mode 100644 index 656a1170e..000000000 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.AccessModifier.cs +++ /dev/null @@ -1,43 +0,0 @@ -/************************************************************************* - * ModernUO * - * Copyright (C) 2019-2021 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: SourceGeneration.AccessModifier.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -namespace SourceGeneration -{ - public enum AccessModifier - { - None, - Public, - Private, - Protected, - Internal, - ProtectedInternal, - PrivateProtected - } - - public static partial class SourceGeneration - { - public static string ToFriendlyString(this AccessModifier modifier) => - modifier switch - { - AccessModifier.Public => "public", - AccessModifier.Private => "private", - AccessModifier.Protected => "protected", - AccessModifier.Internal => "internal", - AccessModifier.ProtectedInternal => "protected internal", - AccessModifier.PrivateProtected => "private protected", - _ => "" - }; - } -} diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Arguments.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Arguments.cs index 87b6103d0..0d194d65f 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Arguments.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Arguments.cs @@ -18,7 +18,7 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SourceGeneration { diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Attribute.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Attribute.cs index ff1e24051..98e312beb 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Attribute.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Attribute.cs @@ -17,7 +17,7 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SourceGeneration { diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Class.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Class.cs index 5dc2e0bb9..7068d5faf 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Class.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Class.cs @@ -17,7 +17,7 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SourceGeneration { @@ -49,7 +49,7 @@ namespace SourceGeneration // TODO: Generalize this to any field using dynamic indentation public static void GenerateClassField( this StringBuilder source, - AccessModifier accessors, + Accessibility accessors, InstanceModifier instance, string type, string variableName, @@ -63,7 +63,7 @@ namespace SourceGeneration } var instanceStr = instance == InstanceModifier.None ? "" : $"{instance.ToFriendlyString()} "; - var accessorStr = accessors == AccessModifier.None ? "" : $"{accessors.ToFriendlyString()} "; + var accessorStr = accessors == Accessibility.NotApplicable ? "" : $"{accessors.ToFriendlyString()} "; var valueStr = value == null ? "" : $" = {value}"; source.AppendLine($" {accessorStr}{instanceStr}{type} {variableName}{valueStr};"); diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.InstanceModifier.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.InstanceModifier.cs index c61d86bbd..2fdfef6da 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.InstanceModifier.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.InstanceModifier.cs @@ -13,7 +13,7 @@ * along with this program. If not, see . * *************************************************************************/ -namespace SourceGeneration +namespace SerializationGenerator { public enum InstanceModifier { diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Method.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Method.cs index e4ecfd718..46f17cf0d 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Method.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Method.cs @@ -17,11 +17,11 @@ using System.Collections.Immutable; using System.Text; using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SourceGeneration { - public static void GenerateMethodStart(this StringBuilder source, string methodName, AccessModifier accessors, bool isOverride, string returnType, ImmutableArray<(ITypeSymbol, string)> parameters) + public static void GenerateMethodStart(this StringBuilder source, string methodName, Accessibility accessors, bool isOverride, string returnType, ImmutableArray<(ITypeSymbol, string)> parameters) { source.Append($" {accessors.ToFriendlyString()}{(isOverride ? " override" : "")} {returnType} {methodName}("); source.GenerateSignatureArguments(parameters); @@ -32,7 +32,7 @@ namespace SourceGeneration public static void GenerateMethodEnd(this StringBuilder source) => source.AppendLine(@" }"); public static void GenerateConstructorStart( - this StringBuilder source, string className, AccessModifier accessors, ImmutableArray<(ITypeSymbol, string)> parameters, + this StringBuilder source, string className, Accessibility accessors, ImmutableArray<(ITypeSymbol, string)> parameters, ImmutableArray baseParameters, bool isOverload = false ) { diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Namespace.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Namespace.cs index 6767b1db9..24ced2544 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Namespace.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Namespace.cs @@ -15,7 +15,7 @@ using System.Text; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SourceGeneration { diff --git a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Property.cs b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Property.cs index abbf09b3b..fc66bc985 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Property.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SourceGeneration.Property.cs @@ -18,7 +18,7 @@ using System.Text; using Humanizer; using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SourceGeneration { @@ -42,23 +42,26 @@ namespace SourceGeneration public static void GeneratePropertyStart( this StringBuilder source, - AccessModifier accessors, + string indent, + Accessibility accessors, + bool isVirtual, IFieldSymbol fieldSymbol ) { var propertyName = fieldSymbol.GetPropertyName(); + var virt = isVirtual ? "virtual " : ""; - source.AppendLine($@" {accessors.ToFriendlyString()} {fieldSymbol.Type} {propertyName} - {{"); + source.AppendLine($"{indent}{accessors.ToFriendlyString()} {virt}{fieldSymbol.Type} {propertyName}"); + source.AppendLine($"{indent}{{"); } public static void GenerateAutoProperty( this StringBuilder source, - AccessModifier accessors, + Accessibility accessors, string type, string propertyName, - AccessModifier? getAccessor, - AccessModifier? setAccessor, + Accessibility? getAccessor, + Accessibility? setAccessor, string indent, bool useInit = false, string defaultValue = null, @@ -72,18 +75,18 @@ namespace SourceGeneration var getter = getAccessor == null ? "" : - $"{(getAccessor != AccessModifier.None ? $"{getAccessor.Value.ToFriendlyString()} " : "")}get;"; + $"{(getAccessor != Accessibility.NotApplicable ? $"{getAccessor.Value.ToFriendlyString()} " : "")}get;"; var getterSpace = getAccessor != null ? " " : ""; var setOrInit = useInit ? "init;" : "set;"; - var setterAccessor = setAccessor is null or AccessModifier.None + var setterAccessor = setAccessor is null or Accessibility.NotApplicable ? "" : $"{setAccessor.Value.ToFriendlyString() ?? ""} "; var setter = setAccessor == null ? "" : $"{getterSpace}{setterAccessor}{setOrInit}"; - var propertyAccessor = accessors == AccessModifier.None ? "" : $"{accessors.ToFriendlyString()} "; + var propertyAccessor = accessors == Accessibility.NotApplicable ? "" : $"{accessors.ToFriendlyString()} "; var printOverride = isOverride ? "override " : ""; var printDefaultValue = defaultValue != null ? $"{(setAccessor != null ? " =" : "")} {defaultValue};" : ""; var printGetterSetter = setAccessor == null ? "=>" : $"{{ {getter}{setter} }}"; @@ -91,26 +94,51 @@ namespace SourceGeneration source.AppendLine($"{indent}{propertyAccessor}{printOverride}{type} {propertyName} {printGetterSetter}{printDefaultValue}"); } - public static void GeneratePropertyEnd(this StringBuilder source) => source.AppendLine(" }"); + public static void GeneratePropertyEnd(this StringBuilder source, string indent) => source.AppendLine($"{indent}}}"); - public static void GeneratePropertyGetterReturnsField(this StringBuilder source, IFieldSymbol fieldSymbol) => - source.AppendLine($" get => {fieldSymbol.Name};"); + public static void GeneratePropertyGetterReturnsField( + this StringBuilder source, + string indent, + IFieldSymbol fieldSymbol, + Accessibility Accessibility + ) + { + var accessor = Accessibility != Accessibility.NotApplicable ? $"{Accessibility.ToFriendlyString()} " : ""; + source.AppendLine($"{indent}{accessor}get => {fieldSymbol.Name};"); + } - public static void GeneratePropertyGetterStart(this StringBuilder source, bool useExpression) => - source.AppendLine($" get{(useExpression ? " => " : "\n {")}"); + public static void GeneratePropertyGetterStart( + this StringBuilder source, + string indent, + bool useExpression, + Accessibility Accessibility + ) + { + var accessor = Accessibility != Accessibility.NotApplicable ? $"{Accessibility.ToFriendlyString()} " : ""; + var expression = useExpression ? " => " : $"\n{indent}{{"; + source.AppendLine($"{indent}{accessor}get{expression}"); + } - public static void GeneratePropertyGetSetEnd(this StringBuilder source, bool useExpression) + public static void GeneratePropertyGetSetEnd(this StringBuilder source, string indent, bool useExpression) { if (!useExpression) { - source.AppendLine(" }"); + source.AppendLine($"{indent}}}"); } } - public static void GeneratePropertySetterSetsValue(this StringBuilder source, IFieldSymbol fieldSymbol) => - source.AppendLine($" set => {fieldSymbol.Name} = value;"); - - public static void GeneratePropertySetterStart(this StringBuilder source, bool useExpression, bool useInit = false) => - source.AppendLine($" {(useInit ? "init" : "set")}{(useExpression ? " => " : "\n {")}"); + public static void GeneratePropertySetterStart( + this StringBuilder source, + string indent, + bool useExpression, + Accessibility Accessibility, + bool useInit = false + ) + { + var init = useInit ? "init" : "set"; + var expression = useExpression ? " => " : $"\n{indent}{{"; + var accessor = Accessibility != Accessibility.NotApplicable ? $"{Accessibility.ToFriendlyString()} " : ""; + source.AppendLine($"{indent}{accessor}{init}{expression}"); + } } } diff --git a/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.Builtin.cs b/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.Builtin.cs index 279ef3e42..1ae6fa54b 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.Builtin.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.Builtin.cs @@ -15,7 +15,7 @@ using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SymbolMetadata { diff --git a/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.UO.cs b/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.UO.cs index 31690092a..553857a41 100644 --- a/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.UO.cs +++ b/Projects/SerializationGenerator/SourceGeneration/SymbolMetadata/SymbolMetadata.UO.cs @@ -13,12 +13,11 @@ * along with this program. If not, see . * *************************************************************************/ -using System; using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; -namespace SourceGeneration +namespace SerializationGenerator { public static partial class SymbolMetadata { diff --git a/Projects/SerializationSchemaGenerator/SchemaGenerator.cs b/Projects/SerializationSchemaGenerator/SchemaGenerator.cs index 64fe13e78..5e6be8688 100644 --- a/Projects/SerializationSchemaGenerator/SchemaGenerator.cs +++ b/Projects/SerializationSchemaGenerator/SchemaGenerator.cs @@ -20,7 +20,7 @@ using System.Linq; using System.Text.Json; using Microsoft.CodeAnalysis; using SerializableMigration; -using SourceGeneration; +using SerializationGenerator; namespace SerializationSchemaGenerator { diff --git a/Projects/Server/Serialization/SerializableFieldAttribute.cs b/Projects/Server/Serialization/SerializableFieldAttribute.cs index 5fa4f775a..56dd79d87 100755 --- a/Projects/Server/Serialization/SerializableFieldAttribute.cs +++ b/Projects/Server/Serialization/SerializableFieldAttribute.cs @@ -26,7 +26,21 @@ namespace Server public sealed class SerializableFieldAttribute : Attribute { public int Order { get; } + public string PropertyGetter { get; } + public string? PropertySetter { get; } + public bool IsVirtual { get; } - public SerializableFieldAttribute(int order) => Order = order; + public SerializableFieldAttribute( + int order, + string getter = "public", + string setter = "public", + bool isVirtual = false + ) + { + Order = order; + PropertyGetter = getter; + PropertySetter = setter; + IsVirtual = isVirtual; + } } } diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj index 88f6fb600..fb8e297fa 100755 --- a/Projects/Server/Server.csproj +++ b/Projects/Server/Server.csproj @@ -72,7 +72,4 @@ - - - diff --git a/Projects/UOContent/Holiday Stuff/Halloween/2012/Engines/PlayerZombies.cs b/Projects/UOContent/Holiday Stuff/Halloween/2012/Engines/PlayerZombies.cs index aa261e8ee..629a486f6 100644 --- a/Projects/UOContent/Holiday Stuff/Halloween/2012/Engines/PlayerZombies.cs +++ b/Projects/UOContent/Holiday Stuff/Halloween/2012/Engines/PlayerZombies.cs @@ -173,19 +173,18 @@ namespace Server.Engines.Events } } - public class ZombieSkeleton : BaseCreature + [Serializable(0, false)] + public partial class ZombieSkeleton : BaseCreature { - private const string _name = "Zombie Skeleton"; + [SerializableField(0, "private", "private")] + private PlayerMobile _deadPlayer; - // TODO: Requires private modifier - private PlayerMobile m_DeadPlayer; + public override string DefaultName => _deadPlayer != null ? $"{_deadPlayer.Name}'s Zombie Skeleton" : "Zombie Skeleton"; public ZombieSkeleton(PlayerMobile player = null) : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4) { - m_DeadPlayer = player; - - Name = player != null ? $"{player.Name}'s {_name}" : _name; + _deadPlayer = player; Body = 0x93; BaseSoundID = 0x1c3; @@ -219,11 +218,6 @@ namespace Server.Engines.Events VirtualArmor = 18; } - public ZombieSkeleton(Serial serial) - : base(serial) - { - } - public override string CorpseName => "a rotting corpse"; public override bool BleedImmune => true; @@ -232,7 +226,7 @@ namespace Server.Engines.Events public override void GenerateLoot() { - var deadPlayerExists = m_DeadPlayer?.Deleted == false; + var deadPlayerExists = _deadPlayer?.Deleted == false; PackItem( Utility.Random(deadPlayerExists ? 8 : 10) switch @@ -242,7 +236,7 @@ namespace Server.Engines.Events 2 => new Torso(), 3 => new Bone(), 4 => new RibCage(), - 9 => deadPlayerExists ? new PlayerBones(m_DeadPlayer.Name) : null, + 9 => deadPlayerExists ? new PlayerBones(_deadPlayer.Name) : null, _ => null // 5-8, 10 (50%) } ); @@ -252,26 +246,10 @@ namespace Server.Engines.Events public override void OnDelete() { - if (m_DeadPlayer?.Deleted == false) + if (_deadPlayer?.Deleted == false) { - HalloweenHauntings.ReAnimated?.Remove(m_DeadPlayer); + HalloweenHauntings.ReAnimated?.Remove(_deadPlayer); } } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - writer.Write(0); - - writer.Write(m_DeadPlayer); - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - var version = reader.ReadInt(); - - m_DeadPlayer = reader.ReadEntity(); - } } } diff --git a/Projects/UOContent/Migrations/Server.Engines.Events.ZombieSkeleton.v0.json b/Projects/UOContent/Migrations/Server.Engines.Events.ZombieSkeleton.v0.json new file mode 100644 index 000000000..7ed240f75 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.Events.ZombieSkeleton.v0.json @@ -0,0 +1,12 @@ +{ + "version": 0, + "type": "Server.Engines.Events.ZombieSkeleton", + "properties": [ + { + "name": "DeadPlayer", + "type": "Server.Mobiles.PlayerMobile", + "rule": "SerializableInterfaceMigrationRule", + "ruleArguments": [] + } + ] +} \ No newline at end of file