Skip to content

Commit fd77ab7

Browse files
authored
Add forwarding support for WasmLinkage on LibraryImport (dotnet#109234)
1 parent ece807a commit fd77ab7

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGenerator.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
109109
context.RegisterConcatenatedSyntaxOutputs(generateSingleStub.Select((data, ct) => data.Item1), "LibraryImports.g.cs");
110110
}
111111

112-
private static List<AttributeSyntax> GenerateSyntaxForForwardedAttributes(AttributeData? suppressGCTransitionAttribute, AttributeData? unmanagedCallConvAttribute, AttributeData? defaultDllImportSearchPathsAttribute)
112+
private static List<AttributeSyntax> GenerateSyntaxForForwardedAttributes(AttributeData? suppressGCTransitionAttribute, AttributeData? unmanagedCallConvAttribute, AttributeData? defaultDllImportSearchPathsAttribute, AttributeData? wasmImportLinkageAttribute)
113113
{
114114
const string CallConvsField = "CallConvs";
115115
// Manually rehydrate the forwarded attributes with fully qualified types so we don't have to worry about any using directives.
@@ -153,6 +153,10 @@ private static List<AttributeSyntax> GenerateSyntaxForForwardedAttributes(Attrib
153153
LiteralExpression(SyntaxKind.NumericLiteralExpression,
154154
Literal((int)defaultDllImportSearchPathsAttribute.ConstructorArguments[0].Value!))))));
155155
}
156+
if (wasmImportLinkageAttribute is not null)
157+
{
158+
attributes.Add(Attribute(NameSyntaxes.WasmImportLinkageAttribute));
159+
}
156160
return attributes;
157161
}
158162

@@ -223,12 +227,14 @@ private static IncrementalStubGenerationContext CalculateStubInformation(
223227
INamedTypeSymbol? suppressGCTransitionAttrType = environment.SuppressGCTransitionAttrType;
224228
INamedTypeSymbol? unmanagedCallConvAttrType = environment.UnmanagedCallConvAttrType;
225229
INamedTypeSymbol? defaultDllImportSearchPathsAttrType = environment.DefaultDllImportSearchPathsAttrType;
230+
INamedTypeSymbol? wasmImportLinkageAttrType = environment.WasmImportLinkageAttrType;
226231
// Get any attributes of interest on the method
227232
AttributeData? generatedDllImportAttr = null;
228233
AttributeData? lcidConversionAttr = null;
229234
AttributeData? suppressGCTransitionAttribute = null;
230235
AttributeData? unmanagedCallConvAttribute = null;
231236
AttributeData? defaultDllImportSearchPathsAttribute = null;
237+
AttributeData? wasmImportLinkageAttribute = null;
232238
foreach (AttributeData attr in symbol.GetAttributes())
233239
{
234240
if (attr.AttributeClass is not null
@@ -252,6 +258,10 @@ private static IncrementalStubGenerationContext CalculateStubInformation(
252258
{
253259
defaultDllImportSearchPathsAttribute = attr;
254260
}
261+
else if (wasmImportLinkageAttrType is not null && SymbolEqualityComparer.Default.Equals(attr.AttributeClass, wasmImportLinkageAttrType))
262+
{
263+
wasmImportLinkageAttribute = attr;
264+
}
255265
}
256266

257267
Debug.Assert(generatedDllImportAttr is not null);
@@ -299,7 +309,7 @@ private static IncrementalStubGenerationContext CalculateStubInformation(
299309

300310
var methodSyntaxTemplate = new ContainingSyntax(originalSyntax.Modifiers, SyntaxKind.MethodDeclaration, originalSyntax.Identifier, originalSyntax.TypeParameterList);
301311

302-
List<AttributeSyntax> additionalAttributes = GenerateSyntaxForForwardedAttributes(suppressGCTransitionAttribute, unmanagedCallConvAttribute, defaultDllImportSearchPathsAttribute);
312+
List<AttributeSyntax> additionalAttributes = GenerateSyntaxForForwardedAttributes(suppressGCTransitionAttribute, unmanagedCallConvAttribute, defaultDllImportSearchPathsAttribute, wasmImportLinkageAttribute);
303313
return new IncrementalStubGenerationContext(
304314
signatureContext,
305315
containingTypeContext,

src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/StubEnvironment.cs

+14
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,19 @@ public INamedTypeSymbol? DefaultDllImportSearchPathsAttrType
7373
return _defaultDllImportSearchPathsAttrType.Value;
7474
}
7575
}
76+
77+
private Optional<INamedTypeSymbol?> _wasmImportLinkageAttrType;
78+
public INamedTypeSymbol? WasmImportLinkageAttrType
79+
{
80+
get
81+
{
82+
if (_wasmImportLinkageAttrType.HasValue)
83+
{
84+
return _wasmImportLinkageAttrType.Value;
85+
}
86+
_wasmImportLinkageAttrType = new Optional<INamedTypeSymbol?>(Compilation.GetTypeByMetadataName(TypeNames.WasmImportLinkageAttribute));
87+
return _wasmImportLinkageAttrType.Value;
88+
}
89+
}
7690
}
7791
}

src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/TypeNames.cs

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public static class NameSyntaxes
3939

4040
private static NameSyntax? _UnmanagedCallersOnlyAttribute;
4141
public static NameSyntax UnmanagedCallersOnlyAttribute => _UnmanagedCallersOnlyAttribute ??= ParseName(TypeNames.GlobalAlias + TypeNames.UnmanagedCallersOnlyAttribute);
42+
43+
private static NameSyntax? _WasmImportLinkageAttribute;
44+
public static NameSyntax WasmImportLinkageAttribute => _WasmImportLinkageAttribute ??= ParseName(TypeNames.GlobalAlias + TypeNames.WasmImportLinkageAttribute);
4245
}
4346

4447
public static class TypeSyntaxes
@@ -312,5 +315,6 @@ public static string MarshalEx(InteropGenerationOptions options)
312315
public const string CallConvMemberFunctionName = "System.Runtime.CompilerServices.CallConvMemberFunction";
313316
public const string Nint = "nint";
314317
public const string ComVariantMarshaller = "System.Runtime.InteropServices.Marshalling.ComVariantMarshaller";
318+
public const string WasmImportLinkageAttribute = "System.Runtime.InteropServices.WasmImportLinkageAttribute";
315319
}
316320
}

src/libraries/System.Runtime.InteropServices/tests/LibraryImportGenerator.UnitTests/AttributeForwarding.cs

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class AttributeForwarding
2121
[Theory]
2222
[InlineData("SuppressGCTransition", "System.Runtime.InteropServices.SuppressGCTransitionAttribute")]
2323
[InlineData("UnmanagedCallConv", "System.Runtime.InteropServices.UnmanagedCallConvAttribute")]
24+
[InlineData("WasmImportLinkage", "System.Runtime.InteropServices.WasmImportLinkageAttribute")]
2425
public async Task KnownParameterlessAttribute(string attributeSourceName, string attributeMetadataName)
2526
{
2627
string source = $$"""

0 commit comments

Comments
 (0)