Skip to content

Commit

Permalink
Merge pull request #672 from elachlan/SYSTEMTIME
Browse files Browse the repository at this point in the history
Add DateTime operators to SYSTEMTIME
  • Loading branch information
AArnott committed Sep 6, 2022
2 parents abe218e + 48a8bfd commit 65f78d0
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 1 deletion.
28 changes: 27 additions & 1 deletion src/Microsoft.Windows.CsWin32/Generator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3759,6 +3759,7 @@ private StructDeclarationSyntax DeclareStruct(TypeDefinitionHandle typeDefHandle
{
case "RECT":
case "SIZE":
case "SYSTEMTIME":
members.AddRange(this.ExtractMembersFromTemplate(name.Identifier.ValueText));
break;
default:
Expand Down Expand Up @@ -6446,6 +6447,28 @@ internal WhitespaceRewriter()

public override SyntaxNode? VisitExpressionStatement(ExpressionStatementSyntax node) => base.VisitExpressionStatement(this.WithIndentingTrivia(node));

public override SyntaxNode? VisitInitializerExpression(InitializerExpressionSyntax node)
{
node = node
.WithOpenBraceToken(Token(TriviaList(this.IndentTrivia), SyntaxKind.OpenBraceToken, TriviaList(LineFeed)))
.WithCloseBraceToken(Token(TriviaList(this.IndentTrivia), SyntaxKind.CloseBraceToken, TriviaList(LineFeed)))
.WithTrailingTrivia(TriviaList());
using var indent = new Indent(this);
return base.VisitInitializerExpression(node);
}

public override SyntaxNode? VisitAssignmentExpression(AssignmentExpressionSyntax node)
{
if (node.Parent is InitializerExpressionSyntax)
{
return base.VisitAssignmentExpression(this.WithIndentingTrivia(node));
}
else
{
return base.VisitAssignmentExpression(node);
}
}

public override SyntaxNode? VisitTryStatement(TryStatementSyntax node) => base.VisitTryStatement(this.WithIndentingTrivia(node));

public override SyntaxNode? VisitFinallyClause(FinallyClauseSyntax node) => base.VisitFinallyClause(this.WithIndentingTrivia(node));
Expand Down Expand Up @@ -6520,7 +6543,10 @@ internal WhitespaceRewriter()
}
}

public override SyntaxNode? VisitReturnStatement(ReturnStatementSyntax node) => base.VisitReturnStatement(node.WithLeadingTrivia(this.IndentTrivia));
public override SyntaxNode? VisitReturnStatement(ReturnStatementSyntax node)
{
return base.VisitReturnStatement(this.WithIndentingTrivia(node));
}

public override SyntaxToken VisitToken(SyntaxToken token)
{
Expand Down
42 changes: 42 additions & 0 deletions src/Microsoft.Windows.CsWin32/templates/SYSTEMTIME.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
partial struct SYSTEMTIME
: IEquatable<SYSTEMTIME>
{
public bool Equals(SYSTEMTIME other) => this.wYear == other.wYear && this.wMonth == other.wMonth && this.wDayOfWeek == other.wDayOfWeek && this.wDay == other.wDay && this.wHour == other.wHour && this.wMinute == other.wMinute && this.wSecond == other.wSecond && this.wMilliseconds == other.wMilliseconds;
public override bool Equals(object obj) => obj is SYSTEMTIME other && this.Equals(other);
public override int GetHashCode() => (this.wYear, this.wMonth, this.wDayOfWeek, this.wDay, this.wHour, this.wMinute, this.wSecond, this.wMilliseconds).GetHashCode();
public static bool operator ==(SYSTEMTIME d1, SYSTEMTIME d2) => d1.Equals(d2);
public static bool operator !=(SYSTEMTIME d1, SYSTEMTIME d2) => !(d1 == d2);

public static explicit operator global::System.DateTime(SYSTEMTIME sysTime)
{
if (sysTime == default)
{
return default;
}

return new global::System.DateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds);
}

public static explicit operator SYSTEMTIME(global::System.DateTime time)
{
if (time == default)
{
return default;
}

checked
{
return new SYSTEMTIME
{
wYear = (ushort)time.Year,
wMonth = (ushort)time.Month,
wDayOfWeek = (ushort)time.DayOfWeek,
wDay = (ushort)time.Day,
wHour = (ushort)time.Hour,
wMinute = (ushort)time.Minute,
wSecond = (ushort)time.Second,
wMilliseconds = (ushort)time.Millisecond,
};
}
}
}
18 changes: 18 additions & 0 deletions test/Microsoft.Windows.CsWin32.Tests/GeneratorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,24 @@ public void HandleStructsHaveStaticNullMember(string handleName)
this.AssertGeneratedMember(handleName, "Null", $"internal static {handleName} Null => default;");
}

[Theory]
[InlineData("BOOL")]
[InlineData("BOOLEAN")]
[InlineData("HRESULT")]
[InlineData("NTSTATUS")]
[InlineData("PCSTR")]
[InlineData("PCWSTR")]
[InlineData("RECT")]
[InlineData("SIZE")]
[InlineData("SYSTEMTIME")]
public void TemplateAPIsGenerate(string handleType)
{
this.generator = this.CreateGenerator();
Assert.True(this.generator.TryGenerate(handleType, CancellationToken.None));
this.CollectGeneratedCode(this.generator);
this.AssertNoDiagnostics();
}

[Theory]
[InlineData("HANDLE")]
[InlineData("HGDIOBJ")]
Expand Down

0 comments on commit 65f78d0

Please sign in to comment.