示例#1
0
        public override AstNode Visit(AliasDeclaration node)
        {
            // Visit the using member.
            Expression member = node.GetMember();
            member.Accept(this);

            // Cast the pseudo-scope.
            PseudoScope scope = (PseudoScope)node.GetScope();

            // Get the member type.
            IChelaType memberType = member.GetNodeType();
            if(memberType.IsMetaType())
            {
                // Get the actual type.
                memberType = ExtractActualType(node, memberType);

                // Only structure relatives.
                if(memberType.IsStructure() || memberType.IsClass() || memberType.IsInterface())
                {
                    scope.AddAlias(node.GetName(), (ScopeMember)memberType);
                }
                else
                {
                    Error(node, "unexpected type.");
                }
            }
            else if(memberType.IsReference())
            {
                // Only static members supported.
                ScopeMember theMember = (ScopeMember)node.GetNodeValue();
                MemberFlags instanceFlags = MemberFlags.InstanceMask & theMember.GetFlags();
                if(instanceFlags != MemberFlags.Static)
                    Error(node, "unexpected member type.");

                // Store the member.
                scope.AddAlias(node.GetName(), theMember);

            }
            else if(memberType.IsNamespace())
            {
                // Set the namespace chain.
                Namespace space = (Namespace)node.GetNodeValue();
                scope.AddAlias(node.GetName(), space);
            }

            base.Visit(node);

            return node;
        }