- fix for issue #33

- turn on XML documentation generator
- documentation fixes
This commit is contained in:
Christian Köllner 2019-12-11 21:09:43 +01:00
parent 5f97d69f79
commit 982eaa10dd
10 changed files with 78 additions and 10 deletions

View File

@ -20,6 +20,7 @@
<PackageTags>capnp "Cap'n Proto" RPC serialization cerealization</PackageTags> <PackageTags>capnp "Cap'n Proto" RPC serialization cerealization</PackageTags>
<Version>1.2-local$([System.DateTime]::UtcNow.ToString(yyMMddHHmm))</Version> <Version>1.2-local$([System.DateTime]::UtcNow.ToString(yyMMddHHmm))</Version>
<Configurations>Debug;Release</Configurations> <Configurations>Debug;Release</Configurations>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Debug'"> <PropertyGroup Condition="'$(Configuration)'=='Debug'">

View File

@ -186,6 +186,10 @@ namespace Capnp
} }
} }
/// <summary>
/// Attaches an observer for tracing RPC traffic
/// </summary>
/// <param name="tracer">observer implementation</param>
public void AttachTracer(IFrameTracer tracer) public void AttachTracer(IFrameTracer tracer)
{ {
_tracers.Add(tracer); _tracers.Add(tracer);

View File

@ -1,17 +1,33 @@
using System; using System;
using System.Collections.Generic;
using System.Text;
namespace Capnp.FrameTracing namespace Capnp.FrameTracing
{ {
/// <summary>
/// Send or receive
/// </summary>
public enum FrameDirection public enum FrameDirection
{ {
/// <summary>
/// Receive direction
/// </summary>
Rx, Rx,
/// <summary>
/// Send direction
/// </summary>
Tx Tx
} }
/// <summary>
/// Client interface for observing RPC traffic
/// </summary>
public interface IFrameTracer: IDisposable public interface IFrameTracer: IDisposable
{ {
/// <summary>
/// Called whenever an RPC frame was sent or received
/// </summary>
/// <param name="direction">frame direction</param>
/// <param name="frame">actual frame</param>
void TraceFrame(FrameDirection direction, WireFrame frame); void TraceFrame(FrameDirection direction, WireFrame frame);
} }
} }

View File

@ -8,6 +8,9 @@ using System.Threading;
namespace Capnp.FrameTracing namespace Capnp.FrameTracing
{ {
/// <summary>
/// Default implementation of an RPC observer
/// </summary>
public class RpcFrameTracer : IFrameTracer public class RpcFrameTracer : IFrameTracer
{ {
const string Header = "Ticks | Thread | Dir | Message"; const string Header = "Ticks | Thread | Dir | Message";
@ -16,12 +19,19 @@ namespace Capnp.FrameTracing
readonly Stopwatch _timer = new Stopwatch(); readonly Stopwatch _timer = new Stopwatch();
readonly TextWriter _traceWriter; readonly TextWriter _traceWriter;
/// <summary>
/// Constructs an instance
/// </summary>
/// <param name="traceWriter">textual logging target</param>
public RpcFrameTracer(TextWriter traceWriter) public RpcFrameTracer(TextWriter traceWriter)
{ {
_traceWriter = traceWriter ?? throw new ArgumentNullException(nameof(traceWriter)); _traceWriter = traceWriter ?? throw new ArgumentNullException(nameof(traceWriter));
_traceWriter.WriteLine(Header); _traceWriter.WriteLine(Header);
} }
/// <summary>
/// Dispose pattern implementation
/// </summary>
public void Dispose() public void Dispose()
{ {
_traceWriter.WriteLine("<end of trace>"); _traceWriter.WriteLine("<end of trace>");
@ -91,6 +101,11 @@ namespace Capnp.FrameTracing
} }
} }
/// <summary>
/// Processes a sent or received RPC frame
/// </summary>
/// <param name="dir">frame direction</param>
/// <param name="frame">actual frame</param>
public void TraceFrame(FrameDirection dir, WireFrame frame) public void TraceFrame(FrameDirection dir, WireFrame frame)
{ {
if (!_timer.IsRunning) if (!_timer.IsRunning)

View File

@ -43,7 +43,6 @@
/// <param name="interfaceId">Target interface ID</param> /// <param name="interfaceId">Target interface ID</param>
/// <param name="methodId">Target method ID</param> /// <param name="methodId">Target method ID</param>
/// <param name="args">Method arguments</param> /// <param name="args">Method arguments</param>
/// <param name="tailCall">Whether it is a tail call</param>
/// <returns>Answer promise</returns> /// <returns>Answer promise</returns>
public IPromisedAnswer Call(ulong interfaceId, ushort methodId, DynamicSerializerState args) public IPromisedAnswer Call(ulong interfaceId, ushort methodId, DynamicSerializerState args)
{ {

View File

@ -281,7 +281,6 @@ namespace Capnp.Rpc.Interception
/// <summary> /// <summary>
/// Forwards this intercepted call to the target capability ("Bob"). /// Forwards this intercepted call to the target capability ("Bob").
/// </summary> /// </summary>
/// <param name="cancellationToken">Optional cancellation token, requesting Bob to cancel the call</param>
public void ForwardToBob() public void ForwardToBob()
{ {
if (Bob == null) if (Bob == null)

View File

@ -4,16 +4,24 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
namespace Capnp.Rpc namespace Capnp.Rpc
{ {
/// <summary>
/// Carries information on RPC connection state changes.
/// </summary>
public class ConnectionEventArgs: EventArgs public class ConnectionEventArgs: EventArgs
{ {
/// <summary>
/// Affected connection
/// </summary>
public IConnection Connection { get; } public IConnection Connection { get; }
/// <summary>
/// Constructs an instance
/// </summary>
/// <param name="connection">RPC connection object</param>
public ConnectionEventArgs(IConnection connection) public ConnectionEventArgs(IConnection connection)
{ {
Connection = connection; Connection = connection;

View File

@ -9015,7 +9015,7 @@ namespace Capnproto_test.Capnp.Test
where TT : class where TU : class where TT : class where TU : class
{ {
var in_ = CapnpSerializable.Create<Capnproto_test.Capnp.Test.TestImplicitMethodParams.Params_call<TT, TU>>(d_); var in_ = CapnpSerializable.Create<Capnproto_test.Capnp.Test.TestImplicitMethodParams.Params_call<TT, TU>>(d_);
return Impatient.MaybeTailCall(Impl.Call(in_.Foo, in_.Bar, cancellationToken_), r_ => return Impatient.MaybeTailCall(Impl.Call<TT, TU>(in_.Foo, in_.Bar, cancellationToken_), r_ =>
{ {
var s_ = SerializerState.CreateForRpc<Capnproto_test.Capnp.Test.TestGenerics<TT, TU>.WRITER>(); var s_ = SerializerState.CreateForRpc<Capnproto_test.Capnp.Test.TestGenerics<TT, TU>.WRITER>();
r_.serialize(s_); r_.serialize(s_);
@ -9142,7 +9142,7 @@ namespace Capnproto_test.Capnp.Test
where TT : class where TU : class where TT : class where TU : class
{ {
var in_ = CapnpSerializable.Create<Capnproto_test.Capnp.Test.TestImplicitMethodParamsInGeneric<TV>.Params_call<TT, TU>>(d_); var in_ = CapnpSerializable.Create<Capnproto_test.Capnp.Test.TestImplicitMethodParamsInGeneric<TV>.Params_call<TT, TU>>(d_);
return Impatient.MaybeTailCall(Impl.Call(in_.Foo, in_.Bar, cancellationToken_), r_ => return Impatient.MaybeTailCall(Impl.Call<TT, TU>(in_.Foo, in_.Bar, cancellationToken_), r_ =>
{ {
var s_ = SerializerState.CreateForRpc<Capnproto_test.Capnp.Test.TestGenerics<TT, TU>.WRITER>(); var s_ = SerializerState.CreateForRpc<Capnproto_test.Capnp.Test.TestGenerics<TT, TU>.WRITER>();
r_.serialize(s_); r_.serialize(s_);

View File

@ -551,11 +551,26 @@ namespace CapnpC.CSharp.Generator.CodeGen
IEnumerable<StatementSyntax> MakeSkeletonMethodBody(Method method) IEnumerable<StatementSyntax> MakeSkeletonMethodBody(Method method)
{ {
SimpleNameSyntax methodName;
if (method.GenericParameters.Count == 0)
{
methodName = _names.GetCodeIdentifier(method).IdentifierName;
}
else
{
methodName = GenericName(_names.GetCodeIdentifier(method).Identifier)
.AddTypeArgumentListArguments(
method.GenericParameters.Select(
p => _names.GetGenericTypeParameter(p).IdentifierName)
.ToArray());
}
var call = InvocationExpression( var call = InvocationExpression(
MemberAccessExpression( MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, SyntaxKind.SimpleMemberAccessExpression,
IdentifierName(SkeletonWorder.ImplName), IdentifierName(SkeletonWorder.ImplName),
_names.GetCodeIdentifier(method).IdentifierName)); methodName));
if (method.Params.Count > 0) if (method.Params.Count > 0)
{ {

View File

@ -0,0 +1,11 @@
@0xaa62d76b329585e5;
interface Frobnicator(T)
{
frobnicate @0 (value: T);
}
interface FrobnicatorFactory
{
createFrobnicator @0 [T] (id: Text) -> (result: Frobnicator(T));
}