Skip to content

Commit e90b18f

Browse files
committed
fix: Added formatting of new expression types (Member Init/List Init) from the syntax tree.
1 parent 02a4c0a commit e90b18f

2 files changed

Lines changed: 189 additions & 5 deletions

File tree

src/GameDevWare.Dynamic.Expressions.Unity.2021/Packages/com.gamedevware.csharpeval/Runtime/CSharp/CSharpExpressionFormatter.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -815,10 +815,10 @@ private static void RenderMemberBinding(MemberBinding memberBinding, StringBuild
815815
isFirstBinder = false;
816816
}
817817

818-
builder.Append("} ");
818+
builder.Append(" }");
819819
break;
820820
case MemberBindingType.ListBinding:
821-
builder.Append(" { ");
821+
builder.Append("{ ");
822822
var isFirstInitializer = true;
823823
foreach (var initializer in ((MemberListBinding)memberBinding).Initializers)
824824
{
@@ -842,17 +842,22 @@ private static void RenderListInitializer(ElementInit initializer, StringBuilder
842842
Render(initializer.Arguments[0], builder, true, checkedScope);
843843
else
844844
{
845+
if (initializer.Arguments.Count > 1)
846+
{
847+
builder.Append("{ ");
848+
}
845849
var isFirstArgument = true;
846-
builder.Append("{ ");
847850
foreach (var argument in initializer.Arguments)
848851
{
849852
if (!isFirstArgument) builder.Append(", ");
850853
Render(argument, builder, true, checkedScope);
851854

852855
isFirstArgument = false;
853856
}
854-
855-
builder.Append('}');
857+
if (initializer.Arguments.Count > 1)
858+
{
859+
builder.Append(" }");
860+
}
856861
}
857862
}
858863

src/GameDevWare.Dynamic.Expressions.Unity.2021/Packages/com.gamedevware.csharpeval/Runtime/CSharp/CSharpSyntaxTreeFormatter.cs

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
4+
using System.Runtime.CompilerServices;
45
using System.Text;
56
using GameDevWare.Dynamic.Expressions.Properties;
67

@@ -64,6 +65,14 @@ private static void Render(SyntaxTreeNode syntaxTree, StringBuilder builder, boo
6465
case Constants.EXPRESSION_TYPE_DEFAULT: RenderDefault(syntaxTree, builder); break;
6566
case Constants.EXPRESSION_TYPE_NEW_ARRAY_BOUNDS:
6667
case Constants.EXPRESSION_TYPE_NEW: RenderNew(syntaxTree, builder, checkedScope); break;
68+
case Constants.EXPRESSION_TYPE_NEW_ARRAY_INIT: RenderNewArrayInit(syntaxTree, builder, checkedScope); break;
69+
case Constants.EXPRESSION_TYPE_MEMBER_INIT: RenderMemberInit(syntaxTree, builder, checkedScope); break;
70+
case Constants.EXPRESSION_TYPE_LIST_INIT: RenderListInit(syntaxTree, builder, checkedScope); break;
71+
case Constants.EXPRESSION_TYPE_ELEMENT_INIT_BINDING: RenderElementInit(syntaxTree, builder, checkedScope); break;
72+
case Constants.EXPRESSION_TYPE_ASSIGNMENT_BINDING:
73+
case Constants.EXPRESSION_TYPE_ASSIGNMENT_BINDING_ALT: RenderAssignmentBinding(syntaxTree, builder, checkedScope); break;
74+
case Constants.EXPRESSION_TYPE_LIST_BINDING: RenderListBinding(syntaxTree, builder, checkedScope); break;
75+
case Constants.EXPRESSION_TYPE_MEMBER_BINDING: RenderMemberBinding(syntaxTree, builder, checkedScope); break;
6776
case Constants.EXPRESSION_TYPE_UNARY_PLUS:
6877
case Constants.EXPRESSION_TYPE_NEGATE_CHECKED:
6978
case Constants.EXPRESSION_TYPE_NEGATE:
@@ -377,6 +386,176 @@ private static void RenderNew(SyntaxTreeNode syntaxTree, StringBuilder builder,
377386
else
378387
builder.Append(')');
379388
}
389+
private static void RenderListInit(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
390+
{
391+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
392+
if (builder == null) throw new ArgumentNullException(nameof(builder));
393+
394+
var newExpression = syntaxTree.GetNewExpression(true);
395+
var initializers = syntaxTree.GetInitializerOrBindingList(Constants.INITIALIZERS_ATTRIBUTE, true);
396+
397+
Render(newExpression, builder, wrapped: false, checkedScope);
398+
builder.Append(" { ");
399+
400+
var isFirst = true;
401+
foreach (var initializer in initializers)
402+
{
403+
if (!isFirst)
404+
{
405+
builder.Append(", ");
406+
}
407+
isFirst = false;
408+
409+
Render(initializer, builder, true, checkedScope);
410+
}
411+
412+
builder.Append(" }");
413+
}
414+
private static void RenderMemberInit(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
415+
{
416+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
417+
if (builder == null) throw new ArgumentNullException(nameof(builder));
418+
419+
var newExpression = syntaxTree.GetNewExpression(true);
420+
var bindings = syntaxTree.GetInitializerOrBindingList(Constants.BINDINGS_ATTRIBUTE, true);
421+
422+
Render(newExpression, builder, wrapped: false, checkedScope);
423+
builder.Append(" { ");
424+
425+
var isFirst = true;
426+
foreach (var binding in bindings)
427+
{
428+
if (!isFirst)
429+
{
430+
builder.Append(", ");
431+
}
432+
isFirst = false;
433+
434+
Render(binding, builder, true, checkedScope);
435+
}
436+
437+
builder.Append(" }");
438+
}
439+
private static void RenderNewArrayInit(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
440+
{
441+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
442+
if (builder == null) throw new ArgumentNullException(nameof(builder));
443+
444+
var typeName = syntaxTree.GetTypeName(true);
445+
var initializers = syntaxTree.GetInitializerOrBindingList(Constants.INITIALIZERS_ATTRIBUTE, true);
446+
447+
builder.Append("new ");
448+
RenderTypeName(typeName, builder);
449+
builder.Append("[] { ");
450+
451+
var isFirst = true;
452+
foreach (var initializer in initializers)
453+
{
454+
if (!isFirst)
455+
{
456+
builder.Append(", ");
457+
}
458+
isFirst = false;
459+
460+
Render(initializer, builder, true, checkedScope);
461+
}
462+
463+
builder.Append(" }");
464+
}
465+
private static void RenderMemberBinding(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
466+
{
467+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
468+
if (builder == null) throw new ArgumentNullException(nameof(builder));
469+
470+
var memberName = syntaxTree.GetName(throwOnError: true);
471+
var bindings = syntaxTree.GetInitializerOrBindingList(Constants.BINDINGS_ATTRIBUTE, throwOnError: true);
472+
473+
builder.Append(memberName);
474+
builder.Append(" = { ");
475+
476+
var isFirst = true;
477+
foreach (var binding in bindings)
478+
{
479+
if (!isFirst)
480+
{
481+
builder.Append(", ");
482+
}
483+
isFirst = false;
484+
485+
Render(binding, builder, true, checkedScope);
486+
}
487+
488+
builder.Append(" }");
489+
}
490+
private static void RenderListBinding(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
491+
{
492+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
493+
if (builder == null) throw new ArgumentNullException(nameof(builder));
494+
495+
var memberName = syntaxTree.GetName(throwOnError: true);
496+
var initializers = syntaxTree.GetInitializerOrBindingList(Constants.INITIALIZERS_ATTRIBUTE, throwOnError: true);
497+
498+
builder.Append(memberName);
499+
builder.Append(" = { ");
500+
501+
var isFirst = true;
502+
foreach (var initializer in initializers)
503+
{
504+
if (!isFirst)
505+
{
506+
builder.Append(", ");
507+
}
508+
isFirst = false;
509+
510+
Render(initializer, builder, true, checkedScope);
511+
}
512+
513+
builder.Append(" }");
514+
}
515+
private static void RenderAssignmentBinding(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
516+
{
517+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
518+
if (builder == null) throw new ArgumentNullException(nameof(builder));
519+
520+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
521+
if (builder == null) throw new ArgumentNullException(nameof(builder));
522+
523+
var memberName = syntaxTree.GetName(throwOnError: true);
524+
var expression = syntaxTree.GetExpression(throwOnError: true);
525+
526+
builder.Append(memberName);
527+
builder.Append(" = ");
528+
Render(expression, builder, true, checkedScope);
529+
}
530+
private static void RenderElementInit(SyntaxTreeNode syntaxTree, StringBuilder builder, bool checkedScope)
531+
{
532+
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));
533+
if (builder == null) throw new ArgumentNullException(nameof(builder));
534+
535+
var initializers = syntaxTree.GetInitializerOrBindingList(Constants.INITIALIZERS_ATTRIBUTE, throwOnError: true);
536+
537+
if (initializers.Count > 1)
538+
{
539+
builder.Append("{ ");
540+
}
541+
542+
var isFirst = true;
543+
foreach (var initializer in initializers)
544+
{
545+
if (!isFirst)
546+
{
547+
builder.Append(", ");
548+
}
549+
isFirst = false;
550+
551+
Render(initializer, builder, true, checkedScope);
552+
}
553+
554+
if (initializers.Count > 1)
555+
{
556+
builder.Append(" }");
557+
}
558+
}
380559
private static void RenderDefault(SyntaxTreeNode syntaxTree, StringBuilder builder)
381560
{
382561
if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree));

0 commit comments

Comments
 (0)