Exemplo n.º 1
0
        public void Visit(SelectId id)
        {
            var selectInfo = new SelectArgsInfo();

            _codeStack.Peek().Scope = new ScopeData <Type> {
                Type = typeof(int?), CodeDomReference = new CodeTypeReference(typeof(int?))
            };
            _codeStack.Peek().CodeExpression = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("row"), id.Id);
            selectInfo.ColumnName = id.Id;
            _codeStack.Peek().Tag = selectInfo;

            //1. Here we need to look through the select scope to get the variable.
            //If there, put correct table prefix.
            //if more than one we need to throw error
            //if we can't find we need to dig up the scope

            var tableMatches = Scope.Current.FindTableVariable(id.Id);
            var dynamicAlias = Scope.Current.AliasType <DynamicObject>();

            if (tableMatches.Length > 0)
            {
                if (tableMatches.Length == 1) //we only found one
                {
                    _codeStack.Peek().CodeExpression = new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("row"), tableMatches[0].TableAlias), id.Id);
                    _codeStack.Peek().Scope          = new ScopeData <Type> {
                        Type = tableMatches[0].TableVariable.Primitive.Type, CodeDomReference = new CodeTypeReference(tableMatches[0].TableVariable.Primitive.Type)
                    };
                }
                else //error we found more than 1
                {
                    Errors.Add(new AmbiguousSelectVariable(tableMatches, new Semantic.LineInfo(id.Line.Line, id.Line.CharacterPosition)));
                }
            }
            else if (dynamicAlias.Length == 1) //if there is an dynamic alias in the select scope we try to get the variable from it even if it might be in the global scope
            {
                _codeStack.Peek().CodeExpression = new CodeIndexerExpression(new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("row"), dynamicAlias[0]), new CodePrimitiveExpression(id.Id));
                _codeStack.Peek().Scope          = new ScopeData <Type> {
                    Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
                };
            }
            else //not found in the table variable so look up scope. if dynamic table we need to generate
            {
                //Need to check in the Scope to see if variable is defined there. If in select statmenet it is valid to put variables in it.
                if (Scope.Current.IsRegistered(id.Id))
                {
                    var variable = new VariableReferance()
                    {
                        Id = id.Id, Line = id.Line
                    };
                    var variableArgs = VisitChild(variable);
                    _codeStack.Peek().CodeExpression = variableArgs.CodeExpression;
                    _codeStack.Peek().Scope          = variableArgs.Scope;
                }
                else
                {
                    Errors.Add(new UnknownSelectVariableException(new Semantic.LineInfo(id.Line.Line, id.Line.CharacterPosition), id.Id));
                }
            }
        }
Exemplo n.º 2
0
        public void Visit(TableMemberReference variable)
        {
            var selectInfo = new SelectArgsInfo();

            _codeStack.Peek().Scope = new ScopeData <Type> {
                Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
            };
            var rowArgs = VisitChild(variable.RowReference);

            var expression = new CodeFieldReferenceExpression(rowArgs.CodeExpression, variable.Member);

            _codeStack.Peek().CodeExpression = expression;

            if (Scope.Current.IsTableRowRegistered(variable.RowReference.Id))
            {
                var descriptor   = Scope.Current.GetTableDescriptor(variable.RowReference.Id);
                var dynamicAlias = Scope.Current.AliasType <DynamicObject>();
                if (dynamicAlias.Length > 0) //alias is a dynamic type so we get it from there
                {
                    _codeStack.Peek().CodeExpression = new CodeIndexerExpression(rowArgs.CodeExpression, new CodePrimitiveExpression(variable.Member));
                    _codeStack.Peek().Scope          = new ScopeData <Type> {
                        Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
                    };
                }
                else if (!descriptor.Type.Variables.Any(x => x.Variable == variable.Member)) //error don't know member
                {
                    Errors.Add(new NoTableMember(new Semantic.LineInfo(variable.Line.Line, variable.Line.CharacterPosition), variable.Member));
                }
                else
                {
                    var members = descriptor.Type.Variables.Where(x => x.Variable == variable.Member).ToList();

                    if (members.Count > 1)
                    {
                        var selectMatches = members.Select(x => new SelectMatch()
                        {
                            TableVariable = x
                        }).ToArray();
                        Errors.Add(new AmbiguousSelectVariable(selectMatches, new Semantic.LineInfo(variable.Line.Line, variable.Line.CharacterPosition)));
                    }
                    else
                    {
                        var member = members.Single();
                        _codeStack.Peek().Scope = new ScopeData <Type> {
                            Type = member.Primitive.Type, CodeDomReference = new CodeTypeReference(member.Primitive.Type)
                        };
                    }
                }
            }

            selectInfo.ColumnName = variable.Member;
            _codeStack.Peek().Tag = selectInfo;
        }
Exemplo n.º 3
0
        public void Visit(SelectArg arg)
        {
            var selectInfo = new SelectArgsInfo();

            var childDomArgs = new List <CodeDomArg>();

            foreach (var childArg in arg.Args)
            {
                var domArgs = VisitChild(childArg, new CodeDomArg()
                {
                    Scope = _codeStack.Peek().Scope
                });
                childDomArgs.Add(domArgs);
            }

            var expression = childDomArgs[0].CodeExpression;
            var scope      = childDomArgs[0].Scope;

            for (int x = 1; x < childDomArgs.Count; x++)
            {
                expression = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Helper)), "NullConcat", expression, childDomArgs[x].CodeExpression);
                scope      = childDomArgs[x].Scope;
            }

            if (arg.Args.Length > 1) //more than one statement (arg + arg)
            {
                selectInfo.ColumnName = null;
            }
            else if (arg.Args.Length == 1 && childDomArgs[0].Tag != null) //only add column name
            {
                selectInfo.ColumnName = ((SelectArgsInfo)childDomArgs[0].Tag).ColumnName;
            }

            foreach (var childDomArg in childDomArgs)
            {
                if (childDomArg.Tag != null && ((SelectArgsInfo)childDomArg.Tag).IsPickStatement)
                {
                    selectInfo.IsPickStatement = true;
                }
            }

            if (arg.As != null)
            {
                selectInfo.ColumnName = arg.As.Alias;
            }

            _codeStack.Peek().Tag            = selectInfo;
            _codeStack.Peek().Scope          = scope;
            _codeStack.Peek().CodeExpression = expression;
        }
        public void Visit(PickStatement statement)
        {
            var selectInfo = new SelectArgsInfo()
            {
                IsPickStatement = true
            };

            VerifyCssSelector(statement.Selector, new Semantic.LineInfo(statement.Line.Line, statement.Line.CharacterPosition));

            var expression = new CodeMethodInvokeExpression(
                new CodeTypeReferenceExpression("node"),
                "Pick",
                new CodePrimitiveExpression(statement.Selector)
                );

            var takeDomArg     = VisitChild(statement.TakeStatement);
            var takeExpression = takeDomArg.CodeExpression as CodeMethodInvokeExpression;

            takeExpression.Method.TargetObject = expression;

            var aggExpression = takeExpression;

            foreach (var match in statement.Matches)
            {
                if (match.Replace != null)
                {
                    aggExpression = new CodeMethodInvokeExpression(aggExpression, "MatchReplace", new CodePrimitiveExpression(match.Value), new CodePrimitiveExpression(match.Replace.Value));
                }
                else // no replace
                {
                    aggExpression = new CodeMethodInvokeExpression(aggExpression, "Match", new CodePrimitiveExpression(match.Value));
                }
            }

            _codeStack.Peek().Tag            = selectInfo;
            _codeStack.Peek().CodeExpression = aggExpression;
            _codeStack.Peek().Scope          = new ScopeData <Type> {
                Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
            };
        }
        public void Visit(CaseVariableStatement statement)
        {
            var            domArg    = new CodeDomArg();
            SelectArgsInfo selectArg = null;

            CodeMemberMethod method = new CodeMemberMethod();

            method.Name       = "Case_" + domArg.MethodIdentifier;
            method.Attributes = MemberAttributes.Private;
            method.ReturnType = new CodeTypeReference(typeof(object));
            GenerateCallStatement(method.Statements, statement.Line.Line);

            var caseArgs = VisitChild(statement.Case, new CodeDomArg()
            {
                Scope = _codeStack.Peek().Scope
            });

            if (caseArgs.Tag != null)
            {
                selectArg = caseArgs.Tag as SelectArgsInfo;
            }

            method.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(object)), "var", caseArgs.CodeExpression));

            foreach (var childArg in statement.BooleanStatements)
            {
                domArg = VisitChild(childArg, new CodeDomArg()
                {
                    Scope = _codeStack.Peek().Scope
                });
                if (domArg.Tag != null)
                {
                    selectArg = domArg.Tag as SelectArgsInfo;
                }

                method.Statements.AddRange(domArg.ParentStatements);
            }

            if (statement.ElseStatement == null)
            {
                method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(null)));
            }
            else
            {
                domArg = VisitChild(statement.ElseStatement, new CodeDomArg()
                {
                    Scope = _codeStack.Peek().Scope
                });
                if (domArg.Tag != null)
                {
                    selectArg = domArg.Tag as SelectArgsInfo;
                }

                method.Statements.Add(new CodeMethodReturnStatement(domArg.CodeExpression));
            }

            _mainType.Type.Members.Add(method);

            var methodcall = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(null, method.Name));
            var rowParam   = new CodeParameterDeclarationExpression(_codeStack.Peek().Scope.CodeDomReference.TypeArguments[0], "row");

            method.Parameters.Add(rowParam);
            methodcall.Parameters.Add(new CodeVariableReferenceExpression("row"));

            if (selectArg != null && selectArg.IsPickStatement) //pick statement
            {
                var htmlNodeParam = new CodeParameterDeclarationExpression(new CodeTypeReference("HtmlElement"), "node");
                methodcall.Parameters.Add(new CodeVariableReferenceExpression("node"));
                method.Parameters.Add(htmlNodeParam);
            }

            _codeStack.Peek().Tag            = selectArg;
            _codeStack.Peek().CodeExpression = methodcall;
        }