private bool ApplyConditionalBlocks(string[] allLines, IElement element, CodeContext codeContext, string fileName, ref int index)
{
bool succeeded = true;
BlockType lastBlockType = BlockType.None;
BlockType nextBlockType = ConditionalCodeBlock.GetBlockTypeStartingAt(allLines, index);
List<ConditionalCodeBlock> conditionalBlocks = new List<ConditionalCodeBlock>();
while (nextBlockType.LinksFromPreviousType(lastBlockType))
{
ConditionalCodeBlock ccb = ConditionalCodeBlock.GetConditionalBlockFrom(allLines, index);
conditionalBlocks.Add(ccb);
lastBlockType = nextBlockType;
index += ccb.LineCountIncludingConditionLine;
nextBlockType = ConditionalCodeBlock.GetBlockTypeStartingAt(allLines, index);
}
// Only one of these blocks can trigger
foreach (ConditionalCodeBlock ccb in conditionalBlocks)
{
// This code context is for the contents of the condition.
// For example, the i variable in a for-loop will have scope
// limited to the application of the for-loop.
codeContext.AddVariableStack();
bool shouldExecute = BranchingParser.Self.DetermineIfShouldExecute(
this, codeContext, ccb, mExpressionParser, true);
while (shouldExecute)
{
codeContext.AddVariableStack();
int startBlock = ccb.FirstLineOfBlockIndex;
int blockLength = ccb.BlockLength;
if (ccb.IsBlockWrappedInBrackets)
{
startBlock++;
blockLength -= 2;
}
succeeded = ApplyLinesInternal(allLines, startBlock, blockLength, element, codeContext, fileName);
shouldExecute = false;
if (succeeded)
{
if (ccb.BlockType == BlockType.For)
{
BranchingParser.Self.IncrementFor(codeContext, ccb, mExpressionParser);
shouldExecute = BranchingParser.Self.DetermineIfShouldExecute(
this, codeContext, ccb, mExpressionParser, false);
}
else if (ccb.BlockType == BlockType.While)
{
shouldExecute = BranchingParser.Self.DetermineIfShouldExecute(
this, codeContext, ccb, mExpressionParser, false);
}
}
codeContext.RemoveVariableStack();
}
codeContext.RemoveVariableStack();
}
return succeeded;
}