public void checkCircularReference(ASTool.AS3.AS3Interface as3interface, Builder builder)
        {
            var cls = builder.buildingclasses[as3interface];

            if (Circularfind(cls, cls.implements))
            {
                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                         "Circular type reference was detected in " + cls.name);
            }
        }
        public void copyImplements(ASTool.AS3.AS3Interface as3interface, Builder builder)
        {
            var cls = builder.buildingclasses[as3interface];
            List <ASBinCode.rtti.Class> implist = new List <ASBinCode.rtti.Class>();

            foreach (var impl in cls.implements)
            {
                implist.Add(impl.Key);
            }
            for (int i = 0; i < implist.Count; i++)
            {
                copyextendImplements(cls, implist[i]);
            }
        }
        public ASBinCode.rtti.Class buildInterfaceDefine(ASTool.AS3.AS3Interface as3interface,
                                                         Builder builder,
                                                         ASBinCode.rtti.Class mainClass,
                                                         ASTool.AS3.AS3SrcFile as3srcfile, bool isbuildvector, RunTimeDataType vectortype)
        {
            if (builder.buildingclasses.isExistsBuildSuccess(new ASBinCode.rtti.Class(-1, -1, builder.bin, as3srcfile.md5Key + "_" + as3interface.Name)
            {
                name = as3interface.Name, package = as3interface.Package.Name
            }))
            {
                //重复编译,跳过
                return(null);
            }

            int classid = builder.getClassId();
            int blockid = builder.getBlockId();

            ASBinCode.rtti.Class cls = new ASBinCode.rtti.Class(classid, blockid, builder.bin, as3srcfile.md5Key + "_" + as3interface.Name);
            cls.package = as3interface.Package.Name;
            cls.name    = as3interface.Name;



            builder.buildingclasses.Add(as3interface, cls);

            if (isbuildvector)
            {
                builder.bin.dict_Vector_type.Add(cls, vectortype);
            }


            cls.ispackageout   = false;
            cls.isPublic       = as3interface.Access.IsPublic;
            cls.package        = as3interface.Package.Name;
            cls.name           = as3interface.Name;
            cls.no_constructor = true;
            cls.isInterface    = true;
            if (as3interface.Access.IsDynamic)
            {
                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                         "Interface attribute dynamic is invalid.");
            }
            if (as3interface.Access.IsFinal)
            {
                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                         "Interface attribute final is invalid.");
            }
            //cls.dynamic = as3class.Access.IsDynamic;
            //cls.final = as3class.Access.IsFinal;
            if (mainClass != null)
            {
                cls.mainClass    = mainClass;
                cls.ispackageout = true;
            }

            NativeFunctionBase creatorfunction = null;

            if (as3interface.Meta != null)
            {
                foreach (var m in as3interface.Meta)
                {
                    if (!m.Value.IsReg)
                    {
                        if (m.Value.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                        {
                            if (m.Value.Data.Value.ToString() == "_IEnumerator_")
                            {
                                if (builder.bin.IEnumeratorInterface == null)
                                {
                                    builder.bin.IEnumeratorInterface = cls;
                                }
                                else
                                {
                                    throw new BuildException(as3interface.token.line,
                                                             as3interface.token.ptr, as3interface.token.sourceFile,
                                                             "[_IEnumerator_]只能指定一次");
                                }
                            }
                            else if (m.Value.Data.Value.ToString() == "_IEnumerable_")
                            {
                                if (builder.bin.IEnumerableInterface == null)
                                {
                                    builder.bin.IEnumerableInterface = cls;
                                }
                                else
                                {
                                    throw new BuildException(as3interface.token.line,
                                                             as3interface.token.ptr, as3interface.token.sourceFile,
                                                             "[_IEnumerable_]只能指定一次");
                                }
                            }
                        }
                    }
                    else
                    {
                        if (m.exprStepList != null && m.exprStepList.Count == 1)
                        {
                            var step = m.exprStepList[0];
                            if (step.Type == ASTool.AS3.Expr.OpType.CallFunc)
                            {
                                if (!step.Arg2.IsReg)
                                {
                                    if (step.Arg2.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.identifier)
                                    {
                                        if (step.Arg2.Data.Value.ToString() == "link_system_interface")
                                        {
                                            cls.isLink_System = true;

                                            if (step.Arg3.Data.FF1Type == ASTool.AS3.Expr.FF1DataValueType.as3_callargements)
                                            {
                                                List <ASTool.AS3.Expr.AS3DataStackElement>
                                                cargs = (List <ASTool.AS3.Expr.AS3DataStackElement>)step.Arg3.Data.Value;
                                                if (cargs.Count == 1)
                                                {
                                                    if (cargs[0].Data.FF1Type
                                                        == ASTool.AS3.Expr.FF1DataValueType.identifier)
                                                    {
                                                        string creator = cargs[0].Data.Value.ToString();

                                                        if (builder.bin.ContainsNativeFunction(creator))
                                                        {
                                                            var nf = builder.bin.getNativeFunction(creator);                                                            //nativefunctions[builder.bin.nativefunctionNameIndex[creator]];
                                                            if (!(nf is ASBinCode.rtti.ILinkSystemObjCreator))
                                                            {
                                                                throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                                                         "链接接口必须有一个INativeFunctionRegister类型的创建器");
                                                            }

                                                            creatorfunction = nf;
                                                        }
                                                        else if (!builder.options.CheckNativeFunctionSignature)
                                                        {
                                                            creatorfunction = new mocks.MockNativeFunction(creator);
                                                        }
                                                        else
                                                        {
                                                            throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                                                     "本地函数 " + creator + " 未注册");
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }



            //****编译metaclass***
            int metaclassid = builder.getClassId();
            int metablockid = builder.getBlockId();

            ASBinCode.rtti.Class metaclass = new ASBinCode.rtti.Class(metaclassid, metablockid, builder.bin, as3srcfile.md5Key + "_metaclass_" + "$" + as3interface.Name);
            metaclass.package      = as3interface.Package.Name;
            metaclass.ispackageout = false;
            metaclass.isPublic     = as3interface.Access.IsPublic;
            metaclass.name         = "$" + as3interface.Name;
            metaclass.dynamic      = true;
            metaclass.final        = true;

            cls.staticClass         = metaclass;
            metaclass.instanceClass = cls;

            if (cls.isLink_System)
            {
                builder.linkinterfaceCreators.Add(cls, creatorfunction);
            }

            return(cls);
        }
        public void buildInterfaceExtends(ASTool.AS3.AS3Interface as3interface, Builder builder)
        {
            var cls = builder.buildingclasses[as3interface];

            cls.staticClass.super = builder.getClassByRunTimeDataType(RunTimeDataType._OBJECT + 2);

            if (cls.isLink_System)
            {
                if (builder.bin.LinkObjectClass == null)
                {
                    throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                             "未设置链接对象基类");
                }
                cls.super = builder.bin.LinkObjectClass;
            }
            else
            {
                cls.super = builder.bin.ObjectClass;
            }

            if (as3interface.ExtendsNames.Count > 0)
            {
                for (int i = 0; i < as3interface.ExtendsNames.Count; i++)
                {
                    string extendName = as3interface.ExtendsNames[i];
                    var    find       = TypeReader.findClassFromImports(extendName, builder, as3interface.token);

                    if (find.Count == 1)
                    {
                        if (!find[0].isInterface)
                        {
                            throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                     "An interface can only extend other interfaces, but " + extendName + " is a class.");
                        }
                        else if ((!cls.isLink_System) && find[0].isLink_System)
                        {
                            throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                     "非链接到系统的接口" + cls.name + " 不能继承链接到系统的接口 " + find[0].name);
                        }
                        else
                        {
                            if (!cls.implements.ContainsKey(find[0]))
                            {
                                cls.implements.Add(find[0], null);
                            }
                        }
                    }
                    else if (find.Count == 0)
                    {
                        throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                 "interface " + extendName + " was not found."
                                                 );
                    }
                    else
                    {
                        throw new BuildException(as3interface.token.line, as3interface.token.ptr, as3interface.token.sourceFile,
                                                 "Ambiguous reference to " + extendName
                                                 );
                    }
                }
            }
        }