/// <summary> /// /// </summary> /// <param name="type"> type of the field</param> /// <param name="name"> name in qualified form ( if it is an explicit interface declaration) </param> private void ParseField(IType type, QualifiedIdentifierExpression name) { uint mask = ~(uint)Modifier.FieldMods; if (((uint)curmods & mask) != (uint)Modifier.Empty) ReportError("field declaration contains illegal modifiers"); FieldNode node = new FieldNode(curtok); ClassNode cl = typeStack.Peek(); cl.Fields.Add(node); node.Modifiers = curmods; curmods = Modifier.Empty; if ((node.Modifiers & Modifier.Unsafe) != Modifier.Empty) { //unsafe modifier -> unsafe type. isUnsafe++; node.IsUnsafeDeclared = true; } node.IsUnsafe = isUnsafe > 0; CheckStaticClass(cl, node.Modifiers, true); if (curAttributes.Count > 0) { node.Attributes = curAttributes; curAttributes = new NodeCollection<AttributeNode>(); } node.Type = type; QualifiedIdentifierExpression fieldName = new QualifiedIdentifierExpression(name.RelatedToken); fieldName.Expressions.Add(name); node.Names.Add(fieldName); this.nameTable.AddIdentifier(new FieldName(name.QualifiedIdentifier, ToVisibilityRestriction(node.Modifiers), ((node.Modifiers & Modifier.Static) != Modifier.Static ? Scope.Instance : Scope.Static), this.currentContext)); //eg: int ok = 0, error, xx = 0; if (curtok.ID == TokenID.Equal) { Advance(); node.Value = ParseConstExpr(); if (curtok.ID == TokenID.Comma) { node = new FieldNode(curtok); typeStack.Peek().Fields.Add(node); node.Modifiers = curmods; node.Type = type; } } while (curtok.ID == TokenID.Comma) { Advance(); // over comma QualifiedIdentifierExpression ident = ParseQualifiedIdentifier(false, false, true); node.Names.Add(ident); if (curtok.ID == TokenID.Equal) { Advance(); node.Value = ParseConstExpr(); if (curtok.ID == TokenID.Comma) { node = new FieldNode(curtok); typeStack.Peek().Fields.Add(node); node.Modifiers = curmods; node.Type = type; } } this.nameTable.AddIdentifier(new FieldName(ident.QualifiedIdentifier, ToVisibilityRestriction(node.Modifiers), ((node.Modifiers & Modifier.Static) != Modifier.Empty ? Scope.Instance : Scope.Static), this.currentContext)); } if (curtok.ID == TokenID.Semi) { Advance(); } }
/// <summary> /// /// </summary> /// <param name="type"> type of the field</param> /// <param name="name"> name in qualified form ( if it is an explicit interface declaration) </param> private BaseNode ParseField(IType type, QualifiedIdentifierExpression name) { uint mask = ~(uint)Modifier.FieldMods; if (((uint)curmods & mask) != (uint)Modifier.Empty) ReportError("field declaration contains illegal modifiers"); FieldNode node = new FieldNode(curtok); ClassNode cl = typeStack.Peek(); cl.Fields.Add(node); Modifier fieldMods = curmods; curmods = Modifier.Empty; node.Modifiers = fieldMods; if ((node.Modifiers & Modifier.Unsafe) != Modifier.Empty) { //unsafe modifier -> unsafe type. isUnsafe++; node.IsUnsafeDeclared = true; } node.IsUnsafe = isUnsafe > 0; CheckStaticClass(cl, node.Modifiers, true); ApplyAttributes(node); ApplyDocComment(node); node.Type = type; QualifiedIdentifierExpression fieldName = new QualifiedIdentifierExpression(name.RelatedToken); fieldName.Expressions.Add(name); node.Names.Add(fieldName); while (true) { nameTable.AddIdentifier(new FieldName(name.QualifiedIdentifier, ToVisibilityRestriction(node.Modifiers), ((node.Modifiers & Modifier.Static) != Modifier.Static ? Scope.Instance : Scope.Static), currentContext)); //eg: int ok = 0, error, xx = 0; if (curtok.ID == TokenID.Equal) { Advance(); if (curtok.ID == TokenID.LCurly) node.Value = ParseArrayInitializer(); else node.Value = ParseExpression(); if (curtok.ID == TokenID.Comma) { node = new FieldNode(curtok); typeStack.Peek().Fields.Add(node); node.Modifiers = fieldMods; node.Type = type; } } if (curtok.ID != TokenID.Comma) break; Advance(); // over comma QualifiedIdentifierExpression ident = ParseQualifiedIdentifier(false, false, true); node.Names.Add(ident); } AssertAndAdvance(TokenID.Semi); return node; }
private void BuilderType(InterfaceNode type,NamespaceNode nspace) { DDW.ClassNode cls = new ClassNode(new Token(TokenID.Public)); cls.Modifiers = Modifier.Public; cls.BaseClasses.Add(new TypeNode(new IdentifierExpression("Peanut.Mappings.DataObject", new Token(TokenID.Typeof)))); foreach (AttributeNode attr in type.Attributes) { cls.Attributes.Add(attr); } mTableName = GetTableName(type); mClassName = type.Name.Identifier.Substring(1, type.Name.Identifier.Length - 1); cls.Name = new IdentifierExpression(mClassName, new Token(TokenID.String|TokenID.Public)); cls.IsPartial = true; nspace.Classes.Add(cls); StringBuilder sb = new StringBuilder(); sb.AppendLine("///<summary>"); sb.AppendLine("///Peanut Generator Copyright @ FanJianHan 2010-2013"); sb.AppendLine("///website:http://www.ikende.com"); if (!string.IsNullOrEmpty(type.Comment)) { sb.AppendLine(type.Comment); } StringReader sr = new StringReader(type.DocComment); string value = sr.ReadLine(); while (value != null) { if (value.IndexOf("summary>") == -1) { sb.AppendLine(value); } value = sr.ReadLine(); } sb.AppendLine("///</summary>"); cls.DocComment = sb.ToString(); foreach (InterfacePropertyNode property in type.Properties) { string propertyname = property.Names[0].GenericIdentifier; string fieldname= GetFieldName(property); FieldNode field = new FieldNode(new Token(TokenID.False)); field.Modifiers = Modifier.Private; QualifiedIdentifierExpression name = new QualifiedIdentifierExpression(new Token(TokenID.String)); name.Expressions.Add(new IdentifierExpression("m" + property.Names[0].GenericIdentifier, new Token(TokenID.String))); field.Names.Add(name); field.Type = property.Type; cls.Fields.Add(field); IType fieldtype=new TypeNode(new IdentifierExpression("Peanut.FieldInfo<"+((TypeNode)property.Type).GenericIdentifier+">", new Token(TokenID.Typeof))); field = new FieldNode(new Token(TokenID.False)); field.Modifiers = Modifier.Public| Modifier.Static; NodeCollection<ArgumentNode> args = new NodeCollection<ArgumentNode>(); args.Add(new ArgumentNode(new Token(TokenID.String))); args.Add(new ArgumentNode(new Token(TokenID.String))); args[0].Expression = new StringPrimitive(mTableName, new Token(TokenID.String)); args[1].Expression = new StringPrimitive(fieldname, new Token(TokenID.String)); name = new QualifiedIdentifierExpression(new Token(TokenID.String)); name.Expressions.Add(new AssignmentExpression(TokenID.Equal, new IdentifierExpression(propertyname.Substring(0, 1).ToLower() + propertyname.Substring(1, propertyname.Length - 1) , new Token(TokenID.String)), new ObjectCreationExpression(fieldtype, args, new Token(TokenID.New)))); field.Names.Add(name); field.Type = fieldtype; cls.Fields.Add(field); PropertyNode pn = new PropertyNode(new Token(TokenID.Newline)); foreach (AttributeNode attr in property.Attributes) { pn.Attributes.Add(attr); } pn.Names = property.Names; pn.Modifiers = Modifier.Public | Modifier.Virtual; pn.Type = property.Type; pn.Setter = new AccessorNode(true, new Token(TokenID.Newline)); pn.Setter.Kind = "set"; ExpressionStatement setvalue = new ExpressionStatement( new AssignmentExpression(TokenID.Equal, new IdentifierExpression("m" + property.Names[0].GenericIdentifier, new Token(TokenID.String)) , new IdentifierExpression("value", new Token(TokenID.String))) ); pn.Setter.StatementBlock.Statements.Add(setvalue); args = new NodeCollection<ArgumentNode>(); args.Add(new ArgumentNode(new Token(TokenID.String))); args[0].Expression = new StringPrimitive(propertyname, new Token(TokenID.String)); QualifiedIdentifierExpression invoke = new QualifiedIdentifierExpression(new Token(TokenID.String)); invoke.Expressions.Add(new IdentifierExpression("EntityState", new Token(TokenID.String))); invoke.Expressions.Add(new InvocationExpression(new IdentifierExpression("FieldChange", new Token(TokenID.Default)), args)); setvalue = new ExpressionStatement(invoke); pn.Setter.StatementBlock.Statements.Add(setvalue); pn.Getter = new AccessorNode(true, new Token(TokenID.Newline)); pn.Getter.Kind = "get"; ReturnStatement rs = new ReturnStatement(new Token(TokenID.Return)); rs.ReturnValue = new IdentifierExpression("m" + property.Names[0].GenericIdentifier, new Token(TokenID.String)); pn.Getter.StatementBlock.Statements.Add(rs); sb = new StringBuilder(); sb.AppendLine("///<summary>"); sb.AppendLine("///Type:" + ((TypeNode)property.Type).GenericIdentifier); if (!string.IsNullOrEmpty(property.Comment)) { sb.AppendLine(type.Comment); } sr = new StringReader(property.DocComment); value = sr.ReadLine(); while (value != null) { if (value.IndexOf("summary>") == -1) { sb.AppendLine(value); } value = sr.ReadLine(); } sb.AppendLine("///</summary>"); pn.DocComment = sb.ToString(); cls.Properties.Add(pn); } //CodeTypeDeclaration entity = new CodeTypeDeclaration(mClassName); //CodeCommentStatement comm; //cns.Types.Add(entity); //comm = new CodeCommentStatement("<summary>"); //comm.Comment.DocComment = true; //entity.Comments.Add(comm); //comm = new CodeCommentStatement("Peanut Generator Copyright © FanJianHan 2010-2013"); //comm.Comment.DocComment = true; //entity.Comments.Add(comm); //comm = new CodeCommentStatement("website:http://www.ikende.com"); //comm.Comment.DocComment = true; //entity.Comments.Add(comm); //if (!string.IsNullOrEmpty(type.Comment)) //{ // comm = new CodeCommentStatement(type.Comment); // comm.Comment.DocComment = true; // entity.Comments.Add(comm); //} //StringReader sr = new StringReader(type.DocComment); //string value = sr.ReadLine(); //while (value != null) //{ // if (value.IndexOf("summary>") == -1) // { // comm = new CodeCommentStatement(value.Replace("///", "")); // comm.Comment.DocComment = true; // entity.Comments.Add(comm); // } // value = sr.ReadLine(); //} //comm = new CodeCommentStatement("</summary>"); //comm.Comment.DocComment = true; //entity.Comments.Add(comm); //// } //entity.BaseTypes.Add(new CodeTypeReference("Peanut.Mappings.DataObject")); //entity.BaseTypes.Add(new CodeTypeReference(type.Name.Identifier)); //entity.Attributes = MemberAttributes.Public; //entity.IsPartial = true; //entity.CustomAttributes.Add(new CodeAttributeDeclaration("Serializable")); //entity.IsClass = true; //foreach (AttributeNode aitem in type.Attributes) //{ // CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(aitem.Name.GenericIdentifier); // entity.CustomAttributes.Add(attribute); // if (attribute.Name.ToLower() == "table") // { // if (aitem.Arguments.Count > 0) // { // DDW.StringPrimitive pe = (DDW.StringPrimitive)aitem.Arguments[0].Expression; // if (pe != null) // { // mTableName = pe.Value.ToString(); // } // else // { // mTableName = mClassName; // } // attribute.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(mTableName))); // } // else // { // mTableName = mClassName; // } // } //} //foreach (InterfacePropertyNode mitem in type.Properties) //{ // BuilderProperty(entity, mitem); //} }
public virtual object VisitFieldDeclaration(FieldNode fieldDeclaration, object data) { stackMap.Push(fieldDeclaration); fieldDeclaration.Attributes.AcceptVisitor(this, data); fieldDeclaration.Type.AcceptVisitor(this, data); if (fieldDeclaration.Value != null) { fieldDeclaration.Value.AcceptVisitor(this, data); } stackMap.Pop(); return null; }