/// <summary> /// Gets the return type for the unmanaged signature that represents the provided <paramref name="info"/>. /// </summary> /// <param name="generator">The marshalling generator for this <paramref name="info"/></param> /// <param name="info">Object to marshal</param> public static TypeSyntax AsReturnType(this IMarshallingGenerator generator, TypePositionInfo info) { return(generator.GetNativeSignatureBehavior(info) switch { SignatureBehavior.ManagedTypeAndAttributes => info.ManagedType.Syntax, SignatureBehavior.NativeType => generator.AsNativeType(info), SignatureBehavior.PointerToNativeType => PointerType(generator.AsNativeType(info)), _ => throw new InvalidOperationException() });
/// <summary> /// Gets any attributes that should be applied to the return type for this <paramref name="info"/>. /// </summary> /// <param name="generator">The marshalling generator for this <paramref name="info"/></param> /// <param name="info">Object to marshal</param> /// <returns>Attributes for the return type for this <paramref name="info"/>, or <c>null</c> if no attributes should be added.</returns> public static AttributeListSyntax? GenerateAttributesForReturnType(this IMarshallingGenerator generator, TypePositionInfo info) { if (generator.GetNativeSignatureBehavior(info) != SignatureBehavior.ManagedTypeAndAttributes) { return null; } if (!TryRehydrateMarshalAsAttribute(info, out AttributeSyntax marshalAsAttribute)) { return null; } return AttributeList(SingletonSeparatedList(marshalAsAttribute)); }
/// <summary> /// Gets a parameter for the unmanaged signature that represents the provided <paramref name="info"/>. /// </summary> /// <param name="generator">The marshalling generator for this <paramref name="info"/></param> /// <param name="info">Object to marshal</param> public static ParameterSyntax AsParameter(this IMarshallingGenerator generator, TypePositionInfo info) { SignatureBehavior behavior = generator.GetNativeSignatureBehavior(info); if (behavior == SignatureBehavior.ManagedTypeAndAttributes) { return GenerateForwardingParameter(info); } return Parameter(Identifier(info.InstanceIdentifier)) .WithType(behavior switch { SignatureBehavior.NativeType => generator.AsNativeType(info), SignatureBehavior.PointerToNativeType => PointerType(generator.AsNativeType(info)), _ => throw new InvalidOperationException() });
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) { return(_manualMarshallingGenerator.GetNativeSignatureBehavior(info)); }
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => _inner.GetNativeSignatureBehavior(info);