Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<PackageVersion Include="Microsoft.VisualStudio.Threading.Only" Version="$(VisualStudioThreadingVersion)" />
<PackageVersion Include="Microsoft.VisualStudio.Threading" Version="$(VisualStudioThreadingVersion)" />
<PackageVersion Include="Microsoft.VisualStudio.Validation" Version="17.13.22" />
<PackageVersion Include="Nerdbank.MessagePack" Version="0.12.28-rc" />
<PackageVersion Include="Nerdbank.MessagePack" Version="0.12.39-rc" />
<PackageVersion Include="Nerdbank.Streams" Version="2.13.16" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="System.Collections.Immutable" Version="8.0.0" />
Expand Down
13 changes: 8 additions & 5 deletions src/StreamJsonRpc/LoadableTypeCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
using System.Collections;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using Microsoft;

namespace StreamJsonRpc;

Expand Down Expand Up @@ -62,14 +60,19 @@ internal bool TryGetType(string fullName, [NotNullWhen(true), DynamicallyAccesse
return false;
}

private struct LoadableType([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type) : IEquatable<LoadableType>
private struct LoadableType : IEquatable<LoadableType>
{
public LoadableType([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type)
{
this.Type = type;
}

[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
public Type Type => type;
public Type Type { get; }

public bool Equals(LoadableType other) => this.Type == other.Type;

public override int GetHashCode() => type.GetHashCode();
public override int GetHashCode() => this.Type.GetHashCode();

public override bool Equals(object? obj) => obj is LoadableType other && this.Equals(other);
}
Expand Down
27 changes: 17 additions & 10 deletions src/StreamJsonRpc/Reflection/JsonRpcProxyMappingAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,27 @@ namespace StreamJsonRpc.Reflection;
/// An attribute that is used by our source generator to map an RPC interface to a
/// source generated proxy class.
/// </summary>
/// <param name="proxyClass">
/// The source generated proxy class.
/// This must implement the interface the attribute is applied to,
/// derive from <see cref="ProxyBase"/>,
/// and declare a public constructor with a particular signature.
/// </param>
[AttributeUsage(AttributeTargets.Interface, AllowMultiple = true)]
[EditorBrowsable(EditorBrowsableState.Never)]
public class JsonRpcProxyMappingAttribute(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.Interfaces)] Type proxyClass) : Attribute
public class JsonRpcProxyMappingAttribute : Attribute
{
/// <summary>
/// Gets the proxy class type implements the RPC interface.
/// Initializes a new instance of the <see cref="JsonRpcProxyMappingAttribute"/> class.
/// </summary>
/// <param name="proxyClass">
/// The source generated proxy class.
/// This must implement the interface the attribute is applied to,
/// derive from <see cref="ProxyBase"/>,
/// and declare a public constructor with a particular signature.
/// </param>
public JsonRpcProxyMappingAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.Interfaces)] Type proxyClass)
{
this.ProxyClass = proxyClass;
}

/// <summary>
/// Gets the proxy class type that implements the RPC interface.
/// </summary>
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.Interfaces)]
public Type ProxyClass => proxyClass;
public Type ProxyClass { get; }
}
9 changes: 7 additions & 2 deletions src/StreamJsonRpc/RpcTargetMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -491,10 +491,15 @@ private static IReadOnlyList<Type> GetMissingInterfacesFromSet([DynamicallyAcces

private static MethodInfo GetMethodInfo(IMethodShape shape) => (MethodInfo)(shape.MethodBase ?? throw new ArgumentException(Resources.FormatAttributeProviderRequired($"{shape.DeclaringType.Type.FullName}.{shape.Name}"), nameof(shape)));

internal struct RpcTargetInterface([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicEvents)] Type iface)
internal struct RpcTargetInterface
{
public RpcTargetInterface([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicEvents)] Type iface)
{
this.Interface = iface;
}

[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicEvents)]
public Type Interface => iface;
public Type Interface { get; }
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Import Project="..\AOT.props" />

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<TrimmerSingleWarn>false</TrimmerSingleWarn>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<EnableStreamJsonRpcInterceptors>true</EnableStreamJsonRpcInterceptors>
Expand Down