IEnumerable <MethodDeclarationSyntax> GetGTypeInterfaceMethodImpls() { foreach (var f in NestedTypeInfos.Single(x => x.ManagedName == ManagedName + "Struct").FieldInfos.Where(x => x.IsCallback)) { var methodName = f.ManagedName; var returnType = f.CallbackInfo.MethodInfo.UnmanagedReturnParameterInfo.TypeInfo.Type; var method = MethodDeclaration(returnType, methodName) .AddModifiers(Token(SyntaxKind.StaticKeyword)) .WithParameterList(f.CallbackInfo.MethodInfo.UnmanagedParameterList) .WithBody(Block(f.CallbackInfo.MethodInfo.VirtualMethodImplStatements)); yield return(method); } }
IEnumerable <StatementSyntax> GetGTypeStructInterfaceInitStatements() { string statement; foreach (var f in NestedTypeInfos.Single(x => x.ManagedName == ManagedName + "Struct").FieldInfos.Where(x => x.IsCallback)) { var methodName = f.ManagedName; var delegateName = "Unmanaged" + f.CallbackInfo.ManagedName; var prefix = methodName.ToCamelCase(); var structName = ManagedName + "Struct"; statement = string.Format("var {0}Offset = {1}.OffsetOf<{2}> (nameof ({2}.{3}));\n", prefix, typeof(Marshal).FullName, structName, methodName); yield return(ParseStatement(statement)); statement = string.Format("var {0}Ptr = {1}.GetFunctionPointerForDelegate<{2}.{3}> ({4});\n", prefix, typeof(Marshal).FullName, structName, delegateName, methodName); yield return(ParseStatement(statement)); statement = string.Format("{0}.WriteIntPtr (gIface, (int){1}Offset, {1}Ptr);\n", typeof(Marshal).FullName, prefix); yield return(ParseStatement(statement)); } }