Skip to content

Commit 5c3dca9

Browse files
authored
Merge pull request #15 from LibraStack/develop
Fix generic type arguments issue.
2 parents b8f978b + 433f4af commit 5c3dca9

File tree

7 files changed

+101
-19
lines changed

7 files changed

+101
-19
lines changed

src/UnityUxmlGenerator.UnityPackage/Assets/Plugins/UnityUxmlGenerator/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "com.chebanovdd.unityuxmlgenerator",
33
"displayName": "Unity Uxml Generator",
44
"author": { "name": "ChebanovDD", "url": "https://github.com/ChebanovDD" },
5-
"version": "0.0.5",
5+
"version": "0.0.6",
66
"unity": "2018.4",
77
"description": "The Unity Uxml Generator allows you to generate 'UxmlFactory' and 'UxmlTraits' source code for a custom 'VisualElement'. Just mark elements with [UxmlElement] and [UxmlAttribute] attributes.",
88
"keywords": [ "uxml", "source", "generator" ]

src/UnityUxmlGenerator/Captures/UxmlTraitsCapture.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ public UxmlTraitsCapture(ClassDeclarationSyntax @class, TypeSyntax baseClassType
1515
public TypeSyntax BaseClassType { get; }
1616
public List<(PropertyDeclarationSyntax Property, AttributeSyntax Attribute)> Properties { get; }
1717

18-
public string GetBaseClassName(out TypeSyntax? genericTypeSyntax)
18+
public string GetBaseClassName(out IEnumerable<TypeSyntax>? genericTypeArguments)
1919
{
2020
if (BaseClassType is GenericNameSyntax genericNameSyntax)
2121
{
22-
genericTypeSyntax = genericNameSyntax.TypeArgumentList.Arguments[0];
22+
genericTypeArguments = genericNameSyntax.TypeArgumentList.Arguments;
2323
return genericNameSyntax.Identifier.Text;
2424
}
2525

26-
genericTypeSyntax = default;
26+
genericTypeArguments = default;
2727

2828
if (BaseClassType is IdentifierNameSyntax identifierNameSyntax)
2929
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System.Text;
2+
using Microsoft.CodeAnalysis;
3+
using Microsoft.CodeAnalysis.CSharp.Syntax;
4+
5+
namespace UnityUxmlGenerator.Extensions;
6+
7+
public static class StringBuilderExtensions
8+
{
9+
public static void AppendGenericString(this StringBuilder stringBuilder, GeneratorExecutionContext context,
10+
IEnumerable<TypeSyntax> genericTypeArguments)
11+
{
12+
var isFirstArgument = true;
13+
14+
stringBuilder.Append('<');
15+
16+
foreach (var genericClassTypeSyntax in genericTypeArguments)
17+
{
18+
if (isFirstArgument == false)
19+
{
20+
stringBuilder.Append(", ");
21+
}
22+
23+
isFirstArgument = false;
24+
25+
switch (genericClassTypeSyntax)
26+
{
27+
case PredefinedTypeSyntax predefinedTypeSyntax:
28+
AppendPredefinedTypeSyntax(stringBuilder, predefinedTypeSyntax);
29+
break;
30+
31+
case IdentifierNameSyntax identifierNameSyntax:
32+
AppendIdentifierNameSyntax(stringBuilder, context, identifierNameSyntax);
33+
break;
34+
35+
case GenericNameSyntax genericTypeSyntax:
36+
AppendGenericTypeSyntax(stringBuilder, context, genericTypeSyntax);
37+
break;
38+
}
39+
}
40+
41+
stringBuilder.Append('>');
42+
}
43+
44+
private static void AppendPredefinedTypeSyntax(StringBuilder stringBuilder,
45+
PredefinedTypeSyntax predefinedTypeSyntax)
46+
{
47+
stringBuilder.Append(predefinedTypeSyntax.Keyword.Text);
48+
}
49+
50+
private static void AppendIdentifierNameSyntax(StringBuilder stringBuilder, GeneratorExecutionContext context,
51+
IdentifierNameSyntax identifierNameSyntax)
52+
{
53+
var genericClassName = identifierNameSyntax.Identifier.Text;
54+
var genericClassNamespace = identifierNameSyntax.GetTypeNamespace(context);
55+
56+
stringBuilder.Append("global::");
57+
stringBuilder.Append(genericClassNamespace);
58+
stringBuilder.Append('.');
59+
stringBuilder.Append(genericClassName);
60+
}
61+
62+
private static void AppendGenericTypeSyntax(StringBuilder stringBuilder, GeneratorExecutionContext context,
63+
GenericNameSyntax genericTypeSyntax)
64+
{
65+
var genericClassName = genericTypeSyntax.Identifier.Text;
66+
var genericClassNamespace = genericTypeSyntax.GetTypeNamespace(context);
67+
68+
if (string.IsNullOrWhiteSpace(genericClassNamespace) == false)
69+
{
70+
stringBuilder.Append("global::");
71+
stringBuilder.Append(genericClassNamespace);
72+
stringBuilder.Append('.');
73+
}
74+
75+
stringBuilder.Append(genericClassName);
76+
77+
AppendGenericString(stringBuilder, context, genericTypeSyntax.TypeArgumentList.Arguments);
78+
}
79+
}

src/UnityUxmlGenerator/Extensions/SyntaxNodeExtensions.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ when qualifiedNameSyntax.Right.Identifier.Text.Contains(attributeName):
5252

5353
public static string? GetTypeNamespace(this SyntaxNode syntaxNode, GeneratorExecutionContext context)
5454
{
55-
return GetTypeSymbol(syntaxNode, context)?.ContainingNamespace.ToString();
55+
var containingNamespace = GetTypeSymbol(syntaxNode, context)?.ContainingNamespace;
56+
57+
if (containingNamespace is null || containingNamespace.IsGlobalNamespace)
58+
{
59+
return null;
60+
}
61+
62+
return containingNamespace.ToString();
5663
}
5764
}

src/UnityUxmlGenerator/UxmlGenerator.Traits.cs

+9-14
Original file line numberDiff line numberDiff line change
@@ -133,28 +133,23 @@ private static StatementSyntax GetAttributeValueAssignmentStatement(string prope
133133

134134
private static string GetBaseClassName(GeneratorExecutionContext context, UxmlTraitsCapture capture)
135135
{
136-
var baseClassName = capture.GetBaseClassName(out var genericClass);
136+
var baseClassName = capture.GetBaseClassName(out var genericTypeArguments);
137137
var baseClassNamespace = capture.BaseClassType.GetTypeNamespace(context);
138138

139-
if (genericClass is null)
139+
if (genericTypeArguments is null)
140140
{
141141
return $"global::{baseClassNamespace}.{baseClassName}";
142142
}
143143

144-
if (genericClass is PredefinedTypeSyntax predefinedTypeSyntax)
145-
{
146-
return $"global::{baseClassNamespace}.{baseClassName}<{predefinedTypeSyntax.Keyword.Text}>";
147-
}
144+
var stringBuilder = new StringBuilder();
148145

149-
if (genericClass is IdentifierNameSyntax customTypeSyntax)
150-
{
151-
var genericClassName = customTypeSyntax.Identifier.Text;
152-
var genericClassNamespace = customTypeSyntax.GetTypeNamespace(context);
153-
154-
return $"global::{baseClassNamespace}.{baseClassName}<global::{genericClassNamespace}.{genericClassName}>";
155-
}
146+
stringBuilder.Append("global::");
147+
stringBuilder.Append(baseClassNamespace);
148+
stringBuilder.Append('.');
149+
stringBuilder.Append(baseClassName);
150+
stringBuilder.AppendGenericString(context, genericTypeArguments);
156151

157-
return string.Empty;
152+
return stringBuilder.ToString();
158153
}
159154

160155
private static bool TryGetUxmlAttributeInfo(GeneratorExecutionContext context, PropertyDeclarationSyntax property,

src/UnityUxmlGenerator/UxmlGenerator.Widgets.cs

+1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ private static FieldDeclarationSyntax FieldWidget(
164164
{
165165
var variableDeclaration = VariableDeclarator(Identifier(identifier));
166166

167+
// TODO: Change to BaseObjectCreationExpressionSyntax.
167168
if (initializer is not null)
168169
{
169170
variableDeclaration = variableDeclaration.WithInitializer(EqualsValueClause(ImplicitObjectCreationExpression()

0 commit comments

Comments
 (0)