|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
3 | 3 | using System.Diagnostics; |
| 4 | +using System.Runtime.CompilerServices; |
4 | 5 | using System.Text; |
5 | 6 | using GameDevWare.Dynamic.Expressions.Properties; |
6 | 7 |
|
@@ -64,6 +65,14 @@ private static void Render(SyntaxTreeNode syntaxTree, StringBuilder builder, boo |
64 | 65 | case Constants.EXPRESSION_TYPE_DEFAULT: RenderDefault(syntaxTree, builder); break; |
65 | 66 | case Constants.EXPRESSION_TYPE_NEW_ARRAY_BOUNDS: |
66 | 67 | 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; |
67 | 76 | case Constants.EXPRESSION_TYPE_UNARY_PLUS: |
68 | 77 | case Constants.EXPRESSION_TYPE_NEGATE_CHECKED: |
69 | 78 | case Constants.EXPRESSION_TYPE_NEGATE: |
@@ -377,6 +386,176 @@ private static void RenderNew(SyntaxTreeNode syntaxTree, StringBuilder builder, |
377 | 386 | else |
378 | 387 | builder.Append(')'); |
379 | 388 | } |
| 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 | + } |
380 | 559 | private static void RenderDefault(SyntaxTreeNode syntaxTree, StringBuilder builder) |
381 | 560 | { |
382 | 561 | if (syntaxTree == null) throw new ArgumentNullException(nameof(syntaxTree)); |
|
0 commit comments