Jsm.Control.If.IfSegment.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using OpenVIII.Fields.Scripts.Instructions;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace OpenVIII.Fields.Scripts
  6. {
  7. public static partial class Jsm
  8. {
  9. #region Classes
  10. public static partial class Control
  11. {
  12. #region Classes
  13. public sealed partial class If
  14. {
  15. #region Classes
  16. public sealed class IfSegment : ExecutableSegment
  17. {
  18. #region Fields
  19. private readonly If _aggregator;
  20. #endregion Fields
  21. #region Constructors
  22. public IfSegment(int from, int to, If aggregator)
  23. : base(from, to) => _aggregator = aggregator;
  24. #endregion Constructors
  25. #region Properties
  26. public JPF Jpf => ((JPF)_list[0]);
  27. #endregion Properties
  28. #region Methods
  29. public override void Format(ScriptWriter sw, IScriptFormatterContext formatterContext, IServices services)
  30. {
  31. sw.Append("if(");
  32. Jpf.Format(sw, formatterContext, services);
  33. sw.AppendLine(")");
  34. FormatBranch(sw, formatterContext, services, GetBodyInstructions());
  35. foreach (var item in _aggregator.EnumerateElseBlocks())
  36. item.Format(sw, formatterContext, services);
  37. }
  38. public IEnumerable<IJsmInstruction> GetBodyInstructions() => _list.Skip(1);
  39. public override IScriptExecutor GetExecuter() => new Executor(_aggregator);
  40. public override void ToString(StringBuilder sb)
  41. {
  42. sb.Append("if(");
  43. sb.Append((JPF)_list[0]);
  44. sb.AppendLine(")");
  45. FormatBranch(sb, _list.Skip(1));
  46. }
  47. #endregion Methods
  48. }
  49. #endregion Classes
  50. }
  51. #endregion Classes
  52. }
  53. #endregion Classes
  54. }
  55. }