@@ -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 )
0 commit comments