mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-11 17:58:26 -04:00
Fixed around 140 wrong namings and other refactorings which were marked as warnings
This commit is contained in:
@@ -6,7 +6,6 @@ using Microsoft.CodeAnalysis;
|
||||
using Microsoft.CodeAnalysis.CSharp;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Microsoft.CodeAnalysis.Text;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -16,71 +15,69 @@ namespace Cloneable
|
||||
[Generator]
|
||||
public class CloneableGenerator : ISourceGenerator
|
||||
{
|
||||
private const string PreventDeepCopyKeyString = "PreventDeepCopy";
|
||||
private const string ExplicitDeclarationKeyString = "ExplicitDeclaration";
|
||||
private const string PREVENT_DEEP_COPY_KEY_STRING = "PreventDeepCopy";
|
||||
private const string EXPLICIT_DECLARATION_KEY_STRING = "ExplicitDeclaration";
|
||||
|
||||
private const string CloneableNamespace = "Cloneable";
|
||||
private const string CloneableAttributeString = "CloneableAttribute";
|
||||
private const string CloneAttributeString = "CloneAttribute";
|
||||
private const string IgnoreCloneAttributeString = "IgnoreCloneAttribute";
|
||||
private const string CLONEABLE_NAMESPACE = "Cloneable";
|
||||
private const string CLONEABLE_ATTRIBUTE_STRING = "CloneableAttribute";
|
||||
private const string CLONE_ATTRIBUTE_STRING = "CloneAttribute";
|
||||
private const string IGNORE_CLONE_ATTRIBUTE_STRING = "IgnoreCloneAttribute";
|
||||
|
||||
private const string cloneableAttributeText = @"// <AutoGenerated/>
|
||||
private const string CLONEABLE_ATTRIBUTE_TEXT = @"// <AutoGenerated/>
|
||||
using System;
|
||||
|
||||
namespace " + CloneableNamespace + @"
|
||||
namespace " + CLONEABLE_NAMESPACE + @"
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = true, AllowMultiple = false)]
|
||||
public sealed class " + CloneableAttributeString + @" : Attribute
|
||||
public sealed class " + CLONEABLE_ATTRIBUTE_STRING + @" : Attribute
|
||||
{
|
||||
public " + CloneableAttributeString + @"()
|
||||
public " + CLONEABLE_ATTRIBUTE_STRING + @"()
|
||||
{
|
||||
}
|
||||
|
||||
public bool " + ExplicitDeclarationKeyString + @" { get; set; }
|
||||
public bool " + EXPLICIT_DECLARATION_KEY_STRING + @" { get; set; }
|
||||
}
|
||||
}
|
||||
";
|
||||
|
||||
private const string clonePropertyAttributeText = @"// <AutoGenerated/>
|
||||
private const string CLONE_PROPERTY_ATTRIBUTE_TEXT = @"// <AutoGenerated/>
|
||||
using System;
|
||||
|
||||
namespace " + CloneableNamespace + @"
|
||||
namespace " + CLONEABLE_NAMESPACE + @"
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
|
||||
public sealed class " + CloneAttributeString + @" : Attribute
|
||||
public sealed class " + CLONE_ATTRIBUTE_STRING + @" : Attribute
|
||||
{
|
||||
public " + CloneAttributeString + @"()
|
||||
public " + CLONE_ATTRIBUTE_STRING + @"()
|
||||
{
|
||||
}
|
||||
|
||||
public bool " + PreventDeepCopyKeyString + @" { get; set; }
|
||||
public bool " + PREVENT_DEEP_COPY_KEY_STRING + @" { get; set; }
|
||||
}
|
||||
}
|
||||
";
|
||||
|
||||
private const string ignoreClonePropertyAttributeText = @"// <AutoGenerated/>
|
||||
private const string IGNORE_CLONE_PROPERTY_ATTRIBUTE_TEXT = @"// <AutoGenerated/>
|
||||
using System;
|
||||
|
||||
namespace " + CloneableNamespace + @"
|
||||
namespace " + CLONEABLE_NAMESPACE + @"
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
|
||||
public sealed class " + IgnoreCloneAttributeString + @" : Attribute
|
||||
public sealed class " + IGNORE_CLONE_ATTRIBUTE_STRING + @" : Attribute
|
||||
{
|
||||
public " + IgnoreCloneAttributeString + @"()
|
||||
public " + IGNORE_CLONE_ATTRIBUTE_STRING + @"()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
";
|
||||
|
||||
private INamedTypeSymbol? cloneableAttribute;
|
||||
private INamedTypeSymbol? ignoreCloneAttribute;
|
||||
private INamedTypeSymbol? cloneAttribute;
|
||||
private INamedTypeSymbol? _cloneableAttribute;
|
||||
private INamedTypeSymbol? _ignoreCloneAttribute;
|
||||
private INamedTypeSymbol? _cloneAttribute;
|
||||
|
||||
public void Initialize(GeneratorInitializationContext context)
|
||||
{
|
||||
context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());
|
||||
}
|
||||
=> context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());
|
||||
|
||||
public void Execute(GeneratorExecutionContext context)
|
||||
{
|
||||
@@ -100,36 +97,36 @@ namespace " + CloneableNamespace + @"
|
||||
var classSymbols = GetClassSymbols(compilation, receiver);
|
||||
foreach (var classSymbol in classSymbols)
|
||||
{
|
||||
if (!classSymbol.TryGetAttribute(cloneableAttribute!, out var attributes))
|
||||
if (!classSymbol.TryGetAttribute(_cloneableAttribute!, out var attributes))
|
||||
continue;
|
||||
|
||||
var attribute = attributes.Single();
|
||||
var isExplicit = (bool?)attribute.NamedArguments.FirstOrDefault(e => e.Key.Equals(ExplicitDeclarationKeyString)).Value.Value ?? false;
|
||||
var isExplicit = (bool?)attribute.NamedArguments.FirstOrDefault(e => e.Key.Equals(EXPLICIT_DECLARATION_KEY_STRING)).Value.Value ?? false;
|
||||
context.AddSource($"{classSymbol.Name}_cloneable.g.cs", SourceText.From(CreateCloneableCode(classSymbol, isExplicit), Encoding.UTF8));
|
||||
}
|
||||
}
|
||||
|
||||
private void InitAttributes(Compilation compilation)
|
||||
{
|
||||
cloneableAttribute = compilation.GetTypeByMetadataName($"{CloneableNamespace}.{CloneableAttributeString}")!;
|
||||
cloneAttribute = compilation.GetTypeByMetadataName($"{CloneableNamespace}.{CloneAttributeString}")!;
|
||||
ignoreCloneAttribute = compilation.GetTypeByMetadataName($"{CloneableNamespace}.{IgnoreCloneAttributeString}")!;
|
||||
_cloneableAttribute = compilation.GetTypeByMetadataName($"{CLONEABLE_NAMESPACE}.{CLONEABLE_ATTRIBUTE_STRING}")!;
|
||||
_cloneAttribute = compilation.GetTypeByMetadataName($"{CLONEABLE_NAMESPACE}.{CLONE_ATTRIBUTE_STRING}")!;
|
||||
_ignoreCloneAttribute = compilation.GetTypeByMetadataName($"{CLONEABLE_NAMESPACE}.{IGNORE_CLONE_ATTRIBUTE_STRING}")!;
|
||||
}
|
||||
|
||||
private static Compilation GetCompilation(GeneratorExecutionContext context)
|
||||
{
|
||||
var options = context.Compilation.SyntaxTrees.First().Options as CSharpParseOptions;
|
||||
|
||||
var compilation = context.Compilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(cloneableAttributeText, Encoding.UTF8), options)).
|
||||
AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(clonePropertyAttributeText, Encoding.UTF8), options)).
|
||||
AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(ignoreClonePropertyAttributeText, Encoding.UTF8), options));
|
||||
var compilation = context.Compilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(CLONEABLE_ATTRIBUTE_TEXT, Encoding.UTF8), options)).
|
||||
AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(CLONE_PROPERTY_ATTRIBUTE_TEXT, Encoding.UTF8), options)).
|
||||
AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(IGNORE_CLONE_PROPERTY_ATTRIBUTE_TEXT, Encoding.UTF8), options));
|
||||
return compilation;
|
||||
}
|
||||
|
||||
private string CreateCloneableCode(INamedTypeSymbol classSymbol, bool isExplicit)
|
||||
{
|
||||
string namespaceName = classSymbol.ContainingNamespace.ToDisplayString();
|
||||
var fieldAssignmentsCode = GenerateFieldAssignmentsCode(classSymbol, isExplicit);
|
||||
var fieldAssignmentsCode = GenerateFieldAssignmentsCode(classSymbol, isExplicit).ToList();
|
||||
var fieldAssignmentsCodeSafe = fieldAssignmentsCode.Select(x =>
|
||||
{
|
||||
if (x.isCloneable)
|
||||
@@ -187,9 +184,9 @@ namespace {namespaceName}
|
||||
{
|
||||
var fieldNames = GetCloneableProperties(classSymbol, isExplicit);
|
||||
|
||||
var fieldAssignments = fieldNames.Select(field => IsFieldCloneable(field, classSymbol)).
|
||||
OrderBy(x => x.isCloneable).
|
||||
Select(x => (GenerateAssignmentCode(x.item.Name, x.isCloneable), x.isCloneable));
|
||||
var fieldAssignments = fieldNames.Select(field => IsFieldCloneable(field, classSymbol))
|
||||
.OrderBy(x => x.isCloneable)
|
||||
.Select(x => (GenerateAssignmentCode(x.item.Name, x.isCloneable), x.isCloneable));
|
||||
return fieldAssignments;
|
||||
}
|
||||
|
||||
@@ -210,19 +207,17 @@ namespace {namespaceName}
|
||||
return (x, false);
|
||||
}
|
||||
|
||||
if (!x.Type.TryGetAttribute(cloneableAttribute!, out var attributes))
|
||||
if (!x.Type.TryGetAttribute(_cloneableAttribute!, out var attributes))
|
||||
{
|
||||
return (x, false);
|
||||
}
|
||||
|
||||
var preventDeepCopy = (bool?)attributes.Single().NamedArguments.FirstOrDefault(e => e.Key.Equals(PreventDeepCopyKeyString)).Value.Value ?? false;
|
||||
var preventDeepCopy = (bool?)attributes.Single().NamedArguments.FirstOrDefault(e => e.Key.Equals(PREVENT_DEEP_COPY_KEY_STRING)).Value.Value ?? false;
|
||||
return (item: x, !preventDeepCopy);
|
||||
}
|
||||
|
||||
private string GetAccessModifier(INamedTypeSymbol classSymbol)
|
||||
{
|
||||
return classSymbol.DeclaredAccessibility.ToString().ToLowerInvariant();
|
||||
}
|
||||
=> classSymbol.DeclaredAccessibility.ToString().ToLowerInvariant();
|
||||
|
||||
private IEnumerable<IPropertySymbol> GetCloneableProperties(ITypeSymbol classSymbol, bool isExplicit)
|
||||
{
|
||||
@@ -231,18 +226,16 @@ namespace {namespaceName}
|
||||
x.CanBeReferencedByName);
|
||||
if (isExplicit)
|
||||
{
|
||||
return targetSymbolMembers.Where(x => x.HasAttribute(cloneAttribute!));
|
||||
return targetSymbolMembers.Where(x => x.HasAttribute(_cloneAttribute!));
|
||||
}
|
||||
else
|
||||
{
|
||||
return targetSymbolMembers.Where(x => !x.HasAttribute(ignoreCloneAttribute!));
|
||||
return targetSymbolMembers.Where(x => !x.HasAttribute(_ignoreCloneAttribute!));
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<INamedTypeSymbol> GetClassSymbols(Compilation compilation, SyntaxReceiver receiver)
|
||||
{
|
||||
return receiver.CandidateClasses.Select(clazz => GetClassSymbol(compilation, clazz));
|
||||
}
|
||||
=> receiver.CandidateClasses.Select(clazz => GetClassSymbol(compilation, clazz));
|
||||
|
||||
private static INamedTypeSymbol GetClassSymbol(Compilation compilation, ClassDeclarationSyntax clazz)
|
||||
{
|
||||
@@ -253,9 +246,9 @@ namespace {namespaceName}
|
||||
|
||||
private static void InjectCloneableAttributes(GeneratorExecutionContext context)
|
||||
{
|
||||
context.AddSource(CloneableAttributeString, SourceText.From(cloneableAttributeText, Encoding.UTF8));
|
||||
context.AddSource(CloneAttributeString, SourceText.From(clonePropertyAttributeText, Encoding.UTF8));
|
||||
context.AddSource(IgnoreCloneAttributeString, SourceText.From(ignoreClonePropertyAttributeText, Encoding.UTF8));
|
||||
context.AddSource(CLONEABLE_ATTRIBUTE_STRING, SourceText.From(CLONEABLE_ATTRIBUTE_TEXT, Encoding.UTF8));
|
||||
context.AddSource(CLONE_ATTRIBUTE_STRING, SourceText.From(CLONE_PROPERTY_ATTRIBUTE_TEXT, Encoding.UTF8));
|
||||
context.AddSource(IGNORE_CLONE_ATTRIBUTE_STRING, SourceText.From(IGNORE_CLONE_PROPERTY_ATTRIBUTE_TEXT, Encoding.UTF8));
|
||||
}
|
||||
}
|
||||
}
|
@@ -18,9 +18,7 @@ namespace Cloneable
|
||||
}
|
||||
|
||||
public static bool HasAttribute(this ISymbol symbol, INamedTypeSymbol attributeType)
|
||||
{
|
||||
return symbol.GetAttributes()
|
||||
=> symbol.GetAttributes()
|
||||
.Any(a => SymbolEqualityComparer.Default.Equals(a.AttributeClass, attributeType));
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user