internal static IfStatementSyntax IfIsTruthy(List <string> elementsToCheck, AST.IfType ifType) { var condition = CheckContextForTruthy(elementsToCheck, ifType); if (condition == null) { return(null); } else { return(SF.IfStatement(condition, SF.EmptyStatement())); } }
internal void DoTruthyCheck(List <StatementSyntax> ifBlock, List <StatementSyntax> elseBlock = null, AST.IfType ifType = IfType.If) { var contextToCheck = TruthyStack.Pop(); if (contextToCheck.Symbol.SpecialType == SpecialType.System_Boolean) {//Special treatment for boolean literals if (contextToCheck.FullPath.Equals("true")) { resultStack.Peek().AddRange(ifBlock); return; } if (contextToCheck.FullPath.Equals("false")) { if (elseBlock != null) { resultStack.Peek().AddRange(elseBlock); } return; } }//No boolean literal to be checked. Procede as usual IfStatementSyntax ifStatement; if (TruthyStack.Any()) { ifStatement = SyntaxHelper.IfIsTruthy(GetQueryElements(TruthyStack.Peek(), contextToCheck), ifType); } else { ifStatement = SyntaxHelper.IfIsTruthy(GetQueryElements(null, contextToCheck), ifType); } if (ifStatement == null) { if (elseBlock != null) { AddTypeError("Unreachable 'else' Block", HandlebarsTypeErrorKind.UnreachableCode); } resultStack.Peek().AddRange(ifBlock); } else { if (elseBlock != null) { resultStack.Peek().Add( ifStatement.WithStatement(SyntaxFactory.Block(ifBlock)). WithElse(SyntaxFactory.ElseClause(SyntaxFactory.Block(elseBlock))) ); } else { resultStack.Peek().Add( ifStatement.WithStatement(SyntaxFactory.Block(ifBlock))); } } }
/// <summary> /// Concats elements to a condition (e.g. (a && b && c) or (!a || !b || !c)) /// </summary> /// <param name="elementsToCheck"></param> /// <param name="ifType"></param> /// <returns></returns> private static ExpressionSyntax CheckContextForTruthy(List <string> elementsToCheck, AST.IfType ifType) { if (elementsToCheck == null || !elementsToCheck.Any()) { return(null); } var result = ifType == AST.IfType.If ? SF.ParseExpression($"IsTruthy({elementsToCheck[0]})") : SF.ParseExpression($"!IsTruthy({elementsToCheck[0]})"); foreach (var element in elementsToCheck.Skip(1)) { result = ifType == AST.IfType.If ? BinaryIfIsTruthyExpression(result, element) : BinaryUnlessIsTruthyExpression(result, element); } return(result); }