mirror of
https://github.com/Tyrrrz/CliFx.git
synced 2025-10-25 15:19:17 +00:00
91 lines
2.9 KiB
C#
91 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using CliFx.SourceGeneration.Utils.Extensions;
|
|
using Microsoft.CodeAnalysis;
|
|
|
|
namespace CliFx.SourceGeneration.SemanticModel;
|
|
|
|
internal partial class CommandOptionSymbol(
|
|
PropertyDescriptor property,
|
|
bool isSequence,
|
|
string? name,
|
|
char? shortName,
|
|
string? environmentVariable,
|
|
bool isRequired,
|
|
string? description,
|
|
TypeDescriptor? converterType,
|
|
IReadOnlyList<TypeDescriptor> validatorTypes
|
|
) : CommandInputSymbol(property, isSequence, description, converterType, validatorTypes)
|
|
{
|
|
public string? Name { get; } = name;
|
|
|
|
public char? ShortName { get; } = shortName;
|
|
|
|
public string? EnvironmentVariable { get; } = environmentVariable;
|
|
|
|
public bool IsRequired { get; } = isRequired;
|
|
}
|
|
|
|
internal partial class CommandOptionSymbol : IEquatable<CommandOptionSymbol>
|
|
{
|
|
public bool Equals(CommandOptionSymbol? other)
|
|
{
|
|
if (ReferenceEquals(null, other))
|
|
return false;
|
|
if (ReferenceEquals(this, other))
|
|
return true;
|
|
|
|
return base.Equals(other)
|
|
&& Name == other.Name
|
|
&& ShortName == other.ShortName
|
|
&& EnvironmentVariable == other.EnvironmentVariable
|
|
&& IsRequired == other.IsRequired;
|
|
}
|
|
|
|
public override bool Equals(object? obj)
|
|
{
|
|
if (ReferenceEquals(null, obj))
|
|
return false;
|
|
if (ReferenceEquals(this, obj))
|
|
return true;
|
|
if (obj.GetType() != GetType())
|
|
return false;
|
|
|
|
return Equals((CommandOptionSymbol)obj);
|
|
}
|
|
|
|
public override int GetHashCode() =>
|
|
HashCode.Combine(base.GetHashCode(), Name, ShortName, EnvironmentVariable, IsRequired);
|
|
}
|
|
|
|
internal partial class CommandOptionSymbol
|
|
{
|
|
public static CommandOptionSymbol FromSymbol(
|
|
IPropertySymbol property,
|
|
AttributeData attribute
|
|
) =>
|
|
new(
|
|
PropertyDescriptor.FromSymbol(property),
|
|
IsSequenceType(property.Type),
|
|
attribute
|
|
.ConstructorArguments.FirstOrDefault(a =>
|
|
a.Type?.SpecialType == SpecialType.System_String
|
|
)
|
|
.Value as string,
|
|
attribute
|
|
.ConstructorArguments.FirstOrDefault(a =>
|
|
a.Type?.SpecialType == SpecialType.System_Char
|
|
)
|
|
.Value as char?,
|
|
attribute.GetNamedArgumentValue("EnvironmentVariable", default(string)),
|
|
attribute.GetNamedArgumentValue("IsRequired", property.IsRequired),
|
|
attribute.GetNamedArgumentValue("Description", default(string)),
|
|
TypeDescriptor.FromSymbol(attribute.GetNamedArgumentValue<ITypeSymbol?>("Converter")),
|
|
attribute
|
|
.GetNamedArgumentValues<ITypeSymbol>("Validators")
|
|
.Select(TypeDescriptor.FromSymbol)
|
|
.ToArray()
|
|
);
|
|
}
|