Skip to content

Commit dd600b0

Browse files
committed
Fix #17 and #18. Add OnUxmlTraitsInitialized partial method.
1 parent 5c3dca9 commit dd600b0

File tree

6 files changed

+62
-92
lines changed

6 files changed

+62
-92
lines changed

src/UnityUxmlGenerator/Diagnostics/DiagnosticDescriptors.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,6 @@ internal static class DiagnosticDescriptors
2020
defaultSeverity: DiagnosticSeverity.Error,
2121
isEnabledByDefault: true);
2222

23-
public static readonly DiagnosticDescriptor PropertyAndDefaultValueTypesMismatchError = new(
24-
id: "UXMLG003",
25-
title: "Types mismatch",
26-
messageFormat: "UxmlAttribute for '{0}' property was not created. The default property and attribute value must be of the same type.",
27-
category: typeof(UxmlGenerator).FullName,
28-
defaultSeverity: DiagnosticSeverity.Error,
29-
isEnabledByDefault: true);
30-
3123
public static readonly DiagnosticDescriptor PropertyTypeIsNotSupportedError = new(
3224
id: "UXMLG004",
3325
title: "Property type is not supported",
Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Microsoft.CodeAnalysis;
2-
using Microsoft.CodeAnalysis.CSharp;
32
using Microsoft.CodeAnalysis.CSharp.Syntax;
43
using UnityUxmlGenerator.Captures;
54
using UnityUxmlGenerator.Extensions;
@@ -27,16 +26,6 @@ public override void OnVisitSyntaxNode(SyntaxNode syntaxNode)
2726
return;
2827
}
2928

30-
if (attribute!.ArgumentList is not null && attribute.ArgumentList.Arguments.Any())
31-
{
32-
if (HasSameType(property, attribute.ArgumentList.Arguments.First()) == false)
33-
{
34-
RegisterDiagnostic(PropertyAndDefaultValueTypesMismatchError, property.GetLocation(),
35-
property.GetName());
36-
return;
37-
}
38-
}
39-
4029
var @class = property.GetParent<ClassDeclarationSyntax>();
4130
if (@class.InheritsFromAnyType() == false)
4231
{
@@ -60,52 +49,4 @@ public override void OnVisitSyntaxNode(SyntaxNode syntaxNode)
6049

6150
uxmlTraits.Properties.Add((property, attribute));
6251
}
63-
64-
private static bool HasSameType(BasePropertyDeclarationSyntax property, AttributeArgumentSyntax attributeArgument)
65-
{
66-
var parameter = attributeArgument.Expression;
67-
68-
if (parameter.IsKind(SyntaxKind.DefaultLiteralExpression))
69-
{
70-
return true;
71-
}
72-
73-
if (property.Type is PredefinedTypeSyntax predefinedType)
74-
{
75-
if (predefinedType.IsBoolType() &&
76-
(parameter.IsKind(SyntaxKind.TrueLiteralExpression) ||
77-
parameter.IsKind(SyntaxKind.FalseLiteralExpression)))
78-
{
79-
return true;
80-
}
81-
82-
if (predefinedType.IsStringType() &&
83-
parameter.IsKind(SyntaxKind.StringLiteralExpression))
84-
{
85-
return true;
86-
}
87-
88-
if (predefinedType.IsNumericType() &&
89-
parameter.IsKind(SyntaxKind.NumericLiteralExpression))
90-
{
91-
return true;
92-
}
93-
}
94-
95-
SyntaxToken? propertyTypeIdentifier = property.Type switch
96-
{
97-
IdentifierNameSyntax identifierName => identifierName.Identifier,
98-
QualifiedNameSyntax qualifiedNameSyntax => qualifiedNameSyntax.Right.Identifier,
99-
_ => null
100-
};
101-
102-
if (propertyTypeIdentifier is null)
103-
{
104-
return false;
105-
}
106-
107-
return propertyTypeIdentifier.Value.IsKind(SyntaxKind.IdentifierToken) &&
108-
(parameter.IsKind(SyntaxKind.InvocationExpression) ||
109-
parameter.IsKind(SyntaxKind.SimpleMemberAccessExpression));
110-
}
11152
}

src/UnityUxmlGenerator/UxmlGenerator.Attributes.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ private static IEnumerable<MemberDeclarationSyntax> GetUxmlAttributeMembers()
6464
parameter: ParameterWidget(
6565
identifier: "defaultValue",
6666
type: NullableType(PredefinedType(Token(SyntaxKind.ObjectKeyword))),
67-
addDefaultKeyword: true),
67+
defaultValueKeyword: SyntaxKind.DefaultKeyword),
6868
bodyStatement: AssignmentStatementWidget(
6969
left: IdentifierName("DefaultValue"),
7070
right: IdentifierName("defaultValue")),

src/UnityUxmlGenerator/UxmlGenerator.Traits.cs

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,23 @@ private static SourceText GenerateUxmlTraits(GeneratorExecutionContext context,
2323
member: ClassWidget(
2424
identifier: capture.ClassName,
2525
modifier: SyntaxKind.PartialKeyword,
26-
member: ClassWidget(
27-
identifier: "UxmlTraits",
28-
modifiers: new[] { SyntaxKind.PublicKeyword, SyntaxKind.NewKeyword },
29-
baseType: SimpleBaseType(IdentifierName($"{GetBaseClassName(context, capture)}.UxmlTraits")),
30-
members: GetTraitsClassMembers(context, capture),
31-
addGeneratedCodeAttributes: true
32-
)),
26+
members: new MemberDeclarationSyntax[]
27+
{
28+
ClassWidget(
29+
identifier: "UxmlTraits",
30+
modifiers: new[] { SyntaxKind.PublicKeyword, SyntaxKind.NewKeyword },
31+
baseType: SimpleBaseType(IdentifierName($"{GetBaseClassName(context, capture)}.UxmlTraits")),
32+
members: GetTraitsClassMembers(context, capture),
33+
addGeneratedCodeAttributes: true),
34+
MethodWidget(
35+
identifier: "OnUxmlTraitsInitialized",
36+
type: PredefinedType(Token(SyntaxKind.VoidKeyword)),
37+
modifier: SyntaxKind.PartialKeyword,
38+
parameter: ParameterWidget(
39+
identifier: "uxmlAttributes",
40+
type: IdentifierName(string.Format(UnityUiElementsFullName, "IUxmlAttributes"))),
41+
addGeneratedCodeAttributes: true)
42+
}),
3343
normalizeWhitespace: true)
3444
.GetText(Encoding.UTF8);
3545
}
@@ -39,7 +49,8 @@ private static IEnumerable<MemberDeclarationSyntax> GetTraitsClassMembers(Genera
3949
{
4050
var initMethodBody = new List<StatementSyntax>
4151
{
42-
MethodBaseCallWidget(
52+
MethodCallWidget(
53+
expression: BaseExpression(),
4354
identifier: "Init",
4455
arguments: new[]
4556
{
@@ -73,6 +84,12 @@ private static IEnumerable<MemberDeclarationSyntax> GetTraitsClassMembers(Genera
7384
traitsClassMembers.Add(GetAttributeFieldDeclaration(uxmlAttributeInfo));
7485
}
7586

87+
initMethodBody.Add(MethodCallWidget(
88+
expression: IdentifierName("control"),
89+
identifier: "OnUxmlTraitsInitialized",
90+
argument: Argument(IdentifierName("bag")))
91+
);
92+
7693
var initMethod = MethodWidget(
7794
identifier: "Init",
7895
type: PredefinedType(Token(SyntaxKind.VoidKeyword)),
@@ -267,13 +284,22 @@ private static void ConfigureAttributeInfoAsPredefinedType(PredefinedTypeSyntax
267284

268285
return attribute.ArgumentList.Arguments.First().Expression switch
269286
{
287+
IdentifierNameSyntax identifierName => identifierName.Identifier.Text,
288+
PrefixUnaryExpressionSyntax unary => GetUnaryExpressionValue(unary),
270289
LiteralExpressionSyntax literal => GetLiteralExpressionValue(literal),
271290
InvocationExpressionSyntax invocation => GetInvocationExpressionValue(invocation),
272291
MemberAccessExpressionSyntax member => GetMemberAccessExpressionValue(member),
273292
_ => null
274293
};
275294
}
276295

296+
private static string GetUnaryExpressionValue(PrefixUnaryExpressionSyntax unary)
297+
{
298+
var value = unary.Operand.GetText().ToString();
299+
300+
return unary.IsKind(SyntaxKind.UnaryMinusExpression) ? $"-{value}" : value;
301+
}
302+
277303
private static string? GetLiteralExpressionValue(LiteralExpressionSyntax literal)
278304
{
279305
if (literal.Token.IsKind(SyntaxKind.DefaultKeyword))

src/UnityUxmlGenerator/UxmlGenerator.Widgets.cs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,11 @@ private static MethodDeclarationSyntax MethodWidget(
272272
methodDeclaration = methodDeclaration.WithBody(Block(bodyStatements));
273273
}
274274

275+
if (bodyStatement is null && bodyStatements is null)
276+
{
277+
methodDeclaration = methodDeclaration.WithSemicolonToken(Token(SyntaxKind.SemicolonToken));
278+
}
279+
275280
return BaseWidgetDecoration(
276281
widget: methodDeclaration,
277282
modifier: modifier,
@@ -284,41 +289,47 @@ private static MethodDeclarationSyntax MethodWidget(
284289
private static ParameterSyntax ParameterWidget(
285290
string identifier,
286291
TypeSyntax type,
287-
bool addDefaultKeyword = false)
292+
SyntaxKind defaultValueKeyword = SyntaxKind.None)
288293
{
289294
var parameterSyntax = Parameter(Identifier(identifier))
290295
.WithType(type);
291296

292-
if (addDefaultKeyword)
293-
{
294-
parameterSyntax = parameterSyntax.WithDefault(EqualsValueClause(
295-
LiteralExpression(SyntaxKind.DefaultLiteralExpression, Token(SyntaxKind.DefaultKeyword))));
296-
}
297-
298-
return parameterSyntax;
297+
return defaultValueKeyword switch
298+
{
299+
SyntaxKind.NullKeyword => parameterSyntax.WithDefault(EqualsValueClause(
300+
LiteralExpression(SyntaxKind.NullLiteralExpression, Token(SyntaxKind.NullKeyword)))),
301+
SyntaxKind.TrueKeyword => parameterSyntax.WithDefault(EqualsValueClause(
302+
LiteralExpression(SyntaxKind.TrueLiteralExpression, Token(SyntaxKind.TrueKeyword)))),
303+
SyntaxKind.FalseKeyword => parameterSyntax.WithDefault(EqualsValueClause(
304+
LiteralExpression(SyntaxKind.FalseLiteralExpression, Token(SyntaxKind.FalseKeyword)))),
305+
SyntaxKind.DefaultKeyword => parameterSyntax.WithDefault(EqualsValueClause(
306+
LiteralExpression(SyntaxKind.DefaultLiteralExpression, Token(SyntaxKind.DefaultKeyword)))),
307+
_ => parameterSyntax
308+
};
299309
}
300310

301-
private static StatementSyntax MethodBaseCallWidget(
311+
private static StatementSyntax MethodCallWidget(
312+
ExpressionSyntax expression,
302313
string identifier,
303314
ArgumentSyntax? argument = null,
304315
IEnumerable<ArgumentSyntax>? arguments = null)
305316
{
306-
var baseExpression = InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
307-
BaseExpression(), IdentifierName(identifier)));
317+
var invocationExpression = InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
318+
expression, IdentifierName(identifier)));
308319

309320
if (argument is not null)
310321
{
311-
baseExpression = baseExpression.WithArgumentList(baseExpression.ArgumentList
312-
.WithArguments(baseExpression.ArgumentList.Arguments.Add(argument)));
322+
invocationExpression = invocationExpression.WithArgumentList(invocationExpression.ArgumentList
323+
.WithArguments(invocationExpression.ArgumentList.Arguments.Add(argument)));
313324
}
314325

315326
if (arguments is not null)
316327
{
317-
baseExpression = baseExpression.WithArgumentList(baseExpression.ArgumentList
318-
.WithArguments(baseExpression.ArgumentList.Arguments.AddRange(arguments)));
328+
invocationExpression = invocationExpression.WithArgumentList(invocationExpression.ArgumentList
329+
.WithArguments(invocationExpression.ArgumentList.Arguments.AddRange(arguments)));
319330
}
320331

321-
return ExpressionStatement(baseExpression);
332+
return ExpressionStatement(invocationExpression);
322333
}
323334

324335
private static StatementSyntax LocalVariableWidget(

0 commit comments

Comments
 (0)