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