/// <summary> /// Initializes a new instance of the <see cref="CSharpAsLongAsInstruction"/> class. /// </summary> /// <param name="context">The creation context.</param> /// <param name="parentFeature">The parent feature.</param> /// <param name="source">The Easly instruction from which the C# instruction is created.</param> protected CSharpAsLongAsInstruction(ICSharpContext context, ICSharpFeature parentFeature, IAsLongAsInstruction source) : base(context, parentFeature, source) { ContinueCondition = CSharpExpression.Create(context, (IExpression)source.ContinueCondition); foreach (IContinuation Continuation in source.ContinuationList) { ICSharpContinuation NewContinuation = CSharpContinuation.Create(context, parentFeature, Continuation); ContinuationList.Add(NewContinuation); } if (source.ElseInstructions.IsAssigned) { ElseInstructions = CSharpScope.Create(context, parentFeature, (IScope)source.ElseInstructions.Item); } }
/// <summary> /// Writes down the C# instruction. /// </summary> /// <param name="writer">The stream on which to write.</param> public override void WriteCSharp(ICSharpWriter writer) { Debug.Assert(WriteDown); string ContinueExpressionText; for (int i = 0; i < ContinuationList.Count; i++) { ICSharpContinuation Item = ContinuationList[i]; if (i > 0) { writer.WriteEmptyLine(); } WriteCSharpContinueCondition(writer, out ContinueExpressionText); writer.WriteIndentedLine($"if ({ContinueExpressionText})"); Item.WriteCSharpInstructions(writer); int CleanupInstructionCount = 0; for (int j = i; j > 0; j--) { ICSharpContinuation PreviousItem = ContinuationList[j - 1]; CleanupInstructionCount += PreviousItem.CleanupList.Count; } if (CleanupInstructionCount > 0) { writer.WriteIndentedLine("else"); if (CleanupInstructionCount > 1) { writer.WriteIndentedLine("{"); } writer.IncreaseIndent(); for (int j = i; j > 0; j--) { if (j < i) { writer.WriteEmptyLine(); } ICSharpContinuation PreviousItem = ContinuationList[j - 1]; PreviousItem.WriteCSharpCleanupInstructions(writer); } writer.DecreaseIndent(); if (CleanupInstructionCount > 1) { writer.WriteIndentedLine("}"); } } } if (ElseInstructions != null) { writer.WriteEmptyLine(); WriteCSharpContinueCondition(writer, out ContinueExpressionText); writer.WriteIndentedLine($"if (!({ContinueExpressionText}))"); ElseInstructions.WriteCSharp(writer, CSharpCurlyBracketsInsertions.Mandatory, false); } }