1using Microsoft.CodeAnalysis;
7public readonly
struct MethodDefWriter(IMethodSymbol symbol) :
ICodeWriter
9 public IEnumerable<WorkspaceDiagnostic> WriteTo(CodeWriter w, CodeContext ctx)
11 if (!symbol.IsTarget())
14 var intParms = symbol.Parameters.Select(parm => $
"{parm.Type.ToNativeInterfaceType()} {parm.Name}");
15 var intParmsStr =
string.Join(
", ", intParms);
17 var brParms = symbol.Parameters.Select(parm => $
"{parm.Type.ToNativeBridgeType()} {parm.Name}");
19 brParms = brParms.Prepend(
"void*");
20 var brParmsStr =
string.Join(
", ", brParms);
22 var args = symbol.Parameters.Select(parm => parm.Name);
24 args = args.Prepend(
"_handle");
25 var argsStr =
string.Join(
", ", args);
27 var delegateName = $
"__delegate{symbol.MangleName()}";
28 var delegateSymbol = symbol.ContainingType.GetMembers().SingleOrDefault(t => t.Name == delegateName);
29 if (delegateSymbol is not ITypeSymbol delegateType)
33 $
"error: corresponded delegate type of {symbol.ToDisplayString()} cannot be found");
37 if (symbol.ReturnsVoid)
41 w.Write(symbol.ReturnType.ToNativeInterfaceType(
true));
47 {{symbol.ContainingType.GetFullName("::
")}}::{{symbol.Name}}({{intParmsStr}}) {
48 static {{symbol.ReturnType.ToNativeBridgeType()}} (*__proxy)({{brParmsStr}}) = nullptr;
50 ::s_get_function_pointer("{{symbol.ContainingType.GetFullyQualifiedName()}}
", "{{symbol.MangleName()}}
", "{{delegateType.GetFullyQualifiedName()}}
", nullptr, nullptr, reinterpret_cast<void**>(&__proxy));
55 if (!symbol.ReturnsVoid)
57 w.WriteLine($
"__proxy({argsStr});");
class BindingDiagnostic(WorkspaceDiagnosticKind kind, string message, Project project, Document? document)