示例#1
0
        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()));
            }
        }
示例#2
0
        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)));
                }
            }
        }
示例#3
0
        /// <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);
        }