コード例 #1
0
ファイル: CommandClass.cs プロジェクト: GGG-KILLER/Tsu
 /// <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;
 }
コード例 #2
0
ファイル: CommandClass.cs プロジェクト: GGG-KILLER/Tsu
        /// <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));
        }
コード例 #3
0
        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));
                        }
                    }
                }
            }
        }