Skip to content

Commit 0c34c68

Browse files
committed
s
1 parent 7b78cc9 commit 0c34c68

File tree

2 files changed

+88
-56
lines changed

2 files changed

+88
-56
lines changed

src/ConsoleAppFramework/ConsoleAppGenerator.cs

Lines changed: 68 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -817,35 +817,40 @@ public static bool DelegateEquals(InvocationExpressionSyntax node, SemanticModel
817817
{
818818
if (methodSymbols2.Length > 0 && methodSymbols2[0] is IMethodSymbol methodSymbol2)
819819
{
820-
var syntax1 = FunctionSyntax.From(methodSymbol1.DeclaringSyntaxReferences[0].GetSyntax());
821-
var syntax2 = FunctionSyntax.From(methodSymbol2.DeclaringSyntaxReferences[0].GetSyntax());
822-
if (syntax1 == null || syntax2 == null) return false;
820+
return MethodSymbolEquals(methodSymbol1, methodSymbol2);
821+
}
822+
}
823+
}
823824

824-
// document comment
825-
if (!SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.GetDocumentationCommentTriviaSyntax()!, syntax2.GetDocumentationCommentTriviaSyntax()!))
826-
{
827-
return false;
828-
}
825+
return false;
826+
}
829827

830-
// return type
831-
if (!SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.ReturnType, syntax2.ReturnType))
832-
{
833-
return false;
834-
}
828+
public static bool MethodSymbolEquals(IMethodSymbol methodSymbol1, IMethodSymbol methodSymbol2)
829+
{
830+
var syntax1 = FunctionSyntax.From(methodSymbol1.DeclaringSyntaxReferences[0].GetSyntax());
831+
var syntax2 = FunctionSyntax.From(methodSymbol2.DeclaringSyntaxReferences[0].GetSyntax());
832+
if (syntax1 == null || syntax2 == null) return false;
835833

836-
// attributes
837-
if (!SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.AttributeLists, syntax2.AttributeLists))
838-
{
839-
return false;
840-
}
834+
// document comment
835+
if (!SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.GetDocumentationCommentTriviaSyntax()!, syntax2.GetDocumentationCommentTriviaSyntax()!))
836+
{
837+
return false;
838+
}
841839

842-
// parameters
843-
return SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.ParameterList, syntax2.ParameterList);
844-
}
845-
}
840+
// return type
841+
if (!SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.ReturnType, syntax2.ReturnType))
842+
{
843+
return false;
846844
}
847845

848-
return false;
846+
// attributes
847+
if (!SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.AttributeLists, syntax2.AttributeLists))
848+
{
849+
return false;
850+
}
851+
852+
// parameters
853+
return SyntaxNodeTextEqualityComparer.Default.Equals(syntax1.ParameterList, syntax2.ParameterList);
849854
}
850855
}
851856

@@ -890,55 +895,62 @@ public bool Equals(BuilderContext other)
890895

891896
bool EqualsAddClass(BuilderContext other)
892897
{
893-
// Add<T>
894-
var genericName = (node.Expression as MemberAccessExpressionSyntax)?.Name as GenericNameSyntax;
895-
var genericType = genericName!.TypeArgumentList.Arguments[0];
898+
var typeAndPath1 = GetTypeSymbolAndPath(node, model);
899+
var typeAndPath2 = GetTypeSymbolAndPath(other.Node, other.Model);
896900

897-
// Add<T>(string commandPath)
898-
string? commandPath = null;
899-
var args = node.ArgumentList.Arguments;
900-
if (node.ArgumentList.Arguments.Count == 1)
901-
{
902-
var commandName = args[0];
903-
if (!commandName.Expression.IsKind(SyntaxKind.StringLiteralExpression))
904-
{
905-
//context.ReportDiagnostic(DiagnosticDescriptors.AddCommandMustBeStringLiteral, commandName.GetLocation());
906-
//return [];
907-
return false;
908-
}
901+
if (typeAndPath1 == null || typeAndPath2 == null) return false;
909902

910-
commandPath = (commandName.Expression as LiteralExpressionSyntax)!.Token.ValueText;
911-
}
903+
var (type1, path1) = typeAndPath1.Value;
904+
var (type2, path2) = typeAndPath2.Value;
912905

913-
// T
914-
var type = model.GetTypeInfo(genericType).Type!;
906+
if (path1 != path2) return false;
915907

908+
// TODO:
916909

917910
// Type:Attributes
918911
// Type:Interface
919912

920913
// Public Constructor
921914

922915
// Public Methods
916+
var methods1 = GetMethodSymbols(type1);
917+
var methods2 = GetMethodSymbols(type2);
918+
return methods1.ZipEquals(methods2, RunContext.MethodSymbolEquals);
923919

924-
var publicMethods = type.GetMembers()
925-
.Where(x => x.DeclaredAccessibility == Accessibility.Public)
926-
.OfType<IMethodSymbol>()
927-
.Where(x => x.DeclaredAccessibility == Accessibility.Public && !x.IsStatic)
928-
.Where(x => x.MethodKind == Microsoft.CodeAnalysis.MethodKind.Ordinary)
929-
.Where(x => !(x.Name is "Dispose" or "DisposeAsync" or "GetHashCode" or "Equals" or "ToString"))
930-
.ToArray();
931-
932-
933-
934-
935-
936-
920+
static (ITypeSymbol, string?)? GetTypeSymbolAndPath(InvocationExpressionSyntax node, SemanticModel model)
921+
{
922+
// Add<T>
923+
var genericName = (node.Expression as MemberAccessExpressionSyntax)?.Name as GenericNameSyntax;
924+
var genericType = genericName!.TypeArgumentList.Arguments[0];
937925

926+
// Add<T>(string commandPath)
927+
string? commandPath = null;
928+
var args = node.ArgumentList.Arguments;
929+
if (node.ArgumentList.Arguments.Count == 1)
930+
{
931+
var commandName = args[0];
932+
if (!commandName.Expression.IsKind(SyntaxKind.StringLiteralExpression))
933+
{
934+
return null;
935+
}
938936

937+
commandPath = (commandName.Expression as LiteralExpressionSyntax)!.Token.ValueText;
938+
}
939939

940+
// T
941+
var type = model.GetTypeInfo(genericType).Type!;
942+
return (type, commandPath);
943+
}
940944

941-
return true; // TODO:final
945+
static IEnumerable<IMethodSymbol> GetMethodSymbols(ITypeSymbol type)
946+
{
947+
return type.GetMembers()
948+
.Where(x => x.DeclaredAccessibility == Accessibility.Public)
949+
.OfType<IMethodSymbol>()
950+
.Where(x => x.DeclaredAccessibility == Accessibility.Public && !x.IsStatic)
951+
.Where(x => x.MethodKind == Microsoft.CodeAnalysis.MethodKind.Ordinary)
952+
.Where(x => !(x.Name is "Dispose" or "DisposeAsync" or "GetHashCode" or "Equals" or "ToString"));
953+
}
942954
}
943955

944956
bool EqualsUseFilter(BuilderContext other)

src/ConsoleAppFramework/RoslynExtensions.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,26 @@ public static bool EqualsNamespaceAndName(this ITypeSymbol? left, ITypeSymbol? r
4747
return (left.Name == right.Name);
4848
}
4949

50+
public static bool ZipEquals<T>(this IEnumerable<T> left, IEnumerable<T> right, Func<T, T, bool> predicate)
51+
where T : IMethodSymbol
52+
{
53+
using var e1 = left.GetEnumerator();
54+
using var e2 = right.GetEnumerator();
55+
while (true)
56+
{
57+
var b1 = e1.MoveNext();
58+
var b2 = e2.MoveNext();
59+
60+
if (b1 != b2) return false; // different sequence length, ng
61+
if (b1 == false) return true; // both false, ok
62+
63+
if (!predicate(e1.Current, e2.Current))
64+
{
65+
return false;
66+
}
67+
}
68+
}
69+
5070
public static DocumentationCommentTriviaSyntax? GetDocumentationCommentTriviaSyntax(this SyntaxNode node)
5171
{
5272
// Hack note:

0 commit comments

Comments
 (0)