private void ReflyModels_Click(object sender, EventArgs e) { Refly RF = new Refly(); RF.FormClosing += (s, a) => { if (RF.CloseForm) { CloseForm = false; Close(); return; } Show(); CloseForm = true; }; Hide(); RF.Show(); }
/// <summary> Add the content of the method GetAttributeValue(). </summary> public static void FillGetAttributeValue(Refly.CodeDom.MethodDeclaration method) { method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Returns the value received or uses it as an identifier to find its value in a AttributeIdentifierAttribute in the mapped class. "); // Create the <summary /> method.Signature.Parameters.Add(typeof(string), "val"); method.Signature.Parameters.Add(typeof(System.Type), "mappedClass"); method.Signature.ReturnType = new Refly.CodeDom.TypeTypeDeclaration(typeof(string)); method.Body.Add(Refly.CodeDom.Stm.Snippet( @"if(val==null) throw new MappingException(""Value is null""); if(val.StartsWith(StartQuote) && val.EndsWith(EndQuote)) { int nameLength = val.Length - StartQuote.Length - EndQuote.Length; if(nameLength <= 0) throw new MappingException(""The value '"" + val + ""' of the class "" + mappedClass.Name + "" doesn't contain a name (just the quotes)""); string name = val.Substring(StartQuote.Length, nameLength); // Now look for a AttributeIdentifierAttribute with this name System.Type type = mappedClass; while( type != null ) // Search the attribute in the mapped class progressively going backward to the base classes { // First, look in the header object[] attributes = type.GetCustomAttributes(typeof(AttributeIdentifierAttribute), false); foreach(AttributeIdentifierAttribute attrib in attributes) if(attrib.Name == name) // Found if(attrib.Value==null) throw new MappingException(""The value of the AttributeIdentifierAttribute with the name '"" + name + ""' in the class "" + type.Name + "" is not specified.""); else return attrib.Value; // Now, look in the members const System.Reflection.BindingFlags bindings = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.DeclaredOnly; foreach( System.Reflection.MemberInfo member in type.GetMembers(bindings) ) { attributes = member.GetCustomAttributes(typeof(AttributeIdentifierAttribute), false); foreach(AttributeIdentifierAttribute attrib in attributes) if(attrib.Name == name) // Found if(attrib.Value==null) throw new MappingException(""The value of the AttributeIdentifierAttribute with the name '"" + name + ""' in the class "" + type.Name + "" is not specified.""); else return attrib.Value; } type = type.BaseType; } // Not found throw new MappingException(""Can not find a AttributeIdentifierAttribute with the name '"" + name + ""' in the class "" + mappedClass.Name + "" (and its base classes)""); } return val; // Not an identifier")); // ----------------------------------------------------------------- }
/// <summary> Add the content of the method FindAttributedMembers(). </summary> public static void FillFindAttributedMembers(Refly.CodeDom.MethodDeclaration method) { method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Searches the members of the class for any member with the attribute defined. "); // Create the <summary /> method.Signature.Parameters.Add("BaseAttribute", "rootAttrib"); method.Signature.Parameters.Add(typeof(System.Type), "attributeType"); method.Signature.Parameters.Add(typeof(System.Type), "classType"); method.Signature.ReturnType = new Refly.CodeDom.TypeTypeDeclaration(typeof(System.Collections.ArrayList)); method.Body.Add(Refly.CodeDom.Stm.Snippet( @"// Return all members from the classType (and its base types) decorated with this attributeType System.Collections.ArrayList list = new System.Collections.ArrayList(); const System.Reflection.BindingFlags bindings = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.DeclaredOnly; System.Type type = classType; while( type != null ) { foreach( System.Reflection.MemberInfo member in type.GetMembers(bindings) ) { foreach(BaseAttribute memberAttrib in GetSortedAttributes(member)) { if( IsNextElement(memberAttrib, rootAttrib, attributeType) ) break; // next attributes are for <sub-elements> else if( memberAttrib.GetType() == attributeType || memberAttrib.GetType().IsSubclassOf(attributeType) ) { list.Add( member ); break; } } } type = type.BaseType; if (type != null && ( type.IsDefined(typeof(ComponentAttribute), false) || type.IsDefined(typeof(ClassAttribute), false) || type.IsDefined(typeof(SubclassAttribute), false) || type.IsDefined(typeof(JoinedSubclassAttribute), false) || type.IsDefined(typeof(UnionSubclassAttribute), false) )) break; // don't use members of a mapped base class } return list;")); // ----------------------------------------------------------------- }
/// <summary> Generate a Writer method for a XmlSchemaElement. </summary> public static void GenerateElementWriter(System.Xml.Schema.XmlSchemaElement schemaElt, string schemaEltName, Refly.CodeDom.MethodDeclaration method, System.Xml.Schema.XmlSchemaComplexType refSchemaType, System.Xml.Schema.XmlSchemaObjectCollection schemaItems) { bool schemaEltIsRoot = Utils.IsRoot(schemaEltName); method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Write a " + schemaEltName + " XML Element from attributes in a " + (schemaEltIsRoot?"type":"member") + ". "); // Create the <summary /> method.Signature.Parameters.Add(typeof(System.Xml.XmlWriter), "writer"); if(schemaEltIsRoot) method.Signature.Parameters.Add(typeof(System.Type), "type"); else { method.Signature.Parameters.Add(typeof(System.Reflection.MemberInfo), "member"); method.Signature.Parameters.Add(schemaEltName + "Attribute", "attribute"); method.Signature.Parameters.Add("BaseAttribute", "parentAttribute"); method.Signature.Parameters.Add(typeof(System.Type), "mappedClass"); } // Beginning of the method's body if(schemaEltIsRoot) { method.Body.Add(Refly.CodeDom.Stm.Snippet(string.Format( @"object[] attributes = {1}.GetCustomAttributes(typeof({0}Attribute), false); if(attributes.Length == 0) return; {0}Attribute attribute = attributes[0] as {0}Attribute; ", schemaEltName, schemaEltIsRoot ? "type" : "member"))); // Note : Root should never allow multiple ! } method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( "writer.WriteStartElement( \"{0}\" );", schemaElt.Name) )); System.Xml.Schema.XmlSchemaComplexType type = schemaElt.SchemaType as System.Xml.Schema.XmlSchemaComplexType; if(type == null && !schemaElt.SchemaTypeName.IsEmpty) // eg: <xs:element name="cache" type="cacheType" /> type = refSchemaType; if(type != null) { // Add the attributes System.Collections.ArrayList attributes = Utils.GetAttributes(type.Attributes); log.Debug("Add Attributes: Count=" + attributes.Count); foreach(System.Xml.Schema.XmlSchemaAttribute attrib in attributes) { string attribName = attrib.Name + attrib.RefName.Name; // One is empty string methodAttribName = "attribute." + Utils.Capitalize(attribName); method.Body.Add(Refly.CodeDom.Stm.Comment("Attribute: <" + attribName + ">")); // If the attribute is not explicitly marked required, then we consider it optionnal if(attrib.Use != System.Xml.Schema.XmlSchemaUse.Required) { if( "System.Boolean" == Utils.GetAttributeTypeName(schemaElt, attrib) ) method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @"if( {0} )", methodAttribName + "Specified" ) )); else method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @"if({0} != {1})", methodAttribName, Utils.GetUnspecifiedValue(schemaElt, attrib)) )); } // Write the value if(attrib.Use == System.Xml.Schema.XmlSchemaUse.Required) { // Here, we use a helper if the field is not specified (mainly used for "name" which is the name of the member) log.Debug(" Create Helper for " + (schemaEltIsRoot ? "ClassType" : "MemberInfo") + " <" + schemaElt.Name + "> <" + attribName + ">"); string helper = string.Format( @"{0}=={1} ? DefaultHelper.Get_{2}_{3}_DefaultValue({4}) : ", // "typed" method name :) methodAttribName, Utils.GetUnspecifiedValue(schemaElt, attrib), schemaEltName, Utils.Capitalize(attribName), schemaEltIsRoot ? "type" : "member" ); method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @"writer.WriteAttributeString(""{0}"", {2}{1});", attribName, AttributeToXmlValue(schemaElt, attrib, attribName, schemaEltIsRoot), helper) )); } else { method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @"writer.WriteAttributeString(""{0}"", {1});", attribName, AttributeToXmlValue(schemaElt, attrib, attribName, schemaEltIsRoot)) )); if( schemaEltName=="Property" && attribName=="type" ) { // Special case to handle Patterns for <property ... type="..." /> // Eg: set Nullables.NHibernate.NullableXXXType for Nullables.NullableXXX method.Body.Add(Refly.CodeDom.Stm.Snippet(@"else { System.Type type = null; if(member is System.Reflection.PropertyInfo) type = (member as System.Reflection.PropertyInfo).PropertyType; else if(member is System.Reflection.FieldInfo) type = (member as System.Reflection.FieldInfo).FieldType; if(type != null) // Transform using RegularExpressions { string typeName = HbmWriterHelper.GetNameWithAssembly(type); foreach(System.Collections.DictionaryEntry pattern in Patterns) { if(System.Text.RegularExpressions.Regex.IsMatch(typeName, pattern.Key as string)) { writer.WriteAttributeString( ""type"", System.Text.RegularExpressions.Regex.Replace(typeName, pattern.Key as string, pattern.Value as string) ); break; } } } }")); } } } // Add the elements method.Body.Add(Refly.CodeDom.Stm.Snippet( schemaEltIsRoot ? @" WriteUserDefinedContent(writer, type, null, attribute);" : @" WriteUserDefinedContent(writer, member, null, attribute);" )); if(type.Particle is System.Xml.Schema.XmlSchemaSequence) { System.Xml.Schema.XmlSchemaSequence seq = (schemaElt.SchemaType as System.Xml.Schema.XmlSchemaComplexType).Particle as System.Xml.Schema.XmlSchemaSequence; System.Collections.ArrayList members = Utils.GetElements(seq.Items, schemaItems); if( ! schemaEltIsRoot ) method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @" System.Collections.ArrayList memberAttribs = GetSortedAttributes(member); int attribPos; // Find the position of the {0}Attribute (its <sub-element>s must be after it) for(attribPos=0; attribPos<memberAttribs.Count; attribPos++) if( memberAttribs[attribPos] is {0}Attribute && ((BaseAttribute)memberAttribs[attribPos]).Position == attribute.Position ) break; // found int i = attribPos + 1; ", schemaEltName ) )); foreach(System.Xml.Schema.XmlSchemaElement member in members) { if( member.RefName.Name!=null && member.RefName.Name!=string.Empty && member.Name!=null && member.Name!=string.Empty ) log.Error(string.Format("Both member.RefName.Name({0}) & member.Name({1}) are not empty", member.RefName.Name, member.Name)); string realMemberName = member.Name + member.RefName.Name; // One of them should be empty string memberName = Utils.Capitalize(realMemberName); string listName = memberName + "List"; string attributeName = memberName + "Attribute"; log.Debug(schemaEltName + " Element: <" + realMemberName + ">"); method.Body.Add(Refly.CodeDom.Stm.Comment("Element: <" + realMemberName + ">")); // There are three way to treat elements: // if(eltName is root) // if(memberName is root) // => They are both root, so we process the nestedTypes (eg. <class> to <sub-class>) // else // => It is an element of a root => we add them as element // else // => They are both members, so we use the member again (eg. <list> to <one-to-many>) if(schemaEltIsRoot) { if(Utils.IsRoot(memberName)) { method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @"WriteNested{0}Types(writer, type);", memberName ) )); } else { method.Body.Add(Refly.CodeDom.Stm.Snippet( string.Format( @"System.Collections.ArrayList {1} = FindAttributedMembers( attribute, typeof({2}), type ); foreach( System.Reflection.MemberInfo member in {1} ) ", memberName, listName, attributeName ) +"{" + string.Format( @" object[] objects = member.GetCustomAttributes(typeof({2}), false); System.Collections.ArrayList memberAttribs = new System.Collections.ArrayList(); memberAttribs.AddRange(objects); memberAttribs.Sort(); " + ( Utils.CanContainItself(memberName) ? // => Just take the first (others will be inside it) @" Write{0}(writer, member, memberAttribs[0] as {2}, attribute, type);" : @" foreach(object memberAttrib in memberAttribs) Write{0}(writer, member, memberAttrib as {2}, attribute, type);" ), memberName, listName, attributeName ) + @" }" )); } method.Body.Add(Refly.CodeDom.Stm.Snippet( "WriteUserDefinedContent(writer, type, typeof(" + attributeName + "), attribute);" )); } else { method.Body.Add(Refly.CodeDom.Stm.Snippet( @"for(; i<memberAttribs.Count; i++) { BaseAttribute memberAttrib = memberAttribs[i] as BaseAttribute; if( IsNextElement(memberAttrib, parentAttribute, attribute.GetType()) || IsNextElement(memberAttrib, attribute, typeof(" + attributeName + @")) ) break; // next attributes are 'elements' of the same level OR for 'sub-elements'" + ( Utils.IsRoot(memberName) ? "" // A NotRoot can not contain a Root! eg. [DynComp] can't contain a [Comp] (instead, use [CompProp]) : @" else {" + ( Utils.CanContainItself(memberName) ? "" : @" if( memberAttrib is " + schemaEltName + @"Attribute ) break; // Following attributes are for this " + schemaEltName ) + @" if( memberAttrib is " + attributeName + @" ) Write" + memberName + @"(writer, member, memberAttrib as " + attributeName + @", attribute, mappedClass); }" ) + @" }" )); method.Body.Add(Refly.CodeDom.Stm.Snippet( "WriteUserDefinedContent(writer, member, typeof(" + attributeName + "), attribute);" )); } } } if(type.IsMixed) // used by elements like <param> { method.Body.Add(Refly.CodeDom.Stm.Snippet(@" // Write the content of this element (mixed=""true"") writer.WriteString(attribute.Content);")); } } else { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("Unknow Element: ").Append(schemaElt.Name); if(schemaElt.SchemaType != null) sb.Append(", SchemaType = ").Append(schemaElt.SchemaType).Append(" - ").Append(schemaElt.SchemaType.Name); if(!schemaElt.SchemaTypeName.IsEmpty) sb.Append(", SchemaTypeName = ").Append(schemaElt.SchemaTypeName.Name); if(schemaElt.ElementType != null) sb.Append(", ElementType = ").Append(schemaElt.ElementType); log.Warn(sb.ToString()); } method.Body.Add(Refly.CodeDom.Stm.Snippet(@" writer.WriteEndElement();")); }
/// <summary> Generate the empty method WriteUserDefinedContent(). </summary> public static void FillWriteUserDefinedContent(Refly.CodeDom.MethodDeclaration methodType, Refly.CodeDom.MethodDeclaration methodMember) { Refly.CodeDom.MethodDeclaration method = methodType; method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Write user-defined content; should be of the specified contentAttributeType. "); // Create the <summary /> method.Signature.Parameters.Add(typeof(System.Xml.XmlWriter), "writer"); method.Signature.Parameters.Add(typeof(System.Type), "classType"); method.Signature.Parameters.Add(typeof(System.Type), "contentAttributeType"); method.Signature.Parameters.Add("BaseAttribute", "parentAttribute"); method = methodMember; method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Write user-defined content; should be of the specified contentAttributeType. "); // Create the <summary /> method.Signature.Parameters.Add(typeof(System.Xml.XmlWriter), "writer"); method.Signature.Parameters.Add(typeof(System.Reflection.MemberInfo), "memberInfo"); method.Signature.Parameters.Add(typeof(System.Type), "contentAttributeType"); method.Signature.Parameters.Add("BaseAttribute", "parentAttribute"); // Both empty }
/// <summary> Generate a Writer method for a XmlSchemaElement. </summary> public static void FillWriteNestedTypes(string schemaEltName, Refly.CodeDom.MethodDeclaration method) { method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Write " + schemaEltName + " XML Elements from nested mapped classes in a not-mapped class. "); // Create the <summary /> method.Signature.Parameters.Add(typeof(System.Xml.XmlWriter), "writer"); method.Signature.Parameters.Add(typeof(System.Type), "type"); method.Body.Add(Refly.CodeDom.Stm.Snippet( @"foreach(System.Type nestedType in type.GetNestedTypes(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)) { if(nestedType.GetCustomAttributes(typeof(ClassAttribute), false).Length != 0) continue;" + (schemaEltName!="Component" ? "" : @" if(nestedType.GetCustomAttributes(typeof(SubclassAttribute), false).Length != 0) continue; if(nestedType.GetCustomAttributes(typeof(JoinedSubclassAttribute), false).Length != 0) continue;") + string.Format(@" if(nestedType.GetCustomAttributes(typeof({0}Attribute), false).Length == 0) WriteNested{0}Types(writer, nestedType); // Not mapped (try its nested types) else // Mapped Write{0}(writer, nestedType); ", schemaEltName ) + "}" )); }
/// <summary> Add the content of the method IsNextElement(). </summary> public static void FillIsNextElement(Refly.CodeDom.MethodDeclaration method, System.Xml.Schema.XmlSchemaObjectCollection schemaItems) { method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Tells if 'element1' come after 'element2' in rootType's 'sub-elements' order. "); // Create the <summary /> method.Signature.Parameters.Add("BaseAttribute", "element1"); method.Signature.Parameters.Add("BaseAttribute", "baseAttrib"); method.Signature.Parameters.Add(typeof(System.Type), "typeOfElement2"); method.Signature.ReturnType = new Refly.CodeDom.TypeTypeDeclaration(typeof(bool)); method.Body.Add(Refly.CodeDom.Stm.Snippet( @"if( element1 == null ) return false;" )); foreach(System.Xml.Schema.XmlSchemaObject obj in schemaItems) { if(obj is System.Xml.Schema.XmlSchemaElement) { System.Xml.Schema.XmlSchemaElement elt = obj as System.Xml.Schema.XmlSchemaElement; method.Body.Add(Refly.CodeDom.Stm.Snippet( @" if( baseAttrib is " + Utils.Capitalize(elt.Name) + @"Attribute ) {" )); if(elt.SchemaType is System.Xml.Schema.XmlSchemaComplexType) { System.Xml.Schema.XmlSchemaComplexType type = elt.SchemaType as System.Xml.Schema.XmlSchemaComplexType; // Add the elements if(type.Particle is System.Xml.Schema.XmlSchemaSequence) { System.Xml.Schema.XmlSchemaSequence seq = (elt.SchemaType as System.Xml.Schema.XmlSchemaComplexType).Particle as System.Xml.Schema.XmlSchemaSequence; System.Collections.ArrayList members = Utils.GetElements(seq.Items, schemaItems); for(int i=0; i<members.Count; i++) { System.Xml.Schema.XmlSchemaElement member = members[i] as System.Xml.Schema.XmlSchemaElement; if( member.RefName.Name == string.Empty ) continue; // Ignore elements like <query> and <sql-query> string memberName = Utils.Capitalize(member.Name + member.RefName.Name); // One of them is empty System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append( @" if( typeOfElement2 == typeof(" + memberName + @"Attribute) ) { if( "); for(int j=i+1; j<members.Count; j++) { System.Xml.Schema.XmlSchemaElement nextMember = members[j] as System.Xml.Schema.XmlSchemaElement; if( nextMember.RefName.Name == string.Empty ) continue; // Ignore elements like <query> and <sql-query> string nextMemberName = Utils.Capitalize(nextMember.Name + nextMember.RefName.Name); // One of them is empty sb.Append("element1 is " + nextMemberName + "Attribute || "); } // Add "typeOfElement2 == null" at the end to handle "||" and empty "if()" without compilation warning sb.Append(@"typeOfElement2 == null ) return true; }"); method.Body.Add(Refly.CodeDom.Stm.Snippet( sb.ToString() )); } } } method.Body.Add(Refly.CodeDom.Stm.Snippet("}")); } } method.Body.Add(Refly.CodeDom.Stm.Snippet("return false;")); // ----------------------------------------------------------------- }
/// <summary> Add the content of the method GetXmlEnumValue(). </summary> public static void FillGetXmlEnumValue(Refly.CodeDom.MethodDeclaration method) { method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Gets the xml enum value from the associated attributed enum. "); // Create the <summary /> method.Signature.Parameters.Add(typeof(System.Type), "enumType"); method.Signature.Parameters.Add(typeof(object), "enumValue"); method.Signature.ReturnType = new Refly.CodeDom.TypeTypeDeclaration(typeof(string)); method.Body.Add(Refly.CodeDom.Stm.Snippet( @"// Enumeration's members have a XmlEnumAttribute; its Name is the value to return System.Reflection.FieldInfo[] fields = enumType.GetFields(); foreach( System.Reflection.FieldInfo field in fields ) { if( field.Name == System.Enum.GetName(enumType, enumValue) ) { System.Xml.Serialization.XmlEnumAttribute attribute = System.Attribute.GetCustomAttribute( field, typeof(System.Xml.Serialization.XmlEnumAttribute), false ) as System.Xml.Serialization.XmlEnumAttribute; if( attribute != null ) return attribute.Name; else throw new MappingException( string.Format( ""{0} is missing XmlEnumAttribute on {1} value. Please, contact the NHibernate team to fix this issue."", enumType, enumValue ) ); } } throw new MappingException( string.Format( ""{0} doesn't contain the field {1}. Please, contact the NHibernate team to fix this issue."", enumType, enumValue ) );")); // ----------------------------------------------------------------- }
/// <summary> Add the content of the method GetSortedAttributes(). </summary> public static void FillGetSortedAttributes(Refly.CodeDom.MethodDeclaration method) { method.Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Overloaded; method.Doc.Summary.AddText(" Return all (BaseAttribute derived) attributes in the MethodDeclaration sorted using their position. "); // Create the <summary /> method.Signature.Parameters.Add(typeof(System.Reflection.MemberInfo), "member"); method.Signature.ReturnType = new Refly.CodeDom.TypeTypeDeclaration(typeof(System.Collections.ArrayList)); method.Body.Add(Refly.CodeDom.Stm.Snippet( @"System.Collections.ArrayList list = new System.Collections.ArrayList(); if(member != null) foreach(object attrib in member.GetCustomAttributes(false)) if(attrib is BaseAttribute) list.Add(attrib); list.Sort(); return list;")); // ----------------------------------------------------------------- }
public override Refly.CodeDom.Expressions.Expression ToCodeDom(Refly.CodeDom.Expressions.Expression factory) { throw new NotImplementedException(); }
/// <summary> Fill the ClassDeclaration with Attributes of the XmlSchemaElement. </summary> public static void GenerateAttribute(System.Xml.Schema.XmlSchemaElement attElt, Refly.CodeDom.ClassDeclaration cd, System.Xml.Schema.XmlSchemaComplexType refSchemaType) { cd.Doc.Summary.AddText(AnnotationToString(attElt.Annotation)); // Create the <summary /> cd.Parent = new Refly.CodeDom.StringTypeDeclaration("BaseAttribute"); // Add [AttributeUsage(AttributeTargets, AllowMultiple] and [Serializable] // Note: There is a problem with the order of the arguments, that's why they are together bool targetsAll = Utils.TargetsAll(Utils.Capitalize(attElt.Name)); string attributeTargets = "System.AttributeTargets."; if( Utils.IsRoot(Utils.Capitalize(attElt.Name)) || targetsAll) attributeTargets += "Class | System.AttributeTargets.Struct | System.AttributeTargets.Interface"; if(targetsAll) attributeTargets += " | System.AttributeTargets."; if( !Utils.IsRoot(Utils.Capitalize(attElt.Name)) || targetsAll) attributeTargets += "Property | System.AttributeTargets.Field"; Refly.CodeDom.AttributeDeclaration attribUsage = cd.CustomAttributes.Add("System.AttributeUsage"); attribUsage.Arguments.Add( "", new Refly.CodeDom.Expressions.SnippetExpression( attributeTargets + ", AllowMultiple=" + Utils.AllowMultipleValue(attElt.Name) ) ); cd.CustomAttributes.Add("System.Serializable"); // Add the constructors Refly.CodeDom.ConstructorDeclaration defCtor = cd.AddConstructor(); defCtor.Doc.Summary.AddText(" Default constructor (position=0) "); // Create the <summary /> defCtor.BaseContructorArgs.Add( new Refly.CodeDom.Expressions.SnippetExpression("0") ); Refly.CodeDom.ConstructorDeclaration posCtor = cd.AddConstructor(); posCtor.Doc.Summary.AddText(" Constructor taking the position of the attribute. "); // Create the <summary /> posCtor.Signature.Parameters.Add(typeof(int), "position"); posCtor.BaseContructorArgs.Add( new Refly.CodeDom.Expressions.SnippetExpression("position") ); System.Xml.Schema.XmlSchemaComplexType type = attElt.SchemaType as System.Xml.Schema.XmlSchemaComplexType; if(type == null && !attElt.SchemaTypeName.IsEmpty) // eg: <xs:element name="cache" type="cacheType" /> type = refSchemaType; if(type != null) { // Add the attribute members System.Collections.ArrayList attribMembers = Utils.GetAttributes(type.Attributes); log.Debug("Add Attribute members: Count=" + attribMembers.Count); foreach(System.Xml.Schema.XmlSchemaAttribute attribMember in attribMembers) { string memberType = Utils.GetAttributeTypeName(attElt, attribMember); if(attribMember.SchemaTypeName.Name==string.Empty) // Create the dynamically generated enumeration { log.Debug("Generate Enumeration for SimpleType: " + memberType); GenerateEnumeration(attribMember.SchemaType, cd.Namespace.AddEnum(memberType, false)); } // Add the field with its default value Refly.CodeDom.FieldDeclaration fd = cd.AddField( memberType, attribMember.Name.Replace("-", "").ToLower() ); // Set the unspecified value (to know if specified by the user) fd.InitExpression = new Refly.CodeDom.Expressions.SnippetExpression( Utils.GetUnspecifiedValue(attElt, attribMember) ); // Add its public property with a comment Refly.CodeDom.PropertyDeclaration pd = cd.AddProperty(fd, true, true, false); pd.Doc.Summary.AddText(AnnotationToString(attribMember.Annotation)); // Create the <summary /> if(memberType == "System.Boolean") { // Add the field+property to know if this field has been specified Refly.CodeDom.FieldDeclaration boolIsSpec = cd.AddField( "System.Boolean", fd.Name + "specified" ); cd.AddProperty(boolIsSpec, true, false, false).Doc.Summary.AddText(" Tells if " + pd.Name + " has been specified. "); // Create the <summary /> pd.Set.Add( new Refly.CodeDom.Expressions.SnippetExpression( boolIsSpec.Name + " = true" ) ); } // Add the System.Type property (to allow setting this attribute with a type) if(Utils.IsSystemType(attElt.Name, attribMember, memberType)) { log.Debug(" Create System.Type for <" + attElt.Name + "> <" + attribMember.Name + ">"); Refly.CodeDom.PropertyDeclaration pdType = cd.AddProperty(typeof(System.Type), pd.Name + "Type"); pdType.Doc.Summary.AddText(AnnotationToString(attribMember.Annotation)); // Create the <summary /> pdType.Get.Add( new Refly.CodeDom.Expressions.SnippetExpression( "return System.Type.GetType( this." + pd.Name + " )" ) ); pdType.Set.Add( new Refly.CodeDom.Expressions.SnippetExpression( string.Format( @"if(value.Assembly == typeof(int).Assembly) this.{0} = value.FullName.Substring(7); else this.{0} = HbmWriterHelper.GetNameWithAssembly(value)", pd.Name))); } // Add the object property (to allow setting this attribute with any object) if(Utils.IsSystemObject(attElt.Name, attribMember, memberType)) { bool IsSystemEnum = Utils.IsSystemEnum(attElt.Name, attribMember, memberType); log.Debug(" Create object version " + (IsSystemEnum?"+ EnumFormat ":"") + "for <" + attElt.Name + "> <" + attribMember.Name + ">"); Refly.CodeDom.PropertyDeclaration pdType = cd.AddProperty(typeof(object), pd.Name + "Object"); pdType.Doc.Summary.AddText(AnnotationToString(attribMember.Annotation)); // Create the <summary /> pdType.Get.Add( new Refly.CodeDom.Expressions.SnippetExpression( "return this." + pd.Name) ); // handle conversion of enum values if(IsSystemEnum) pdType.Set.Add( new Refly.CodeDom.Expressions.SnippetExpression( string.Format( @"if(value is System.Enum) this.{0} = System.Enum.Format(value.GetType(), value, this.{0}EnumFormat); else this.{0} = value==null ? ""null"" : value.ToString()", pd.Name) ) ); else pdType.Set.Add( new Refly.CodeDom.Expressions.SnippetExpression( string.Format( @"this.{0} = value==null ? ""null"" : value.ToString()", pd.Name) ) ); // Add the field xxxEnumFormat to set the string to use when formatting an Enum if(IsSystemEnum) { Refly.CodeDom.FieldDeclaration fdEnumFormat = cd.AddField( typeof(string), (fd.Name + "EnumFormat").ToLower() ); // Set the default value fdEnumFormat.InitExpression = new Refly.CodeDom.Expressions.SnippetExpression("\"g\""); // Add its public property with a comment Refly.CodeDom.PropertyDeclaration pdEnumFormat = cd.AddProperty(fdEnumFormat, true, true, false); pdEnumFormat.Doc.Summary.AddText("'format' used by System.Enum.Format() in " + pdType.Name); // Create the <summary /> } } } if(type.IsMixed) // used by elements like <param> { // Add the field with its default value Refly.CodeDom.FieldDeclaration fd = cd.AddField( "System.String", "Content" ); // Add the unspecified value (to know if specified by the user) fd.InitExpression = new Refly.CodeDom.Expressions.SnippetExpression( "null" ); // Add its public property with a comment Refly.CodeDom.PropertyDeclaration pd = cd.AddProperty(fd, true, true, false); pd.Doc.Summary.AddText(" Gets or sets the content of this element "); // Create the <summary /> } } else { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("Unknow Element: ").Append(attElt.Name); if(attElt.SchemaType != null) sb.Append(", SchemaType = ").Append(attElt.SchemaType).Append(" - ").Append(attElt.SchemaType.Name); if(!attElt.SchemaTypeName.IsEmpty) sb.Append(", SchemaTypeName = ").Append(attElt.SchemaTypeName.Name); if(attElt.ElementType != null) sb.Append(", ElementType = ").Append(attElt.ElementType); log.Warn(sb.ToString()); } }
/// <summary> Fill the EnumDeclaration with Attributes of the XmlSchemaSimpleType. </summary> public static void GenerateEnumeration(System.Xml.Schema.XmlSchemaSimpleType enumElt, Refly.CodeDom.EnumDeclaration ed) { ed.Doc.Summary.AddText(AnnotationToString(enumElt.Annotation)); // Create the <summary /> ed.AddField("unspecified").Doc.Summary.AddText( "Default value (don't use it)" ); // The default value if(enumElt.Content is System.Xml.Schema.XmlSchemaSimpleTypeRestriction) { System.Xml.Schema.XmlSchemaSimpleTypeRestriction restric = enumElt.Content as System.Xml.Schema.XmlSchemaSimpleTypeRestriction; foreach(System.Xml.Schema.XmlSchemaObject obj in restric.Facets) { if(obj is System.Xml.Schema.XmlSchemaEnumerationFacet) { System.Xml.Schema.XmlSchemaEnumerationFacet elt = obj as System.Xml.Schema.XmlSchemaEnumerationFacet; Refly.CodeDom.FieldDeclaration field = ed.AddField(elt.Value.Replace("-","").ToLower()); field.Doc.Summary.AddText( elt.Value ); // Create the <summary /> // Add the XmlEnumAttribute used in GetXmlEnumValue() Refly.CodeDom.AttributeDeclaration enumAttrib = field.CustomAttributes.Add("System.Xml.Serialization.XmlEnumAttribute"); enumAttrib.Arguments.Add("", new Refly.CodeDom.Expressions.SnippetExpression("\""+elt.Value+"\"")); } else { log.Warn("Unknow Enum: " + obj.ToString()); } } } else { log.Warn("Unknow Enum Content: " + enumElt.Content.ToString()); } }
public override Expression ToCodeDom(Refly.CodeDom.Expressions.Expression factory) { return factory.Method("MouseMove").Invoke( Expr.New(typeof(Point), Expr.Prim(this.Target.X), Expr.Prim(this.Target.Y) ) ); }