/// <summary>
        /// 读导入
        /// </summary>
        /// <param name="srcfile"></param>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static List <ASBinCode.rtti.Class> readImports(ASTool.AS3.AS3SrcFile srcfile, Builder builder)
        {
            List <ASBinCode.rtti.Class> imports = new List <ASBinCode.rtti.Class>();

            fillimports(imports, srcfile.Package.Import, builder, srcfile);
            return(imports);
        }
        /// <summary>
        /// 读包外导入
        /// </summary>
        /// <param name="srcfile"></param>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static List <ASBinCode.rtti.Class> readOutPackageImports(ASTool.AS3.AS3SrcFile srcfile, Builder builder)
        {
            List <ASBinCode.rtti.Class> imports = new List <ASBinCode.rtti.Class>();

            fillimports(imports, srcfile.OutPackageImports, builder, srcfile);

            //**加入主类***

            if (!imports.Contains(builder.buildingclasses[srcfile.Package.MainClassOrInterface]))
            {
                imports.Add(builder.buildingclasses[srcfile.Package.MainClassOrInterface]);
            }


            return(imports);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        public void buildInterfaceMemberType(ASBinCode.rtti.Class cls, Builder builder, ASTool.AS3.AS3SrcFile as3srcfile)
        {
            builder._buildingClass.Push(cls);
            for (int i = 0; i < cls.classMembers.Count; i++)
            {
                ASBinCode.rtti.ClassMember member = cls.classMembers[i];

                if (member.bindField is ClassPropertyGetter)
                {
                    ClassPropertyGetter pg = (ClassPropertyGetter)member.bindField;

                    continue;
                }

                _doBuildMemberType(member, builder, cls);
            }

            if (builder.buildErrors.Count == 0)
            {
                copyInheritsFromImplements(cls, builder);



                for (int i = 0; i < cls.classMembers.Count; i++) //检查访问器类型
                {
                    //if (cls.classMembers[i].inheritFrom != null)
                    //{
                    //    cls.classMembers[i].setTypeWhenCompile(cls.super.classMembers[i].valueType);
                    //    continue;
                    //}

                    //CheckProp(cls.classMembers[i], builder);
                }
            }

            builder._buildingClass.Pop();
        }
        private static void fillimports(List <ASBinCode.rtti.Class> imports,
                                        List <ASTool.AS3.AS3Import> imps, Builder builder, ASTool.AS3.AS3SrcFile srcfile)
        {
            string thispackage = srcfile.Package.Name;

            //导入相同包下所有主类
            foreach (var item in builder.buildingclasses)
            {
                if (item.Value.package.Equals(thispackage, StringComparison.Ordinal)
                    &&
                    item.Value.mainClass == null
                    )
                {
                    imports.Add(item.Value);
                }
            }
            //导入顶级包的所有主类
            foreach (var item in builder.buildingclasses)
            {
                if (string.IsNullOrEmpty(item.Value.package) && item.Value.mainClass == null)
                {
                    if (!imports.Contains(item.Value))
                    {
                        imports.Add(item.Value);
                    }
                }
            }

            //***导入当前类的包外类***
            {
                var _class = builder.buildingclasses[srcfile.Package.MainClassOrInterface];
                foreach (var item in builder.buildingclasses)
                {
                    if (item.Value.mainClass == _class)
                    {
                        if (!imports.Contains(item.Value))
                        {
                            imports.Add(item.Value);
                        }
                    }
                }

                //***如果当前在编译Vector
                if (builder.bin.dict_Vector_type.ContainsKey(_class))
                {
                    var c = builder.bin.dict_Vector_type[_class];
                    if (c > ASBinCode.RunTimeDataType.unknown)
                    {
                        var oc = builder.getClassByRunTimeDataType(c);
                        if (!imports.Contains(oc))
                        {
                            imports.Add(oc);
                        }
                    }
                }
            }
            for (int i = 0; i < imps.Count; i++)
            {
                var imp = imps[i];
                if (imp.Name.EndsWith(".*"))
                {
                    //导入包内所有主类
                    string packagename = imp.Name.Substring(0, imp.Name.Length - 2);
                    foreach (var item in builder.buildingclasses)
                    {
                        if (packagename.Equals(item.Value.package, StringComparison.Ordinal))
                        {
                            if (!imports.Contains(item.Value) && item.Value.mainClass == null)
                            {
                                imports.Add(item.Value);
                            }
                        }
                    }
                }
                else
                {
                    bool found = false;
                    //导入主类
                    foreach (var item in builder.buildingclasses)
                    {
                        if (imp.Name.Equals(item.Value.package + "." + item.Value.name, StringComparison.Ordinal)
                            &&
                            item.Value.mainClass == null
                            )
                        {
                            found = true;
                            if (!imports.Contains(item.Value))
                            {
                                imports.Add(item.Value);
                            }
                            break;
                        }
                    }

                    if (!found)
                    {
                        if (builder.options.isConsoleOut)
                        {
                            Console.ForegroundColor = ConsoleColor.Yellow;
                            Console.WriteLine("Definition " + imp.Name + " could not be found.");
                            Console.ResetColor();
                        }

                        //throw new BuildException(imp.)
                    }
                }
            }
        }