private Dictionary <string, AccessModifier> builtClass(TypeDefinition node, Object obj) { Dictionary <string, AccessModifier> membersWithIntersectionTypes = new Dictionary <string, AccessModifier>(); Dictionary <string, List <AccessModifier> > members = new Dictionary <string, List <AccessModifier> >(); List <int> remove = new List <int>(); AccessModifier accessModifier = null; int count = 0; for (int i = 0; i < node.MemberCount; i++) { accessModifier = (AccessModifier)(node.GetMemberElement(i).Accept(this, obj)); if (accessModifier != null) { accessModifier.Class = (UserType)(node.TypeExpr); accessModifier.TypeDefinition = node; if (!(members.ContainsKey(accessModifier.MemberIdentifier))) { members.Add(accessModifier.MemberIdentifier, new List <AccessModifier>()); } // Insert element. The accessModifier list only can have one FieldType if (((members[accessModifier.MemberIdentifier].Count != 0) && (accessModifier.Type is FieldType)) || ((members[accessModifier.MemberIdentifier].Count == 1) && (members[accessModifier.MemberIdentifier][0].Type is FieldType))) { remove.Add(i); ErrorManager.Instance.NotifyError(new DeclarationFoundError(accessModifier.MemberIdentifier, new Location(this.currentFile, node.GetMemberElement(i).Location.Line, node.GetMemberElement(i).Location.Column))); } else { members[accessModifier.MemberIdentifier].Add(accessModifier); //accessModifier.WriteType.BuildTypeExpressionString(TypeExpression.MAX_DEPTH_LEVEL_TYPE_EXPRESSION); } } } // Removes incorrect declarations for (int i = 0; i < remove.Count; i++, count++) { node.RemoveMemberElement(remove[i] - count); } // * Converts method overload into intersection types foreach (KeyValuePair <string, List <AccessModifier> > pair in members) { if (pair.Value.Count == 1) { // * No intersection is necessary membersWithIntersectionTypes[pair.Key] = pair.Value[0]; } else { // * We add an intersection type // * An access modifier is taken AccessModifier am = pair.Value[0]; // * We add each type to the intersection type IntersectionMemberType intersection = new IntersectionMemberType(); foreach (AccessModifier accMod in pair.Value) { MethodType method = (MethodType)accMod.Type; if (!intersection.AddMethod(method)) { AstNode astMethodNode = method.ASTNode; ErrorManager.Instance.NotifyError(new OverloadError(am.MemberIdentifier, astMethodNode.Location)); } } am.Type = intersection; membersWithIntersectionTypes[pair.Key] = am; } } return(membersWithIntersectionTypes); }