/// <summary> /// Converts conditional statements whose top-most condition is an AND. /// Creates a nested structure without the top-most AND. /// </summary> private (bool, QsConditionalStatement) ProcessAND(QsConditionalStatement conditionStatment) { // This method expects elif blocks to have been abstracted out if (conditionStatment.ConditionalBlocks.Length != 1) { return(false, conditionStatment); } var(condition, block) = conditionStatment.ConditionalBlocks[0]; if (condition.Expression is ExpressionKind.AND andCondition) { var subCondition = new QsConditionalStatement(ImmutableArray.Create(Tuple.Create(andCondition.Item2, block)), conditionStatment.Default); var subIfStatment = new QsStatement( QsStatementKind.NewQsConditionalStatement(subCondition), LocalDeclarations.Empty, block.Location, QsComments.Empty); var newBlock = new QsPositionedBlock( new QsScope(ImmutableArray.Create(subIfStatment), block.Body.KnownSymbols), block.Location, QsComments.Empty); return(true, new QsConditionalStatement(ImmutableArray.Create(Tuple.Create(andCondition.Item1, newBlock)), conditionStatment.Default)); } else { return(false, conditionStatment); } }
public override QsStatementKind onConjugation(QsConjugation stm) { var inner = stm.InnerTransformation; var innerLoc = this._Scope.onLocation(inner.Location); var transformedInner = new QsPositionedBlock(this._Scope.Transform(inner.Body), innerLoc, inner.Comments); return(QsStatementKind.NewQsConjugation(new QsConjugation(stm.OuterTransformation, transformedInner))); }