diff --git a/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/FieldSyntaxExtensions.cs b/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/FieldSyntaxExtensions.cs index 611ba44..a7d4e6f 100644 --- a/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/FieldSyntaxExtensions.cs +++ b/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/FieldSyntaxExtensions.cs @@ -17,7 +17,7 @@ internal static class FieldSyntaxExtensions internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol) { var isObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject"); - var isIObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); + var isIObservableObject = fieldSymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); var hasObservableObjectAttribute = fieldSymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute"); return isIObservableObject || isObservableObject || hasObservableObjectAttribute; @@ -31,7 +31,7 @@ internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol) internal static bool IsTargetTypeValid(this IPropertySymbol propertySymbol) { var isObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject"); - var isIObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); + var isIObservableObject = propertySymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); var hasObservableObjectAttribute = propertySymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute"); return isIObservableObject || isObservableObject || hasObservableObjectAttribute; diff --git a/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/ITypeSymbolExtensions.cs b/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/ITypeSymbolExtensions.cs index a333b0a..d946b5e 100644 --- a/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/ITypeSymbolExtensions.cs +++ b/src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/ITypeSymbolExtensions.cs @@ -37,6 +37,25 @@ public static bool InheritsFromFullyQualifiedMetadataName(this ITypeSymbol typeS return false; } + /// + /// Checks whether or not a given implements a specified interface. + /// + /// The target instance to check. + /// The full name of the interface to check for inheritance. + /// Whether or not implements . + public static bool ImplementsFullyQualifiedMetadataName(this ITypeSymbol typeSymbol, string name) + { + foreach (var implementedInterface in typeSymbol.AllInterfaces) + { + if (implementedInterface.HasFullyQualifiedMetadataName(name)) + { + return true; + } + } + + return false; + } + /// /// Checks whether or not a given has or inherits a specified attribute. /// diff --git a/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/FieldSyntaxExtensions.cs b/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/FieldSyntaxExtensions.cs index a270b11..fb62a63 100644 --- a/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/FieldSyntaxExtensions.cs +++ b/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/FieldSyntaxExtensions.cs @@ -123,7 +123,7 @@ internal static void GetNullabilityInfo( internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol) { var isObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject"); - var isIObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); + var isIObservableObject = fieldSymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); var hasObservableObjectAttribute = fieldSymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute"); return isIObservableObject || isObservableObject || hasObservableObjectAttribute; @@ -137,7 +137,7 @@ internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol) internal static bool IsTargetTypeValid(this IPropertySymbol propertySymbol) { var isObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject"); - var isIObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); + var isIObservableObject = propertySymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); var hasObservableObjectAttribute = propertySymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute"); return isIObservableObject || isObservableObject || hasObservableObjectAttribute; @@ -151,7 +151,7 @@ internal static bool IsTargetTypeValid(this IPropertySymbol propertySymbol) internal static bool IsTargetTypeValid(this IMethodSymbol methodSymbol) { var isObservableObject = methodSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject"); - var isIObservableObject = methodSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); + var isIObservableObject = methodSymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject"); var hasObservableObjectAttribute = methodSymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute"); return isIObservableObject || isObservableObject || hasObservableObjectAttribute; diff --git a/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/ITypeSymbolExtensions.cs b/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/ITypeSymbolExtensions.cs index f3f10a6..2c7b853 100644 --- a/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/ITypeSymbolExtensions.cs +++ b/src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/ITypeSymbolExtensions.cs @@ -56,6 +56,25 @@ public static bool InheritsFromFullyQualifiedMetadataName(this ITypeSymbol typeS return false; } + /// + /// Checks whether or not a given implements a specified interface. + /// + /// The target instance to check. + /// The full name of the interface to check for inheritance. + /// Whether or not implements . + public static bool ImplementsFullyQualifiedMetadataName(this ITypeSymbol typeSymbol, string name) + { + foreach (var implementedInterface in typeSymbol.AllInterfaces) + { + if (implementedInterface.HasFullyQualifiedMetadataName(name)) + { + return true; + } + } + + return false; + } + /// /// Checks whether or not a given has or inherits from a specified type. ///