/// <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); }
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 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.) } } } }