Skip to content

Commit 1e6657b

Browse files
authored
Fix support for classes implementing IReactiveObject without inheriting from ReactiveObject (#225)
fix support for classes that implement IReactiveObject without inheriting from ReactiveObject
1 parent f7eca5c commit 1e6657b

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/FieldSyntaxExtensions.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ internal static class FieldSyntaxExtensions
1717
internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol)
1818
{
1919
var isObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject");
20-
var isIObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
20+
var isIObservableObject = fieldSymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
2121
var hasObservableObjectAttribute = fieldSymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute");
2222

2323
return isIObservableObject || isObservableObject || hasObservableObjectAttribute;
@@ -31,7 +31,7 @@ internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol)
3131
internal static bool IsTargetTypeValid(this IPropertySymbol propertySymbol)
3232
{
3333
var isObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject");
34-
var isIObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
34+
var isIObservableObject = propertySymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
3535
var hasObservableObjectAttribute = propertySymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute");
3636

3737
return isIObservableObject || isObservableObject || hasObservableObjectAttribute;

src/ReactiveUI.SourceGenerators.Analyzers.CodeFixes/Core/Extensions/ITypeSymbolExtensions.cs

+19
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,25 @@ public static bool InheritsFromFullyQualifiedMetadataName(this ITypeSymbol typeS
3737
return false;
3838
}
3939

40+
/// <summary>
41+
/// Checks whether or not a given <see cref="ITypeSymbol"/> implements a specified interface.
42+
/// </summary>
43+
/// <param name="typeSymbol">The target <see cref="ITypeSymbol"/> instance to check.</param>
44+
/// <param name="name">The full name of the interface to check for inheritance.</param>
45+
/// <returns>Whether or not <paramref name="typeSymbol"/> implements <paramref name="name"/>.</returns>
46+
public static bool ImplementsFullyQualifiedMetadataName(this ITypeSymbol typeSymbol, string name)
47+
{
48+
foreach (var implementedInterface in typeSymbol.AllInterfaces)
49+
{
50+
if (implementedInterface.HasFullyQualifiedMetadataName(name))
51+
{
52+
return true;
53+
}
54+
}
55+
56+
return false;
57+
}
58+
4059
/// <summary>
4160
/// Checks whether or not a given <see cref="ITypeSymbol"/> has or inherits a specified attribute.
4261
/// </summary>

src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/FieldSyntaxExtensions.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ internal static void GetNullabilityInfo(
123123
internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol)
124124
{
125125
var isObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject");
126-
var isIObservableObject = fieldSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
126+
var isIObservableObject = fieldSymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
127127
var hasObservableObjectAttribute = fieldSymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute");
128128

129129
return isIObservableObject || isObservableObject || hasObservableObjectAttribute;
@@ -137,7 +137,7 @@ internal static bool IsTargetTypeValid(this IFieldSymbol fieldSymbol)
137137
internal static bool IsTargetTypeValid(this IPropertySymbol propertySymbol)
138138
{
139139
var isObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject");
140-
var isIObservableObject = propertySymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
140+
var isIObservableObject = propertySymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
141141
var hasObservableObjectAttribute = propertySymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute");
142142

143143
return isIObservableObject || isObservableObject || hasObservableObjectAttribute;
@@ -151,7 +151,7 @@ internal static bool IsTargetTypeValid(this IPropertySymbol propertySymbol)
151151
internal static bool IsTargetTypeValid(this IMethodSymbol methodSymbol)
152152
{
153153
var isObservableObject = methodSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.ReactiveObject");
154-
var isIObservableObject = methodSymbol.ContainingType.InheritsFromFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
154+
var isIObservableObject = methodSymbol.ContainingType.ImplementsFullyQualifiedMetadataName("ReactiveUI.IReactiveObject");
155155
var hasObservableObjectAttribute = methodSymbol.ContainingType.HasOrInheritsAttributeWithFullyQualifiedMetadataName("ReactiveUI.SourceGenerators.ReactiveObjectAttribute");
156156

157157
return isIObservableObject || isObservableObject || hasObservableObjectAttribute;

src/ReactiveUI.SourceGenerators.Roslyn/Core/Extensions/ITypeSymbolExtensions.cs

+19
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,25 @@ public static bool InheritsFromFullyQualifiedMetadataName(this ITypeSymbol typeS
5656
return false;
5757
}
5858

59+
/// <summary>
60+
/// Checks whether or not a given <see cref="ITypeSymbol"/> implements a specified interface.
61+
/// </summary>
62+
/// <param name="typeSymbol">The target <see cref="ITypeSymbol"/> instance to check.</param>
63+
/// <param name="name">The full name of the interface to check for inheritance.</param>
64+
/// <returns>Whether or not <paramref name="typeSymbol"/> implements <paramref name="name"/>.</returns>
65+
public static bool ImplementsFullyQualifiedMetadataName(this ITypeSymbol typeSymbol, string name)
66+
{
67+
foreach (var implementedInterface in typeSymbol.AllInterfaces)
68+
{
69+
if (implementedInterface.HasFullyQualifiedMetadataName(name))
70+
{
71+
return true;
72+
}
73+
}
74+
75+
return false;
76+
}
77+
5978
/// <summary>
6079
/// Checks whether or not a given <see cref="ITypeSymbol"/> has or inherits from a specified type.
6180
/// </summary>

0 commit comments

Comments
 (0)