Exemplo n.º 1
0
        public override object VisitSwitchCaseBody([NotNull] LGTemplateParser.SwitchCaseBodyContext context)
        {
            var switchCaseNodes   = context.switchCaseTemplateBody().switchCaseRule();
            var length            = switchCaseNodes.Length;
            var switchExprs       = switchCaseNodes[0].switchCaseStat().EXPRESSION();
            var switchErrorPrefix = "Switch '" + switchExprs[0].GetText() + "': ";
            var switchExprResult  = EvalExpression(switchExprs[0].GetText(), switchCaseNodes[0].switchCaseStat(), switchErrorPrefix).ToString();
            var idx = 0;

            foreach (var switchCaseNode in switchCaseNodes)
            {
                if (idx == 0)
                {
                    idx++;
                    continue;   // skip the first node, which is switch statement
                }

                if (idx == length - 1 && switchCaseNode.switchCaseStat().DEFAULT() != null)
                {
                    var defaultBody = switchCaseNode.normalTemplateBody();
                    if (defaultBody != null)
                    {
                        return(Visit(defaultBody));
                    }
                    else
                    {
                        return(null);
                    }
                }

                var caseExprs = switchCaseNode.switchCaseStat().EXPRESSION();

                var caseErrorPrefix = "Case '" + caseExprs[0].GetText() + "': ";
                var caseExprResult  = EvalExpression(caseExprs[0].GetText(), switchCaseNode.switchCaseStat(), caseErrorPrefix).ToString();
                if (switchExprResult == caseExprResult)
                {
                    return(Visit(switchCaseNode.normalTemplateBody()));
                }

                idx++;
            }

            return(null);
        }
Exemplo n.º 2
0
        public override AnalyzerResult VisitSwitchCaseBody([NotNull] LGTemplateParser.SwitchCaseBodyContext context)
        {
            var result = new AnalyzerResult();
            var switchCaseNodes = context.switchCaseTemplateBody().switchCaseRule();
            foreach (var iterNode in switchCaseNodes)
            {
                var expression = iterNode.switchCaseStat().EXPRESSION();
                if (expression.Length > 0)
                {
                    result.Union(AnalyzeExpression(expression[0].GetText()));
                }

                if (iterNode.normalTemplateBody() != null)
                {
                    result.Union(Visit(iterNode.normalTemplateBody()));
                }
            }

            return result;
        }
Exemplo n.º 3
0
            public override object VisitSwitchCaseBody([NotNull] LGTemplateParser.SwitchCaseBodyContext context)
            {
                var switchCaseRules = context.switchCaseTemplateBody().switchCaseRule();
                var length          = switchCaseRules.Length;

                for (var idx = 0; idx < length; idx++)
                {
                    var switchCaseNode = switchCaseRules[idx].switchCaseStat();
                    var switchExpr     = switchCaseNode.SWITCH() != null;
                    var caseExpr       = switchCaseNode.CASE() != null;
                    var defaultExpr    = switchCaseNode.DEFAULT() != null;
                    var node           = switchExpr ? switchCaseNode.SWITCH() :
                                         caseExpr?switchCaseNode.CASE() :
                                             switchCaseNode.DEFAULT();

                    if (node.GetText().Count(u => u == ' ') > 1 ||
                        (idx == 0 && !switchExpr) ||
                        (idx > 0 && switchExpr) ||
                        (idx > 0 && idx < length - 1 && !caseExpr))
                    {
                        return(null);
                    }

                    if ((switchExpr || caseExpr) && switchCaseNode.expression().Length == 1)
                    {
                        FillInExpression(switchCaseNode.expression(0));
                    }

                    if ((caseExpr || defaultExpr) && switchCaseRules[idx].normalTemplateBody() != null)
                    {
                        Visit(switchCaseRules[idx].normalTemplateBody());
                    }
                }

                return(null);
            }
Exemplo n.º 4
0
        public override List <Diagnostic> VisitSwitchCaseBody([NotNull] LGTemplateParser.SwitchCaseBodyContext context)
        {
            var result          = new List <Diagnostic>();
            var switchCaseRules = context.switchCaseTemplateBody().switchCaseRule();
            var length          = switchCaseRules.Length;

            for (var idx = 0; idx < length; idx++)
            {
                var switchCaseNode = switchCaseRules[idx].switchCaseStat();
                var switchExpr     = switchCaseNode.SWITCH() != null;
                var caseExpr       = switchCaseNode.CASE() != null;
                var defaultExpr    = switchCaseNode.DEFAULT() != null;
                var node           = switchExpr ? switchCaseNode.SWITCH() :
                                     caseExpr?switchCaseNode.CASE() :
                                         switchCaseNode.DEFAULT();

                if (node.GetText().Count(u => u == ' ') > 1)
                {
                    result.Add(BuildLGDiagnostic(TemplateErrors.InvalidWhitespaceInSwitchCase, context: switchCaseNode));
                }

                if (idx == 0 && !switchExpr)
                {
                    result.Add(BuildLGDiagnostic(TemplateErrors.NotStartWithSwitchInSwitchCase, context: switchCaseNode));
                }

                if (idx > 0 && switchExpr)
                {
                    result.Add(BuildLGDiagnostic(TemplateErrors.MultipleSwithStatementInSwitchCase, context: switchCaseNode));
                }

                if (idx > 0 && idx < length - 1 && !caseExpr)
                {
                    result.Add(BuildLGDiagnostic(TemplateErrors.InvalidStatementInMiddlerOfSwitchCase, context: switchCaseNode));
                }

                if (idx == length - 1 && (caseExpr || defaultExpr))
                {
                    if (caseExpr)
                    {
                        result.Add(BuildLGDiagnostic(TemplateErrors.NotEndWithDefaultInSwitchCase, DiagnosticSeverity.Warning, switchCaseNode));
                    }
                    else
                    {
                        if (length == 2)
                        {
                            result.Add(BuildLGDiagnostic(TemplateErrors.MissingCaseInSwitchCase, DiagnosticSeverity.Warning, switchCaseNode));
                        }
                    }
                }

                if (switchExpr || caseExpr)
                {
                    if (switchCaseNode.expression().Length != 1)
                    {
                        result.Add(BuildLGDiagnostic(TemplateErrors.InvalidExpressionInSwiathCase, context: switchCaseNode));
                    }
                    else
                    {
                        var errorPrefix = switchExpr ? "Switch" : "Case";
                        errorPrefix += " '" + switchCaseNode.expression(0).GetText() + "': ";
                        result.AddRange(CheckExpression(switchCaseNode.expression(0), errorPrefix));
                    }
                }
                else
                {
                    if (switchCaseNode.expression().Length != 0 || switchCaseNode.TEXT().Length != 0)
                    {
                        result.Add(BuildLGDiagnostic(TemplateErrors.ExtraExpressionInSwitchCase, context: switchCaseNode));
                    }
                }

                if (caseExpr || defaultExpr)
                {
                    if (switchCaseRules[idx].normalTemplateBody() != null)
                    {
                        result.AddRange(Visit(switchCaseRules[idx].normalTemplateBody()));
                    }
                    else
                    {
                        result.Add(BuildLGDiagnostic(TemplateErrors.MissingTemplateBodyInSwitchCase, context: switchCaseNode));
                    }
                }
            }

            return(result);
        }
 /// <summary>
 /// Exit a parse tree produced by the <c>switchCaseBody</c>
 /// labeled alternative in <see cref="LGTemplateParser.body"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitSwitchCaseBody([NotNull] LGTemplateParser.SwitchCaseBodyContext context)
 {
 }
 /// <summary>
 /// Visit a parse tree produced by the <c>switchCaseBody</c>
 /// labeled alternative in <see cref="LGTemplateParser.body"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitSwitchCaseBody([NotNull] LGTemplateParser.SwitchCaseBodyContext context)
 {
     return(VisitChildren(context));
 }