/// <summary> /// Initializes a new command class /// </summary> /// <param name="commandManager"></param> /// <param name="classSymbol"></param> /// <param name="attributeSyntax"></param> /// <param name="verb"></param> private CommandClass( CommandManagerClass commandManager, INamedTypeSymbol classSymbol, AttributeSyntax attributeSyntax, string? verb = null) { CommandManager = commandManager ?? throw new ArgumentNullException(nameof(commandManager)); ClassSymbol = classSymbol ?? throw new ArgumentNullException(nameof(classSymbol)); AttributeSyntax = attributeSyntax ?? throw new ArgumentNullException(nameof(attributeSyntax)); Verb = verb; }
/// <summary> /// Attempts to create a new <see cref="CommandClass" />. /// </summary> /// <param name="commandManager"></param> /// <param name="classSymbol"></param> /// <param name="attributeSyntax"></param> /// <param name="verb"></param> /// <returns></returns> public static Result<CommandClass, Diagnostic> Create( CommandManagerClass commandManager, INamedTypeSymbol classSymbol, AttributeSyntax attributeSyntax, string? verb = null) { if (verb is not null && string.IsNullOrWhiteSpace(verb)) { return Result.Err<CommandClass, Diagnostic>(Diagnostic.Create( DiagnosticDescriptors.InvalidVerbPassedToCommandManagerAttribute, attributeSyntax.GetLocation())); } return Result.Ok<CommandClass, Diagnostic>(new CommandClass( commandManager, classSymbol, attributeSyntax, verb)); }
public void Execute(GeneratorExecutionContext context) { var commonSymbols = new CommonSymbols(context.Compilation); var commandManagetAttributeCode = SourceText.From(CodeConstants.CommandManagerAttribute.Code, Encoding.UTF8); context.AddSource(CodeConstants.CommandManagerAttribute.CodeFileName, commandManagetAttributeCode); if (context.SyntaxReceiver is SyntaxReceiver receiver) { foreach (var commandManagerDeclaration in receiver.CommandManagerClasses) { var commandManagerClass = CommandManagerClass.Initialize( context.Compilation, context.Compilation.GetSemanticModel(commandManagerDeclaration.SyntaxTree), commandManagerDeclaration, commonSymbols, context.CancellationToken); if (commandManagerClass.IsErr) { context.ReportDiagnostic(commandManagerClass.Err.Value); } else { var code = commandManagerClass.Ok.Value.GenerateCommandManager(); if (code.IsErr) { context.ReportDiagnostic(code.Err.Value); } else { var managerName = commandManagerDeclaration.Identifier.ValueText; context.AddSource($"{managerName}.GeneratedCommandManager.cs", SourceText.From(code.Ok.Value, Encoding.UTF8)); } } } } }