internal override int TryAddVariable(IEnumerable <Token> tokens, Token token, ICollection <Variable> variables, int i) { var branchVariable = new SwitchBranchVariable { Value = token.Flag }; variables.Add(branchVariable); var nextToken = tokens.ElementAt(i + 1); if (nextToken.Flag != Strings.StartFlag1) { throw new ArgumentException(Tokens[0]); } var paramToken = tokens.ElementAt(i + 2); var variable = new ConstVariable { Value = paramToken.Flag }; branchVariable.Param = variable; var nextCloseToken = tokens.ElementAt(i + 3); if (nextCloseToken.Flag != Strings.EndFlag1) { throw new ArgumentException(Tokens[0]); } var n = tokens.Count(); ICollection <Token> subTokens = new List <Token>(); Util.CollectionTokens(tokens, subTokens, i + 4, Strings.StartFlag2, Strings.EndFlag2); branchVariable.Variables = GetCaseVariables(subTokens); return(i + 3 + subTokens.Count()); }
internal override int BuilderExpression(Context context) { SwitchBranchVariable switchBranch = (SwitchBranchVariable)context.Variable; IEnumerable <CaseVariable> caseVariables = (IEnumerable <CaseVariable>)switchBranch.Variables; var cases = caseVariables.Where(v => !v.Default && v.Variables != null && v.Variables.Any()).Select( c => { ICollection <Expression> expressions = new List <Expression>(); ExpressionBuilder.BuildExpression(expressions, c.Variables, context.ValuePairs, context.Datas); var values = c.ConstVariable.Select(v => ExpressionBuilder.GetExpression(v, context.ValuePairs, context.Datas)); return(Expression.SwitchCase(Expression.Block(expressions), values)); } ).ToArray(); var defaultCase = caseVariables.FirstOrDefault(c => c.Default); Expression defaultBody = null; if (defaultCase != null) { ICollection <Expression> expressions = new List <Expression>(); ExpressionBuilder.BuildExpression(expressions, defaultCase.Variables, context.ValuePairs, context.Datas); var values = defaultCase.ConstVariable.Select(v => ExpressionBuilder.GetExpression(v, context.ValuePairs, context.Datas)); defaultBody = Expression.Block(expressions); } else { var firstType = cases.First().Body.Type; defaultBody = Expression.Block(firstType, Expression.Constant(Activator.CreateInstance(firstType))); } var param = ExpressionBuilder.GetExpression(switchBranch.Param, context.ValuePairs, context.Datas); SwitchExpression switchExpression = Expression.Switch(param, defaultBody, cases); context.Expressions.Add(switchExpression); context.ExcuteParams.Clear(); return(context.Index); }