Skip to content

Commit 5b923c4

Browse files
committed
Generate code only for VisualElements.
1 parent 82cf4a9 commit 5b923c4

File tree

14 files changed

+167
-79
lines changed

14 files changed

+167
-79
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
"author": { "name": "ChebanovDD", "url": "https://github.com/ChebanovDD" },
55
"version": "0.0.1",
66
"unity": "2018.4",
7-
"description": "",
7+
"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" ]
99
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.CodeAnalysis.CSharp.Syntax;
2+
using UnityUxmlGenerator.Extensions;
23

34
namespace UnityUxmlGenerator.Captures;
45

@@ -7,9 +8,12 @@ internal sealed class UxmlFactoryCapture
78
public UxmlFactoryCapture(ClassDeclarationSyntax @class)
89
{
910
Class = @class;
10-
ClassIdentifier = @class.Identifier.Text;
11+
ClassName = @class.Identifier.Text;
12+
ClassNamespace = @class.GetParent<NamespaceDeclarationSyntax>()!.Name.ToString();
1113
}
1214

13-
public string ClassIdentifier { get; }
15+
public string ClassName { get; }
16+
public string ClassNamespace { get; }
17+
1418
public ClassDeclarationSyntax Class { get; }
1519
}
Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,43 @@
11
using Microsoft.CodeAnalysis.CSharp.Syntax;
2+
using UnityUxmlGenerator.Extensions;
23

34
namespace UnityUxmlGenerator.Captures;
45

56
internal sealed class UxmlTraitsCapture
67
{
7-
public UxmlTraitsCapture(ClassDeclarationSyntax @class, string baseClassIdentifier)
8+
public UxmlTraitsCapture(ClassDeclarationSyntax @class, TypeSyntax baseClassType)
89
{
910
Class = @class;
10-
ClassIdentifier = @class.Identifier.Text;
11-
BaseClassIdentifier = baseClassIdentifier;
11+
ClassName = @class.Identifier.Text;
12+
ClassNamespace = @class.GetParent<NamespaceDeclarationSyntax>()!.Name.ToString();
13+
14+
BaseClassType = baseClassType;
1215
Properties = new List<(string PropertyName, string? DefaultValue)>();
1316
}
1417

15-
public string ClassIdentifier { get; }
16-
public string BaseClassIdentifier { get; }
18+
public string ClassName { get; }
19+
public string ClassNamespace { get; }
1720

21+
public TypeSyntax BaseClassType { get; }
1822
public ClassDeclarationSyntax Class { get; }
23+
1924
public List<(string PropertyName, string? DefaultValue)> Properties { get; }
25+
26+
public string GetBaseClassName(out TypeSyntax? genericTypeSyntax)
27+
{
28+
if (BaseClassType is GenericNameSyntax genericNameSyntax)
29+
{
30+
genericTypeSyntax = genericNameSyntax.TypeArgumentList.Arguments[0];
31+
return genericNameSyntax.Identifier.Text;
32+
}
33+
34+
genericTypeSyntax = default;
35+
36+
if (BaseClassType is IdentifierNameSyntax identifierNameSyntax)
37+
{
38+
return identifierNameSyntax.Identifier.Text;
39+
}
40+
41+
return BaseClassType.GetText().ToString().Trim();
42+
}
2043
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.CSharp;
3+
using Microsoft.CodeAnalysis.CSharp.Syntax;
4+
5+
namespace UnityUxmlGenerator.Extensions;
6+
7+
internal static class BaseTypeDeclarationSyntaxExtensions
8+
{
9+
public static bool InheritsFromFullyQualifiedName(this BaseTypeDeclarationSyntax @class,
10+
GeneratorExecutionContext context, string name)
11+
{
12+
INamedTypeSymbol? symbol = context.Compilation.GetSemanticModel(@class.SyntaxTree).GetDeclaredSymbol(@class);
13+
14+
if (symbol?.ToString() == name)
15+
{
16+
return true;
17+
}
18+
19+
symbol = symbol?.BaseType;
20+
21+
while (symbol != null)
22+
{
23+
if (symbol.ToString() == name)
24+
{
25+
return true;
26+
}
27+
28+
symbol = symbol.BaseType;
29+
}
30+
31+
return false;
32+
}
33+
}

src/UnityUxmlGenerator/Extensions/StringExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ internal static class StringExtensions
66
{
77
public static string ToFieldName(this string propertyName)
88
{
9-
return $"_{char.ToLower(propertyName[0])}{propertyName.Substring(1, propertyName.Length - 1)}";
9+
return string.Concat(char.ToLower(propertyName[0]), propertyName.Substring(1));
1010
}
1111

1212
public static string ToDashCase(this string propertyName)

src/UnityUxmlGenerator/Extensions/SyntaxNodeExtensions.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.CSharp.Syntax;
23

34
namespace UnityUxmlGenerator.Extensions;
45

@@ -7,7 +8,7 @@ internal static class SyntaxNodeExtensions
78
public static T? GetParent<T>(this SyntaxNode syntaxNode)
89
{
910
var parent = syntaxNode.Parent;
10-
11+
1112
while (parent != null)
1213
{
1314
if (parent is T result)
@@ -20,4 +21,11 @@ internal static class SyntaxNodeExtensions
2021

2122
return default;
2223
}
24+
25+
public static string? GetTypeNamespace(this TypeSyntax typeSyntax, GeneratorExecutionContext context)
26+
{
27+
return context.Compilation
28+
.GetSemanticModel(typeSyntax.SyntaxTree)
29+
.GetTypeInfo(typeSyntax).Type?.ContainingNamespace.ToString();
30+
}
2331
}

src/UnityUxmlGenerator/SyntaxReceivers/UxmlFactoryReceiver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
2525

2626
var @class = attribute.GetParent<ClassDeclarationSyntax>();
2727

28-
if (@class is null)
28+
if (@class?.BaseList is null || @class.BaseList.Types.Count == 0)
2929
{
3030
return;
3131
}

src/UnityUxmlGenerator/SyntaxReceivers/UxmlTraitsReceiver.cs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
2727

2828
var @class = property?.GetParent<ClassDeclarationSyntax>();
2929

30-
if (@class is null || IsValid(@class, out var baseClassIdentifier) == false)
30+
if (@class?.BaseList is null || @class.BaseList.Types.Count == 0)
3131
{
3232
return;
3333
}
3434

3535
if (_captures.TryGetValue(@class.Identifier.Text, out var uxmlTraits) == false)
3636
{
37-
uxmlTraits = new UxmlTraitsCapture(@class, baseClassIdentifier!);
37+
uxmlTraits = new UxmlTraitsCapture(@class, @class.BaseList.Types.First().Type);
3838
_captures.Add(@class.Identifier.Text, uxmlTraits);
3939
}
4040

@@ -50,16 +50,4 @@ public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
5050
_ => null
5151
};
5252
}
53-
54-
private static bool IsValid(ClassDeclarationSyntax @class, out string? baseClassIdentifier)
55-
{
56-
if (@class.BaseList == null)
57-
{
58-
baseClassIdentifier = default;
59-
return false;
60-
}
61-
62-
baseClassIdentifier = @class.BaseList.Types.First().Type.GetText().ToString().Trim();
63-
return string.IsNullOrWhiteSpace(baseClassIdentifier) == false;
64-
}
6553
}

src/UnityUxmlGenerator/UnityUxmlGenerator.csproj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<IsPackable>false</IsPackable>
6-
<ImplicitUsings>enable</ImplicitUsings>
75
<Nullable>enable</Nullable>
86
<LangVersion>11</LangVersion>
7+
<IsPackable>false</IsPackable>
8+
<ImplicitUsings>enable</ImplicitUsings>
99
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
10-
<Version>0.0.0.1</Version>
1110
</PropertyGroup>
1211

1312
<ItemGroup>

0 commit comments

Comments
 (0)