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`
This commit is contained in:
parent
72d3966541
commit
803b4a33cb
33 changed files with 183 additions and 164 deletions
|
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 <http://www.gnu.org/licenses/>. *
|
||||
*************************************************************************/
|
||||
|
||||
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",
|
||||
_ => ""
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ using System.Collections.Immutable;
|
|||
using System.Text;
|
||||
using Microsoft.CodeAnalysis;
|
||||
|
||||
namespace SourceGeneration
|
||||
namespace SerializationGenerator
|
||||
{
|
||||
public static partial class SourceGeneration
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ using System.Collections.Immutable;
|
|||
using System.Text;
|
||||
using Microsoft.CodeAnalysis;
|
||||
|
||||
namespace SourceGeneration
|
||||
namespace SerializationGenerator
|
||||
{
|
||||
public static partial class SourceGeneration
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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};");
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
*************************************************************************/
|
||||
|
||||
namespace SourceGeneration
|
||||
namespace SerializationGenerator
|
||||
{
|
||||
public enum InstanceModifier
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<string> baseParameters, bool isOverload = false
|
||||
)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
using System.Text;
|
||||
|
||||
namespace SourceGeneration
|
||||
namespace SerializationGenerator
|
||||
{
|
||||
public static partial class SourceGeneration
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
using Microsoft.CodeAnalysis;
|
||||
|
||||
namespace SourceGeneration
|
||||
namespace SerializationGenerator
|
||||
{
|
||||
public static partial class SymbolMetadata
|
||||
{
|
||||
|
|
|
|||
|
|
@ -13,12 +13,11 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
*************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using Microsoft.CodeAnalysis;
|
||||
|
||||
namespace SourceGeneration
|
||||
namespace SerializationGenerator
|
||||
{
|
||||
public static partial class SymbolMetadata
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue