forked from MaterialDesignInXAML/MaterialDesignInXamlToolkit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIconDataFactorySyntaxRewriter.cs
More file actions
63 lines (51 loc) · 2.86 KB
/
IconDataFactorySyntaxRewriter.cs
File metadata and controls
63 lines (51 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace mdresgen
{
internal class IconDataFactorySyntaxRewriter : CSharpSyntaxRewriter
{
private readonly IEnumerable<Icon> _icons;
public IconDataFactorySyntaxRewriter(IEnumerable<Icon> icons, bool visitIntoStructuredTrivia = false) : base(visitIntoStructuredTrivia)
{
_icons = icons ?? throw new ArgumentNullException(nameof(icons));
}
public override SyntaxNode VisitInitializerExpression(InitializerExpressionSyntax node)
{
if (node.Kind() != SyntaxKind.CollectionInitializerExpression)
return node;
var initialiserExpressions = GetInitializerItems(_icons);
var complexElementInitializerExpression = SyntaxFactory.InitializerExpression(SyntaxKind.ComplexElementInitializerExpression, initialiserExpressions);
return complexElementInitializerExpression;
}
private static SeparatedSyntaxList<ExpressionSyntax> GetInitializerItems(
IEnumerable<Icon> icons)
{
var comma = SyntaxFactory.Token(SyntaxKind.CommaToken);
var trailingTriviaList = SyntaxTriviaList.Create(SyntaxFactory.ElasticCarriageReturnLineFeed);
var separator = SyntaxFactory.Identifier(SyntaxTriviaList.Empty, comma.Text, trailingTriviaList);
var initializerExpressionSyntaxList = icons.Select(icon =>
{
//Indent
var indent = SyntaxTriviaList.Create(SyntaxFactory.Whitespace(" "));
//create a member access expression
var memberAccessExpressionSyntax =
SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
SyntaxFactory.IdentifierName("PackIconKind"),
SyntaxFactory.IdentifierName(icon.Name));
//create a string literal expression
var literalExpressionSyntax = SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression,
SyntaxFactory.Literal(icon.Data));
var separatedSyntaxList = SyntaxFactory.SeparatedList(new ExpressionSyntax[] { memberAccessExpressionSyntax, literalExpressionSyntax });
var initializerExpressionSyntax = SyntaxFactory.InitializerExpression(SyntaxKind.ComplexElementInitializerExpression, separatedSyntaxList)
.WithLeadingTrivia(indent);
return (ExpressionSyntax)initializerExpressionSyntax;
}).ToList();
var result = SyntaxFactory.SeparatedList(initializerExpressionSyntaxList, Enumerable.Repeat(separator, initializerExpressionSyntaxList.Count - 1));
return result;
}
}
}