From 4e2e44bffdcde3efb1fb65ead6fe1beb0dbe8d93 Mon Sep 17 00:00:00 2001 From: neuecc Date: Mon, 29 Jul 2024 18:02:25 +0900 Subject: [PATCH] Add validation when registered type/method is outside in generator referenced project. --- sandbox/FilterShareProject/Class1.cs | 8 +++++ sandbox/GeneratorSandbox/Program.cs | 34 +++++-------------- .../DiagnosticDescriptors.cs | 4 +++ src/ConsoleAppFramework/Parser.cs | 12 +++++++ 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/sandbox/FilterShareProject/Class1.cs b/sandbox/FilterShareProject/Class1.cs index 71077f44..8a619b7d 100644 --- a/sandbox/FilterShareProject/Class1.cs +++ b/sandbox/FilterShareProject/Class1.cs @@ -9,4 +9,12 @@ public override Task InvokeAsync(ConsoleAppContext context, CancellationToken ca Console.WriteLine("TAKO"); return Next.InvokeAsync(context, cancellationToken); } +} + +public class OtherProjectCommand +{ + public void Execute(int x) + { + Console.WriteLine("Hello?"); + } } \ No newline at end of file diff --git a/sandbox/GeneratorSandbox/Program.cs b/sandbox/GeneratorSandbox/Program.cs index 86d3911f..13cc15b9 100644 --- a/sandbox/GeneratorSandbox/Program.cs +++ b/sandbox/GeneratorSandbox/Program.cs @@ -1,40 +1,22 @@ using ConsoleAppFramework; +using FilterShareProject; -var t = new Test(); var app = ConsoleApp.Create(); -app.Add("foo", t.Handle); +var v = new OtherProjectCommand(); +// app.Add("", v.Execute); +app.Add(); app.Run(args); -public partial class Test + +public class MyProjectCommand { - public void Handle( - bool a1, - bool a2, - bool a3, - bool a4, - bool a5, - bool a6, - bool a7, - bool a8, - bool a9, - bool a10, - bool a11, - bool a12, - bool a13, - bool a14, - bool a15, - bool a16, - bool a17, - bool a18, - bool a19, - string foo = null - ) + public void Execute(int x) { - Console.Write("ok"); + Console.WriteLine("Hello?"); } } \ No newline at end of file diff --git a/src/ConsoleAppFramework/DiagnosticDescriptors.cs b/src/ConsoleAppFramework/DiagnosticDescriptors.cs index 2d4c2fe6..43f39ef0 100644 --- a/src/ConsoleAppFramework/DiagnosticDescriptors.cs +++ b/src/ConsoleAppFramework/DiagnosticDescriptors.cs @@ -110,4 +110,8 @@ public static DiagnosticDescriptor Create(int id, string title, string messageFo public static DiagnosticDescriptor ClassIsStaticOrAbstract { get; } = Create( 13, "ConsoleAppBuilder.Add class does not allow static or abstract classes."); + + public static DiagnosticDescriptor DefinedInOtherProject { get; } = Create( + 14, + "ConsoleAppFramework cannot register type/method in another project outside the SourceGenerator referenced project."); } diff --git a/src/ConsoleAppFramework/Parser.cs b/src/ConsoleAppFramework/Parser.cs index 4baaf672..b5476069 100644 --- a/src/ConsoleAppFramework/Parser.cs +++ b/src/ConsoleAppFramework/Parser.cs @@ -79,6 +79,12 @@ internal class Parser(DiagnosticReporter context, InvocationExpressionSyntax nod return []; } + if (type.DeclaringSyntaxReferences.Length == 0) + { + context.ReportDiagnostic(DiagnosticDescriptors.DefinedInOtherProject, node.GetLocation()); + return []; + } + var publicMethods = type.GetMembers() .Where(x => x.DeclaredAccessibility == Accessibility.Public) .OfType() @@ -381,6 +387,12 @@ internal class Parser(DiagnosticReporter context, InvocationExpressionSyntax nod Command? ParseFromMethodSymbol(IMethodSymbol methodSymbol, bool addressOf, string commandName, FilterInfo[] typeFilters) { + if (methodSymbol.DeclaringSyntaxReferences.Length == 0) + { + context.ReportDiagnostic(DiagnosticDescriptors.DefinedInOtherProject, node.GetLocation()); + return null; + } + var docComment = methodSymbol.DeclaringSyntaxReferences[0].GetSyntax().GetDocumentationCommentTriviaSyntax(); var summary = ""; Dictionary? parameterDescriptions = null;