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); }
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; }
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); }
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)); }