Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Microsoft.Windows.CsWin32/ArrayTypeHandleInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ internal override TypeSyntaxAndMarshaling ToTypeSyntax(TypeSyntaxSettings inputs
TypeSyntaxAndMarshaling element = this.ElementType.ToTypeSyntax(inputs, forElement, customAttributes);
if (inputs.AllowMarshaling || inputs.IsField)
{
ArrayTypeSyntax arrayType = ArrayType(element.Type, SingletonList(ArrayRankSpecifier().AddSizes(this.Shape.Sizes.Select(size => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(size))).ToArray<ExpressionSyntax>())));
ArrayTypeSyntax arrayType = ArrayType(element.Type, [ArrayRankSpecifier([.. this.Shape.Sizes.Select(size => LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(size)))])]);
MarshalAsAttribute? marshalAs = element.MarshalAsAttribute is object ? new MarshalAsAttribute(UnmanagedType.LPArray) { ArraySubType = element.MarshalAsAttribute.Value } : null;
return new TypeSyntaxAndMarshaling(arrayType, marshalAs, element.NativeArrayInfo);
}
Expand Down
110 changes: 39 additions & 71 deletions src/Microsoft.Windows.CsWin32/FastSyntaxFactory.cs

Large diffs are not rendered by default.

291 changes: 137 additions & 154 deletions src/Microsoft.Windows.CsWin32/Generator.Com.cs

Large diffs are not rendered by default.

20 changes: 8 additions & 12 deletions src/Microsoft.Windows.CsWin32/Generator.Constant.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ ReadOnlyMemory<char> TrimCurlyBraces(ReadOnlyMemory<char> arg)
i++;
}

return ObjectCreationExpression(targetType).AddArgumentListArguments(argExpressions);
return ObjectCreationExpression(targetType, [.. argExpressions]);
}
}

Expand Down Expand Up @@ -259,7 +259,7 @@ ReadOnlyMemory<char> TrimCurlyBraces(ReadOnlyMemory<char> arg)

return ObjectCreationExpression(targetType)
.WithArgumentList(null)
.WithInitializer(InitializerExpression(SyntaxKind.ObjectInitializerExpression, SeparatedList<ExpressionSyntax>()).AddExpressions(fieldAssignmentExpressions));
.WithInitializer(InitializerExpression(SyntaxKind.ObjectInitializerExpression).AddExpressions(fieldAssignmentExpressions));
}

private ExpressionSyntax CreateConstant(ReadOnlyMemory<char> argsAsString, TypeHandleInfo targetType, out bool unsafeRequired)
Expand Down Expand Up @@ -312,8 +312,7 @@ private ExpressionSyntax CreateByteArrayConstant(ReadOnlyMemory<char> argsAsStri
TypeSyntax byteTypeSyntax = PredefinedType(Token(SyntaxKind.ByteKeyword));
return CastExpression(
MakeReadOnlySpanOfT(byteTypeSyntax),
ArrayCreationExpression(ArrayType(byteTypeSyntax).AddRankSpecifiers(ArrayRankSpecifier())).WithInitializer(InitializerExpression(SyntaxKind.ArrayInitializerExpression, SeparatedList<ExpressionSyntax>())
.AddExpressions(args.Select(b => ToExpressionSyntax(PrimitiveTypeCode.Byte, b)).ToArray())));
ArrayCreationExpression(ArrayType(byteTypeSyntax, [ArrayRankSpecifier()]), InitializerExpression(SyntaxKind.ArrayInitializerExpression, [.. args.Select(b => ToExpressionSyntax(PrimitiveTypeCode.Byte, b))])));
}

private ExpressionSyntax CreateGuidConstant(List<ReadOnlyMemory<char>> guidArgs)
Expand All @@ -338,7 +337,7 @@ private ExpressionSyntax CreateGuidConstant(List<ReadOnlyMemory<char>> guidArgs)
Literal(byte.Parse(guidArgs[10].ToString(), CultureInfo.InvariantCulture)),
};

return ObjectCreationExpression(GuidTypeSyntax).AddArgumentListArguments(ctorArgs.Select(t => Argument(LiteralExpression(SyntaxKind.NumericLiteralExpression, t))).ToArray());
return ObjectCreationExpression(GuidTypeSyntax, [.. ctorArgs.Select(t => Argument(LiteralExpression(SyntaxKind.NumericLiteralExpression, t)))]);
}

private ExpressionSyntax CreateConstant(CustomAttribute constantAttribute, TypeHandleInfo targetType, out bool unsafeRequired)
Expand Down Expand Up @@ -389,7 +388,7 @@ private FieldDeclarationSyntax DeclareConstant(FieldDefinition fieldDef)
}
}

SyntaxTokenList modifiers = TokenList(TokenWithSpace(this.Visibility));
SyntaxTokenList modifiers = [TokenWithSpace(this.Visibility)];
if (this.IsTypeDefStruct(fieldTypeInfo) || value is ObjectCreationExpressionSyntax)
{
modifiers = modifiers.Add(TokenWithSpace(SyntaxKind.StaticKeyword)).Add(TokenWithSpace(SyntaxKind.ReadOnlyKeyword));
Expand All @@ -404,9 +403,7 @@ private FieldDeclarationSyntax DeclareConstant(FieldDefinition fieldDef)
modifiers = modifiers.Add(TokenWithSpace(SyntaxKind.UnsafeKeyword));
}

FieldDeclarationSyntax? result = FieldDeclaration(VariableDeclaration(fieldType.Type).AddVariables(
VariableDeclarator(Identifier(name)).WithInitializer(EqualsValueClause(value))))
.WithModifiers(modifiers);
FieldDeclarationSyntax? result = FieldDeclaration(modifiers, VariableDeclaration(fieldType.Type, [VariableDeclarator(Identifier(name), EqualsValueClause(value))]));
result = fieldType.AddMarshalAs(result);
result = this.AddApiDocumentation(result.Declaration.Variables[0].Identifier.ValueText, result);

Expand All @@ -423,8 +420,7 @@ private FieldDeclarationSyntax DeclareConstant(FieldDefinition fieldDef)

private ClassDeclarationSyntax DeclareConstantDefiningClass()
{
return ClassDeclaration(this.methodsAndConstantsClassName.Identifier)
.AddMembers(this.committedCode.TopLevelFields.ToArray())
.WithModifiers(TokenList(TokenWithSpace(this.Visibility), TokenWithSpace(SyntaxKind.StaticKeyword), TokenWithSpace(SyntaxKind.PartialKeyword)));
return ClassDeclaration(this.methodsAndConstantsClassName.Identifier, [.. this.committedCode.TopLevelFields])
.WithModifiers([TokenWithSpace(this.Visibility), TokenWithSpace(SyntaxKind.StaticKeyword), TokenWithSpace(SyntaxKind.PartialKeyword)]);
}
}
61 changes: 26 additions & 35 deletions src/Microsoft.Windows.CsWin32/Generator.CustomMarshaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,8 @@ internal string RequestCustomEnumMarshaller(string qualifiedEnumTypeName, Unmana
// }
MethodDeclarationSyntax convertToManagedMethod = MethodDeclaration(enumTypeSyntax, Identifier("ConvertToManaged"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword), TokenWithSpace(SyntaxKind.UnsafeKeyword))
.AddParameterListParameters(Parameter(Identifier("unmanaged")).WithType(unmanagedTypeSyntax.WithTrailingTrivia(Space)))
.WithBody(Block().AddStatements(
ReturnStatement(UncheckedExpression(CastExpression(enumTypeSyntax, IdentifierName("unmanaged"))))));
.AddParameterListParameters(Parameter(unmanagedTypeSyntax.WithTrailingTrivia(Space), Identifier("unmanaged")))
.WithBody(Block(ReturnStatement(UncheckedExpression(CastExpression(enumTypeSyntax, IdentifierName("unmanaged"))))));

// Create ConvertToUnmanaged method
// public static uint ConvertToUnmanaged(Enum managed)
Expand All @@ -78,24 +77,22 @@ internal string RequestCustomEnumMarshaller(string qualifiedEnumTypeName, Unmana
// }
MethodDeclarationSyntax convertToUnmanagedMethod = MethodDeclaration(unmanagedTypeSyntax, Identifier("ConvertToUnmanaged"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddParameterListParameters(Parameter(Identifier("managed")).WithType(enumTypeSyntax.WithTrailingTrivia(Space)))
.WithBody(Block().AddStatements(
ReturnStatement(UncheckedExpression(CastExpression(unmanagedTypeSyntax, IdentifierName("managed"))))));
.AddParameterListParameters(Parameter(enumTypeSyntax.WithTrailingTrivia(Space), Identifier("managed")))
.WithBody(Block(ReturnStatement(UncheckedExpression(CastExpression(unmanagedTypeSyntax, IdentifierName("managed"))))));

// Create Free method
// public static void Free(uint unmanaged)
// {
// }
MethodDeclarationSyntax freeMethod = MethodDeclaration(PredefinedType(Token(SyntaxKind.VoidKeyword)), Identifier("Free"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddParameterListParameters(Parameter(Identifier("unmanaged")).WithType(unmanagedTypeSyntax.WithTrailingTrivia(Space)))
.AddParameterListParameters(Parameter(unmanagedTypeSyntax.WithTrailingTrivia(Space), Identifier("unmanaged")))
.WithBody(Block()); // Empty body

// Create the class declaration
ClassDeclarationSyntax marshallerClass = ClassDeclaration(Identifier(customTypeMarshallerName))
ClassDeclarationSyntax marshallerClass = ClassDeclaration(Identifier(customTypeMarshallerName), [convertToManagedMethod, convertToUnmanagedMethod, freeMethod])
.AddModifiers(TokenWithSpace(this.Visibility), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddAttributeLists(customMarshallerAttributes.Select(attr => AttributeList().AddAttributes(attr)).ToArray())
.AddMembers(convertToManagedMethod, convertToUnmanagedMethod, freeMethod);
.AddAttributeLists(customMarshallerAttributes.Select(attr => AttributeList(attr)).ToArray());

marshallerClass = marshallerClass.WithAdditionalAnnotations(new SyntaxAnnotation(NamespaceContainerAnnotation, shortNamespace));

Expand Down Expand Up @@ -140,20 +137,18 @@ internal string RequestCustomTypeDefMarshaller(string fullyQualifiedTypeName, Ty
// public static unsafe void* ConvertToUnmanaged(HWND managed) => managed.Value;
MethodDeclarationSyntax toUnmanaged = MethodDeclaration(unmanagedTypeSyntax, Identifier("ConvertToUnmanaged"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword), TokenWithSpace(SyntaxKind.UnsafeKeyword))
.AddParameterListParameters(Parameter(Identifier("managed")).WithType(typedefTypeSyntax.WithTrailingTrivia(Space)))
.AddParameterListParameters(Parameter(typedefTypeSyntax.WithTrailingTrivia(Space), Identifier("managed")))
.WithBody(Block(ReturnStatement(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName("managed"), IdentifierName("Value")))));

// public static unsafe HWND ConvertToManaged(void* unmanaged) => new(unmanaged);
MethodDeclarationSyntax toManaged = MethodDeclaration(typedefTypeSyntax, Identifier("ConvertToManaged"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword), TokenWithSpace(SyntaxKind.UnsafeKeyword))
.AddParameterListParameters(Parameter(Identifier("unmanaged")).WithType(unmanagedTypeSyntax.WithTrailingTrivia(Space)))
.WithBody(Block(ReturnStatement(ObjectCreationExpression(typedefTypeSyntax)
.WithArgumentList(ArgumentList(SingletonSeparatedList(Argument(IdentifierName("unmanaged"))))))));
.AddParameterListParameters(Parameter(unmanagedTypeSyntax.WithTrailingTrivia(Space), Identifier("unmanaged")))
.WithBody(Block(ReturnStatement(ObjectCreationExpression(typedefTypeSyntax, [Argument(IdentifierName("unmanaged"))]))));

ClassDeclarationSyntax marshallerClass = ClassDeclaration(Identifier(customTypeMarshallerName))
ClassDeclarationSyntax marshallerClass = ClassDeclaration(Identifier(customTypeMarshallerName), [toUnmanaged, toManaged])
.AddModifiers(TokenWithSpace(this.Visibility), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddAttributeLists(AttributeList().AddAttributes(attribute))
.AddMembers(toUnmanaged, toManaged)
.AddAttributeLists(AttributeList(attribute))
.WithAdditionalAnnotations(new SyntaxAnnotation(NamespaceContainerAnnotation, shortNamespace));

string qualifiedName = $"global::{this.Namespace}.{shortNamespace}.{customTypeMarshallerName}";
Expand Down Expand Up @@ -215,15 +210,14 @@ internal string RequestCustomWinRTMarshaller(string qualifiedWinRTTypeName)
// }
MethodDeclarationSyntax convertToManagedMethod = MethodDeclaration(winrtTypeSyntax, Identifier("ConvertToManaged"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword), TokenWithSpace(SyntaxKind.UnsafeKeyword))
.AddParameterListParameters(Parameter(Identifier("unmanaged")).WithType(unmanagedTypeSyntax.WithTrailingTrivia(Space)))
.WithBody(Block().AddStatements(
.AddParameterListParameters(Parameter(unmanagedTypeSyntax.WithTrailingTrivia(Space), Identifier("unmanaged")))
.WithBody(Block(
ReturnStatement(InvocationExpression(
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
GenericName("global::WinRT.MarshalInterface")
.AddTypeArgumentListArguments(winrtTypeSyntax),
GenericName("global::WinRT.MarshalInterface", [winrtTypeSyntax]),
IdentifierName("FromAbi")),
ArgumentList().AddArguments(Argument(IdentifierName("unmanaged")))))));
[Argument(IdentifierName("unmanaged"))]))));

// Create ConvertToUnmanaged method
// public static nint ConvertToUnmanaged(T managed)
Expand All @@ -232,15 +226,14 @@ internal string RequestCustomWinRTMarshaller(string qualifiedWinRTTypeName)
// }
MethodDeclarationSyntax convertToUnmanagedMethod = MethodDeclaration(unmanagedTypeSyntax, Identifier("ConvertToUnmanaged"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddParameterListParameters(Parameter(Identifier("managed")).WithType(winrtTypeSyntax.WithTrailingTrivia(Space)))
.WithBody(Block().AddStatements(
.AddParameterListParameters(Parameter(winrtTypeSyntax.WithTrailingTrivia(Space), Identifier("managed")))
.WithBody(Block(
ReturnStatement(InvocationExpression(
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
GenericName("global::WinRT.MarshalInterface")
.AddTypeArgumentListArguments(winrtTypeSyntax),
GenericName("global::WinRT.MarshalInterface", [winrtTypeSyntax]),
IdentifierName("FromManaged")),
ArgumentList().AddArguments(Argument(IdentifierName("managed")))))));
[Argument(IdentifierName("managed"))]))));

// Create Free method
// public static void Free(nint unmanaged)
Expand All @@ -249,21 +242,19 @@ internal string RequestCustomWinRTMarshaller(string qualifiedWinRTTypeName)
// }
MethodDeclarationSyntax freeMethod = MethodDeclaration(PredefinedType(Token(SyntaxKind.VoidKeyword)), Identifier("Free"))
.AddModifiers(TokenWithSpace(SyntaxKind.PublicKeyword), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddParameterListParameters(Parameter(Identifier("unmanaged")).WithType(unmanagedTypeSyntax.WithTrailingTrivia(Space)))
.WithBody(Block().AddStatements(
.AddParameterListParameters(Parameter(unmanagedTypeSyntax.WithTrailingTrivia(Space), Identifier("unmanaged")))
.WithBody(Block(
ExpressionStatement(InvocationExpression(
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
GenericName("global::WinRT.MarshalInterface")
.AddTypeArgumentListArguments(winrtTypeSyntax),
GenericName("global::WinRT.MarshalInterface", [winrtTypeSyntax]),
IdentifierName("DisposeAbi")),
ArgumentList().AddArguments(Argument(IdentifierName("unmanaged")))))));
[Argument(IdentifierName("unmanaged"))]))));

// Create the class declaration
ClassDeclarationSyntax marshallerClass = ClassDeclaration(Identifier(customTypeMarshallerName))
ClassDeclarationSyntax marshallerClass = ClassDeclaration(Identifier(customTypeMarshallerName), [convertToManagedMethod, convertToUnmanagedMethod, freeMethod])
.AddModifiers(TokenWithSpace(this.Visibility), TokenWithSpace(SyntaxKind.StaticKeyword))
.AddAttributeLists(customMarshallerAttributes.Select(attr => AttributeList().AddAttributes(attr)).ToArray())
.AddMembers(convertToManagedMethod, convertToUnmanagedMethod, freeMethod);
.AddAttributeLists(customMarshallerAttributes.Select(attr => AttributeList(attr)).ToArray());

marshallerClass = marshallerClass.WithAdditionalAnnotations(new SyntaxAnnotation(NamespaceContainerAnnotation, marshallerNamespace));

Expand Down
Loading
Loading