コード例 #1
0
        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);
        }