mirror of
https://github.com/Tyrrrz/CliFx.git
synced 2025-10-25 15:19:17 +00:00
asd
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using CliFx.SourceGeneration.Utils.Extensions;
|
||||
using Microsoft.CodeAnalysis;
|
||||
|
||||
namespace CliFx.SourceGeneration.SemanticModel;
|
||||
|
||||
@@ -24,6 +26,73 @@ internal partial class CommandSymbol(
|
||||
|
||||
public IReadOnlyList<CommandOptionSymbol> Options =>
|
||||
Inputs.OfType<CommandOptionSymbol>().ToArray();
|
||||
|
||||
private string GeneratePropertyBindingInitializationCode(PropertyDescriptor property) =>
|
||||
// lang=csharp
|
||||
$$"""
|
||||
new CliFx.Schema.PropertyBinding<{{Type.FullyQualifiedName}}, {{property
|
||||
.Type
|
||||
.FullyQualifiedName}}>(
|
||||
(obj) => obj.{{property.Name}},
|
||||
(obj, value) => obj.{{property.Name}} = value
|
||||
)
|
||||
""";
|
||||
|
||||
private string GenerateSchemaInitializationCode(CommandInputSymbol input) =>
|
||||
input switch
|
||||
{
|
||||
CommandParameterSymbol parameter
|
||||
=>
|
||||
// lang=csharp
|
||||
$$"""
|
||||
new CliFx.Schema.CommandParameterSchema<{{Type.FullyQualifiedName}}, {{parameter
|
||||
.Property
|
||||
.Type
|
||||
.FullyQualifiedName}}>(
|
||||
{{GeneratePropertyBindingInitializationCode(parameter.Property)}},
|
||||
{{parameter.IsSequence}},
|
||||
{{parameter.Order}},
|
||||
"{{parameter.Name}}",
|
||||
{{parameter.IsRequired}},
|
||||
"{{parameter.Description}}",
|
||||
// TODO,
|
||||
// TODO
|
||||
);
|
||||
""",
|
||||
CommandOptionSymbol option
|
||||
=>
|
||||
// lang=csharp
|
||||
$$"""
|
||||
new CliFx.Schema.CommandOptionSchema<{{Type.FullyQualifiedName}}, {{option
|
||||
.Property
|
||||
.Type
|
||||
.FullyQualifiedName}}>(
|
||||
{{GeneratePropertyBindingInitializationCode(option.Property)}},
|
||||
{{option.IsSequence}},
|
||||
"{{option.Name}}",
|
||||
'{{option.ShortName}}',
|
||||
"{{option.EnvironmentVariable}}",
|
||||
{{option.IsRequired}},
|
||||
"{{option.Description}}",
|
||||
// TODO,
|
||||
// TODO
|
||||
);
|
||||
""",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(input), input, null)
|
||||
};
|
||||
|
||||
public string GenerateSchemaInitializationCode() =>
|
||||
// lang=csharp
|
||||
$$"""
|
||||
new CliFx.Schema.CommandSchema<{{Type.FullyQualifiedName}}>(
|
||||
"{{Name}}",
|
||||
"{{Description}}",
|
||||
new CliFx.Schema.CommandInputSchema[]
|
||||
{
|
||||
{{Inputs.Select(GenerateSchemaInitializationCode).JoinToString(",\n")}}
|
||||
}
|
||||
)
|
||||
""";
|
||||
}
|
||||
|
||||
internal partial class CommandSymbol : IEquatable<CommandSymbol>
|
||||
@@ -55,3 +124,44 @@ internal partial class CommandSymbol : IEquatable<CommandSymbol>
|
||||
|
||||
public override int GetHashCode() => HashCode.Combine(Type, Name, Description, Inputs);
|
||||
}
|
||||
|
||||
internal partial class CommandSymbol
|
||||
{
|
||||
public static CommandSymbol FromSymbol(INamedTypeSymbol symbol, AttributeData attribute)
|
||||
{
|
||||
var inputs = new List<CommandInputSymbol>();
|
||||
foreach (var property in symbol.GetMembers().OfType<IPropertySymbol>())
|
||||
{
|
||||
var parameterAttribute = property
|
||||
.GetAttributes()
|
||||
.FirstOrDefault(a =>
|
||||
a.AttributeClass?.Name == KnownSymbolNames.CliFxCommandParameterAttribute
|
||||
);
|
||||
|
||||
if (parameterAttribute is not null)
|
||||
{
|
||||
inputs.Add(CommandParameterSymbol.FromSymbol(property, parameterAttribute));
|
||||
continue;
|
||||
}
|
||||
|
||||
var optionAttribute = property
|
||||
.GetAttributes()
|
||||
.FirstOrDefault(a =>
|
||||
a.AttributeClass?.Name == KnownSymbolNames.CliFxCommandOptionAttribute
|
||||
);
|
||||
|
||||
if (optionAttribute is not null)
|
||||
{
|
||||
inputs.Add(CommandOptionSymbol.FromSymbol(property, optionAttribute));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return new CommandSymbol(
|
||||
TypeDescriptor.FromSymbol(symbol),
|
||||
attribute.ConstructorArguments.FirstOrDefault().Value as string,
|
||||
attribute.GetNamedArgumentValue("Description", default(string)),
|
||||
inputs
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user