public IEnumerable <StatementSyntax> GenerateCleanupStatements(TypePositionInfo info, StubCodeContext context) => _innerMarshaller.GenerateCleanupStatements(info, context);
public IEnumerable <StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context) { // Although custom native type marshalling doesn't support [In] or [Out] by value marshalling, // other marshallers that wrap this one might, so we handle the correct cases here. switch (context.CurrentStage) { case StubCodeContext.Stage.Setup: return(_nativeTypeMarshaller.GenerateSetupStatements(info, context)); case StubCodeContext.Stage.Marshal: if (!info.IsManagedReturnPosition && info.RefKind != RefKind.Out) { return(_nativeTypeMarshaller.GenerateMarshalStatements(info, context)); } break; case StubCodeContext.Stage.Pin: if (!info.IsByRef || info.RefKind == RefKind.In) { return(_nativeTypeMarshaller.GeneratePinStatements(info, context)); } break; case StubCodeContext.Stage.PinnedMarshal: if (!info.IsManagedReturnPosition && info.RefKind != RefKind.Out) { return(_nativeTypeMarshaller.GeneratePinnedMarshalStatements(info, context)); } break; case StubCodeContext.Stage.NotifyForSuccessfulInvoke: if (!info.IsManagedReturnPosition && info.RefKind != RefKind.Out) { return(_nativeTypeMarshaller.GenerateNotifyForSuccessfulInvokeStatements(info, context)); } break; case StubCodeContext.Stage.UnmarshalCapture: if (info.IsManagedReturnPosition || (info.IsByRef && info.RefKind != RefKind.In)) { return(_nativeTypeMarshaller.GenerateUnmarshalCaptureStatements(info, context)); } break; case StubCodeContext.Stage.Unmarshal: if (info.IsManagedReturnPosition || (info.IsByRef && info.RefKind != RefKind.In) || (_enableByValueContentsMarshalling && !info.IsByRef && info.ByValueContentsMarshalKind.HasFlag(ByValueContentsMarshalKind.Out))) { return(_nativeTypeMarshaller.GenerateUnmarshalStatements(info, context)); } break; case StubCodeContext.Stage.GuaranteedUnmarshal: if (info.IsManagedReturnPosition || (info.IsByRef && info.RefKind != RefKind.In) || (_enableByValueContentsMarshalling && !info.IsByRef && info.ByValueContentsMarshalKind.HasFlag(ByValueContentsMarshalKind.Out))) { return(_nativeTypeMarshaller.GenerateGuaranteedUnmarshalStatements(info, context)); } break; case StubCodeContext.Stage.Cleanup: return(_nativeTypeMarshaller.GenerateCleanupStatements(info, context)); default: break; } return(Array.Empty <StatementSyntax>()); }